From: Brett Porter Date: Thu, 30 Dec 2010 02:30:09 +0000 (+0000) Subject: [MRM-1327] assign node types to each different node so that they can be easily distin... X-Git-Tag: archiva-1.4-M1~843 X-Git-Url: https://source.dussan.org/?a=commitdiff_plain;h=ed717a4b5bf19c91539191115d5e81918ca62995;p=archiva.git [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. git-svn-id: https://svn.apache.org/repos/asf/archiva/trunk@1053788 13f79535-47bb-0310-9956-ffa450edef68 --- 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 041a4fd77..6b04e845a 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 @@ -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.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 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 { 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 b12f7a00a..d7117fad0 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 @@ -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 getProjects( String repositoryId, String namespace ) throws MetadataResolutionException { - return getNodeNames( getNamespacePath( repositoryId, namespace ) ); + return getNodeNames( getNamespacePath( repositoryId, namespace ), PROJECT_NODE_TYPE ); } public Collection 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 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 getNodeNames( String path ) + private Collection getNodeNames( String path, String nodeType ) throws MetadataResolutionException { List names = new ArrayList(); @@ -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,