Author: jvanzyl
Date: Thu Nov 29 16:08:03 2007
New Revision: 599650

URL: http://svn.apache.org/viewvc?rev=599650&view=rev
Log:
o more files for artifact changes

Added:
    
maven/artifact/trunk/src/main/java/org/apache/maven/artifact/resolver/conflict/DefaultGraphConflictResolutionPolicy.java
    
maven/artifact/trunk/src/main/java/org/apache/maven/artifact/resolver/conflict/DefaultGraphConflictResolver.java
    
maven/artifact/trunk/src/main/java/org/apache/maven/artifact/resolver/conflict/GraphConflictResolutionException.java
    
maven/artifact/trunk/src/main/java/org/apache/maven/artifact/resolver/conflict/GraphConflictResolutionPolicy.java
    
maven/artifact/trunk/src/main/java/org/apache/maven/artifact/resolver/conflict/GraphConflictResolver.java
    
maven/artifact/trunk/src/main/java/org/apache/maven/artifact/resolver/metadata/MetadataGraphVertex.java
    
maven/artifact/trunk/src/main/java/org/apache/maven/artifact/transform/ClasspathContainer.java
    
maven/artifact/trunk/src/main/java/org/apache/maven/artifact/transform/ClasspathTransformation.java
    
maven/artifact/trunk/src/main/java/org/apache/maven/artifact/transform/DefaultClasspathTransformation.java
    
maven/artifact/trunk/src/main/java/org/apache/maven/artifact/transform/MetadataGraphTransformationException.java
    
maven/artifact/trunk/src/test/java/org/apache/maven/artifact/resolver/conflict/DefaultGraphConflictResolutionPolicyTest.java
    
maven/artifact/trunk/src/test/java/org/apache/maven/artifact/resolver/conflict/DefaultGraphConflictResolverTest.java
    
maven/artifact/trunk/src/test/java/org/apache/maven/artifact/transform/DefaultClasspathTransformationTest.java

Added: 
maven/artifact/trunk/src/main/java/org/apache/maven/artifact/resolver/conflict/DefaultGraphConflictResolutionPolicy.java
URL: 
http://svn.apache.org/viewvc/maven/artifact/trunk/src/main/java/org/apache/maven/artifact/resolver/conflict/DefaultGraphConflictResolutionPolicy.java?rev=599650&view=auto
==============================================================================
--- 
maven/artifact/trunk/src/main/java/org/apache/maven/artifact/resolver/conflict/DefaultGraphConflictResolutionPolicy.java
 (added)
+++ 
maven/artifact/trunk/src/main/java/org/apache/maven/artifact/resolver/conflict/DefaultGraphConflictResolutionPolicy.java
 Thu Nov 29 16:08:03 2007
@@ -0,0 +1,54 @@
+package org.apache.maven.artifact.resolver.conflict;
+
+import org.apache.maven.artifact.resolver.metadata.MetadataGraphEdge;
+import org.apache.maven.artifact.versioning.ArtifactVersion;
+import org.apache.maven.artifact.versioning.DefaultArtifactVersion;
+
+/**
+ *
+ * @plexus.component
+ * 
+ * @author <a href="mailto:[EMAIL PROTECTED]">Oleg Gusakov</a>
+ * 
+ * @version $Id$
+ */
+public class DefaultGraphConflictResolutionPolicy
+implements GraphConflictResolutionPolicy
+{
+       
+       /**
+     * artifact, closer to the entry point, is selected
+     * 
+     * @plexus.configuration default-value="true"
+     */
+       private boolean closerFirst = true;
+       
+       /**
+     * newer artifact is selected
+     * 
+     * @plexus.configuration default-value="true"
+     */
+       private boolean newerFirst = true;
+
+       public MetadataGraphEdge apply(MetadataGraphEdge e1, MetadataGraphEdge 
e2)
+       {
+               int depth1 = e1.getDepth();
+               int depth2 = e2.getDepth();
+               
+               if( depth1 == depth2 ) {
+                       ArtifactVersion v1 = new DefaultArtifactVersion( 
e1.getVersion() );
+                       ArtifactVersion v2 = new DefaultArtifactVersion( 
e2.getVersion() );
+                       
+                       if( newerFirst )
+                               return v1.compareTo(v2) > 0 ? e1 : e2;
+
+                       return v1.compareTo(v2) > 0 ? e2 : e1;
+               }
+               
+               if( closerFirst )
+                       return depth1 < depth2 ? e1 : e2;
+
+               return depth1 < depth2 ? e2 : e1;
+       }
+
+}

Added: 
maven/artifact/trunk/src/main/java/org/apache/maven/artifact/resolver/conflict/DefaultGraphConflictResolver.java
URL: 
http://svn.apache.org/viewvc/maven/artifact/trunk/src/main/java/org/apache/maven/artifact/resolver/conflict/DefaultGraphConflictResolver.java?rev=599650&view=auto
==============================================================================
--- 
maven/artifact/trunk/src/main/java/org/apache/maven/artifact/resolver/conflict/DefaultGraphConflictResolver.java
 (added)
+++ 
maven/artifact/trunk/src/main/java/org/apache/maven/artifact/resolver/conflict/DefaultGraphConflictResolver.java
 Thu Nov 29 16:08:03 2007
@@ -0,0 +1,290 @@
+package org.apache.maven.artifact.resolver.conflict;
+
+/*
+ * 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 java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.apache.maven.artifact.ArtifactScopeEnum;
+import org.apache.maven.artifact.resolver.metadata.ArtifactMetadata;
+import org.apache.maven.artifact.resolver.metadata.MetadataGraph;
+import org.apache.maven.artifact.resolver.metadata.MetadataGraphEdge;
+import org.apache.maven.artifact.resolver.metadata.MetadataGraphVertex;
+import org.apache.maven.artifact.resolver.metadata.MetadataResolutionException;
+import org.apache.maven.artifact.versioning.ArtifactVersion;
+import org.apache.maven.artifact.versioning.DefaultArtifactVersion;
+
+/**
+ * Default conflict resolver.Implements closer newer first policy 
+ * by default, but could be configured via plexus 
+ * 
+ * @plexus.component
+ * 
+ * @author <a href="mailto:[EMAIL PROTECTED]">Oleg Gusakov</a>
+ * 
+ * @version $Id$
+ */
+
+public class DefaultGraphConflictResolver
+implements GraphConflictResolver
+{
+       /**
+     * artifact, closer to the entry point, is selected
+     * 
+     * @plexus.requirement 
role="org.apache.maven.artifact.resolver.conflict.GraphConflictResolutionPolicy"
+     */
+       protected GraphConflictResolutionPolicy policy;
+       
//-------------------------------------------------------------------------------------
+       private class EdgeHolder
+       {
+               String            key;
+               MetadataGraphEdge edge;
+               
+               public EdgeHolder(String key, MetadataGraphEdge edge )
+               {
+                       set( key, edge );
+               }
+               
+               public EdgeHolder()
+               {
+               }
+               
+               public void set( String key, MetadataGraphEdge edge )
+               {
+                       this.key = key;
+                       this.edge = edge;
+               }
+               
+               public void set( EdgeHolder eh )
+               {
+                       set( eh.key, eh.edge );
+               }
+
+               public boolean eq(EdgeHolder eh)
+               {
+                       return          key != null
+                                       && edge != null
+                                       && key.equals(eh.key)
+                                       && edge.equals(eh.edge)
+                       ;
+               }
+               
+       }
+       
//-------------------------------------------------------------------------------------
+       public MetadataGraph resolveConflicts( MetadataGraph graph, 
ArtifactScopeEnum scope )
+       throws GraphConflictResolutionException
+       {
+               if( policy == null )
+                       throw new GraphConflictResolutionException("no 
GraphConflictResolutionPolicy injected");
+               
+               if( graph == null )
+                       return null;
+
+               final MetadataGraphVertex entry = graph.getEntry();
+               if( entry == null )
+                       return null;
+
+               final Map<String, List<MetadataGraphEdge>> edges = 
graph.getEdges();
+               if( edges == null || edges.size() < 1 )
+                       return null;
+               
+               final Map<String, MetadataGraphVertex> vertices = 
graph.getVertices();
+               if( vertices == null || vertices.size() < 1 )
+                       throw new GraphConflictResolutionException("graph with 
an entry, but not vertices do not exist");
+               
+               try {
+                       // edge case - single vertice graph
+                       if( vertices.size() == 1 )
+                                       return new MetadataGraph( entry );
+       
+                       final ArtifactScopeEnum requestedScope = 
ArtifactScopeEnum.checkScope(scope);
+                       
+                       MetadataGraph res = new MetadataGraph( vertices.size(), 
edges.size() );
+                       res.setEntry( graph.getEntry() );
+                       res.setScope(requestedScope);
+       
+                       for( Map.Entry<String, MetadataGraphVertex> mv : 
vertices.entrySet() ) {
+                               final MetadataGraphVertex v = mv.getValue();
+                               final EdgeHolder eh = cleanEdges( v, edges, 
requestedScope );
+                               
+                               if( eh == null ) { // no edges - don't need 
this vertice any more
+                                       if( 
entry.getMd().toDomainString().equals(v.getMd().toDomainString() ) ) {
+                                               // currently processing the 
entry point - it should not have any dependents
+                                               // so add it anyway
+                                               entry.getMd().setWhy("This is a 
graph entry point. No links.");
+                                               res.addVertice(v);
+                                       }
+                               }
+                               else
+                               {
+                                       // fill in domain md with actual 
version data
+                                       ArtifactMetadata md = v.getMd();
+                                       ArtifactMetadata newMd = new 
ArtifactMetadata(
+                                                       md.getGroupId()
+                                                       , md.getArtifactId()
+                                                       , eh.edge.getVersion()
+                                                       , md.getType()
+                                                       , md.getScopeAsEnum()
+                                                       , md.getClassifier()
+                                                       , 
eh.edge.getArtifactUri()
+                                                       , eh.edge.getSource() 
== null 
+                                                                               
                                ? ""
+                                                                               
                                :  eh.edge.getSource().toString()
+                                                       , eh.edge.isResolved()
+                                                       , eh.edge.getTarget() 
== null ? null : eh.edge.getTarget().getError()
+                                                                       );
+                                       v.setMd(newMd);
+                                       res.addVertice(v);
+                                       res.addEdge( eh.key, eh.edge );
+                               }
+                       }
+
+                       return findLinkedSubgraph( res );
+               } catch (MetadataResolutionException e) {
+                       throw new GraphConflictResolutionException(e);
+               }
+       }
+       
//-------------------------------------------------------------------------------------
+       private final MetadataGraph findLinkedSubgraph( MetadataGraph g )
+       {
+               if( g.getVertices().size() == 1 )
+                       return g;
+               
+               List<String> visited = new ArrayList<String>( 
g.getVertices().size() );
+               visit( g.getEntry().getMd().toDomainString(), visited, 
g.getEdges() );
+               
+               List<String> dropList = new ArrayList<String>( 
g.getVertices().size() );
+
+               // collect drop list
+               for( Map.Entry<String, MetadataGraphVertex> mv : 
g.getVertices().entrySet() )
+               {
+                       if( !visited.contains(mv.getKey()) )
+                               dropList.add( mv.getKey() );
+               }
+               
+               if( dropList.size() < 1 )
+                       return g;
+               
+               // now - drop vertices
+               Map<String, MetadataGraphVertex> vertices = g.getVertices();
+               for( String v : dropList ) 
+               {
+                       vertices.remove(v);
+               }
+               
+               // collect edgeDropList
+               List<String> edgeDropList = new ArrayList<String>( 
g.getEdges().size() );
+               for( Map.Entry<String, List<MetadataGraphEdge>> me : 
g.getEdges().entrySet() )
+               {
+                       String eKey = me.getKey();
+                       int ind = eKey.indexOf( 
MetadataGraph.DEFAULT_DOMAIN_SEPARATOR );
+                       String v1 = eKey.substring(0,ind);
+                       String v2 = eKey.substring(ind+1);
+                       
+                       if( visited.contains(v1) && visited.contains(v2) )
+                               continue;
+                       
+                       edgeDropList.add(eKey);
+               }
+               
+               if( edgeDropList.size() < 1 )
+                       return g;
+
+               // now - drop edges
+               Map<String, List<MetadataGraphEdge>> edges = g.getEdges();
+               for( String v : edgeDropList ) 
+               {
+                       edges.remove(v);
+               }
+               
+               return g;
+       }
+       
//-------------------------------------------------------------------------------------
+       private final void visit( String from, List<String> visited, 
Map<String, List<MetadataGraphEdge>> edges )
+       {
+               if( visited.contains( from ) )
+                       return;
+               
+               visited.add(from);
+               
+               for( Map.Entry<String, List<MetadataGraphEdge>> e : 
edges.entrySet() ) 
+               {
+                       if( e.getKey().startsWith(from) ) {
+                               String to = e.getKey().substring( 
e.getKey().indexOf(MetadataGraph.DEFAULT_DOMAIN_SEPARATOR)+1 );
+                               visit( to, visited, edges );
+                       }
+               }
+       }
+       
//-------------------------------------------------------------------------------------
+       private final EdgeHolder cleanEdges( MetadataGraphVertex v
+                                                                               
, Map< String, List<MetadataGraphEdge> > edges
+                                                                               
, ArtifactScopeEnum scope
+                                                                               
                        )
+       {
+               List< EdgeHolder > dirtyEdges = new ArrayList< EdgeHolder >(32);
+               String vKey = v.getMd().toDomainString();
+               for( Map.Entry<String, List<MetadataGraphEdge>> el : 
edges.entrySet() ) {
+                       if( el.getKey().endsWith(vKey) ) {
+                               for( MetadataGraphEdge e : el.getValue() ) {
+                                       dirtyEdges.add( new 
EdgeHolder(el.getKey(), e) );
+                               }
+                       }
+               }
+               
+               if( dirtyEdges.size() < 1 )
+                       return null;
+               
+               EdgeHolder res = new EdgeHolder();
+               
+               if( dirtyEdges.size() == 1 ) {
+                       if( scope.encloses( dirtyEdges.get(0).edge.getScope()) )
+                               return dirtyEdges.get(0);
+                       
+                       return null;
+               }
+                       
+               for( EdgeHolder eh : dirtyEdges )
+               {
+                       if( !scope.encloses(eh.edge.getScope()) )
+                               continue;
+                       
+                       if( res.key == null )
+                       {
+                               res.set( eh );
+                       }
+                       else 
+                       {
+                               MetadataGraphEdge winner = policy.apply( 
eh.edge, res.edge );
+                               if( ! res.edge.equals(winner) ) {
+                                       res.set(eh);
+                               }
+                       }
+               }
+
+               if( res.key == null )
+                       return null;
+
+               return res;
+       }
+       
//-------------------------------------------------------------------------------------
+       
//-------------------------------------------------------------------------------------
+}

Added: 
maven/artifact/trunk/src/main/java/org/apache/maven/artifact/resolver/conflict/GraphConflictResolutionException.java
URL: 
http://svn.apache.org/viewvc/maven/artifact/trunk/src/main/java/org/apache/maven/artifact/resolver/conflict/GraphConflictResolutionException.java?rev=599650&view=auto
==============================================================================
--- 
maven/artifact/trunk/src/main/java/org/apache/maven/artifact/resolver/conflict/GraphConflictResolutionException.java
 (added)
+++ 
maven/artifact/trunk/src/main/java/org/apache/maven/artifact/resolver/conflict/GraphConflictResolutionException.java
 Thu Nov 29 16:08:03 2007
@@ -0,0 +1,37 @@
+package org.apache.maven.artifact.resolver.conflict;
+
+/**
+ * 
+ * @author <a href="mailto:[EMAIL PROTECTED]">Oleg Gusakov</a>
+ * 
+ * @version $Id$
+ */
+
+public class GraphConflictResolutionException
+extends Exception
+{
+       /**
+        * 
+        */
+       private static final long serialVersionUID = 2677613140287940255L;
+
+       public GraphConflictResolutionException()
+       {
+       }
+
+       public GraphConflictResolutionException(String message)
+       {
+               super(message);
+       }
+
+       public GraphConflictResolutionException(Throwable cause)
+       {
+               super(cause);
+       }
+
+       public GraphConflictResolutionException(String message, Throwable cause)
+       {
+               super(message, cause);
+       }
+
+}

Added: 
maven/artifact/trunk/src/main/java/org/apache/maven/artifact/resolver/conflict/GraphConflictResolutionPolicy.java
URL: 
http://svn.apache.org/viewvc/maven/artifact/trunk/src/main/java/org/apache/maven/artifact/resolver/conflict/GraphConflictResolutionPolicy.java?rev=599650&view=auto
==============================================================================
--- 
maven/artifact/trunk/src/main/java/org/apache/maven/artifact/resolver/conflict/GraphConflictResolutionPolicy.java
 (added)
+++ 
maven/artifact/trunk/src/main/java/org/apache/maven/artifact/resolver/conflict/GraphConflictResolutionPolicy.java
 Thu Nov 29 16:08:03 2007
@@ -0,0 +1,22 @@
+package org.apache.maven.artifact.resolver.conflict;
+
+import org.apache.maven.artifact.resolver.metadata.MetadataGraphEdge;
+
+/**
+ *  MetadataGraph edge selection policy. Complements 
+ *  GraphConflictResolver by being injected into it
+ * 
+ * @author <a href="mailto:[EMAIL PROTECTED]">Oleg Gusakov</a>
+ * 
+ * @version $Id$
+ */
+
+public interface GraphConflictResolutionPolicy
+{
+    static String ROLE = GraphConflictResolutionPolicy.class.getName();
+
+    public MetadataGraphEdge apply( 
+                         MetadataGraphEdge e1
+                       , MetadataGraphEdge e2
+                       );
+}

Added: 
maven/artifact/trunk/src/main/java/org/apache/maven/artifact/resolver/conflict/GraphConflictResolver.java
URL: 
http://svn.apache.org/viewvc/maven/artifact/trunk/src/main/java/org/apache/maven/artifact/resolver/conflict/GraphConflictResolver.java?rev=599650&view=auto
==============================================================================
--- 
maven/artifact/trunk/src/main/java/org/apache/maven/artifact/resolver/conflict/GraphConflictResolver.java
 (added)
+++ 
maven/artifact/trunk/src/main/java/org/apache/maven/artifact/resolver/conflict/GraphConflictResolver.java
 Thu Nov 29 16:08:03 2007
@@ -0,0 +1,50 @@
+package org.apache.maven.artifact.resolver.conflict;
+
+/*
+ * 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.ArtifactScopeEnum;
+import org.apache.maven.artifact.resolver.metadata.MetadataGraph;
+
+/**
+ * Resolves conflicts in the supplied dependency graph. 
+ * Different implementations will implement different conflict resolution 
policies.
+ *
+ * @author <a href="mailto:[EMAIL PROTECTED]">Oleg Gusakov</a>
+ * @version $Id$
+ */
+public interface GraphConflictResolver
+{
+    static String ROLE = GraphConflictResolver.class.getName();
+
+    /**
+     * Cleanses the supplied graph by leaving only one directed versioned edge\
+     * between any two nodes, if multiple exists. Uses scope relationships, 
defined 
+     * in <code>ArtifactScopeEnum</code>
+     *
+     * @param graph the "dirty" graph to be simplified via conflict resolution
+     * @param scope scope for which the graph should be resolved
+     * 
+     * @return resulting "clean" graph for the specified scope
+     * 
+     * @since 3.0
+     */
+    MetadataGraph resolveConflicts( MetadataGraph graph, ArtifactScopeEnum 
scope )
+    throws GraphConflictResolutionException;
+}

Added: 
maven/artifact/trunk/src/main/java/org/apache/maven/artifact/resolver/metadata/MetadataGraphVertex.java
URL: 
http://svn.apache.org/viewvc/maven/artifact/trunk/src/main/java/org/apache/maven/artifact/resolver/metadata/MetadataGraphVertex.java?rev=599650&view=auto
==============================================================================
--- 
maven/artifact/trunk/src/main/java/org/apache/maven/artifact/resolver/metadata/MetadataGraphVertex.java
 (added)
+++ 
maven/artifact/trunk/src/main/java/org/apache/maven/artifact/resolver/metadata/MetadataGraphVertex.java
 Thu Nov 29 16:08:03 2007
@@ -0,0 +1,36 @@
+package org.apache.maven.artifact.resolver.metadata;
+
+
+/**
+ * metadata graph vertice - just a wrapper around artifact's metadata
+ * 
+ * @author <a href="[EMAIL PROTECTED]">Oleg Gusakov</a>
+ *
+ */
+
+public class MetadataGraphVertex
+{
+    ArtifactMetadata md;
+
+    public MetadataGraphVertex( ArtifactMetadata md )
+    {
+        super();
+        this.md = md;
+    }
+
+    public ArtifactMetadata getMd()
+    {
+        return md;
+    }
+
+    public void setMd( ArtifactMetadata md )
+    {
+        this.md = md;
+    }
+
+       @Override
+       public String toString()
+       {
+               return "["+ (md == null ? "no metadata" : md.toString()) + "]";
+       }
+}

Added: 
maven/artifact/trunk/src/main/java/org/apache/maven/artifact/transform/ClasspathContainer.java
URL: 
http://svn.apache.org/viewvc/maven/artifact/trunk/src/main/java/org/apache/maven/artifact/transform/ClasspathContainer.java?rev=599650&view=auto
==============================================================================
--- 
maven/artifact/trunk/src/main/java/org/apache/maven/artifact/transform/ClasspathContainer.java
 (added)
+++ 
maven/artifact/trunk/src/main/java/org/apache/maven/artifact/transform/ClasspathContainer.java
 Thu Nov 29 16:08:03 2007
@@ -0,0 +1,117 @@
+package org.apache.maven.artifact.transform;
+
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+
+import org.apache.maven.artifact.ArtifactScopeEnum;
+import org.apache.maven.artifact.resolver.metadata.ArtifactMetadata;
+import org.apache.maven.artifact.resolver.metadata.MetadataGraph;
+import org.apache.maven.artifact.resolver.metadata.MetadataGraphVertex;
+import org.apache.maven.artifact.resolver.metadata.MetadataResolutionException;
+import org.apache.maven.artifact.resolver.metadata.MetadataTreeNode;
+
+/**
+ * classpath container that is aware of the classpath scope
+ * 
+ * @author <a href="[EMAIL PROTECTED]">Oleg Gusakov</a>
+ *
+ */
+public class ClasspathContainer
+implements Iterable<ArtifactMetadata>
+{
+       private List<ArtifactMetadata> classpath;
+       private ArtifactScopeEnum      scope;
+       
+       
//-------------------------------------------------------------------------------------------
+       public ClasspathContainer(ArtifactScopeEnum scope)
+       {
+               this.scope = ArtifactScopeEnum.checkScope(scope);
+       }
+       
//-------------------------------------------------------------------------------------------
+       public ClasspathContainer(
+                         List<ArtifactMetadata> classpath
+                       , ArtifactScopeEnum scope
+                                                       )
+       {
+               this(scope);
+               this.classpath = classpath;
+       }
+       
//-------------------------------------------------------------------------------------------
+       public Iterator<ArtifactMetadata> iterator()
+       {
+               return classpath == null ? null : classpath.iterator() ;
+       }
+       
//-------------------------------------------------------------------------------------------
+       public ClasspathContainer add( ArtifactMetadata md )
+       {
+               if( classpath == null )
+                       classpath = new ArrayList<ArtifactMetadata>(16);
+                                                                               
+               classpath.add(md);
+               
+               return this;
+       }
+       
//-------------------------------------------------------------------------------------------
+       public List<ArtifactMetadata> getClasspath()
+       {
+               return classpath;
+       }
+       
//-------------------------------------------------------------------------------------------
+       public MetadataTreeNode getClasspathAsTree()
+       throws MetadataResolutionException
+       {
+               if( classpath == null || classpath.size() < 1 )
+                       return null;
+               
+               MetadataTreeNode tree   = null;
+               MetadataTreeNode parent = null;
+               MetadataTreeNode node   = null;
+
+               for( ArtifactMetadata md : classpath ) {
+                       node = new MetadataTreeNode( md, parent, 
md.isResolved(), md.getArtifactScope() );
+                       if( tree == null ) {
+                               tree = node;
+                       }
+                       
+                       if( parent != null ) {
+                               parent.setNChildren(1);
+                               parent.addChild(0, node);
+                       }
+                       
+                       parent = node;
+                       
+               }
+               return tree;
+       }
+
+       public void setClasspath(List<ArtifactMetadata> classpath)
+       {
+               this.classpath = classpath;
+       }
+
+       public ArtifactScopeEnum getScope()
+       {
+               return scope;
+       }
+
+       public void setScope(ArtifactScopeEnum scope)
+       {
+               this.scope = scope;
+       }
+       
//-------------------------------------------------------------------------------------------
+       @Override
+       public String toString()
+       {
+               StringBuilder sb = new StringBuilder(256);
+               sb.append("[scope="+scope.getScope() );
+               if(classpath != null)
+                       for( ArtifactMetadata md : classpath ) {
+                               sb.append(": 
"+md.toString()+'{'+md.getArtifactUri()+'}');
+                       }
+               sb.append(']');
+               return sb.toString();
+       }
+       
//-------------------------------------------------------------------------------------------
+       
//-------------------------------------------------------------------------------------------
+}

Added: 
maven/artifact/trunk/src/main/java/org/apache/maven/artifact/transform/ClasspathTransformation.java
URL: 
http://svn.apache.org/viewvc/maven/artifact/trunk/src/main/java/org/apache/maven/artifact/transform/ClasspathTransformation.java?rev=599650&view=auto
==============================================================================
--- 
maven/artifact/trunk/src/main/java/org/apache/maven/artifact/transform/ClasspathTransformation.java
 (added)
+++ 
maven/artifact/trunk/src/main/java/org/apache/maven/artifact/transform/ClasspathTransformation.java
 Thu Nov 29 16:08:03 2007
@@ -0,0 +1,33 @@
+package org.apache.maven.artifact.transform;
+
+import org.apache.maven.artifact.ArtifactScopeEnum;
+import org.apache.maven.artifact.resolver.metadata.MetadataGraph;
+
+
+/**
+ * Helper class to conver an Md Graph into some form of a classpath
+ * 
+ * @author <a href="[EMAIL PROTECTED]">Oleg Gusakov</a>
+ *
+ */
+public interface ClasspathTransformation
+{
+    String ROLE = ClasspathTransformation.class.getName();
+
+    /**
+     * Transform Graph into a Collection of metadata objects that
+     * could serve as a classpath for a particular scope
+     * 
+     * @param dirtyGraph - dependency graph
+     * @param scope - which classpath to extract
+     * @param resolve - whether to resolve artifacts.
+     * @return Collection of metadata objects in the linked subgraph of the 
graph which 
+     *             contains the graph.getEntry() vertice
+     */
+    ClasspathContainer transform( MetadataGraph dirtyGraph
+                                                                         , 
ArtifactScopeEnum scope
+                                                                         , 
boolean resolve
+                                                                         )
+    throws MetadataGraphTransformationException
+    ;
+}

Added: 
maven/artifact/trunk/src/main/java/org/apache/maven/artifact/transform/DefaultClasspathTransformation.java
URL: 
http://svn.apache.org/viewvc/maven/artifact/trunk/src/main/java/org/apache/maven/artifact/transform/DefaultClasspathTransformation.java?rev=599650&view=auto
==============================================================================
--- 
maven/artifact/trunk/src/main/java/org/apache/maven/artifact/transform/DefaultClasspathTransformation.java
 (added)
+++ 
maven/artifact/trunk/src/main/java/org/apache/maven/artifact/transform/DefaultClasspathTransformation.java
 Thu Nov 29 16:08:03 2007
@@ -0,0 +1,163 @@
+package org.apache.maven.artifact.transform;
+
+import java.util.ArrayList;
+import java.util.Comparator;
+import java.util.List;
+import java.util.Map;
+import java.util.TreeSet;
+
+import org.apache.maven.artifact.ArtifactScopeEnum;
+import 
org.apache.maven.artifact.resolver.conflict.GraphConflictResolutionException;
+import org.apache.maven.artifact.resolver.conflict.GraphConflictResolver;
+import org.apache.maven.artifact.resolver.metadata.ArtifactMetadata;
+import org.apache.maven.artifact.resolver.metadata.MetadataGraph;
+import org.apache.maven.artifact.resolver.metadata.MetadataGraphEdge;
+import org.apache.maven.artifact.resolver.metadata.MetadataGraphVertex;
+
+/**
+ * default implementation of the metadata classpath transformer
+ * 
+ * @author <a href="[EMAIL PROTECTED]">Oleg Gusakov</a>
+ *
+ * @plexus.component
+ *
+ */
+public class DefaultClasspathTransformation
+implements ClasspathTransformation
+{
+    /** @plexus.requirement */
+    GraphConflictResolver conflictResolver;
+    
//----------------------------------------------------------------------------------------------------
+       public ClasspathContainer transform(
+                                                 MetadataGraph dirtyGraph
+                                               , ArtifactScopeEnum scope
+                                               , boolean resolve
+                                                                               
)
+    throws MetadataGraphTransformationException
+       {
+               try {
+                       if(    dirtyGraph == null
+                               || dirtyGraph.isEmpty()
+                       )
+                               return null;
+                       
+                       MetadataGraph cleanGraph = 
conflictResolver.resolveConflicts( dirtyGraph, scope );
+
+                       if(    cleanGraph == null
+                               || cleanGraph.isEmpty() 
+                       )
+                               return null;
+                       
+                       ClasspathContainer cpc = new ClasspathContainer( scope 
);
+                       if( cleanGraph.getEdges() == null || 
cleanGraph.getEdges().isEmpty() ) {
+                               // single entry in the classpath, populated 
from itself
+                               ArtifactMetadata amd = 
cleanGraph.getEntry().getMd();
+                               cpc.add( amd );
+                       } else {
+                               ClasspathGraphVisitor v = new 
ClasspathGraphVisitor( cleanGraph, cpc );
+                               MetadataGraphVertex entry = 
cleanGraph.getEntry();
+                               ArtifactMetadata md = entry.getMd();
+                               // entry point
+                               v.visit( entry ); //, md.getVersion(), 
md.getArtifactUri() );
+                       }
+                       
+                       return cpc;
+               } catch (GraphConflictResolutionException e) {
+                       throw new MetadataGraphTransformationException(e);
+               }
+       }
+    
//===================================================================================================
+       /**
+        * helper class to store visitation data
+        */
+    private class MetadataGraphEdgeWithNodes
+    {
+       MetadataGraphEdge edge;
+       String source;
+       String target;
+
+       public MetadataGraphEdgeWithNodes(MetadataGraphEdge edge, String 
source, String target)
+       {
+               super();
+               this.edge = edge;
+               this.target = target;
+       }
+    }
+    
//===================================================================================================
+    /**
+     * Helper class to traverse graph. Required to make the containing method 
thread-safe
+     * and yet use class level data to lessen stack usage in recursion
+     */
+    private class ClasspathGraphVisitor
+    {
+       Map<String, List<MetadataGraphEdge>> edges;
+       Map< String, MetadataGraphVertex> vertices;
+       ClasspathContainer cpc;
+       List<String> visited;
+       
//-----------------------------------------------------------------------
+       protected ClasspathGraphVisitor( MetadataGraph cleanGraph, 
ClasspathContainer cpc )
+       {
+               this.cpc = cpc;
+               
+               edges = cleanGraph.getEdges();
+               vertices = cleanGraph.getVertices();
+               visited = new ArrayList<String>( 
cleanGraph.getVertices().size() );
+       }
+       
//-----------------------------------------------------------------------
+       protected void visit( MetadataGraphVertex node ) //, String version, 
String artifactUri )
+       {
+               ArtifactMetadata md = node.getMd();
+               String nodeKey = md.toDomainString();
+               if( visited.contains(nodeKey) )
+                       return;
+
+               cpc.add( md );
+               
+               TreeSet<MetadataGraphEdgeWithNodes> deps = new 
TreeSet<MetadataGraphEdgeWithNodes>(
+                                       new 
Comparator<MetadataGraphEdgeWithNodes>() 
+                                       {
+                                               public int compare( 
MetadataGraphEdgeWithNodes e1
+                                                                               
  , MetadataGraphEdgeWithNodes e2
+                                                                               
  )
+                                               {
+                                                       if( e1.edge.getDepth() 
== e2.edge.getDepth() )
+                                                               return 
e2.edge.getPomOrder() - e1.edge.getPomOrder();
+
+                                                       return 
e2.edge.getDepth() - e1.edge.getDepth();
+                                               }
+                                       }
+                               );
+
+               for( Map.Entry<String, List<MetadataGraphEdge>> el : 
edges.entrySet() ) {
+                       if( el.getKey().startsWith(nodeKey) ) {
+                               String edgeKey = el.getKey();
+                               int ind = 
edgeKey.indexOf(MetadataGraph.DEFAULT_DOMAIN_SEPARATOR);
+                               String source = edgeKey.substring( 0, ind );
+                               String target = edgeKey.substring( ind+1 );
+                               for( MetadataGraphEdge e : el.getValue() )
+                                       deps.add( new 
MetadataGraphEdgeWithNodes(e,source,target) );
+                       }
+               }
+               
+               if( deps.size() > 0 )
+                       for( MetadataGraphEdgeWithNodes e : deps ) {
+                               MetadataGraphVertex targetNode = 
vertices.get(e.target);
+                               
+                               // explain where this link is from
+                               ArtifactMetadata tmd = targetNode.getMd();
+                               ArtifactMetadata smd = e.edge.getSource();
+//                             if( tmd != null && smd != null )
+//                                     tmd.setWhy( "originated from 
"+smd.toString() );
+                               
+                               visit( targetNode );//, e.edge.getVersion(), 
e.edge.getArtifactUri() );
+                       }
+       }
+       
//-----------------------------------------------------------------------
+       
//-----------------------------------------------------------------------
+    }
+    
//----------------------------------------------------------------------------------------------------
+    
//----------------------------------------------------------------------------------------------------
+}
+
+
+

Added: 
maven/artifact/trunk/src/main/java/org/apache/maven/artifact/transform/MetadataGraphTransformationException.java
URL: 
http://svn.apache.org/viewvc/maven/artifact/trunk/src/main/java/org/apache/maven/artifact/transform/MetadataGraphTransformationException.java?rev=599650&view=auto
==============================================================================
--- 
maven/artifact/trunk/src/main/java/org/apache/maven/artifact/transform/MetadataGraphTransformationException.java
 (added)
+++ 
maven/artifact/trunk/src/main/java/org/apache/maven/artifact/transform/MetadataGraphTransformationException.java
 Thu Nov 29 16:08:03 2007
@@ -0,0 +1,35 @@
+package org.apache.maven.artifact.transform;
+
+/**
+ * @author <a href="[EMAIL PROTECTED]">Oleg Gusakov</a>
+ *
+ */
+public class MetadataGraphTransformationException
+extends Exception
+{
+
+       /**
+        * 
+        */
+       private static final long serialVersionUID = -4029897098314019152L;
+
+       public MetadataGraphTransformationException()
+       {
+       }
+
+       public MetadataGraphTransformationException(String message)
+       {
+               super(message);
+       }
+
+       public MetadataGraphTransformationException(Throwable cause)
+       {
+               super(cause);
+       }
+
+       public MetadataGraphTransformationException(String message, Throwable 
cause)
+       {
+               super(message, cause);
+       }
+
+}

Added: 
maven/artifact/trunk/src/test/java/org/apache/maven/artifact/resolver/conflict/DefaultGraphConflictResolutionPolicyTest.java
URL: 
http://svn.apache.org/viewvc/maven/artifact/trunk/src/test/java/org/apache/maven/artifact/resolver/conflict/DefaultGraphConflictResolutionPolicyTest.java?rev=599650&view=auto
==============================================================================
--- 
maven/artifact/trunk/src/test/java/org/apache/maven/artifact/resolver/conflict/DefaultGraphConflictResolutionPolicyTest.java
 (added)
+++ 
maven/artifact/trunk/src/test/java/org/apache/maven/artifact/resolver/conflict/DefaultGraphConflictResolutionPolicyTest.java
 Thu Nov 29 16:08:03 2007
@@ -0,0 +1,44 @@
+package org.apache.maven.artifact.resolver.conflict;
+
+import org.apache.maven.artifact.resolver.metadata.MetadataGraphEdge;
+import org.codehaus.plexus.PlexusTestCase;
+
+/**
+ *
+ * @author <a href="mailto:[EMAIL PROTECTED]">Oleg Gusakov</a>
+ * 
+ * @version $Id$
+ */
+
+public class DefaultGraphConflictResolutionPolicyTest
+extends PlexusTestCase
+{
+       GraphConflictResolutionPolicy policy;
+       MetadataGraphEdge e1;
+       MetadataGraphEdge e2;
+       MetadataGraphEdge e3;
+    
//------------------------------------------------------------------------------------------
+    @Override
+       protected void setUp() throws Exception
+       {
+               super.setUp();
+       policy = (GraphConflictResolutionPolicy) lookup( 
GraphConflictResolutionPolicy.ROLE, "default" );
+       e1 = new MetadataGraphEdge( "1.1", true, null, null, 2, 1 );
+       e2 = new MetadataGraphEdge( "1.2", true, null, null, 3, 2 );
+       e3 = new MetadataGraphEdge( "1.2", true, null, null, 2, 3 );
+       }
+    
//------------------------------------------------------------------------------------------
+    public void testDefaultPolicy()
+        throws Exception
+    {
+       MetadataGraphEdge res;
+       
+       res = policy.apply( e1, e2 );
+       assertEquals( "Wrong depth edge selected", "1.1", res.getVersion() );
+       
+       res = policy.apply( e1, e3 );
+       assertEquals( "Wrong version edge selected", "1.2", res.getVersion() );
+    }
+    
//------------------------------------------------------------------------------------------
+    
//------------------------------------------------------------------------------------------
+}

Added: 
maven/artifact/trunk/src/test/java/org/apache/maven/artifact/resolver/conflict/DefaultGraphConflictResolverTest.java
URL: 
http://svn.apache.org/viewvc/maven/artifact/trunk/src/test/java/org/apache/maven/artifact/resolver/conflict/DefaultGraphConflictResolverTest.java?rev=599650&view=auto
==============================================================================
--- 
maven/artifact/trunk/src/test/java/org/apache/maven/artifact/resolver/conflict/DefaultGraphConflictResolverTest.java
 (added)
+++ 
maven/artifact/trunk/src/test/java/org/apache/maven/artifact/resolver/conflict/DefaultGraphConflictResolverTest.java
 Thu Nov 29 16:08:03 2007
@@ -0,0 +1,147 @@
+package org.apache.maven.artifact.resolver.conflict;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+
+import org.apache.maven.artifact.ArtifactScopeEnum;
+import org.apache.maven.artifact.resolver.metadata.ArtifactMetadata;
+import org.apache.maven.artifact.resolver.metadata.MetadataGraph;
+import org.apache.maven.artifact.resolver.metadata.MetadataGraphEdge;
+import org.apache.maven.artifact.resolver.metadata.MetadataGraphVertex;
+import org.codehaus.plexus.PlexusTestCase;
+
+/**
+ *
+ * @author <a href="mailto:[EMAIL PROTECTED]">Oleg Gusakov</a>
+ * 
+ * @version $Id$
+ */
+
+public class DefaultGraphConflictResolverTest
+extends PlexusTestCase
+{
+       GraphConflictResolver resolver;
+       
+       MetadataGraph graph;
+
+       MetadataGraphEdge e1;
+       MetadataGraphEdge e2;
+       MetadataGraphEdge e3;
+
+       MetadataGraphVertex v1;
+       MetadataGraphVertex v2;
+       MetadataGraphVertex v3;
+       MetadataGraphVertex v4;
+    
//------------------------------------------------------------------------------------------
+    @Override
+       protected void setUp() throws Exception
+       {
+               super.setUp();
+               resolver = (GraphConflictResolver) lookup( 
GraphConflictResolver.ROLE, "default" );
+       
+               e1 = new MetadataGraphEdge( "1.1", true, null, null, 2, 1 );
+       e2 = new MetadataGraphEdge( "1.2", true, null, null, 3, 2 );
+       e3 = new MetadataGraphEdge( "1.2", true, null, null, 2, 3 );
+       
+       v1 = new MetadataGraphVertex(new ArtifactMetadata("g","a1","1.0"));
+       v2 = new MetadataGraphVertex(new ArtifactMetadata("g","a2","1.0"));
+       v3 = new MetadataGraphVertex(new ArtifactMetadata("g","a3","1.0"));
+       v4 = new MetadataGraphVertex(new ArtifactMetadata("g","a4","1.0"));
+       
+       graph = new MetadataGraph( 4, 3 );
+       graph.setEntry(v1);
+       Map< String, MetadataGraphVertex> v = graph.getVertices();
+       Map<String,List<MetadataGraphEdge>> e = graph.getEdges();
+       
+       v.put(v1.getMd().toDomainString(), v1);
+       v.put(v2.getMd().toDomainString(), v2);
+       v.put(v3.getMd().toDomainString(), v3);
+       v.put(v4.getMd().toDomainString(), v4);
+       /*
+        *       v2
+        *   v1<
+        *      v3-v4
+        * 
+        */
+       String key;
+       List<MetadataGraphEdge> le;
+       
+       // v1-->v2
+       key = MetadataGraph.edgeHash(v1, v2);
+       le = new ArrayList<MetadataGraphEdge>(2);
+       le.add( new MetadataGraphEdge( "1.1", true, null, null, 2, 1 ) );
+       le.add( new MetadataGraphEdge( "1.2", true, null, null, 2, 2 ) );
+       e.put( key, le );
+       
+       // v1-->v3
+       key = MetadataGraph.edgeHash(v1, v3);
+       le = new ArrayList<MetadataGraphEdge>(2);
+       le.add( new MetadataGraphEdge( "1.1", true, null, null, 2, 1 ) );
+       le.add( new MetadataGraphEdge( "1.2", true, null, null, 4, 2 ) );
+       e.put( key, le );
+       
+       // v3-->v4
+       key = MetadataGraph.edgeHash(v3, v4);
+       le = new ArrayList<MetadataGraphEdge>(2);
+       le.add( new MetadataGraphEdge( "1.1", true, ArtifactScopeEnum.runtime, 
null, 2, 1 ) );
+       le.add( new MetadataGraphEdge( "1.2", true, ArtifactScopeEnum.provided, 
null, 2, 2 ) );
+       e.put( key, le );
+       }
+    
//------------------------------------------------------------------------------------------
+    public void testCompileResolution()
+    throws Exception
+    {
+       MetadataGraph res;
+       
+       res = resolver.resolveConflicts( graph, ArtifactScopeEnum.compile );
+       
+       assertNotNull("null graph after resolver", res );
+       assertNotNull("no vertices in the resulting graph after resolver", 
res.getVertices() );
+       assertNotNull("no edges in the resulting graph after resolver", 
res.getEdges() );
+
+       assertEquals( "wrong # of vertices in the resulting graph after 
resolver", 4, res.getVertices().size() );
+       assertEquals( "wrong # of edges in the resulting graph after resolver", 
3, res.getEdges().size() );
+
+       String key = MetadataGraph.edgeHash( v1, v2 );
+       assertEquals( "wrong # of edges v1-v2 in the resulting graph after 
resolver", 1, res.getEdges().get(key).size() );
+       assertEquals( "wrong edge v1-v2 in the resulting graph after resolver", 
"1.2", res.getEdges().get(key).get(0).getVersion() );
+
+       key = MetadataGraph.edgeHash( v1, v3 );
+       assertEquals( "wrong # of edges v1-v3 in the resulting graph after 
resolver", 1, res.getEdges().get(key).size() );
+       assertEquals( "wrong edge v1-v3 in the resulting graph after resolver", 
"1.1", res.getEdges().get(key).get(0).getVersion() );
+
+       key = MetadataGraph.edgeHash( v3, v4 );
+       assertEquals( "wrong # of edges v3-v4 in the resulting graph after 
resolver", 1, res.getEdges().get(key).size() );
+       assertEquals( "wrong edge v3-v4 in the resulting graph after resolver", 
"1.2", res.getEdges().get(key).get(0).getVersion() );
+    }
+    
//------------------------------------------------------------------------------------------
+    public void testRuntimeResolution()
+    throws Exception
+    {
+       MetadataGraph res;
+       
+       res = resolver.resolveConflicts( graph, ArtifactScopeEnum.runtime );
+       
+       assertNotNull("null graph after resolver", res );
+       assertNotNull("no vertices in the resulting graph after resolver", 
res.getVertices() );
+       assertNotNull("no edges in the resulting graph after resolver", 
res.getEdges() );
+
+       assertEquals( "wrong # of vertices in the resulting graph after 
resolver", 4, res.getVertices().size() );
+       assertEquals( "wrong # of edges in the resulting graph after resolver", 
3, res.getEdges().size() );
+
+       String key = MetadataGraph.edgeHash( v1, v2 );
+       assertEquals( "wrong # of edges v1-v2 in the resulting graph after 
resolver", 1, res.getEdges().get(key).size() );
+       assertEquals( "wrong edge v1-v2 in the resulting graph after resolver", 
"1.2", res.getEdges().get(key).get(0).getVersion() );
+
+       key = MetadataGraph.edgeHash( v1, v3 );
+       assertEquals( "wrong # of edges v1-v3 in the resulting graph after 
resolver", 1, res.getEdges().get(key).size() );
+       assertEquals( "wrong edge v1-v3 in the resulting graph after resolver", 
"1.1", res.getEdges().get(key).get(0).getVersion() );
+
+       key = MetadataGraph.edgeHash( v3, v4 );
+       assertEquals( "wrong # of edges v3-v4 in the resulting graph after 
resolver", 1, res.getEdges().get(key).size() );
+       assertEquals( "wrong edge v3-v4 in the resulting graph after resolver", 
"1.1", res.getEdges().get(key).get(0).getVersion() );
+    }
+    
//------------------------------------------------------------------------------------------
+    
//------------------------------------------------------------------------------------------
+}

Added: 
maven/artifact/trunk/src/test/java/org/apache/maven/artifact/transform/DefaultClasspathTransformationTest.java
URL: 
http://svn.apache.org/viewvc/maven/artifact/trunk/src/test/java/org/apache/maven/artifact/transform/DefaultClasspathTransformationTest.java?rev=599650&view=auto
==============================================================================
--- 
maven/artifact/trunk/src/test/java/org/apache/maven/artifact/transform/DefaultClasspathTransformationTest.java
 (added)
+++ 
maven/artifact/trunk/src/test/java/org/apache/maven/artifact/transform/DefaultClasspathTransformationTest.java
 Thu Nov 29 16:08:03 2007
@@ -0,0 +1,119 @@
+package org.apache.maven.artifact.transform;
+
+import java.util.ArrayList;
+import java.util.Comparator;
+import java.util.List;
+import java.util.Map;
+import java.util.TreeSet;
+
+import org.apache.maven.artifact.ArtifactScopeEnum;
+import org.apache.maven.artifact.resolver.metadata.ArtifactMetadata;
+import org.apache.maven.artifact.resolver.metadata.MetadataGraph;
+import org.apache.maven.artifact.resolver.metadata.MetadataGraphEdge;
+import org.apache.maven.artifact.resolver.metadata.MetadataGraphVertex;
+import org.codehaus.plexus.PlexusTestCase;
+
+/**
+ *
+ * @author <a href="mailto:[EMAIL PROTECTED]">Oleg Gusakov</a>
+ * 
+ * @version $Id$
+ */
+
+public class DefaultClasspathTransformationTest
+extends PlexusTestCase
+{
+       ClasspathTransformation transform;
+
+       MetadataGraph graph;
+
+       MetadataGraphEdge e1;
+       MetadataGraphEdge e2;
+       MetadataGraphEdge e3;
+
+       MetadataGraphVertex v1;
+       MetadataGraphVertex v2;
+       MetadataGraphVertex v3;
+       MetadataGraphVertex v4;
+    
//------------------------------------------------------------------------------------------
+    @Override
+       protected void setUp() throws Exception
+       {
+               super.setUp();
+               transform = (ClasspathTransformation) lookup( 
ClasspathTransformation.ROLE, "default" );
+       
+               e1 = new MetadataGraphEdge( "1.1", true, null, null, 2, 1 );
+       e2 = new MetadataGraphEdge( "1.2", true, null, null, 3, 2 );
+       e3 = new MetadataGraphEdge( "1.2", true, null, null, 2, 3 );
+       
+       v1 = new MetadataGraphVertex(new ArtifactMetadata("g","a1","1.0"));
+       v2 = new MetadataGraphVertex(new ArtifactMetadata("g","a2","1.0"));
+       v3 = new MetadataGraphVertex(new ArtifactMetadata("g","a3","1.0"));
+       v4 = new MetadataGraphVertex(new ArtifactMetadata("g","a4","1.0"));
+       
+       graph = new MetadataGraph( 4, 3 );
+       graph.setEntry(v1);
+       Map< String, MetadataGraphVertex> v = graph.getVertices();
+       Map<String,List<MetadataGraphEdge>> e = graph.getEdges();
+       
+       v.put(v1.getMd().toDomainString(), v1);
+       v.put(v2.getMd().toDomainString(), v2);
+       v.put(v3.getMd().toDomainString(), v3);
+       v.put(v4.getMd().toDomainString(), v4);
+       /*
+        *       v2
+        *   v1<
+        *      v3-v4
+        * 
+        */
+       String key;
+       List<MetadataGraphEdge> le;
+       
+       // v1-->v2
+       key = MetadataGraph.edgeHash(v1, v2);
+       le = new ArrayList<MetadataGraphEdge>(2);
+       le.add( new MetadataGraphEdge( "1.1", true, null, null, 2, 1 ) );
+       le.add( new MetadataGraphEdge( "1.2", true, null, null, 2, 2 ) );
+       e.put( key, le );
+       
+       // v1-->v3
+       key = MetadataGraph.edgeHash(v1, v3);
+       le = new ArrayList<MetadataGraphEdge>(2);
+       le.add( new MetadataGraphEdge( "1.1", true, null, null, 2, 1 ) );
+       le.add( new MetadataGraphEdge( "1.2", true, null, null, 4, 2 ) );
+       e.put( key, le );
+       
+       // v3-->v4
+       key = MetadataGraph.edgeHash(v3, v4);
+       le = new ArrayList<MetadataGraphEdge>(2);
+//     le.add( new MetadataGraphEdge( "1.1", true, ArtifactScopeEnum.runtime, 
null, 2, 1 ) );
+       le.add( new MetadataGraphEdge( "1.2", true, ArtifactScopeEnum.test, 
null, 2, 2 ) );
+       e.put( key, le );
+       }
+    
//------------------------------------------------------------------------------------------
+    public void testCompileClasspathTransform()
+    throws Exception
+    {
+       ClasspathContainer res;
+       
+       res = transform.transform( graph, ArtifactScopeEnum.compile, false );
+
+               assertNotNull("null classpath container after compile 
transform", res );
+               assertNotNull("null classpath after compile transform", 
res.getClasspath() );
+               assertEquals("compile classpath should have 4 entries", 4, 
res.getClasspath().size() );
+    }
+    
//------------------------------------------------------------------------------------------
+    public void testProvidedClasspathTransform()
+    throws Exception
+    {
+       ClasspathContainer res;
+       
+       res = transform.transform( graph, ArtifactScopeEnum.runtime, false );
+
+               assertNotNull("null classpath container after runtime 
transform", res );
+               assertNotNull("null classpath after runtime transform", 
res.getClasspath() );
+               assertEquals("runtime classpath should have 3 entries", 3, 
res.getClasspath().size() );
+    }
+    
//------------------------------------------------------------------------------------------
+    
//------------------------------------------------------------------------------------------
+}


Reply via email to