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