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);
}
}
+//==============================================================================================