From 82c08b932cc1436ac86e4651ec5f1b17674fac9a Mon Sep 17 00:00:00 2001 From: Tamas Cservenak Date: Tue, 24 May 2022 15:49:16 +0200 Subject: [PATCH 01/10] Idea2: collector using RequestTrace To pass over contextual information to listeners. --- .../util/ConsoleRepositoryListener.java | 34 +++++++++-- .../collect/DependencyCollectorDelegate.java | 12 ++++ .../collect/DependencyCollectorTrace.java | 58 +++++++++++++++++++ .../collect/bf/BfDependencyCollector.java | 25 ++++---- .../collect/df/DfDependencyCollector.java | 46 +++++++-------- 5 files changed, 133 insertions(+), 42 deletions(-) create mode 100644 maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/collect/DependencyCollectorTrace.java 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 2d5fbafe8..d864532fa 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 @@ * 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 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 @@ * 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 void artifactDescriptorInvalid( RepositoryEvent event ) { 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 void artifactInstalling( RepositoryEvent event ) 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 void artifactDownloaded( RepositoryEvent event ) 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 0a54f1b79..c5293ebff 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 @@ -290,6 +290,18 @@ public final CollectResult collectDependencies( RepositorySystemSession session, return result; } + protected RequestTrace trailTrace( RequestTrace trace, String context, List 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 000000000..5042ee6ee --- /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 path; + + private final Dependency node; + + public DependencyCollectorTrace( final String context, final List path, final Dependency node ) + { + this.context = context; + this.path = requireNonNull( path ); + this.node = requireNonNull( node ); + } + + public List 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 8542dc7c1..244f95d18 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 @@ protected void doCollectDependencies( RepositorySystemSession session, RequestTr } 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 @@ protected void doCollectDependencies( RepositorySystemSession session, RequestTr 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 @@ protected void doCollectDependencies( RepositorySystemSession session, RequestTr } @SuppressWarnings( "checkstyle:parameternumber" ) - private void processDependency( Args args, Results results, DependencyProcessingContext context, - List relocations, boolean disableVersionManagement ) + private void processDependency( Args args, RequestTrace parent, Results results, + DependencyProcessingContext context, List 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 @@ private void processDependency( Args args, Results results, DependencyProcessing 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 @@ private void processDependency( Args args, Results results, DependencyProcessing 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 @@ private void processDependency( Args args, Results results, DependencyProcessing 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 @@ static class Args final boolean premanagedState; - final RequestTrace trace; - final DataPool pool; final Queue dependencyProcessingQueue = new ArrayDeque<>( 128 ); @@ -386,7 +386,7 @@ static class Args 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 @@ static class Args 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 4bfaf872b..a12a39a0f 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 @@ protected void doCollectDependencies( RepositorySystemSession session, RequestTr 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 @@ protected void doCollectDependencies( RepositorySystemSession session, RequestTr } @SuppressWarnings( "checkstyle:parameternumber" ) - private void process( final Args args, Results results, List dependencies, + private void process( final Args args, RequestTrace trace, Results results, List dependencies, List 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 repositories, + private void processDependency( Args args, RequestTrace trace, Results results, List repositories, DependencySelector depSelector, DependencyManager depManager, DependencyTraverser depTraverser, VersionFilter verFilter, Dependency dependency ) { List 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 repositories, - DependencySelector depSelector, DependencyManager depManager, - DependencyTraverser depTraverser, VersionFilter verFilter, Dependency dependency, - List relocations, boolean disableVersionManagement ) + private void processDependency( Args args, RequestTrace parent, Results results, + List repositories, DependencySelector depSelector, + DependencyManager depManager, DependencyTraverser depTraverser, + VersionFilter verFilter, Dependency dependency, List 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 @@ private void processDependency( Args args, Results results, List repositories, + private void doRecurse( Args args, RequestTrace trace, Results results, List repositories, DependencySelector depSelector, DependencyManager depManager, DependencyTraverser depTraverser, VersionFilter verFilter, Dependency d, ArtifactDescriptorResult descriptorResult, DefaultDependencyNode child ) @@ -280,7 +281,7 @@ private void doRecurse( Args args, Results results, List repos 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 @@ static class Args final boolean premanagedState; - final RequestTrace trace; - final DataPool pool; final NodeStack nodes; @@ -352,7 +351,7 @@ static class Args 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 @@ static class Args 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; From 600468f29d50b887c2178cfd755fb1a991f7cca9 Mon Sep 17 00:00:00 2001 From: Tamas Cservenak Date: Fri, 27 May 2022 13:47:17 +0200 Subject: [PATCH 02/10] Simplify --- .../aether/collection/CollectStepTrace.java | 50 +++++++++++++++++++ .../util/ConsoleRepositoryListener.java | 34 ++----------- ...orTrace.java => CollectStepTraceImpl.java} | 13 ++++- .../collect/DependencyCollectorDelegate.java | 5 +- .../collect/bf/BfDependencyCollector.java | 2 +- .../collect/df/DfDependencyCollector.java | 2 +- 6 files changed, 71 insertions(+), 35 deletions(-) create mode 100644 maven-resolver-api/src/main/java/org/eclipse/aether/collection/CollectStepTrace.java rename maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/collect/{DependencyCollectorTrace.java => CollectStepTraceImpl.java} (81%) diff --git a/maven-resolver-api/src/main/java/org/eclipse/aether/collection/CollectStepTrace.java b/maven-resolver-api/src/main/java/org/eclipse/aether/collection/CollectStepTrace.java new file mode 100644 index 000000000..0d736b1c6 --- /dev/null +++ b/maven-resolver-api/src/main/java/org/eclipse/aether/collection/CollectStepTrace.java @@ -0,0 +1,50 @@ +package org.eclipse.aether.collection; + +/* + * 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; + +/** + * A trace data object revealing collect step (while executing {@link CollectRequest}. + * + * @see org.eclipse.aether.RequestTrace + * @since 1.8.1 + */ +public interface CollectStepTrace +{ + /** + * Returns the context this step happened in. Never {@code null}. + */ + String getContext(); + + /** + * Returns the path of dependency nodes that led collector to current node returned by {@link #getNode()}. + * Never {@code null}. + */ + List getPath(); + + /** + * Returns the current node being processed. Never {@code null}. + */ + Dependency getNode(); +} 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 d864532fa..2d5fbafe8 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 @@ * 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,9 +23,6 @@ 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; @@ -33,7 +30,7 @@ * A simplistic repository listener that logs events to the console. */ public class ConsoleRepositoryListener - extends AbstractRepositoryListener + extends AbstractRepositoryListener { private final PrintStream out; @@ -64,7 +61,7 @@ public void artifactDescriptorInvalid( RepositoryEvent event ) { 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 ) @@ -88,27 +85,6 @@ public void artifactInstalling( RepositoryEvent event ) 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() ); } @@ -127,7 +103,7 @@ public void artifactDownloaded( RepositoryEvent event ) 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/DependencyCollectorTrace.java b/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/collect/CollectStepTraceImpl.java similarity index 81% rename from maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/collect/DependencyCollectorTrace.java rename to maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/collect/CollectStepTraceImpl.java index 5042ee6ee..670b239de 100644 --- 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/CollectStepTraceImpl.java @@ -21,6 +21,7 @@ import java.util.List; +import org.eclipse.aether.collection.CollectStepTrace; import org.eclipse.aether.graph.Dependency; import org.eclipse.aether.graph.DependencyNode; @@ -31,7 +32,7 @@ * * @since 1.8.1 */ -public final class DependencyCollectorTrace +public final class CollectStepTraceImpl implements CollectStepTrace { private final String context; @@ -39,18 +40,26 @@ public final class DependencyCollectorTrace private final Dependency node; - public DependencyCollectorTrace( final String context, final List path, final Dependency node ) + public CollectStepTraceImpl( final String context, final List path, final Dependency node ) { this.context = context; this.path = requireNonNull( path ); this.node = requireNonNull( node ); } + @Override + public String getContext() + { + return context; + } + + @Override public List getPath() { return path; } + @Override public Dependency getNode() { return node; 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 c5293ebff..252854edb 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 @@ -290,11 +290,12 @@ public final CollectResult collectDependencies( RepositorySystemSession session, return result; } - protected RequestTrace trailTrace( RequestTrace trace, String context, List path, Dependency node ) + protected RequestTrace collectStepTrace( RequestTrace trace, String context, List path, + Dependency node ) { return RequestTrace.newChild( trace, - new DependencyCollectorTrace( + new CollectStepTraceImpl( context, path, 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 244f95d18..c82eed941 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 @@ -167,7 +167,7 @@ private void processDependency( Args args, RequestTrace parent, Results results, return; } - RequestTrace trace = trailTrace( parent, args.request.getRequestContext(), context.parents, + RequestTrace trace = collectStepTrace( parent, args.request.getRequestContext(), context.parents, context.dependency ); PremanagedDependency preManaged = PremanagedDependency.create( context.depManager, context.dependency, disableVersionManagement, 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 a12a39a0f..268100f0e 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 @@ -150,7 +150,7 @@ private void processDependency( Args args, RequestTrace parent, Results results, return; } - RequestTrace trace = trailTrace( parent, args.request.getRequestContext(), args.nodes.nodes, dependency ); + RequestTrace trace = collectStepTrace( parent, args.request.getRequestContext(), args.nodes.nodes, dependency ); PremanagedDependency preManaged = PremanagedDependency.create( depManager, dependency, disableVersionManagement, args.premanagedState ); dependency = preManaged.getManagedDependency(); From 2dde984dbed0a176b398a992e267a6f317a07848 Mon Sep 17 00:00:00 2001 From: Tamas Cservenak Date: Fri, 27 May 2022 14:49:23 +0200 Subject: [PATCH 03/10] Demo --- .../examples/ReverseDependencyTree.java | 80 +++++++++++++ .../util/ReverseTreeRepositoryListener.java | 108 ++++++++++++++++++ 2 files changed, 188 insertions(+) create mode 100644 maven-resolver-demos/maven-resolver-demo-snippets/src/main/java/org/apache/maven/resolver/examples/ReverseDependencyTree.java create mode 100644 maven-resolver-demos/maven-resolver-demo-snippets/src/main/java/org/apache/maven/resolver/examples/util/ReverseTreeRepositoryListener.java diff --git a/maven-resolver-demos/maven-resolver-demo-snippets/src/main/java/org/apache/maven/resolver/examples/ReverseDependencyTree.java b/maven-resolver-demos/maven-resolver-demo-snippets/src/main/java/org/apache/maven/resolver/examples/ReverseDependencyTree.java new file mode 100644 index 000000000..a41fd5aba --- /dev/null +++ b/maven-resolver-demos/maven-resolver-demo-snippets/src/main/java/org/apache/maven/resolver/examples/ReverseDependencyTree.java @@ -0,0 +1,80 @@ +package org.apache.maven.resolver.examples; + +/* + * 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.resolver.examples.util.Booter; +import org.apache.maven.resolver.examples.util.ConsoleDependencyGraphDumper; +import org.apache.maven.resolver.examples.util.ReverseTreeRepositoryListener; +import org.eclipse.aether.DefaultRepositorySystemSession; +import org.eclipse.aether.RepositorySystem; +import org.eclipse.aether.artifact.Artifact; +import org.eclipse.aether.artifact.DefaultArtifact; +import org.eclipse.aether.collection.CollectRequest; +import org.eclipse.aether.collection.CollectResult; +import org.eclipse.aether.resolution.ArtifactDescriptorRequest; +import org.eclipse.aether.resolution.ArtifactDescriptorResult; +import org.eclipse.aether.util.graph.manager.DependencyManagerUtils; +import org.eclipse.aether.util.graph.transformer.ConflictResolver; +import org.eclipse.aether.util.listener.ChainedRepositoryListener; + +/** + * Example of building reverse dependency tree. + */ +public class ReverseDependencyTree +{ + + /** + * Main. + * @param args + * @throws Exception + */ + public static void main( String[] args ) + throws Exception + { + System.out.println( "------------------------------------------------------------" ); + System.out.println( ReverseDependencyTree.class.getSimpleName() ); + + RepositorySystem system = Booter.newRepositorySystem( Booter.selectFactory( args ) ); + + DefaultRepositorySystemSession session = Booter.newRepositorySystemSession( system ); + session.setRepositoryListener( new ChainedRepositoryListener( session.getRepositoryListener(), + new ReverseTreeRepositoryListener() ) ); + + session.setConfigProperty( ConflictResolver.CONFIG_PROP_VERBOSE, true ); + session.setConfigProperty( DependencyManagerUtils.CONFIG_PROP_VERBOSE, true ); + + Artifact artifact = new DefaultArtifact( "org.apache.maven:maven-resolver-provider:3.6.1" ); + + ArtifactDescriptorRequest descriptorRequest = new ArtifactDescriptorRequest(); + descriptorRequest.setArtifact( artifact ); + descriptorRequest.setRepositories( Booter.newRepositories( system, session ) ); + ArtifactDescriptorResult descriptorResult = system.readArtifactDescriptor( session, descriptorRequest ); + + CollectRequest collectRequest = new CollectRequest(); + collectRequest.setRequestContext( "demo" ); + collectRequest.setRootArtifact( descriptorResult.getArtifact() ); + collectRequest.setDependencies( descriptorResult.getDependencies() ); + collectRequest.setManagedDependencies( descriptorResult.getManagedDependencies() ); + collectRequest.setRepositories( descriptorRequest.getRepositories() ); + + system.collectDependencies( session, collectRequest ); + } + +} diff --git a/maven-resolver-demos/maven-resolver-demo-snippets/src/main/java/org/apache/maven/resolver/examples/util/ReverseTreeRepositoryListener.java b/maven-resolver-demos/maven-resolver-demo-snippets/src/main/java/org/apache/maven/resolver/examples/util/ReverseTreeRepositoryListener.java new file mode 100644 index 000000000..3f5a31a72 --- /dev/null +++ b/maven-resolver-demos/maven-resolver-demo-snippets/src/main/java/org/apache/maven/resolver/examples/util/ReverseTreeRepositoryListener.java @@ -0,0 +1,108 @@ +package org.apache.maven.resolver.examples.util; + +/* + * 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.io.IOException; +import java.io.UncheckedIOException; +import java.nio.charset.StandardCharsets; +import java.nio.file.Files; +import java.nio.file.Path; +import java.util.ListIterator; +import java.util.Objects; + +import org.eclipse.aether.AbstractRepositoryListener; +import org.eclipse.aether.RepositoryEvent; +import org.eclipse.aether.RequestTrace; +import org.eclipse.aether.artifact.Artifact; +import org.eclipse.aether.collection.CollectStepTrace; +import org.eclipse.aether.graph.Dependency; +import org.eclipse.aether.graph.DependencyNode; + +import static java.util.Objects.requireNonNull; + +/** + * A demo using {@link org.eclipse.aether.collection.CollectStepTrace}. + */ +public class ReverseTreeRepositoryListener + extends AbstractRepositoryListener +{ + public void artifactResolved( RepositoryEvent event ) + { + requireNonNull( event, "event cannot be null" ); + + RequestTrace trace = event.getTrace(); + CollectStepTrace collectStepTrace = null; + while ( trace != null ) + { + if ( trace.getData() instanceof CollectStepTrace ) + { + collectStepTrace = (CollectStepTrace) trace.getData(); + break; + } + trace = trace.getParent(); + } + + if ( collectStepTrace == null ) + { + return; + } + + Artifact resolvedArtifact = event.getArtifact(); + Artifact nodeArtifact = collectStepTrace.getNode().getArtifact(); + + if ( isInScope( resolvedArtifact, nodeArtifact ) ) + { + Dependency node = collectStepTrace.getNode(); + String trackingData = node.toString() + " (" + collectStepTrace.getContext() + ")\n"; + String indent = ""; + ListIterator iter = collectStepTrace.getPath().listIterator(collectStepTrace.getPath().size()); + while (iter.hasPrevious()) + { + DependencyNode curr = iter.previous(); + trackingData += (indent += " ") + curr + " (" + collectStepTrace.getContext() + ")\n"; + } + try + { + Path trackingDir = resolvedArtifact.getFile().getParentFile().toPath().resolve( ".tracking" ); + Files.createDirectories( trackingDir ); + Path trackingFile = trackingDir.resolve( collectStepTrace.getPath().get( 0 ).getArtifact().toString().replace( ":", "_" ) ); + Files.write( trackingFile, trackingData.getBytes( StandardCharsets.UTF_8 ) ); + System.out.println( trackingData ); + } + catch ( IOException e ) + { + throw new UncheckedIOException( e ); + } + } + } + + /** + * The event "artifact resolved" if fired WHENEVER an artifact is resolved, BUT, it happens also when an artifact + * descriptor (model, the POM) is being built, and parent (and parent of parent...) is being asked for. Hence, this + * method "filters" out in WHICH artifact are we interested in, but it intentionally neglects extension, as + * ArtifactDescriptorReader modifies extension to "pom" during collect. So all we have to rely on is GAV only. + */ + private boolean isInScope( Artifact artifact, Artifact nodeArtifact ) + { + return Objects.equals( artifact.getGroupId(), nodeArtifact.getGroupId() ) + && Objects.equals( artifact.getArtifactId(), nodeArtifact.getArtifactId() ) + && Objects.equals( artifact.getVersion(), nodeArtifact.getVersion() ); + } +} From 4a6631ce9a62db80c4354f1a90785ba681b5ec31 Mon Sep 17 00:00:00 2001 From: Tamas Cservenak Date: Fri, 27 May 2022 15:06:50 +0200 Subject: [PATCH 04/10] Fix checkstyle --- .../resolver/examples/ReverseDependencyTree.java | 2 -- .../examples/util/ReverseTreeRepositoryListener.java | 11 +++++++---- 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/maven-resolver-demos/maven-resolver-demo-snippets/src/main/java/org/apache/maven/resolver/examples/ReverseDependencyTree.java b/maven-resolver-demos/maven-resolver-demo-snippets/src/main/java/org/apache/maven/resolver/examples/ReverseDependencyTree.java index a41fd5aba..12378968e 100644 --- a/maven-resolver-demos/maven-resolver-demo-snippets/src/main/java/org/apache/maven/resolver/examples/ReverseDependencyTree.java +++ b/maven-resolver-demos/maven-resolver-demo-snippets/src/main/java/org/apache/maven/resolver/examples/ReverseDependencyTree.java @@ -20,14 +20,12 @@ */ import org.apache.maven.resolver.examples.util.Booter; -import org.apache.maven.resolver.examples.util.ConsoleDependencyGraphDumper; import org.apache.maven.resolver.examples.util.ReverseTreeRepositoryListener; import org.eclipse.aether.DefaultRepositorySystemSession; import org.eclipse.aether.RepositorySystem; import org.eclipse.aether.artifact.Artifact; import org.eclipse.aether.artifact.DefaultArtifact; import org.eclipse.aether.collection.CollectRequest; -import org.eclipse.aether.collection.CollectResult; import org.eclipse.aether.resolution.ArtifactDescriptorRequest; import org.eclipse.aether.resolution.ArtifactDescriptorResult; import org.eclipse.aether.util.graph.manager.DependencyManagerUtils; diff --git a/maven-resolver-demos/maven-resolver-demo-snippets/src/main/java/org/apache/maven/resolver/examples/util/ReverseTreeRepositoryListener.java b/maven-resolver-demos/maven-resolver-demo-snippets/src/main/java/org/apache/maven/resolver/examples/util/ReverseTreeRepositoryListener.java index 3f5a31a72..66b996f22 100644 --- a/maven-resolver-demos/maven-resolver-demo-snippets/src/main/java/org/apache/maven/resolver/examples/util/ReverseTreeRepositoryListener.java +++ b/maven-resolver-demos/maven-resolver-demo-snippets/src/main/java/org/apache/maven/resolver/examples/util/ReverseTreeRepositoryListener.java @@ -72,17 +72,20 @@ public void artifactResolved( RepositoryEvent event ) Dependency node = collectStepTrace.getNode(); String trackingData = node.toString() + " (" + collectStepTrace.getContext() + ")\n"; String indent = ""; - ListIterator iter = collectStepTrace.getPath().listIterator(collectStepTrace.getPath().size()); - while (iter.hasPrevious()) + ListIterator iter = collectStepTrace.getPath() + .listIterator( collectStepTrace.getPath().size() ); + while ( iter.hasPrevious() ) { DependencyNode curr = iter.previous(); - trackingData += (indent += " ") + curr + " (" + collectStepTrace.getContext() + ")\n"; + indent += " "; + trackingData += indent + curr + " (" + collectStepTrace.getContext() + ")\n"; } try { Path trackingDir = resolvedArtifact.getFile().getParentFile().toPath().resolve( ".tracking" ); Files.createDirectories( trackingDir ); - Path trackingFile = trackingDir.resolve( collectStepTrace.getPath().get( 0 ).getArtifact().toString().replace( ":", "_" ) ); + Path trackingFile = trackingDir.resolve( collectStepTrace.getPath().get( 0 ) + .getArtifact().toString().replace( ":", "_" ) ); Files.write( trackingFile, trackingData.getBytes( StandardCharsets.UTF_8 ) ); System.out.println( trackingData ); } From bf96c997c8d88669de23de03b68276d0e13e0fc8 Mon Sep 17 00:00:00 2001 From: Tamas Cservenak Date: Fri, 27 May 2022 15:12:09 +0200 Subject: [PATCH 05/10] Rename --- .../{CollectStepTrace.java => CollectStepData.java} | 6 +++--- .../examples/util/ReverseTreeRepositoryListener.java | 10 +++++----- ...lectStepTraceImpl.java => CollectStepDataImpl.java} | 6 +++--- .../impl/collect/DependencyCollectorDelegate.java | 2 +- 4 files changed, 12 insertions(+), 12 deletions(-) rename maven-resolver-api/src/main/java/org/eclipse/aether/collection/{CollectStepTrace.java => CollectStepData.java} (89%) rename maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/collect/{CollectStepTraceImpl.java => CollectStepDataImpl.java} (87%) diff --git a/maven-resolver-api/src/main/java/org/eclipse/aether/collection/CollectStepTrace.java b/maven-resolver-api/src/main/java/org/eclipse/aether/collection/CollectStepData.java similarity index 89% rename from maven-resolver-api/src/main/java/org/eclipse/aether/collection/CollectStepTrace.java rename to maven-resolver-api/src/main/java/org/eclipse/aether/collection/CollectStepData.java index 0d736b1c6..28036e9d7 100644 --- a/maven-resolver-api/src/main/java/org/eclipse/aether/collection/CollectStepTrace.java +++ b/maven-resolver-api/src/main/java/org/eclipse/aether/collection/CollectStepData.java @@ -30,10 +30,10 @@ * @see org.eclipse.aether.RequestTrace * @since 1.8.1 */ -public interface CollectStepTrace +public interface CollectStepData { /** - * Returns the context this step happened in. Never {@code null}. + * Returns the context of collection. Never {@code null}. */ String getContext(); @@ -44,7 +44,7 @@ public interface CollectStepTrace List getPath(); /** - * Returns the current node being processed. Never {@code null}. + * Returns the current node being collected. Never {@code null}. */ Dependency getNode(); } diff --git a/maven-resolver-demos/maven-resolver-demo-snippets/src/main/java/org/apache/maven/resolver/examples/util/ReverseTreeRepositoryListener.java b/maven-resolver-demos/maven-resolver-demo-snippets/src/main/java/org/apache/maven/resolver/examples/util/ReverseTreeRepositoryListener.java index 66b996f22..2f911e04e 100644 --- a/maven-resolver-demos/maven-resolver-demo-snippets/src/main/java/org/apache/maven/resolver/examples/util/ReverseTreeRepositoryListener.java +++ b/maven-resolver-demos/maven-resolver-demo-snippets/src/main/java/org/apache/maven/resolver/examples/util/ReverseTreeRepositoryListener.java @@ -31,14 +31,14 @@ import org.eclipse.aether.RepositoryEvent; import org.eclipse.aether.RequestTrace; import org.eclipse.aether.artifact.Artifact; -import org.eclipse.aether.collection.CollectStepTrace; +import org.eclipse.aether.collection.CollectStepData; import org.eclipse.aether.graph.Dependency; import org.eclipse.aether.graph.DependencyNode; import static java.util.Objects.requireNonNull; /** - * A demo using {@link org.eclipse.aether.collection.CollectStepTrace}. + * A demo using {@link CollectStepData}. */ public class ReverseTreeRepositoryListener extends AbstractRepositoryListener @@ -48,12 +48,12 @@ public void artifactResolved( RepositoryEvent event ) requireNonNull( event, "event cannot be null" ); RequestTrace trace = event.getTrace(); - CollectStepTrace collectStepTrace = null; + CollectStepData collectStepTrace = null; while ( trace != null ) { - if ( trace.getData() instanceof CollectStepTrace ) + if ( trace.getData() instanceof CollectStepData ) { - collectStepTrace = (CollectStepTrace) trace.getData(); + collectStepTrace = (CollectStepData) trace.getData(); break; } trace = trace.getParent(); diff --git a/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/collect/CollectStepTraceImpl.java b/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/collect/CollectStepDataImpl.java similarity index 87% rename from maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/collect/CollectStepTraceImpl.java rename to maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/collect/CollectStepDataImpl.java index 670b239de..6223dace0 100644 --- a/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/collect/CollectStepTraceImpl.java +++ b/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/collect/CollectStepDataImpl.java @@ -21,7 +21,7 @@ import java.util.List; -import org.eclipse.aether.collection.CollectStepTrace; +import org.eclipse.aether.collection.CollectStepData; import org.eclipse.aether.graph.Dependency; import org.eclipse.aether.graph.DependencyNode; @@ -32,7 +32,7 @@ * * @since 1.8.1 */ -public final class CollectStepTraceImpl implements CollectStepTrace +public final class CollectStepDataImpl implements CollectStepData { private final String context; @@ -40,7 +40,7 @@ public final class CollectStepTraceImpl implements CollectStepTrace private final Dependency node; - public CollectStepTraceImpl( final String context, final List path, final Dependency node ) + public CollectStepDataImpl( final String context, final List path, final Dependency node ) { this.context = context; this.path = requireNonNull( path ); 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 252854edb..1b5bf5ba4 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 @@ -295,7 +295,7 @@ protected RequestTrace collectStepTrace( RequestTrace trace, String context, Lis { return RequestTrace.newChild( trace, - new CollectStepTraceImpl( + new CollectStepDataImpl( context, path, node From d5a384799ca8c696ca9717cd54a168edc4583e87 Mon Sep 17 00:00:00 2001 From: Tamas Cservenak Date: Sat, 28 May 2022 20:08:17 +0200 Subject: [PATCH 06/10] Nullcheck --- .../aether/internal/impl/collect/CollectStepDataImpl.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/collect/CollectStepDataImpl.java b/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/collect/CollectStepDataImpl.java index 6223dace0..eb1df324c 100644 --- a/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/collect/CollectStepDataImpl.java +++ b/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/collect/CollectStepDataImpl.java @@ -42,7 +42,7 @@ public final class CollectStepDataImpl implements CollectStepData public CollectStepDataImpl( final String context, final List path, final Dependency node ) { - this.context = context; + this.context = requireNonNull( context ); this.path = requireNonNull( path ); this.node = requireNonNull( node ); } From e4d67a11de860dd821ac9aa5949236fe681d02c8 Mon Sep 17 00:00:00 2001 From: Tamas Cservenak Date: Sat, 28 May 2022 20:34:52 +0200 Subject: [PATCH 07/10] Make test run, add some comments --- .../apache/maven/resolver/examples/AllResolverDemos.java | 1 + .../maven/resolver/examples/ReverseDependencyTree.java | 7 ++++++- .../examples/util/ReverseTreeRepositoryListener.java | 4 +++- 3 files changed, 10 insertions(+), 2 deletions(-) diff --git a/maven-resolver-demos/maven-resolver-demo-snippets/src/main/java/org/apache/maven/resolver/examples/AllResolverDemos.java b/maven-resolver-demos/maven-resolver-demo-snippets/src/main/java/org/apache/maven/resolver/examples/AllResolverDemos.java index 74bb3d48c..bb260aaff 100644 --- a/maven-resolver-demos/maven-resolver-demo-snippets/src/main/java/org/apache/maven/resolver/examples/AllResolverDemos.java +++ b/maven-resolver-demos/maven-resolver-demo-snippets/src/main/java/org/apache/maven/resolver/examples/AllResolverDemos.java @@ -39,6 +39,7 @@ public static void main( String[] args ) GetDependencyHierarchy.main( args ); ResolveArtifact.main( args ); ResolveTransitiveDependencies.main( args ); + ReverseDependencyTree.main( args ); InstallArtifacts.main( args ); DeployArtifacts.main( args ); } diff --git a/maven-resolver-demos/maven-resolver-demo-snippets/src/main/java/org/apache/maven/resolver/examples/ReverseDependencyTree.java b/maven-resolver-demos/maven-resolver-demo-snippets/src/main/java/org/apache/maven/resolver/examples/ReverseDependencyTree.java index 12378968e..97b0b4af1 100644 --- a/maven-resolver-demos/maven-resolver-demo-snippets/src/main/java/org/apache/maven/resolver/examples/ReverseDependencyTree.java +++ b/maven-resolver-demos/maven-resolver-demo-snippets/src/main/java/org/apache/maven/resolver/examples/ReverseDependencyTree.java @@ -33,7 +33,7 @@ import org.eclipse.aether.util.listener.ChainedRepositoryListener; /** - * Example of building reverse dependency tree. + * Example of building reverse dependency tree using custom {@link ReverseTreeRepositoryListener}. */ public class ReverseDependencyTree { @@ -52,6 +52,8 @@ public static void main( String[] args ) RepositorySystem system = Booter.newRepositorySystem( Booter.selectFactory( args ) ); DefaultRepositorySystemSession session = Booter.newRepositorySystemSession( system ); + + // install the listener into session session.setRepositoryListener( new ChainedRepositoryListener( session.getRepositoryListener(), new ReverseTreeRepositoryListener() ) ); @@ -73,6 +75,9 @@ public static void main( String[] args ) collectRequest.setRepositories( descriptorRequest.getRepositories() ); system.collectDependencies( session, collectRequest ); + + // in this demo we are not interested in collect result, + // as all the "demo work" is done by installed ReverseTreeRepositoryListener } } diff --git a/maven-resolver-demos/maven-resolver-demo-snippets/src/main/java/org/apache/maven/resolver/examples/util/ReverseTreeRepositoryListener.java b/maven-resolver-demos/maven-resolver-demo-snippets/src/main/java/org/apache/maven/resolver/examples/util/ReverseTreeRepositoryListener.java index 2f911e04e..1c90f7c19 100644 --- a/maven-resolver-demos/maven-resolver-demo-snippets/src/main/java/org/apache/maven/resolver/examples/util/ReverseTreeRepositoryListener.java +++ b/maven-resolver-demos/maven-resolver-demo-snippets/src/main/java/org/apache/maven/resolver/examples/util/ReverseTreeRepositoryListener.java @@ -38,11 +38,13 @@ import static java.util.Objects.requireNonNull; /** - * A demo using {@link CollectStepData}. + * A demo class building reverse tree using {@link CollectStepData} trace data provided in {@link RepositoryEvent} + * events fired during collection. */ public class ReverseTreeRepositoryListener extends AbstractRepositoryListener { + @Override public void artifactResolved( RepositoryEvent event ) { requireNonNull( event, "event cannot be null" ); From b4c56d8f9e153c7ae565c85e18b76435a2c4a530 Mon Sep 17 00:00:00 2001 From: Tamas Cservenak Date: Sun, 29 May 2022 19:03:04 +0200 Subject: [PATCH 08/10] Apply PR comments --- .../examples/util/ReverseTreeRepositoryListener.java | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/maven-resolver-demos/maven-resolver-demo-snippets/src/main/java/org/apache/maven/resolver/examples/util/ReverseTreeRepositoryListener.java b/maven-resolver-demos/maven-resolver-demo-snippets/src/main/java/org/apache/maven/resolver/examples/util/ReverseTreeRepositoryListener.java index 1c90f7c19..758c2d421 100644 --- a/maven-resolver-demos/maven-resolver-demo-snippets/src/main/java/org/apache/maven/resolver/examples/util/ReverseTreeRepositoryListener.java +++ b/maven-resolver-demos/maven-resolver-demo-snippets/src/main/java/org/apache/maven/resolver/examples/util/ReverseTreeRepositoryListener.java @@ -44,6 +44,8 @@ public class ReverseTreeRepositoryListener extends AbstractRepositoryListener { + private static final String LINE_SEP = System.lineSeparator(); + @Override public void artifactResolved( RepositoryEvent event ) { @@ -72,7 +74,7 @@ public void artifactResolved( RepositoryEvent event ) if ( isInScope( resolvedArtifact, nodeArtifact ) ) { Dependency node = collectStepTrace.getNode(); - String trackingData = node.toString() + " (" + collectStepTrace.getContext() + ")\n"; + String trackingData = node + " (" + collectStepTrace.getContext() + ")" + LINE_SEP; String indent = ""; ListIterator iter = collectStepTrace.getPath() .listIterator( collectStepTrace.getPath().size() ); @@ -80,7 +82,7 @@ public void artifactResolved( RepositoryEvent event ) { DependencyNode curr = iter.previous(); indent += " "; - trackingData += indent + curr + " (" + collectStepTrace.getContext() + ")\n"; + trackingData += indent + curr + " (" + collectStepTrace.getContext() + ")" + LINE_SEP; } try { @@ -99,9 +101,9 @@ public void artifactResolved( RepositoryEvent event ) } /** - * The event "artifact resolved" if fired WHENEVER an artifact is resolved, BUT, it happens also when an artifact + * The event "artifact resolved" if fired WHENEVER an artifact is resolved, BUT it happens also when an artifact * descriptor (model, the POM) is being built, and parent (and parent of parent...) is being asked for. Hence, this - * method "filters" out in WHICH artifact are we interested in, but it intentionally neglects extension, as + * method "filters" out in WHICH artifact are we interested in, but it intentionally neglects extension as * ArtifactDescriptorReader modifies extension to "pom" during collect. So all we have to rely on is GAV only. */ private boolean isInScope( Artifact artifact, Artifact nodeArtifact ) From bbbc03cf5b97bd693c1e054f4b5ae35537f8fb8a Mon Sep 17 00:00:00 2001 From: Tamas Cservenak Date: Sun, 29 May 2022 19:23:05 +0200 Subject: [PATCH 09/10] Add javadoc --- .../impl/collect/DependencyCollectorDelegate.java | 14 ++++++++++++++ 1 file changed, 14 insertions(+) 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 1b5bf5ba4..0897cc683 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 @@ -290,6 +290,20 @@ public final CollectResult collectDependencies( RepositorySystemSession session, return result; } + /** + * Creates child {@link RequestTrace} instance from passed in {@link RequestTrace} and parameters by creating + * {@link CollectStepDataImpl} instance out of passed in data. Caller must ensure that passed in parameters are + * NOT affected by threading (or that there is no multi threading involved). In other words, the passed in values + * should be immutable. + * + * @param trace The current trace instance. + * @param context The context from {@link CollectRequest#getRequestContext()}, never {@code null}. + * @param path List representing the path of dependency nodes, never {@code null}. Caller must ensure, that this + * list does not change during the lifetime of the requested {@link RequestTrace} instance. If it may + * change, simplest is to pass here a copy of used list. + * @param node Currently collected node, that collector came by following the passed in path. + * @return A child request trance instance, never {@code null}. + */ protected RequestTrace collectStepTrace( RequestTrace trace, String context, List path, Dependency node ) { From 228882353316372e07a097fced832685a70d4a75 Mon Sep 17 00:00:00 2001 From: Tamas Cservenak Date: Sun, 29 May 2022 19:29:40 +0200 Subject: [PATCH 10/10] Rename to EOL --- .../examples/util/ReverseTreeRepositoryListener.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/maven-resolver-demos/maven-resolver-demo-snippets/src/main/java/org/apache/maven/resolver/examples/util/ReverseTreeRepositoryListener.java b/maven-resolver-demos/maven-resolver-demo-snippets/src/main/java/org/apache/maven/resolver/examples/util/ReverseTreeRepositoryListener.java index 758c2d421..a13a768a8 100644 --- a/maven-resolver-demos/maven-resolver-demo-snippets/src/main/java/org/apache/maven/resolver/examples/util/ReverseTreeRepositoryListener.java +++ b/maven-resolver-demos/maven-resolver-demo-snippets/src/main/java/org/apache/maven/resolver/examples/util/ReverseTreeRepositoryListener.java @@ -44,7 +44,7 @@ public class ReverseTreeRepositoryListener extends AbstractRepositoryListener { - private static final String LINE_SEP = System.lineSeparator(); + private static final String EOL = System.lineSeparator(); @Override public void artifactResolved( RepositoryEvent event ) @@ -74,7 +74,7 @@ public void artifactResolved( RepositoryEvent event ) if ( isInScope( resolvedArtifact, nodeArtifact ) ) { Dependency node = collectStepTrace.getNode(); - String trackingData = node + " (" + collectStepTrace.getContext() + ")" + LINE_SEP; + String trackingData = node + " (" + collectStepTrace.getContext() + ")" + EOL; String indent = ""; ListIterator iter = collectStepTrace.getPath() .listIterator( collectStepTrace.getPath().size() ); @@ -82,7 +82,7 @@ public void artifactResolved( RepositoryEvent event ) { DependencyNode curr = iter.previous(); indent += " "; - trackingData += indent + curr + " (" + collectStepTrace.getContext() + ")" + LINE_SEP; + trackingData += indent + curr + " (" + collectStepTrace.getContext() + ")" + EOL; } try {