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,