]> source.dussan.org Git - archiva.git/commitdiff
[MRM-1327] use nodes for dependencies, make several notes about fixes required to...
authorBrett Porter <brett@apache.org>
Sat, 26 Mar 2011 11:54:11 +0000 (11:54 +0000)
committerBrett Porter <brett@apache.org>
Sat, 26 Mar 2011 11:54:11 +0000 (11:54 +0000)
git-svn-id: https://svn.apache.org/repos/asf/archiva/trunk@1085704 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 6b04e845a71f4ef3756aa86c952342e45a05e292..9eea712e589192b7a51f4923c9bf338ffb3c38b0 100644 (file)
@@ -261,6 +261,7 @@ public abstract class AbstractMetadataRepositoryTest
         d.setSystemPath( "system path" );
         d.setType( "type" );
         d.setVersion( "version" );
+        d.setOptional( true );
         metadata.addDependency( d );
 
         repository.updateProjectVersion( TEST_REPO_ID, TEST_NAMESPACE, TEST_PROJECT, metadata );
@@ -303,6 +304,7 @@ public abstract class AbstractMetadataRepositoryTest
         assertEquals( "system path", d.getSystemPath() );
         assertEquals( "type", d.getType() );
         assertEquals( "version", d.getVersion() );
+        assertTrue( d.isOptional() );
     }
 
     public void testUpdateProjectReference()
index 78ae146a8322a9ff42a1dc6c084fc475f7e4ebb8..58bbb20092423cbf4e95949b1e151f62f21015e6 100644 (file)
@@ -85,6 +85,8 @@ public class JcrMetadataRepository
 
     static final String FACET_NODE_TYPE = "archiva:facet";
 
+    private static final String DEPENDENCY_NODE_TYPE = "archiva:dependency";
+
     private final Map<String, MetadataFacetFactory> metadataFacetFactories;
 
     private static final Logger log = LoggerFactory.getLogger( JcrMetadataRepository.class );
@@ -126,6 +128,7 @@ public class JcrMetadataRepository
         registerMixinNodeType( nodeTypeManager, JcrMetadataRepository.PROJECT_VERSION_NODE_TYPE );
         registerMixinNodeType( nodeTypeManager, JcrMetadataRepository.ARTIFACT_NODE_TYPE );
         registerMixinNodeType( nodeTypeManager, JcrMetadataRepository.FACET_NODE_TYPE );
+        registerMixinNodeType( nodeTypeManager, JcrMetadataRepository.DEPENDENCY_NODE_TYPE );
     }
 
     private static void registerMixinNodeType( NodeTypeManager nodeTypeManager, String name )
@@ -269,17 +272,55 @@ public class JcrMetadataRepository
                     mailingList.getOtherArchives() ) );
                 i++;
             }
-            i = 0;
-            for ( Dependency dependency : versionMetadata.getDependencies() )
+
+            if ( !versionMetadata.getDependencies().isEmpty() )
             {
-                versionNode.setProperty( "dependency." + i + ".classifier", dependency.getClassifier() );
-                versionNode.setProperty( "dependency." + i + ".scope", dependency.getScope() );
-                versionNode.setProperty( "dependency." + i + ".systemPath", dependency.getSystemPath() );
-                versionNode.setProperty( "dependency." + i + ".artifactId", dependency.getArtifactId() );
-                versionNode.setProperty( "dependency." + i + ".groupId", dependency.getGroupId() );
-                versionNode.setProperty( "dependency." + i + ".version", dependency.getVersion() );
-                versionNode.setProperty( "dependency." + i + ".type", dependency.getType() );
-                i++;
+                Node dependenciesNode = JcrUtils.getOrAddNode( versionNode, "dependencies" );
+
+                for ( Dependency dependency : versionMetadata.getDependencies() )
+                {
+                    // Note that we deliberately don't alter the namespace path - not enough dependencies for
+                    // number of nodes at a given depth to be an issue. Similarly, we don't add subnodes for each
+                    // component of the ID as that creates extra depth and causes a great cost in space and memory
+
+                    // FIXME: change group ID to namespace
+                    // FIXME: change to artifact's ID - this is constructed by the Maven 2 format for now.
+                    //        This won't support types where the extension doesn't match the type.
+                    //        (see also Maven2RepositoryStorage#readProjectVersionMetadata construction of POM)
+                    String id =
+                        dependency.getGroupId() + ";" + dependency.getArtifactId() + "-" + dependency.getVersion();
+                    if ( dependency.getClassifier() != null )
+                    {
+                        id += "-" + dependency.getClassifier();
+                    }
+                    id += "." + dependency.getType();
+
+                    Node n = JcrUtils.getOrAddNode( dependenciesNode, id );
+                    n.addMixin( DEPENDENCY_NODE_TYPE );
+
+                    // FIXME: remove temp code just to make it keep working
+                    n.setProperty( "groupId", dependency.getGroupId() );
+                    n.setProperty( "artifactId", dependency.getArtifactId() );
+                    n.setProperty( "version", dependency.getVersion() );
+                    n.setProperty( "type", dependency.getType() );
+                    n.setProperty( "classifier", dependency.getClassifier() );
+                    n.setProperty( "scope", dependency.getScope() );
+                    n.setProperty( "systemPath", dependency.getSystemPath() );
+                    n.setProperty( "optional", dependency.isOptional() );
+
+                    // node has no native content at this time, just facets
+                    // no need to list a type as it's implied by the path. Parents are Maven specific.
+
+                    // FIXME: add scope, systemPath, type, version, classifier & maven2 specific IDs as a facet
+                    //        (should also have been added to the Dependency)
+
+                    // TODO: add a property that is a weak reference to the originating artifact, creating it if
+                    //       necessary (without adding the archiva:artifact mixin so that it doesn't get listed as an
+                    //       artifact, which gives a different meaning to "incomplete" which is a known local project
+                    //       that doesn't have metadata yet but has artifacts). (Though we may want to give it the
+                    //       artifact mixin and another property to identify all non-local artifacts for the closure
+                    //       reports)
+                }
             }
 
             for ( MetadataFacet facet : versionMetadata.getFacetList() )
@@ -304,6 +345,7 @@ public class JcrMetadataRepository
         }
     }
 
+    // FIXME: remove this and projectversionreference
     public void updateProjectReference( String repositoryId, String namespace, String projectId, String projectVersion,
                                         ProjectVersionReference reference )
         throws MetadataRepositoryException
@@ -808,30 +850,26 @@ public class JcrMetadataRepository
                 i++;
             }
 
-            done = false;
-            i = 0;
-            while ( !done )
+            if ( node.hasNode( "dependencies" ) )
             {
-                String dependencyArtifactId = getPropertyString( node, "dependency." + i + ".artifactId" );
-                if ( dependencyArtifactId != null )
-                {
-                    Dependency dependency = new Dependency();
-                    dependency.setArtifactId( dependencyArtifactId );
-                    dependency.setGroupId( getPropertyString( node, "dependency." + i + ".groupId" ) );
-                    dependency.setClassifier( getPropertyString( node, "dependency." + i + ".classifier" ) );
-                    dependency.setOptional( Boolean.valueOf( getPropertyString( node,
-                                                                                "dependency." + i + ".optional" ) ) );
-                    dependency.setScope( getPropertyString( node, "dependency." + i + ".scope" ) );
-                    dependency.setSystemPath( getPropertyString( node, "dependency." + i + ".systemPath" ) );
-                    dependency.setType( getPropertyString( node, "dependency." + i + ".type" ) );
-                    dependency.setVersion( getPropertyString( node, "dependency." + i + ".version" ) );
-                    versionMetadata.addDependency( dependency );
-                }
-                else
+                Node dependenciesNode = node.getNode( "dependencies" );
+                for ( Node n : JcrUtils.getChildNodes( dependenciesNode ) )
                 {
-                    done = true;
+                    if ( n.isNodeType( DEPENDENCY_NODE_TYPE ) )
+                    {
+                        Dependency dependency = new Dependency();
+                        // FIXME: correct these properties
+                        dependency.setArtifactId( getPropertyString( n, "artifactId" ) );
+                        dependency.setGroupId( getPropertyString( n, "groupId" ) );
+                        dependency.setClassifier( getPropertyString( n, "classifier" ) );
+                        dependency.setOptional( Boolean.valueOf( getPropertyString( n, "optional" ) ) );
+                        dependency.setScope( getPropertyString( n, "scope" ) );
+                        dependency.setSystemPath( getPropertyString( n, "systemPath" ) );
+                        dependency.setType( getPropertyString( n, "type" ) );
+                        dependency.setVersion( getPropertyString( n, "version" ) );
+                        versionMetadata.addDependency( dependency );
+                    }
                 }
-                i++;
             }
 
             for ( Node n : JcrUtils.getChildNodes( node ) )