You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@maven.apache.org by jo...@apache.org on 2006/11/20 22:21:44 UTC
svn commit: r477344 - in /maven/shared/trunk/maven-dependency-tree: ./ src/
src/main/ src/main/java/ src/main/java/org/ src/main/java/org/apache/
src/main/java/org/apache/maven/ src/main/java/org/apache/maven/shared/
src/main/java/org/apache/maven/shar...
Author: joakime
Date: Mon Nov 20 13:21:43 2006
New Revision: 477344
URL: http://svn.apache.org/viewvc?view=rev&rev=477344
Log:
[MNG-2654] Adding Maven Dependency Tree.
Thanks Mark Hobson!
Added:
maven/shared/trunk/maven-dependency-tree/ (with props)
maven/shared/trunk/maven-dependency-tree/pom.xml (with props)
maven/shared/trunk/maven-dependency-tree/src/
maven/shared/trunk/maven-dependency-tree/src/main/
maven/shared/trunk/maven-dependency-tree/src/main/java/
maven/shared/trunk/maven-dependency-tree/src/main/java/org/
maven/shared/trunk/maven-dependency-tree/src/main/java/org/apache/
maven/shared/trunk/maven-dependency-tree/src/main/java/org/apache/maven/
maven/shared/trunk/maven-dependency-tree/src/main/java/org/apache/maven/shared/
maven/shared/trunk/maven-dependency-tree/src/main/java/org/apache/maven/shared/dependency/
maven/shared/trunk/maven-dependency-tree/src/main/java/org/apache/maven/shared/dependency/tree/
maven/shared/trunk/maven-dependency-tree/src/main/java/org/apache/maven/shared/dependency/tree/DefaultDependencyTreeBuilder.java (with props)
maven/shared/trunk/maven-dependency-tree/src/main/java/org/apache/maven/shared/dependency/tree/DependencyNode.java (with props)
maven/shared/trunk/maven-dependency-tree/src/main/java/org/apache/maven/shared/dependency/tree/DependencyTree.java (with props)
maven/shared/trunk/maven-dependency-tree/src/main/java/org/apache/maven/shared/dependency/tree/DependencyTreeBuilder.java (with props)
maven/shared/trunk/maven-dependency-tree/src/main/java/org/apache/maven/shared/dependency/tree/DependencyTreeBuilderException.java (with props)
maven/shared/trunk/maven-dependency-tree/src/main/java/org/apache/maven/shared/dependency/tree/DependencyTreeResolutionListener.java (with props)
maven/shared/trunk/maven-dependency-tree/src/test/
maven/shared/trunk/maven-dependency-tree/src/test/java/
maven/shared/trunk/maven-dependency-tree/src/test/java/org/
maven/shared/trunk/maven-dependency-tree/src/test/java/org/apache/
maven/shared/trunk/maven-dependency-tree/src/test/java/org/apache/maven/
maven/shared/trunk/maven-dependency-tree/src/test/java/org/apache/maven/shared/
maven/shared/trunk/maven-dependency-tree/src/test/java/org/apache/maven/shared/dependency/
maven/shared/trunk/maven-dependency-tree/src/test/java/org/apache/maven/shared/dependency/tree/
maven/shared/trunk/maven-dependency-tree/src/test/java/org/apache/maven/shared/dependency/tree/DependencyTreeResolutionListenerTest.java (with props)
Propchange: maven/shared/trunk/maven-dependency-tree/
------------------------------------------------------------------------------
--- svn:ignore (added)
+++ svn:ignore Mon Nov 20 13:21:43 2006
@@ -0,0 +1,14 @@
+target
+*~
+.*.swp
+*.log
+*.patch
+*.diff
+*.ipr
+*.iws
+*.iml
+.classpath
+.project
+.settings
+.wtpmodules
+cobertura.ser
Added: maven/shared/trunk/maven-dependency-tree/pom.xml
URL: http://svn.apache.org/viewvc/maven/shared/trunk/maven-dependency-tree/pom.xml?view=auto&rev=477344
==============================================================================
--- maven/shared/trunk/maven-dependency-tree/pom.xml (added)
+++ maven/shared/trunk/maven-dependency-tree/pom.xml Mon Nov 20 13:21:43 2006
@@ -0,0 +1,52 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<project
+ xmlns="http://maven.apache.org/POM/4.0.0"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+ <parent>
+ <groupId>org.apache.maven.shared</groupId>
+ <artifactId>maven-shared-components</artifactId>
+ <version>3</version>
+ </parent>
+
+ <modelVersion>4.0.0</modelVersion>
+ <groupId>org.apache.maven.shared</groupId>
+ <artifactId>maven-dependency-tree</artifactId>
+ <packaging>jar</packaging>
+ <version>1.0-SNAPSHOT</version>
+
+ <name>Maven Dependency Tree</name>
+
+ <build>
+ <plugins>
+ <plugin>
+ <artifactId>maven-compiler-plugin</artifactId>
+ <configuration>
+ <source>1.4</source>
+ <target>1.4</target>
+ </configuration>
+ </plugin>
+ <plugin>
+ <groupId>org.codehaus.plexus</groupId>
+ <artifactId>plexus-maven-plugin</artifactId>
+ <executions>
+ <execution>
+ <goals>
+ <goal>descriptor</goal>
+ </goals>
+ </execution>
+ </executions>
+ </plugin>
+ </plugins>
+ </build>
+
+ <dependencies>
+ <dependency>
+ <groupId>org.apache.maven</groupId>
+ <artifactId>maven-project</artifactId>
+ <version>2.0.4</version>
+ </dependency>
+ </dependencies>
+
+</project>
Propchange: maven/shared/trunk/maven-dependency-tree/pom.xml
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: maven/shared/trunk/maven-dependency-tree/pom.xml
------------------------------------------------------------------------------
svn:keywords = "Author Date Id Revision"
Propchange: maven/shared/trunk/maven-dependency-tree/pom.xml
------------------------------------------------------------------------------
svn:mime-type = text/xml
Added: maven/shared/trunk/maven-dependency-tree/src/main/java/org/apache/maven/shared/dependency/tree/DefaultDependencyTreeBuilder.java
URL: http://svn.apache.org/viewvc/maven/shared/trunk/maven-dependency-tree/src/main/java/org/apache/maven/shared/dependency/tree/DefaultDependencyTreeBuilder.java?view=auto&rev=477344
==============================================================================
--- maven/shared/trunk/maven-dependency-tree/src/main/java/org/apache/maven/shared/dependency/tree/DefaultDependencyTreeBuilder.java (added)
+++ maven/shared/trunk/maven-dependency-tree/src/main/java/org/apache/maven/shared/dependency/tree/DefaultDependencyTreeBuilder.java Mon Nov 20 13:21:43 2006
@@ -0,0 +1,134 @@
+package org.apache.maven.shared.dependency.tree;
+
+/*
+ * Copyright 2006 The Apache Software Foundation.
+ *
+ * Licensed 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.Collections;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.Map;
+
+import org.apache.maven.artifact.Artifact;
+import org.apache.maven.artifact.factory.ArtifactFactory;
+import org.apache.maven.artifact.metadata.ArtifactMetadataSource;
+import org.apache.maven.artifact.repository.ArtifactRepository;
+import org.apache.maven.artifact.resolver.ArtifactCollector;
+import org.apache.maven.artifact.resolver.ArtifactResolutionException;
+import org.apache.maven.artifact.versioning.InvalidVersionSpecificationException;
+import org.apache.maven.artifact.versioning.VersionRange;
+import org.apache.maven.model.Dependency;
+import org.apache.maven.model.DependencyManagement;
+import org.apache.maven.project.MavenProject;
+import org.apache.maven.project.ProjectBuildingException;
+import org.apache.maven.project.artifact.InvalidDependencyVersionException;
+
+/**
+ * Default implementation of <code>DependencyTreeBuilder</code>.
+ *
+ * @author Edwin Punzalan
+ * @author <a href="mailto:markhobson@gmail.com">Mark Hobson</a>
+ * @version $Id$
+ * @plexus.component role="org.apache.maven.shared.dependency.tree.DependencyTreeBuilder"
+ * @see DependencyTreeBuilder
+ */
+public class DefaultDependencyTreeBuilder implements DependencyTreeBuilder
+{
+ // DependencyTreeAssembler methods ----------------------------------------
+
+ /*
+ * @see org.apache.maven.shared.dependency.tree.DependencyTreeBuilder#buildDependencyTree(org.apache.maven.project.MavenProject,
+ * org.apache.maven.artifact.repository.ArtifactRepository, org.apache.maven.artifact.factory.ArtifactFactory,
+ * org.apache.maven.artifact.metadata.ArtifactMetadataSource,
+ * org.apache.maven.artifact.resolver.ArtifactCollector)
+ */
+ public DependencyTree buildDependencyTree( MavenProject project, ArtifactRepository repository,
+ ArtifactFactory factory, ArtifactMetadataSource metadataSource,
+ ArtifactCollector collector ) throws DependencyTreeBuilderException
+ {
+ DependencyTreeResolutionListener listener = new DependencyTreeResolutionListener();
+
+ try
+ {
+ Map managedVersions = getManagedVersionMap( project, factory );
+
+ // TODO site:run Why do we need to resolve this...
+ if ( project.getDependencyArtifacts() == null )
+ {
+ project.setDependencyArtifacts( project.createArtifacts( factory, null, null ) );
+ }
+
+ collector.collect( project.getDependencyArtifacts(), project.getArtifact(), managedVersions, repository,
+ project.getRemoteArtifactRepositories(), metadataSource, null,
+ Collections.singletonList( listener ) );
+
+ return new DependencyTree( listener.getRootNode(), listener.getNodes() );
+ }
+ catch ( ProjectBuildingException exception )
+ {
+ throw new DependencyTreeBuilderException( "Cannot build project dependency tree", exception );
+ }
+ catch ( InvalidDependencyVersionException exception )
+ {
+ throw new DependencyTreeBuilderException( "Cannot build project dependency tree", exception );
+ }
+ catch ( ArtifactResolutionException exception )
+ {
+ throw new DependencyTreeBuilderException( "Cannot build project dependency tree", exception );
+ }
+ }
+
+ // private methods --------------------------------------------------------
+
+ private Map getManagedVersionMap( MavenProject project, ArtifactFactory factory ) throws ProjectBuildingException
+ {
+ DependencyManagement dependencyManagement = project.getDependencyManagement();
+ Map managedVersionMap;
+
+ if ( dependencyManagement != null && dependencyManagement.getDependencies() != null )
+ {
+ managedVersionMap = new HashMap();
+
+ for ( Iterator iterator = dependencyManagement.getDependencies().iterator(); iterator.hasNext(); )
+ {
+ Dependency dependency = (Dependency) iterator.next();
+
+ try
+ {
+ VersionRange versionRange = VersionRange.createFromVersionSpec( dependency.getVersion() );
+
+ Artifact artifact =
+ factory.createDependencyArtifact( dependency.getGroupId(), dependency.getArtifactId(),
+ versionRange, dependency.getType(),
+ dependency.getClassifier(), dependency.getScope() );
+
+ managedVersionMap.put( dependency.getManagementKey(), artifact );
+ }
+ catch ( InvalidVersionSpecificationException exception )
+ {
+ throw new ProjectBuildingException( project.getId(), "Unable to parse version '"
+ + dependency.getVersion() + "' for dependency '" + dependency.getManagementKey()
+ + "': " + exception.getMessage(), exception );
+ }
+ }
+ }
+ else
+ {
+ managedVersionMap = Collections.EMPTY_MAP;
+ }
+
+ return managedVersionMap;
+ }
+}
Propchange: maven/shared/trunk/maven-dependency-tree/src/main/java/org/apache/maven/shared/dependency/tree/DefaultDependencyTreeBuilder.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: maven/shared/trunk/maven-dependency-tree/src/main/java/org/apache/maven/shared/dependency/tree/DefaultDependencyTreeBuilder.java
------------------------------------------------------------------------------
svn:keywords = "Author Date Id Revision"
Added: maven/shared/trunk/maven-dependency-tree/src/main/java/org/apache/maven/shared/dependency/tree/DependencyNode.java
URL: http://svn.apache.org/viewvc/maven/shared/trunk/maven-dependency-tree/src/main/java/org/apache/maven/shared/dependency/tree/DependencyNode.java?view=auto&rev=477344
==============================================================================
--- maven/shared/trunk/maven-dependency-tree/src/main/java/org/apache/maven/shared/dependency/tree/DependencyNode.java (added)
+++ maven/shared/trunk/maven-dependency-tree/src/main/java/org/apache/maven/shared/dependency/tree/DependencyNode.java Mon Nov 20 13:21:43 2006
@@ -0,0 +1,72 @@
+package org.apache.maven.shared.dependency.tree;
+
+/*
+ * Copyright 2006 The Apache Software Foundation.
+ *
+ * Licensed 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.List;
+
+import org.apache.maven.artifact.Artifact;
+
+/**
+ * Represents an artifact node within a Maven project's dependency tree.
+ *
+ * @author Edwin Punzalan
+ * @author <a href="mailto:markhobson@gmail.com">Mark Hobson</a>
+ * @version $Id$
+ * @see DependencyTree
+ */
+public class DependencyNode
+{
+ // fields -----------------------------------------------------------------
+
+ DependencyNode parent;
+
+ Artifact artifact;
+
+ int depth;
+
+ List children;
+
+ // constructors -----------------------------------------------------------
+
+ DependencyNode()
+ {
+ children = new ArrayList();
+ }
+
+ // public methods ---------------------------------------------------------
+
+ public DependencyNode getParent()
+ {
+ return parent;
+ }
+
+ public Artifact getArtifact()
+ {
+ return artifact;
+ }
+
+ public int getDepth()
+ {
+ return depth;
+ }
+
+ public List getChildren()
+ {
+ return children;
+ }
+}
Propchange: maven/shared/trunk/maven-dependency-tree/src/main/java/org/apache/maven/shared/dependency/tree/DependencyNode.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: maven/shared/trunk/maven-dependency-tree/src/main/java/org/apache/maven/shared/dependency/tree/DependencyNode.java
------------------------------------------------------------------------------
svn:keywords = "Author Date Id Revision"
Added: maven/shared/trunk/maven-dependency-tree/src/main/java/org/apache/maven/shared/dependency/tree/DependencyTree.java
URL: http://svn.apache.org/viewvc/maven/shared/trunk/maven-dependency-tree/src/main/java/org/apache/maven/shared/dependency/tree/DependencyTree.java?view=auto&rev=477344
==============================================================================
--- maven/shared/trunk/maven-dependency-tree/src/main/java/org/apache/maven/shared/dependency/tree/DependencyTree.java (added)
+++ maven/shared/trunk/maven-dependency-tree/src/main/java/org/apache/maven/shared/dependency/tree/DependencyTree.java Mon Nov 20 13:21:43 2006
@@ -0,0 +1,71 @@
+package org.apache.maven.shared.dependency.tree;
+
+/*
+ * Copyright 2006 The Apache Software Foundation.
+ *
+ * Licensed 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.Collection;
+import java.util.Iterator;
+import java.util.List;
+
+/**
+ * Represents a Maven project's dependency tree.
+ *
+ * @author <a href="mailto:markhobson@gmail.com">Mark Hobson</a>
+ * @version $Id$
+ */
+public class DependencyTree
+{
+ // fields -----------------------------------------------------------------
+
+ private final DependencyNode rootNode;
+
+ private final Collection nodes;
+
+ // constructors -----------------------------------------------------------
+
+ public DependencyTree( DependencyNode rootNode, Collection nodes )
+ {
+ this.rootNode = rootNode;
+ this.nodes = nodes;
+ }
+
+ // public methods ---------------------------------------------------------
+
+ public DependencyNode getRootNode()
+ {
+ return rootNode;
+ }
+
+ public Collection getNodes()
+ {
+ return nodes;
+ }
+
+ public List getArtifacts()
+ {
+ List artifacts = new ArrayList();
+
+ Iterator it = nodes.iterator();
+ while ( it.hasNext() )
+ {
+ DependencyNode node = (DependencyNode) it.next();
+ artifacts.add( node.getArtifact() );
+ }
+
+ return artifacts;
+ }
+}
Propchange: maven/shared/trunk/maven-dependency-tree/src/main/java/org/apache/maven/shared/dependency/tree/DependencyTree.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: maven/shared/trunk/maven-dependency-tree/src/main/java/org/apache/maven/shared/dependency/tree/DependencyTree.java
------------------------------------------------------------------------------
svn:keywords = "Author Date Id Revision"
Added: maven/shared/trunk/maven-dependency-tree/src/main/java/org/apache/maven/shared/dependency/tree/DependencyTreeBuilder.java
URL: http://svn.apache.org/viewvc/maven/shared/trunk/maven-dependency-tree/src/main/java/org/apache/maven/shared/dependency/tree/DependencyTreeBuilder.java?view=auto&rev=477344
==============================================================================
--- maven/shared/trunk/maven-dependency-tree/src/main/java/org/apache/maven/shared/dependency/tree/DependencyTreeBuilder.java (added)
+++ maven/shared/trunk/maven-dependency-tree/src/main/java/org/apache/maven/shared/dependency/tree/DependencyTreeBuilder.java Mon Nov 20 13:21:43 2006
@@ -0,0 +1,62 @@
+package org.apache.maven.shared.dependency.tree;
+
+/*
+ * Copyright 2006 The Apache Software Foundation.
+ *
+ * Licensed 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.factory.ArtifactFactory;
+import org.apache.maven.artifact.metadata.ArtifactMetadataSource;
+import org.apache.maven.artifact.repository.ArtifactRepository;
+import org.apache.maven.artifact.resolver.ArtifactCollector;
+import org.apache.maven.project.MavenProject;
+
+/**
+ * Builds a tree of dependencies for a given Maven project.
+ *
+ * @author <a href="mailto:markhobson@gmail.com">Mark Hobson</a>
+ * @version $Id$
+ */
+public interface DependencyTreeBuilder
+{
+ // fields -----------------------------------------------------------------
+
+ /**
+ * The plexus role for this component.
+ */
+ String ROLE = DependencyTreeBuilder.class.getName();
+
+ // public methods ---------------------------------------------------------
+
+ /**
+ * Builds a tree of dependencies for the specified Maven project.
+ *
+ * @param project
+ * the Maven project
+ * @param repository
+ * the artifact repository to resolve against
+ * @param factory
+ * the artifact factory to use
+ * @param metadataSource
+ * the artifact metadata source to use
+ * @param collector
+ * the artifact collector to use
+ * @return the dependency tree of the specified Maven project
+ * @throws DependencyTreeBuilderException
+ * if the dependency tree cannot be resolved
+ */
+ DependencyTree buildDependencyTree( MavenProject project, ArtifactRepository repository, ArtifactFactory factory,
+ ArtifactMetadataSource metadataSource, ArtifactCollector collector )
+ throws DependencyTreeBuilderException;
+}
Propchange: maven/shared/trunk/maven-dependency-tree/src/main/java/org/apache/maven/shared/dependency/tree/DependencyTreeBuilder.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: maven/shared/trunk/maven-dependency-tree/src/main/java/org/apache/maven/shared/dependency/tree/DependencyTreeBuilder.java
------------------------------------------------------------------------------
svn:keywords = "Author Date Id Revision"
Added: maven/shared/trunk/maven-dependency-tree/src/main/java/org/apache/maven/shared/dependency/tree/DependencyTreeBuilderException.java
URL: http://svn.apache.org/viewvc/maven/shared/trunk/maven-dependency-tree/src/main/java/org/apache/maven/shared/dependency/tree/DependencyTreeBuilderException.java?view=auto&rev=477344
==============================================================================
--- maven/shared/trunk/maven-dependency-tree/src/main/java/org/apache/maven/shared/dependency/tree/DependencyTreeBuilderException.java (added)
+++ maven/shared/trunk/maven-dependency-tree/src/main/java/org/apache/maven/shared/dependency/tree/DependencyTreeBuilderException.java Mon Nov 20 13:21:43 2006
@@ -0,0 +1,45 @@
+package org.apache.maven.shared.dependency.tree;
+
+/*
+ * Copyright 2006 The Apache Software Foundation.
+ *
+ * Licensed 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.
+ */
+
+/**
+ * Indicates that a Maven project's dependency tree cannot be resolved.
+ *
+ * @author <a href="mailto:markhobson@gmail.com">Mark Hobson</a>
+ * @version $Id$
+ */
+public class DependencyTreeBuilderException extends Exception
+{
+ // constants --------------------------------------------------------------
+
+ /**
+ * The serialisation unique ID.
+ */
+ private static final long serialVersionUID = -3525803081807951764L;
+
+ // constructors -----------------------------------------------------------
+
+ public DependencyTreeBuilderException( String message )
+ {
+ super( message );
+ }
+
+ public DependencyTreeBuilderException( String message, Throwable cause )
+ {
+ super( message, cause );
+ }
+}
Propchange: maven/shared/trunk/maven-dependency-tree/src/main/java/org/apache/maven/shared/dependency/tree/DependencyTreeBuilderException.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: maven/shared/trunk/maven-dependency-tree/src/main/java/org/apache/maven/shared/dependency/tree/DependencyTreeBuilderException.java
------------------------------------------------------------------------------
svn:keywords = "Author Date Id Revision"
Added: maven/shared/trunk/maven-dependency-tree/src/main/java/org/apache/maven/shared/dependency/tree/DependencyTreeResolutionListener.java
URL: http://svn.apache.org/viewvc/maven/shared/trunk/maven-dependency-tree/src/main/java/org/apache/maven/shared/dependency/tree/DependencyTreeResolutionListener.java?view=auto&rev=477344
==============================================================================
--- maven/shared/trunk/maven-dependency-tree/src/main/java/org/apache/maven/shared/dependency/tree/DependencyTreeResolutionListener.java (added)
+++ maven/shared/trunk/maven-dependency-tree/src/main/java/org/apache/maven/shared/dependency/tree/DependencyTreeResolutionListener.java Mon Nov 20 13:21:43 2006
@@ -0,0 +1,227 @@
+package org.apache.maven.shared.dependency.tree;
+
+/*
+ * Copyright 2006 The Apache Software Foundation.
+ *
+ * Licensed 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.Collection;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Stack;
+
+import org.apache.maven.artifact.Artifact;
+import org.apache.maven.artifact.resolver.ResolutionListener;
+import org.apache.maven.artifact.versioning.VersionRange;
+
+/**
+ * An artifact resolution listener that constructs a dependency tree.
+ *
+ * @author Edwin Punzalan
+ * @author <a href="mailto:markhobson@gmail.com">Mark Hobson</a>
+ * @version $Id$
+ */
+public class DependencyTreeResolutionListener implements ResolutionListener
+{
+ // fields -----------------------------------------------------------------
+
+ private final Stack parents;
+
+ private final Map artifacts;
+
+ private DependencyNode rootNode;
+
+ private int currentDepth;
+
+ // constructors -----------------------------------------------------------
+
+ public DependencyTreeResolutionListener()
+ {
+ parents = new Stack();
+ artifacts = new HashMap();
+
+ rootNode = null;
+ currentDepth = 0;
+ }
+
+ // ResolutionListener methods ---------------------------------------------
+
+ /*
+ * @see org.apache.maven.artifact.resolver.ResolutionListener#testArtifact(org.apache.maven.artifact.Artifact)
+ */
+ public void testArtifact( Artifact artifact )
+ {
+ // intentionally blank
+ }
+
+ /*
+ * @see org.apache.maven.artifact.resolver.ResolutionListener#startProcessChildren(org.apache.maven.artifact.Artifact)
+ */
+ public void startProcessChildren( Artifact artifact )
+ {
+ DependencyNode node = (DependencyNode) artifacts.get( artifact.getDependencyConflictId() );
+
+ node.depth = currentDepth++;
+
+ if ( parents.isEmpty() )
+ {
+ rootNode = node;
+ }
+
+ parents.push( node );
+ }
+
+ /*
+ * @see org.apache.maven.artifact.resolver.ResolutionListener#endProcessChildren(org.apache.maven.artifact.Artifact)
+ */
+ public void endProcessChildren( Artifact artifact )
+ {
+ DependencyNode check = (DependencyNode) parents.pop();
+
+ assert artifact.equals( check.artifact );
+
+ currentDepth--;
+ }
+
+ /*
+ * @see org.apache.maven.artifact.resolver.ResolutionListener#includeArtifact(org.apache.maven.artifact.Artifact)
+ */
+ public void includeArtifact( Artifact artifact )
+ {
+ if ( artifacts.containsKey( artifact.getDependencyConflictId() ) )
+ {
+ DependencyNode prev = (DependencyNode) artifacts.get( artifact.getDependencyConflictId() );
+
+ if ( prev.parent != null )
+ {
+ prev.parent.children.remove( prev );
+ }
+
+ artifacts.remove( artifact.getDependencyConflictId() );
+ }
+
+ DependencyNode node = new DependencyNode();
+ node.artifact = artifact;
+
+ if ( !parents.isEmpty() )
+ {
+ node.parent = (DependencyNode) parents.peek();
+ node.parent.children.add( node );
+ node.depth = currentDepth;
+ }
+
+ artifacts.put( artifact.getDependencyConflictId(), node );
+ }
+
+ /*
+ * @see org.apache.maven.artifact.resolver.ResolutionListener#omitForNearer(org.apache.maven.artifact.Artifact,
+ * org.apache.maven.artifact.Artifact)
+ */
+ public void omitForNearer( Artifact omitted, Artifact kept )
+ {
+ assert omitted.getDependencyConflictId().equals( kept.getDependencyConflictId() );
+
+ DependencyNode prev = (DependencyNode) artifacts.get( omitted.getDependencyConflictId() );
+
+ if ( prev != null )
+ {
+ if ( prev.parent != null )
+ {
+ prev.parent.children.remove( prev );
+ }
+
+ artifacts.remove( omitted.getDependencyConflictId() );
+ }
+
+ includeArtifact( kept );
+ }
+
+ /*
+ * @see org.apache.maven.artifact.resolver.ResolutionListener#updateScope(org.apache.maven.artifact.Artifact,
+ * java.lang.String)
+ */
+ public void updateScope( Artifact artifact, String scope )
+ {
+ DependencyNode node = (DependencyNode) artifacts.get( artifact.getDependencyConflictId() );
+
+ node.artifact.setScope( scope );
+ }
+
+ /*
+ * @see org.apache.maven.artifact.resolver.ResolutionListener#manageArtifact(org.apache.maven.artifact.Artifact,
+ * org.apache.maven.artifact.Artifact)
+ */
+ public void manageArtifact( Artifact artifact, Artifact replacement )
+ {
+ DependencyNode node = (DependencyNode) artifacts.get( artifact.getDependencyConflictId() );
+
+ if ( node != null )
+ {
+ if ( replacement.getVersion() != null )
+ {
+ node.artifact.setVersion( replacement.getVersion() );
+ }
+ if ( replacement.getScope() != null )
+ {
+ node.artifact.setScope( replacement.getScope() );
+ }
+ }
+ }
+
+ /*
+ * @see org.apache.maven.artifact.resolver.ResolutionListener#omitForCycle(org.apache.maven.artifact.Artifact)
+ */
+ public void omitForCycle( Artifact artifact )
+ {
+ // TODO: Track omit for cycle
+ }
+
+ /*
+ * @see org.apache.maven.artifact.resolver.ResolutionListener#updateScopeCurrentPom(org.apache.maven.artifact.Artifact,
+ * java.lang.String)
+ */
+ public void updateScopeCurrentPom( Artifact artifact, String key )
+ {
+ // TODO: Track scope update
+ }
+
+ /*
+ * @see org.apache.maven.artifact.resolver.ResolutionListener#selectVersionFromRange(org.apache.maven.artifact.Artifact)
+ */
+ public void selectVersionFromRange( Artifact artifact )
+ {
+ // TODO: Track version selection from range
+ }
+
+ /*
+ * @see org.apache.maven.artifact.resolver.ResolutionListener#restrictRange(org.apache.maven.artifact.Artifact,
+ * org.apache.maven.artifact.Artifact, org.apache.maven.artifact.versioning.VersionRange)
+ */
+ public void restrictRange( Artifact artifact, Artifact artifact1, VersionRange versionRange )
+ {
+ // TODO: Track range restriction.
+ }
+
+ // public methods ---------------------------------------------------------
+
+ public Collection getNodes()
+ {
+ return artifacts.values();
+ }
+
+ public DependencyNode getRootNode()
+ {
+ return rootNode;
+ }
+}
Propchange: maven/shared/trunk/maven-dependency-tree/src/main/java/org/apache/maven/shared/dependency/tree/DependencyTreeResolutionListener.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: maven/shared/trunk/maven-dependency-tree/src/main/java/org/apache/maven/shared/dependency/tree/DependencyTreeResolutionListener.java
------------------------------------------------------------------------------
svn:keywords = "Author Date Id Revision"
Added: maven/shared/trunk/maven-dependency-tree/src/test/java/org/apache/maven/shared/dependency/tree/DependencyTreeResolutionListenerTest.java
URL: http://svn.apache.org/viewvc/maven/shared/trunk/maven-dependency-tree/src/test/java/org/apache/maven/shared/dependency/tree/DependencyTreeResolutionListenerTest.java?view=auto&rev=477344
==============================================================================
--- maven/shared/trunk/maven-dependency-tree/src/test/java/org/apache/maven/shared/dependency/tree/DependencyTreeResolutionListenerTest.java (added)
+++ maven/shared/trunk/maven-dependency-tree/src/test/java/org/apache/maven/shared/dependency/tree/DependencyTreeResolutionListenerTest.java Mon Nov 20 13:21:43 2006
@@ -0,0 +1,238 @@
+package org.apache.maven.shared.dependency.tree;
+
+/*
+ * Copyright 2006 The Apache Software Foundation.
+ *
+ * Licensed 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 junit.framework.TestCase;
+import org.apache.maven.artifact.Artifact;
+import org.apache.maven.artifact.DefaultArtifact;
+import org.apache.maven.artifact.handler.DefaultArtifactHandler;
+import org.apache.maven.artifact.versioning.VersionRange;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.Iterator;
+import java.util.List;
+
+/**
+ * Tests <code>DependencyTreeResolutionListener</code>.
+ *
+ * @author Edwin Punzalan
+ * @author <a href="mailto:markhobson@gmail.com">Mark Hobson</a>
+ * @version $Id$
+ * @see DependencyTreeResolutionListener
+ */
+public class DependencyTreeResolutionListenerTest extends TestCase
+{
+ // constants --------------------------------------------------------------
+
+ private static final Artifact[] EMPTY_ARTIFACTS = new Artifact[0];
+
+ // fields -----------------------------------------------------------------
+
+ private DependencyTreeResolutionListener listener;
+
+ // TestCase methods -------------------------------------------------------
+
+ /*
+ * @see junit.framework.TestCase#setUp()
+ */
+ protected void setUp() throws Exception
+ {
+ super.setUp();
+
+ listener = new DependencyTreeResolutionListener();
+ }
+
+ // tests ------------------------------------------------------------------
+
+ public void testSimpleDependencyTree()
+ {
+ Artifact projectArtifact = createArtifact( "test-project", "project-artifact", "1.0" );
+ listener.includeArtifact( projectArtifact );
+
+ listener.startProcessChildren( projectArtifact );
+
+ Artifact depArtifact01 = createArtifact( "test-dep", "dependency-one", "1.0" );
+ listener.includeArtifact( depArtifact01 );
+
+ Artifact depArtifact02 = createArtifact( "test-dep", "dependency-two", "1.0" );
+ listener.includeArtifact( depArtifact02 );
+
+ Artifact depArtifact03 = createArtifact( "test-dep", "dependency-three", "1.0" );
+ listener.includeArtifact( depArtifact03 );
+
+ listener.endProcessChildren( projectArtifact );
+
+ Collection artifacts = listener.getNodes();
+ assertTrue( "Check artifact lists match", compareNodeListToArtifacts( artifacts, new Artifact[] {
+ depArtifact01, depArtifact02, depArtifact03, projectArtifact } ) );
+
+ assertEquals( "Test dependency map key", projectArtifact, listener.getRootNode().getArtifact() );
+
+ assertTrue( "Check artifact lists match", compareNodeListToArtifacts( listener.getRootNode().getChildren(),
+ new Artifact[] { depArtifact01,
+ depArtifact02, depArtifact03 } ) );
+ }
+
+ public void testSimpleDepTreeWithTransitiveDeps()
+ {
+ Artifact projectArtifact = createArtifact( "test-project", "project-artifact", "1.0" );
+ listener.includeArtifact( projectArtifact );
+
+ listener.startProcessChildren( projectArtifact );
+
+ Artifact depArtifact1 = createArtifact( "test-dep", "dependency-one", "1.0" );
+ listener.includeArtifact( depArtifact1 );
+
+ listener.startProcessChildren( depArtifact1 );
+
+ Artifact depArtifact01 = createArtifact( "test-dep", "dependency-zero-one", "1.0" );
+ listener.includeArtifact( depArtifact01 );
+
+ Artifact depArtifact02 = createArtifact( "test-dep", "dependency-zero-two", "1.0" );
+ listener.includeArtifact( depArtifact02 );
+
+ listener.endProcessChildren( depArtifact1 );
+
+ Artifact depArtifact2 = createArtifact( "test-dep", "dependency-two", "1.0" );
+ listener.includeArtifact( depArtifact2 );
+
+ Artifact depArtifact3 = createArtifact( "test-dep", "dependency-three", "1.0" );
+ listener.includeArtifact( depArtifact3 );
+
+ listener.endProcessChildren( projectArtifact );
+
+ Collection artifacts = listener.getNodes();
+ assertTrue( compareNodeListToArtifacts( artifacts, new Artifact[] { depArtifact1, depArtifact2, depArtifact3,
+ depArtifact01, depArtifact02, projectArtifact } ) );
+
+ assertEquals( "Check root", projectArtifact, listener.getRootNode().getArtifact() );
+ assertTrue( compareNodeListToArtifacts( listener.getRootNode().getChildren(), new Artifact[] { depArtifact1,
+ depArtifact2, depArtifact3 } ) );
+
+ DependencyNode depNode1 = getChild( listener.getRootNode(), depArtifact1 );
+ assertTrue( compareNodeListToArtifacts( depNode1.getChildren(), new Artifact[] { depArtifact01, depArtifact02 } ) );
+ }
+
+ public void testComplexDependencyTree()
+ {
+ Artifact projectArtifact = createArtifact( "test-project", "project-artifact", "1.0" );
+ listener.includeArtifact( projectArtifact );
+
+ listener.startProcessChildren( projectArtifact );
+
+ Artifact depArtifact1 = createArtifact( "test-dep", "dependency-one", "1.0", Artifact.SCOPE_COMPILE );
+ listener.includeArtifact( depArtifact1 );
+
+ listener.startProcessChildren( depArtifact1 );
+
+ Artifact depArtifact11 = createArtifact( "test-dep", "dependency-zero-one", "1.0" );
+ listener.includeArtifact( depArtifact11 );
+
+ Artifact depArtifact12 = createArtifact( "test-dep", "dependency-zero-two", "1.0" );
+ listener.includeArtifact( depArtifact12 );
+
+ listener.startProcessChildren( depArtifact12 );
+
+ Artifact depArtifact121 = createArtifact( "test-dep", "dep-zero-two-1", "1.0" );
+ listener.includeArtifact( depArtifact121 );
+
+ listener.endProcessChildren( depArtifact12 );
+
+ listener.endProcessChildren( depArtifact1 );
+
+ Artifact depArtifact2 = createArtifact( "test-dep", "dependency-two", "1.0", Artifact.SCOPE_TEST );
+ listener.includeArtifact( depArtifact2 );
+
+ listener.startProcessChildren( depArtifact2 );
+
+ Artifact depArtifact21 = createArtifact( "test-dep", "dep-zero-two-1", "1.0" );
+ listener.includeArtifact( depArtifact21 );
+ listener.omitForNearer( depArtifact121, depArtifact21 );
+
+ listener.endProcessChildren( depArtifact2 );
+
+ Artifact depArtifact3 = createArtifact( "test-dep", "dependency-three", "1.0", Artifact.SCOPE_COMPILE );
+ listener.includeArtifact( depArtifact3 );
+
+ listener.endProcessChildren( projectArtifact );
+
+ Collection artifacts = listener.getNodes();
+ assertTrue( compareNodeListToArtifacts( artifacts, new Artifact[] { depArtifact1, depArtifact2, depArtifact3,
+ depArtifact11, depArtifact12, depArtifact21, projectArtifact } ) );
+
+ assertEquals( projectArtifact, listener.getRootNode().getArtifact() );
+
+ assertTrue( compareNodeListToArtifacts( listener.getRootNode().getChildren(), new Artifact[] { depArtifact1,
+ depArtifact2, depArtifact3 } ) );
+
+ DependencyNode node = getChild( listener.getRootNode(), depArtifact1 );
+ assertTrue( compareNodeListToArtifacts( node.getChildren(), new Artifact[] { depArtifact11, depArtifact12 } ) );
+
+ node = getChild( node, depArtifact12 );
+ assertTrue( compareNodeListToArtifacts( node.getChildren(), EMPTY_ARTIFACTS ) );
+
+ node = getChild( listener.getRootNode(), depArtifact2 );
+ assertTrue( compareNodeListToArtifacts( node.getChildren(), new Artifact[] { depArtifact21 } ) );
+ }
+
+ // private methods --------------------------------------------------------
+
+ private boolean compareNodeListToArtifacts( Collection nodes, Artifact[] artifacts )
+ {
+ List artifactsRemaining = new ArrayList( Arrays.asList( artifacts ) );
+
+ for ( Iterator i = nodes.iterator(); i.hasNext(); )
+ {
+ DependencyNode node = (DependencyNode) i.next();
+
+ if ( !artifactsRemaining.remove( node.getArtifact() ) )
+ {
+ return false;
+ }
+ }
+ return artifactsRemaining.isEmpty();
+ }
+
+ private DependencyNode getChild( DependencyNode node, Artifact artifact )
+ {
+ DependencyNode result = null;
+ for ( Iterator i = node.getChildren().iterator(); i.hasNext() && result == null; )
+ {
+ DependencyNode child = (DependencyNode) i.next();
+ if ( child.getArtifact().equals( artifact ) )
+ {
+ result = child;
+ }
+ }
+ return result;
+ }
+
+ private Artifact createArtifact( String groupId, String artifactId, String version )
+ {
+ return createArtifact( groupId, artifactId, version, null );
+ }
+
+ private Artifact createArtifact( String groupId, String artifactId, String version, String scope )
+ {
+ VersionRange versionRange = VersionRange.createFromVersion( version );
+
+ return new DefaultArtifact( groupId, artifactId, versionRange, scope, "jar", null,
+ new DefaultArtifactHandler(), false );
+ }
+}
Propchange: maven/shared/trunk/maven-dependency-tree/src/test/java/org/apache/maven/shared/dependency/tree/DependencyTreeResolutionListenerTest.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: maven/shared/trunk/maven-dependency-tree/src/test/java/org/apache/maven/shared/dependency/tree/DependencyTreeResolutionListenerTest.java
------------------------------------------------------------------------------
svn:keywords = "Author Date Id Revision"