Author: ogusakov
Date: Wed Jun 25 18:41:12 2008
New Revision: 671704

URL: http://svn.apache.org/viewvc?rev=671704&view=rev
Log:
started the MetadataTree - the builder. Added circular dependency check

Modified:
    
maven/sandbox/trunk/mercury/src/main/java/org/apache/maven/mercury/metadata/ArtifactMetadata.java
    
maven/sandbox/trunk/mercury/src/main/java/org/apache/maven/mercury/metadata/MetadataSource.java
    
maven/sandbox/trunk/mercury/src/main/java/org/apache/maven/mercury/metadata/MetadataTree.java
    
maven/sandbox/trunk/mercury/src/test/java/org/apache/maven/mercury/metadata/MetadataTreeTest.java
    
maven/sandbox/trunk/mercury/src/test/java/org/apache/maven/mercury/metadata/MockMetadataSource.java

Modified: 
maven/sandbox/trunk/mercury/src/main/java/org/apache/maven/mercury/metadata/ArtifactMetadata.java
URL: 
http://svn.apache.org/viewvc/maven/sandbox/trunk/mercury/src/main/java/org/apache/maven/mercury/metadata/ArtifactMetadata.java?rev=671704&r1=671703&r2=671704&view=diff
==============================================================================
--- 
maven/sandbox/trunk/mercury/src/main/java/org/apache/maven/mercury/metadata/ArtifactMetadata.java
 (original)
+++ 
maven/sandbox/trunk/mercury/src/main/java/org/apache/maven/mercury/metadata/ArtifactMetadata.java
 Wed Jun 25 18:41:12 2008
@@ -57,7 +57,7 @@
     /**
      * for testing - required for mock MetadataSource
      */
-    protected ArtifactMetadata()
+    public ArtifactMetadata()
     {
     }
     //------------------------------------------------------------------

Modified: 
maven/sandbox/trunk/mercury/src/main/java/org/apache/maven/mercury/metadata/MetadataSource.java
URL: 
http://svn.apache.org/viewvc/maven/sandbox/trunk/mercury/src/main/java/org/apache/maven/mercury/metadata/MetadataSource.java?rev=671704&r1=671703&r2=671704&view=diff
==============================================================================
--- 
maven/sandbox/trunk/mercury/src/main/java/org/apache/maven/mercury/metadata/MetadataSource.java
 (original)
+++ 
maven/sandbox/trunk/mercury/src/main/java/org/apache/maven/mercury/metadata/MetadataSource.java
 Wed Jun 25 18:41:12 2008
@@ -57,9 +57,9 @@
         throws MetadataRetrievalException;
 
     /**
-     * returns all existing versions, treating the provided metadata as a query
+     * returns all existing versions of the supplied artifact, treating the 
provided metadata as a query. This is used by the tree builder
      * 
-     * @param metadata
+     * @param metadataQuery metadata to look for: ranges, etc.
      * @param localRepository
      * @param remoteRepositories
      * @return

Modified: 
maven/sandbox/trunk/mercury/src/main/java/org/apache/maven/mercury/metadata/MetadataTree.java
URL: 
http://svn.apache.org/viewvc/maven/sandbox/trunk/mercury/src/main/java/org/apache/maven/mercury/metadata/MetadataTree.java?rev=671704&r1=671703&r2=671704&view=diff
==============================================================================
--- 
maven/sandbox/trunk/mercury/src/main/java/org/apache/maven/mercury/metadata/MetadataTree.java
 (original)
+++ 
maven/sandbox/trunk/mercury/src/main/java/org/apache/maven/mercury/metadata/MetadataTree.java
 Wed Jun 25 18:41:12 2008
@@ -22,8 +22,7 @@
   private Set<RemoteRepository> remoteRepositories;
   
   public MetadataTree(
-        ArtifactMetadata startMD
-      , MetadataSource mdSource
+        MetadataSource mdSource
       , Set<MetadataTreeArtifactFilter> filters
       , List<MetadataTreeArtifactFilter> sorters
       , LocalRepository localRepository
@@ -49,20 +48,23 @@
     if( localRepository == null )
       throw new MetadataTreeException( "null local repo" );
     
-    MetadataTreeNode root = createNode( startMD, null );
+    MetadataTreeNode root = createNode( startMD, null, startMD );
     return root;
   }
   //-----------------------------------------------------
-  private MetadataTreeNode createNode( ArtifactMetadata nodeQuery, 
MetadataTreeNode parent )
+  private MetadataTreeNode createNode( ArtifactMetadata nodeMD, 
MetadataTreeNode parent, ArtifactMetadata nodeQuery )
   throws MetadataTreeException
   {
+    checkForCircularDependency( nodeMD, parent );
+
     MetadataResolution mr;
+    
     try
     {
-      mr = mdSource.retrieve(nodeQuery, localRepository, remoteRepositories );
+      mr = mdSource.retrieve( nodeMD, localRepository, remoteRepositories );
 
       if( mr == null || mr.getArtifactMetadata() == null )
-        throw new MetadataTreeException( "no result found for " + nodeQuery );
+        throw new MetadataTreeException( "no result found for " + nodeMD );
       
       MetadataTreeNode node = new MetadataTreeNode( mr.getArtifactMetadata(), 
parent, nodeQuery );
   
@@ -87,7 +89,7 @@
           if( veto( ver, filters) )
             continue;
           
-          MetadataTreeNode kid = createNode( ver, node );
+          MetadataTreeNode kid = createNode( ver, node, md );
           node.addChild( kid );
           
           noGoodVersions = false;
@@ -103,7 +105,7 @@
         node.addQuery(md);
       }
     
-    return node;
+      return node;
     }
     catch (MetadataRetrievalException e)
     {
@@ -111,6 +113,17 @@
     }
   }
   //-----------------------------------------------------
+  private void checkForCircularDependency( ArtifactMetadata md, 
MetadataTreeNode parent )
+  throws MetadataTreeException
+  {
+    MetadataTreeNode p = parent;
+    while( p != null )
+    {
+      if( md.sameGA(p.md) )
+        throw new MetadataTreeException("circular dependency for " + md );
+    }
+  }
+  //-----------------------------------------------------
   private boolean veto(ArtifactMetadata md, Set<MetadataTreeArtifactFilter> 
filters )
   {
     if( filters != null && filters.size() > 1)

Modified: 
maven/sandbox/trunk/mercury/src/test/java/org/apache/maven/mercury/metadata/MetadataTreeTest.java
URL: 
http://svn.apache.org/viewvc/maven/sandbox/trunk/mercury/src/test/java/org/apache/maven/mercury/metadata/MetadataTreeTest.java?rev=671704&r1=671703&r2=671704&view=diff
==============================================================================
--- 
maven/sandbox/trunk/mercury/src/test/java/org/apache/maven/mercury/metadata/MetadataTreeTest.java
 (original)
+++ 
maven/sandbox/trunk/mercury/src/test/java/org/apache/maven/mercury/metadata/MetadataTreeTest.java
 Wed Jun 25 18:41:12 2008
@@ -1,15 +1,37 @@
 package org.apache.maven.mercury.metadata;
 
+import java.io.File;
+
 import junit.framework.TestCase;
 
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.impl.LogFactoryImpl;
+import org.apache.maven.mercury.repository.DefaultLocalRepository;
+
 public class MetadataTreeTest
-    extends TestCase
+extends TestCase
 {
+  private static final Log log = LogFactoryImpl.getLog( MetadataTreeTest.class 
);
+  
+//ArtifactMetadata md = new ArtifactMetadata( "pmd:pmd:3.9" );
+  ArtifactMetadata md = new ArtifactMetadata( "a:a:1" );
+  MetadataTree mt;
+  MockMetadataSource mms = new MockMetadataSource();
 
   @Override
-  protected void setUp() throws Exception
+  protected void setUp()
+  throws Exception
   {
-    super.setUp();
+System.out.println("Current dir is "+ new File(".").getCanonicalPath() );
+    mms = new MockMetadataSource();
+    
+    mt = new MetadataTree( 
+          mms
+        , null
+        , null
+        , new DefaultLocalRepository( "local", null, new 
File("./target/test-classes/controlledRepo") )
+        , null
+                          );
   }
 
   @Override
@@ -19,8 +41,11 @@
   }
   
   public void testBuildTree()
+  throws MetadataTreeException
   {
+    MetadataTreeNode root = mt.buildTree( md );
     
+    System.out.println( "got tree of "+root.countNodes() );
   }
 
 }

Modified: 
maven/sandbox/trunk/mercury/src/test/java/org/apache/maven/mercury/metadata/MockMetadataSource.java
URL: 
http://svn.apache.org/viewvc/maven/sandbox/trunk/mercury/src/test/java/org/apache/maven/mercury/metadata/MockMetadataSource.java?rev=671704&r1=671703&r2=671704&view=diff
==============================================================================
--- 
maven/sandbox/trunk/mercury/src/test/java/org/apache/maven/mercury/metadata/MockMetadataSource.java
 (original)
+++ 
maven/sandbox/trunk/mercury/src/test/java/org/apache/maven/mercury/metadata/MockMetadataSource.java
 Wed Jun 25 18:41:12 2008
@@ -12,23 +12,54 @@
 import org.apache.maven.mercury.repository.LocalRepository;
 import org.apache.maven.mercury.repository.RemoteRepository;
 import org.apache.maven.mercury.repository.layout.RepositoryLayout;
+import org.mortbay.log.Log;
 import org.xml.sax.SAXException;
 
 public class MockMetadataSource
 implements MetadataSource
 {
 
-  public Collection<ArtifactMetadata> expand(ArtifactMetadata metadataQuery,
-      LocalRepository localRepository, Set<RemoteRepository> 
remoteRepositories)
+  public Collection<ArtifactMetadata> expand(
+                    ArtifactMetadata mdq
+                  , LocalRepository localRepository
+                  , Set<RemoteRepository> remoteRepositories
+                                        )
       throws MetadataRetrievalException
   {
-    // TODO Auto-generated method stub
-    return null;
+    if( localRepository == null || mdq == null )
+      return null;
+    
+    File queryDir = new File( localRepository.getDirectory(), 
mdq.groupId.replace('.', File.separatorChar)+File.separatorChar+mdq.artifactId 
);
+    if( !queryDir.exists() || !queryDir.isDirectory() )
+      return null;
+    
+    File [] files = queryDir.listFiles();
+    
+    if( files == null || files.length < 1 )
+      return null;
+    
+    ArrayList<ArtifactMetadata> res = new ArrayList<ArtifactMetadata>( 
files.length );
+    for( File f : files )
+    {
+      if( !f.isDirectory() )
+        continue;
+      File pom = new File( f, mdq.artifactId+"-"+f.getName()+".pom" );
+      if( pom.exists() )
+      {
+        ArtifactMetadata md = getMD(pom);
+        res.add(md);
+      }
+    }
+
+Log.info("Expanded "+mdq+" into:\n"+res );
+    return res;
   }
-  
 
-  public MetadataResolution retrieve(ArtifactMetadata metadata,
-      LocalRepository localRepository, Set<RemoteRepository> 
remoteRepositories)
+  public MetadataResolution retrieve( 
+                      ArtifactMetadata metadata
+                    , LocalRepository localRepository
+                    , Set<RemoteRepository> remoteRepositories
+                                    )
       throws MetadataRetrievalException
   {
     if( localRepository == null || metadata == null )
@@ -36,7 +67,7 @@
 
     try
     {
-      metadata.setDependencies( getMD( localRepository.getDirectory(), 
metadata) );
+      metadata.setDependencies( getDeps( localRepository.getDirectory(), 
metadata) );
       MetadataResolution mr = new MetadataResolution(metadata);
       
       return mr;
@@ -48,7 +79,7 @@
     }
   }
   
-  private static final List<ArtifactMetadata> getMD( File repo, 
ArtifactMetadata md )
+  private static final List<ArtifactMetadata> getDeps( File repo, 
ArtifactMetadata md )
   throws IOException, SAXException
   {
     File pom = new File( repo, md.groupId.replace('.', '/')
@@ -72,6 +103,37 @@
     return dc.mds;
   }
   
+  private static final ArtifactMetadata getMD( File pom )
+  throws MetadataRetrievalException
+  {
+    Digester digester = new Digester();
+    digester.setValidating(false);
+    digester.addObjectCreate( "project", ArtifactMetadata.class );
+    digester.addCallMethod("project/groupId", "setGroupId", 1 );
+    digester.addCallParam( "project/groupId", 0 );
+    digester.addCallMethod("project/artifactId", "setArtifactId", 1 );
+    digester.addCallParam( "project/artifactId", 0 );
+    digester.addCallMethod("project/version", "setVersion", 1 );
+    digester.addCallParam( "project/version", 0 );
+    digester.addCallMethod("project/packaging", "setType", 1 );
+    digester.addCallParam( "project/packaging", 0 );
+    
+    ArtifactMetadata md;
+    try
+    {
+      md = (ArtifactMetadata) digester.parse(pom);
+    }
+    catch (Exception e)
+    {
+      throw new MetadataRetrievalException(e);
+    }
+    
+    if( md.getType() == null )
+      md.setType("jar");
+    
+    return md;
+  }
+  
   public static void main( String[] args )
   throws MetadataRetrievalException
   {
@@ -81,7 +143,7 @@
   }
 
 }
-
+//==============================================================================================
 class DependencyCreator
 {
   List<ArtifactMetadata> mds = new ArrayList<ArtifactMetadata>(8);
@@ -99,3 +161,4 @@
     mds.add(md);
   }
 }
+//==============================================================================================


Reply via email to