]> source.dussan.org Git - archiva.git/commitdiff
[MRM-1327] assign node types to each different node so that they can be easily distin...
authorBrett Porter <brett@apache.org>
Thu, 30 Dec 2010 02:30:09 +0000 (02:30 +0000)
committerBrett Porter <brett@apache.org>
Thu, 30 Dec 2010 02:30:09 +0000 (02:30 +0000)
git-svn-id: https://svn.apache.org/repos/asf/archiva/trunk@1053788 13f79535-47bb-0310-9956-ffa450edef68

archiva-modules/metadata/metadata-repository-api/src/test/java/org/apache/archiva/metadata/repository/AbstractMetadataRepositoryTest.java
archiva-modules/plugins/metadata-store-jcr/src/main/java/org/apache/archiva/metadata/repository/jcr/JcrMetadataRepository.java

index 041a4fd77b0a896a8dae7b92b763d49d40e75607..6b04e845a71f4ef3756aa86c952342e45a05e292 100644 (file)
@@ -891,6 +891,52 @@ public abstract class AbstractMetadataRepositoryTest
         assertEquals( Arrays.asList( "shared" ), repository.getNamespaces( TEST_REPO_ID, "org.apache.maven" ) );
     }
 
+    public void testGetNamespacesWithProjectsPresent()
+        throws Exception
+    {
+        String namespace = "org.apache.maven.shared";
+        repository.updateNamespace( TEST_REPO_ID, namespace );
+
+        ProjectVersionMetadata metadata = new ProjectVersionMetadata();
+        metadata.setId( TEST_PROJECT_VERSION );
+        repository.updateProjectVersion( TEST_REPO_ID, namespace, TEST_PROJECT, metadata );
+
+        assertEquals( Collections.<String>emptyList(), repository.getNamespaces( TEST_REPO_ID, namespace ) );
+    }
+
+    public void testGetProjectsWithOtherNamespacesPresent()
+        throws Exception
+    {
+        ProjectMetadata projectMetadata = new ProjectMetadata();
+        projectMetadata.setId( TEST_PROJECT );
+        projectMetadata.setNamespace( "org.apache.maven" );
+        repository.updateProject( TEST_REPO_ID, projectMetadata );
+
+        repository.updateNamespace( TEST_REPO_ID, "org.apache.maven.shared" );
+
+        assertEquals( Collections.singletonList( TEST_PROJECT ), repository.getProjects( TEST_REPO_ID,
+                                                                                         "org.apache.maven" ) );
+    }
+
+    public void testGetProjectVersionsWithOtherNamespacesPresent()
+        throws Exception
+    {
+        // an unusual case but technically possible where a project namespace matches another project's name
+
+        ProjectVersionMetadata versionMetadata = new ProjectVersionMetadata();
+        versionMetadata.setId( TEST_PROJECT_VERSION );
+        repository.updateProjectVersion( TEST_REPO_ID, "org.apache.maven", TEST_PROJECT, versionMetadata );
+
+        repository.updateProjectVersion( TEST_REPO_ID, "org.apache.maven." + TEST_PROJECT, "other-project",
+                                         versionMetadata );
+
+        List<String> expectedVersions = Collections.singletonList( TEST_PROJECT_VERSION );
+        assertEquals( expectedVersions, repository.getProjectVersions( TEST_REPO_ID, "org.apache.maven." + TEST_PROJECT,
+                                                                       "other-project" ) );
+        assertEquals( expectedVersions, repository.getProjectVersions( TEST_REPO_ID, "org.apache.maven",
+                                                                       TEST_PROJECT ) );
+    }
+
     public void testGetArtifactsByChecksumSingleResultMd5()
         throws Exception
     {
index b12f7a00a461dd13172cf05b5bd3bc69c803a018..d7117fad05eb4772929cf2b9928f3422fea950f4 100644 (file)
@@ -75,6 +75,12 @@ public class JcrMetadataRepository
 {
     private static final String JCR_LAST_MODIFIED = "jcr:lastModified";
 
+    static final String NAMESPACE_NODE_TYPE = "archiva:namespace";
+
+    static final String PROJECT_NODE_TYPE = "archiva:project";
+
+    static final String PROJECT_VERSION_NODE_TYPE = "archiva:projectVersion";
+
     static final String ARTIFACT_NODE_TYPE = "archiva:artifact";
 
     static final String FACET_NODE_TYPE = "archiva:facet";
@@ -115,6 +121,9 @@ public class JcrMetadataRepository
         }
 
         NodeTypeManager nodeTypeManager = workspace.getNodeTypeManager();
+        registerMixinNodeType( nodeTypeManager, JcrMetadataRepository.NAMESPACE_NODE_TYPE );
+        registerMixinNodeType( nodeTypeManager, JcrMetadataRepository.PROJECT_NODE_TYPE );
+        registerMixinNodeType( nodeTypeManager, JcrMetadataRepository.PROJECT_VERSION_NODE_TYPE );
         registerMixinNodeType( nodeTypeManager, JcrMetadataRepository.ARTIFACT_NODE_TYPE );
         registerMixinNodeType( nodeTypeManager, JcrMetadataRepository.FACET_NODE_TYPE );
     }
@@ -955,19 +964,19 @@ public class JcrMetadataRepository
             ? getNamespacePath( repositoryId, baseNamespace )
             : getRepositoryContentPath( repositoryId );
 
-        return getNodeNames( path );
+        return getNodeNames( path, NAMESPACE_NODE_TYPE );
     }
 
     public Collection<String> getProjects( String repositoryId, String namespace )
         throws MetadataResolutionException
     {
-        return getNodeNames( getNamespacePath( repositoryId, namespace ) );
+        return getNodeNames( getNamespacePath( repositoryId, namespace ), PROJECT_NODE_TYPE );
     }
 
     public Collection<String> getProjectVersions( String repositoryId, String namespace, String projectId )
         throws MetadataResolutionException
     {
-        return getNodeNames( getProjectPath( repositoryId, namespace, projectId ) );
+        return getNodeNames( getProjectPath( repositoryId, namespace, projectId ), PROJECT_VERSION_NODE_TYPE );
     }
 
     public Collection<ArtifactMetadata> getArtifacts( String repositoryId, String namespace, String projectId,
@@ -1114,7 +1123,7 @@ public class JcrMetadataRepository
         return node.hasProperty( name ) ? node.getProperty( name ).getString() : null;
     }
 
-    private Collection<String> getNodeNames( String path )
+    private Collection<String> getNodeNames( String path, String nodeType )
         throws MetadataResolutionException
     {
         List<String> names = new ArrayList<String>();
@@ -1123,13 +1132,14 @@ public class JcrMetadataRepository
         {
             Node root = session.getRootNode();
 
-            Node repository = root.getNode( path );
+            Node nodeAtPath = root.getNode( path );
 
-            NodeIterator nodes = repository.getNodes();
-            while ( nodes.hasNext() )
+            for ( Node node : JcrUtils.getChildNodes( nodeAtPath ) )
             {
-                Node node = nodes.nextNode();
-                names.add( node.getName() );
+                if ( node.isNodeType( nodeType ) )
+                {
+                    names.add( node.getName() );
+                }
             }
         }
         catch ( PathNotFoundException e )
@@ -1183,11 +1193,21 @@ public class JcrMetadataRepository
 
     private Node getOrAddNodeByPath( Node baseNode, String name )
         throws RepositoryException
+    {
+        return getOrAddNodeByPath( baseNode, name, null );
+    }
+
+    private Node getOrAddNodeByPath( Node baseNode, String name, String nodeType )
+        throws RepositoryException
     {
         Node node = baseNode;
         for ( String n : name.split( "/" ) )
         {
             node = JcrUtils.getOrAddNode( node, n );
+            if ( nodeType != null )
+            {
+                node.addMixin( nodeType );
+            }
         }
         return node;
     }
@@ -1217,14 +1237,16 @@ public class JcrMetadataRepository
         throws RepositoryException
     {
         Node repo = getOrAddRepositoryContentNode( repositoryId );
-        return getOrAddNodeByPath( repo, namespace.replace( '.', '/' ) );
+        return getOrAddNodeByPath( repo, namespace.replace( '.', '/' ), NAMESPACE_NODE_TYPE );
     }
 
     private Node getOrAddProjectNode( String repositoryId, String namespace, String projectId )
         throws RepositoryException
     {
         Node namespaceNode = getOrAddNamespaceNode( repositoryId, namespace );
-        return JcrUtils.getOrAddNode( namespaceNode, projectId );
+        Node node = JcrUtils.getOrAddNode( namespaceNode, projectId );
+        node.addMixin( PROJECT_NODE_TYPE );
+        return node;
     }
 
     private Node getOrAddProjectVersionNode( String repositoryId, String namespace, String projectId,
@@ -1232,7 +1254,9 @@ public class JcrMetadataRepository
         throws RepositoryException
     {
         Node projectNode = getOrAddProjectNode( repositoryId, namespace, projectId );
-        return JcrUtils.getOrAddNode( projectNode, projectVersion );
+        Node node = JcrUtils.getOrAddNode( projectNode, projectVersion );
+        node.addMixin( PROJECT_VERSION_NODE_TYPE );
+        return node;
     }
 
     private Node getOrAddArtifactNode( String repositoryId, String namespace, String projectId, String projectVersion,