You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@maven.apache.org by cs...@apache.org on 2022/05/24 13:49:53 UTC

[maven-resolver] 01/01: Idea2: collector using RequestTrace

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

cstamas pushed a commit to branch tmp-collect-listener-2
in repository https://gitbox.apache.org/repos/asf/maven-resolver.git

commit e7f04befdf2b952c2ae16e2079225429978a3d25
Author: Tamas Cservenak <ta...@cservenak.net>
AuthorDate: Tue May 24 15:49:16 2022 +0200

    Idea2: collector using RequestTrace
    
    To pass over contextual information to listeners.
---
 .../examples/util/ConsoleRepositoryListener.java   | 34 +++++++++++--
 .../impl/collect/DependencyCollectorDelegate.java  | 12 +++++
 .../impl/collect/DependencyCollectorTrace.java     | 58 ++++++++++++++++++++++
 .../impl/collect/bf/BfDependencyCollector.java     | 25 +++++-----
 .../impl/collect/df/DfDependencyCollector.java     | 46 ++++++++---------
 5 files changed, 133 insertions(+), 42 deletions(-)

diff --git a/maven-resolver-demos/maven-resolver-demo-snippets/src/main/java/org/apache/maven/resolver/examples/util/ConsoleRepositoryListener.java b/maven-resolver-demos/maven-resolver-demo-snippets/src/main/java/org/apache/maven/resolver/examples/util/ConsoleRepositoryListener.java
index 2d5fbafe..d864532f 100644
--- a/maven-resolver-demos/maven-resolver-demo-snippets/src/main/java/org/apache/maven/resolver/examples/util/ConsoleRepositoryListener.java
+++ b/maven-resolver-demos/maven-resolver-demo-snippets/src/main/java/org/apache/maven/resolver/examples/util/ConsoleRepositoryListener.java
@@ -8,9 +8,9 @@ package org.apache.maven.resolver.examples.util;
  * 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
@@ -23,6 +23,9 @@ import java.io.PrintStream;
 
 import org.eclipse.aether.AbstractRepositoryListener;
 import org.eclipse.aether.RepositoryEvent;
+import org.eclipse.aether.RequestTrace;
+import org.eclipse.aether.graph.DependencyNode;
+import org.eclipse.aether.internal.impl.collect.DependencyCollectorTrace;
 
 import static java.util.Objects.requireNonNull;
 
@@ -30,7 +33,7 @@ import static java.util.Objects.requireNonNull;
  * A simplistic repository listener that logs events to the console.
  */
 public class ConsoleRepositoryListener
-    extends AbstractRepositoryListener
+        extends AbstractRepositoryListener
 {
 
     private final PrintStream out;
@@ -61,7 +64,7 @@ public class ConsoleRepositoryListener
     {
         requireNonNull( event, "event cannot be null" );
         out.println( "Invalid artifact descriptor for " + event.getArtifact() + ": "
-            + event.getException().getMessage() );
+                + event.getException().getMessage() );
     }
 
     public void artifactDescriptorMissing( RepositoryEvent event )
@@ -85,6 +88,27 @@ public class ConsoleRepositoryListener
     public void artifactResolved( RepositoryEvent event )
     {
         requireNonNull( event, "event cannot be null" );
+        DependencyCollectorTrace dependencyCollectorTrace = null;
+        RequestTrace trace = event.getTrace();
+        while ( trace != null )
+        {
+            if ( trace.getData() instanceof DependencyCollectorTrace )
+            {
+                dependencyCollectorTrace = (DependencyCollectorTrace) trace.getData();
+                break;
+            }
+            trace = trace.getParent();
+        }
+        if ( dependencyCollectorTrace != null && event.getArtifact().getFile() != null )
+        {
+            StringBuilder stringBuilder = new StringBuilder();
+            for ( DependencyNode dependency : dependencyCollectorTrace.getPath() )
+            {
+                stringBuilder.append( " -> " ).append( dependency.getArtifact() );
+            }
+            stringBuilder.append( " -> " ).append( dependencyCollectorTrace.getNode() );
+            out.println( ">> " + stringBuilder.toString() );
+        }
         out.println( "Resolved artifact " + event.getArtifact() + " from " + event.getRepository() );
     }
 
@@ -103,7 +127,7 @@ public class ConsoleRepositoryListener
     public void artifactResolving( RepositoryEvent event )
     {
         requireNonNull( event, "event cannot be null" );
-        out.println( "Resolving artifact " + event.getArtifact() );
+        //out.println( "Resolving artifact " + event.getArtifact() );
     }
 
     public void metadataDeployed( RepositoryEvent event )
diff --git a/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/collect/DependencyCollectorDelegate.java b/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/collect/DependencyCollectorDelegate.java
index 14d70c2a..de644e09 100644
--- a/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/collect/DependencyCollectorDelegate.java
+++ b/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/collect/DependencyCollectorDelegate.java
@@ -294,6 +294,18 @@ public abstract class DependencyCollectorDelegate implements DependencyCollector
         return result;
     }
 
+    protected RequestTrace trailTrace( RequestTrace trace, String context, List<DependencyNode> path, Dependency node )
+    {
+        return RequestTrace.newChild(
+                trace,
+                new DependencyCollectorTrace(
+                        context,
+                        path,
+                        node
+                )
+        );
+    }
+
     @SuppressWarnings( "checkstyle:parameternumber" )
     protected abstract void doCollectDependencies( RepositorySystemSession session, RequestTrace trace, DataPool pool,
                                                    DefaultDependencyCollectionContext context,
diff --git a/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/collect/DependencyCollectorTrace.java b/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/collect/DependencyCollectorTrace.java
new file mode 100644
index 00000000..5042ee6e
--- /dev/null
+++ b/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/collect/DependencyCollectorTrace.java
@@ -0,0 +1,58 @@
+package org.eclipse.aether.internal.impl.collect;
+
+/*
+ * 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 java.util.List;
+
+import org.eclipse.aether.graph.Dependency;
+import org.eclipse.aether.graph.DependencyNode;
+
+import static java.util.Objects.requireNonNull;
+
+/**
+ * Trace objects for dependency collection.
+ *
+ * @since 1.8.1
+ */
+public final class DependencyCollectorTrace
+{
+    private final String context;
+
+    private final List<DependencyNode> path;
+
+    private final Dependency node;
+
+    public DependencyCollectorTrace( final String context, final List<DependencyNode> path, final Dependency node )
+    {
+        this.context = context;
+        this.path = requireNonNull( path );
+        this.node = requireNonNull( node );
+    }
+
+    public List<DependencyNode> getPath()
+    {
+        return path;
+    }
+
+    public Dependency getNode()
+    {
+        return node;
+    }
+}
diff --git a/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/collect/bf/BfDependencyCollector.java b/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/collect/bf/BfDependencyCollector.java
index 8542dc7c..244f95d1 100644
--- a/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/collect/bf/BfDependencyCollector.java
+++ b/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/collect/bf/BfDependencyCollector.java
@@ -126,7 +126,7 @@ public class BfDependencyCollector
         }
 
         Args args =
-                new Args( session, trace, pool, context, versionContext, request,
+                new Args( session, pool, context, versionContext, request,
                         useSkip ? DependencyResolutionSkipper.defaultSkipper()
                                 : DependencyResolutionSkipper.neverSkipper() );
 
@@ -150,7 +150,7 @@ public class BfDependencyCollector
 
         while ( !args.dependencyProcessingQueue.isEmpty() )
         {
-            processDependency( args, results, args.dependencyProcessingQueue.remove(), Collections.emptyList(),
+            processDependency( args, trace, results, args.dependencyProcessingQueue.remove(), Collections.emptyList(),
                     false );
         }
 
@@ -158,15 +158,17 @@ public class BfDependencyCollector
     }
 
     @SuppressWarnings( "checkstyle:parameternumber" )
-    private void processDependency( Args args, Results results, DependencyProcessingContext context,
-                                    List<Artifact> relocations, boolean disableVersionManagement )
+    private void processDependency( Args args, RequestTrace parent, Results results,
+                                    DependencyProcessingContext context, List<Artifact> relocations,
+                                    boolean disableVersionManagement )
     {
-
         if ( context.depSelector != null && !context.depSelector.selectDependency( context.dependency ) )
         {
             return;
         }
 
+        RequestTrace trace = trailTrace( parent, args.request.getRequestContext(), context.parents,
+                context.dependency );
         PremanagedDependency preManaged =
                 PremanagedDependency.create( context.depManager, context.dependency, disableVersionManagement,
                         args.premanagedState );
@@ -182,7 +184,7 @@ public class BfDependencyCollector
         VersionRangeResult rangeResult;
         try
         {
-            VersionRangeRequest rangeRequest = createVersionRangeRequest( args.request.getRequestContext(), args.trace,
+            VersionRangeRequest rangeRequest = createVersionRangeRequest( args.request.getRequestContext(), trace,
                     context.repositories, dependency );
 
             rangeResult = cachedResolveRangeResult( rangeRequest, args.pool, args.session );
@@ -203,7 +205,7 @@ public class BfDependencyCollector
             Dependency d = dependency.setArtifact( originalArtifact );
 
             ArtifactDescriptorRequest descriptorRequest = createArtifactDescriptorRequest(
-                    args.request.getRequestContext(), args.trace, context.repositories, d );
+                    args.request.getRequestContext(), trace, context.repositories, d );
 
             final ArtifactDescriptorResult descriptorResult =
                     noDescriptor
@@ -236,8 +238,8 @@ public class BfDependencyCollector
                         originalArtifact.getGroupId().equals( d.getArtifact().getGroupId() )
                             && originalArtifact.getArtifactId().equals( d.getArtifact().getArtifactId() );
 
-                    processDependency( args, results, context.withDependency( d ), descriptorResult.getRelocations(),
-                            disableVersionManagementSubsequently );
+                    processDependency( args, parent, results, context.withDependency( d ),
+                            descriptorResult.getRelocations(), disableVersionManagementSubsequently );
                     return;
                 }
                 else
@@ -372,8 +374,6 @@ public class BfDependencyCollector
 
         final boolean premanagedState;
 
-        final RequestTrace trace;
-
         final DataPool pool;
 
         final Queue<DependencyProcessingContext> dependencyProcessingQueue = new ArrayDeque<>( 128 );
@@ -386,7 +386,7 @@ public class BfDependencyCollector
 
         final DependencyResolutionSkipper skipper;
 
-        Args( RepositorySystemSession session, RequestTrace trace, DataPool pool,
+        Args( RepositorySystemSession session, DataPool pool,
                      DefaultDependencyCollectionContext collectionContext, DefaultVersionFilterContext versionContext,
                      CollectRequest request, DependencyResolutionSkipper skipper )
         {
@@ -394,7 +394,6 @@ public class BfDependencyCollector
             this.request = request;
             this.ignoreRepos = session.isIgnoreArtifactDescriptorRepositories();
             this.premanagedState = ConfigUtils.getBoolean( session, false, DependencyManagerUtils.CONFIG_PROP_VERBOSE );
-            this.trace = trace;
             this.pool = pool;
             this.collectionContext = collectionContext;
             this.versionContext = versionContext;
diff --git a/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/collect/df/DfDependencyCollector.java b/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/collect/df/DfDependencyCollector.java
index 4bfaf872..a12a39a0 100644
--- a/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/collect/df/DfDependencyCollector.java
+++ b/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/collect/df/DfDependencyCollector.java
@@ -102,9 +102,9 @@ public class DfDependencyCollector
         NodeStack nodes = new NodeStack();
         nodes.push( node );
 
-        Args args = new Args( session, trace, pool, nodes, context, versionContext, request );
+        Args args = new Args( session, pool, nodes, context, versionContext, request );
 
-        process( args, results, dependencies, repositories,
+        process( args, trace, results, dependencies, repositories,
                 session.getDependencySelector() != null
                         ? session.getDependencySelector().deriveChildSelector( context ) : null,
                 session.getDependencyManager() != null
@@ -116,40 +116,41 @@ public class DfDependencyCollector
     }
 
         @SuppressWarnings( "checkstyle:parameternumber" )
-    private void process( final Args args, Results results, List<Dependency> dependencies,
+    private void process( final Args args, RequestTrace trace, Results results, List<Dependency> dependencies,
                           List<RemoteRepository> repositories, DependencySelector depSelector,
                           DependencyManager depManager, DependencyTraverser depTraverser, VersionFilter verFilter )
     {
         for ( Dependency dependency : dependencies )
         {
-            processDependency( args, results, repositories, depSelector, depManager, depTraverser, verFilter,
+            processDependency( args, trace, results, repositories, depSelector, depManager, depTraverser, verFilter,
                                dependency );
         }
     }
 
     @SuppressWarnings( "checkstyle:parameternumber" )
-    private void processDependency( Args args, Results results, List<RemoteRepository> repositories,
+    private void processDependency( Args args, RequestTrace trace, Results results, List<RemoteRepository> repositories,
                                     DependencySelector depSelector, DependencyManager depManager,
                                     DependencyTraverser depTraverser, VersionFilter verFilter, Dependency dependency )
     {
 
         List<Artifact> relocations = Collections.emptyList();
-        processDependency( args, results, repositories, depSelector, depManager, depTraverser, verFilter, dependency,
-                           relocations, false );
+        processDependency( args, trace, results, repositories, depSelector, depManager, depTraverser, verFilter,
+                dependency, relocations, false );
     }
 
     @SuppressWarnings( "checkstyle:parameternumber" )
-    private void processDependency( Args args, Results results, List<RemoteRepository> repositories,
-                                    DependencySelector depSelector, DependencyManager depManager,
-                                    DependencyTraverser depTraverser, VersionFilter verFilter, Dependency dependency,
-                                    List<Artifact> relocations, boolean disableVersionManagement )
+    private void processDependency( Args args, RequestTrace parent, Results results,
+                                    List<RemoteRepository> repositories, DependencySelector depSelector,
+                                    DependencyManager depManager, DependencyTraverser depTraverser,
+                                    VersionFilter verFilter, Dependency dependency, List<Artifact> relocations,
+                                    boolean disableVersionManagement )
     {
-
         if ( depSelector != null && !depSelector.selectDependency( dependency ) )
         {
             return;
         }
 
+        RequestTrace trace = trailTrace( parent, args.request.getRequestContext(), args.nodes.nodes, dependency );
         PremanagedDependency preManaged =
             PremanagedDependency.create( depManager, dependency, disableVersionManagement, args.premanagedState );
         dependency = preManaged.getManagedDependency();
@@ -162,7 +163,7 @@ public class DfDependencyCollector
         VersionRangeResult rangeResult;
         try
         {
-            VersionRangeRequest rangeRequest = createVersionRangeRequest( args.request.getRequestContext(), args.trace,
+            VersionRangeRequest rangeRequest = createVersionRangeRequest( args.request.getRequestContext(), trace,
                     repositories, dependency );
 
             rangeResult = cachedResolveRangeResult( rangeRequest, args.pool, args.session );
@@ -181,7 +182,7 @@ public class DfDependencyCollector
             Dependency d = dependency.setArtifact( originalArtifact );
 
             ArtifactDescriptorRequest descriptorRequest = createArtifactDescriptorRequest(
-                    args.request.getRequestContext(), args.trace, repositories, d );
+                    args.request.getRequestContext(), trace, repositories, d );
 
             final ArtifactDescriptorResult descriptorResult =
                 getArtifactDescriptorResult( args, results, noDescriptor, d, descriptorRequest );
@@ -212,8 +213,8 @@ public class DfDependencyCollector
                         originalArtifact.getGroupId().equals( d.getArtifact().getGroupId() )
                             && originalArtifact.getArtifactId().equals( d.getArtifact().getArtifactId() );
 
-                    processDependency( args, results, repositories, depSelector, depManager, depTraverser, verFilter, d,
-                                       descriptorResult.getRelocations(), disableVersionManagementSubsequently );
+                    processDependency( args, parent, results, repositories, depSelector, depManager, depTraverser,
+                            verFilter, d, descriptorResult.getRelocations(), disableVersionManagementSubsequently );
                     return;
                 }
                 else
@@ -232,8 +233,8 @@ public class DfDependencyCollector
                     boolean recurse = traverse && !descriptorResult.getDependencies().isEmpty();
                     if ( recurse )
                     {
-                        doRecurse( args, results, repositories, depSelector, depManager, depTraverser, verFilter, d,
-                                   descriptorResult, child );
+                        doRecurse( args, parent, results, repositories, depSelector, depManager, depTraverser,
+                                verFilter, d, descriptorResult, child );
                     }
                 }
             }
@@ -251,7 +252,7 @@ public class DfDependencyCollector
     }
 
     @SuppressWarnings( "checkstyle:parameternumber" )
-    private void doRecurse( Args args, Results results, List<RemoteRepository> repositories,
+    private void doRecurse( Args args, RequestTrace trace, Results results, List<RemoteRepository> repositories,
                             DependencySelector depSelector, DependencyManager depManager,
                             DependencyTraverser depTraverser, VersionFilter verFilter, Dependency d,
                             ArtifactDescriptorResult descriptorResult, DefaultDependencyNode child )
@@ -280,7 +281,7 @@ public class DfDependencyCollector
 
             args.nodes.push( child );
 
-            process( args, results, descriptorResult.getDependencies(), childRepos, childSelector, childManager,
+            process( args, trace, results, descriptorResult.getDependencies(), childRepos, childSelector, childManager,
                      childTraverser, childFilter );
 
             args.nodes.pop();
@@ -340,8 +341,6 @@ public class DfDependencyCollector
 
         final boolean premanagedState;
 
-        final RequestTrace trace;
-
         final DataPool pool;
 
         final NodeStack nodes;
@@ -352,7 +351,7 @@ public class DfDependencyCollector
 
         final CollectRequest request;
 
-        Args( RepositorySystemSession session, RequestTrace trace, DataPool pool, NodeStack nodes,
+        Args( RepositorySystemSession session, DataPool pool, NodeStack nodes,
                      DefaultDependencyCollectionContext collectionContext, DefaultVersionFilterContext versionContext,
                      CollectRequest request )
         {
@@ -360,7 +359,6 @@ public class DfDependencyCollector
             this.request = request;
             this.ignoreRepos = session.isIgnoreArtifactDescriptorRepositories();
             this.premanagedState = ConfigUtils.getBoolean( session, false, DependencyManagerUtils.CONFIG_PROP_VERBOSE );
-            this.trace = trace;
             this.pool = pool;
             this.nodes = nodes;
             this.collectionContext = collectionContext;