You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@maven.apache.org by ol...@apache.org on 2022/11/11 08:41:03 UTC

[maven-dependency-tree] branch master updated: [MSHARED-1158] make DependencyCollectorBuilder nore configurable (#28)

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

olamy pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/maven-dependency-tree.git


The following commit(s) were added to refs/heads/master by this push:
     new 2ef02ce  [MSHARED-1158] make DependencyCollectorBuilder nore configurable (#28)
2ef02ce is described below

commit 2ef02cecb94fa8b6f17437970040df950da2ba17
Author: Olivier Lamy <ol...@apache.org>
AuthorDate: Fri Nov 11 18:40:58 2022 +1000

    [MSHARED-1158] make DependencyCollectorBuilder nore configurable (#28)
    
    * [SHARED-1158] DependencyCollectorBuilder should be more configurable
    
    Signed-off-by: Olivier Lamy <ol...@apache.org>
---
 .../graph/DependencyCollectorBuilder.java          |  19 ++-
 .../graph/DependencyCollectorRequest.java          | 162 +++++++++++++++++++++
 .../DefaultDependencyCollectorBuilder.java         |  34 ++---
 3 files changed, 190 insertions(+), 25 deletions(-)

diff --git a/src/main/java/org/apache/maven/shared/dependency/graph/DependencyCollectorBuilder.java b/src/main/java/org/apache/maven/shared/dependency/graph/DependencyCollectorBuilder.java
index 9ece96f..48c0a77 100644
--- a/src/main/java/org/apache/maven/shared/dependency/graph/DependencyCollectorBuilder.java
+++ b/src/main/java/org/apache/maven/shared/dependency/graph/DependencyCollectorBuilder.java
@@ -41,7 +41,22 @@ public interface DependencyCollectorBuilder
      * @return the raw dependency tree
      * @throws DependencyCollectorBuilderException if some of the dependencies could not be collected.
      */
-    DependencyNode collectDependencyGraph( ProjectBuildingRequest buildingRequest, ArtifactFilter filter )
-        throws DependencyCollectorBuilderException;
+    default DependencyNode collectDependencyGraph( ProjectBuildingRequest buildingRequest, ArtifactFilter filter )
+        throws DependencyCollectorBuilderException
+    {
+        return collectDependencyGraph( new DependencyCollectorRequest( buildingRequest, filter ) );
+    }
+
+    /**
+     * collect the project's raw dependency graph, with information to allow the API client to reason on its own about
+     * dependencies.
+     *
+     * @param dependencyCollectorRequest the request with different paramaters.
+     * @return the raw dependency tree
+     * @throws DependencyCollectorBuilderException if some of the dependencies could not be collected.
+     * @since 3.2.1
+     */
+    DependencyNode collectDependencyGraph( DependencyCollectorRequest dependencyCollectorRequest )
+            throws DependencyCollectorBuilderException;
 
 }
diff --git a/src/main/java/org/apache/maven/shared/dependency/graph/DependencyCollectorRequest.java b/src/main/java/org/apache/maven/shared/dependency/graph/DependencyCollectorRequest.java
new file mode 100644
index 0000000..450650e
--- /dev/null
+++ b/src/main/java/org/apache/maven/shared/dependency/graph/DependencyCollectorRequest.java
@@ -0,0 +1,162 @@
+package org.apache.maven.shared.dependency.graph;
+
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *  http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+import org.apache.maven.artifact.resolver.filter.ArtifactFilter;
+import org.apache.maven.project.ProjectBuildingRequest;
+import org.apache.maven.shared.dependency.graph.internal.DirectScopeDependencySelector;
+import org.apache.maven.shared.dependency.graph.internal.VerboseJavaScopeSelector;
+import org.eclipse.aether.collection.DependencyGraphTransformer;
+import org.eclipse.aether.collection.DependencySelector;
+import org.eclipse.aether.util.artifact.JavaScopes;
+import org.eclipse.aether.util.graph.manager.DependencyManagerUtils;
+import org.eclipse.aether.util.graph.selector.AndDependencySelector;
+import org.eclipse.aether.util.graph.selector.ExclusionDependencySelector;
+import org.eclipse.aether.util.graph.selector.OptionalDependencySelector;
+import org.eclipse.aether.util.graph.transformer.ConflictResolver;
+import org.eclipse.aether.util.graph.transformer.JavaScopeDeriver;
+import org.eclipse.aether.util.graph.transformer.NearestVersionSelector;
+import org.eclipse.aether.util.graph.transformer.SimpleOptionalitySelector;
+
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Objects;
+
+/**
+ * <div>
+ * This class will carry various options used by
+ * {@link DependencyCollectorBuilder#collectDependencyGraph(DependencyCollectorRequest)}
+ * </div>
+ * <div>
+ * There is a set of default values such:
+ * </div>
+ * <div>
+ * DependencySelector
+ * <pre>
+ *  new AndDependencySelector(
+ *             new DirectScopeDependencySelector( JavaScopes.TEST ),
+ *             new DirectScopeDependencySelector( JavaScopes.PROVIDED ),
+ *             new OptionalDependencySelector(),
+ *             new ExclusionDependencySelector() );
+ * </pre>
+ * </div>
+ * <div>
+ * DependencyGraphTransformer
+ * <pre>
+ * new ConflictResolver(
+ *             new NearestVersionSelector(),
+ *             new VerboseJavaScopeSelector(),
+ *             new SimpleOptionalitySelector(),
+ *             new JavaScopeDeriver() );
+ * </pre>
+ * </div>
+ * <div>
+ * configProperties have 2 default values
+ * <pre>
+ *   ConflictResolver.CONFIG_PROP_VERBOSE, true
+ *   DependencyManagerUtils.CONFIG_PROP_VERBOSE, true
+ * </pre>
+ * <a href="https://maven.apache.org/resolver/configuration.html">Move Resolver configuration properties</a>.
+ * </div>
+ * @since 3.2.1
+ */
+public class DependencyCollectorRequest
+{
+
+    private final ProjectBuildingRequest buildingRequest;
+
+    private ArtifactFilter filter;
+
+    private Map<String, Object> configProperties = new HashMap<>();
+
+    private DependencySelector dependencySelector = new AndDependencySelector(
+            new DirectScopeDependencySelector( JavaScopes.TEST ),
+            new DirectScopeDependencySelector( JavaScopes.PROVIDED ),
+            new OptionalDependencySelector(),
+            new ExclusionDependencySelector() );
+
+    private DependencyGraphTransformer dependencyGraphTransformer = new ConflictResolver(
+            new NearestVersionSelector(),
+            new VerboseJavaScopeSelector(),
+            new SimpleOptionalitySelector(),
+            new JavaScopeDeriver() );
+
+    public DependencyCollectorRequest( ProjectBuildingRequest buildingRequest )
+    {
+        this( buildingRequest, null );
+    }
+
+    public DependencyCollectorRequest( ProjectBuildingRequest buildingRequest, ArtifactFilter filter )
+    {
+        Objects.requireNonNull( buildingRequest, "ProjectBuildingRequest cannot be null" );
+        this.buildingRequest = buildingRequest;
+        this.filter = filter;
+        configProperties.put( ConflictResolver.CONFIG_PROP_VERBOSE, true );
+        configProperties.put( DependencyManagerUtils.CONFIG_PROP_VERBOSE, true );
+    }
+
+    public ProjectBuildingRequest getBuildingRequest()
+    {
+        return buildingRequest;
+    }
+
+    public ArtifactFilter getFilter()
+    {
+        return filter;
+    }
+
+    public DependencySelector getDependencySelector()
+    {
+        return dependencySelector;
+    }
+
+    public DependencyCollectorRequest dependencySelector( DependencySelector dependencySelector )
+    {
+        this.dependencySelector = dependencySelector;
+        return this;
+    }
+
+    public DependencyGraphTransformer getDependencyGraphTransformer()
+    {
+        return dependencyGraphTransformer;
+    }
+
+    public DependencyCollectorRequest dependencyGraphTransformer(
+            DependencyGraphTransformer dependencyGraphTransformer )
+    {
+        this.dependencyGraphTransformer = dependencyGraphTransformer;
+        return this;
+    }
+
+    public Map<String, Object> getConfigProperties()
+    {
+        return this.configProperties;
+    }
+
+    public void addConfigProperty( String key, Object value )
+    {
+        this.configProperties.put( key, value );
+    }
+
+    public void removeConfigProperty( String key )
+    {
+        this.configProperties.remove( key );
+    }
+}
diff --git a/src/main/java/org/apache/maven/shared/dependency/graph/internal/DefaultDependencyCollectorBuilder.java b/src/main/java/org/apache/maven/shared/dependency/graph/internal/DefaultDependencyCollectorBuilder.java
index 5b0218d..b30f782 100644
--- a/src/main/java/org/apache/maven/shared/dependency/graph/internal/DefaultDependencyCollectorBuilder.java
+++ b/src/main/java/org/apache/maven/shared/dependency/graph/internal/DefaultDependencyCollectorBuilder.java
@@ -22,6 +22,7 @@ package org.apache.maven.shared.dependency.graph.internal;
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.List;
+import java.util.Map;
 
 import javax.inject.Inject;
 import javax.inject.Named;
@@ -35,6 +36,7 @@ import org.apache.maven.project.MavenProject;
 import org.apache.maven.project.ProjectBuildingRequest;
 import org.apache.maven.shared.dependency.graph.DependencyCollectorBuilder;
 import org.apache.maven.shared.dependency.graph.DependencyCollectorBuilderException;
+import org.apache.maven.shared.dependency.graph.DependencyCollectorRequest;
 import org.apache.maven.shared.dependency.graph.DependencyNode;
 import org.eclipse.aether.DefaultRepositorySystemSession;
 import org.eclipse.aether.RepositorySystem;
@@ -43,19 +45,10 @@ import org.eclipse.aether.artifact.ArtifactTypeRegistry;
 import org.eclipse.aether.collection.CollectRequest;
 import org.eclipse.aether.collection.CollectResult;
 import org.eclipse.aether.collection.DependencyCollectionException;
-import org.eclipse.aether.collection.DependencyGraphTransformer;
-import org.eclipse.aether.collection.DependencySelector;
 import org.eclipse.aether.graph.DependencyVisitor;
 import org.eclipse.aether.graph.Exclusion;
-import org.eclipse.aether.util.artifact.JavaScopes;
 import org.eclipse.aether.util.graph.manager.DependencyManagerUtils;
-import org.eclipse.aether.util.graph.selector.AndDependencySelector;
-import org.eclipse.aether.util.graph.selector.ExclusionDependencySelector;
-import org.eclipse.aether.util.graph.selector.OptionalDependencySelector;
 import org.eclipse.aether.util.graph.transformer.ConflictResolver;
-import org.eclipse.aether.util.graph.transformer.JavaScopeDeriver;
-import org.eclipse.aether.util.graph.transformer.NearestVersionSelector;
-import org.eclipse.aether.util.graph.transformer.SimpleOptionalitySelector;
 import org.eclipse.aether.util.graph.visitor.TreeDependencyVisitor;
 import org.eclipse.aether.version.VersionConstraint;
 import org.slf4j.Logger;
@@ -82,12 +75,13 @@ public class DefaultDependencyCollectorBuilder
     }
 
     @Override
-    public DependencyNode collectDependencyGraph( ProjectBuildingRequest buildingRequest, ArtifactFilter filter )
+    public DependencyNode collectDependencyGraph( DependencyCollectorRequest dependencyCollectorRequest )
         throws DependencyCollectorBuilderException
     {
         DefaultRepositorySystemSession session = null;
         try
         {
+            ProjectBuildingRequest buildingRequest = dependencyCollectorRequest.getBuildingRequest();
             MavenProject project = buildingRequest.getProject();
 
             Artifact projectArtifact = project.getArtifact();
@@ -97,20 +91,14 @@ public class DefaultDependencyCollectorBuilder
 
             session = new DefaultRepositorySystemSession( repositorySession );
 
-            DependencyGraphTransformer transformer =
-                new ConflictResolver( new NearestVersionSelector(), new VerboseJavaScopeSelector(),
-                                      new SimpleOptionalitySelector(), new JavaScopeDeriver() );
-            session.setDependencyGraphTransformer( transformer );
+            session.setDependencyGraphTransformer( dependencyCollectorRequest.getDependencyGraphTransformer() );
 
-            DependencySelector depFilter =
-                new AndDependencySelector( new DirectScopeDependencySelector( JavaScopes.TEST ),
-                                           new DirectScopeDependencySelector( JavaScopes.PROVIDED ),
-                                           new OptionalDependencySelector(),
-                                           new ExclusionDependencySelector() );
-            session.setDependencySelector( depFilter );
+            session.setDependencySelector( dependencyCollectorRequest.getDependencySelector() );
 
-            session.setConfigProperty( ConflictResolver.CONFIG_PROP_VERBOSE, true );
-            session.setConfigProperty( DependencyManagerUtils.CONFIG_PROP_VERBOSE, true );
+            for ( Map.Entry<String, Object> entry : dependencyCollectorRequest.getConfigProperties().entrySet() )
+            {
+                session.setConfigProperty( entry.getKey(), entry.getValue() );
+            }
 
             org.eclipse.aether.artifact.Artifact aetherArtifact = RepositoryUtils.toArtifact( projectArtifact );
 
@@ -134,7 +122,7 @@ public class DefaultDependencyCollectorBuilder
                 logTree( rootNode );
             }
 
-            return buildDependencyNode( null, rootNode, projectArtifact, filter );
+            return buildDependencyNode( null, rootNode, projectArtifact, dependencyCollectorRequest.getFilter() );
         }
         catch ( DependencyCollectionException e )
         {