You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@archiva.apache.org by jo...@apache.org on 2007/06/14 17:25:48 UTC

svn commit: r547277 [15/16] - in /maven/archiva/trunk: archiva-base/ archiva-base/archiva-consumers/archiva-database-consumers/src/main/java/org/apache/maven/archiva/consumers/database/ archiva-base/archiva-dependency-graph/ archiva-base/archiva-depend...

Modified: maven/archiva/trunk/archiva-base/archiva-repository-layer/src/main/java/org/apache/maven/archiva/repository/project/ProjectModelMerge.java
URL: http://svn.apache.org/viewvc/maven/archiva/trunk/archiva-base/archiva-repository-layer/src/main/java/org/apache/maven/archiva/repository/project/ProjectModelMerge.java?view=diff&rev=547277&r1=547276&r2=547277
==============================================================================
--- maven/archiva/trunk/archiva-base/archiva-repository-layer/src/main/java/org/apache/maven/archiva/repository/project/ProjectModelMerge.java (original)
+++ maven/archiva/trunk/archiva-base/archiva-repository-layer/src/main/java/org/apache/maven/archiva/repository/project/ProjectModelMerge.java Thu Jun 14 08:25:42 2007
@@ -36,15 +36,19 @@
 import java.util.ArrayList;
 import java.util.Enumeration;
 import java.util.HashMap;
+import java.util.HashSet;
 import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
 import java.util.Properties;
+import java.util.Set;
 import java.util.Map.Entry;
 
 /**
  * ProjectModelMerge
  *
+ * TODO: Should call this ProjectModelAncestry as it deals with the current project and its parent.
+ *
  * @author <a href="mailto:joakim@erdfelt.com">Joakim Erdfelt</a>
  * @version $Id$
  */
@@ -75,6 +79,7 @@
         // Unmerged.
         merged.setArtifactId( mainProject.getArtifactId() );
         merged.setPackaging( StringUtils.defaultIfEmpty( mainProject.getPackaging(), "jar" ) );
+        merged.setRelocation( mainProject.getRelocation() );
 
         // Merged
         merged.setGroupId( merge( mainProject.getGroupId(), parentProject.getGroupId() ) );
@@ -98,7 +103,7 @@
         merged.setPlugins( mergePlugins( mainProject.getPlugins(), parentProject.getPlugins() ) );
         merged.setReports( mergeReports( mainProject.getReports(), parentProject.getReports() ) );
         merged.setProperties( merge( mainProject.getProperties(), parentProject.getProperties() ) );
-
+        
         return merged;
     }
 
@@ -245,11 +250,15 @@
 
         if ( mainDep == null )
         {
-            return ArchivaModelCloner.clone( parentDep );
+            Dependency dep = ArchivaModelCloner.clone( parentDep );
+            dep.setFromParent( true );
+            return dep;
         }
 
         Dependency merged = new Dependency();
 
+        merged.setFromParent( true );
+
         // Unmerged.
         merged.setGroupId( mainDep.getGroupId() );
         merged.setArtifactId( mainDep.getArtifactId() );
@@ -415,28 +424,40 @@
 
         if ( mainDependencies == null )
         {
-            return ArchivaModelCloner.cloneDependencies( parentDependencies );
+            List merged = ArchivaModelCloner.cloneDependencies( parentDependencies );
+            Iterator it = merged.iterator();
+            while ( it.hasNext() )
+            {
+                Dependency dep = (Dependency) it.next();
+                dep.setFromParent( true );
+            }
+            return merged;
         }
 
-        List merged = ArchivaModelCloner.cloneDependencies( mainDependencies );
+        List merged = new ArrayList();
 
         Map mainDepMap = createDependencyMap( mainDependencies );
         Map parentDepMap = createDependencyMap( parentDependencies );
+        Set uniqueKeys = new HashSet();
+        uniqueKeys.addAll( mainDepMap.keySet() );
+        uniqueKeys.addAll( parentDepMap.keySet() );
 
-        Iterator it = parentDepMap.entrySet().iterator();
+        Iterator it = uniqueKeys.iterator();
         while ( it.hasNext() )
         {
-            Map.Entry entry = (Entry) it.next();
-            String key = (String) entry.getKey();
-            Dependency parentDep = (Dependency) entry.getValue();
+            String key = (String) it.next();
+            Dependency parentDep = (Dependency) parentDepMap.get( key );
             Dependency mainDep = (Dependency) mainDepMap.get( key );
 
             if ( parentDep == null )
             {
+                // Means there is no parent dep to override main dep.
                 merged.add( mainDep );
             }
             else
             {
+                // Parent dep exists (main doesn't have to).
+                // Merge the parent over the main dep.
                 merged.add( merge( mainDep, parentDep ) );
             }
         }
@@ -453,28 +474,40 @@
 
         if ( mainDepMgmt == null )
         {
-            return ArchivaModelCloner.cloneDependencies( parentDepMgmt );
+            List merged = ArchivaModelCloner.cloneDependencies( parentDepMgmt );
+            Iterator it = merged.iterator();
+            while ( it.hasNext() )
+            {
+                Dependency dep = (Dependency) it.next();
+                dep.setFromParent( true );
+            }
+            return merged;
         }
 
-        List merged = ArchivaModelCloner.cloneDependencies( mainDepMgmt );
+        List merged = new ArrayList();
 
         Map mainDepMap = createDependencyMap( mainDepMgmt );
         Map parentDepMap = createDependencyMap( parentDepMgmt );
+        Set uniqueKeys = new HashSet();
+        uniqueKeys.addAll( mainDepMap.keySet() );
+        uniqueKeys.addAll( parentDepMap.keySet() );
 
-        Iterator it = parentDepMap.entrySet().iterator();
+        Iterator it = uniqueKeys.iterator();
         while ( it.hasNext() )
         {
-            Map.Entry entry = (Entry) it.next();
-            String key = (String) entry.getKey();
-            Dependency parentDep = (Dependency) entry.getValue();
+            String key = (String) it.next();
+            Dependency parentDep = (Dependency) parentDepMap.get( key );
             Dependency mainDep = (Dependency) mainDepMap.get( key );
 
             if ( parentDep == null )
             {
+                // Means there is no parent depMan entry to override main depMan.
                 merged.add( mainDep );
             }
             else
             {
+                // Parent depMan entry exists (main doesn't have to).
+                // Merge the parent over the main depMan entry.
                 merged.add( merge( mainDep, parentDep ) );
             }
         }

Added: maven/archiva/trunk/archiva-base/archiva-repository-layer/src/main/java/org/apache/maven/archiva/repository/project/dependencies/ProjectModelBasedGraphBuilder.java
URL: http://svn.apache.org/viewvc/maven/archiva/trunk/archiva-base/archiva-repository-layer/src/main/java/org/apache/maven/archiva/repository/project/dependencies/ProjectModelBasedGraphBuilder.java?view=auto&rev=547277
==============================================================================
--- maven/archiva/trunk/archiva-base/archiva-repository-layer/src/main/java/org/apache/maven/archiva/repository/project/dependencies/ProjectModelBasedGraphBuilder.java (added)
+++ maven/archiva/trunk/archiva-base/archiva-repository-layer/src/main/java/org/apache/maven/archiva/repository/project/dependencies/ProjectModelBasedGraphBuilder.java Thu Jun 14 08:25:42 2007
@@ -0,0 +1,116 @@
+package org.apache.maven.archiva.repository.project.dependencies;
+
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *  http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+import org.apache.maven.archiva.dependency.graph.DependencyGraph;
+import org.apache.maven.archiva.dependency.graph.DependencyGraphBuilder;
+import org.apache.maven.archiva.dependency.graph.DependencyGraphNode;
+import org.apache.maven.archiva.dependency.graph.DependencyGraphUtils;
+import org.apache.maven.archiva.model.ArchivaProjectModel;
+import org.apache.maven.archiva.model.ArtifactReference;
+import org.apache.maven.archiva.model.VersionedReference;
+import org.apache.maven.archiva.repository.project.ProjectModelException;
+import org.apache.maven.archiva.repository.project.filters.EffectiveProjectModelFilter;
+import org.apache.maven.archiva.repository.project.resolvers.ProjectModelResolverStack;
+
+/**
+ * ProjectModelBasedGraphBuilder 
+ *
+ * @author <a href="mailto:joakim@erdfelt.com">Joakim Erdfelt</a>
+ * @version $Id$
+ */
+public class ProjectModelBasedGraphBuilder
+    implements DependencyGraphBuilder
+{
+    private ProjectModelResolverStack modelResolver;
+
+    private EffectiveProjectModelFilter effectiveFilter = new EffectiveProjectModelFilter();
+
+    public DependencyGraph createGraph( VersionedReference versionedProjectReference )
+    {
+        String groupId = versionedProjectReference.getGroupId();
+        String artifactId = versionedProjectReference.getArtifactId();
+        String version = versionedProjectReference.getVersion();
+
+        DependencyGraph graph = new DependencyGraph( groupId, artifactId, version );
+        return graph;
+    }
+
+    public void resolveNode( DependencyGraph graph, DependencyGraphNode fromNode,
+                             VersionedReference versionedProjectReference )
+    {
+        ArchivaProjectModel model = resolveModel( fromNode.getArtifact() );
+        
+        DependencyGraphUtils.addNodeFromModel( model, graph, fromNode );
+    }
+
+    private ArchivaProjectModel resolveModel( ArtifactReference reference )
+    {
+        VersionedReference projectRef = new VersionedReference();
+
+        projectRef.setGroupId( reference.getGroupId() );
+        projectRef.setArtifactId( reference.getArtifactId() );
+        projectRef.setVersion( reference.getVersion() );
+
+        ArchivaProjectModel model = modelResolver.findProject( projectRef );
+
+        if ( model == null )
+        {
+            return createDefaultModel( reference );
+        }
+
+        try
+        {
+            effectiveFilter.setProjectModelResolverStack( modelResolver );
+
+            ArchivaProjectModel processedModel = effectiveFilter.filter( model );
+
+            return processedModel;
+        }
+        catch ( ProjectModelException e )
+        {
+            e.printStackTrace( System.err );
+            return createDefaultModel( reference );
+        }
+    }
+
+    private ArchivaProjectModel createDefaultModel( ArtifactReference reference )
+    {
+        ArchivaProjectModel model = new ArchivaProjectModel();
+
+        // Create default (dummy) model
+        model = new ArchivaProjectModel();
+        model.setGroupId( reference.getGroupId() );
+        model.setArtifactId( reference.getArtifactId() );
+        model.setVersion( reference.getVersion() );
+        model.setPackaging( reference.getType() );
+        return model;
+    }
+
+    public ProjectModelResolverStack getModelResolver()
+    {
+        return modelResolver;
+    }
+
+    public void setModelResolver( ProjectModelResolverStack modelResolver )
+    {
+        this.modelResolver = modelResolver;
+    }
+}

Propchange: maven/archiva/trunk/archiva-base/archiva-repository-layer/src/main/java/org/apache/maven/archiva/repository/project/dependencies/ProjectModelBasedGraphBuilder.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: maven/archiva/trunk/archiva-base/archiva-repository-layer/src/main/java/org/apache/maven/archiva/repository/project/dependencies/ProjectModelBasedGraphBuilder.java
------------------------------------------------------------------------------
    svn:keywords = Author Date Id Revision

Propchange: maven/archiva/trunk/archiva-base/archiva-repository-layer/src/main/java/org/apache/maven/archiva/repository/project/dependencies/ProjectModelBasedGraphBuilder.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Modified: maven/archiva/trunk/archiva-base/archiva-repository-layer/src/main/java/org/apache/maven/archiva/repository/project/filters/EffectiveProjectModelFilter.java
URL: http://svn.apache.org/viewvc/maven/archiva/trunk/archiva-base/archiva-repository-layer/src/main/java/org/apache/maven/archiva/repository/project/filters/EffectiveProjectModelFilter.java?view=diff&rev=547277&r1=547276&r2=547277
==============================================================================
--- maven/archiva/trunk/archiva-base/archiva-repository-layer/src/main/java/org/apache/maven/archiva/repository/project/filters/EffectiveProjectModelFilter.java (original)
+++ maven/archiva/trunk/archiva-base/archiva-repository-layer/src/main/java/org/apache/maven/archiva/repository/project/filters/EffectiveProjectModelFilter.java Thu Jun 14 08:25:42 2007
@@ -19,6 +19,7 @@
  * under the License.
  */
 
+import org.apache.commons.collections.CollectionUtils;
 import org.apache.commons.lang.StringUtils;
 import org.apache.maven.archiva.model.ArchivaModelCloner;
 import org.apache.maven.archiva.model.ArchivaProjectModel;
@@ -27,10 +28,11 @@
 import org.apache.maven.archiva.repository.project.ProjectModelException;
 import org.apache.maven.archiva.repository.project.ProjectModelFilter;
 import org.apache.maven.archiva.repository.project.ProjectModelMerge;
-import org.apache.maven.archiva.repository.project.ProjectModelResolver;
+import org.apache.maven.archiva.repository.project.resolvers.ProjectModelResolverStack;
 import org.codehaus.plexus.logging.AbstractLogEnabled;
+import org.codehaus.plexus.logging.Logger;
+import org.codehaus.plexus.logging.console.ConsoleLogger;
 
-import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.Iterator;
 import java.util.List;
@@ -48,26 +50,23 @@
     extends AbstractLogEnabled
     implements ProjectModelFilter
 {
-    /**
-     * @plexus.requirement role-hint="expression"
-     */
-    private ProjectModelFilter expressionFilter;
+    private ProjectModelFilter expressionFilter = new ProjectModelExpressionFilter();
 
-    private List projectModelResolvers;
+    private ProjectModelResolverStack projectModelResolverStack;
 
     public EffectiveProjectModelFilter()
     {
-        projectModelResolvers = new ArrayList();
+        projectModelResolverStack = new ProjectModelResolverStack();
     }
 
-    public void addProjectModelResolver( ProjectModelResolver resolver )
+    public void setProjectModelResolverStack( ProjectModelResolverStack resolverStack )
     {
-        if ( resolver == null )
-        {
-            return;
-        }
+        this.projectModelResolverStack = resolverStack;
+    }
 
-        this.projectModelResolvers.add( resolver );
+    public ProjectModelResolverStack getProjectModelResolverStack()
+    {
+        return this.projectModelResolverStack;
     }
 
     /**
@@ -90,7 +89,7 @@
             return null;
         }
 
-        if ( this.projectModelResolvers.isEmpty() )
+        if ( this.projectModelResolverStack.isEmpty() )
         {
             throw new IllegalStateException( "Unable to build effective pom with no project model resolvers defined." );
         }
@@ -113,25 +112,26 @@
         return effectiveProject;
     }
 
-    public void removeResolver( ProjectModelResolver resolver )
-    {
-        this.projectModelResolvers.remove( resolver );
-    }
+    private Logger logger;
 
-    public void clearResolvers()
+    protected Logger getLogger()
     {
-        this.projectModelResolvers.clear();
+        if ( logger == null )
+        {
+            logger = super.getLogger();
+            if ( logger == null )
+            {
+                logger = new ConsoleLogger( ConsoleLogger.LEVEL_INFO, this.getClass().getName() );
+            }
+        }
+
+        return logger;
     }
 
     private void applyDependencyManagement( ArchivaProjectModel pom )
     {
-        if ( ( pom.getDependencyManagement() == null ) || ( pom.getDependencies() == null ) )
-        {
-            // Nothing to do. All done!
-            return;
-        }
-
-        if ( pom.getDependencyManagement().isEmpty() || pom.getDependencies().isEmpty() )
+        if ( CollectionUtils.isEmpty( pom.getDependencyManagement() )
+            || CollectionUtils.isEmpty( pom.getDependencies() ) )
         {
             // Nothing to do. All done!
             return;
@@ -156,39 +156,6 @@
         }
     }
 
-    private ArchivaProjectModel findProject( VersionedReference projectRef )
-    {
-        getLogger().debug( "Trying to find project: " + projectRef );
-        Iterator it = this.projectModelResolvers.iterator();
-
-        while ( it.hasNext() )
-        {
-            ProjectModelResolver resolver = (ProjectModelResolver) it.next();
-
-            try
-            {
-                getLogger().debug( "Trying to find in " + resolver.getClass().getName() );
-                ArchivaProjectModel model = resolver.resolveProjectModel( projectRef );
-
-                if ( model != null )
-                {
-                    getLogger().debug( "Found it!: " + model );
-                    return model;
-                }
-                getLogger().debug( "Not found." );
-            }
-            catch ( ProjectModelException e )
-            {
-                // TODO: trigger notifier of problem?
-                e.printStackTrace();
-            }
-        }
-
-        // TODO: Document that project was not found. (Use monitor?)
-
-        return null;
-    }
-
     private ArchivaProjectModel mergeParent( ArchivaProjectModel pom )
         throws ProjectModelException
     {
@@ -204,7 +171,7 @@
             getLogger().debug( "Has parent: " + parentRef );
 
             // Find parent using resolvers.
-            ArchivaProjectModel parentProject = findProject( parentRef );
+            ArchivaProjectModel parentProject = this.projectModelResolverStack.findProject( parentRef );
 
             if ( parentProject != null )
             {

Modified: maven/archiva/trunk/archiva-base/archiva-repository-layer/src/main/java/org/apache/maven/archiva/repository/project/filters/ProjectModelExpressionFilter.java
URL: http://svn.apache.org/viewvc/maven/archiva/trunk/archiva-base/archiva-repository-layer/src/main/java/org/apache/maven/archiva/repository/project/filters/ProjectModelExpressionFilter.java?view=diff&rev=547277&r1=547276&r2=547277
==============================================================================
--- maven/archiva/trunk/archiva-base/archiva-repository-layer/src/main/java/org/apache/maven/archiva/repository/project/filters/ProjectModelExpressionFilter.java (original)
+++ maven/archiva/trunk/archiva-base/archiva-repository-layer/src/main/java/org/apache/maven/archiva/repository/project/filters/ProjectModelExpressionFilter.java Thu Jun 14 08:25:42 2007
@@ -20,11 +20,13 @@
  */
 
 import org.apache.commons.collections.CollectionUtils;
+import org.apache.commons.lang.StringUtils;
 import org.apache.maven.archiva.model.ArchivaModelCloner;
 import org.apache.maven.archiva.model.ArchivaProjectModel;
 import org.apache.maven.archiva.model.Dependency;
 import org.apache.maven.archiva.repository.project.ProjectModelException;
 import org.apache.maven.archiva.repository.project.ProjectModelFilter;
+import org.codehaus.plexus.evaluator.DefaultExpressionEvaluator;
 import org.codehaus.plexus.evaluator.EvaluatorException;
 import org.codehaus.plexus.evaluator.ExpressionEvaluator;
 import org.codehaus.plexus.evaluator.sources.PropertiesExpressionSource;
@@ -32,6 +34,7 @@
 
 import java.util.Iterator;
 import java.util.List;
+import java.util.Properties;
 
 /**
  * ProjectModelExpressionFilter 
@@ -45,10 +48,7 @@
 public class ProjectModelExpressionFilter
     implements ProjectModelFilter
 {
-    /**
-     * @plexus.requirement
-     */
-    private ExpressionEvaluator evaluator;
+    private ExpressionEvaluator evaluator = new DefaultExpressionEvaluator();
 
     /**
      * Find and Evaluate the Expressions present in the model.
@@ -58,13 +58,21 @@
     public ArchivaProjectModel filter( final ArchivaProjectModel model )
         throws ProjectModelException
     {
+        Properties props = new Properties();
+
         if ( model.getProperties() != null )
         {
-            PropertiesExpressionSource propsSource = new PropertiesExpressionSource();
-            propsSource.setProperties( model.getProperties() );
-            evaluator.addExpressionSource( propsSource );
+            props.putAll( model.getProperties() );
         }
 
+        props.setProperty( "pom.artifactId", model.getArtifactId() );
+
+        props.setProperty( "pom.groupId", StringUtils.defaultString( model.getGroupId() ) );
+        props.setProperty( "pom.version", StringUtils.defaultString( model.getVersion() ) );
+
+        PropertiesExpressionSource propsSource = new PropertiesExpressionSource();
+        propsSource.setProperties( props );
+        evaluator.addExpressionSource( propsSource );
         evaluator.addExpressionSource( new SystemPropertyExpressionSource() );
 
         ArchivaProjectModel ret = ArchivaModelCloner.clone( model );

Modified: maven/archiva/trunk/archiva-base/archiva-repository-layer/src/main/java/org/apache/maven/archiva/repository/project/readers/ProjectModel400Reader.java
URL: http://svn.apache.org/viewvc/maven/archiva/trunk/archiva-base/archiva-repository-layer/src/main/java/org/apache/maven/archiva/repository/project/readers/ProjectModel400Reader.java?view=diff&rev=547277&r1=547276&r2=547277
==============================================================================
--- maven/archiva/trunk/archiva-base/archiva-repository-layer/src/main/java/org/apache/maven/archiva/repository/project/readers/ProjectModel400Reader.java (original)
+++ maven/archiva/trunk/archiva-base/archiva-repository-layer/src/main/java/org/apache/maven/archiva/repository/project/readers/ProjectModel400Reader.java Thu Jun 14 08:25:42 2007
@@ -107,6 +107,8 @@
 
             model.setBuildExtensions( getBuildExtensions( xml ) );
 
+            model.setRelocation( getRelocation( xml ) );
+
             return model;
         }
         catch ( XMLException e )
@@ -451,6 +453,19 @@
         }
 
         return ret;
+    }
+
+    private VersionedReference getRelocation( XMLReader xml )
+        throws XMLException
+    {
+        Element elemRelocation = xml.getElement( "//project/distributionManagement/relocation" );
+
+        if ( elemRelocation != null )
+        {
+            return getVersionedReference( elemRelocation );
+        }
+
+        return null;
     }
 
     private List getReports( XMLReader xml )

Added: maven/archiva/trunk/archiva-base/archiva-repository-layer/src/main/java/org/apache/maven/archiva/repository/project/resolvers/ProjectModelResolutionListener.java
URL: http://svn.apache.org/viewvc/maven/archiva/trunk/archiva-base/archiva-repository-layer/src/main/java/org/apache/maven/archiva/repository/project/resolvers/ProjectModelResolutionListener.java?view=auto&rev=547277
==============================================================================
--- maven/archiva/trunk/archiva-base/archiva-repository-layer/src/main/java/org/apache/maven/archiva/repository/project/resolvers/ProjectModelResolutionListener.java (added)
+++ maven/archiva/trunk/archiva-base/archiva-repository-layer/src/main/java/org/apache/maven/archiva/repository/project/resolvers/ProjectModelResolutionListener.java Thu Jun 14 08:25:42 2007
@@ -0,0 +1,78 @@
+package org.apache.maven.archiva.repository.project.resolvers;
+
+import org.apache.maven.archiva.model.ArchivaProjectModel;
+import org.apache.maven.archiva.model.VersionedReference;
+import org.apache.maven.archiva.repository.project.ProjectModelResolver;
+
+import java.util.List;
+
+/**
+ * ProjectModelResolutionListener 
+ *
+ * @author <a href="mailto:joakim@erdfelt.com">Joakim Erdfelt</a>
+ * @version $Id$
+ */
+public interface ProjectModelResolutionListener
+{
+    /**
+     * Indicates that the resolution process has started for a specific project.
+     * 
+     * @param projectRef the project reference.
+     * @param resolverList the {@link List} of {@link ProjectModelResolver}'s that will be searched.
+     * @see #resolutionSuccess(VersionedReference, ProjectModelResolver, ArchivaProjectModel)
+     * @see #resolutionNotFound(VersionedReference, List)
+     */
+    public void resolutionStart( VersionedReference projectRef, List resolverList );
+
+    /**
+     * Indicates that a resolution against a specific resolver is about 
+     * to occur.
+     * 
+     * @param projectRef the project reference.
+     * @param resolver the resolver to attempt resolution on.
+     */
+    public void resolutionAttempting( VersionedReference projectRef, ProjectModelResolver resolver );
+    
+    /**
+     * Indicates that a resolution against a specific resolver resulted
+     * in in a missed resolution.
+     * 
+     * "Miss" in this case refers to an attempt against a resolver, and that
+     * resolver essentially responds with a "not found here" response.
+     * 
+     * @param projectRef the project reference.
+     * @param resolver the resolver the attempt was made on.
+     */
+    public void resolutionMiss( VersionedReference projectRef, ProjectModelResolver resolver );
+    
+    /**
+     * Indicates that a resolution against the specific resolver has
+     * caused an error.
+     * 
+     * @param projectRef the project reference.
+     * @param resolver the (optional) resolver on which the error occured.
+     * @param cause the cause of the error.
+     */
+    public void resolutionError( VersionedReference projectRef, ProjectModelResolver resolver, Exception cause );
+    
+    /**
+     * Indicates that a resolution process has finished, and the requested
+     * projectRef has been found. 
+     * 
+     * @param projectRef the project reference.
+     * @param resolver the resolver on which success occured.
+     * @param model the resolved model. 
+     * @see #resolutionStart(VersionedReference, List)
+     */
+    public void resolutionSuccess( VersionedReference projectRef, ProjectModelResolver resolver, ArchivaProjectModel model );
+    
+    /**
+     * Indicates that the resolution process has finished, and the requested
+     * projectRef could not be found.
+     * 
+     * @param projectRef the project reference.
+     * @param resolverList the {@link List} of {@link ProjectModelResolver}'s that was be searched.
+     * @see #resolutionStart(VersionedReference, List)
+     */
+    public void resolutionNotFound( VersionedReference projectRef, List resolverList );
+}

Propchange: maven/archiva/trunk/archiva-base/archiva-repository-layer/src/main/java/org/apache/maven/archiva/repository/project/resolvers/ProjectModelResolutionListener.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: maven/archiva/trunk/archiva-base/archiva-repository-layer/src/main/java/org/apache/maven/archiva/repository/project/resolvers/ProjectModelResolutionListener.java
------------------------------------------------------------------------------
    svn:keywords = Author Date Id Revision

Propchange: maven/archiva/trunk/archiva-base/archiva-repository-layer/src/main/java/org/apache/maven/archiva/repository/project/resolvers/ProjectModelResolutionListener.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Added: maven/archiva/trunk/archiva-base/archiva-repository-layer/src/main/java/org/apache/maven/archiva/repository/project/resolvers/ProjectModelResolverStack.java
URL: http://svn.apache.org/viewvc/maven/archiva/trunk/archiva-base/archiva-repository-layer/src/main/java/org/apache/maven/archiva/repository/project/resolvers/ProjectModelResolverStack.java?view=auto&rev=547277
==============================================================================
--- maven/archiva/trunk/archiva-base/archiva-repository-layer/src/main/java/org/apache/maven/archiva/repository/project/resolvers/ProjectModelResolverStack.java (added)
+++ maven/archiva/trunk/archiva-base/archiva-repository-layer/src/main/java/org/apache/maven/archiva/repository/project/resolvers/ProjectModelResolverStack.java Thu Jun 14 08:25:42 2007
@@ -0,0 +1,244 @@
+package org.apache.maven.archiva.repository.project.resolvers;
+
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *  http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+import org.apache.commons.collections.CollectionUtils;
+import org.apache.maven.archiva.model.ArchivaProjectModel;
+import org.apache.maven.archiva.model.VersionedReference;
+import org.apache.maven.archiva.repository.project.ProjectModelException;
+import org.apache.maven.archiva.repository.project.ProjectModelResolver;
+
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+
+/**
+ * Represents a stack of {@link ProjectModelResolver} resolvers for
+ * finding/resolving an ArchivaProjectModel from multiple sources. 
+ *
+ * @author <a href="mailto:joakim@erdfelt.com">Joakim Erdfelt</a>
+ * @version $Id$
+ */
+public class ProjectModelResolverStack
+{
+    private List resolvers;
+
+    private List listeners;
+
+    public ProjectModelResolverStack()
+    {
+        this.resolvers = new ArrayList();
+        this.listeners = new ArrayList();
+    }
+
+    public void addListener( ProjectModelResolutionListener listener )
+    {
+        if ( listener == null )
+        {
+            return;
+        }
+
+        this.listeners.add( listener );
+    }
+
+    public void addProjectModelResolver( ProjectModelResolver resolver )
+    {
+        if ( resolver == null )
+        {
+            return;
+        }
+
+        this.resolvers.add( resolver );
+    }
+
+    public void clearResolvers()
+    {
+        this.resolvers.clear();
+    }
+
+    public ArchivaProjectModel findProject( VersionedReference projectRef )
+    {
+        if ( CollectionUtils.isEmpty( this.resolvers ) )
+        {
+            throw new IllegalStateException( "No resolvers have been defined." );
+        }
+
+        triggerResolutionStart( projectRef, this.resolvers );
+
+        Iterator it = this.resolvers.iterator();
+
+        while ( it.hasNext() )
+        {
+            ProjectModelResolver resolver = (ProjectModelResolver) it.next();
+
+            try
+            {
+                triggerResolutionAttempting( projectRef, resolver );
+                ArchivaProjectModel model = resolver.resolveProjectModel( projectRef );
+
+                if ( model != null )
+                {
+                    // Project was found.
+                    triggerResolutionSuccess( projectRef, resolver, model );
+                    return model;
+                }
+                triggerResolutionMiss( projectRef, resolver );
+            }
+            catch ( ProjectModelException e )
+            {
+                triggerResolutionError( projectRef, resolver, e );
+            }
+        }
+
+        // Project was not found in entire resolver list.
+        triggerResolutionNotFound( projectRef, this.resolvers );
+
+        return null;
+    }
+
+    public boolean isEmpty()
+    {
+        return this.resolvers.isEmpty();
+    }
+
+    public void removeListener( ProjectModelResolutionListener listener )
+    {
+        if ( listener == null )
+        {
+            return;
+        }
+
+        this.listeners.add( listener );
+    }
+
+    public void removeResolver( ProjectModelResolver resolver )
+    {
+        this.resolvers.remove( resolver );
+    }
+
+    private void triggerResolutionAttempting( VersionedReference projectRef, ProjectModelResolver resolver )
+    {
+        Iterator it = this.listeners.iterator();
+        while ( it.hasNext() )
+        {
+            ProjectModelResolutionListener listener = (ProjectModelResolutionListener) it.next();
+
+            try
+            {
+                listener.resolutionAttempting( projectRef, resolver );
+            }
+            catch ( Exception e )
+            {
+                // do nothing with exception.
+            }
+        }
+    }
+
+    private void triggerResolutionError( VersionedReference projectRef, ProjectModelResolver resolver, Exception cause )
+    {
+        Iterator it = this.listeners.iterator();
+        while ( it.hasNext() )
+        {
+            ProjectModelResolutionListener listener = (ProjectModelResolutionListener) it.next();
+
+            try
+            {
+                listener.resolutionError( projectRef, resolver, cause );
+            }
+            catch ( Exception e )
+            {
+                // do nothing with exception.
+            }
+        }
+    }
+
+    private void triggerResolutionMiss( VersionedReference projectRef, ProjectModelResolver resolver )
+    {
+        Iterator it = this.listeners.iterator();
+        while ( it.hasNext() )
+        {
+            ProjectModelResolutionListener listener = (ProjectModelResolutionListener) it.next();
+
+            try
+            {
+                listener.resolutionMiss( projectRef, resolver );
+            }
+            catch ( Exception e )
+            {
+                // do nothing with exception.
+            }
+        }
+    }
+
+    private void triggerResolutionNotFound( VersionedReference projectRef, List resolvers )
+    {
+        Iterator it = this.listeners.iterator();
+        while ( it.hasNext() )
+        {
+            ProjectModelResolutionListener listener = (ProjectModelResolutionListener) it.next();
+
+            try
+            {
+                listener.resolutionNotFound( projectRef, resolvers );
+            }
+            catch ( Exception e )
+            {
+                // do nothing with exception.
+            }
+        }
+    }
+
+    private void triggerResolutionStart( VersionedReference projectRef, List resolvers )
+    {
+        Iterator it = this.listeners.iterator();
+        while ( it.hasNext() )
+        {
+            ProjectModelResolutionListener listener = (ProjectModelResolutionListener) it.next();
+
+            try
+            {
+                listener.resolutionStart( projectRef, resolvers );
+            }
+            catch ( Exception e )
+            {
+                // do nothing with exception.
+            }
+        }
+    }
+
+    private void triggerResolutionSuccess( VersionedReference projectRef, ProjectModelResolver resolver,
+                                           ArchivaProjectModel model )
+    {
+        Iterator it = this.listeners.iterator();
+        while ( it.hasNext() )
+        {
+            ProjectModelResolutionListener listener = (ProjectModelResolutionListener) it.next();
+
+            try
+            {
+                listener.resolutionSuccess( projectRef, resolver, model );
+            }
+            catch ( Exception e )
+            {
+                // do nothing with exception.
+            }
+        }
+    }
+}

Propchange: maven/archiva/trunk/archiva-base/archiva-repository-layer/src/main/java/org/apache/maven/archiva/repository/project/resolvers/ProjectModelResolverStack.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: maven/archiva/trunk/archiva-base/archiva-repository-layer/src/main/java/org/apache/maven/archiva/repository/project/resolvers/ProjectModelResolverStack.java
------------------------------------------------------------------------------
    svn:keywords = Author Date Id Revision

Propchange: maven/archiva/trunk/archiva-base/archiva-repository-layer/src/main/java/org/apache/maven/archiva/repository/project/resolvers/ProjectModelResolverStack.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Modified: maven/archiva/trunk/archiva-base/archiva-repository-layer/src/test/java/org/apache/maven/archiva/repository/project/filters/EffectiveProjectModelFilterTest.java
URL: http://svn.apache.org/viewvc/maven/archiva/trunk/archiva-base/archiva-repository-layer/src/test/java/org/apache/maven/archiva/repository/project/filters/EffectiveProjectModelFilterTest.java?view=diff&rev=547277&r1=547276&r2=547277
==============================================================================
--- maven/archiva/trunk/archiva-base/archiva-repository-layer/src/test/java/org/apache/maven/archiva/repository/project/filters/EffectiveProjectModelFilterTest.java (original)
+++ maven/archiva/trunk/archiva-base/archiva-repository-layer/src/test/java/org/apache/maven/archiva/repository/project/filters/EffectiveProjectModelFilterTest.java Thu Jun 14 08:25:42 2007
@@ -85,7 +85,7 @@
     {
         EffectiveProjectModelFilter filter = lookupEffective();
 
-        filter.addProjectModelResolver( createDefaultRepositoryResolver() );
+        filter.getProjectModelResolverStack().addProjectModelResolver( createDefaultRepositoryResolver() );
 
         ArchivaProjectModel startModel = createArchivaProjectModel( DEFAULT_REPOSITORY
             + "/org/apache/maven/archiva/archiva-model/1.0-SNAPSHOT/archiva-model-1.0-SNAPSHOT.pom" );

Modified: maven/archiva/trunk/archiva-base/pom.xml
URL: http://svn.apache.org/viewvc/maven/archiva/trunk/archiva-base/pom.xml?view=diff&rev=547277&r1=547276&r2=547277
==============================================================================
--- maven/archiva/trunk/archiva-base/pom.xml (original)
+++ maven/archiva/trunk/archiva-base/pom.xml Thu Jun 14 08:25:42 2007
@@ -35,6 +35,7 @@
     <module>archiva-consumers</module>
     <module>archiva-indexer</module>
     <module>archiva-model</module>
+    <module>archiva-dependency-graph</module>
     <module>archiva-repository-layer</module>
     <module>archiva-xml-tools</module>
     <module>archiva-proxy</module>

Propchange: maven/archiva/trunk/tools/
------------------------------------------------------------------------------
--- svn:ignore (added)
+++ svn:ignore Thu Jun 14 08:25:42 2007
@@ -0,0 +1,15 @@
+target
+*~
+.*.swp
+*.log
+*.patch
+*.diff
+*.ipr
+*.iws
+*.iml
+.classpath
+.project
+.m2eclipse
+.settings
+.wtpmodules
+cobertura.ser

Propchange: maven/archiva/trunk/tools/maven-archivadev-plugin/
------------------------------------------------------------------------------
--- svn:ignore (added)
+++ svn:ignore Thu Jun 14 08:25:42 2007
@@ -0,0 +1,15 @@
+target
+*~
+.*.swp
+*.log
+*.patch
+*.diff
+*.ipr
+*.iws
+*.iml
+.classpath
+.project
+.m2eclipse
+.settings
+.wtpmodules
+cobertura.ser

Added: maven/archiva/trunk/tools/maven-archivadev-plugin/pom.xml
URL: http://svn.apache.org/viewvc/maven/archiva/trunk/tools/maven-archivadev-plugin/pom.xml?view=auto&rev=547277
==============================================================================
--- maven/archiva/trunk/tools/maven-archivadev-plugin/pom.xml (added)
+++ maven/archiva/trunk/tools/maven-archivadev-plugin/pom.xml Thu Jun 14 08:25:42 2007
@@ -0,0 +1,96 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+
+  <prerequisites>
+    <maven>2.0.4</maven>
+  </prerequisites>
+
+  <groupId>org.apache.maven.archiva.tools</groupId>
+  <artifactId>maven-archivadev-plugin</artifactId>
+  <packaging>maven-plugin</packaging>
+  <version>1.0-SNAPSHOT</version>
+
+  <name>Archiva Dev Maven Plugin</name>
+
+  <inceptionYear>2007</inceptionYear>
+
+  <developers>
+    <developer>
+      <id>joakime</id>
+      <name>Joakim Erdfelt</name>
+      <email>joakime@apache.org</email>
+      <roles>
+        <role>Developer</role>
+      </roles>
+      <timezone>-5</timezone>
+    </developer>
+  </developers>
+
+  <dependencies>
+    <!-- maven plugin deps -->
+    <dependency>
+      <groupId>org.apache.maven.archiva</groupId>
+      <artifactId>archiva-common</artifactId>
+      <version>1.0-alpha-1</version>
+    </dependency>
+    <dependency>
+      <groupId>commons-collections</groupId>
+      <artifactId>commons-collections</artifactId>
+      <version>3.2</version>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.maven</groupId>
+      <artifactId>maven-artifact</artifactId>
+      <version>${maven.version}</version>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.maven</groupId>
+      <artifactId>maven-plugin-api</artifactId>
+      <version>${maven.version}</version>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.maven.reporting</groupId>
+      <artifactId>maven-reporting-api</artifactId>
+      <version>${maven.version}</version>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.maven</groupId>
+      <artifactId>maven-project</artifactId>
+      <version>${maven.version}</version>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.maven.reporting</groupId>
+      <artifactId>maven-reporting-impl</artifactId>
+      <version>${maven.version}</version>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.maven.shared</groupId>
+      <artifactId>maven-dependency-tree</artifactId>
+      <version>1.0-alpha-2</version>
+    </dependency>
+    <dependency>
+      <groupId>org.codehaus.plexus</groupId>
+      <artifactId>plexus-utils</artifactId>
+      <version>1.2</version>
+    </dependency>
+    <!-- testing deps -->
+    <dependency>
+      <groupId>junit</groupId>
+      <artifactId>junit</artifactId>
+      <version>3.8.1</version>
+      <scope>test</scope>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.maven.shared</groupId>
+      <artifactId>maven-plugin-testing-harness</artifactId>
+      <version>1.0-beta-1</version>
+      <scope>test</scope>
+    </dependency>
+  </dependencies>
+  <properties>
+    <maven.version>2.0.4</maven.version>
+  </properties>
+</project>

Propchange: maven/archiva/trunk/tools/maven-archivadev-plugin/pom.xml
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: maven/archiva/trunk/tools/maven-archivadev-plugin/pom.xml
------------------------------------------------------------------------------
    svn:keywords = "Author Date Id Revision"

Propchange: maven/archiva/trunk/tools/maven-archivadev-plugin/pom.xml
------------------------------------------------------------------------------
    svn:mime-type = text/xml

Added: maven/archiva/trunk/tools/maven-archivadev-plugin/src/main/java/org/apache/maven/archiva/plugins/dev/CreateArchivaDependencyResolutionTestCaseMojo.java
URL: http://svn.apache.org/viewvc/maven/archiva/trunk/tools/maven-archivadev-plugin/src/main/java/org/apache/maven/archiva/plugins/dev/CreateArchivaDependencyResolutionTestCaseMojo.java?view=auto&rev=547277
==============================================================================
--- maven/archiva/trunk/tools/maven-archivadev-plugin/src/main/java/org/apache/maven/archiva/plugins/dev/CreateArchivaDependencyResolutionTestCaseMojo.java (added)
+++ maven/archiva/trunk/tools/maven-archivadev-plugin/src/main/java/org/apache/maven/archiva/plugins/dev/CreateArchivaDependencyResolutionTestCaseMojo.java Thu Jun 14 08:25:42 2007
@@ -0,0 +1,133 @@
+package org.apache.maven.archiva.plugins.dev;
+
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *  http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+import org.apache.maven.archiva.plugins.dev.testgen.DependencyGraphTestCreator;
+import org.apache.maven.archiva.plugins.dev.testgen.MemoryRepositoryCreator;
+import org.apache.maven.archiva.plugins.dev.utils.VariableNames;
+import org.apache.maven.artifact.factory.ArtifactFactory;
+import org.apache.maven.artifact.metadata.ArtifactMetadataSource;
+import org.apache.maven.artifact.repository.ArtifactRepository;
+import org.apache.maven.artifact.resolver.ArtifactCollector;
+import org.apache.maven.plugin.AbstractMojo;
+import org.apache.maven.plugin.MojoExecutionException;
+import org.apache.maven.plugin.MojoFailureException;
+import org.apache.maven.project.MavenProject;
+import org.apache.maven.shared.dependency.tree.DependencyTreeBuilder;
+
+import java.io.File;
+
+/**
+ * CreateArchivaDependencyResolutionTestCaseMojo 
+ *
+ * @author <a href="mailto:joakim@erdfelt.com">Joakim Erdfelt</a>
+ * @version $Id$
+ * 
+ * @goal generate-dependency-tests
+ */
+public class CreateArchivaDependencyResolutionTestCaseMojo
+    extends AbstractMojo
+{
+    /**
+     * The project of the current build.
+     * 
+     * @parameter default-value="${project}"
+     * @required
+     * @readonly
+     */
+    private MavenProject project;
+
+    /**
+     * The artifact respository to use.
+     * 
+     * @parameter expression="${localRepository}"
+     * @required
+     * @readonly
+     */
+    private ArtifactRepository localRepository;
+    
+    /**
+     * The destination directory to generate the test files.
+     * 
+     * @parameter expression="${archivadev.outputdir}" default-value="${project.build.directory}"
+     * @required
+     */
+    private File destDir;
+
+    /**
+     * The artifact factory to use.
+     * 
+     * @component
+     */
+    private ArtifactFactory artifactFactory;
+    
+    /**
+     * @component
+     */
+    private DependencyTreeBuilder dependencyTreeBuilder;
+    
+    /**
+     * @component
+     */
+    protected ArtifactMetadataSource artifactMetadataSource;
+
+    /**
+     * @component
+     */
+    private ArtifactCollector collector;
+
+    public void execute()
+        throws MojoExecutionException, MojoFailureException
+    {
+        String classPrefix = VariableNames.toClassName( project.getArtifactId() );
+        
+        getLog().info( "Generating into " + destDir );
+        
+        createMemoryRepository( classPrefix );
+        createDependencyGraphTest( classPrefix );
+    }
+    
+    private void createDependencyGraphTest( String classPrefix ) throws MojoExecutionException
+    {
+        DependencyGraphTestCreator creator = new DependencyGraphTestCreator();
+        creator.setLog( getLog() );
+        creator.setOutputDir( destDir );
+        creator.setProject( project );
+        creator.setArtifactFactory( artifactFactory );
+        creator.setLocalRepository( localRepository );
+        creator.setDependencyTreeBuilder( dependencyTreeBuilder );
+        creator.setArtifactMetadataSource( artifactMetadataSource );
+        creator.setCollector( collector );
+        
+        creator.create( classPrefix );
+    }
+
+    private void createMemoryRepository( String classPrefix ) throws MojoExecutionException
+    {
+        MemoryRepositoryCreator creator = new MemoryRepositoryCreator();
+        creator.setLog( getLog() );
+        creator.setOutputDir( destDir );
+        creator.setProject( project );
+        creator.setArtifactFactory( artifactFactory );
+        creator.setLocalRepository( localRepository );
+        
+        creator.create( classPrefix );
+    }
+}

Propchange: maven/archiva/trunk/tools/maven-archivadev-plugin/src/main/java/org/apache/maven/archiva/plugins/dev/CreateArchivaDependencyResolutionTestCaseMojo.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: maven/archiva/trunk/tools/maven-archivadev-plugin/src/main/java/org/apache/maven/archiva/plugins/dev/CreateArchivaDependencyResolutionTestCaseMojo.java
------------------------------------------------------------------------------
    svn:keywords = "Author Date Id Revision"

Propchange: maven/archiva/trunk/tools/maven-archivadev-plugin/src/main/java/org/apache/maven/archiva/plugins/dev/CreateArchivaDependencyResolutionTestCaseMojo.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Added: maven/archiva/trunk/tools/maven-archivadev-plugin/src/main/java/org/apache/maven/archiva/plugins/dev/functors/ArtifactComparator.java
URL: http://svn.apache.org/viewvc/maven/archiva/trunk/tools/maven-archivadev-plugin/src/main/java/org/apache/maven/archiva/plugins/dev/functors/ArtifactComparator.java?view=auto&rev=547277
==============================================================================
--- maven/archiva/trunk/tools/maven-archivadev-plugin/src/main/java/org/apache/maven/archiva/plugins/dev/functors/ArtifactComparator.java (added)
+++ maven/archiva/trunk/tools/maven-archivadev-plugin/src/main/java/org/apache/maven/archiva/plugins/dev/functors/ArtifactComparator.java Thu Jun 14 08:25:42 2007
@@ -0,0 +1,63 @@
+package org.apache.maven.archiva.plugins.dev.functors;
+
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *  http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+import org.apache.maven.artifact.Artifact;
+
+import java.util.Comparator;
+
+/**
+ * ArtifactComparator 
+ *
+ * @author <a href="mailto:joakim@erdfelt.com">Joakim Erdfelt</a>
+ * @version $Id$
+ */
+public class ArtifactComparator
+    implements Comparator
+{
+
+    public int compare( Object arg0, Object arg1 )
+    {
+        if( arg0 == null || arg1 == null )
+        {
+            return -1;
+        }
+        
+        Artifact artifact1 = (Artifact) arg0;
+        Artifact artifact2 = (Artifact) arg1;
+        
+        int diff;
+        
+        diff = artifact1.getGroupId().compareTo( artifact2.getGroupId() );
+        if( diff != 0 )
+        {
+            return diff;
+        }
+        
+        diff = artifact1.getArtifactId().compareTo( artifact2.getArtifactId() );
+        if( diff != 0 )
+        {
+            return diff;
+        }
+        
+        return artifact1.getVersion().compareTo( artifact2.getVersion() );
+    }
+
+}

Propchange: maven/archiva/trunk/tools/maven-archivadev-plugin/src/main/java/org/apache/maven/archiva/plugins/dev/functors/ArtifactComparator.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: maven/archiva/trunk/tools/maven-archivadev-plugin/src/main/java/org/apache/maven/archiva/plugins/dev/functors/ArtifactComparator.java
------------------------------------------------------------------------------
    svn:keywords = "Author Date Id Revision"

Propchange: maven/archiva/trunk/tools/maven-archivadev-plugin/src/main/java/org/apache/maven/archiva/plugins/dev/functors/ArtifactComparator.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Added: maven/archiva/trunk/tools/maven-archivadev-plugin/src/main/java/org/apache/maven/archiva/plugins/dev/functors/DependencyNodeToArtifactTransformer.java
URL: http://svn.apache.org/viewvc/maven/archiva/trunk/tools/maven-archivadev-plugin/src/main/java/org/apache/maven/archiva/plugins/dev/functors/DependencyNodeToArtifactTransformer.java?view=auto&rev=547277
==============================================================================
--- maven/archiva/trunk/tools/maven-archivadev-plugin/src/main/java/org/apache/maven/archiva/plugins/dev/functors/DependencyNodeToArtifactTransformer.java (added)
+++ maven/archiva/trunk/tools/maven-archivadev-plugin/src/main/java/org/apache/maven/archiva/plugins/dev/functors/DependencyNodeToArtifactTransformer.java Thu Jun 14 08:25:42 2007
@@ -0,0 +1,44 @@
+package org.apache.maven.archiva.plugins.dev.functors;
+
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *  http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+import org.apache.commons.collections.Transformer;
+import org.apache.maven.shared.dependency.tree.DependencyNode;
+
+/**
+ * DependencyNodeToArtifactTransformer 
+ *
+ * @author <a href="mailto:joakim@erdfelt.com">Joakim Erdfelt</a>
+ * @version $Id$
+ */
+public class DependencyNodeToArtifactTransformer
+    implements Transformer
+{
+    public Object transform( Object input )
+    {
+        if( input instanceof DependencyNode )
+        {
+            DependencyNode node = (DependencyNode) input;
+            return node.getArtifact();
+        }
+        
+        return input;
+    }
+}

Propchange: maven/archiva/trunk/tools/maven-archivadev-plugin/src/main/java/org/apache/maven/archiva/plugins/dev/functors/DependencyNodeToArtifactTransformer.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: maven/archiva/trunk/tools/maven-archivadev-plugin/src/main/java/org/apache/maven/archiva/plugins/dev/functors/DependencyNodeToArtifactTransformer.java
------------------------------------------------------------------------------
    svn:keywords = "Author Date Id Revision"

Propchange: maven/archiva/trunk/tools/maven-archivadev-plugin/src/main/java/org/apache/maven/archiva/plugins/dev/functors/DependencyNodeToArtifactTransformer.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Added: maven/archiva/trunk/tools/maven-archivadev-plugin/src/main/java/org/apache/maven/archiva/plugins/dev/functors/MatchingDependencyPredicate.java
URL: http://svn.apache.org/viewvc/maven/archiva/trunk/tools/maven-archivadev-plugin/src/main/java/org/apache/maven/archiva/plugins/dev/functors/MatchingDependencyPredicate.java?view=auto&rev=547277
==============================================================================
--- maven/archiva/trunk/tools/maven-archivadev-plugin/src/main/java/org/apache/maven/archiva/plugins/dev/functors/MatchingDependencyPredicate.java (added)
+++ maven/archiva/trunk/tools/maven-archivadev-plugin/src/main/java/org/apache/maven/archiva/plugins/dev/functors/MatchingDependencyPredicate.java Thu Jun 14 08:25:42 2007
@@ -0,0 +1,66 @@
+package org.apache.maven.archiva.plugins.dev.functors;
+
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *  http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+import org.apache.commons.collections.Predicate;
+import org.apache.maven.model.Dependency;
+import org.codehaus.plexus.util.StringUtils;
+
+/**
+ * MatchingDependencyPredicate 
+ *
+ * @author <a href="mailto:joakim@erdfelt.com">Joakim Erdfelt</a>
+ * @version $Id$
+ */
+public class MatchingDependencyPredicate
+    implements Predicate
+{
+    private Dependency selectedDep;
+    
+    public MatchingDependencyPredicate( Dependency selectedDep )
+    {
+        this.selectedDep = selectedDep;
+    }
+
+    public boolean evaluate( Object input )
+    {
+        boolean satisfies = false;
+
+        if ( input instanceof Dependency )
+        {
+            Dependency dep = (Dependency) input;
+            if ( StringUtils.equals( dep.getArtifactId(), selectedDep.getArtifactId() )
+                 && StringUtils.equals( dep.getGroupId(), selectedDep.getGroupId() )
+                 && StringUtils.equals( dep.getType(), selectedDep.getType() ))
+            {
+                // So far, so good. groupId/artifactId/type match.
+                satisfies = true;
+                
+                // Test classifier (if defined)
+                if( StringUtils.isNotEmpty( selectedDep.getClassifier() ) )
+                {
+                    satisfies = StringUtils.equals( dep.getClassifier(), selectedDep.getClassifier() );
+                }
+            }
+        }
+
+        return satisfies;
+    }
+}

Propchange: maven/archiva/trunk/tools/maven-archivadev-plugin/src/main/java/org/apache/maven/archiva/plugins/dev/functors/MatchingDependencyPredicate.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: maven/archiva/trunk/tools/maven-archivadev-plugin/src/main/java/org/apache/maven/archiva/plugins/dev/functors/MatchingDependencyPredicate.java
------------------------------------------------------------------------------
    svn:keywords = "Author Date Id Revision"

Propchange: maven/archiva/trunk/tools/maven-archivadev-plugin/src/main/java/org/apache/maven/archiva/plugins/dev/functors/MatchingDependencyPredicate.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Added: maven/archiva/trunk/tools/maven-archivadev-plugin/src/main/java/org/apache/maven/archiva/plugins/dev/testgen/AbstractCreator.java
URL: http://svn.apache.org/viewvc/maven/archiva/trunk/tools/maven-archivadev-plugin/src/main/java/org/apache/maven/archiva/plugins/dev/testgen/AbstractCreator.java?view=auto&rev=547277
==============================================================================
--- maven/archiva/trunk/tools/maven-archivadev-plugin/src/main/java/org/apache/maven/archiva/plugins/dev/testgen/AbstractCreator.java (added)
+++ maven/archiva/trunk/tools/maven-archivadev-plugin/src/main/java/org/apache/maven/archiva/plugins/dev/testgen/AbstractCreator.java Thu Jun 14 08:25:42 2007
@@ -0,0 +1,349 @@
+package org.apache.maven.archiva.plugins.dev.testgen;
+
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *  http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+import org.apache.maven.archiva.common.utils.VersionUtil;
+import org.apache.maven.artifact.Artifact;
+import org.apache.maven.artifact.factory.ArtifactFactory;
+import org.apache.maven.artifact.repository.ArtifactRepository;
+import org.apache.maven.model.Dependency;
+import org.apache.maven.model.Exclusion;
+import org.apache.maven.model.Model;
+import org.apache.maven.model.Parent;
+import org.apache.maven.model.io.xpp3.MavenXpp3Reader;
+import org.apache.maven.plugin.MojoExecutionException;
+import org.apache.maven.plugin.logging.Log;
+import org.apache.maven.project.MavenProject;
+import org.apache.maven.project.interpolation.ModelInterpolator;
+import org.apache.maven.project.interpolation.RegexBasedModelInterpolator;
+import org.codehaus.plexus.util.IOUtil;
+import org.codehaus.plexus.util.StringUtils;
+
+import java.io.File;
+import java.io.FileReader;
+import java.io.PrintWriter;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.Properties;
+
+/**
+ * AbstractCreator 
+ *
+ * @author <a href="mailto:joakim@erdfelt.com">Joakim Erdfelt</a>
+ * @version $Id$
+ */
+public abstract class AbstractCreator
+{
+    protected MavenProject project;
+
+    protected ArtifactFactory artifactFactory;
+
+    protected ArtifactRepository localRepository;
+
+    protected File outputDir;
+
+    private MavenXpp3Reader modelReader = new MavenXpp3Reader();
+    
+    private ModelInterpolator modelInterpolator;
+
+    private Log log;
+
+    public abstract void create( String classPrefix )
+        throws MojoExecutionException;
+
+    protected void writeLicense( PrintWriter out )
+    {
+        out.println( "/*" );
+        out.println( " * Licensed to the Apache Software Foundation (ASF) under one" );
+        out.println( " * or more contributor license agreements.  See the NOTICE file" );
+        out.println( " * distributed with this work for additional information" );
+        out.println( " * regarding copyright ownership.  The ASF licenses this file" );
+        out.println( " * to you under the Apache License, Version 2.0 (the" );
+        out.println( " * \"License\"); you may not use this file except in compliance" );
+        out.println( " * with the License.  You may obtain a copy of the License at" );
+        out.println( " *" );
+        out.println( " *  http://www.apache.org/licenses/LICENSE-2.0" );
+        out.println( " *" );
+        out.println( " * Unless required by applicable law or agreed to in writing," );
+        out.println( " * software distributed under the License is distributed on an" );
+        out.println( " * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY" );
+        out.println( " * KIND, either express or implied.  See the License for the" );
+        out.println( " * specific language governing permissions and limitations" );
+        out.println( " * under the License." );
+        out.println( " */" );
+        out.println( "" );
+    }
+
+    protected boolean isNotEmpty( Properties properties )
+    {
+        return !isEmpty( properties );
+    }
+
+    private boolean isEmpty( Properties properties )
+    {
+        if ( properties == null )
+        {
+            return true;
+        }
+
+        return properties.isEmpty();
+    }
+
+    public Log getLog()
+    {
+        return log;
+    }
+
+    public void setLog( Log log )
+    {
+        this.log = log;
+    }
+
+    public MavenProject getProject()
+    {
+        return project;
+    }
+
+    public void setProject( MavenProject project )
+    {
+        this.project = project;
+    }
+
+    protected Model getModel( Dependency dep )
+    {
+        return getModel( dep.getGroupId(), dep.getArtifactId(), dep.getVersion(), dep.getType() );
+    }
+
+    protected Model getModel( Parent parent )
+    {
+        return getModel( parent.getGroupId(), parent.getArtifactId(), parent.getVersion(), "pom" );
+    }
+
+    protected Model getModel( String groupId, String artifactId, String version, String type )
+    {
+        // getLog().info( ".getModel(" + groupId + ", " + artifactId + ", " + version + ", " + type + ")" );
+        Artifact pomArtifact = artifactFactory.createProjectArtifact( groupId, artifactId, version );
+
+        String path = localRepository.getLayout().pathOf( pomArtifact );
+
+        File pomFile = new File( localRepository.getBasedir(), path );
+
+        if ( pomFile.exists() )
+        {
+            FileReader reader = null;
+            try
+            {
+                reader = new FileReader( pomFile );
+                Model model = modelReader.read( reader );
+                
+                // HACK: to allow ${pom.groupId} expressions to work, WITHOUT resolving/merginc parent.
+                //       (The merging of parent pom is done elsewhere)
+                if ( StringUtils.isEmpty( model.getGroupId() ) )
+                {
+                    if( model.getParent() != null )
+                    {
+                        model.setGroupId( model.getParent().getGroupId() );
+                    }
+                }
+                
+                // HACK: to fix bad poms in repo (see jetty:jetty:4.2.10::jar for example)
+                model.setVersion( version );
+                
+                // Interpolate the properties?
+                if( modelInterpolator == null )
+                {
+                    modelInterpolator = new RegexBasedModelInterpolator();
+                }
+                
+                model = modelInterpolator.interpolate( model, Collections.EMPTY_MAP, false );
+                
+                return model;
+            }
+            catch ( Exception e )
+            {
+                getLog().warn(
+                               "Unable to read pom file " + pomFile.getAbsolutePath() + " : (" + e.getClass().getName()
+                                   + "): " + e.getMessage() );
+            }
+            finally
+            {
+                IOUtil.close( reader );
+            }
+        }
+
+        // no pom file.
+
+        Model model = new Model();
+        model.setGroupId( groupId );
+        model.setArtifactId( artifactId );
+        model.setVersion( version );
+        model.setPackaging( type );
+
+        return model;
+    }
+
+    private String getGroupId( Model model )
+    {
+        String groupId = model.getGroupId();
+
+        if ( StringUtils.isEmpty( groupId ) )
+        {
+            if ( model.getParent() != null )
+            {
+                groupId = model.getParent().getGroupId();
+            }
+        }
+
+        return groupId;
+    }
+
+    private String getVersion( Model model )
+    {
+        String version = model.getVersion();
+
+        if ( StringUtils.isEmpty( version ) )
+        {
+            if ( model.getParent() != null )
+            {
+                version = model.getParent().getVersion();
+            }
+        }
+
+        return VersionUtil.getBaseVersion( version );
+    }
+
+    protected boolean isNotBlank( String str )
+    {
+        return !isBlank( str );
+    }
+
+    private boolean isBlank( String str )
+    {
+        if ( str == null )
+        {
+            return true;
+        }
+
+        return ( str.trim().length() <= 0 );
+    }
+
+    protected boolean isNotEmpty( Collection coll )
+    {
+        return !isEmpty( coll );
+    }
+
+    protected boolean isEmpty( Collection coll )
+    {
+        if ( coll == null )
+        {
+            return true;
+        }
+
+        return coll.isEmpty();
+    }
+
+    protected String toKey( Parent ref )
+    {
+        StringBuffer key = new StringBuffer();
+
+        key.append( ref.getGroupId() ).append( ":" );
+        key.append( ref.getArtifactId() ).append( ":" );
+        key.append( ref.getVersion() );
+
+        return key.toString();
+    }
+
+    protected String toKey( Exclusion ref )
+    {
+        StringBuffer key = new StringBuffer();
+
+        key.append( ref.getGroupId() ).append( ":" );
+        key.append( ref.getArtifactId() );
+
+        return key.toString();
+    }
+
+    protected String toKey( Model ref )
+    {
+        StringBuffer key = new StringBuffer();
+
+        key.append( getGroupId( ref ) ).append( ":" );
+        key.append( ref.getArtifactId() ).append( ":" );
+        key.append( getVersion( ref ) );
+
+        return key.toString();
+    }
+
+    protected String toKey( Dependency ref )
+    {
+        StringBuffer key = new StringBuffer();
+
+        key.append( ref.getGroupId() ).append( ":" );
+        key.append( ref.getArtifactId() ).append( ":" );
+        key.append( ref.getVersion() ).append( ":" );
+        key.append( StringUtils.defaultString( ref.getClassifier() ) ).append( ":" );
+        key.append( ref.getType() );
+
+        return key.toString();
+    }
+
+    protected String toKey( Artifact ref )
+    {
+        StringBuffer key = new StringBuffer();
+
+        key.append( ref.getGroupId() ).append( ":" );
+        key.append( ref.getArtifactId() ).append( ":" );
+        key.append( ref.getVersion() ).append( ":" );
+        key.append( StringUtils.defaultString( ref.getClassifier() ) ).append( ":" );
+        key.append( ref.getType() );
+
+        return key.toString();
+    }
+
+    public ArtifactFactory getArtifactFactory()
+    {
+        return artifactFactory;
+    }
+
+    public void setArtifactFactory( ArtifactFactory artifactFactory )
+    {
+        this.artifactFactory = artifactFactory;
+    }
+
+    public ArtifactRepository getLocalRepository()
+    {
+        return localRepository;
+    }
+
+    public void setLocalRepository( ArtifactRepository localRepository )
+    {
+        this.localRepository = localRepository;
+    }
+
+    public File getOutputDir()
+    {
+        return outputDir;
+    }
+
+    public void setOutputDir( File outputDir )
+    {
+        this.outputDir = outputDir;
+    }
+}

Propchange: maven/archiva/trunk/tools/maven-archivadev-plugin/src/main/java/org/apache/maven/archiva/plugins/dev/testgen/AbstractCreator.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: maven/archiva/trunk/tools/maven-archivadev-plugin/src/main/java/org/apache/maven/archiva/plugins/dev/testgen/AbstractCreator.java
------------------------------------------------------------------------------
    svn:keywords = "Author Date Id Revision"

Propchange: maven/archiva/trunk/tools/maven-archivadev-plugin/src/main/java/org/apache/maven/archiva/plugins/dev/testgen/AbstractCreator.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Added: maven/archiva/trunk/tools/maven-archivadev-plugin/src/main/java/org/apache/maven/archiva/plugins/dev/testgen/DependencyGraphTestCreator.java
URL: http://svn.apache.org/viewvc/maven/archiva/trunk/tools/maven-archivadev-plugin/src/main/java/org/apache/maven/archiva/plugins/dev/testgen/DependencyGraphTestCreator.java?view=auto&rev=547277
==============================================================================
--- maven/archiva/trunk/tools/maven-archivadev-plugin/src/main/java/org/apache/maven/archiva/plugins/dev/testgen/DependencyGraphTestCreator.java (added)
+++ maven/archiva/trunk/tools/maven-archivadev-plugin/src/main/java/org/apache/maven/archiva/plugins/dev/testgen/DependencyGraphTestCreator.java Thu Jun 14 08:25:42 2007
@@ -0,0 +1,366 @@
+package org.apache.maven.archiva.plugins.dev.testgen;
+
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *  http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+import org.apache.commons.collections.CollectionUtils;
+import org.apache.commons.collections.Predicate;
+import org.apache.commons.collections.functors.NotPredicate;
+import org.apache.maven.archiva.plugins.dev.functors.DependencyNodeToArtifactTransformer;
+import org.apache.maven.artifact.Artifact;
+import org.apache.maven.artifact.metadata.ArtifactMetadataSource;
+import org.apache.maven.artifact.resolver.ArtifactCollector;
+import org.apache.maven.plugin.MojoExecutionException;
+import org.apache.maven.shared.dependency.tree.DependencyTree;
+import org.apache.maven.shared.dependency.tree.DependencyTreeBuilder;
+import org.apache.maven.shared.dependency.tree.DependencyTreeBuilderException;
+import org.codehaus.plexus.util.IOUtil;
+import org.codehaus.plexus.util.StringUtils;
+
+import java.io.File;
+import java.io.FileNotFoundException;
+import java.io.PrintWriter;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Iterator;
+import java.util.List;
+
+/**
+ * DependencyGraphTestCreator 
+ *
+ * @author <a href="mailto:joakim@erdfelt.com">Joakim Erdfelt</a>
+ * @version $Id$
+ */
+public class DependencyGraphTestCreator
+    extends AbstractCreator
+{
+    private class RootArtifactPredicate
+        implements Predicate
+    {
+        private String rootKey;
+
+        public RootArtifactPredicate( DependencyTree tree )
+        {
+            this.rootKey = toKey( tree.getRootNode().getArtifact() );
+        }
+
+        public boolean evaluate( Object input )
+        {
+            boolean satisfies = false;
+        
+            if ( input instanceof Artifact )
+            {
+                Artifact nodeArtifact = (Artifact) input;
+                String key = toKey( nodeArtifact );
+                
+                if ( key.equals( rootKey ) )
+                {
+                    satisfies = true;
+                }
+            }
+        
+            return satisfies;
+        }
+    }
+
+    private File outputFile;
+
+    private PrintWriter out;
+
+    private DependencyTreeBuilder dependencyTreeBuilder;
+
+    private ArtifactMetadataSource artifactMetadataSource;
+
+    private ArtifactCollector collector;
+
+    public void create( String classPrefix )
+        throws MojoExecutionException
+    {
+        String classname = classPrefix + "DependencyGraphTest";
+
+        getLog().info( "Generating " + classname + ".java ..." );
+
+        outputFile = new File( outputDir, classname + ".java" );
+        try
+        {
+            out = new PrintWriter( outputFile );
+        }
+        catch ( FileNotFoundException e )
+        {
+            throw new MojoExecutionException( "Unable to open file " + outputFile.getName() + " for output: "
+                + e.getMessage(), e );
+        }
+
+        try
+        {
+            out.println( "package org.apache.maven.archiva.dependency.graph;" );
+            out.println( "" );
+
+            writeLicense( out );
+
+            // Imports
+            out.println( "import org.apache.maven.archiva.dependency.DependencyGraphFactory;" );
+            out.println( "import org.apache.maven.archiva.model.DependencyScope;" );
+            out.println( "import org.apache.maven.archiva.model.VersionedReference;" );
+            out.println( "" );
+            out.println( "import java.util.ArrayList;" );
+            out.println( "import java.util.List;" );
+            out.println( "" );
+
+            String projectKey = toKey( project.getModel() );
+
+            writeJavadoc( classname, projectKey );
+
+            // The class itself.
+            out.println( "public class " + classname );
+            out.println( "   extends AbstractDependencyGraphFactoryTestCase" );
+            out.println( "{" );
+
+            DependencyTree dependencyTree = getDependencyTree();
+
+            writeGraphNodesTest( classPrefix, dependencyTree );
+
+            // TODO: enable in future, when resolution between archiva and maven are equal.
+            // writeDirectCompileDepsTest( classPrefix, dependencyTree );
+            // writeDirectTestDepsTest( classPrefix, dependencyTree );
+            // writeTransitiveCompileDepsTest( classPrefix, dependencyTree );
+            // writeTransitiveTestDepsTest( classPrefix, dependencyTree );
+
+            out.println( "}" );
+        }
+        finally
+        {
+            out.flush();
+            IOUtil.close( out );
+        }
+    }
+
+    public ArtifactMetadataSource getArtifactMetadataSource()
+    {
+        return artifactMetadataSource;
+    }
+
+    public ArtifactCollector getCollector()
+    {
+        return collector;
+    }
+
+    public DependencyTreeBuilder getDependencyTreeBuilder()
+    {
+        return dependencyTreeBuilder;
+    }
+
+    public void setArtifactMetadataSource( ArtifactMetadataSource artifactMetadataSource )
+    {
+        this.artifactMetadataSource = artifactMetadataSource;
+    }
+
+    public void setCollector( ArtifactCollector collector )
+    {
+        this.collector = collector;
+    }
+
+    public void setDependencyTreeBuilder( DependencyTreeBuilder dependencyTreeBuilder )
+    {
+        this.dependencyTreeBuilder = dependencyTreeBuilder;
+    }
+
+    private DependencyTree getDependencyTree()
+        throws MojoExecutionException
+    {
+        try
+        {
+            return dependencyTreeBuilder.buildDependencyTree( project, localRepository, artifactFactory,
+                                                              artifactMetadataSource, collector );
+        }
+        catch ( DependencyTreeBuilderException e )
+        {
+            String emsg = "Unable to build dependency tree.";
+            getLog().error( emsg, e );
+            throw new MojoExecutionException( emsg, e );
+        }
+    }
+
+    private void writeDirectCompileDepsTest( String classPrefix, DependencyTree tree )
+    {
+        out.println( "   public void testResolveOfDirectCompileDeps()" );
+        out.println( "        throws GraphTaskException" );
+        out.println( "   {" );
+        writeTestProlog( classPrefix );
+        writeDirectDependenciesCheck( tree, "compile" );
+        out.println( "   }" );
+        out.println( "" );
+    }
+
+    private void writeDirectDependenciesCheck( DependencyTree dependencyTree, String scope )
+    {
+        out.println( "      // Check for direct dependencies on scope " + scope );
+        out.println( "      expectedNodes.clear();" );
+
+        List directDeps = new ArrayList();
+        directDeps.addAll( dependencyTree.getRootNode().getChildren() );
+        CollectionUtils.transform( directDeps, new DependencyNodeToArtifactTransformer() );
+
+        Collections.sort( directDeps );
+
+        writeExpectedNodesAdd( directDeps, scope );
+
+        out.println( "      assertDirectNodes( graph, expectedNodes, \"" + scope + "\" );" );
+    }
+
+    private void writeDirectTestDepsTest( String classPrefix, DependencyTree tree )
+    {
+        out.println( "   public void testResolveOfDirectTestDeps()" );
+        out.println( "        throws GraphTaskException" );
+        out.println( "   {" );
+        writeTestProlog( classPrefix );
+        writeDirectDependenciesCheck( tree, "test" );
+        out.println( "   }" );
+        out.println( "" );
+    }
+
+    private void writeExpectedNodesAdd( List deps, String scope )
+    {
+        Iterator it = deps.iterator();
+        while ( it.hasNext() )
+        {
+            Artifact artifact = (Artifact) it.next();
+            String depKey = toKey( artifact );
+            if ( StringUtils.equals( scope, artifact.getScope() ) )
+            {
+                out.println( "      expectedNodes.add( \"" + depKey + "\" );" );
+            }
+        }
+    }
+
+    private void writeJavadoc( String classname, String projectKey )
+    {
+        out.println( "/**" );
+        out.println( " * " + classname );
+        out.println( " * " );
+        out.println( " * DependencyGraphTest for testing <code>" + projectKey + "</code>" );
+        out.println( " *" );
+        out.println( " * Generated by <code>archivadev:generate-dependency-tests</code> plugin" );
+        out.println( " * @version $Id$" );
+        out.println( " */" );
+    }
+
+    private void writeGraphNodesTest( String classPrefix, final DependencyTree tree )
+    {
+        out.println( "   public void testResolvedDepsToNodes()" );
+        out.println( "        throws GraphTaskException" );
+        out.println( "   {" );
+        writeTestProlog( classPrefix );
+
+        String projectKey = toKey( project.getModel() );
+        out.println( "      String expectedRootRef = \"" + projectKey + "\";" );
+        out.println( "      List expectedNodes = new ArrayList();" );
+        out.println( "" );
+        out.println( "      // Check for all nodes, regardless of scope." );
+        out.println( "      expectedNodes.clear();" );
+
+        // Add all deps.
+        List deps = new ArrayList();
+        Predicate notRootNode = NotPredicate.getInstance( new RootArtifactPredicate( tree ) );
+        CollectionUtils.select( tree.getArtifacts(), notRootNode, deps );
+        CollectionUtils.transform( deps, new DependencyNodeToArtifactTransformer() );
+        Collections.sort( deps );
+
+        Iterator it = deps.iterator();
+        while ( it.hasNext() )
+        {
+            Artifact artifact = (Artifact) it.next();
+            String depKey = toKey( artifact );
+            out.println( "      expectedNodes.add( \"" + depKey + "\" );" );
+        }
+
+        out.println( "" );
+        out.println( "      assertGraph( graph, expectedRootRef, expectedNodes );" );
+
+        out.println( "   }" );
+        out.println( "" );
+
+    }
+
+    private void writeTestProlog( String classPrefix )
+    {
+        out.println( "      MemoryRepositoryDependencyGraphBuilder graphBuilder = " );
+        out.println( "                     new MemoryRepositoryDependencyGraphBuilder();" );
+        out.println( "      MemoryRepository repository = new " + classPrefix + "MemoryRepository();" );
+        out.println( "      graphBuilder.setMemoryRepository( repository );" );
+        out.println( "" );
+        out.println( "      // Create the factory, and add the test resolver." );
+        out.println( "      DependencyGraphFactory factory = new DependencyGraphFactory();" );
+        out.println( "      factory.setGraphBuilder( graphBuilder );" );
+        out.println( "      factory.setDesiredScope( DependencyScope.TEST );" );
+        out.println( "" );
+        out.println( "      // Get the model to resolve from" );
+        out.println( "      VersionedReference rootRef = toVersionedReference( \"" + project.getGroupId() + ":"
+            + project.getArtifactId() + ":" + project.getVersion() + "\"); " );
+        out.println( "" );
+        out.println( "      // Perform the resolution." );
+        out.println( "      DependencyGraph graph = factory.getGraph( rootRef );" );
+        out.println( "" );
+        out.println( "      // Test the results." );
+        out.println( "      assertNotNull( \"Graph shouldn't be null.\", graph );" );
+        out.println( "" );
+    }
+
+    private void writeTransientDependenciesCheck( DependencyTree dependencyTree, String scope )
+    {
+        out.println( "      // Check for transient dependencies on scope " + scope );
+        out.println( "      expectedNodes.clear();" );
+
+        // Add all deps.
+        List deps = new ArrayList( dependencyTree.getArtifacts() );
+        // Remove the direct deps.
+        List directDeps = new ArrayList();
+        directDeps.addAll( dependencyTree.getRootNode().getChildren() );
+        CollectionUtils.transform( directDeps, new DependencyNodeToArtifactTransformer() );
+        deps.removeAll( directDeps );
+
+        Collections.sort( deps );
+
+        writeExpectedNodesAdd( deps, scope );
+
+        out.println( "      assertTransientNodes( graph, expectedNodes, \"" + scope + "\" );" );
+    }
+
+    private void writeTransitiveCompileDepsTest( String classPrefix, DependencyTree tree )
+    {
+        out.println( "   public void testResolveOfTransitiveCompileDeps()" );
+        out.println( "        throws GraphTaskException" );
+        out.println( "   {" );
+        writeTestProlog( classPrefix );
+        writeTransientDependenciesCheck( tree, "compile" );
+        out.println( "   }" );
+        out.println( "" );
+    }
+
+    private void writeTransitiveTestDepsTest( String classPrefix, DependencyTree tree )
+    {
+        out.println( "   public void testResolveOfTransitiveTestDeps()" );
+        out.println( "        throws GraphTaskException" );
+        out.println( "   {" );
+        writeTestProlog( classPrefix );
+        writeTransientDependenciesCheck( tree, "test" );
+        out.println( "   }" );
+        out.println( "" );
+    }
+}

Propchange: maven/archiva/trunk/tools/maven-archivadev-plugin/src/main/java/org/apache/maven/archiva/plugins/dev/testgen/DependencyGraphTestCreator.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: maven/archiva/trunk/tools/maven-archivadev-plugin/src/main/java/org/apache/maven/archiva/plugins/dev/testgen/DependencyGraphTestCreator.java
------------------------------------------------------------------------------
    svn:keywords = "Author Date Id Revision"

Propchange: maven/archiva/trunk/tools/maven-archivadev-plugin/src/main/java/org/apache/maven/archiva/plugins/dev/testgen/DependencyGraphTestCreator.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain