You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@maven.apache.org by rf...@apache.org on 2019/11/10 14:05:26 UTC

[maven-artifact-transfer] 02/02: [MSHARED-801] Add functionality to collect raw dependencies in Maven 3+

This is an automated email from the ASF dual-hosted git repository.

rfscholte pushed a commit to branch MSHARED-801
in repository https://gitbox.apache.org/repos/asf/maven-artifact-transfer.git

commit c3edb9582d171e2c2c149d8551f61b30c9e1168b
Author: rfscholte <rf...@apache.org>
AuthorDate: Sun Nov 10 15:05:12 2019 +0100

    [MSHARED-801] Add functionality to collect raw dependencies in Maven 3+
---
 .../collector/DependencyCollectorMojo.java         |   2 +-
 .../dependencies/collect/DependencyCollector.java  |  26 +++-
 .../internal/DefaultDependencyCollector.java       |  46 ++++--
 .../collect/internal/Maven30ConflictIdSorter.java  |   4 +-
 .../collect/internal/Maven30ConflictResolver.java  |  31 ++--
 .../internal/Maven30DependencyCollector.java       | 166 +++++++++++----------
 .../Maven30DirectScopeDependencySelector.java      |  32 ++--
 .../collect/internal/Maven30JavaScopeDeriver.java  |   2 +-
 .../collect/internal/Maven30JavaScopeSelector.java |   2 +-
 .../internal/Maven30NearestVersionSelector.java    |   5 +-
 .../collect/internal/Maven30NodeData.java          |   7 +-
 .../Maven30PathRecordingDependencyVisitor.java     |   8 +-
 .../internal/Maven30SimpleOptionalitySelector.java |   2 +-
 .../collect/internal/Maven30Stack.java             |   2 +-
 .../internal/Maven31DependencyCollector.java       | 145 +++++++++---------
 .../Maven31DirectScopeDependencySelector.java      |  30 ++--
 .../collect/internal/MavenDependencyCollector.java |   9 +-
 17 files changed, 283 insertions(+), 236 deletions(-)

diff --git a/src/it/maven-dependency-collector-plugin/src/main/java/org/apache/maven/plugin/dependency/collector/DependencyCollectorMojo.java b/src/it/maven-dependency-collector-plugin/src/main/java/org/apache/maven/plugin/dependency/collector/DependencyCollectorMojo.java
index 45ab470..5907511 100644
--- a/src/it/maven-dependency-collector-plugin/src/main/java/org/apache/maven/plugin/dependency/collector/DependencyCollectorMojo.java
+++ b/src/it/maven-dependency-collector-plugin/src/main/java/org/apache/maven/plugin/dependency/collector/DependencyCollectorMojo.java
@@ -92,7 +92,7 @@ public class DependencyCollectorMojo
     {
         try
         {
-            CollectorResult result = dependencyCollector.collectDependenciesGraph( buildingRequest );
+            CollectorResult result = dependencyCollector.collectDependenciesGraph( buildingRequest, project.getModel() );
             DependencyNode root = result.getDependencyGraphRoot();
 
             StringWriter writer = new StringWriter();
diff --git a/src/main/java/org/apache/maven/shared/transfer/dependencies/collect/DependencyCollector.java b/src/main/java/org/apache/maven/shared/transfer/dependencies/collect/DependencyCollector.java
index 700d66c..325855a 100644
--- a/src/main/java/org/apache/maven/shared/transfer/dependencies/collect/DependencyCollector.java
+++ b/src/main/java/org/apache/maven/shared/transfer/dependencies/collect/DependencyCollector.java
@@ -72,12 +72,36 @@ public interface DependencyCollector
 
     /**
      * @param buildingRequest {@link ProjectBuildingRequest}.
+     * @param root {@link Dependency}
+     * @return {@link CollectorResult}
+     * @throws DependencyCollectorException in case of an error which can be a component lookup error or an error while
+     *             trying to collect the dependencies.
+     * @throws IllegalArgumentException in case of parameter <code>buildingRequest</code> is <code>null</code>
+     */
+    CollectorResult collectDependenciesGraph( ProjectBuildingRequest buildingRequest, Dependency root )
+        throws DependencyCollectorException;
+
+    /**
+     * @param buildingRequest {@link ProjectBuildingRequest}.
+     * @param root {@link DependableCoordinate}
+     * @return {@link CollectorResult}
+     * @throws DependencyCollectorException in case of an error which can be a component lookup error or an error while
+     *             trying to collect the dependencies.
+     * @throws IllegalArgumentException in case of parameter <code>buildingRequest</code> is <code>null</code>
+     */
+    CollectorResult collectDependenciesGraph( ProjectBuildingRequest buildingRequest, DependableCoordinate root )
+        throws DependencyCollectorException;
+
+    /**
+     * @param buildingRequest {@link ProjectBuildingRequest}.
+     * @param root {@link Model}
      * @return {@link CollectorResult}
      * @throws DependencyCollectorException in case of an error which can be a component lookup error or an error while
      *             trying to collect the dependencies.
      * @throws IllegalArgumentException in case of parameter <code>buildingRequest</code> is <code>null</code>
      */
-    CollectorResult collectDependenciesGraph( ProjectBuildingRequest buildingRequest )
+    CollectorResult collectDependenciesGraph( ProjectBuildingRequest buildingRequest, Model root )
         throws DependencyCollectorException;
 
+    
 }
diff --git a/src/main/java/org/apache/maven/shared/transfer/dependencies/collect/internal/DefaultDependencyCollector.java b/src/main/java/org/apache/maven/shared/transfer/dependencies/collect/internal/DefaultDependencyCollector.java
index 90548c3..c239839 100644
--- a/src/main/java/org/apache/maven/shared/transfer/dependencies/collect/internal/DefaultDependencyCollector.java
+++ b/src/main/java/org/apache/maven/shared/transfer/dependencies/collect/internal/DefaultDependencyCollector.java
@@ -56,11 +56,7 @@ class DefaultDependencyCollector implements DependencyCollector, Contextualizabl
 
         try
         {
-            String hint = isMaven31() ? "maven31" : "maven3";
-
-            DependencyCollector effectiveDependencyCollector = container.lookup( DependencyCollector.class, hint );
-
-            return effectiveDependencyCollector.collectDependencies( buildingRequest, root );
+            return getMavenDependencyCollector( buildingRequest ).collectDependencies( root );
         }
         catch ( ComponentLookupException e )
         {
@@ -92,11 +88,7 @@ class DefaultDependencyCollector implements DependencyCollector, Contextualizabl
 
         try
         {
-            String hint = isMaven31() ? "maven31" : "maven3";
-
-            DependencyCollector effectiveDependencyCollector = container.lookup( DependencyCollector.class, hint );
-
-            return effectiveDependencyCollector.collectDependencies( buildingRequest, root );
+            return getMavenDependencyCollector( buildingRequest ).collectDependencies( root );
         }
         catch ( ComponentLookupException e )
         {
@@ -105,13 +97,43 @@ class DefaultDependencyCollector implements DependencyCollector, Contextualizabl
     }
 
     @Override
-    public CollectorResult collectDependenciesGraph( ProjectBuildingRequest buildingRequest )
+    public CollectorResult collectDependenciesGraph( ProjectBuildingRequest buildingRequest, Model root )
+        throws DependencyCollectorException
+    {
+        validateBuildingRequest( buildingRequest );
+        try
+        {
+            return getMavenDependencyCollector( buildingRequest ).collectDependenciesGraph( root );
+        }
+        catch ( ComponentLookupException e )
+        {
+            throw new DependencyCollectorException( e.getMessage(), e );
+        }
+    }
+    
+    @Override
+    public CollectorResult collectDependenciesGraph( ProjectBuildingRequest buildingRequest, DependableCoordinate root )
+        throws DependencyCollectorException
+    {
+        validateBuildingRequest( buildingRequest );
+        try
+        {
+            return getMavenDependencyCollector( buildingRequest ).collectDependenciesGraph( root );
+        }
+        catch ( ComponentLookupException e )
+        {
+            throw new DependencyCollectorException( e.getMessage(), e );
+        }
+    }
+    
+    @Override
+    public CollectorResult collectDependenciesGraph( ProjectBuildingRequest buildingRequest, Dependency root )
         throws DependencyCollectorException
     {
         validateBuildingRequest( buildingRequest );
         try
         {
-            return getMavenDependencyCollector( buildingRequest ).collectDependenciesGraph( buildingRequest );
+            return getMavenDependencyCollector( buildingRequest ).collectDependenciesGraph( root );
         }
         catch ( ComponentLookupException e )
         {
diff --git a/src/main/java/org/apache/maven/shared/transfer/dependencies/collect/internal/Maven30ConflictIdSorter.java b/src/main/java/org/apache/maven/shared/transfer/dependencies/collect/internal/Maven30ConflictIdSorter.java
index f8ea6de..71654d2 100644
--- a/src/main/java/org/apache/maven/shared/transfer/dependencies/collect/internal/Maven30ConflictIdSorter.java
+++ b/src/main/java/org/apache/maven/shared/transfer/dependencies/collect/internal/Maven30ConflictIdSorter.java
@@ -41,10 +41,10 @@ import org.sonatype.aether.util.graph.transformer.TransformationContextKeys;
  * 
  * @author Gabriel Belingueres
  */
-public class Maven30ConflictIdSorter
+class Maven30ConflictIdSorter
     implements DependencyGraphTransformer
 {
-
+    @Override
     public DependencyNode transformGraph( DependencyNode node, DependencyGraphTransformationContext context )
         throws RepositoryException
     {
diff --git a/src/main/java/org/apache/maven/shared/transfer/dependencies/collect/internal/Maven30ConflictResolver.java b/src/main/java/org/apache/maven/shared/transfer/dependencies/collect/internal/Maven30ConflictResolver.java
index 4ac601a..8782232 100644
--- a/src/main/java/org/apache/maven/shared/transfer/dependencies/collect/internal/Maven30ConflictResolver.java
+++ b/src/main/java/org/apache/maven/shared/transfer/dependencies/collect/internal/Maven30ConflictResolver.java
@@ -47,7 +47,7 @@ import org.sonatype.aether.util.graph.transformer.TransformationContextKeys;
  * 
  * @author Gabriel Belingueres
  */
-public class Maven30ConflictResolver
+class Maven30ConflictResolver
     implements DependencyGraphTransformer
 {
 
@@ -104,7 +104,7 @@ public class Maven30ConflictResolver
      * @param nodeData the object where to save node data since Sonatype Aether 1.7 does not have that info inside the
      *            DependencyNode.
      */
-    public Maven30ConflictResolver( VersionSelector versionSelector, ScopeSelector scopeSelector,
+    Maven30ConflictResolver( VersionSelector versionSelector, ScopeSelector scopeSelector,
                                     OptionalitySelector optionalitySelector, ScopeDeriver scopeDeriver,
                                     Maven30NodeData nodeData )
     {
@@ -131,6 +131,7 @@ public class Maven30ConflictResolver
         this.nodeData = nodeData;
     }
 
+    @Override
     public DependencyNode transformGraph( DependencyNode node, DependencyGraphTransformationContext context )
         throws RepositoryException
     {
@@ -161,7 +162,7 @@ public class Maven30ConflictResolver
             throw new RepositoryException( "conflict groups have not been identified" );
         }
 
-        Map<Object, Collection<Object>> cyclicPredecessors = new HashMap<Object, Collection<Object>>();
+        Map<Object, Collection<Object>> cyclicPredecessors = new HashMap<>();
         for ( Collection<?> cycle : conflictIdCycles )
         {
             for ( Object conflictId : cycle )
@@ -304,11 +305,7 @@ public class Maven30ConflictResolver
                         nodeData.putData( loser, NODE_DATA_WINNER, winner.node );
                         nodeData.putData( loser, NODE_DATA_ORIGINAL_SCOPE, loser.getDependency().getScope() );
                         nodeData.putData( loser, NODE_DATA_ORIGINAL_OPTIONALITY, loser.getDependency().isOptional() );
-//                        loser.setData( NODE_DATA_WINNER, winner.node );
-//                        loser.setData( NODE_DATA_ORIGINAL_SCOPE, loser.getDependency().getScope() );
-//                        loser.setData( NODE_DATA_ORIGINAL_OPTIONALITY, loser.getDependency().isOptional() );
                         loser.setScope( item.getScopes().iterator().next() );
-//                    loser.setChildren( Collections.<DependencyNode>emptyList() );
                         childIt.set( loser );
                     }
                     else
@@ -778,7 +775,7 @@ public class Maven30ConflictResolver
      * @noinstantiate This class is not intended to be instantiated by clients in production code, the constructor may
      *                change without notice and only exists to enable unit testing.
      */
-    public static final class ScopeContext
+    static final class ScopeContext
     {
 
         String parentScope;
@@ -795,7 +792,7 @@ public class Maven30ConflictResolver
          * @noreference This class is not intended to be instantiated by clients in production code, the constructor may
          *              change without notice and only exists to enable unit testing.
          */
-        public ScopeContext( String parentScope, String childScope )
+        ScopeContext( String parentScope, String childScope )
         {
             this.parentScope = ( parentScope != null ) ? parentScope : "";
             derivedScope = ( childScope != null ) ? childScope : "";
@@ -853,7 +850,7 @@ public class Maven30ConflictResolver
      * @noinstantiate This class is not intended to be instantiated by clients in production code, the constructor may
      *                change without notice and only exists to enable unit testing.
      */
-    public static final class ConflictItem
+    static final class ConflictItem
     {
 
         // nodes can share child lists, we care about the unique owner of a child node which is the child list
@@ -913,7 +910,7 @@ public class Maven30ConflictResolver
          * @noreference This class is not intended to be instantiated by clients in production code, the constructor may
          *              change without notice and only exists to enable unit testing.
          */
-        public ConflictItem( DependencyNode parent, DependencyNode node, int depth, int optionalities,
+        ConflictItem( DependencyNode parent, DependencyNode node, int depth, int optionalities,
                              String... scopes )
         {
             this.parent = ( parent != null ) ? parent.getChildren() : null;
@@ -1035,7 +1032,7 @@ public class Maven30ConflictResolver
      * @noinstantiate This class is not intended to be instantiated by clients in production code, the constructor may
      *                change without notice and only exists to enable unit testing.
      */
-    public static final class ConflictContext
+    static final class ConflictContext
     {
 
         final DependencyNode root;
@@ -1070,7 +1067,7 @@ public class Maven30ConflictResolver
          * @noreference This class is not intended to be instantiated by clients in production code, the constructor may
          *              change without notice and only exists to enable unit testing.
          */
-        public ConflictContext( DependencyNode root, Object conflictId, Map<DependencyNode, Object> conflictIds,
+        ConflictContext( DependencyNode root, Object conflictId, Map<DependencyNode, Object> conflictIds,
                                 Collection<ConflictItem> items )
         {
             this( root, conflictIds, items );
@@ -1182,7 +1179,7 @@ public class Maven30ConflictResolver
      * version selector does not need to deal with potential scope conflicts, these will be addressed afterwards by the
      * {@link ScopeSelector}. Implementations must be stateless.
      */
-    public abstract static class VersionSelector
+    abstract static class VersionSelector
     {
 
         /**
@@ -1224,7 +1221,7 @@ public class Maven30ConflictResolver
      * potentially conflicting set of {@link ScopeDeriver derived scopes}. The scope selector gets invoked after the
      * {@link VersionSelector} has picked the winning node. Implementations must be stateless.
      */
-    public abstract static class ScopeSelector
+    abstract static class ScopeSelector
     {
 
         /**
@@ -1265,7 +1262,7 @@ public class Maven30ConflictResolver
      * An extension point of {@link ConflictResolver} that determines the scope of a dependency in relation to the scope
      * of its parent. Implementations must be stateless.
      */
-    public abstract static class ScopeDeriver
+    abstract static class ScopeDeriver
     {
 
         /**
@@ -1306,7 +1303,7 @@ public class Maven30ConflictResolver
      * potentially conflicting set of derived optionalities. The optionality selector gets invoked after the
      * {@link VersionSelector} has picked the winning node. Implementations must be stateless.
      */
-    public abstract static class OptionalitySelector
+    abstract static class OptionalitySelector
     {
 
         /**
diff --git a/src/main/java/org/apache/maven/shared/transfer/dependencies/collect/internal/Maven30DependencyCollector.java b/src/main/java/org/apache/maven/shared/transfer/dependencies/collect/internal/Maven30DependencyCollector.java
index a52c065..7ef51a3 100644
--- a/src/main/java/org/apache/maven/shared/transfer/dependencies/collect/internal/Maven30DependencyCollector.java
+++ b/src/main/java/org/apache/maven/shared/transfer/dependencies/collect/internal/Maven30DependencyCollector.java
@@ -25,10 +25,7 @@ import java.util.List;
 import org.apache.maven.RepositoryUtils;
 import org.apache.maven.artifact.handler.ArtifactHandler;
 import org.apache.maven.artifact.handler.manager.ArtifactHandlerManager;
-import org.apache.maven.artifact.repository.ArtifactRepository;
 import org.apache.maven.model.Model;
-import org.apache.maven.project.MavenProject;
-import org.apache.maven.project.ProjectBuildingRequest;
 import org.apache.maven.shared.transfer.dependencies.DependableCoordinate;
 import org.apache.maven.shared.transfer.dependencies.collect.CollectorResult;
 import org.apache.maven.shared.transfer.dependencies.collect.DependencyCollector;
@@ -152,95 +149,78 @@ class Maven30DependencyCollector
     }
 
     @Override
-    public CollectorResult collectDependenciesGraph( ProjectBuildingRequest buildingRequest )
+    public CollectorResult collectDependenciesGraph( org.apache.maven.model.Dependency root )
         throws DependencyCollectorException
     {
-        try
-        {
-            MavenProject project = buildingRequest.getProject();
-
-            org.apache.maven.artifact.Artifact projectArtifact = project.getArtifact();
-            List<ArtifactRepository> remoteArtifactRepositories = project.getRemoteArtifactRepositories();
-
-            RepositorySystemSession repositorySystemSession = buildingRequest.getRepositorySession();
-
-            DefaultRepositorySystemSession session = new DefaultRepositorySystemSession( repositorySystemSession );
-
-            DependencyGraphTransformer transformer =
-                new Maven30ConflictResolver( new Maven30NearestVersionSelector(), new Maven30JavaScopeSelector(),
-                                             new Maven30SimpleOptionalitySelector(), new Maven30JavaScopeDeriver(),
-                                             new Maven30NodeData() );
-            session.setDependencyGraphTransformer( transformer );
-
-            DependencySelector depFilter =
-                new AndDependencySelector( new Maven30DirectScopeDependencySelector( JavaScopes.TEST ),
-                                           new OptionalDependencySelector(), new ExclusionDependencySelector() );
-            session.setDependencySelector( depFilter );
-
-            session.setConfigProperty( Maven30ConflictResolver.CONFIG_PROP_VERBOSE, true );
-            session.setConfigProperty( "aether.dependencyManager.verbose", true );
-
-            Artifact aetherArtifact =
-                (Artifact) Invoker.invoke( RepositoryUtils.class, "toArtifact",
-                                           org.apache.maven.artifact.Artifact.class, projectArtifact );
-
-            @SuppressWarnings( "unchecked" )
-            List<RemoteRepository> aetherRepos =
-                (List<RemoteRepository>) Invoker.invoke( RepositoryUtils.class, "toRepos", List.class,
-                                                         remoteArtifactRepositories );
-
-            CollectRequest collectRequest = new CollectRequest();
-            collectRequest.setRoot( new Dependency( aetherArtifact, "" ) );
-            collectRequest.setRepositories( aetherRepos );
-
-            ArtifactTypeRegistry stereotypes = session.getArtifactTypeRegistry();
-            collectDependencyList( collectRequest, project, stereotypes );
-            collectManagedDependencyList( collectRequest, project, stereotypes );
+        ArtifactTypeRegistry typeRegistry =
+                        (ArtifactTypeRegistry) Invoker.invoke( RepositoryUtils.class, "newArtifactTypeRegistry",
+                                                               ArtifactHandlerManager.class, artifactHandlerManager );
 
-            CollectResult collectResult = repositorySystem.collectDependencies( session, collectRequest );
+        CollectRequest request = new CollectRequest();
+        request.setRoot( toDependency( root, typeRegistry ) );
 
-            return new Maven30CollectorResult( collectResult );
+        return collectDependenciesGraph( request );
+    }
+    
+    @Override
+    public CollectorResult collectDependenciesGraph( DependableCoordinate root )
+        throws DependencyCollectorException
+    {
+        ArtifactHandler artifactHandler = artifactHandlerManager.getArtifactHandler( root.getType() );
+        
+        String extension = artifactHandler != null ? artifactHandler.getExtension() : null;
+        
+        Artifact aetherArtifact = new DefaultArtifact( root.getGroupId(), root.getArtifactId(), root.getClassifier(),
+                                                       extension, root.getVersion() );
+        
+        CollectRequest request = new CollectRequest();
+        request.setRoot( new Dependency( aetherArtifact, null ) );
 
-//            DependencyNode rootNode = collectResult.getRoot();
+        return collectDependenciesGraph( request );
+    }
+    
+    @Override
+    public CollectorResult collectDependenciesGraph( Model root )
+        throws DependencyCollectorException
+    {
+        // Are there examples where packaging and type are NOT in sync
+        ArtifactHandler artifactHandler = artifactHandlerManager.getArtifactHandler( root.getPackaging() );
+        
+        String extension = artifactHandler != null ? artifactHandler.getExtension() : null;
+        
+        Artifact aetherArtifact =
+            new DefaultArtifact( root.getGroupId(), root.getArtifactId(), extension, root.getVersion() );
+        
+        CollectRequest request = new CollectRequest();
+        request.setRoot( new Dependency( aetherArtifact, null ) );
 
-//            if ( getLogger().isDebugEnabled() )
-//            {
-//                logTree( rootNode );
-//            }
+        ArtifactTypeRegistry typeRegistry =
+                        (ArtifactTypeRegistry) Invoker.invoke( RepositoryUtils.class, "newArtifactTypeRegistry",
+                                                               ArtifactHandlerManager.class, artifactHandlerManager );
 
-//            return buildDependencyNode( null, rootNode, projectArtifact, filter );
-        }
-        catch ( DependencyCollectionException e )
+        List<Dependency> aetherDependencies = new ArrayList<Dependency>( root.getDependencies().size() );
+        for ( org.apache.maven.model.Dependency mavenDependency : root.getDependencies() )
         {
-            throw new DependencyCollectorException( "Could not collect dependencies: " + e.getResult(), e );
+            aetherDependencies.add( toDependency( mavenDependency, typeRegistry ) );
         }
-    }
+        request.setDependencies( aetherDependencies );
 
-    private void collectManagedDependencyList( CollectRequest collectRequest, MavenProject project,
-                                               ArtifactTypeRegistry typeRegistry )
-        throws DependencyCollectorException
-    {
-        if ( project.getDependencyManagement() != null )
+        if ( root.getDependencyManagement() != null )
         {
-            for ( org.apache.maven.model.Dependency dependency : project.getDependencyManagement().getDependencies() )
+            List<Dependency> aetherManagerDependencies =
+                new ArrayList<Dependency>( root.getDependencyManagement().getDependencies().size() );
+            
+            for ( org.apache.maven.model.Dependency mavenDependency : root.getDependencyManagement().getDependencies() )
             {
-                Dependency aetherDep = toDependency( dependency, typeRegistry );
-                collectRequest.addManagedDependency( aetherDep );
+                aetherManagerDependencies.add( toDependency( mavenDependency, typeRegistry ) );
             }
+            
+            request.setManagedDependencies( aetherManagerDependencies );
         }
+        
+        return collectDependenciesGraph( request );
     }
-
-    private void collectDependencyList( CollectRequest collectRequest, MavenProject project,
-                                        ArtifactTypeRegistry typeRegistry )
-        throws DependencyCollectorException
-    {
-        for ( org.apache.maven.model.Dependency dependency : project.getDependencies() )
-        {
-            Dependency aetherDep = toDependency( dependency, typeRegistry );
-            collectRequest.addDependency( aetherDep );
-        }
-    }
-
+    
     private CollectorResult collectDependencies( CollectRequest request )
         throws DependencyCollectorException
     {
@@ -255,6 +235,38 @@ class Maven30DependencyCollector
             throw new DependencyCollectorException( e.getMessage(), e );
         }
     }
+    
+    private CollectorResult collectDependenciesGraph( CollectRequest request )
+                    throws DependencyCollectorException
+    {
+        DefaultRepositorySystemSession session = new DefaultRepositorySystemSession( this.session );
+        try
+        {
+            DependencyGraphTransformer transformer =
+                new Maven30ConflictResolver( new Maven30NearestVersionSelector(), new Maven30JavaScopeSelector(),
+                                             new Maven30SimpleOptionalitySelector(), new Maven30JavaScopeDeriver(),
+                                             new Maven30NodeData() );
+            session.setDependencyGraphTransformer( transformer );
+
+            DependencySelector depFilter =
+                new AndDependencySelector( new Maven30DirectScopeDependencySelector( JavaScopes.TEST ),
+                                           new OptionalDependencySelector(), new ExclusionDependencySelector() );
+            session.setDependencySelector( depFilter );
+
+            session.setConfigProperty( Maven30ConflictResolver.CONFIG_PROP_VERBOSE, true );
+            session.setConfigProperty( "aether.dependencyManager.verbose", true );
+
+            request.setRepositories( aetherRepositories );
+
+            CollectResult collectResult = repositorySystem.collectDependencies( session, request );
+
+            return new Maven30CollectorResult( collectResult );
+        }
+        catch ( DependencyCollectionException e )
+        {
+            throw new DependencyCollectorException( "Could not collect dependencies: " + e.getResult(), e );
+        }
+    }
 
     private static Dependency toDependency( org.apache.maven.model.Dependency mavenDependency,
                                             ArtifactTypeRegistry typeRegistry )
diff --git a/src/main/java/org/apache/maven/shared/transfer/dependencies/collect/internal/Maven30DirectScopeDependencySelector.java b/src/main/java/org/apache/maven/shared/transfer/dependencies/collect/internal/Maven30DirectScopeDependencySelector.java
index debc778..116fa75 100644
--- a/src/main/java/org/apache/maven/shared/transfer/dependencies/collect/internal/Maven30DirectScopeDependencySelector.java
+++ b/src/main/java/org/apache/maven/shared/transfer/dependencies/collect/internal/Maven30DirectScopeDependencySelector.java
@@ -19,6 +19,8 @@ package org.apache.maven.shared.transfer.dependencies.collect.internal;
  * under the License.
  */
 
+import java.util.Objects;
+
 import org.sonatype.aether.collection.DependencyCollectionContext;
 import org.sonatype.aether.collection.DependencySelector;
 import org.sonatype.aether.graph.Dependency;
@@ -30,27 +32,26 @@ import org.sonatype.aether.graph.Dependency;
  * @see {@link Dependency#getScope()}
  * @author Gabriel Belingueres
  */
-public class Maven30DirectScopeDependencySelector
+class Maven30DirectScopeDependencySelector
     implements DependencySelector
 {
 
     private final String scope;
 
     private final int depth;
+    
+    private final int hashCode;
 
-    public Maven30DirectScopeDependencySelector( String scope )
+    Maven30DirectScopeDependencySelector( String scope )
     {
         this( scope, 0 );
     }
 
-    private Maven30DirectScopeDependencySelector( String scope, int depth )
+    Maven30DirectScopeDependencySelector( String scope, int depth )
     {
-        if ( scope == null )
-        {
-            throw new IllegalArgumentException( "scope is null!" );
-        }
-        this.scope = scope;
+        this.scope = Objects.requireNonNull( scope, "scope is null!" );
         this.depth = depth;
+        this.hashCode = Objects.hash( depth, scope );
     }
 
     /**
@@ -87,11 +88,7 @@ public class Maven30DirectScopeDependencySelector
     @Override
     public int hashCode()
     {
-        final int prime = 31;
-        int result = 1;
-        result = prime * result + depth;
-        result = prime * result + ( ( scope == null ) ? 0 : scope.hashCode() );
-        return result;
+        return hashCode;
     }
 
     @Override
@@ -114,14 +111,7 @@ public class Maven30DirectScopeDependencySelector
         {
             return false;
         }
-        if ( scope == null )
-        {
-            if ( other.scope != null )
-            {
-                return false;
-            }
-        }
-        else if ( !scope.equals( other.scope ) )
+        if ( !Objects.equals( scope, other.scope ) )
         {
             return false;
         }
diff --git a/src/main/java/org/apache/maven/shared/transfer/dependencies/collect/internal/Maven30JavaScopeDeriver.java b/src/main/java/org/apache/maven/shared/transfer/dependencies/collect/internal/Maven30JavaScopeDeriver.java
index 70dc35d..aefaa5e 100644
--- a/src/main/java/org/apache/maven/shared/transfer/dependencies/collect/internal/Maven30JavaScopeDeriver.java
+++ b/src/main/java/org/apache/maven/shared/transfer/dependencies/collect/internal/Maven30JavaScopeDeriver.java
@@ -29,7 +29,7 @@ import org.sonatype.aether.util.artifact.JavaScopes;
  * 
  * @author Gabriel Belingueres
  */
-public class Maven30JavaScopeDeriver
+class Maven30JavaScopeDeriver
     extends ScopeDeriver
 {
 
diff --git a/src/main/java/org/apache/maven/shared/transfer/dependencies/collect/internal/Maven30JavaScopeSelector.java b/src/main/java/org/apache/maven/shared/transfer/dependencies/collect/internal/Maven30JavaScopeSelector.java
index f569d40..7e2ecea 100644
--- a/src/main/java/org/apache/maven/shared/transfer/dependencies/collect/internal/Maven30JavaScopeSelector.java
+++ b/src/main/java/org/apache/maven/shared/transfer/dependencies/collect/internal/Maven30JavaScopeSelector.java
@@ -34,7 +34,7 @@ import org.sonatype.aether.util.artifact.JavaScopes;
  * 
  * @author Gabriel Belingueres
  */
-public class Maven30JavaScopeSelector
+class Maven30JavaScopeSelector
     extends ScopeSelector
 {
 
diff --git a/src/main/java/org/apache/maven/shared/transfer/dependencies/collect/internal/Maven30NearestVersionSelector.java b/src/main/java/org/apache/maven/shared/transfer/dependencies/collect/internal/Maven30NearestVersionSelector.java
index c913c54..3fc3400 100644
--- a/src/main/java/org/apache/maven/shared/transfer/dependencies/collect/internal/Maven30NearestVersionSelector.java
+++ b/src/main/java/org/apache/maven/shared/transfer/dependencies/collect/internal/Maven30NearestVersionSelector.java
@@ -40,7 +40,7 @@ import org.sonatype.aether.version.VersionConstraint;
  * 
  * @author Gabriel Belingueres
  */
-public class Maven30NearestVersionSelector
+class Maven30NearestVersionSelector
     extends VersionSelector
 {
 
@@ -56,7 +56,6 @@ public class Maven30NearestVersionSelector
 
             boolean backtrack = false;
             boolean hardConstraint = !constraint.getRanges().isEmpty();
-//        boolean hardConstraint = constraint.getRange() != null;
 
             if ( hardConstraint )
             {
@@ -151,8 +150,6 @@ public class Maven30NearestVersionSelector
         Maven30PathRecordingDependencyVisitor visitor = new Maven30PathRecordingDependencyVisitor( filter );
         context.getRoot().accept( visitor );
         return new UnsolvableVersionConflictException( visitor.getPaths(), null );
-//    return new UnsolvableVersionConflictException( visitor.getPaths(), context.conflictId );
-//    return new UnsolvableVersionConflictException( visitor.getPaths() );
     }
 
     static final class ConflictGroup
diff --git a/src/main/java/org/apache/maven/shared/transfer/dependencies/collect/internal/Maven30NodeData.java b/src/main/java/org/apache/maven/shared/transfer/dependencies/collect/internal/Maven30NodeData.java
index d22f232..87d21e2 100644
--- a/src/main/java/org/apache/maven/shared/transfer/dependencies/collect/internal/Maven30NodeData.java
+++ b/src/main/java/org/apache/maven/shared/transfer/dependencies/collect/internal/Maven30NodeData.java
@@ -31,11 +31,10 @@ import org.sonatype.aether.graph.DependencyNode;
  * 
  * @author Gabriel Belingueres
  */
-public class Maven30NodeData
+class Maven30NodeData
 {
 
-    private IdentityHashMap<DependencyNode, Map<Object, Object>> nodeMap =
-        new IdentityHashMap<DependencyNode, Map<Object, Object>>();
+    private IdentityHashMap<DependencyNode, Map<Object, Object>> nodeMap = new IdentityHashMap<>();
 
     public void putData( DependencyNode node, Object key, Object value )
     {
@@ -81,7 +80,7 @@ public class Maven30NodeData
         {
             if ( data.isEmpty() )
             {
-                data = new HashMap<Object, Object>();
+                data = new HashMap<>();
             }
             data.put( key, value );
         }
diff --git a/src/main/java/org/apache/maven/shared/transfer/dependencies/collect/internal/Maven30PathRecordingDependencyVisitor.java b/src/main/java/org/apache/maven/shared/transfer/dependencies/collect/internal/Maven30PathRecordingDependencyVisitor.java
index 59f98ec..3d5e9fe 100644
--- a/src/main/java/org/apache/maven/shared/transfer/dependencies/collect/internal/Maven30PathRecordingDependencyVisitor.java
+++ b/src/main/java/org/apache/maven/shared/transfer/dependencies/collect/internal/Maven30PathRecordingDependencyVisitor.java
@@ -32,7 +32,7 @@ import org.sonatype.aether.graph.DependencyVisitor;
  * 
  * @author Gabriel Belingueres
  */
-public class Maven30PathRecordingDependencyVisitor
+class Maven30PathRecordingDependencyVisitor
     implements DependencyVisitor
 {
 
@@ -50,7 +50,7 @@ public class Maven30PathRecordingDependencyVisitor
      * 
      * @param filter The filter used to select terminal nodes of paths to record, may be {@code null} to match any node.
      */
-    public Maven30PathRecordingDependencyVisitor( DependencyFilter filter )
+    Maven30PathRecordingDependencyVisitor( DependencyFilter filter )
     {
         this( filter, true );
     }
@@ -64,7 +64,7 @@ public class Maven30PathRecordingDependencyVisitor
      *            node. If {@code true}, all recorded paths will have only one matching node (namely the terminal node),
      *            if {@code false} a recorded path can consist of multiple matching nodes.
      */
-    public Maven30PathRecordingDependencyVisitor( DependencyFilter filter, boolean excludeChildrenOfMatches )
+    Maven30PathRecordingDependencyVisitor( DependencyFilter filter, boolean excludeChildrenOfMatches )
     {
         this.filter = filter;
         this.excludeChildrenOfMatches = excludeChildrenOfMatches;
@@ -94,6 +94,7 @@ public class Maven30PathRecordingDependencyVisitor
         return paths;
     }
 
+    @Override
     public boolean visitEnter( DependencyNode node )
     {
         boolean accept = filter == null || filter.accept( node, parents );
@@ -115,6 +116,7 @@ public class Maven30PathRecordingDependencyVisitor
         return !( excludeChildrenOfMatches && accept );
     }
 
+    @Override
     public boolean visitLeave( DependencyNode node )
     {
         parents.pop();
diff --git a/src/main/java/org/apache/maven/shared/transfer/dependencies/collect/internal/Maven30SimpleOptionalitySelector.java b/src/main/java/org/apache/maven/shared/transfer/dependencies/collect/internal/Maven30SimpleOptionalitySelector.java
index 4335628..e2a01c2 100644
--- a/src/main/java/org/apache/maven/shared/transfer/dependencies/collect/internal/Maven30SimpleOptionalitySelector.java
+++ b/src/main/java/org/apache/maven/shared/transfer/dependencies/collect/internal/Maven30SimpleOptionalitySelector.java
@@ -31,7 +31,7 @@ import org.sonatype.aether.RepositoryException;
  * 
  * @author Gabriel Belingueres
  */
-public class Maven30SimpleOptionalitySelector
+class Maven30SimpleOptionalitySelector
     extends OptionalitySelector
 {
 
diff --git a/src/main/java/org/apache/maven/shared/transfer/dependencies/collect/internal/Maven30Stack.java b/src/main/java/org/apache/maven/shared/transfer/dependencies/collect/internal/Maven30Stack.java
index e15373c..95a6ead 100644
--- a/src/main/java/org/apache/maven/shared/transfer/dependencies/collect/internal/Maven30Stack.java
+++ b/src/main/java/org/apache/maven/shared/transfer/dependencies/collect/internal/Maven30Stack.java
@@ -29,7 +29,7 @@ import java.util.RandomAccess;
  * @param <E> the type of the elements of the stack.
  * @author Gabriel Belingueres
  */
-public class Maven30Stack<E>
+class Maven30Stack<E>
     extends AbstractList<E>
     implements RandomAccess
 {
diff --git a/src/main/java/org/apache/maven/shared/transfer/dependencies/collect/internal/Maven31DependencyCollector.java b/src/main/java/org/apache/maven/shared/transfer/dependencies/collect/internal/Maven31DependencyCollector.java
index e557a1e..1f0b0a9 100644
--- a/src/main/java/org/apache/maven/shared/transfer/dependencies/collect/internal/Maven31DependencyCollector.java
+++ b/src/main/java/org/apache/maven/shared/transfer/dependencies/collect/internal/Maven31DependencyCollector.java
@@ -25,10 +25,7 @@ import java.util.List;
 import org.apache.maven.RepositoryUtils;
 import org.apache.maven.artifact.handler.ArtifactHandler;
 import org.apache.maven.artifact.handler.manager.ArtifactHandlerManager;
-import org.apache.maven.artifact.repository.ArtifactRepository;
 import org.apache.maven.model.Model;
-import org.apache.maven.project.MavenProject;
-import org.apache.maven.project.ProjectBuildingRequest;
 import org.apache.maven.shared.transfer.dependencies.DependableCoordinate;
 import org.apache.maven.shared.transfer.dependencies.collect.CollectorResult;
 import org.apache.maven.shared.transfer.dependencies.collect.DependencyCollector;
@@ -156,6 +153,79 @@ class Maven31DependencyCollector
 
         return collectDependencies( request );
     }
+    
+    @Override
+    public CollectorResult collectDependenciesGraph( org.apache.maven.model.Dependency root )
+        throws DependencyCollectorException
+    {
+        ArtifactTypeRegistry typeRegistry =
+                        (ArtifactTypeRegistry) Invoker.invoke( RepositoryUtils.class, "newArtifactTypeRegistry",
+                                                               ArtifactHandlerManager.class, artifactHandlerManager );
+
+        CollectRequest request = new CollectRequest();
+        request.setRoot( toDependency( root, typeRegistry ) );
+
+        return collectDependenciesGraph( request );
+    }
+    
+    @Override
+    public CollectorResult collectDependenciesGraph( DependableCoordinate root )
+        throws DependencyCollectorException
+    {
+        ArtifactHandler artifactHandler = artifactHandlerManager.getArtifactHandler( root.getType() );
+        
+        String extension = artifactHandler != null ? artifactHandler.getExtension() : null;
+        
+        Artifact aetherArtifact = new DefaultArtifact( root.getGroupId(), root.getArtifactId(), root.getClassifier(),
+                                                       extension, root.getVersion() );
+        
+        CollectRequest request = new CollectRequest();
+        request.setRoot( new Dependency( aetherArtifact, null ) );
+
+        return collectDependenciesGraph( request );
+    }
+    
+    @Override
+    public CollectorResult collectDependenciesGraph( Model root )
+        throws DependencyCollectorException
+    {
+        // Are there examples where packaging and type are NOT in sync
+        ArtifactHandler artifactHandler = artifactHandlerManager.getArtifactHandler( root.getPackaging() );
+        
+        String extension = artifactHandler != null ? artifactHandler.getExtension() : null;
+        
+        Artifact aetherArtifact =
+            new DefaultArtifact( root.getGroupId(), root.getArtifactId(), extension, root.getVersion() );
+        
+        CollectRequest request = new CollectRequest();
+        request.setRoot( new Dependency( aetherArtifact, null ) );
+
+        ArtifactTypeRegistry typeRegistry =
+                        (ArtifactTypeRegistry) Invoker.invoke( RepositoryUtils.class, "newArtifactTypeRegistry",
+                                                               ArtifactHandlerManager.class, artifactHandlerManager );
+
+        List<Dependency> aetherDependencies = new ArrayList<Dependency>( root.getDependencies().size() );
+        for ( org.apache.maven.model.Dependency mavenDependency : root.getDependencies() )
+        {
+            aetherDependencies.add( toDependency( mavenDependency, typeRegistry ) );
+        }
+        request.setDependencies( aetherDependencies );
+
+        if ( root.getDependencyManagement() != null )
+        {
+            List<Dependency> aetherManagerDependencies =
+                new ArrayList<Dependency>( root.getDependencyManagement().getDependencies().size() );
+            
+            for ( org.apache.maven.model.Dependency mavenDependency : root.getDependencyManagement().getDependencies() )
+            {
+                aetherManagerDependencies.add( toDependency( mavenDependency, typeRegistry ) );
+            }
+            
+            request.setManagedDependencies( aetherManagerDependencies );
+        }
+        
+        return collectDependenciesGraph( request );
+    }
 
     private CollectorResult collectDependencies( CollectRequest request )
         throws DependencyCollectorException
@@ -172,23 +242,12 @@ class Maven31DependencyCollector
         }
     }
 
-    @Override
-    public CollectorResult collectDependenciesGraph( ProjectBuildingRequest buildingRequest )
+    private CollectorResult collectDependenciesGraph( CollectRequest request )
         throws DependencyCollectorException
     {
-        DefaultRepositorySystemSession session = null;
+        DefaultRepositorySystemSession session = new DefaultRepositorySystemSession( this.session );
         try
         {
-            MavenProject project = buildingRequest.getProject();
-
-            org.apache.maven.artifact.Artifact projectArtifact = project.getArtifact();
-            List<ArtifactRepository> remoteArtifactRepositories = project.getRemoteArtifactRepositories();
-
-            DefaultRepositorySystemSession repositorySession =
-                (DefaultRepositorySystemSession) Invoker.invoke( buildingRequest, "getRepositorySession" );
-
-            session = new DefaultRepositorySystemSession( repositorySession );
-
             DependencyGraphTransformer transformer =
                 new ConflictResolver( new NearestVersionSelector(), new JavaScopeSelector(),
                                       new SimpleOptionalitySelector(), new JavaScopeDeriver() );
@@ -202,36 +261,11 @@ class Maven31DependencyCollector
             session.setConfigProperty( ConflictResolver.CONFIG_PROP_VERBOSE, true );
             session.setConfigProperty( DependencyManagerUtils.CONFIG_PROP_VERBOSE, true );
 
-            Artifact aetherArtifact =
-                (Artifact) Invoker.invoke( RepositoryUtils.class, "toArtifact",
-                                           org.apache.maven.artifact.Artifact.class, projectArtifact );
-
-            @SuppressWarnings( "unchecked" )
-            List<org.eclipse.aether.repository.RemoteRepository> aetherRepos =
-                (List<org.eclipse.aether.repository.RemoteRepository>) Invoker.invoke( RepositoryUtils.class, "toRepos",
-                                                                                       List.class,
-                                                                                       remoteArtifactRepositories );
-
-            CollectRequest collectRequest = new CollectRequest();
-            collectRequest.setRoot( new org.eclipse.aether.graph.Dependency( aetherArtifact, "" ) );
-            collectRequest.setRepositories( aetherRepos );
-
-            org.eclipse.aether.artifact.ArtifactTypeRegistry stereotypes = session.getArtifactTypeRegistry();
-            collectDependencyList( collectRequest, project, stereotypes );
-            collectManagedDependencyList( collectRequest, project, stereotypes );
+            request.setRepositories( aetherRepositories );
 
-            CollectResult collectResult = repositorySystem.collectDependencies( session, collectRequest );
+            CollectResult collectResult = repositorySystem.collectDependencies( session, request );
 
             return new Maven31CollectorResult( collectResult );
-
-//            org.eclipse.aether.graph.DependencyNode rootNode = collectResult.getRoot();
-
-//            if ( getLogger().isDebugEnabled() )
-//            {
-//                logTree( rootNode );
-//            }
-
-//            return buildDependencyNode( null, rootNode, projectArtifact, filter );
         }
         catch ( DependencyCollectionException e )
         {
@@ -246,31 +280,6 @@ class Maven31DependencyCollector
         }
     }
 
-    private void collectManagedDependencyList( CollectRequest collectRequest, MavenProject project,
-                                               ArtifactTypeRegistry typeRegistry )
-        throws DependencyCollectorException
-    {
-        if ( project.getDependencyManagement() != null )
-        {
-            for ( org.apache.maven.model.Dependency dependency : project.getDependencyManagement().getDependencies() )
-            {
-                Dependency aetherDep = toDependency( dependency, typeRegistry );
-                collectRequest.addManagedDependency( aetherDep );
-            }
-        }
-    }
-
-    private void collectDependencyList( CollectRequest collectRequest, MavenProject project,
-                                        org.eclipse.aether.artifact.ArtifactTypeRegistry typeRegistry )
-        throws DependencyCollectorException
-    {
-        for ( org.apache.maven.model.Dependency dependency : project.getDependencies() )
-        {
-            Dependency aetherDep = toDependency( dependency, typeRegistry );
-            collectRequest.addDependency( aetherDep );
-        }
-    }
-
     private static Dependency toDependency( org.apache.maven.model.Dependency root, ArtifactTypeRegistry typeRegistry )
                     throws DependencyCollectorException
     {
diff --git a/src/main/java/org/apache/maven/shared/transfer/dependencies/collect/internal/Maven31DirectScopeDependencySelector.java b/src/main/java/org/apache/maven/shared/transfer/dependencies/collect/internal/Maven31DirectScopeDependencySelector.java
index e930597..780c530 100644
--- a/src/main/java/org/apache/maven/shared/transfer/dependencies/collect/internal/Maven31DirectScopeDependencySelector.java
+++ b/src/main/java/org/apache/maven/shared/transfer/dependencies/collect/internal/Maven31DirectScopeDependencySelector.java
@@ -19,6 +19,8 @@ package org.apache.maven.shared.transfer.dependencies.collect.internal;
  * under the License.
  */
 
+import java.util.Objects;
+
 import org.eclipse.aether.collection.DependencyCollectionContext;
 import org.eclipse.aether.collection.DependencySelector;
 import org.eclipse.aether.graph.Dependency;
@@ -30,27 +32,26 @@ import org.eclipse.aether.graph.Dependency;
  * @see {@link Dependency#getScope()}
  * @author Gabriel Belingueres
  */
-public class Maven31DirectScopeDependencySelector
+class Maven31DirectScopeDependencySelector
     implements DependencySelector
 {
 
     private final String scope;
 
     private final int depth;
+    
+    private final int hashCode;
 
-    public Maven31DirectScopeDependencySelector( String scope )
+    Maven31DirectScopeDependencySelector( String scope )
     {
         this( scope, 0 );
     }
 
     private Maven31DirectScopeDependencySelector( String scope, int depth )
     {
-        if ( scope == null )
-        {
-            throw new IllegalArgumentException( "scope is null!" );
-        }
-        this.scope = scope;
+        this.scope = Objects.requireNonNull( scope, "scope is null!" );
         this.depth = depth;
+        this.hashCode = Objects.hash( scope, depth );
     }
 
     /**
@@ -87,11 +88,7 @@ public class Maven31DirectScopeDependencySelector
     @Override
     public int hashCode()
     {
-        final int prime = 31;
-        int result = 1;
-        result = prime * result + depth;
-        result = prime * result + ( ( scope == null ) ? 0 : scope.hashCode() );
-        return result;
+        return hashCode;
     }
 
     @Override
@@ -114,14 +111,7 @@ public class Maven31DirectScopeDependencySelector
         {
             return false;
         }
-        if ( scope == null )
-        {
-            if ( other.scope != null )
-            {
-                return false;
-            }
-        }
-        else if ( !scope.equals( other.scope ) )
+        if ( !Objects.equals( scope, other.scope ) )
         {
             return false;
         }
diff --git a/src/main/java/org/apache/maven/shared/transfer/dependencies/collect/internal/MavenDependencyCollector.java b/src/main/java/org/apache/maven/shared/transfer/dependencies/collect/internal/MavenDependencyCollector.java
index ff8c314..a98c189 100644
--- a/src/main/java/org/apache/maven/shared/transfer/dependencies/collect/internal/MavenDependencyCollector.java
+++ b/src/main/java/org/apache/maven/shared/transfer/dependencies/collect/internal/MavenDependencyCollector.java
@@ -21,7 +21,6 @@ package org.apache.maven.shared.transfer.dependencies.collect.internal;
 
 import org.apache.maven.model.Dependency;
 import org.apache.maven.model.Model;
-import org.apache.maven.project.ProjectBuildingRequest;
 import org.apache.maven.shared.transfer.dependencies.DependableCoordinate;
 import org.apache.maven.shared.transfer.dependencies.collect.CollectorResult;
 import org.apache.maven.shared.transfer.dependencies.collect.DependencyCollectorException;
@@ -42,7 +41,13 @@ public interface MavenDependencyCollector
     CollectorResult collectDependencies( Model root )
         throws DependencyCollectorException;
 
-    CollectorResult collectDependenciesGraph( ProjectBuildingRequest buildingRequest )
+    CollectorResult collectDependenciesGraph( Dependency root )
+        throws DependencyCollectorException;
+
+    CollectorResult collectDependenciesGraph( DependableCoordinate root )
+        throws DependencyCollectorException;
+
+    CollectorResult collectDependenciesGraph( Model root )
         throws DependencyCollectorException;
 
 }