You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@archiva.apache.org by ma...@apache.org on 2019/08/25 20:29:09 UTC

[archiva] 02/03: Changing method names and adding javadoc for metarepository

This is an automated email from the ASF dual-hosted git repository.

martin_s pushed a commit to branch feature/storage_refactoring
in repository https://gitbox.apache.org/repos/asf/archiva.git

commit 8f42ce002cc96da7e2fc45321ede494c29961748
Author: Martin Stockhammer <ma...@apache.org>
AuthorDate: Sun Aug 25 19:55:00 2019 +0200

    Changing method names and adding javadoc for metarepository
---
 .../core/repository/AbstractRepositoryPurge.java   |   6 +-
 ...leanupReleasedSnapshotsRepositoryPurgeTest.java |   4 +-
 .../repository/DaysOldRepositoryPurgeTest.java     |   6 +-
 .../repository/RepositoryPurgeConsumerTest.java    |  11 +-
 .../RetentionCountRepositoryPurgeTest.java         |   6 +-
 .../rest/services/DefaultBrowseService.java        |   6 +-
 .../rest/services/DefaultRepositoriesService.java  |   6 +-
 .../repository/AbstractMetadataRepository.java     |  29 +-
 .../repository/DefaultMetadataResolver.java        |   4 +-
 .../metadata/repository/MetadataRepository.java    | 579 +++++++++++----------
 .../repository/AbstractMetadataRepositoryTest.java |  26 +-
 .../model/RepositoryWalkingStatisticsProvider.java |   2 +-
 .../cassandra/CassandraMetadataRepository.java     |  45 +-
 .../repository/file/FileMetadataRepository.java    |  33 +-
 .../repository/jcr/JcrMetadataRepository.java      |  35 +-
 .../stats/RepositoryStatisticsManagerTest.java     |  16 +-
 16 files changed, 402 insertions(+), 412 deletions(-)

diff --git a/archiva-modules/archiva-base/archiva-consumers/archiva-core-consumers/src/main/java/org/apache/archiva/consumers/core/repository/AbstractRepositoryPurge.java b/archiva-modules/archiva-base/archiva-consumers/archiva-core-consumers/src/main/java/org/apache/archiva/consumers/core/repository/AbstractRepositoryPurge.java
index a8cf4b7..a00e444 100644
--- a/archiva-modules/archiva-base/archiva-consumers/archiva-core-consumers/src/main/java/org/apache/archiva/consumers/core/repository/AbstractRepositoryPurge.java
+++ b/archiva-modules/archiva-base/archiva-consumers/archiva-core-consumers/src/main/java/org/apache/archiva/consumers/core/repository/AbstractRepositoryPurge.java
@@ -259,7 +259,7 @@ public abstract class AbstractRepositoryPurge
                                 }
                                 else
                                 {
-                                    // metadataRepository.removeArtifact( artifactMetadata, baseVersion );
+                                    // metadataRepository.removeTimestampedArtifact( artifactMetadata, baseVersion );
                                     metaRemovalList.put( info, artifactMetadata );
                                 }
                             }
@@ -366,7 +366,7 @@ public abstract class AbstractRepositoryPurge
                     version = artifactInfo.getProjectVersion( );
                 MavenArtifactFacet mavenArtifactFacetToCompare = new MavenArtifactFacet( );
                 mavenArtifactFacetToCompare.setClassifier( artifactInfo.getClassifier( ) );
-                metadataRepository.removeArtifact(repositorySession , repository.getId( ), groupId,
+                metadataRepository.removeFacetFromArtifact(repositorySession , repository.getId( ), groupId,
                     artifactId, version, mavenArtifactFacetToCompare );
                 try {
                     repositorySession.save( );
@@ -377,7 +377,7 @@ public abstract class AbstractRepositoryPurge
         }
         else
         {
-            metadataRepository.removeArtifact(repositorySession , artifactMetadata, artifactInfo.getProjectVersion( ) );
+            metadataRepository.removeTimestampedArtifact(repositorySession , artifactMetadata, artifactInfo.getProjectVersion( ) );
         }
     }
 
diff --git a/archiva-modules/archiva-base/archiva-consumers/archiva-core-consumers/src/test/java/org/apache/archiva/consumers/core/repository/CleanupReleasedSnapshotsRepositoryPurgeTest.java b/archiva-modules/archiva-base/archiva-consumers/archiva-core-consumers/src/test/java/org/apache/archiva/consumers/core/repository/CleanupReleasedSnapshotsRepositoryPurgeTest.java
index 9d44b28..18c3d28 100644
--- a/archiva-modules/archiva-base/archiva-consumers/archiva-core-consumers/src/test/java/org/apache/archiva/consumers/core/repository/CleanupReleasedSnapshotsRepositoryPurgeTest.java
+++ b/archiva-modules/archiva-base/archiva-consumers/archiva-core-consumers/src/test/java/org/apache/archiva/consumers/core/repository/CleanupReleasedSnapshotsRepositoryPurgeTest.java
@@ -345,8 +345,8 @@ public class CleanupReleasedSnapshotsRepositoryPurgeTest
         verify(metadataRepository, never()).removeProjectVersion(eq(repositorySession) , eq(TEST_REPO_ID), eq(projectNs), eq(projectName), eq(projectVersion) );
         verify(metadataRepository, never()).removeProjectVersion(eq(repositorySession) , eq(TEST_REPO_ID), eq(projectNs), eq(projectName), eq("2.0.3-SNAPSHOT") );
         verify(metadataRepository, never()).removeProjectVersion(eq(repositorySession) , eq(TEST_REPO_ID), eq(projectNs), eq(projectName), eq("2.0.4-SNAPSHOT") );
-        verify(metadataRepository, never()).removeArtifact(eq(repositorySession) , any(ArtifactMetadata.class), any(String.class) );
-        verify(metadataRepository, never()).removeArtifact(eq(repositorySession) , any(String.class), any(String.class), any(String.class), any(String.class), any( MetadataFacet.class) );
+        verify(metadataRepository, never()).removeTimestampedArtifact(eq(repositorySession) , any(ArtifactMetadata.class), any(String.class) );
+        verify(metadataRepository, never()).removeFacetFromArtifact(eq(repositorySession) , any(String.class), any(String.class), any(String.class), any(String.class), any( MetadataFacet.class) );
 
 
 
diff --git a/archiva-modules/archiva-base/archiva-consumers/archiva-core-consumers/src/test/java/org/apache/archiva/consumers/core/repository/DaysOldRepositoryPurgeTest.java b/archiva-modules/archiva-base/archiva-consumers/archiva-core-consumers/src/test/java/org/apache/archiva/consumers/core/repository/DaysOldRepositoryPurgeTest.java
index 848d4ed..66651d3 100644
--- a/archiva-modules/archiva-base/archiva-consumers/archiva-core-consumers/src/test/java/org/apache/archiva/consumers/core/repository/DaysOldRepositoryPurgeTest.java
+++ b/archiva-modules/archiva-base/archiva-consumers/archiva-core-consumers/src/test/java/org/apache/archiva/consumers/core/repository/DaysOldRepositoryPurgeTest.java
@@ -134,7 +134,7 @@ public class DaysOldRepositoryPurgeTest
         // Verify the metadataRepository invocations
         verify(metadataRepository, never()).removeProjectVersion(eq(repositorySession) , eq(TEST_REPO_ID), eq(projectNs), eq(projectName), eq(projectVersion) );
         ArgumentCaptor<ArtifactMetadata> metadataArg = ArgumentCaptor.forClass(ArtifactMetadata.class);
-        verify(metadataRepository, times(2)).removeArtifact(eq(repositorySession) , metadataArg.capture(), eq(projectVersion) );
+        verify(metadataRepository, times(2)).removeTimestampedArtifact(eq(repositorySession) , metadataArg.capture(), eq(projectVersion) );
         List<ArtifactMetadata> metaL = metadataArg.getAllValues();
         for (ArtifactMetadata meta : metaL) {
             assertTrue(meta.getId().startsWith(projectName));
@@ -229,7 +229,7 @@ public class DaysOldRepositoryPurgeTest
         // Verify the metadataRepository invocations
         verify(metadataRepository, never()).removeProjectVersion(eq(repositorySession) , eq(TEST_REPO_ID), eq(projectNs), eq(projectName), eq(projectVersion) );
         ArgumentCaptor<ArtifactMetadata> metadataArg = ArgumentCaptor.forClass(ArtifactMetadata.class);
-        verify(metadataRepository, times(deletedVersions.size())).removeArtifact(eq(repositorySession) , metadataArg.capture(), eq(projectVersion) );
+        verify(metadataRepository, times(deletedVersions.size())).removeTimestampedArtifact(eq(repositorySession) , metadataArg.capture(), eq(projectVersion) );
         List<ArtifactMetadata> metaL = metadataArg.getAllValues();
         for (ArtifactMetadata meta : metaL) {
             assertTrue(meta.getId().startsWith(projectName));
@@ -337,7 +337,7 @@ public class DaysOldRepositoryPurgeTest
         // Verify the metadataRepository invocations
         verify(metadataRepository, never()).removeProjectVersion(eq(repositorySession) , eq(TEST_REPO_ID), eq(projectNs), eq(projectName), eq(projectVersion) );
         ArgumentCaptor<ArtifactMetadata> metadataArg = ArgumentCaptor.forClass(ArtifactMetadata.class);
-        verify(metadataRepository, times(deletedVersions.size())).removeArtifact( eq(repositorySession), metadataArg.capture(), eq(projectVersion) );
+        verify(metadataRepository, times(deletedVersions.size())).removeTimestampedArtifact( eq(repositorySession), metadataArg.capture(), eq(projectVersion) );
         List<ArtifactMetadata> metaL = metadataArg.getAllValues();
         for (ArtifactMetadata meta : metaL) {
             assertTrue(meta.getId().startsWith(projectName));
diff --git a/archiva-modules/archiva-base/archiva-consumers/archiva-core-consumers/src/test/java/org/apache/archiva/consumers/core/repository/RepositoryPurgeConsumerTest.java b/archiva-modules/archiva-base/archiva-consumers/archiva-core-consumers/src/test/java/org/apache/archiva/consumers/core/repository/RepositoryPurgeConsumerTest.java
index 3181445..3172a3d 100644
--- a/archiva-modules/archiva-base/archiva-consumers/archiva-core-consumers/src/test/java/org/apache/archiva/consumers/core/repository/RepositoryPurgeConsumerTest.java
+++ b/archiva-modules/archiva-base/archiva-consumers/archiva-core-consumers/src/test/java/org/apache/archiva/consumers/core/repository/RepositoryPurgeConsumerTest.java
@@ -27,7 +27,6 @@ import org.apache.archiva.consumers.KnownRepositoryContentConsumer;
 import org.apache.archiva.consumers.functors.ConsumerWantsFilePredicate;
 import org.apache.archiva.metadata.model.ArtifactMetadata;
 import org.apache.archiva.metadata.model.MetadataFacet;
-import org.apache.archiva.mock.MockRepositorySessionFactory;
 import org.apache.archiva.repository.RepositoryRegistry;
 import org.apache.archiva.repository.features.ArtifactCleanupFeature;
 import org.custommonkey.xmlunit.XMLAssert;
@@ -210,7 +209,7 @@ public class RepositoryPurgeConsumerTest
         // Verify the metadataRepository invocations
         verify(metadataRepository, never()).removeProjectVersion( eq(repositorySession), eq(TEST_REPO_ID), eq(projectNs), eq(projectName), eq(projectVersion) );
         ArgumentCaptor<ArtifactMetadata> metadataArg = ArgumentCaptor.forClass(ArtifactMetadata.class);
-        verify(metadataRepository, times(2)).removeArtifact( eq(repositorySession), metadataArg.capture(), eq(projectVersion) );
+        verify(metadataRepository, times(2)).removeTimestampedArtifact( eq(repositorySession), metadataArg.capture(), eq(projectVersion) );
         List<ArtifactMetadata> metaL = metadataArg.getAllValues();
         for (ArtifactMetadata meta : metaL) {
             assertTrue(meta.getId().startsWith(projectName));
@@ -323,7 +322,7 @@ public class RepositoryPurgeConsumerTest
         // Verify the metadataRepository invocations
         verify(metadataRepository, never()).removeProjectVersion( eq(repositorySession), eq(TEST_REPO_ID), eq(projectNs), eq(projectName), eq(projectVersion) );
         ArgumentCaptor<ArtifactMetadata> metadataArg = ArgumentCaptor.forClass(ArtifactMetadata.class);
-        verify(metadataRepository, times(2)).removeArtifact( eq(repositorySession), metadataArg.capture(), eq(projectVersion) );
+        verify(metadataRepository, times(2)).removeTimestampedArtifact( eq(repositorySession), metadataArg.capture(), eq(projectVersion) );
         List<ArtifactMetadata> metaL = metadataArg.getAllValues();
         assertTrue( metaL.size( ) > 0 );
         for (ArtifactMetadata meta : metaL) {
@@ -403,8 +402,8 @@ public class RepositoryPurgeConsumerTest
 
         verify(metadataRepository, never()).removeProjectVersion( eq(repositorySession), eq(TEST_REPO_ID), eq(projectNs), eq(projectName), eq(projectVersion) );
         ArgumentCaptor<ArtifactMetadata> metadataArg = ArgumentCaptor.forClass(ArtifactMetadata.class);
-        verify(metadataRepository, never()).removeArtifact( eq(repositorySession), any(), any() );
-        verify(metadataRepository, never()).removeArtifact( eq(repositorySession), any(), any(), any(), any(), any(MetadataFacet.class) );
+        verify(metadataRepository, never()).removeTimestampedArtifact( eq(repositorySession), any(), any() );
+        verify(metadataRepository, never()).removeFacetFromArtifact( eq(repositorySession), any(), any(), any(), any(), any(MetadataFacet.class) );
 
         // check if the snapshot wasn't removed
 
@@ -473,7 +472,7 @@ public class RepositoryPurgeConsumerTest
 
         verify(metadataRepository, times(1)).removeProjectVersion( eq(repositorySession), eq(TEST_REPO_ID), eq(projectNs), eq(projectName), eq(projectVersion) );
         ArgumentCaptor<ArtifactMetadata> metadataArg = ArgumentCaptor.forClass(ArtifactMetadata.class);
-        verify(metadataRepository, never()).removeArtifact( eq(repositorySession), any(), any() );
+        verify(metadataRepository, never()).removeTimestampedArtifact( eq(repositorySession), any(), any() );
 
         // check if the snapshot was removed
         assertDeleted( projectRoot + "/2.3-SNAPSHOT" );
diff --git a/archiva-modules/archiva-base/archiva-consumers/archiva-core-consumers/src/test/java/org/apache/archiva/consumers/core/repository/RetentionCountRepositoryPurgeTest.java b/archiva-modules/archiva-base/archiva-consumers/archiva-core-consumers/src/test/java/org/apache/archiva/consumers/core/repository/RetentionCountRepositoryPurgeTest.java
index e8ffc78..3a06774 100644
--- a/archiva-modules/archiva-base/archiva-consumers/archiva-core-consumers/src/test/java/org/apache/archiva/consumers/core/repository/RetentionCountRepositoryPurgeTest.java
+++ b/archiva-modules/archiva-base/archiva-consumers/archiva-core-consumers/src/test/java/org/apache/archiva/consumers/core/repository/RetentionCountRepositoryPurgeTest.java
@@ -137,7 +137,7 @@ public class RetentionCountRepositoryPurgeTest
         // Verify the metadataRepository invocations
         verify(metadataRepository, never()).removeProjectVersion( eq(repositorySession), eq(TEST_REPO_ID), eq(projectNs), eq(projectName), eq(projectVersion) );
         ArgumentCaptor<ArtifactMetadata> metadataArg = ArgumentCaptor.forClass(ArtifactMetadata.class);
-        verify(metadataRepository, times(deletedVersions.size())).removeArtifact( eq(repositorySession), metadataArg.capture(), eq(projectVersion) );
+        verify(metadataRepository, times(deletedVersions.size())).removeTimestampedArtifact( eq(repositorySession), metadataArg.capture(), eq(projectVersion) );
         List<ArtifactMetadata> metaL = metadataArg.getAllValues();
         for (ArtifactMetadata meta : metaL) {
             assertTrue(meta.getId().startsWith(projectName));
@@ -223,7 +223,7 @@ public class RetentionCountRepositoryPurgeTest
         // Verify the metadataRepository invocations
         verify(metadataRepository, never()).removeProjectVersion( eq(repositorySession), eq(TEST_REPO_ID), eq(projectNs), eq(projectName), eq(projectVersion) );
         ArgumentCaptor<ArtifactMetadata> metadataArg = ArgumentCaptor.forClass(ArtifactMetadata.class);
-        verify(metadataRepository, times(deletedVersions.size())).removeArtifact( eq(repositorySession), metadataArg.capture(), eq(projectVersion) );
+        verify(metadataRepository, times(deletedVersions.size())).removeTimestampedArtifact( eq(repositorySession), metadataArg.capture(), eq(projectVersion) );
         List<ArtifactMetadata> metaL = metadataArg.getAllValues();
         for (ArtifactMetadata meta : metaL) {
             assertTrue(meta.getId().startsWith(projectName));
@@ -311,7 +311,7 @@ public class RetentionCountRepositoryPurgeTest
         // Verify the metadataRepository invocations
         verify(metadataRepository, never()).removeProjectVersion( eq(repositorySession), eq(TEST_REPO_ID), eq(projectNs), eq(projectName), eq(projectVersion) );
         ArgumentCaptor<ArtifactMetadata> metadataArg = ArgumentCaptor.forClass(ArtifactMetadata.class);
-        verify(metadataRepository, times(deletedVersions.size())).removeArtifact( eq(repositorySession), metadataArg.capture(), eq(projectVersion) );
+        verify(metadataRepository, times(deletedVersions.size())).removeTimestampedArtifact( eq(repositorySession), metadataArg.capture(), eq(projectVersion) );
         List<ArtifactMetadata> metaL = metadataArg.getAllValues();
         for (ArtifactMetadata meta : metaL) {
             assertTrue(meta.getId().startsWith(projectName));
diff --git a/archiva-modules/archiva-web/archiva-rest/archiva-rest-services/src/main/java/org/apache/archiva/rest/services/DefaultBrowseService.java b/archiva-modules/archiva-web/archiva-rest/archiva-rest-services/src/main/java/org/apache/archiva/rest/services/DefaultBrowseService.java
index adc2c0a..8012d6b 100644
--- a/archiva-modules/archiva-web/archiva-rest/archiva-rest-services/src/main/java/org/apache/archiva/rest/services/DefaultBrowseService.java
+++ b/archiva-modules/archiva-web/archiva-rest/archiva-rest-services/src/main/java/org/apache/archiva/rest/services/DefaultBrowseService.java
@@ -1019,7 +1019,7 @@ public class DefaultBrowseService
         }
         try
         {
-            List<ArtifactMetadata> artifactMetadatas = repositorySession.getRepository().getArtifactsByProjectVersionMetadata(repositorySession , key, value, repositoryId );
+            List<ArtifactMetadata> artifactMetadatas = repositorySession.getRepository().getArtifactsByProjectVersionFacet(repositorySession , key, value, repositoryId );
             return buildArtifacts( artifactMetadatas, repositoryId );
         }
         catch ( MetadataRepositoryException e )
@@ -1047,7 +1047,7 @@ public class DefaultBrowseService
         }
         try
         {
-            List<ArtifactMetadata> artifactMetadatas = repositorySession.getRepository().getArtifactsByMetadata(repositorySession , key, value, repositoryId );
+            List<ArtifactMetadata> artifactMetadatas = repositorySession.getRepository().getArtifactsByAttribute(repositorySession , key, value, repositoryId );
             return buildArtifacts( artifactMetadatas, repositoryId );
         }
         catch ( MetadataRepositoryException e )
@@ -1075,7 +1075,7 @@ public class DefaultBrowseService
         }
         try
         {
-            List<ArtifactMetadata> artifactMetadatas = repositorySession.getRepository().getArtifactsByProperty(repositorySession , key, value, repositoryId );
+            List<ArtifactMetadata> artifactMetadatas = repositorySession.getRepository().getArtifactsByProjectVersionAttribute(repositorySession , key, value, repositoryId );
             return buildArtifacts( artifactMetadatas, repositoryId );
         }
         catch ( MetadataRepositoryException e )
diff --git a/archiva-modules/archiva-web/archiva-rest/archiva-rest-services/src/main/java/org/apache/archiva/rest/services/DefaultRepositoriesService.java b/archiva-modules/archiva-web/archiva-rest/archiva-rest-services/src/main/java/org/apache/archiva/rest/services/DefaultRepositoriesService.java
index faa07e8..fd7ae90 100644
--- a/archiva-modules/archiva-web/archiva-rest/archiva-rest-services/src/main/java/org/apache/archiva/rest/services/DefaultRepositoriesService.java
+++ b/archiva-modules/archiva-web/archiva-rest/archiva-rest-services/src/main/java/org/apache/archiva/rest/services/DefaultRepositoriesService.java
@@ -703,7 +703,7 @@ public class DefaultRepositoriesService
 
             for ( ArtifactMetadata artifactMetadata : artifacts )
             {
-                metadataRepository.removeArtifact(repositorySession , artifactMetadata, version );
+                metadataRepository.removeTimestampedArtifact(repositorySession , artifactMetadata, version );
             }
 
             metadataRepository.removeProjectVersion(repositorySession , repositoryId, namespace, projectId, version );
@@ -920,7 +920,7 @@ public class DefaultRepositoriesService
                                 artifact.getVersion();
                             MavenArtifactFacet mavenArtifactFacetToCompare = new MavenArtifactFacet();
                             mavenArtifactFacetToCompare.setClassifier( artifact.getClassifier() );
-                            metadataRepository.removeArtifact(repositorySession , repositoryId, groupId, artifactId,
+                            metadataRepository.removeFacetFromArtifact(repositorySession , repositoryId, groupId, artifactId,
                                 version, mavenArtifactFacetToCompare );
                             repositorySession.save();
                         }
@@ -930,7 +930,7 @@ public class DefaultRepositoriesService
                     {
                         if ( snapshotVersion )
                         {
-                            metadataRepository.removeArtifact(repositorySession ,
+                            metadataRepository.removeTimestampedArtifact(repositorySession ,
                                 artifactMetadata, VersionUtil.getBaseVersion( artifact.getVersion() ) );
                         }
                         else
diff --git a/archiva-modules/metadata/metadata-repository-api/src/main/java/org/apache/archiva/metadata/repository/AbstractMetadataRepository.java b/archiva-modules/metadata/metadata-repository-api/src/main/java/org/apache/archiva/metadata/repository/AbstractMetadataRepository.java
index 248e194..db2fc83 100644
--- a/archiva-modules/metadata/metadata-repository-api/src/main/java/org/apache/archiva/metadata/repository/AbstractMetadataRepository.java
+++ b/archiva-modules/metadata/metadata-repository-api/src/main/java/org/apache/archiva/metadata/repository/AbstractMetadataRepository.java
@@ -28,8 +28,6 @@ import org.apache.archiva.metadata.model.ProjectVersionMetadata;
 import org.apache.archiva.metadata.model.ProjectVersionReference;
 import org.apache.commons.collections4.ComparatorUtils;
 
-import javax.annotation.Nonnull;
-import javax.management.Query;
 import java.time.ZonedDateTime;
 import java.util.*;
 import java.util.stream.Stream;
@@ -127,21 +125,21 @@ public abstract class AbstractMetadataRepository
     }
 
     @Override
-    public List<ArtifactMetadata> getArtifactsByProjectVersionMetadata( RepositorySession session, String key, String value, String repositoryId )
+    public List<ArtifactMetadata> getArtifactsByProjectVersionFacet( RepositorySession session, String key, String value, String repositoryId )
         throws MetadataRepositoryException
     {
         throw new UnsupportedOperationException();
     }
 
     @Override
-    public List<ArtifactMetadata> getArtifactsByMetadata( RepositorySession session, String key, String value, String repositoryId )
+    public List<ArtifactMetadata> getArtifactsByAttribute( RepositorySession session, String key, String value, String repositoryId )
         throws MetadataRepositoryException
     {
         throw new UnsupportedOperationException();
     }
 
     @Override
-    public List<ArtifactMetadata> getArtifactsByProperty( RepositorySession session, String key, String value, String repositoryId )
+    public List<ArtifactMetadata> getArtifactsByProjectVersionAttribute( RepositorySession session, String key, String value, String repositoryId )
         throws MetadataRepositoryException
     {
         throw new UnsupportedOperationException();
@@ -155,15 +153,15 @@ public abstract class AbstractMetadataRepository
     }
 
     @Override
-    public void removeArtifact( RepositorySession session, ArtifactMetadata artifactMetadata, String baseVersion )
+    public void removeTimestampedArtifact( RepositorySession session, ArtifactMetadata artifactMetadata, String baseVersion )
         throws MetadataRepositoryException
     {
         throw new UnsupportedOperationException();
     }
 
     @Override
-    public void removeArtifact( RepositorySession session, String repositoryId, String namespace, String project, String version,
-                                MetadataFacet metadataFacet )
+    public void removeFacetFromArtifact( RepositorySession session, String repositoryId, String namespace, String project, String version,
+                                         MetadataFacet metadataFacet )
         throws MetadataRepositoryException
     {
         throw new UnsupportedOperationException();
@@ -229,7 +227,7 @@ public abstract class AbstractMetadataRepository
     }
 
     @Override
-    public Collection<String> getNamespaces( RepositorySession session, String repoId, String namespace )
+    public Collection<String> getChildNamespaces( RepositorySession session, String repoId, String namespace )
         throws MetadataResolutionException
     {
         throw new UnsupportedOperationException();
@@ -318,19 +316,6 @@ public abstract class AbstractMetadataRepository
     }
 
     @Override
-    public boolean canObtainAccess( Class<?> aClass )
-    {
-        throw new UnsupportedOperationException();
-    }
-
-    @Override
-    public <T> T obtainAccess( RepositorySession session, Class<T> aClass )
-        throws MetadataRepositoryException
-    {
-        throw new UnsupportedOperationException();
-    }
-
-    @Override
     public List<ArtifactMetadata> searchArtifacts( RepositorySession session, String repositoryId, String text, boolean exact )
         throws MetadataRepositoryException
     {
diff --git a/archiva-modules/metadata/metadata-repository-api/src/main/java/org/apache/archiva/metadata/repository/DefaultMetadataResolver.java b/archiva-modules/metadata/metadata-repository-api/src/main/java/org/apache/archiva/metadata/repository/DefaultMetadataResolver.java
index ba8e0fc..a86696e 100644
--- a/archiva-modules/metadata/metadata-repository-api/src/main/java/org/apache/archiva/metadata/repository/DefaultMetadataResolver.java
+++ b/archiva-modules/metadata/metadata-repository-api/src/main/java/org/apache/archiva/metadata/repository/DefaultMetadataResolver.java
@@ -249,7 +249,7 @@ public class DefaultMetadataResolver
             Collection<String> namespaces = namespacesCache.get( cacheKey );
             if ( namespaces == null )
             {
-                namespaces = metadataRepository.getNamespaces( session, repoId, namespace );
+                namespaces = metadataRepository.getChildNamespaces( session, repoId, namespace );
                 namespacesCache.put( cacheKey, namespaces );
             }
             Collection<String> exclusions = new ArrayList<>( namespaces );
@@ -302,7 +302,7 @@ public class DefaultMetadataResolver
             Collection<String> namespaces = namespacesCache.get( cacheKey );
             if ( namespaces == null )
             {
-                namespaces = metadataRepository.getNamespaces( session, repoId, namespace );
+                namespaces = metadataRepository.getChildNamespaces( session, repoId, namespace );
                 namespacesCache.put( cacheKey, namespaces );
             }
 
diff --git a/archiva-modules/metadata/metadata-repository-api/src/main/java/org/apache/archiva/metadata/repository/MetadataRepository.java b/archiva-modules/metadata/metadata-repository-api/src/main/java/org/apache/archiva/metadata/repository/MetadataRepository.java
index bf3d8ba..321ed2e 100644
--- a/archiva-modules/metadata/metadata-repository-api/src/main/java/org/apache/archiva/metadata/repository/MetadataRepository.java
+++ b/archiva-modules/metadata/metadata-repository-api/src/main/java/org/apache/archiva/metadata/repository/MetadataRepository.java
@@ -37,35 +37,35 @@ import java.util.stream.Stream;
  * A Metadata repository provides information about artifact metadata. It does not provide the artifact data itself.
  * It may be possible to use the same backend for metadata and storage, but this depends on the backends and they are
  * provided by different APIs.
- *
+ * <p>
  * The motivation for this API is to provide fast access to the repository metadata and fulltext search. Also dependencies
  * are stored in this repository.
- *
+ * <p>
  * The methods here do not update the artifacts itself. They are only updating the data in the metadata repository.
  * That means, if you want to update some artifact, you should make sure to update the artifact itself and the metadata
  * repository (either directly or by repository scanning).
- *
+ * <p>
  * Currently we are providing JCR, File based and Cassandra as backend for the metadata.
- *
+ * <p>
  * The metadata repository uses sessions for accessing the data. Please make sure to always close the sessions after using it.
  * Best idiom for using the sessions:
  * <code>
  * try(RepositorySession session = sessionFactory.createSession() {
- *     // do your stuff
+ * // do your stuff
  * }
  * </code>
- *
+ * <p>
  * It is implementation dependent, if the sessions are really used by the backend. E.g. the file based implementation ignores
  * the sessions completely.
- *
+ * <p>
  * Sessions should be closed immediately after usage. If it is expensive to open a session for a given backend. The backend
  * should provide a session pool if possible. There are methods for refreshing a session if needed.
- *
- * You should avoid stacking sessions, that means, do not create a new session in the same thread, when a session is opened already.
- *
+ * <p>
+ * You should avoid stacking sessions, which means, you should not create a new session in the same thread, when a session is opened already.
+ * <p>
  * Some backend implementations (JCR) update the metadata in the background, that means update of the metadata is not reflected
  * immediately.
- *
+ * <p>
  * The base metadata coordinates are:
  * <ul>
  *     <li>Repository ID: The identifier of the repository, where the artifact resides</li>
@@ -74,10 +74,10 @@ import java.util.stream.Stream;
  *     <li>Version: Each project may have different versions.</li>
  *     <li>Artifact: Artifacts correspond to files / blob data. Each artifact has additional metadata, like name, version, modification time, ...</li>
  * </ul>
- *
+ * <p>
  * As the repository connects to some backend either locally or remote, the access to the repository may fail. The methods capsule the
  * backend errors into <code>{@link MetadataRepositoryException}</code>.
- *
+ * <p>
  * Facets are the way to provide additional metadata that is not part of the base API. It depends on the repository type (e.g. Maven, NPM,
  * not the metadata backend) what facets are stored in addition to the standard metadata.
  * Facets have a specific facet ID that represents the schema for the data stored. For creating specific objects for a given
@@ -86,154 +86,150 @@ import java.util.stream.Stream;
  * a hierarchical path.
  * The data in each facet instance is stored in properties (key-value pairs). The properties are converted into / from the specific
  * facet object.
- *
+ * <p>
  * Facets can be stored on repository, project, version and artifact level.
- *
+ * <p>
  * For retrieving artifacts there are methods that return lists and streaming based methods. Some implementations (e.g. JCR) use
  * lazy loading for the retrieved objects. So the streaming methods may be faster and use less memory than the list based methods.
  * But for some backends there is no difference.
- *
  */
+@SuppressWarnings( "NullableProblems" )
 @ParametersAreNonnullByDefault
 public interface MetadataRepository
 {
 
 
-
     /**
      * Update metadata for a particular project in the metadata repository, or create it, if it does not already exist.
      *
-     * @param session The session used for updating.
+     * @param session      The session used for updating.
      * @param repositoryId the repository the project is in
      * @param project      the project metadata to create or update
      * @throws MetadataRepositoryException if the update fails
      */
-    void updateProject(  RepositorySession session,  String repositoryId,  ProjectMetadata project )
+    void updateProject( RepositorySession session, String repositoryId, ProjectMetadata project )
         throws MetadataRepositoryException;
 
     /**
      * Update the metadata of a given artifact. If the artifact, namespace, version, project does not exist in the repository it will be created.
      *
-     * @param session The repository session
-     * @param repositoryId The repository id
-     * @param namespace The namespace ('.' separated)
-     * @param projectId The project id
+     * @param session        The repository session
+     * @param repositoryId   The repository id
+     * @param namespace      The namespace ('.' separated)
+     * @param projectId      The project id
      * @param projectVersion The project version
-     * @param artifactMeta Information about the artifact itself.
+     * @param artifactMeta   Information about the artifact itself.
      * @throws MetadataRepositoryException if something goes wrong during update.
      */
-    void updateArtifact(  RepositorySession session,  String repositoryId,
-                          String namespace,  String projectId,  String projectVersion,
-                          ArtifactMetadata artifactMeta )
+    void updateArtifact( RepositorySession session, String repositoryId,
+                         String namespace, String projectId, String projectVersion,
+                         ArtifactMetadata artifactMeta )
         throws MetadataRepositoryException;
 
     /**
      * Updates the metadata for a specific version of a given project. If the namespace, project, version does not exist,
      * it will be created.
      *
-     * @param session The repository session
-     * @param repositoryId The repository id
-     * @param namespace The namespace ('.' separated)
-     * @param projectId The project id
+     * @param session         The repository session
+     * @param repositoryId    The repository id
+     * @param namespace       The namespace ('.' separated)
+     * @param projectId       The project id
      * @param versionMetadata The metadata for the version
      * @throws MetadataRepositoryException if something goes wrong during update
      */
-    void updateProjectVersion(  RepositorySession session,  String repositoryId,
-                                String namespace,  String projectId,
-                                ProjectVersionMetadata versionMetadata )
+    void updateProjectVersion( RepositorySession session, String repositoryId,
+                               String namespace, String projectId,
+                               ProjectVersionMetadata versionMetadata )
         throws MetadataRepositoryException;
 
     /**
      * Create the namespace in the repository, if it does not exist.
      * Namespaces do not have specific metadata attached.
      *
-     * @param session The repository session
+     * @param session      The repository session
      * @param repositoryId The repository id
-     * @param namespace The namespace ('.' separated)
+     * @param namespace    The namespace ('.' separated)
      * @throws MetadataRepositoryException if something goes wrong during update
      */
-    void updateNamespace(  RepositorySession session,  String repositoryId,  String namespace )
+    void updateNamespace( RepositorySession session, String repositoryId, String namespace )
         throws MetadataRepositoryException;
 
     /**
      * Return the facet names stored for the given facet id on the repository level.
      *
-     * @param session The repository session
+     * @param session      The repository session
      * @param repositoryId The repository id
-     * @param facetId The facet id
+     * @param facetId      The facet id
      * @return The list of facet names, or an empty list, if there are no facets stored on this repository for the given facet id.
      * @throws MetadataRepositoryException if something goes wrong
      */
-    List<String> getMetadataFacets(  RepositorySession session,  String repositoryId,  String facetId )
+    List<String> getMetadataFacets( RepositorySession session, String repositoryId, String facetId )
         throws MetadataRepositoryException;
 
 
     /**
-     *
-     * The same as
-     * @see #getMetadataFacetStream(RepositorySession, String, Class, QueryParameter queryParameter)
+     * The same as {@link #getMetadataFacetStream(RepositorySession, String, Class, QueryParameter)}
      * but uses default query parameters.
-     *
+     * <p>
      * There is no limitation of the number of result objects returned, but implementations may have a hard upper bound for
      * the number of results.
      *
-     * @param session
-     * @param repositoryId
-     * @param facetClazz
-     * @param <T>
-     * @return
-     * @throws MetadataRepositoryException
+     * @param session      The repository session.
+     * @param repositoryId The repository id.
+     * @param facetClazz   The facet class
+     * @param <T>          The facet type
+     * @return A stream of facet objects, or a empty stream if no facet was found.
+     * @throws MetadataRepositoryException if the facet retrieval fails.
      * @since 3.0
      */
-    <T extends MetadataFacet> Stream<T> getMetadataFacetStream(  RepositorySession session,
-                                                                 String repositoryId,  Class<T> facetClazz)
+    <T extends MetadataFacet> Stream<T> getMetadataFacetStream( RepositorySession session,
+                                                                String repositoryId, Class<T> facetClazz )
         throws MetadataRepositoryException;
 
     /**
      * Returns a stream of MetadataFacet elements that match the given facet class.
      * Implementations should order the resulting stream by facet name.
      *
-     *
-     * @param session The repository session
+     * @param session      The repository session
      * @param repositoryId The repository id
-     * @param facetClazz The class of the facet
-     * @param <T> The facet type
-     * @return
-     * @throws MetadataRepositoryException
+     * @param facetClazz   The class of the facet
+     * @param <T>          The facet type
+     * @return A stream of facet objects, or a empty stream if no facet was found.
+     * @throws MetadataRepositoryException if the facet retrieval fails
      * @since 3.0
      */
     <T extends MetadataFacet> Stream<T> getMetadataFacetStream( RepositorySession session,
-                                                                 String repositoryId,   Class<T> facetClazz,
-                                                                 QueryParameter queryParameter)
+                                                                String repositoryId, Class<T> facetClazz,
+                                                                QueryParameter queryParameter )
         throws MetadataRepositoryException;
 
     /**
      * Returns true, if there is facet data stored for the given facet id on the repository on repository level. The facet data itself
      * may be empty. It's just checking if there is an object stored for the given facet id.
      *
-     * @param session The repository session
+     * @param session      The repository session
      * @param repositoryId The repository id
-     * @param facetId The facet id
+     * @param facetId      The facet id
      * @return true if there is data stored this facetId on repository level.
      * @throws MetadataRepositoryException if something goes wrong
      * @since 1.4-M4
      */
-    boolean hasMetadataFacet(  RepositorySession session,  String repositoryId,  String facetId )
+    boolean hasMetadataFacet( RepositorySession session, String repositoryId, String facetId )
         throws MetadataRepositoryException;
 
     /**
      * Returns the facet data stored on the repository level. The facet instance is identified by the facet id and the
      * facet name. The returned object is a instance created by using <code>{@link org.apache.archiva.metadata.model.MetadataFacetFactory}</code>.
      *
-     * @param session The repository session
+     * @param session      The repository session
      * @param repositoryId The repository id
-     * @param facetId The facet id
-     * @param name The attribute name
+     * @param facetId      The facet id
+     * @param name         The attribute name
      * @return The facet values
      * @throws MetadataRepositoryException if something goes wrong.
      */
-    MetadataFacet getMetadataFacet(  RepositorySession session,  String repositoryId,  String facetId,
-                                     String name )
+    MetadataFacet getMetadataFacet( RepositorySession session, String repositoryId, String facetId,
+                                    String name )
         throws MetadataRepositoryException;
 
     /**
@@ -241,231 +237,248 @@ public interface MetadataRepository
      * If the given name does not point to a instance that can be represented by this class, <code>null</code> will be returned.
      * If the facet is not found the method returns <code>null</code>.
      *
-     * @param session The repository session
+     * @param session      The repository session
      * @param repositoryId The id of the repository
-     * @param clazz The facet object class
-     * @param name The name of the facet (name or path)
-     * @param <T> The type of the facet object
+     * @param clazz        The facet object class
+     * @param name         The name of the facet (name or path)
+     * @param <T>          The type of the facet object
      * @return The facet instance, if it exists.
      * @throws MetadataRepositoryException if the data cannot be retrieved from the backend
      * @since 3.0
      */
-    <T extends MetadataFacet> T getMetadataFacet( RepositorySession session,  String repositoryId,
-                                                  Class<T> clazz,  String name)
-    throws MetadataRepositoryException;
+    <T extends MetadataFacet> T getMetadataFacet( RepositorySession session, String repositoryId,
+                                                  Class<T> clazz, String name )
+        throws MetadataRepositoryException;
 
     /**
      * Adds a facet to the repository level.
      *
-     * @param session The repository session
-     * @param repositoryId The id of the repository
+     * @param session       The repository session
+     * @param repositoryId  The id of the repository
      * @param metadataFacet The facet to add
      * @throws MetadataRepositoryException if the facet cannot be stored.
      */
-    void addMetadataFacet(  RepositorySession session,  String repositoryId,
-                            MetadataFacet metadataFacet )
+    void addMetadataFacet( RepositorySession session, String repositoryId,
+                           MetadataFacet metadataFacet )
         throws MetadataRepositoryException;
 
     /**
      * Removes all facets with the given facetId from the repository level.
      *
-     * @param session The repository session
+     * @param session      The repository session
      * @param repositoryId The id of the repository
-     * @param facetId The facet id
+     * @param facetId      The facet id
      * @throws MetadataRepositoryException if the removal fails
      */
-    void removeMetadataFacets(  RepositorySession session,  String repositoryId,  String facetId )
+    void removeMetadataFacets( RepositorySession session, String repositoryId, String facetId )
         throws MetadataRepositoryException;
 
     /**
      * Removes the given facet from the repository level, if it exists.
      *
-     * @param session The repository session
+     * @param session      The repository session
      * @param repositoryId The id of the repository
-     * @param facetId The facet id
-     * @param name The facet name or path
+     * @param facetId      The facet id
+     * @param name         The facet name or path
      */
-    void removeMetadataFacet(  RepositorySession session,  String repositoryId,  String facetId,  String name )
+    void removeMetadataFacet( RepositorySession session, String repositoryId, String facetId, String name )
         throws MetadataRepositoryException;
 
 
     /**
      * Is the same as {@link #getArtifactsByDateRange(RepositorySession, String, ZonedDateTime, ZonedDateTime, QueryParameter)}, but
      * uses default query parameters.
-     *
      */
-    List<ArtifactMetadata> getArtifactsByDateRange(  RepositorySession session,  String repositoryId,
+    List<ArtifactMetadata> getArtifactsByDateRange( RepositorySession session, String repositoryId,
                                                     @Nullable ZonedDateTime startTime, @Nullable ZonedDateTime endTime )
         throws MetadataRepositoryException;
 
     /**
-     *
      * Searches for artifacts where the 'whenGathered' attribute value is between the given start and end time.
      * If start or end time or both are <code>null</code>, the time range for the search is unbounded for this parameter.
      *
-     *
-     * @param session The repository session
-     * @param repositoryId The repository id
-     * @param startTime    The start time/date as zoned date, can be <code>null</code>
-     * @param endTime      The end time/date as zoned date, can be <code>null</code>
+     * @param session        The repository session
+     * @param repositoryId   The repository id
+     * @param startTime      The start time/date as zoned date, can be <code>null</code>
+     * @param endTime        The end time/date as zoned date, can be <code>null</code>
      * @param queryParameter Additional parameters for the query that affect ordering and returned results
      * @return The list of metadata objects for the found instances.
      * @throws MetadataRepositoryException if the query fails.
      * @since 3.0
      */
-    List<ArtifactMetadata> getArtifactsByDateRange( RepositorySession session,  String repositoryId,
-                                                   @Nullable ZonedDateTime startTime, @Nullable ZonedDateTime endTime,
+    List<ArtifactMetadata> getArtifactsByDateRange( RepositorySession session, String repositoryId,
+                                                    @Nullable ZonedDateTime startTime, @Nullable ZonedDateTime endTime,
                                                     QueryParameter queryParameter )
-            throws MetadataRepositoryException;
+        throws MetadataRepositoryException;
 
 
     /**
      * Returns all the artifacts who's 'whenGathered' attribute value is inside the given time range (inclusive) as stream of objects.
-     *
+     * <p>
      * Implementations should return a stream of sorted objects. The objects should be sorted by the 'whenGathered' date in ascending order.
      *
-     * @param session The repository session
+     * @param session      The repository session
      * @param repositoryId The repository id
-     * @param startTime The start time, can be <code>null</code>
-     * @param endTime The end time, can be <code>null</code>
-     * @return A stream of artifact metadata objects.
-     * @throws MetadataRepositoryException
+     * @param startTime    The start time, can be <code>null</code>
+     * @param endTime      The end time, can be <code>null</code>
+     * @return A stream of artifact metadata objects, or a empty stream if no artifact was found.
+     * @throws MetadataRepositoryException if the artifact retrieval fails.
      * @since 3.0
      */
-    Stream<ArtifactMetadata> getArtifactByDateRangeStream(  RepositorySession session,  String repositoryId,
+    Stream<ArtifactMetadata> getArtifactByDateRangeStream( RepositorySession session, String repositoryId,
                                                            @Nullable ZonedDateTime startTime, @Nullable ZonedDateTime endTime )
         throws MetadataRepositoryException;
 
     /**
      * Returns all the artifacts who's 'whenGathered' attribute value is inside the given time range (inclusive) as stream of objects.
-     *
+     * <p>
      * If no sort attributes are given by the queryParameter, the result is sorted by the 'whenGathered' date.
      *
-     * @param session The repository session
-     * @param repositoryId The repository id
-     * @param startTime The start time, can be <code>null</code>
-     * @param endTime The end time, can be <code>null</code>
+     * @param session        The repository session
+     * @param repositoryId   The repository id
+     * @param startTime      The start time, can be <code>null</code>
+     * @param endTime        The end time, can be <code>null</code>
      * @param queryParameter Additional parameters for the query that affect ordering and number of returned results.
      * @return A stream of artifact metadata objects.
-     * @throws MetadataRepositoryException
+     * @throws MetadataRepositoryException if the artifact retrieval fails.
      * @since 3.0
      */
-    Stream<ArtifactMetadata> getArtifactByDateRangeStream(  RepositorySession session,  String repositoryId,
+    Stream<ArtifactMetadata> getArtifactByDateRangeStream( RepositorySession session, String repositoryId,
                                                            @Nullable ZonedDateTime startTime, @Nullable ZonedDateTime endTime,
-                                                            QueryParameter queryParameter)
+                                                           QueryParameter queryParameter )
         throws MetadataRepositoryException;
 
 
     /**
      * Returns the artifacts that match the given checksum. All checksum types are searched.
      *
-     * @param session The repository session
-     * @param repositoryId  The repository id
-     * @param checksum The checksum as string of numbers
+     * @param session      The repository session
+     * @param repositoryId The repository id
+     * @param checksum     The checksum as string of numbers
      * @return The list of artifacts that match the given checksum.
-     * @throws MetadataRepositoryException
+     * @throws MetadataRepositoryException if the artifact retrieval fails
      */
-    List<ArtifactMetadata> getArtifactsByChecksum( RepositorySession session,  String repositoryId,  String checksum )
+    List<ArtifactMetadata> getArtifactsByChecksum( RepositorySession session, String repositoryId, String checksum )
         throws MetadataRepositoryException;
 
     /**
      * Get artifacts with a project version metadata key that matches the passed value.
-     *  
      *
-     * @param session
-     * @param key
-     * @param value
-     * @param repositoryId can be null, meaning search in all repositories
-     * @return a list of artifacts
-     * @throws MetadataRepositoryException
+     * @param session      The repository session
+     * @param key          The attribute key to search
+     * @param value        The attribute value used for search
+     * @param repositoryId can be <code>null</code>, meaning search in all repositories
+     * @return a list of artifacts. A empty list, if no artifact was found.
+     * @throws MetadataRepositoryException if the artifact retrieval fails.
      */
-    List<ArtifactMetadata> getArtifactsByProjectVersionMetadata(  RepositorySession session,  String key,  String value,
-                                                                 @Nullable String repositoryId )
+    List<ArtifactMetadata> getArtifactsByProjectVersionFacet( RepositorySession session, String key, String value,
+                                                              @Nullable String repositoryId )
         throws MetadataRepositoryException;
 
     /**
      * Get artifacts with an artifact metadata key that matches the passed value.
-     *  
+     * <code>key</code> ist the string representation of one of the metadata attributes. Only artifacts are returned where
+     * the attribute value matches exactly the given search value.
      *
-     * @param session
-     * @param key
-     * @param value
-     * @param repositoryId can be null, meaning search in all repositories
-     * @return a list of artifacts
-     * @throws MetadataRepositoryException
+     * @param session      The repository session.
+     * @param key          The string representation of the artifact metadata attribute.
+     * @param value        The search value.
+     * @param repositoryId can be <code>null</code>, meaning search in all repositories
+     * @return a list of artifact objects for each artifact that matches the search string
+     * @throws MetadataRepositoryException if the artifact retrieval fails.
      */
-    List<ArtifactMetadata> getArtifactsByMetadata( RepositorySession session, String key, String value, String repositoryId )
+    List<ArtifactMetadata> getArtifactsByAttribute( RepositorySession session, String key, String value, @Nullable String repositoryId )
         throws MetadataRepositoryException;
 
     /**
-     * Get artifacts with a property key that matches the passed value.
+     * Get artifacts with a attribute on project version level that matches the passed value.
      * Possible keys are 'scm.url', 'org.name', 'url', 'mailingList.0.name', 'license.0.name',...
-     *  
      *
-     * @param session
-     * @param key
-     * @param value
-     * @param repositoryId can be null, meaning search in all repositories
-     * @return a list of artifacts
-     * @throws MetadataRepositoryException
+     * @param session      the repository session.
+     * @param key          The name of the attribute (may be nested like scm.url, mailinglist.0.name)
+     * @param value        The value to search for
+     * @param repositoryId can be <code>null</code>, which means to search in all repositories
+     * @return a list of artifacts or a empty list, if no artifact was found
+     * @throws MetadataRepositoryException if the artifact retrieval fails
      */
-    List<ArtifactMetadata> getArtifactsByProperty( RepositorySession session, String key, String value, String repositoryId )
+    List<ArtifactMetadata> getArtifactsByProjectVersionAttribute( RepositorySession session, String key, String value, @Nullable String repositoryId )
         throws MetadataRepositoryException;
 
+    /**
+     * Removes the data for the artifact with the given coordinates from the metadata repository. This will not remove the artifact itself
+     * from the storage. It will only remove the metadata.
+     *
+     * @param session      The repository session
+     * @param repositoryId The repository id
+     * @param namespace    The namespace of the project
+     * @param project      The project name
+     * @param version      The project version
+     * @param id           The artifact id
+     * @throws MetadataRepositoryException if the artifact retrieval fails, or if the artifact cannot be found.
+     */
     void removeArtifact( RepositorySession session, String repositoryId, String namespace, String project, String version, String id )
         throws MetadataRepositoryException;
 
     /**
-     * used for deleting timestamped version of SNAPSHOT artifacts
-     *
+     * Remove timestamped version of artifact. This removes a snapshot artifact by giving the artifact metadata
+     * and the base version of the project.
      *
-     * @param session
+     * @param session          The repository session
      * @param artifactMetadata the artifactMetadata with the timestamped version (2.0-20120618.214135-2)
      * @param baseVersion      the base version of the snapshot (2.0-SNAPSHOT)
-     * @throws MetadataRepositoryException
+     * @throws MetadataRepositoryException if the removal fails.
      * @since 1.4-M3
      */
-    void removeArtifact( RepositorySession session, ArtifactMetadata artifactMetadata, String baseVersion )
+    void removeTimestampedArtifact( RepositorySession session, ArtifactMetadata artifactMetadata, String baseVersion )
         throws MetadataRepositoryException;
 
     /**
      * FIXME need a unit test!!!
-     * Only remove {@link MetadataFacet} for the artifact
-     *
-     *
-     * @param session
-     * @param repositoryId
-     * @param namespace
-     * @param project
-     * @param version
-     * @param metadataFacet
-     * @throws MetadataRepositoryException
+     * Removes the {@link MetadataFacet} of the given artifact.
+     *
+     * @param session       The repository session
+     * @param repositoryId  The repository id.
+     * @param namespace     The namespace
+     * @param project       The project name
+     * @param version       The project version
+     * @param metadataFacet The facet data
+     * @throws MetadataRepositoryException if the removal failed
      * @since 1.4-M3
      */
-    void removeArtifact( RepositorySession session, String repositoryId, String namespace, String project, String version,
-                         MetadataFacet metadataFacet )
+    void removeFacetFromArtifact( RepositorySession session, String repositoryId, String namespace, String project, String version,
+                                  MetadataFacet metadataFacet )
         throws MetadataRepositoryException;
 
     /**
-     * Delete a repository's metadata. This includes all associated metadata facets.
+     * Deletes all metadata of the given repository. This includes artifact metadata and all associated metadata facets.
      *
-     * @param session
+     * @param session      The repository session
      * @param repositoryId the repository to delete
+     * @throws MetadataRepositoryException if the removal failed
      */
     void removeRepository( RepositorySession session, String repositoryId )
         throws MetadataRepositoryException;
 
     /**
+     * Removes the given namespace and its contents from the metadata repository.
      *
-     * @param session
-     * @param repositoryId
-     * @param namespace    (groupId for maven )
-     * @throws MetadataRepositoryException
+     * @param session      The repository session
+     * @param repositoryId The repository id
+     * @param namespace    The namespace '.' separated  ( it's the groupId for maven )
+     * @throws MetadataRepositoryException if the removal failed
      * @since 1.4-M3
      */
     void removeNamespace( RepositorySession session, String repositoryId, String namespace )
         throws MetadataRepositoryException;
 
+    /**
+     * Returns the metadata for all artifacts of the given repository.
+     *
+     * @param session      The repository session
+     * @param repositoryId The repository id
+     * @return a list of artifact metadata objects. A empty list if no artifacts where found.
+     * @throws MetadataRepositoryException if the retrieval failed.
+     */
     List<ArtifactMetadata> getArtifacts( RepositorySession session, String repositoryId )
         throws MetadataRepositoryException;
 
@@ -477,12 +490,12 @@ public interface MetadataRepository
      * If there are no <code>sortFields</code> defined in the query parameter, the order of elements in the stream is undefined and depends
      * on the implementation.
      *
-     * @param session
-     * @param repositoryId
+     * @param session      The repository session.
+     * @param repositoryId The repository id.
      * @return A stream of artifact metadata objects for each artifact found in the repository.
      * @since 3.0
      */
-    Stream<ArtifactMetadata> getArtifactStream(  RepositorySession session,  String repositoryId,  QueryParameter queryParameter )
+    Stream<ArtifactMetadata> getArtifactStream( RepositorySession session, String repositoryId, QueryParameter queryParameter )
         throws MetadataResolutionException;
 
     /**
@@ -490,68 +503,92 @@ public interface MetadataRepository
      * The order of the artifacts returned in the stream depends on the implementation.
      * The number of elements in the stream is unlimited, but there may be some implementations that have to put a hard
      * limit on the elements returned.
-     * For further information see {@link #getArtifactStream(RepositorySession, String, QueryParameter)} 
+     * For further information see {@link #getArtifactStream(RepositorySession, String, QueryParameter)}
      *
-     * @param session The repository session
+     * @param session      The repository session
      * @param repositoryId The repository id
      * @return A (unlimited) stream of artifact metadata elements that are found in this repository
-     * @since 3.0
      * @see #getArtifactStream(RepositorySession, String, QueryParameter)
+     * @since 3.0
      */
-    Stream<ArtifactMetadata> getArtifactStream(  RepositorySession session,  String repositoryId)
+    Stream<ArtifactMetadata> getArtifactStream( RepositorySession session, String repositoryId )
         throws MetadataResolutionException;
 
     /**
      * Returns a stream of artifacts found for the given artifact coordinates and using the <code>queryParameter</code>
      *
-     * @param session The repository session. May not be <code>null</code>.
-     * @param repoId The repository id. May not be <code>null</code>.
-     * @param namespace The namespace. May not be <code>null</code>.
-     * @param projectId The project id. May not be <code>null</code>.
+     * @param session        The repository session. May not be <code>null</code>.
+     * @param repoId         The repository id. May not be <code>null</code>.
+     * @param namespace      The namespace. May not be <code>null</code>.
+     * @param projectId      The project id. May not be <code>null</code>.
      * @param projectVersion The project version. May not be <code>null</code>.
      * @return A stream of artifact metadata object. Order and number of elements returned, depends on the <code>queryParameter</code>.
-     * @since 3.0
      * @throws MetadataResolutionException if there are no elements for the given artifact coordinates.
+     * @since 3.0
      */
-    Stream<ArtifactMetadata> getArtifactStream(  RepositorySession session,  String repoId,
-                                                 String namespace,  String projectId,
-                                                 String projectVersion,  QueryParameter queryParameter )
+    Stream<ArtifactMetadata> getArtifactStream( RepositorySession session, String repoId,
+                                                String namespace, String projectId,
+                                                String projectVersion, QueryParameter queryParameter )
         throws MetadataResolutionException;
 
     /**
      * Returns a stream of artifacts found for the given artifact coordinates. The order of elements returned, depends on the
      * implementation.
      *
-     * @param session The repository session. May not be <code>null</code>.
-     * @param repoId The repository id. May not be <code>null</code>.
-     * @param namespace The namespace. May not be <code>null</code>.
-     * @param projectId The project id. May not be <code>null</code>.
+     * @param session        The repository session. May not be <code>null</code>.
+     * @param repoId         The repository id. May not be <code>null</code>.
+     * @param namespace      The namespace. May not be <code>null</code>.
+     * @param projectId      The project id. May not be <code>null</code>.
      * @param projectVersion The project version. May not be <code>null</code>.
      * @return A stream of artifact metadata object. Order and number of elements returned, depends on the <code>queryParameter</code>.
-     * @since 3.0
      * @throws MetadataResolutionException if there are no elements for the given artifact coordinates.
+     * @since 3.0
      */
-    Stream<ArtifactMetadata> getArtifactStream(  RepositorySession session,  String repoId,
-                                                 String namespace,  String projectId,
-                                            String projectVersion)
+    Stream<ArtifactMetadata> getArtifactStream( RepositorySession session, String repoId,
+                                                String namespace, String projectId,
+                                                String projectVersion )
         throws MetadataResolutionException;
+
     /**
-     * basically just checking it exists not complete data returned
+     * Returns the metadata for the given project. If there are no custom properties stored on the project, it will
+     * just return a <code>ProjectMetadata</code> object with the data provided by parameters.
      *
-     *
-     * @param session
-     * @param repoId
-     * @param namespace
-     * @param projectId
-     * @return
-     * @throws MetadataResolutionException
+     * @param session   The session id
+     * @param repoId    The repository id
+     * @param namespace The namespace '.'-separated.
+     * @param projectId The project name
+     * @return The project metadata or <code>null</code> if not found.
+     * @throws MetadataResolutionException if the metadata retrieval failed
      */
     ProjectMetadata getProject( RepositorySession session, String repoId, String namespace, String projectId )
         throws MetadataResolutionException;
 
+    /**
+     * Returns the metadata for the project version.
+     *
+     * @param session        The repository session.
+     * @param repoId         The repository id.
+     * @param namespace      The namespace '.'-separated
+     * @param projectId      The project name
+     * @param projectVersion The project version
+     * @return The version metadata object, or <code>null</code>, if not found.
+     * @throws MetadataResolutionException if the retrieval of the metadata failed.
+     */
     ProjectVersionMetadata getProjectVersion( RepositorySession session, String repoId, String namespace, String projectId, String projectVersion )
         throws MetadataResolutionException;
 
+    /**
+     * Returns all artifact version strings for a given project version. This is for snapshot versions and returns the timestamped
+     * versions, if available.
+     *
+     * @param session        The repository session.
+     * @param repoId         The repository id.
+     * @param namespace      The namespace '.'-separated
+     * @param projectId      The project name.
+     * @param projectVersion The project version.
+     * @return A list of version strings, or a empty list if no versions are found, or this is not a snapshot version.
+     * @throws MetadataResolutionException if the retrieval of the metadata failed.
+     */
     Collection<String> getArtifactVersions( RepositorySession session, String repoId, String namespace, String projectId, String projectVersion )
         throws MetadataResolutionException;
 
@@ -560,131 +597,145 @@ public interface MetadataRepository
      * a project version as a reference may be present (due to reverse-lookup of dependencies) before the actual
      * project is, and we want to avoid adding a stub model to the content repository.
      *
-     *
-     * @param session
-     * @param repoId         the repository ID to look within
-     * @param namespace      the namespace of the project to get references to
-     * @param projectId      the identifier of the project to get references to
-     * @param projectVersion the version of the project to get references to
+     * @param session        The repository session.
+     * @param repoId         The repository ID to look within
+     * @param namespace      The namespace of the project to get references to
+     * @param projectId      The identifier of the project to get references to
+     * @param projectVersion The version of the project to get references to
      * @return a list of project references
+     * @throws MetadataResolutionException if the version could not be found.
      */
     Collection<ProjectVersionReference> getProjectReferences( RepositorySession session, String repoId, String namespace, String projectId,
                                                               String projectVersion )
         throws MetadataResolutionException;
 
+    /**
+     * Returns the names of the root namespaces stored for this repository.
+     *
+     * @param session The repository session.
+     * @param repoId  The repository id.
+     * @return A list of namespace names, or empty list, if no namespace is stored for this repository.
+     * @throws MetadataResolutionException If the retrieval failed.
+     */
     Collection<String> getRootNamespaces( RepositorySession session, String repoId )
         throws MetadataResolutionException;
 
     /**
+     * Returns the list of namespace names that are children of the given namespace. It does not descend recursively.
      *
-     * @param session
-     * @param repoId
-     * @param namespace
-     * @return {@link Collection} of child namespaces of the namespace argument
-     * @throws MetadataResolutionException
+     * @param session   The repository session.
+     * @param repoId    The repository id.
+     * @param namespace The parent namespace '.'-separated.
+     * @return {@link Collection} of child namespace names, or a empty list, if there are no children for the given parent namespace.
+     * @throws MetadataResolutionException if the retrieval failed.
      */
-    Collection<String> getNamespaces( RepositorySession session, String repoId, String namespace )
+    Collection<String> getChildNamespaces( RepositorySession session, String repoId, String namespace )
         throws MetadataResolutionException;
 
     /**
+     * Return the project names that of all projects stored under the given namespace.
      *
-     * @param session
-     * @param repoId
-     * @param namespace
-     * @return
-     * @throws MetadataResolutionException
+     * @param session   The repository session.
+     * @param repoId    The repository id.
+     * @param namespace The namespace '.'-separated.
+     * @return The list of project names or empty list if no project exists at the given namespace.
+     * @throws MetadataResolutionException if the retrieval failed.
      */
     Collection<String> getProjects( RepositorySession session, String repoId, String namespace )
         throws MetadataResolutionException;
 
     /**
+     * Returns the names of all versions stored under the given project.
      *
-     * @param session
-     * @param repoId
-     * @param namespace
-     * @param projectId
-     * @return
-     * @throws MetadataResolutionException
+     * @param session   The repository session.
+     * @param repoId    The repository id.
+     * @param namespace The namespace '.'-separated.
+     * @param projectId The project name.
+     * @return The list of versions or a empty list, if not version was found.
+     * @throws MetadataResolutionException if the retrieval failed.
      */
     Collection<String> getProjectVersions( RepositorySession session, String repoId, String namespace, String projectId )
         throws MetadataResolutionException;
 
     /**
+     * Removes a project version and all its artifact and facet metadata under it.
      *
-     * @param session
-     * @param repoId
-     * @param namespace
-     * @param projectId
-     * @param projectVersion
-     * @throws MetadataRepositoryException
+     * @param session        The repository session.
+     * @param repoId         The repository id.
+     * @param namespace      The namespace '.'-separated.
+     * @param projectId      The project name
+     * @param projectVersion The project version.
+     * @throws MetadataRepositoryException if the removal failed.
      * @since 1.4-M4
      */
     void removeProjectVersion( RepositorySession session, String repoId, String namespace, String projectId, String projectVersion )
         throws MetadataRepositoryException;
 
     /**
+     * Returns the metadata of all artifacts stored for the given project version.
      *
-     * @param session
-     * @param repoId
-     * @param namespace
-     * @param projectId
-     * @param projectVersion
-     * @return
-     * @throws MetadataResolutionException
+     * @param session        The repository session.
+     * @param repoId         The repository id.
+     * @param namespace      The namespace '.'-separated.
+     * @param projectId      The project name.
+     * @param projectVersion The project version.
+     * @return The list of artifact metadata objects, or a empty list, if no artifact exists for this version.
+     * @throws MetadataResolutionException if the retrieval failed.
      */
     Collection<ArtifactMetadata> getArtifacts( RepositorySession session, String repoId, String namespace, String projectId,
                                                String projectVersion )
         throws MetadataResolutionException;
 
     /**
-     * remove a project
-     *
+     * Removes the project metadata and metadata for all stored versions, artifacts and facets of this project.
      *
-     * @param session
-     * @param repositoryId
-     * @param namespace
-     * @param projectId
-     * @throws MetadataRepositoryException
+     * @param session      The repository session.
+     * @param repositoryId The repository id.
+     * @param namespace    The namespace '.'-separated.
+     * @param projectId    The project name.
+     * @throws MetadataRepositoryException if the removal failed.
      * @since 1.4-M4
      */
     void removeProject( RepositorySession session, String repositoryId, String namespace, String projectId )
         throws MetadataRepositoryException;
 
-
-    void close()
+    /**
+     * Closes the repository.
+     * Repositories are normally opened during startup and closed on shutdown. The closing of a repository stops all
+     * invalidates all connections to it.
+     * Sessions that are open are invalidated too. The repository will throw exceptions if it is used after closing.
+     *
+     * @throws MetadataRepositoryException if the something went wrong or if the repository was closed already.
+     */
+    void close( )
         throws MetadataRepositoryException;
 
 
-    boolean canObtainAccess( Class<?> aClass );
-
-    <T> T obtainAccess( RepositorySession session,  Class<T> aClass )
-        throws MetadataRepositoryException;
-
     /**
-     * Full text artifacts search.
-     *  
+     * Full text artifacts search. Searches for the given string in all metadata and returns artifacts where the
+     * text was found.
      *
-     * @param session
-     * @param repositoryId can be null to search in all repositories
-     * @param text
-     * @param exact running an exact search, the value must exactly match the text.
-     * @return a list of artifacts
-     * @throws MetadataRepositoryException
+     * @param session      The repository session.
+     * @param repositoryId can be <code>null</code> to search in all repositories
+     * @param text         The search text
+     * @param exact        if true, the value must exactly match the text.
+     * @return a list of artifacts or empty list if no results where found.
+     * @throws MetadataRepositoryException if the retrieval failed.
      */
     List<ArtifactMetadata> searchArtifacts( RepositorySession session, String repositoryId, String text, boolean exact )
         throws MetadataRepositoryException;
 
     /**
-     * Full text artifacts search inside the specified key.
-     *  
+     * Full text artifacts search inside the specified key. Searches for the given text in all attributes with the given
+     * name.
      *
-     * @param session
-     * @param repositoryId can be null to search in all repositories
-     * @param key search only inside this key
-     * @param text
-     * @param exact running an exact search, the value must exactly match the text.
-     * @return a list of artifacts
-     * @throws MetadataRepositoryException
+     * @param session      The repository session.
+     * @param repositoryId can be <code>null</code> to search in all repositories
+     * @param key          search only inside this attribute.
+     * @param text         The search string.
+     * @param exact        if true, the value must exactly match the text.
+     * @return a list of artifacts or empty list if no results were found.
+     * @throws MetadataRepositoryException if the retrieval failed.
      */
     List<ArtifactMetadata> searchArtifacts( RepositorySession session, String repositoryId, String key, String text, boolean exact )
         throws MetadataRepositoryException;
diff --git a/archiva-modules/metadata/metadata-repository-api/src/test/java/org/apache/archiva/metadata/repository/AbstractMetadataRepositoryTest.java b/archiva-modules/metadata/metadata-repository-api/src/test/java/org/apache/archiva/metadata/repository/AbstractMetadataRepositoryTest.java
index e24f456..668f45c 100644
--- a/archiva-modules/metadata/metadata-repository-api/src/test/java/org/apache/archiva/metadata/repository/AbstractMetadataRepositoryTest.java
+++ b/archiva-modules/metadata/metadata-repository-api/src/test/java/org/apache/archiva/metadata/repository/AbstractMetadataRepositoryTest.java
@@ -177,7 +177,7 @@ public abstract class AbstractMetadataRepositoryTest
             }
         } );
 
-        // for the getArtifactsByProjectVersionMetadata tests
+        // for the getArtifactsByProjectVersionFacet tests
         factories.add( new GenericMetadataFacetFactory( ) );
 
         return factories;
@@ -1540,13 +1540,13 @@ public abstract class AbstractMetadataRepositoryTest
 
                 assertThat( namespaces ).isNotNull( ).isNotEmpty( ).hasSize( 1 ).contains( "org" );
 
-                namespaces = getRepository( ).getNamespaces( session, TEST_REPO_ID, "org" );
+                namespaces = getRepository( ).getChildNamespaces( session, TEST_REPO_ID, "org" );
                 assertThat( namespaces ).isNotNull( ).isNotEmpty( ).hasSize( 1 ).contains( "apache" );
 
-                namespaces = getRepository( ).getNamespaces( session, TEST_REPO_ID, "org.apache" );
+                namespaces = getRepository( ).getChildNamespaces( session, TEST_REPO_ID, "org.apache" );
                 assertThat( namespaces ).isNotNull( ).isNotEmpty( ).hasSize( 1 ).contains( "maven" );
 
-                namespaces = getRepository( ).getNamespaces( session, TEST_REPO_ID, "org.apache.maven" );
+                namespaces = getRepository( ).getChildNamespaces( session, TEST_REPO_ID, "org.apache.maven" );
                 assertThat( namespaces ).isNotNull( ).isNotEmpty( ).hasSize( 1 ).contains( "shared" );
 
             } );
@@ -1566,7 +1566,7 @@ public abstract class AbstractMetadataRepositoryTest
             metadata.setId( TEST_PROJECT_VERSION );
             getRepository( ).updateProjectVersion( session, TEST_REPO_ID, namespace, TEST_PROJECT, metadata );
 
-            Collection<String> namespaces = getRepository( ).getNamespaces( session, TEST_REPO_ID, namespace );
+            Collection<String> namespaces = getRepository( ).getChildNamespaces( session, TEST_REPO_ID, namespace );
 
             assertThat( namespaces ).isNotNull( ).isEmpty( );
 
@@ -1754,7 +1754,7 @@ public abstract class AbstractMetadataRepositoryTest
 
             tryAssert( ( ) -> {
                 Collection<ArtifactMetadata> artifactsByMetadata =
-                    getRepository( ).getArtifactsByProjectVersionMetadata( session, TEST_METADATA_KEY, TEST_METADATA_VALUE, TEST_REPO_ID );
+                    getRepository( ).getArtifactsByProjectVersionFacet( session, TEST_METADATA_KEY, TEST_METADATA_VALUE, TEST_REPO_ID );
 
                 assertThat( artifactsByMetadata ).hasSize( 1 );
                 ArtifactMetadata artifactMetadata = artifactsByMetadata.iterator( ).next( );
@@ -1775,7 +1775,7 @@ public abstract class AbstractMetadataRepositoryTest
             tryAssert( ( ) -> {
 
                 Collection<ArtifactMetadata> artifactsByMetadata =
-                    getRepository( ).getArtifactsByProjectVersionMetadata( session, TEST_METADATA_KEY, TEST_METADATA_VALUE, null );
+                    getRepository( ).getArtifactsByProjectVersionFacet( session, TEST_METADATA_KEY, TEST_METADATA_VALUE, null );
                 assertThat( artifactsByMetadata ).hasSize( 1 );
                 assertThat( artifactsByMetadata.iterator( ).next( ).getRepositoryId( ) ).isNotNull( ).isNotEmpty( );
             } );
@@ -1792,7 +1792,7 @@ public abstract class AbstractMetadataRepositoryTest
             tryAssert( ( ) -> {
 
                 Collection<ArtifactMetadata> artifactsByMetadata =
-                    getRepository( ).getArtifactsByProjectVersionMetadata( session, TEST_METADATA_KEY, TEST_METADATA_VALUE, null );
+                    getRepository( ).getArtifactsByProjectVersionFacet( session, TEST_METADATA_KEY, TEST_METADATA_VALUE, null );
                 assertThat( artifactsByMetadata ).hasSize( 1 );
             } );
         }
@@ -1807,7 +1807,7 @@ public abstract class AbstractMetadataRepositoryTest
             createArtifactWithMavenArtifactFacet( session );
             tryAssert( ( ) -> {
                 Collection<ArtifactMetadata> artifactsByMetadata =
-                    getRepository( ).getArtifactsByMetadata( session, "foo", TEST_METADATA_VALUE, null );
+                    getRepository( ).getArtifactsByAttribute( session, "foo", TEST_METADATA_VALUE, null );
                 assertThat( artifactsByMetadata ).hasSize( 1 );
                 ArtifactMetadata artifactMetadata = artifactsByMetadata.iterator( ).next( );
                 assertThat( artifactMetadata.getId( ) ).isEqualTo( TEST_PROJECT + "-" + TEST_PROJECT_VERSION + ".jar" );
@@ -1828,10 +1828,10 @@ public abstract class AbstractMetadataRepositoryTest
         {
             createArtifactWithData( session );
             // only works on JCR implementation
-            // Collection<ArtifactMetadata> artifactsByProperty = getRepository().getArtifactsByProperty( "org.name", TEST_ORGANIZATION.getName(), TEST_REPO_ID );
+            // Collection<ArtifactMetadata> artifactsByProperty = getRepository().getArtifactsByProjectVersionAttribute( "org.name", TEST_ORGANIZATION.getName(), TEST_REPO_ID );
             tryAssert( ( ) -> {
 
-                Collection<ArtifactMetadata> artifactsByProperty = getRepository( ).getArtifactsByProperty( session, "url", TEST_URL, TEST_REPO_ID );
+                Collection<ArtifactMetadata> artifactsByProperty = getRepository( ).getArtifactsByProjectVersionAttribute( session, "url", TEST_URL, TEST_REPO_ID );
                 assertThat( artifactsByProperty ).hasSize( 1 );
                 ArtifactMetadata artifactMetadata = artifactsByProperty.iterator( ).next( );
                 assertThat( artifactMetadata.getId( ) ).isEqualTo( TEST_PROJECT + "-" + TEST_PROJECT_VERSION + ".jar" );
@@ -2046,13 +2046,13 @@ public abstract class AbstractMetadataRepositoryTest
 
             log.info( "artifactMetadatas: {}", artifactMetadatas );
 
-            getRepository( ).removeArtifact( session, artifactOne, "2.0-SNAPSHOT" );
+            getRepository( ).removeTimestampedArtifact( session, artifactOne, "2.0-SNAPSHOT" );
 
             artifactMetadatas = getRepository( ).getArtifacts( session, TEST_REPO_ID, TEST_NAMESPACE, TEST_PROJECT, "2.0-SNAPSHOT" );
 
             assertThat( artifactMetadatas ).isNotNull( ).isNotEmpty( ).hasSize( 1 );
 
-            getRepository( ).removeArtifact( session, artifactTwo, "2.0-SNAPSHOT" );
+            getRepository( ).removeTimestampedArtifact( session, artifactTwo, "2.0-SNAPSHOT" );
 
             artifactMetadatas = getRepository( ).getArtifacts( session, TEST_REPO_ID, TEST_NAMESPACE, TEST_PROJECT, "2.0-SNAPSHOT" );
 
diff --git a/archiva-modules/metadata/metadata-statistics-api/src/main/java/org/apache/archiva/metadata/repository/stats/model/RepositoryWalkingStatisticsProvider.java b/archiva-modules/metadata/metadata-statistics-api/src/main/java/org/apache/archiva/metadata/repository/stats/model/RepositoryWalkingStatisticsProvider.java
index 7cc7528..4f06928 100644
--- a/archiva-modules/metadata/metadata-statistics-api/src/main/java/org/apache/archiva/metadata/repository/stats/model/RepositoryWalkingStatisticsProvider.java
+++ b/archiva-modules/metadata/metadata-statistics-api/src/main/java/org/apache/archiva/metadata/repository/stats/model/RepositoryWalkingStatisticsProvider.java
@@ -73,7 +73,7 @@ public class RepositoryWalkingStatisticsProvider implements RepositoryStatistics
                                  String ns )
         throws MetadataResolutionException
     {
-        for ( String namespace : metadataRepository.getNamespaces( repositorySession , repositoryId, ns ) )
+        for ( String namespace : metadataRepository.getChildNamespaces( repositorySession , repositoryId, ns ) )
         {
             walkRepository( repositorySession, metadataRepository, stats, repositoryId, ns + "." + namespace );
         }
diff --git a/archiva-modules/plugins/metadata-store-cassandra/src/main/java/org/apache/archiva/metadata/repository/cassandra/CassandraMetadataRepository.java b/archiva-modules/plugins/metadata-store-cassandra/src/main/java/org/apache/archiva/metadata/repository/cassandra/CassandraMetadataRepository.java
index 1b6646a..f3a0fee 100644
--- a/archiva-modules/plugins/metadata-store-cassandra/src/main/java/org/apache/archiva/metadata/repository/cassandra/CassandraMetadataRepository.java
+++ b/archiva-modules/plugins/metadata-store-cassandra/src/main/java/org/apache/archiva/metadata/repository/cassandra/CassandraMetadataRepository.java
@@ -482,7 +482,7 @@ public class CassandraMetadataRepository
 
     // FIXME this one need peformance improvement maybe a cache?
     @Override
-    public Collection<String> getNamespaces( RepositorySession session, final String repoId, final String namespaceId )
+    public Collection<String> getChildNamespaces( RepositorySession session, final String repoId, final String namespaceId )
         throws MetadataResolutionException
     {
 
@@ -2032,17 +2032,17 @@ public class CassandraMetadataRepository
 
     /**
      * Project version and artifact level metadata are stored in the same place, no distinctions in Cassandra
-     * implementation, just calls {@link MetadataRepository#getArtifactsByMetadata(RepositorySession, String, String, String)}
+     * implementation, just calls {@link MetadataRepository#getArtifactsByAttribute(RepositorySession, String, String, String)}
      */
     @Override
-    public List<ArtifactMetadata> getArtifactsByProjectVersionMetadata( RepositorySession session, String key, String value, String repositoryId )
+    public List<ArtifactMetadata> getArtifactsByProjectVersionFacet( RepositorySession session, String key, String value, String repositoryId )
         throws MetadataRepositoryException
     {
-        return getArtifactsByMetadata( session, key, value, repositoryId );
+        return this.getArtifactsByAttribute( session, key, value, repositoryId );
     }
 
     @Override
-    public List<ArtifactMetadata> getArtifactsByMetadata( RepositorySession session, String key, String value, String repositoryId )
+    public List<ArtifactMetadata> getArtifactsByAttribute( RepositorySession session, String key, String value, String repositoryId )
         throws MetadataRepositoryException
     {
         RangeSlicesQuery<String, String, String> query =
@@ -2101,7 +2101,7 @@ public class CassandraMetadataRepository
     }
 
     @Override
-    public List<ArtifactMetadata> getArtifactsByProperty( RepositorySession session, String key, String value, String repositoryId )
+    public List<ArtifactMetadata> getArtifactsByProjectVersionAttribute( RepositorySession session, String key, String value, String repositoryId )
         throws MetadataRepositoryException
     {
         QueryResult<OrderedRows<String, String, String>> result =
@@ -2146,7 +2146,7 @@ public class CassandraMetadataRepository
                                 final String version, final String id )
         throws MetadataRepositoryException
     {
-        logger.debug( "removeArtifact repositoryId: '{}', namespace: '{}', project: '{}', version: '{}', id: '{}'",
+        logger.debug( "removeTimestampedArtifact repositoryId: '{}', namespace: '{}', project: '{}', version: '{}', id: '{}'",
                       repositoryId, namespace, project, version, id );
         String key =
             new ArtifactMetadataModel.KeyBuilder().withRepositoryId( repositoryId ).withNamespace( namespace ).withId(
@@ -2166,10 +2166,10 @@ public class CassandraMetadataRepository
     }
 
     @Override
-    public void removeArtifact( RepositorySession session, ArtifactMetadata artifactMetadata, String baseVersion )
+    public void removeTimestampedArtifact( RepositorySession session, ArtifactMetadata artifactMetadata, String baseVersion )
         throws MetadataRepositoryException
     {
-        logger.debug( "removeArtifact repositoryId: '{}', namespace: '{}', project: '{}', version: '{}', id: '{}'",
+        logger.debug( "removeTimestampedArtifact repositoryId: '{}', namespace: '{}', project: '{}', version: '{}', id: '{}'",
                       artifactMetadata.getRepositoryId(), artifactMetadata.getNamespace(),
                       artifactMetadata.getProject(), baseVersion, artifactMetadata.getId() );
         String key =
@@ -2182,8 +2182,8 @@ public class CassandraMetadataRepository
     }
 
     @Override
-    public void removeArtifact( RepositorySession session, final String repositoryId, final String namespace, final String project,
-                                final String version, final MetadataFacet metadataFacet )
+    public void removeFacetFromArtifact( RepositorySession session, final String repositoryId, final String namespace, final String project,
+                                         final String version, final MetadataFacet metadataFacet )
         throws MetadataRepositoryException
     {
 
@@ -2447,21 +2447,6 @@ public class CassandraMetadataRepository
     }
 
 
-    @Override
-    public boolean canObtainAccess( Class<?> aClass )
-    {
-        return false;
-    }
-
-    @Override
-    public <T> T obtainAccess( RepositorySession session, Class<T> aClass )
-        throws MetadataRepositoryException
-    {
-        throw new IllegalArgumentException(
-            "Access using " + aClass + " is not supported on the cassandra metadata storage" );
-    }
-
-
     private static class ModelMapperHolder
     {
         private static ModelMapper MODEL_MAPPER = new ModelMapper();
@@ -2473,7 +2458,7 @@ public class CassandraMetadataRepository
     }
 
     /**
-     * This implementation just calls getArtifactsByMetadata( null, text, repositoryId ). We can't search artifacts by
+     * This implementation just calls getArtifactsByAttribute( null, text, repositoryId ). We can't search artifacts by
      * any property.
      */
     @Override
@@ -2481,7 +2466,7 @@ public class CassandraMetadataRepository
                                                    final String text, final boolean exact )
         throws MetadataRepositoryException
     {
-        return getArtifactsByMetadata( session, null, text, repositoryId );
+        return this.getArtifactsByAttribute( session, null, text, repositoryId );
     }
 
     /**
@@ -2494,8 +2479,8 @@ public class CassandraMetadataRepository
     {
         // TODO optimize
         List<ArtifactMetadata> artifacts = new LinkedList<ArtifactMetadata>();
-        artifacts.addAll( getArtifactsByMetadata( session, key, text, repositoryId ) );
-        artifacts.addAll( getArtifactsByProperty( session, key, text, repositoryId ) );
+        artifacts.addAll( this.getArtifactsByAttribute( session, key, text, repositoryId ) );
+        artifacts.addAll( this.getArtifactsByProjectVersionAttribute( session, key, text, repositoryId ) );
         return artifacts;
     }
 
diff --git a/archiva-modules/plugins/metadata-store-file/src/main/java/org/apache/archiva/metadata/repository/file/FileMetadataRepository.java b/archiva-modules/plugins/metadata-store-file/src/main/java/org/apache/archiva/metadata/repository/file/FileMetadataRepository.java
index aa4e25a..e694ec9 100644
--- a/archiva-modules/plugins/metadata-store-file/src/main/java/org/apache/archiva/metadata/repository/file/FileMetadataRepository.java
+++ b/archiva-modules/plugins/metadata-store-file/src/main/java/org/apache/archiva/metadata/repository/file/FileMetadataRepository.java
@@ -476,7 +476,7 @@ public class FileMetadataRepository
                                          ZonedDateTime endTime)
             throws MetadataRepositoryException {
         try {
-            for (String namespace : getNamespaces(session, repoId, ns)) {
+            for (String namespace : this.getChildNamespaces(session, repoId, ns)) {
                 getArtifactsByDateRange(session, artifacts, repoId, ns + "." + namespace, startTime, endTime);
             }
 
@@ -580,17 +580,6 @@ public class FileMetadataRepository
     }
 
 
-    @Override
-    public boolean canObtainAccess(Class<?> aClass) {
-        return false;
-    }
-
-    @Override
-    public <T> T obtainAccess(RepositorySession session, Class<T> aClass) {
-        throw new IllegalArgumentException(
-                "Access using " + aClass + " is not supported on the file metadata storage");
-    }
-
     private void updateArtifactFacets(ArtifactMetadata artifact, Properties properties) {
         String propertyPrefix = "artifact:facet:" + artifact.getId() + ":";
         for (MetadataFacet facet : artifact.getFacetList()) {
@@ -634,7 +623,7 @@ public class FileMetadataRepository
     }
 
     @Override
-    public void removeArtifact(RepositorySession session, ArtifactMetadata artifactMetadata, String baseVersion)
+    public void removeTimestampedArtifact( RepositorySession session, ArtifactMetadata artifactMetadata, String baseVersion)
             throws MetadataRepositoryException {
 
         try {
@@ -712,8 +701,8 @@ public class FileMetadataRepository
      * @throws MetadataRepositoryException
      */
     @Override
-    public void removeArtifact(RepositorySession session, String repositoryId, String namespace, String project, String projectVersion,
-                               MetadataFacet metadataFacet)
+    public void removeFacetFromArtifact( RepositorySession session, String repositoryId, String namespace, String project, String projectVersion,
+                                         MetadataFacet metadataFacet)
             throws MetadataRepositoryException {
         throw new UnsupportedOperationException("not implemented");
     }
@@ -731,21 +720,21 @@ public class FileMetadataRepository
 
 
     @Override
-    public List<ArtifactMetadata> getArtifactsByProjectVersionMetadata(RepositorySession session, String key, String value, String repositoryId)
+    public List<ArtifactMetadata> getArtifactsByProjectVersionFacet( RepositorySession session, String key, String value, String repositoryId)
             throws MetadataRepositoryException {
         throw new UnsupportedOperationException("not yet implemented in File backend");
     }
 
     @Override
-    public List<ArtifactMetadata> getArtifactsByMetadata(RepositorySession session, String key, String value, String repositoryId)
+    public List<ArtifactMetadata> getArtifactsByAttribute( RepositorySession session, String key, String value, String repositoryId)
             throws MetadataRepositoryException {
         throw new UnsupportedOperationException("not yet implemented in File backend");
     }
 
     @Override
-    public List<ArtifactMetadata> getArtifactsByProperty(RepositorySession session, String key, String value, String repositoryId)
+    public List<ArtifactMetadata> getArtifactsByProjectVersionAttribute( RepositorySession session, String key, String value, String repositoryId)
             throws MetadataRepositoryException {
-        throw new UnsupportedOperationException("getArtifactsByProperty not yet implemented in File backend");
+        throw new UnsupportedOperationException("getArtifactsByProjectVersionAttribute not yet implemented in File backend");
     }
 
     private Path getMetadataDirectory(String repoId, String facetId)
@@ -1057,7 +1046,7 @@ public class FileMetadataRepository
     @Override
     public Collection<String> getRootNamespaces(RepositorySession session, String repoId)
             throws MetadataResolutionException {
-        return getNamespaces(session, repoId, null);
+        return this.getChildNamespaces(session, repoId, null);
     }
 
     private Stream<String> getAllNamespacesStream(RepositorySession session, String repoId) {
@@ -1087,7 +1076,7 @@ public class FileMetadataRepository
     }
 
     @Override
-    public Collection<String> getNamespaces(RepositorySession session, String repoId, String baseNamespace)
+    public Collection<String> getChildNamespaces( RepositorySession session, String repoId, String baseNamespace)
             throws MetadataResolutionException {
         try {
             List<String> allNamespaces;
@@ -1305,7 +1294,7 @@ public class FileMetadataRepository
 
     private void getArtifacts(RepositorySession session, List<ArtifactMetadata> artifacts, String repoId, String ns)
             throws MetadataResolutionException {
-        for (String namespace : getNamespaces(session, repoId, ns)) {
+        for (String namespace : this.getChildNamespaces(session, repoId, ns)) {
             getArtifacts(session, artifacts, repoId, ns + "." + namespace);
         }
 
diff --git a/archiva-modules/plugins/metadata-store-jcr/src/main/java/org/apache/archiva/metadata/repository/jcr/JcrMetadataRepository.java b/archiva-modules/plugins/metadata-store-jcr/src/main/java/org/apache/archiva/metadata/repository/jcr/JcrMetadataRepository.java
index 07ef40c..2efdf96 100644
--- a/archiva-modules/plugins/metadata-store-jcr/src/main/java/org/apache/archiva/metadata/repository/jcr/JcrMetadataRepository.java
+++ b/archiva-modules/plugins/metadata-store-jcr/src/main/java/org/apache/archiva/metadata/repository/jcr/JcrMetadataRepository.java
@@ -963,7 +963,7 @@ public class JcrMetadataRepository
     }
 
     @Override
-    public List<ArtifactMetadata> getArtifactsByProjectVersionMetadata( RepositorySession session, String key, String value, String repositoryId )
+    public List<ArtifactMetadata> getArtifactsByProjectVersionFacet( RepositorySession session, String key, String value, String repositoryId )
         throws MetadataRepositoryException
     {
         final Session jcrSession = getSession( session );
@@ -973,7 +973,7 @@ public class JcrMetadataRepository
 
 
     @Override
-    public List<ArtifactMetadata> getArtifactsByMetadata( RepositorySession session, String key, String value, String repositoryId )
+    public List<ArtifactMetadata> getArtifactsByAttribute( RepositorySession session, String key, String value, String repositoryId )
         throws MetadataRepositoryException
     {
         final Session jcrSession = getSession( session );
@@ -983,7 +983,7 @@ public class JcrMetadataRepository
 
 
     @Override
-    public List<ArtifactMetadata> getArtifactsByProperty( RepositorySession session, String key, String value, String repositoryId )
+    public List<ArtifactMetadata> getArtifactsByProjectVersionAttribute( RepositorySession session, String key, String value, String repositoryId )
         throws MetadataRepositoryException
     {
         final Session jcrSession = getSession( session );
@@ -1367,11 +1367,11 @@ public class JcrMetadataRepository
     public Collection<String> getRootNamespaces( RepositorySession session, String repositoryId )
         throws MetadataResolutionException
     {
-        return getNamespaces(session , repositoryId, null );
+        return this.getChildNamespaces(session , repositoryId, null );
     }
 
     @Override
-    public Collection<String> getNamespaces( RepositorySession session, String repositoryId, String baseNamespace )
+    public Collection<String> getChildNamespaces( RepositorySession session, String repositoryId, String baseNamespace )
         throws MetadataResolutionException
     {
         String path = baseNamespace != null
@@ -1417,7 +1417,7 @@ public class JcrMetadataRepository
     }
 
     @Override
-    public void removeArtifact( RepositorySession session, ArtifactMetadata artifactMetadata, String baseVersion )
+    public void removeTimestampedArtifact( RepositorySession session, ArtifactMetadata artifactMetadata, String baseVersion )
         throws MetadataRepositoryException
     {
         final Session jcrSession = getSession( session );
@@ -1525,8 +1525,8 @@ public class JcrMetadataRepository
     }
 
     @Override
-    public void removeArtifact( RepositorySession session, String repositoryId, String namespace, String project, String projectVersion,
-                                MetadataFacet metadataFacet )
+    public void removeFacetFromArtifact( RepositorySession session, String repositoryId, String namespace, String project, String projectVersion,
+                                         MetadataFacet metadataFacet )
         throws MetadataRepositoryException
     {
         final Session jcrSession = getSession( session );
@@ -1604,25 +1604,6 @@ public class JcrMetadataRepository
 
 
     @Override
-    public boolean canObtainAccess( Class<?> aClass )
-    {
-        return aClass == Session.class;
-    }
-
-    @SuppressWarnings( "unchecked" )
-    @Override
-    public <T> T obtainAccess( RepositorySession session, Class<T> aClass )
-        throws MetadataRepositoryException
-    {
-        if ( aClass == Session.class )
-        {
-            return (T) getSession( session );
-        }
-        throw new IllegalArgumentException(
-            "Access using " + aClass + " is not supported on the JCR metadata storage" );
-    }
-
-    @Override
     public void close()
         throws MetadataRepositoryException
     {
diff --git a/archiva-modules/plugins/repository-statistics/src/test/java/org/apache/archiva/metadata/repository/stats/RepositoryStatisticsManagerTest.java b/archiva-modules/plugins/repository-statistics/src/test/java/org/apache/archiva/metadata/repository/stats/RepositoryStatisticsManagerTest.java
index f888f1f..8d7f92e 100644
--- a/archiva-modules/plugins/repository-statistics/src/test/java/org/apache/archiva/metadata/repository/stats/RepositoryStatisticsManagerTest.java
+++ b/archiva-modules/plugins/repository-statistics/src/test/java/org/apache/archiva/metadata/repository/stats/RepositoryStatisticsManagerTest.java
@@ -628,9 +628,9 @@ public class RepositoryStatisticsManagerTest
 
             expect( metadataRepository.getProjects(session , TEST_REPO_ID, "com" ) ).andReturn( Arrays.<String>asList() );
 
-            expect( metadataRepository.getNamespaces(session , TEST_REPO_ID, "com" ) ).andReturn( Arrays.asList( "example" ) );
+            expect( metadataRepository.getChildNamespaces(session , TEST_REPO_ID, "com" ) ).andReturn( Arrays.asList( "example" ) );
 
-            expect( metadataRepository.getNamespaces(session , TEST_REPO_ID, "com.example" ) ).andReturn(
+            expect( metadataRepository.getChildNamespaces(session , TEST_REPO_ID, "com.example" ) ).andReturn(
                 Arrays.<String>asList() );
 
             expect( metadataRepository.getProjects(session , TEST_REPO_ID, "com.example" ) ).andReturn(
@@ -650,14 +650,14 @@ public class RepositoryStatisticsManagerTest
                                createArtifact( "com.example", "example-project", "1.1", "pom" ) ) );
 
 
-            expect( metadataRepository.getNamespaces(session , TEST_REPO_ID, "org" ) ).andReturn( Arrays.asList( "apache", "codehaus" ) );
+            expect( metadataRepository.getChildNamespaces(session , TEST_REPO_ID, "org" ) ).andReturn( Arrays.asList( "apache", "codehaus" ) );
 
-            expect( metadataRepository.getNamespaces(session , TEST_REPO_ID, "org.apache" ) ).andReturn( Arrays.asList( "archiva", "maven" )  );
+            expect( metadataRepository.getChildNamespaces(session , TEST_REPO_ID, "org.apache" ) ).andReturn( Arrays.asList( "archiva", "maven" )  );
 
 
             expect( metadataRepository.getProjects(session , TEST_REPO_ID, "org.apache" ) ).andReturn( Arrays.<String>asList() );
 
-            expect( metadataRepository.getNamespaces(session , TEST_REPO_ID, "org.apache.archiva" ) ).andReturn( Arrays.<String>asList() );
+            expect( metadataRepository.getChildNamespaces(session , TEST_REPO_ID, "org.apache.archiva" ) ).andReturn( Arrays.<String>asList() );
 
             expect( metadataRepository.getProjects(session , TEST_REPO_ID, "org.apache.archiva" ) ).andReturn( Arrays.asList( "metadata-repository-api", "metadata-model" ) );
 
@@ -685,7 +685,7 @@ public class RepositoryStatisticsManagerTest
                 .andReturn( Arrays.asList( createArtifact( "org.apache.archiva", "metadata-model", "1.3", "jar" ),
                                            createArtifact( "org.apache.archiva", "metadata-model", "1.3", "pom" ) ) );
 
-            expect( metadataRepository.getNamespaces(session , TEST_REPO_ID, "org.apache.maven" ) ).andReturn( Arrays.<String>asList() );
+            expect( metadataRepository.getChildNamespaces(session , TEST_REPO_ID, "org.apache.maven" ) ).andReturn( Arrays.<String>asList() );
 
             expect( metadataRepository.getProjects(session , TEST_REPO_ID, "org.apache.maven" ) )
                 .andReturn( Arrays.asList( "maven-model" )  );
@@ -697,14 +697,14 @@ public class RepositoryStatisticsManagerTest
                 .andReturn( Arrays.asList( createArtifact( "org.apache.archiva", "maven-model", "2.2.1", "jar" ),
                                            createArtifact( "org.apache.archiva", "maven-model", "2.2.1", "pom" ) ) );
 
-            expect( metadataRepository.getNamespaces(session , TEST_REPO_ID, "org.codehaus" ) ).andReturn( Arrays.asList( "plexus" ) );
+            expect( metadataRepository.getChildNamespaces(session , TEST_REPO_ID, "org.codehaus" ) ).andReturn( Arrays.asList( "plexus" ) );
 
             expect( metadataRepository.getProjects(session , TEST_REPO_ID, "org" ) ).andReturn( Arrays.<String>asList(  ) );
 
             expect( metadataRepository.getProjects(session , TEST_REPO_ID, "org.codehaus" ) )
                 .andReturn( Arrays.<String>asList(  ) );
 
-            expect( metadataRepository.getNamespaces(session , TEST_REPO_ID, "org.codehaus.plexus" ) )
+            expect( metadataRepository.getChildNamespaces(session , TEST_REPO_ID, "org.codehaus.plexus" ) )
                 .andReturn( Arrays.<String>asList(  ) );
 
             expect( metadataRepository.getProjects(session , TEST_REPO_ID, "org.codehaus.plexus" ) )