diff --git a/pom.xml b/pom.xml
new file mode 100644
index 0000000..c9796d1
--- /dev/null
+++ b/pom.xml
@@ -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>
diff --git a/src/main/java/org/apache/maven/shared/dependency/tree/DefaultDependencyTreeBuilder.java b/src/main/java/org/apache/maven/shared/dependency/tree/DefaultDependencyTreeBuilder.java
new file mode 100644
index 0000000..57b27d3
--- /dev/null
+++ b/src/main/java/org/apache/maven/shared/dependency/tree/DefaultDependencyTreeBuilder.java
@@ -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;
+    }
+}
diff --git a/src/main/java/org/apache/maven/shared/dependency/tree/DependencyNode.java b/src/main/java/org/apache/maven/shared/dependency/tree/DependencyNode.java
new file mode 100644
index 0000000..aef6bbf
--- /dev/null
+++ b/src/main/java/org/apache/maven/shared/dependency/tree/DependencyNode.java
@@ -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;
+    }
+}
diff --git a/src/main/java/org/apache/maven/shared/dependency/tree/DependencyTree.java b/src/main/java/org/apache/maven/shared/dependency/tree/DependencyTree.java
new file mode 100644
index 0000000..9210a15
--- /dev/null
+++ b/src/main/java/org/apache/maven/shared/dependency/tree/DependencyTree.java
@@ -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;
+    }
+}
diff --git a/src/main/java/org/apache/maven/shared/dependency/tree/DependencyTreeBuilder.java b/src/main/java/org/apache/maven/shared/dependency/tree/DependencyTreeBuilder.java
new file mode 100644
index 0000000..b6a18c8
--- /dev/null
+++ b/src/main/java/org/apache/maven/shared/dependency/tree/DependencyTreeBuilder.java
@@ -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;
+}
diff --git a/src/main/java/org/apache/maven/shared/dependency/tree/DependencyTreeBuilderException.java b/src/main/java/org/apache/maven/shared/dependency/tree/DependencyTreeBuilderException.java
new file mode 100644
index 0000000..961adec
--- /dev/null
+++ b/src/main/java/org/apache/maven/shared/dependency/tree/DependencyTreeBuilderException.java
@@ -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 );
+    }
+}
diff --git a/src/main/java/org/apache/maven/shared/dependency/tree/DependencyTreeResolutionListener.java b/src/main/java/org/apache/maven/shared/dependency/tree/DependencyTreeResolutionListener.java
new file mode 100644
index 0000000..e9a22d3
--- /dev/null
+++ b/src/main/java/org/apache/maven/shared/dependency/tree/DependencyTreeResolutionListener.java
@@ -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;
+    }
+}
diff --git a/src/test/java/org/apache/maven/shared/dependency/tree/DependencyTreeResolutionListenerTest.java b/src/test/java/org/apache/maven/shared/dependency/tree/DependencyTreeResolutionListenerTest.java
new file mode 100644
index 0000000..ba93791
--- /dev/null
+++ b/src/test/java/org/apache/maven/shared/dependency/tree/DependencyTreeResolutionListenerTest.java
@@ -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 );
+    }
+}
