]> source.dussan.org Git - archiva.git/commitdiff
more fix
authorOlivier Lamy <olamy@apache.org>
Wed, 7 Oct 2015 01:05:01 +0000 (12:05 +1100)
committerOlivier Lamy <olamy@apache.org>
Wed, 7 Oct 2015 01:05:01 +0000 (12:05 +1100)
archiva-modules/archiva-base/archiva-consumers/archiva-consumer-archetype/pom.xml
archiva-modules/plugins/metadata-store-file/src/main/java/org/apache/archiva/metadata/repository/file/FileMetadataRepository.java

index 1f9a9f71463c80d2cef6d1873bd543616147d9c7..2e86b3287a019332630bc4914f0d4e8c194983a5 100644 (file)
       <scope>test</scope>
     </dependency>
 
+    <dependency>
+      <groupId>org.apache.archiva</groupId>
+      <artifactId>metadata-store-file</artifactId>
+      <scope>test</scope>
+    </dependency>
+
   </dependencies>
   <build>
     <resources>
index cca21bcd4c252353dfd9791122ae952a052a1180..2da1a5b6f57b34b9e9894614b54b373346b41283 100644 (file)
@@ -36,6 +36,7 @@ import org.apache.archiva.metadata.model.ProjectVersionReference;
 import org.apache.archiva.metadata.model.Scm;
 import org.apache.archiva.metadata.repository.MetadataRepository;
 import org.apache.archiva.metadata.repository.MetadataRepositoryException;
+import org.apache.archiva.metadata.repository.MetadataResolutionException;
 import org.apache.commons.io.FileUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -62,8 +63,6 @@ import java.util.Properties;
 import java.util.Set;
 import java.util.StringTokenizer;
 
-//import org.apache.commons.io.IOUtils;
-
 public class FileMetadataRepository
     implements MetadataRepository
 {
@@ -89,13 +88,21 @@ public class FileMetadataRepository
     }
 
     private File getBaseDirectory( String repoId )
+        throws IOException
     {
         // TODO: should be configurable, like the index
-        String basedir = configuration.getConfiguration().getManagedRepositoriesAsMap().get( repoId ).getLocation();
+        ManagedRepositoryConfiguration managedRepositoryConfiguration =
+            configuration.getConfiguration().getManagedRepositoriesAsMap().get( repoId );
+        if ( managedRepositoryConfiguration == null )
+        {
+            return Files.createTempDirectory( repoId ).toFile();
+        }
+        String basedir = managedRepositoryConfiguration.getLocation();
         return new File( basedir, ".archiva" );
     }
 
     private File getDirectory( String repoId )
+        throws IOException
     {
         return new File( getBaseDirectory( repoId ), "content" );
     }
@@ -130,98 +137,100 @@ public class FileMetadataRepository
     public void updateProjectVersion( String repoId, String namespace, String projectId,
                                       ProjectVersionMetadata versionMetadata )
     {
-        updateProject( repoId, namespace, projectId );
-
-        File directory =
-            new File( getDirectory( repoId ), namespace + "/" + projectId + "/" + versionMetadata.getId() );
 
-        Properties properties = readOrCreateProperties( directory, PROJECT_VERSION_METADATA_KEY );
-        // remove properties that are not references or artifacts
-        for ( Object key : new ArrayList( properties.keySet() ) )
+        try
         {
-            String name = (String) key;
-            if ( !name.contains( ":" ) && !name.equals( "facetIds" ) )
-            {
-                properties.remove( name );
-            }
+            updateProject( repoId, namespace, projectId );
 
-            // clear the facet contents so old properties are no longer written
-            clearMetadataFacetProperties( versionMetadata.getFacetList(), properties, "" );
-        }
-        properties.setProperty( "id", versionMetadata.getId() );
-        setProperty( properties, "name", versionMetadata.getName() );
-        setProperty( properties, "description", versionMetadata.getDescription() );
-        setProperty( properties, "url", versionMetadata.getUrl() );
-        setProperty( properties, "incomplete", String.valueOf( versionMetadata.isIncomplete() ) );
-        if ( versionMetadata.getScm() != null )
-        {
-            setProperty( properties, "scm.connection", versionMetadata.getScm().getConnection() );
-            setProperty( properties, "scm.developerConnection", versionMetadata.getScm().getDeveloperConnection() );
-            setProperty( properties, "scm.url", versionMetadata.getScm().getUrl() );
-        }
-        if ( versionMetadata.getCiManagement() != null )
-        {
-            setProperty( properties, "ci.system", versionMetadata.getCiManagement().getSystem() );
-            setProperty( properties, "ci.url", versionMetadata.getCiManagement().getUrl() );
-        }
-        if ( versionMetadata.getIssueManagement() != null )
-        {
-            setProperty( properties, "issue.system", versionMetadata.getIssueManagement().getSystem() );
-            setProperty( properties, "issue.url", versionMetadata.getIssueManagement().getUrl() );
-        }
-        if ( versionMetadata.getOrganization() != null )
-        {
-            setProperty( properties, "org.name", versionMetadata.getOrganization().getName() );
-            setProperty( properties, "org.url", versionMetadata.getOrganization().getUrl() );
-        }
-        int i = 0;
-        for ( License license : versionMetadata.getLicenses() )
-        {
-            setProperty( properties, "license." + i + ".name", license.getName() );
-            setProperty( properties, "license." + i + ".url", license.getUrl() );
-            i++;
-        }
-        i = 0;
-        for ( MailingList mailingList : versionMetadata.getMailingLists() )
-        {
-            setProperty( properties, "mailingList." + i + ".archive", mailingList.getMainArchiveUrl() );
-            setProperty( properties, "mailingList." + i + ".name", mailingList.getName() );
-            setProperty( properties, "mailingList." + i + ".post", mailingList.getPostAddress() );
-            setProperty( properties, "mailingList." + i + ".unsubscribe", mailingList.getUnsubscribeAddress() );
-            setProperty( properties, "mailingList." + i + ".subscribe", mailingList.getSubscribeAddress() );
-            setProperty( properties, "mailingList." + i + ".otherArchives", join( mailingList.getOtherArchives() ) );
-            i++;
-        }
-        i = 0;
-        ProjectVersionReference reference = new ProjectVersionReference();
-        reference.setNamespace( namespace );
-        reference.setProjectId( projectId );
-        reference.setProjectVersion( versionMetadata.getId() );
-        reference.setReferenceType( ProjectVersionReference.ReferenceType.DEPENDENCY );
-        for ( Dependency dependency : versionMetadata.getDependencies() )
-        {
-            setProperty( properties, "dependency." + i + ".classifier", dependency.getClassifier() );
-            setProperty( properties, "dependency." + i + ".scope", dependency.getScope() );
-            setProperty( properties, "dependency." + i + ".systemPath", dependency.getSystemPath() );
-            setProperty( properties, "dependency." + i + ".artifactId", dependency.getArtifactId() );
-            setProperty( properties, "dependency." + i + ".groupId", dependency.getGroupId() );
-            setProperty( properties, "dependency." + i + ".version", dependency.getVersion() );
-            setProperty( properties, "dependency." + i + ".type", dependency.getType() );
-            setProperty( properties, "dependency." + i + ".optional", String.valueOf( dependency.isOptional() ) );
+            File directory =
+                new File( getDirectory( repoId ), namespace + "/" + projectId + "/" + versionMetadata.getId() );
 
-            updateProjectReference( repoId, dependency.getGroupId(), dependency.getArtifactId(),
-                                    dependency.getVersion(), reference );
+            Properties properties = readOrCreateProperties( directory, PROJECT_VERSION_METADATA_KEY );
+            // remove properties that are not references or artifacts
+            for ( Object key : new ArrayList( properties.keySet() ) )
+            {
+                String name = (String) key;
+                if ( !name.contains( ":" ) && !name.equals( "facetIds" ) )
+                {
+                    properties.remove( name );
+                }
 
-            i++;
-        }
-        Set<String> facetIds = new LinkedHashSet<String>( versionMetadata.getFacetIds() );
-        facetIds.addAll( Arrays.asList( properties.getProperty( "facetIds", "" ).split( "," ) ) );
-        properties.setProperty( "facetIds", join( facetIds ) );
+                // clear the facet contents so old properties are no longer written
+                clearMetadataFacetProperties( versionMetadata.getFacetList(), properties, "" );
+            }
+            properties.setProperty( "id", versionMetadata.getId() );
+            setProperty( properties, "name", versionMetadata.getName() );
+            setProperty( properties, "description", versionMetadata.getDescription() );
+            setProperty( properties, "url", versionMetadata.getUrl() );
+            setProperty( properties, "incomplete", String.valueOf( versionMetadata.isIncomplete() ) );
+            if ( versionMetadata.getScm() != null )
+            {
+                setProperty( properties, "scm.connection", versionMetadata.getScm().getConnection() );
+                setProperty( properties, "scm.developerConnection", versionMetadata.getScm().getDeveloperConnection() );
+                setProperty( properties, "scm.url", versionMetadata.getScm().getUrl() );
+            }
+            if ( versionMetadata.getCiManagement() != null )
+            {
+                setProperty( properties, "ci.system", versionMetadata.getCiManagement().getSystem() );
+                setProperty( properties, "ci.url", versionMetadata.getCiManagement().getUrl() );
+            }
+            if ( versionMetadata.getIssueManagement() != null )
+            {
+                setProperty( properties, "issue.system", versionMetadata.getIssueManagement().getSystem() );
+                setProperty( properties, "issue.url", versionMetadata.getIssueManagement().getUrl() );
+            }
+            if ( versionMetadata.getOrganization() != null )
+            {
+                setProperty( properties, "org.name", versionMetadata.getOrganization().getName() );
+                setProperty( properties, "org.url", versionMetadata.getOrganization().getUrl() );
+            }
+            int i = 0;
+            for ( License license : versionMetadata.getLicenses() )
+            {
+                setProperty( properties, "license." + i + ".name", license.getName() );
+                setProperty( properties, "license." + i + ".url", license.getUrl() );
+                i++;
+            }
+            i = 0;
+            for ( MailingList mailingList : versionMetadata.getMailingLists() )
+            {
+                setProperty( properties, "mailingList." + i + ".archive", mailingList.getMainArchiveUrl() );
+                setProperty( properties, "mailingList." + i + ".name", mailingList.getName() );
+                setProperty( properties, "mailingList." + i + ".post", mailingList.getPostAddress() );
+                setProperty( properties, "mailingList." + i + ".unsubscribe", mailingList.getUnsubscribeAddress() );
+                setProperty( properties, "mailingList." + i + ".subscribe", mailingList.getSubscribeAddress() );
+                setProperty( properties, "mailingList." + i + ".otherArchives",
+                             join( mailingList.getOtherArchives() ) );
+                i++;
+            }
+            i = 0;
+            ProjectVersionReference reference = new ProjectVersionReference();
+            reference.setNamespace( namespace );
+            reference.setProjectId( projectId );
+            reference.setProjectVersion( versionMetadata.getId() );
+            reference.setReferenceType( ProjectVersionReference.ReferenceType.DEPENDENCY );
+            for ( Dependency dependency : versionMetadata.getDependencies() )
+            {
+                setProperty( properties, "dependency." + i + ".classifier", dependency.getClassifier() );
+                setProperty( properties, "dependency." + i + ".scope", dependency.getScope() );
+                setProperty( properties, "dependency." + i + ".systemPath", dependency.getSystemPath() );
+                setProperty( properties, "dependency." + i + ".artifactId", dependency.getArtifactId() );
+                setProperty( properties, "dependency." + i + ".groupId", dependency.getGroupId() );
+                setProperty( properties, "dependency." + i + ".version", dependency.getVersion() );
+                setProperty( properties, "dependency." + i + ".type", dependency.getType() );
+                setProperty( properties, "dependency." + i + ".optional", String.valueOf( dependency.isOptional() ) );
+
+                updateProjectReference( repoId, dependency.getGroupId(), dependency.getArtifactId(),
+                                        dependency.getVersion(), reference );
 
-        updateProjectVersionFacets( versionMetadata, properties );
+                i++;
+            }
+            Set<String> facetIds = new LinkedHashSet<String>( versionMetadata.getFacetIds() );
+            facetIds.addAll( Arrays.asList( properties.getProperty( "facetIds", "" ).split( "," ) ) );
+            properties.setProperty( "facetIds", join( facetIds ) );
+
+            updateProjectVersionFacets( versionMetadata, properties );
 
-        try
-        {
             writeProperties( properties, directory, PROJECT_VERSION_METADATA_KEY );
         }
         catch ( IOException e )
@@ -267,18 +276,18 @@ public class FileMetadataRepository
     private void updateProjectReference( String repoId, String namespace, String projectId, String projectVersion,
                                          ProjectVersionReference reference )
     {
-        File directory = new File( getDirectory( repoId ), namespace + "/" + projectId + "/" + projectVersion );
-
-        Properties properties = readOrCreateProperties( directory, PROJECT_VERSION_METADATA_KEY );
-        int i = Integer.parseInt( properties.getProperty( "ref:lastReferenceNum", "-1" ) ) + 1;
-        setProperty( properties, "ref:lastReferenceNum", Integer.toString( i ) );
-        setProperty( properties, "ref:reference." + i + ".namespace", reference.getNamespace() );
-        setProperty( properties, "ref:reference." + i + ".projectId", reference.getProjectId() );
-        setProperty( properties, "ref:reference." + i + ".projectVersion", reference.getProjectVersion() );
-        setProperty( properties, "ref:reference." + i + ".referenceType", reference.getReferenceType().toString() );
-
         try
         {
+            File directory = new File( getDirectory( repoId ), namespace + "/" + projectId + "/" + projectVersion );
+
+            Properties properties = readOrCreateProperties( directory, PROJECT_VERSION_METADATA_KEY );
+            int i = Integer.parseInt( properties.getProperty( "ref:lastReferenceNum", "-1" ) ) + 1;
+            setProperty( properties, "ref:lastReferenceNum", Integer.toString( i ) );
+            setProperty( properties, "ref:reference." + i + ".namespace", reference.getNamespace() );
+            setProperty( properties, "ref:reference." + i + ".projectId", reference.getProjectId() );
+            setProperty( properties, "ref:reference." + i + ".projectVersion", reference.getProjectVersion() );
+            setProperty( properties, "ref:reference." + i + ".referenceType", reference.getReferenceType().toString() );
+
             writeProperties( properties, directory, PROJECT_VERSION_METADATA_KEY );
         }
         catch ( IOException e )
@@ -308,11 +317,19 @@ public class FileMetadataRepository
 
     @Override
     public List<String> getMetadataFacets( String repoId, String facetId )
+        throws MetadataRepositoryException
     {
-        File directory = getMetadataDirectory( repoId, facetId );
-        List<String> facets = new ArrayList<>();
-        recurse( facets, "", directory );
-        return facets;
+        try
+        {
+            File directory = getMetadataDirectory( repoId, facetId );
+            List<String> facets = new ArrayList<>();
+            recurse( facets, "", directory );
+            return facets;
+        }
+        catch ( IOException e )
+        {
+            throw new MetadataRepositoryException( e.getMessage(), e );
+        }
     }
 
     @Override
@@ -398,26 +415,43 @@ public class FileMetadataRepository
 
     @Override
     public void removeMetadataFacets( String repositoryId, String facetId )
+        throws MetadataRepositoryException
     {
-        File dir = getMetadataDirectory( repositoryId, facetId );
-        if ( !FileUtils.deleteQuietly( dir ) )
+        try
         {
-            log.error( "Cannot delete the metadata repository {}", dir );
+            File dir = getMetadataDirectory( repositoryId, facetId );
+            if ( !Files.deleteIfExists( dir.toPath() ) )
+            {
+                log.error( "Cannot delete the metadata repository {}", dir );
+            }
+        }
+        catch ( IOException e )
+        {
+            throw new MetadataRepositoryException( e.getMessage(), e );
         }
     }
 
     @Override
     public void removeMetadataFacet( String repoId, String facetId, String name )
+        throws MetadataRepositoryException
     {
-        File dir = new File( getMetadataDirectory( repoId, facetId ), name );
-        if ( !FileUtils.deleteQuietly( dir ) )
+        try
         {
-            log.error( "Cannot delete the metadata repository {}", dir );
+            File dir = new File( getMetadataDirectory( repoId, facetId ), name );
+            if ( !Files.deleteIfExists( dir.toPath() ) )
+            {
+                log.error( "Cannot delete the metadata repository {}", dir );
+            }
+        }
+        catch ( IOException e )
+        {
+            throw new MetadataRepositoryException( e.getMessage(), e );
         }
     }
 
     @Override
     public List<ArtifactMetadata> getArtifactsByDateRange( String repoId, Date startTime, Date endTime )
+        throws MetadataRepositoryException
     {
         // TODO: this is quite slow - if we are to persist with this repository implementation we should build an index
         //  of this information (eg. in Lucene, as before)
@@ -433,124 +467,140 @@ public class FileMetadataRepository
 
     private void getArtifactsByDateRange( List<ArtifactMetadata> artifacts, String repoId, String ns, Date startTime,
                                           Date endTime )
+        throws MetadataRepositoryException
     {
-        for ( String namespace : getNamespaces( repoId, ns ) )
+        try
         {
-            getArtifactsByDateRange( artifacts, repoId, ns + "." + namespace, startTime, endTime );
-        }
+            for ( String namespace : getNamespaces( repoId, ns ) )
+            {
+                getArtifactsByDateRange( artifacts, repoId, ns + "." + namespace, startTime, endTime );
+            }
 
-        for ( String project : getProjects( repoId, ns ) )
-        {
-            for ( String version : getProjectVersions( repoId, ns, project ) )
+            for ( String project : getProjects( repoId, ns ) )
             {
-                for ( ArtifactMetadata artifact : getArtifacts( repoId, ns, project, version ) )
+                for ( String version : getProjectVersions( repoId, ns, project ) )
                 {
-                    if ( startTime == null || startTime.before( artifact.getWhenGathered() ) )
+                    for ( ArtifactMetadata artifact : getArtifacts( repoId, ns, project, version ) )
                     {
-                        if ( endTime == null || endTime.after( artifact.getWhenGathered() ) )
+                        if ( startTime == null || startTime.before( artifact.getWhenGathered() ) )
                         {
-                            artifacts.add( artifact );
+                            if ( endTime == null || endTime.after( artifact.getWhenGathered() ) )
+                            {
+                                artifacts.add( artifact );
+                            }
                         }
                     }
                 }
             }
         }
+        catch ( MetadataResolutionException e )
+        {
+            throw new MetadataRepositoryException( e.getMessage(), e );
+        }
     }
 
     @Override
     public Collection<ArtifactMetadata> getArtifacts( String repoId, String namespace, String projectId,
                                                       String projectVersion )
+        throws MetadataResolutionException
     {
-        Map<String, ArtifactMetadata> artifacts = new HashMap<>();
+        try
+        {
+            Map<String, ArtifactMetadata> artifacts = new HashMap<>();
 
-        File directory = new File( getDirectory( repoId ), namespace + "/" + projectId + "/" + projectVersion );
+            File directory = new File( getDirectory( repoId ), namespace + "/" + projectId + "/" + projectVersion );
 
-        Properties properties = readOrCreateProperties( directory, PROJECT_VERSION_METADATA_KEY );
+            Properties properties = readOrCreateProperties( directory, PROJECT_VERSION_METADATA_KEY );
 
-        for ( Map.Entry entry : properties.entrySet() )
-        {
-            String name = (String) entry.getKey();
-            StringTokenizer tok = new StringTokenizer( name, ":" );
-            if ( tok.hasMoreTokens() && "artifact".equals( tok.nextToken() ) )
+            for ( Map.Entry entry : properties.entrySet() )
             {
-                String field = tok.nextToken();
-                String id = tok.nextToken();
-
-                ArtifactMetadata artifact = artifacts.get( id );
-                if ( artifact == null )
+                String name = (String) entry.getKey();
+                StringTokenizer tok = new StringTokenizer( name, ":" );
+                if ( tok.hasMoreTokens() && "artifact".equals( tok.nextToken() ) )
                 {
-                    artifact = new ArtifactMetadata();
-                    artifact.setRepositoryId( repoId );
-                    artifact.setNamespace( namespace );
-                    artifact.setProject( projectId );
-                    artifact.setProjectVersion( projectVersion );
-                    artifact.setVersion( projectVersion );
-                    artifact.setId( id );
-                    artifacts.put( id, artifact );
-                }
+                    String field = tok.nextToken();
+                    String id = tok.nextToken();
 
-                String value = (String) entry.getValue();
-                if ( "updated".equals( field ) )
-                {
-                    artifact.setFileLastModified( Long.parseLong( value ) );
-                }
-                else if ( "size".equals( field ) )
-                {
-                    artifact.setSize( Long.valueOf( value ) );
-                }
-                else if ( "whenGathered".equals( field ) )
-                {
-                    artifact.setWhenGathered( new Date( Long.parseLong( value ) ) );
-                }
-                else if ( "version".equals( field ) )
-                {
-                    artifact.setVersion( value );
-                }
-                else if ( "md5".equals( field ) )
-                {
-                    artifact.setMd5( value );
-                }
-                else if ( "sha1".equals( field ) )
-                {
-                    artifact.setSha1( value );
-                }
-                else if ( "facetIds".equals( field ) )
-                {
-                    if ( value.length() > 0 )
+                    ArtifactMetadata artifact = artifacts.get( id );
+                    if ( artifact == null )
+                    {
+                        artifact = new ArtifactMetadata();
+                        artifact.setRepositoryId( repoId );
+                        artifact.setNamespace( namespace );
+                        artifact.setProject( projectId );
+                        artifact.setProjectVersion( projectVersion );
+                        artifact.setVersion( projectVersion );
+                        artifact.setId( id );
+                        artifacts.put( id, artifact );
+                    }
+
+                    String value = (String) entry.getValue();
+                    if ( "updated".equals( field ) )
+                    {
+                        artifact.setFileLastModified( Long.parseLong( value ) );
+                    }
+                    else if ( "size".equals( field ) )
+                    {
+                        artifact.setSize( Long.valueOf( value ) );
+                    }
+                    else if ( "whenGathered".equals( field ) )
+                    {
+                        artifact.setWhenGathered( new Date( Long.parseLong( value ) ) );
+                    }
+                    else if ( "version".equals( field ) )
+                    {
+                        artifact.setVersion( value );
+                    }
+                    else if ( "md5".equals( field ) )
+                    {
+                        artifact.setMd5( value );
+                    }
+                    else if ( "sha1".equals( field ) )
+                    {
+                        artifact.setSha1( value );
+                    }
+                    else if ( "facetIds".equals( field ) )
                     {
-                        String propertyPrefix = "artifact:facet:" + id + ":";
-                        for ( String facetId : value.split( "," ) )
+                        if ( value.length() > 0 )
                         {
-                            MetadataFacetFactory factory = metadataFacetFactories.get( facetId );
-                            if ( factory == null )
+                            String propertyPrefix = "artifact:facet:" + id + ":";
+                            for ( String facetId : value.split( "," ) )
                             {
-                                log.error( "Attempted to load unknown artifact metadata facet: " + facetId );
-                            }
-                            else
-                            {
-                                MetadataFacet facet = factory.createMetadataFacet();
-                                String prefix = propertyPrefix + facet.getFacetId();
-                                Map<String, String> map = new HashMap<>();
-                                for ( Object key : new ArrayList( properties.keySet() ) )
+                                MetadataFacetFactory factory = metadataFacetFactories.get( facetId );
+                                if ( factory == null )
                                 {
-                                    String property = (String) key;
-                                    if ( property.startsWith( prefix ) )
+                                    log.error( "Attempted to load unknown artifact metadata facet: " + facetId );
+                                }
+                                else
+                                {
+                                    MetadataFacet facet = factory.createMetadataFacet();
+                                    String prefix = propertyPrefix + facet.getFacetId();
+                                    Map<String, String> map = new HashMap<>();
+                                    for ( Object key : new ArrayList( properties.keySet() ) )
                                     {
-                                        map.put( property.substring( prefix.length() + 1 ),
-                                                 properties.getProperty( property ) );
+                                        String property = (String) key;
+                                        if ( property.startsWith( prefix ) )
+                                        {
+                                            map.put( property.substring( prefix.length() + 1 ),
+                                                     properties.getProperty( property ) );
+                                        }
                                     }
+                                    facet.fromProperties( map );
+                                    artifact.addFacet( facet );
                                 }
-                                facet.fromProperties( map );
-                                artifact.addFacet( facet );
                             }
                         }
-                    }
 
-                    updateArtifactFacets( artifact, properties );
+                        updateArtifactFacets( artifact, properties );
+                    }
                 }
             }
+            return artifacts.values();
+        }
+        catch ( IOException e )
+        {
+            throw new MetadataResolutionException( e.getMessage(), e );
         }
-        return artifacts.values();
     }
 
     @Override
@@ -610,18 +660,26 @@ public class FileMetadataRepository
 
     @Override
     public List<ArtifactMetadata> getArtifactsByChecksum( String repositoryId, String checksum )
+        throws MetadataRepositoryException
     {
-        // TODO: this is quite slow - if we are to persist with this repository implementation we should build an index
-        //  of this information (eg. in Lucene, as before)
-        // alternatively, we could build a referential tree in the content repository, however it would need some levels
-        // of depth to avoid being too broad to be useful (eg. /repository/checksums/a/ab/abcdef1234567)
+        try
+        {
+            // TODO: this is quite slow - if we are to persist with this repository implementation we should build an index
+            //  of this information (eg. in Lucene, as before)
+            // alternatively, we could build a referential tree in the content repository, however it would need some levels
+            // of depth to avoid being too broad to be useful (eg. /repository/checksums/a/ab/abcdef1234567)
 
-        List<ArtifactMetadata> artifacts = new ArrayList<>();
-        for ( String ns : getRootNamespaces( repositoryId ) )
+            List<ArtifactMetadata> artifacts = new ArrayList<>();
+            for ( String ns : getRootNamespaces( repositoryId ) )
+            {
+                getArtifactsByChecksum( artifacts, repositoryId, ns, checksum );
+            }
+            return artifacts;
+        }
+        catch ( MetadataResolutionException e )
         {
-            getArtifactsByChecksum( artifacts, repositoryId, ns, checksum );
+            throw new MetadataRepositoryException( e.getMessage(), e );
         }
-        return artifacts;
     }
 
     @Override
@@ -648,82 +706,77 @@ public class FileMetadataRepository
         throws MetadataRepositoryException
     {
 
-        File directory = new File( getDirectory( artifactMetadata.getRepositoryId() ),
-                                   artifactMetadata.getNamespace() + "/" + artifactMetadata.getProject() + "/"
-                                       + baseVersion
-        );
+        try
+        {
+            File directory = new File( getDirectory( artifactMetadata.getRepositoryId() ),
+                                       artifactMetadata.getNamespace() + "/" + artifactMetadata.getProject() + "/"
+                                           + baseVersion );
 
-        Properties properties = readOrCreateProperties( directory, PROJECT_VERSION_METADATA_KEY );
+            Properties properties = readOrCreateProperties( directory, PROJECT_VERSION_METADATA_KEY );
 
-        String id = artifactMetadata.getId();
+            String id = artifactMetadata.getId();
 
-        properties.remove( "artifact:updated:" + id );
-        properties.remove( "artifact:whenGathered:" + id );
-        properties.remove( "artifact:size:" + id );
-        properties.remove( "artifact:md5:" + id );
-        properties.remove( "artifact:sha1:" + id );
-        properties.remove( "artifact:version:" + id );
-        properties.remove( "artifact:facetIds:" + id );
+            properties.remove( "artifact:updated:" + id );
+            properties.remove( "artifact:whenGathered:" + id );
+            properties.remove( "artifact:size:" + id );
+            properties.remove( "artifact:md5:" + id );
+            properties.remove( "artifact:sha1:" + id );
+            properties.remove( "artifact:version:" + id );
+            properties.remove( "artifact:facetIds:" + id );
 
-        String prefix = "artifact:facet:" + id + ":";
-        for ( Object key : new ArrayList( properties.keySet() ) )
-        {
-            String property = (String) key;
-            if ( property.startsWith( prefix ) )
+            String prefix = "artifact:facet:" + id + ":";
+            for ( Object key : new ArrayList( properties.keySet() ) )
             {
-                properties.remove( property );
+                String property = (String) key;
+                if ( property.startsWith( prefix ) )
+                {
+                    properties.remove( property );
+                }
             }
-        }
 
-        try
-        {
             writeProperties( properties, directory, PROJECT_VERSION_METADATA_KEY );
         }
         catch ( IOException e )
         {
-            // TODO
-            log.error( e.getMessage(), e );
+            throw new MetadataRepositoryException( e.getMessage(), e );
         }
 
     }
 
     @Override
     public void removeArtifact( String repoId, String namespace, String project, String version, String id )
+        throws MetadataRepositoryException
     {
+        try
+        {
+            File directory = new File( getDirectory( repoId ), namespace + "/" + project + "/" + version );
 
-        File directory = new File( getDirectory( repoId ), namespace + "/" + project + "/" + version );
-
-        Properties properties = readOrCreateProperties( directory, PROJECT_VERSION_METADATA_KEY );
+            Properties properties = readOrCreateProperties( directory, PROJECT_VERSION_METADATA_KEY );
 
-        properties.remove( "artifact:updated:" + id );
-        properties.remove( "artifact:whenGathered:" + id );
-        properties.remove( "artifact:size:" + id );
-        properties.remove( "artifact:md5:" + id );
-        properties.remove( "artifact:sha1:" + id );
-        properties.remove( "artifact:version:" + id );
-        properties.remove( "artifact:facetIds:" + id );
+            properties.remove( "artifact:updated:" + id );
+            properties.remove( "artifact:whenGathered:" + id );
+            properties.remove( "artifact:size:" + id );
+            properties.remove( "artifact:md5:" + id );
+            properties.remove( "artifact:sha1:" + id );
+            properties.remove( "artifact:version:" + id );
+            properties.remove( "artifact:facetIds:" + id );
 
-        String prefix = "artifact:facet:" + id + ":";
-        for ( Object key : new ArrayList( properties.keySet() ) )
-        {
-            String property = (String) key;
-            if ( property.startsWith( prefix ) )
+            String prefix = "artifact:facet:" + id + ":";
+            for ( Object key : new ArrayList( properties.keySet() ) )
             {
-                properties.remove( property );
+                String property = (String) key;
+                if ( property.startsWith( prefix ) )
+                {
+                    properties.remove( property );
+                }
             }
-        }
-
-        try
-        {
-
-            FileUtils.deleteDirectory( directory );
 
+            Files.deleteIfExists( directory.toPath() );
             //writeProperties( properties, directory, PROJECT_VERSION_METADATA_KEY );
         }
         catch ( IOException e )
         {
-            // TODO
-            log.error( e.getMessage(), e );
+            throw new MetadataRepositoryException( e.getMessage(), e );
         }
     }
 
@@ -747,35 +800,51 @@ public class FileMetadataRepository
 
     @Override
     public void removeRepository( String repoId )
+        throws MetadataRepositoryException
     {
-        File dir = getDirectory( repoId );
-        if ( !FileUtils.deleteQuietly( dir ) )
+        try
         {
-            log.error( "Cannot delete repository {}", dir );
+            File dir = getDirectory( repoId );
+            if ( !Files.deleteIfExists( dir.toPath() ) )
+            {
+                log.error( "Cannot delete repository {}", dir );
+            }
+        }
+        catch ( IOException e )
+        {
+            throw new MetadataRepositoryException( e.getMessage(), e );
         }
     }
 
     private void getArtifactsByChecksum( List<ArtifactMetadata> artifacts, String repositoryId, String ns,
                                          String checksum )
+        throws MetadataRepositoryException
     {
-        for ( String namespace : getNamespaces( repositoryId, ns ) )
+        try
         {
-            getArtifactsByChecksum( artifacts, repositoryId, ns + "." + namespace, checksum );
-        }
+            for ( String namespace : getNamespaces( repositoryId, ns ) )
+            {
+                getArtifactsByChecksum( artifacts, repositoryId, ns + "." + namespace, checksum );
+            }
 
-        for ( String project : getProjects( repositoryId, ns ) )
-        {
-            for ( String version : getProjectVersions( repositoryId, ns, project ) )
+            for ( String project : getProjects( repositoryId, ns ) )
             {
-                for ( ArtifactMetadata artifact : getArtifacts( repositoryId, ns, project, version ) )
+                for ( String version : getProjectVersions( repositoryId, ns, project ) )
                 {
-                    if ( checksum.equals( artifact.getMd5() ) || checksum.equals( artifact.getSha1() ) )
+                    for ( ArtifactMetadata artifact : getArtifacts( repositoryId, ns, project, version ) )
                     {
-                        artifacts.add( artifact );
+                        if ( checksum.equals( artifact.getMd5() ) || checksum.equals( artifact.getSha1() ) )
+                        {
+                            artifacts.add( artifact );
+                        }
                     }
                 }
             }
         }
+        catch ( MetadataResolutionException e )
+        {
+            throw new MetadataRepositoryException( e.getMessage(), e );
+        }
     }
 
     @Override
@@ -800,6 +869,7 @@ public class FileMetadataRepository
     }
 
     private File getMetadataDirectory( String repoId, String facetId )
+        throws IOException
     {
         return new File( getBaseDirectory( repoId ), "facets/" + facetId );
     }
@@ -831,39 +901,42 @@ public class FileMetadataRepository
     public void updateArtifact( String repoId, String namespace, String projectId, String projectVersion,
                                 ArtifactMetadata artifact )
     {
-        ProjectVersionMetadata metadata = new ProjectVersionMetadata();
-        metadata.setId( projectVersion );
-        updateProjectVersion( repoId, namespace, projectId, metadata );
+        try
+        {
+            ProjectVersionMetadata metadata = new ProjectVersionMetadata();
+            metadata.setId( projectVersion );
+            updateProjectVersion( repoId, namespace, projectId, metadata );
 
-        File directory = new File( getDirectory( repoId ), namespace + "/" + projectId + "/" + projectVersion );
+            File directory = new File( getDirectory( repoId ), namespace + "/" + projectId + "/" + projectVersion );
 
-        Properties properties = readOrCreateProperties( directory, PROJECT_VERSION_METADATA_KEY );
+            Properties properties = readOrCreateProperties( directory, PROJECT_VERSION_METADATA_KEY );
 
-        clearMetadataFacetProperties( artifact.getFacetList(), properties, "artifact:facet:" + artifact.getId() + ":" );
+            clearMetadataFacetProperties( artifact.getFacetList(), properties,
+                                          "artifact:facet:" + artifact.getId() + ":" );
 
-        String id = artifact.getId();
-        properties.setProperty( "artifact:updated:" + id, Long.toString( artifact.getFileLastModified().getTime() ) );
-        properties.setProperty( "artifact:whenGathered:" + id, Long.toString( artifact.getWhenGathered().getTime() ) );
-        properties.setProperty( "artifact:size:" + id, Long.toString( artifact.getSize() ) );
-        if ( artifact.getMd5() != null )
-        {
-            properties.setProperty( "artifact:md5:" + id, artifact.getMd5() );
-        }
-        if ( artifact.getSha1() != null )
-        {
-            properties.setProperty( "artifact:sha1:" + id, artifact.getSha1() );
-        }
-        properties.setProperty( "artifact:version:" + id, artifact.getVersion() );
+            String id = artifact.getId();
+            properties.setProperty( "artifact:updated:" + id,
+                                    Long.toString( artifact.getFileLastModified().getTime() ) );
+            properties.setProperty( "artifact:whenGathered:" + id,
+                                    Long.toString( artifact.getWhenGathered().getTime() ) );
+            properties.setProperty( "artifact:size:" + id, Long.toString( artifact.getSize() ) );
+            if ( artifact.getMd5() != null )
+            {
+                properties.setProperty( "artifact:md5:" + id, artifact.getMd5() );
+            }
+            if ( artifact.getSha1() != null )
+            {
+                properties.setProperty( "artifact:sha1:" + id, artifact.getSha1() );
+            }
+            properties.setProperty( "artifact:version:" + id, artifact.getVersion() );
 
-        Set<String> facetIds = new LinkedHashSet<String>( artifact.getFacetIds() );
-        String property = "artifact:facetIds:" + id;
-        facetIds.addAll( Arrays.asList( properties.getProperty( property, "" ).split( "," ) ) );
-        properties.setProperty( property, join( facetIds ) );
+            Set<String> facetIds = new LinkedHashSet<String>( artifact.getFacetIds() );
+            String property = "artifact:facetIds:" + id;
+            facetIds.addAll( Arrays.asList( properties.getProperty( property, "" ).split( "," ) ) );
+            properties.setProperty( property, join( facetIds ) );
 
-        updateArtifactFacets( artifact, properties );
+            updateArtifactFacets( artifact, properties );
 
-        try
-        {
             writeProperties( properties, directory, PROJECT_VERSION_METADATA_KEY );
         }
         catch ( IOException e )
@@ -905,332 +978,387 @@ public class FileMetadataRepository
 
     @Override
     public ProjectMetadata getProject( String repoId, String namespace, String projectId )
+        throws MetadataResolutionException
     {
-        File directory = new File( getDirectory( repoId ), namespace + "/" + projectId );
+        try
+        {
+            File directory = new File( getDirectory( repoId ), namespace + "/" + projectId );
+
+            Properties properties = readOrCreateProperties( directory, PROJECT_METADATA_KEY );
 
-        Properties properties = readOrCreateProperties( directory, PROJECT_METADATA_KEY );
+            ProjectMetadata project = null;
 
-        ProjectMetadata project = null;
+            String id = properties.getProperty( "id" );
+            if ( id != null )
+            {
+                project = new ProjectMetadata();
+                project.setNamespace( properties.getProperty( "namespace" ) );
+                project.setId( id );
+            }
 
-        String id = properties.getProperty( "id" );
-        if ( id != null )
+            return project;
+        }
+        catch ( IOException e )
         {
-            project = new ProjectMetadata();
-            project.setNamespace( properties.getProperty( "namespace" ) );
-            project.setId( id );
+            throw new MetadataResolutionException( e.getMessage(), e );
         }
-
-        return project;
     }
 
     @Override
     public ProjectVersionMetadata getProjectVersion( String repoId, String namespace, String projectId,
                                                      String projectVersion )
+        throws MetadataResolutionException
     {
-        File directory = new File( getDirectory( repoId ), namespace + "/" + projectId + "/" + projectVersion );
-
-        Properties properties = readOrCreateProperties( directory, PROJECT_VERSION_METADATA_KEY );
-        String id = properties.getProperty( "id" );
-        ProjectVersionMetadata versionMetadata = null;
-        if ( id != null )
-        {
-            versionMetadata = new ProjectVersionMetadata();
-            versionMetadata.setId( id );
-            versionMetadata.setName( properties.getProperty( "name" ) );
-            versionMetadata.setDescription( properties.getProperty( "description" ) );
-            versionMetadata.setUrl( properties.getProperty( "url" ) );
-            versionMetadata.setIncomplete( Boolean.valueOf( properties.getProperty( "incomplete", "false" ) ) );
-
-            String scmConnection = properties.getProperty( "scm.connection" );
-            String scmDeveloperConnection = properties.getProperty( "scm.developerConnection" );
-            String scmUrl = properties.getProperty( "scm.url" );
-            if ( scmConnection != null || scmDeveloperConnection != null || scmUrl != null )
-            {
-                Scm scm = new Scm();
-                scm.setConnection( scmConnection );
-                scm.setDeveloperConnection( scmDeveloperConnection );
-                scm.setUrl( scmUrl );
-                versionMetadata.setScm( scm );
-            }
-
-            String ciSystem = properties.getProperty( "ci.system" );
-            String ciUrl = properties.getProperty( "ci.url" );
-            if ( ciSystem != null || ciUrl != null )
-            {
-                CiManagement ci = new CiManagement();
-                ci.setSystem( ciSystem );
-                ci.setUrl( ciUrl );
-                versionMetadata.setCiManagement( ci );
-            }
+        try
+        {
+            File directory = new File( getDirectory( repoId ), namespace + "/" + projectId + "/" + projectVersion );
 
-            String issueSystem = properties.getProperty( "issue.system" );
-            String issueUrl = properties.getProperty( "issue.url" );
-            if ( issueSystem != null || issueUrl != null )
+            Properties properties = readOrCreateProperties( directory, PROJECT_VERSION_METADATA_KEY );
+            String id = properties.getProperty( "id" );
+            ProjectVersionMetadata versionMetadata = null;
+            if ( id != null )
             {
-                IssueManagement issueManagement = new IssueManagement();
-                issueManagement.setSystem( issueSystem );
-                issueManagement.setUrl( issueUrl );
-                versionMetadata.setIssueManagement( issueManagement );
-            }
+                versionMetadata = new ProjectVersionMetadata();
+                versionMetadata.setId( id );
+                versionMetadata.setName( properties.getProperty( "name" ) );
+                versionMetadata.setDescription( properties.getProperty( "description" ) );
+                versionMetadata.setUrl( properties.getProperty( "url" ) );
+                versionMetadata.setIncomplete( Boolean.valueOf( properties.getProperty( "incomplete", "false" ) ) );
+
+                String scmConnection = properties.getProperty( "scm.connection" );
+                String scmDeveloperConnection = properties.getProperty( "scm.developerConnection" );
+                String scmUrl = properties.getProperty( "scm.url" );
+                if ( scmConnection != null || scmDeveloperConnection != null || scmUrl != null )
+                {
+                    Scm scm = new Scm();
+                    scm.setConnection( scmConnection );
+                    scm.setDeveloperConnection( scmDeveloperConnection );
+                    scm.setUrl( scmUrl );
+                    versionMetadata.setScm( scm );
+                }
 
-            String orgName = properties.getProperty( "org.name" );
-            String orgUrl = properties.getProperty( "org.url" );
-            if ( orgName != null || orgUrl != null )
-            {
-                Organization org = new Organization();
-                org.setName( orgName );
-                org.setUrl( orgUrl );
-                versionMetadata.setOrganization( org );
-            }
+                String ciSystem = properties.getProperty( "ci.system" );
+                String ciUrl = properties.getProperty( "ci.url" );
+                if ( ciSystem != null || ciUrl != null )
+                {
+                    CiManagement ci = new CiManagement();
+                    ci.setSystem( ciSystem );
+                    ci.setUrl( ciUrl );
+                    versionMetadata.setCiManagement( ci );
+                }
 
-            boolean done = false;
-            int i = 0;
-            while ( !done )
-            {
-                String licenseName = properties.getProperty( "license." + i + ".name" );
-                String licenseUrl = properties.getProperty( "license." + i + ".url" );
-                if ( licenseName != null || licenseUrl != null )
+                String issueSystem = properties.getProperty( "issue.system" );
+                String issueUrl = properties.getProperty( "issue.url" );
+                if ( issueSystem != null || issueUrl != null )
                 {
-                    License license = new License();
-                    license.setName( licenseName );
-                    license.setUrl( licenseUrl );
-                    versionMetadata.addLicense( license );
+                    IssueManagement issueManagement = new IssueManagement();
+                    issueManagement.setSystem( issueSystem );
+                    issueManagement.setUrl( issueUrl );
+                    versionMetadata.setIssueManagement( issueManagement );
                 }
-                else
+
+                String orgName = properties.getProperty( "org.name" );
+                String orgUrl = properties.getProperty( "org.url" );
+                if ( orgName != null || orgUrl != null )
                 {
-                    done = true;
+                    Organization org = new Organization();
+                    org.setName( orgName );
+                    org.setUrl( orgUrl );
+                    versionMetadata.setOrganization( org );
                 }
-                i++;
-            }
 
-            done = false;
-            i = 0;
-            while ( !done )
-            {
-                String mailingListName = properties.getProperty( "mailingList." + i + ".name" );
-                if ( mailingListName != null )
+                boolean done = false;
+                int i = 0;
+                while ( !done )
                 {
-                    MailingList mailingList = new MailingList();
-                    mailingList.setName( mailingListName );
-                    mailingList.setMainArchiveUrl( properties.getProperty( "mailingList." + i + ".archive" ) );
-                    String p = properties.getProperty( "mailingList." + i + ".otherArchives" );
-                    if ( p != null && p.length() > 0 )
+                    String licenseName = properties.getProperty( "license." + i + ".name" );
+                    String licenseUrl = properties.getProperty( "license." + i + ".url" );
+                    if ( licenseName != null || licenseUrl != null )
                     {
-                        mailingList.setOtherArchives( Arrays.asList( p.split( "," ) ) );
+                        License license = new License();
+                        license.setName( licenseName );
+                        license.setUrl( licenseUrl );
+                        versionMetadata.addLicense( license );
                     }
                     else
                     {
-                        mailingList.setOtherArchives( Collections.<String>emptyList() );
+                        done = true;
                     }
-                    mailingList.setPostAddress( properties.getProperty( "mailingList." + i + ".post" ) );
-                    mailingList.setSubscribeAddress( properties.getProperty( "mailingList." + i + ".subscribe" ) );
-                    mailingList.setUnsubscribeAddress( properties.getProperty( "mailingList." + i + ".unsubscribe" ) );
-                    versionMetadata.addMailingList( mailingList );
-                }
-                else
-                {
-                    done = true;
+                    i++;
                 }
-                i++;
-            }
 
-            done = false;
-            i = 0;
-            while ( !done )
-            {
-                String dependencyArtifactId = properties.getProperty( "dependency." + i + ".artifactId" );
-                if ( dependencyArtifactId != null )
+                done = false;
+                i = 0;
+                while ( !done )
                 {
-                    Dependency dependency = new Dependency();
-                    dependency.setArtifactId( dependencyArtifactId );
-                    dependency.setGroupId( properties.getProperty( "dependency." + i + ".groupId" ) );
-                    dependency.setClassifier( properties.getProperty( "dependency." + i + ".classifier" ) );
-                    dependency.setOptional(
-                        Boolean.valueOf( properties.getProperty( "dependency." + i + ".optional" ) ) );
-                    dependency.setScope( properties.getProperty( "dependency." + i + ".scope" ) );
-                    dependency.setSystemPath( properties.getProperty( "dependency." + i + ".systemPath" ) );
-                    dependency.setType( properties.getProperty( "dependency." + i + ".type" ) );
-                    dependency.setVersion( properties.getProperty( "dependency." + i + ".version" ) );
-                    dependency.setOptional(
-                        Boolean.valueOf( properties.getProperty( "dependency." + i + ".optional" ) ) );
-                    versionMetadata.addDependency( dependency );
-                }
-                else
-                {
-                    done = true;
+                    String mailingListName = properties.getProperty( "mailingList." + i + ".name" );
+                    if ( mailingListName != null )
+                    {
+                        MailingList mailingList = new MailingList();
+                        mailingList.setName( mailingListName );
+                        mailingList.setMainArchiveUrl( properties.getProperty( "mailingList." + i + ".archive" ) );
+                        String p = properties.getProperty( "mailingList." + i + ".otherArchives" );
+                        if ( p != null && p.length() > 0 )
+                        {
+                            mailingList.setOtherArchives( Arrays.asList( p.split( "," ) ) );
+                        }
+                        else
+                        {
+                            mailingList.setOtherArchives( Collections.<String>emptyList() );
+                        }
+                        mailingList.setPostAddress( properties.getProperty( "mailingList." + i + ".post" ) );
+                        mailingList.setSubscribeAddress( properties.getProperty( "mailingList." + i + ".subscribe" ) );
+                        mailingList.setUnsubscribeAddress(
+                            properties.getProperty( "mailingList." + i + ".unsubscribe" ) );
+                        versionMetadata.addMailingList( mailingList );
+                    }
+                    else
+                    {
+                        done = true;
+                    }
+                    i++;
                 }
-                i++;
-            }
 
-            String facetIds = properties.getProperty( "facetIds", "" );
-            if ( facetIds.length() > 0 )
-            {
-                for ( String facetId : facetIds.split( "," ) )
+                done = false;
+                i = 0;
+                while ( !done )
                 {
-                    MetadataFacetFactory factory = metadataFacetFactories.get( facetId );
-                    if ( factory == null )
+                    String dependencyArtifactId = properties.getProperty( "dependency." + i + ".artifactId" );
+                    if ( dependencyArtifactId != null )
                     {
-                        log.error( "Attempted to load unknown project version metadata facet: {}", facetId );
+                        Dependency dependency = new Dependency();
+                        dependency.setArtifactId( dependencyArtifactId );
+                        dependency.setGroupId( properties.getProperty( "dependency." + i + ".groupId" ) );
+                        dependency.setClassifier( properties.getProperty( "dependency." + i + ".classifier" ) );
+                        dependency.setOptional(
+                            Boolean.valueOf( properties.getProperty( "dependency." + i + ".optional" ) ) );
+                        dependency.setScope( properties.getProperty( "dependency." + i + ".scope" ) );
+                        dependency.setSystemPath( properties.getProperty( "dependency." + i + ".systemPath" ) );
+                        dependency.setType( properties.getProperty( "dependency." + i + ".type" ) );
+                        dependency.setVersion( properties.getProperty( "dependency." + i + ".version" ) );
+                        dependency.setOptional(
+                            Boolean.valueOf( properties.getProperty( "dependency." + i + ".optional" ) ) );
+                        versionMetadata.addDependency( dependency );
                     }
                     else
                     {
-                        MetadataFacet facet = factory.createMetadataFacet();
-                        Map<String, String> map = new HashMap<>();
-                        for ( Object key : new ArrayList( properties.keySet() ) )
+                        done = true;
+                    }
+                    i++;
+                }
+
+                String facetIds = properties.getProperty( "facetIds", "" );
+                if ( facetIds.length() > 0 )
+                {
+                    for ( String facetId : facetIds.split( "," ) )
+                    {
+                        MetadataFacetFactory factory = metadataFacetFactories.get( facetId );
+                        if ( factory == null )
                         {
-                            String property = (String) key;
-                            if ( property.startsWith( facet.getFacetId() ) )
+                            log.error( "Attempted to load unknown project version metadata facet: {}", facetId );
+                        }
+                        else
+                        {
+                            MetadataFacet facet = factory.createMetadataFacet();
+                            Map<String, String> map = new HashMap<>();
+                            for ( Object key : new ArrayList( properties.keySet() ) )
                             {
-                                map.put( property.substring( facet.getFacetId().length() + 1 ),
-                                         properties.getProperty( property ) );
+                                String property = (String) key;
+                                if ( property.startsWith( facet.getFacetId() ) )
+                                {
+                                    map.put( property.substring( facet.getFacetId().length() + 1 ),
+                                             properties.getProperty( property ) );
+                                }
                             }
+                            facet.fromProperties( map );
+                            versionMetadata.addFacet( facet );
                         }
-                        facet.fromProperties( map );
-                        versionMetadata.addFacet( facet );
                     }
                 }
-            }
 
-            updateProjectVersionFacets( versionMetadata, properties );
+                updateProjectVersionFacets( versionMetadata, properties );
+            }
+            return versionMetadata;
+        }
+        catch ( IOException e )
+        {
+            throw new MetadataResolutionException( e.getMessage(), e );
         }
-        return versionMetadata;
     }
 
     @Override
     public Collection<String> getArtifactVersions( String repoId, String namespace, String projectId,
                                                    String projectVersion )
+        throws MetadataResolutionException
     {
-        File directory = new File( getDirectory( repoId ), namespace + "/" + projectId + "/" + projectVersion );
+        try
+        {
+            File directory = new File( getDirectory( repoId ), namespace + "/" + projectId + "/" + projectVersion );
 
-        Properties properties = readOrCreateProperties( directory, PROJECT_VERSION_METADATA_KEY );
+            Properties properties = readOrCreateProperties( directory, PROJECT_VERSION_METADATA_KEY );
 
-        Set<String> versions = new HashSet<String>();
-        for ( Map.Entry entry : properties.entrySet() )
-        {
-            String name = (String) entry.getKey();
-            if ( name.startsWith( "artifact:version:" ) )
+            Set<String> versions = new HashSet<String>();
+            for ( Map.Entry entry : properties.entrySet() )
             {
-                versions.add( (String) entry.getValue() );
+                String name = (String) entry.getKey();
+                if ( name.startsWith( "artifact:version:" ) )
+                {
+                    versions.add( (String) entry.getValue() );
+                }
             }
+            return versions;
+        }
+        catch ( IOException e )
+        {
+            throw new MetadataResolutionException( e.getMessage(), e );
         }
-        return versions;
     }
 
     @Override
     public Collection<ProjectVersionReference> getProjectReferences( String repoId, String namespace, String projectId,
                                                                      String projectVersion )
+        throws MetadataResolutionException
     {
-        File directory = new File( getDirectory( repoId ), namespace + "/" + projectId + "/" + projectVersion );
+        try
+        {
+            File directory = new File( getDirectory( repoId ), namespace + "/" + projectId + "/" + projectVersion );
 
-        Properties properties = readOrCreateProperties( directory, PROJECT_VERSION_METADATA_KEY );
-        int numberOfRefs = Integer.parseInt( properties.getProperty( "ref:lastReferenceNum", "-1" ) ) + 1;
+            Properties properties = readOrCreateProperties( directory, PROJECT_VERSION_METADATA_KEY );
+            int numberOfRefs = Integer.parseInt( properties.getProperty( "ref:lastReferenceNum", "-1" ) ) + 1;
 
-        List<ProjectVersionReference> references = new ArrayList<>();
-        for ( int i = 0; i < numberOfRefs; i++ )
+            List<ProjectVersionReference> references = new ArrayList<>();
+            for ( int i = 0; i < numberOfRefs; i++ )
+            {
+                ProjectVersionReference reference = new ProjectVersionReference();
+                reference.setProjectId( properties.getProperty( "ref:reference." + i + ".projectId" ) );
+                reference.setNamespace( properties.getProperty( "ref:reference." + i + ".namespace" ) );
+                reference.setProjectVersion( properties.getProperty( "ref:reference." + i + ".projectVersion" ) );
+                reference.setReferenceType( ProjectVersionReference.ReferenceType.valueOf(
+                    properties.getProperty( "ref:reference." + i + ".referenceType" ) ) );
+                references.add( reference );
+            }
+            return references;
+        }
+        catch ( IOException e )
         {
-            ProjectVersionReference reference = new ProjectVersionReference();
-            reference.setProjectId( properties.getProperty( "ref:reference." + i + ".projectId" ) );
-            reference.setNamespace( properties.getProperty( "ref:reference." + i + ".namespace" ) );
-            reference.setProjectVersion( properties.getProperty( "ref:reference." + i + ".projectVersion" ) );
-            reference.setReferenceType( ProjectVersionReference.ReferenceType.valueOf(
-                properties.getProperty( "ref:reference." + i + ".referenceType" ) ) );
-            references.add( reference );
-        }
-        return references;
+            throw new MetadataResolutionException( e.getMessage(), e );
+        }
     }
 
     @Override
     public Collection<String> getRootNamespaces( String repoId )
+        throws MetadataResolutionException
     {
         return getNamespaces( repoId, null );
     }
 
     @Override
     public Collection<String> getNamespaces( String repoId, String baseNamespace )
+        throws MetadataResolutionException
     {
-        List<String> allNamespaces = new ArrayList<>();
-        File directory = getDirectory( repoId );
-        File[] files = directory.listFiles();
-        if ( files != null )
+        try
         {
-            for ( File namespace : files )
+            List<String> allNamespaces = new ArrayList<>();
+            File directory = getDirectory( repoId );
+            File[] files = directory.listFiles();
+            if ( files != null )
             {
-                if ( new File( namespace, NAMESPACE_METADATA_KEY + ".properties" ).exists() )
+                for ( File namespace : files )
                 {
-                    allNamespaces.add( namespace.getName() );
+                    if ( new File( namespace, NAMESPACE_METADATA_KEY + ".properties" ).exists() )
+                    {
+                        allNamespaces.add( namespace.getName() );
+                    }
                 }
             }
-        }
 
-        Set<String> namespaces = new LinkedHashSet<>();
-        int fromIndex = baseNamespace != null ? baseNamespace.length() + 1 : 0;
-        for ( String namespace : allNamespaces )
-        {
-            if ( baseNamespace == null || namespace.startsWith( baseNamespace + "." ) )
+            Set<String> namespaces = new LinkedHashSet<>();
+            int fromIndex = baseNamespace != null ? baseNamespace.length() + 1 : 0;
+            for ( String namespace : allNamespaces )
             {
-                int i = namespace.indexOf( '.', fromIndex );
-                if ( i >= 0 )
-                {
-                    namespaces.add( namespace.substring( fromIndex, i ) );
-                }
-                else
+                if ( baseNamespace == null || namespace.startsWith( baseNamespace + "." ) )
                 {
-                    namespaces.add( namespace.substring( fromIndex ) );
+                    int i = namespace.indexOf( '.', fromIndex );
+                    if ( i >= 0 )
+                    {
+                        namespaces.add( namespace.substring( fromIndex, i ) );
+                    }
+                    else
+                    {
+                        namespaces.add( namespace.substring( fromIndex ) );
+                    }
                 }
             }
+            return new ArrayList<>( namespaces );
+        }
+        catch ( IOException e )
+        {
+            throw new MetadataResolutionException( e.getMessage(), e );
         }
-        return new ArrayList<>( namespaces );
     }
 
     @Override
     public Collection<String> getProjects( String repoId, String namespace )
+        throws MetadataResolutionException
     {
-        List<String> projects = new ArrayList<>();
-        File directory = new File( getDirectory( repoId ), namespace );
-        File[] files = directory.listFiles();
-        if ( files != null )
+        try
         {
-            for ( File project : files )
+            List<String> projects = new ArrayList<>();
+            File directory = new File( getDirectory( repoId ), namespace );
+            File[] files = directory.listFiles();
+            if ( files != null )
             {
-                if ( new File( project, PROJECT_METADATA_KEY + ".properties" ).exists() )
+                for ( File project : files )
                 {
-                    projects.add( project.getName() );
+                    if ( new File( project, PROJECT_METADATA_KEY + ".properties" ).exists() )
+                    {
+                        projects.add( project.getName() );
+                    }
                 }
             }
+            return projects;
+        }
+        catch ( IOException e )
+        {
+            throw new MetadataResolutionException( e.getMessage(), e );
         }
-        return projects;
     }
 
     @Override
     public Collection<String> getProjectVersions( String repoId, String namespace, String projectId )
+        throws MetadataResolutionException
     {
-        List<String> projectVersions = new ArrayList<>();
-        File directory = new File( getDirectory( repoId ), namespace + "/" + projectId );
-        File[] files = directory.listFiles();
-        if ( files != null )
+        try
         {
-            for ( File projectVersion : files )
+            List<String> projectVersions = new ArrayList<>();
+            File directory = new File( getDirectory( repoId ), namespace + "/" + projectId );
+            File[] files = directory.listFiles();
+            if ( files != null )
             {
-                if ( new File( projectVersion, PROJECT_VERSION_METADATA_KEY + ".properties" ).exists() )
+                for ( File projectVersion : files )
                 {
-                    projectVersions.add( projectVersion.getName() );
+                    if ( new File( projectVersion, PROJECT_VERSION_METADATA_KEY + ".properties" ).exists() )
+                    {
+                        projectVersions.add( projectVersion.getName() );
+                    }
                 }
             }
+            return projectVersions;
+        }
+        catch ( IOException e )
+        {
+            throw new MetadataResolutionException( e.getMessage(), e );
         }
-        return projectVersions;
     }
 
     @Override
     public void removeProject( String repositoryId, String namespace, String projectId )
         throws MetadataRepositoryException
     {
-        File directory = new File( getDirectory( repositoryId ), namespace + "/" + projectId );
         try
         {
-            if ( directory.exists() )
-            {
-                FileUtils.deleteDirectory( directory );
-            }
+            File directory = new File( getDirectory( repositoryId ), namespace + "/" + projectId );
+            Files.deleteIfExists( directory.toPath() );
         }
         catch ( IOException e )
         {
@@ -1242,18 +1370,16 @@ public class FileMetadataRepository
     public void removeProjectVersion( String repoId, String namespace, String projectId, String projectVersion )
         throws MetadataRepositoryException
     {
-        File directory = new File( getDirectory( repoId ), namespace + "/" + projectId + "/" + projectVersion );
-        if ( directory.exists() )
+        try
         {
-            try
-            {
-                FileUtils.deleteDirectory( directory );
-            }
-            catch ( IOException e )
-            {
-                throw new MetadataRepositoryException( e.getMessage(), e );
-            }
+            File directory = new File( getDirectory( repoId ), namespace + "/" + projectId + "/" + projectVersion );
+            Files.deleteIfExists( directory.toPath() );
         }
+        catch ( IOException e )
+        {
+            throw new MetadataRepositoryException( e.getMessage(), e );
+        }
+
     }
 
     private void writeProperties( Properties properties, File directory, String propertiesKey )
@@ -1290,16 +1416,25 @@ public class FileMetadataRepository
 
     @Override
     public List<ArtifactMetadata> getArtifacts( String repoId )
+        throws MetadataRepositoryException
     {
-        List<ArtifactMetadata> artifacts = new ArrayList<>();
-        for ( String ns : getRootNamespaces( repoId ) )
+        try
+        {
+            List<ArtifactMetadata> artifacts = new ArrayList<>();
+            for ( String ns : getRootNamespaces( repoId ) )
+            {
+                getArtifacts( artifacts, repoId, ns );
+            }
+            return artifacts;
+        }
+        catch ( MetadataResolutionException e )
         {
-            getArtifacts( artifacts, repoId, ns );
+            throw new MetadataRepositoryException( e.getMessage(), e );
         }
-        return artifacts;
     }
 
     private void getArtifacts( List<ArtifactMetadata> artifacts, String repoId, String ns )
+        throws MetadataResolutionException
     {
         for ( String namespace : getNamespaces( repoId, ns ) )
         {