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"