Author: brett
Date: Thu Dec 30 02:30:09 2010
New Revision: 1053788

URL: http://svn.apache.org/viewvc?rev=1053788&view=rev
Log:
[MRM-1327] assign node types to each different node so that they can be easily 
distinguished from each other when querying or traversing. Correct bug where 
projects would appear as namespaces and vice-versa.

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

Modified: 
archiva/trunk/archiva-modules/metadata/metadata-repository-api/src/test/java/org/apache/archiva/metadata/repository/AbstractMetadataRepositoryTest.java
URL: 
http://svn.apache.org/viewvc/archiva/trunk/archiva-modules/metadata/metadata-repository-api/src/test/java/org/apache/archiva/metadata/repository/AbstractMetadataRepositoryTest.java?rev=1053788&r1=1053787&r2=1053788&view=diff
==============================================================================
--- 
archiva/trunk/archiva-modules/metadata/metadata-repository-api/src/test/java/org/apache/archiva/metadata/repository/AbstractMetadataRepositoryTest.java
 (original)
+++ 
archiva/trunk/archiva-modules/metadata/metadata-repository-api/src/test/java/org/apache/archiva/metadata/repository/AbstractMetadataRepositoryTest.java
 Thu Dec 30 02:30:09 2010
@@ -891,6 +891,52 @@ public abstract class AbstractMetadataRe
         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
     {

Modified: 
archiva/trunk/archiva-modules/plugins/metadata-store-jcr/src/main/java/org/apache/archiva/metadata/repository/jcr/JcrMetadataRepository.java
URL: 
http://svn.apache.org/viewvc/archiva/trunk/archiva-modules/plugins/metadata-store-jcr/src/main/java/org/apache/archiva/metadata/repository/jcr/JcrMetadataRepository.java?rev=1053788&r1=1053787&r2=1053788&view=diff
==============================================================================
--- 
archiva/trunk/archiva-modules/plugins/metadata-store-jcr/src/main/java/org/apache/archiva/metadata/repository/jcr/JcrMetadataRepository.java
 (original)
+++ 
archiva/trunk/archiva-modules/plugins/metadata-store-jcr/src/main/java/org/apache/archiva/metadata/repository/jcr/JcrMetadataRepository.java
 Thu Dec 30 02:30:09 2010
@@ -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 )
@@ -1184,10 +1194,20 @@ 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,


Reply via email to