Skip to content

Commit e676041

Browse files
authored
[MRESOLVER-217] Extra sources for Artifact decoration (apache#453)
Added SPI and demo contains example of decorator. Builds upon [MRESOLVER-519](https://issues.apache.org/jira/browse/MRESOLVER-519) --- https://issues.apache.org/jira/browse/MRESOLVER-217
1 parent 089796b commit e676041

File tree

18 files changed

+305
-21
lines changed

18 files changed

+305
-21
lines changed

maven-resolver-demos/maven-resolver-demo-snippets/src/main/java/org/apache/maven/resolver/examples/GetDependencyHierarchy.java

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,8 @@
1818
*/
1919
package org.apache.maven.resolver.examples;
2020

21+
import java.util.Arrays;
22+
2123
import org.apache.maven.resolver.examples.util.Booter;
2224
import org.eclipse.aether.RepositorySystem;
2325
import org.eclipse.aether.RepositorySystemSession.CloseableSession;
@@ -30,6 +32,7 @@
3032
import org.eclipse.aether.resolution.ArtifactDescriptorResult;
3133
import org.eclipse.aether.util.graph.manager.DependencyManagerUtils;
3234
import org.eclipse.aether.util.graph.transformer.ConflictResolver;
35+
import org.eclipse.aether.util.graph.visitor.DependencyGraphDumper;
3336

3437
/**
3538
* Visualizes the transitive dependencies of an artifact similar to m2e's dependency hierarchy view.
@@ -65,7 +68,7 @@ public static void main(String[] args) throws Exception {
6568

6669
CollectResult collectResult = system.collectDependencies(session, collectRequest);
6770

68-
collectResult.getRoot().accept(Booter.DUMPER_SOUT);
71+
collectResult.getRoot().accept(new DependencyGraphDumper(System.out::println, Arrays.asList("color")));
6972
}
7073
}
7174
}

maven-resolver-demos/maven-resolver-demo-snippets/src/main/java/org/apache/maven/resolver/examples/supplier/SupplierRepositorySystemFactory.java

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,12 +18,18 @@
1818
*/
1919
package org.apache.maven.resolver.examples.supplier;
2020

21+
import java.util.HashMap;
2122
import java.util.LinkedHashMap;
2223
import java.util.Map;
2324

2425
import org.eclipse.aether.RepositorySystem;
26+
import org.eclipse.aether.RepositorySystemSession;
27+
import org.eclipse.aether.artifact.Artifact;
2528
import org.eclipse.aether.generator.gnupg.GnupgSignatureArtifactGeneratorFactory;
2629
import org.eclipse.aether.generator.gnupg.loaders.*;
30+
import org.eclipse.aether.resolution.ArtifactDescriptorResult;
31+
import org.eclipse.aether.spi.artifact.decorator.ArtifactDecorator;
32+
import org.eclipse.aether.spi.artifact.decorator.ArtifactDecoratorFactory;
2733
import org.eclipse.aether.spi.artifact.generator.ArtifactGeneratorFactory;
2834
import org.eclipse.aether.spi.connector.transport.TransporterFactory;
2935
import org.eclipse.aether.supplier.RepositorySystemSupplier;
@@ -56,6 +62,31 @@ protected Map<String, ArtifactGeneratorFactory> createArtifactGeneratorFactories
5662
return loaders;
5763
}
5864

65+
@Override
66+
protected Map<String, ArtifactDecoratorFactory> createArtifactDecoratorFactories() {
67+
Map<String, ArtifactDecoratorFactory> result = super.createArtifactDecoratorFactories();
68+
result.put("color", new ArtifactDecoratorFactory() {
69+
@Override
70+
public ArtifactDecorator newInstance(RepositorySystemSession session) {
71+
return new ArtifactDecorator() {
72+
@Override
73+
public Artifact decorateArtifact(ArtifactDescriptorResult artifactDescriptorResult) {
74+
Map<String, String> properties = new HashMap<>(
75+
artifactDescriptorResult.getArtifact().getProperties());
76+
properties.put("color", "red");
77+
return artifactDescriptorResult.getArtifact().setProperties(properties);
78+
}
79+
};
80+
}
81+
82+
@Override
83+
public float getPriority() {
84+
return 0;
85+
}
86+
});
87+
return result;
88+
}
89+
5990
@Override
6091
protected Map<String, TransporterFactory> createTransporterFactories() {
6192
Map<String, TransporterFactory> result = super.createTransporterFactories();

maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/DefaultRepositorySystem.java

Lines changed: 27 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
import java.util.Arrays;
2727
import java.util.Collection;
2828
import java.util.List;
29+
import java.util.Map;
2930
import java.util.Objects;
3031
import java.util.concurrent.atomic.AtomicBoolean;
3132
import java.util.concurrent.atomic.AtomicInteger;
@@ -85,6 +86,8 @@
8586
import org.eclipse.aether.resolution.VersionRequest;
8687
import org.eclipse.aether.resolution.VersionResolutionException;
8788
import org.eclipse.aether.resolution.VersionResult;
89+
import org.eclipse.aether.spi.artifact.decorator.ArtifactDecorator;
90+
import org.eclipse.aether.spi.artifact.decorator.ArtifactDecoratorFactory;
8891
import org.eclipse.aether.spi.synccontext.SyncContextFactory;
8992
import org.eclipse.aether.util.ConfigUtils;
9093
import org.eclipse.aether.util.graph.visitor.FilteringDependencyVisitor;
@@ -130,6 +133,8 @@ public class DefaultRepositorySystem implements RepositorySystem {
130133

131134
private final RepositorySystemLifecycle repositorySystemLifecycle;
132135

136+
protected final Map<String, ArtifactDecoratorFactory> artifactDecoratorFactories;
137+
133138
@SuppressWarnings("checkstyle:parameternumber")
134139
@Inject
135140
public DefaultRepositorySystem(
@@ -144,7 +149,8 @@ public DefaultRepositorySystem(
144149
LocalRepositoryProvider localRepositoryProvider,
145150
SyncContextFactory syncContextFactory,
146151
RemoteRepositoryManager remoteRepositoryManager,
147-
RepositorySystemLifecycle repositorySystemLifecycle) {
152+
RepositorySystemLifecycle repositorySystemLifecycle,
153+
Map<String, ArtifactDecoratorFactory> artifactDecoratorFactories) {
148154
this.shutdown = new AtomicBoolean(false);
149155
this.sessionIdCounter = new AtomicInteger(0);
150156
this.versionResolver = requireNonNull(versionResolver, "version resolver cannot be null");
@@ -163,6 +169,8 @@ public DefaultRepositorySystem(
163169
requireNonNull(remoteRepositoryManager, "remote repository provider cannot be null");
164170
this.repositorySystemLifecycle =
165171
requireNonNull(repositorySystemLifecycle, "repository system lifecycle cannot be null");
172+
this.artifactDecoratorFactories =
173+
requireNonNull(artifactDecoratorFactories, "artifact decorator factories cannot be null");
166174
}
167175

168176
@Override
@@ -189,7 +197,24 @@ public ArtifactDescriptorResult readArtifactDescriptor(
189197
validateSession(session);
190198
requireNonNull(request, "request cannot be null");
191199

192-
return artifactDescriptorReader.readArtifactDescriptor(session, request);
200+
ArtifactDescriptorResult descriptorResult = artifactDescriptorReader.readArtifactDescriptor(session, request);
201+
for (ArtifactDecorator decorator : getArtifactDecorators(session)) {
202+
descriptorResult.setArtifact(decorator.decorateArtifact(descriptorResult));
203+
}
204+
return descriptorResult;
205+
}
206+
207+
private List<? extends ArtifactDecorator> getArtifactDecorators(RepositorySystemSession session) {
208+
PrioritizedComponents<ArtifactDecoratorFactory> factories =
209+
Utils.sortArtifactDecoratorFactories(session, artifactDecoratorFactories);
210+
List<ArtifactDecorator> decorators = new ArrayList<>();
211+
for (PrioritizedComponent<ArtifactDecoratorFactory> factory : factories.getEnabled()) {
212+
ArtifactDecorator decorator = factory.getComponent().newInstance(session);
213+
if (decorator != null) {
214+
decorators.add(decorator);
215+
}
216+
}
217+
return decorators;
193218
}
194219

195220
@Override

maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/PrioritizedComponent.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@
1818
*/
1919
package org.eclipse.aether.internal.impl;
2020

21-
final class PrioritizedComponent<T> implements Comparable<PrioritizedComponent<?>> {
21+
public final class PrioritizedComponent<T> implements Comparable<PrioritizedComponent<?>> {
2222

2323
private final T component;
2424

maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/PrioritizedComponents.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,8 +30,10 @@
3030

3131
/**
3232
* Helps to sort pluggable components by their priority.
33+
*
34+
* @param <T> The component type.
3335
*/
34-
final class PrioritizedComponents<T> {
36+
public final class PrioritizedComponents<T> {
3537
/**
3638
* Reuses or creates and stores (if session data does not contain yet) prioritized components under this key into
3739
* given session. Same session is used to configure prioritized components.

maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/Utils.java

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,13 +32,19 @@
3232
import org.eclipse.aether.repository.RemoteRepository;
3333
import org.eclipse.aether.resolution.ResolutionErrorPolicy;
3434
import org.eclipse.aether.resolution.ResolutionErrorPolicyRequest;
35+
import org.eclipse.aether.spi.artifact.decorator.ArtifactDecoratorFactory;
3536
import org.eclipse.aether.spi.artifact.generator.ArtifactGeneratorFactory;
3637
import org.eclipse.aether.transfer.RepositoryOfflineException;
3738

3839
/**
3940
* Internal utility methods.
4041
*/
41-
final class Utils {
42+
public final class Utils {
43+
44+
public static PrioritizedComponents<ArtifactDecoratorFactory> sortArtifactDecoratorFactories(
45+
RepositorySystemSession session, Map<String, ArtifactDecoratorFactory> factories) {
46+
return PrioritizedComponents.reuseOrCreate(session, factories, ArtifactDecoratorFactory::getPriority);
47+
}
4248

4349
public static PrioritizedComponents<ArtifactGeneratorFactory> sortArtifactGeneratorFactories(
4450
RepositorySystemSession session, Map<String, ArtifactGeneratorFactory> factories) {

maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/collect/DependencyCollectorDelegate.java

Lines changed: 30 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,9 @@
4545
import org.eclipse.aether.impl.RemoteRepositoryManager;
4646
import org.eclipse.aether.impl.VersionRangeResolver;
4747
import org.eclipse.aether.impl.scope.InternalScopeManager;
48+
import org.eclipse.aether.internal.impl.PrioritizedComponent;
49+
import org.eclipse.aether.internal.impl.PrioritizedComponents;
50+
import org.eclipse.aether.internal.impl.Utils;
4851
import org.eclipse.aether.repository.ArtifactRepository;
4952
import org.eclipse.aether.repository.RemoteRepository;
5053
import org.eclipse.aether.resolution.ArtifactDescriptorException;
@@ -55,6 +58,8 @@
5558
import org.eclipse.aether.resolution.VersionRangeResult;
5659
import org.eclipse.aether.scope.ResolutionScope;
5760
import org.eclipse.aether.scope.SystemDependencyScope;
61+
import org.eclipse.aether.spi.artifact.decorator.ArtifactDecorator;
62+
import org.eclipse.aether.spi.artifact.decorator.ArtifactDecoratorFactory;
5863
import org.eclipse.aether.util.ConfigUtils;
5964
import org.eclipse.aether.util.graph.transformer.TransformationContextKeys;
6065
import org.eclipse.aether.version.Version;
@@ -101,14 +106,19 @@ public abstract class DependencyCollectorDelegate implements DependencyCollector
101106

102107
protected final VersionRangeResolver versionRangeResolver;
103108

109+
protected final Map<String, ArtifactDecoratorFactory> artifactDecoratorFactories;
110+
104111
protected DependencyCollectorDelegate(
105112
RemoteRepositoryManager remoteRepositoryManager,
106113
ArtifactDescriptorReader artifactDescriptorReader,
107-
VersionRangeResolver versionRangeResolver) {
114+
VersionRangeResolver versionRangeResolver,
115+
Map<String, ArtifactDecoratorFactory> artifactDecoratorFactories) {
108116
this.remoteRepositoryManager =
109117
requireNonNull(remoteRepositoryManager, "remote repository manager cannot be null");
110118
this.descriptorReader = requireNonNull(artifactDescriptorReader, "artifact descriptor reader cannot be null");
111119
this.versionRangeResolver = requireNonNull(versionRangeResolver, "version range resolver cannot be null");
120+
this.artifactDecoratorFactories =
121+
requireNonNull(artifactDecoratorFactories, "artifact decorator factories cannot be null");
112122
}
113123

114124
@SuppressWarnings("checkstyle:methodlength")
@@ -165,6 +175,9 @@ public final CollectResult collectDependencies(RepositorySystemSession session,
165175
descriptorResult = new ArtifactDescriptorResult(descriptorRequest);
166176
} else {
167177
descriptorResult = descriptorReader.readArtifactDescriptor(session, descriptorRequest);
178+
for (ArtifactDecorator decorator : getArtifactDecorators(session)) {
179+
descriptorResult.setArtifact(decorator.decorateArtifact(descriptorResult));
180+
}
168181
}
169182
} catch (ArtifactDescriptorException e) {
170183
result.addException(e);
@@ -470,6 +483,9 @@ protected ArtifactDescriptorResult resolveCachedArtifactDescriptor(
470483
if (descriptorResult == null) {
471484
try {
472485
descriptorResult = descriptorReader.readArtifactDescriptor(session, descriptorRequest);
486+
for (ArtifactDecorator decorator : getArtifactDecorators(session)) {
487+
descriptorResult.setArtifact(decorator.decorateArtifact(descriptorResult));
488+
}
473489
pool.putDescriptor(key, descriptorResult);
474490
} catch (ArtifactDescriptorException e) {
475491
results.addException(d, e, nodes);
@@ -482,6 +498,19 @@ protected ArtifactDescriptorResult resolveCachedArtifactDescriptor(
482498
return descriptorResult;
483499
}
484500

501+
private List<? extends ArtifactDecorator> getArtifactDecorators(RepositorySystemSession session) {
502+
PrioritizedComponents<ArtifactDecoratorFactory> factories =
503+
Utils.sortArtifactDecoratorFactories(session, artifactDecoratorFactories);
504+
List<ArtifactDecorator> decorators = new ArrayList<>();
505+
for (PrioritizedComponent<ArtifactDecoratorFactory> factory : factories.getEnabled()) {
506+
ArtifactDecorator decorator = factory.getComponent().newInstance(session);
507+
if (decorator != null) {
508+
decorators.add(decorator);
509+
}
510+
}
511+
return decorators;
512+
}
513+
485514
/**
486515
* Helper class used during collection.
487516
*/

maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/collect/bf/BfDependencyCollector.java

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,7 @@
7171
import org.eclipse.aether.resolution.ArtifactDescriptorResult;
7272
import org.eclipse.aether.resolution.VersionRangeRequest;
7373
import org.eclipse.aether.resolution.VersionRangeResult;
74+
import org.eclipse.aether.spi.artifact.decorator.ArtifactDecoratorFactory;
7475
import org.eclipse.aether.util.ConfigUtils;
7576
import org.eclipse.aether.util.artifact.ArtifactIdUtils;
7677
import org.eclipse.aether.util.concurrency.ExecutorUtils;
@@ -130,8 +131,9 @@ public class BfDependencyCollector extends DependencyCollectorDelegate {
130131
public BfDependencyCollector(
131132
RemoteRepositoryManager remoteRepositoryManager,
132133
ArtifactDescriptorReader artifactDescriptorReader,
133-
VersionRangeResolver versionRangeResolver) {
134-
super(remoteRepositoryManager, artifactDescriptorReader, versionRangeResolver);
134+
VersionRangeResolver versionRangeResolver,
135+
Map<String, ArtifactDecoratorFactory> artifactDecoratorFactories) {
136+
super(remoteRepositoryManager, artifactDescriptorReader, versionRangeResolver, artifactDecoratorFactories);
135137
}
136138

137139
@SuppressWarnings("checkstyle:parameternumber")

maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/collect/df/DfDependencyCollector.java

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424

2525
import java.util.Collections;
2626
import java.util.List;
27+
import java.util.Map;
2728
import java.util.concurrent.atomic.AtomicReference;
2829

2930
import org.eclipse.aether.RepositorySystemSession;
@@ -53,6 +54,7 @@
5354
import org.eclipse.aether.resolution.VersionRangeRequest;
5455
import org.eclipse.aether.resolution.VersionRangeResolutionException;
5556
import org.eclipse.aether.resolution.VersionRangeResult;
57+
import org.eclipse.aether.spi.artifact.decorator.ArtifactDecoratorFactory;
5658
import org.eclipse.aether.util.ConfigUtils;
5759
import org.eclipse.aether.util.graph.manager.DependencyManagerUtils;
5860
import org.eclipse.aether.version.Version;
@@ -72,8 +74,9 @@ public class DfDependencyCollector extends DependencyCollectorDelegate {
7274
public DfDependencyCollector(
7375
RemoteRepositoryManager remoteRepositoryManager,
7476
ArtifactDescriptorReader artifactDescriptorReader,
75-
VersionRangeResolver versionRangeResolver) {
76-
super(remoteRepositoryManager, artifactDescriptorReader, versionRangeResolver);
77+
VersionRangeResolver versionRangeResolver,
78+
Map<String, ArtifactDecoratorFactory> artifactDecoratorFactories) {
79+
super(remoteRepositoryManager, artifactDescriptorReader, versionRangeResolver, artifactDecoratorFactories);
7780
}
7881

7982
@SuppressWarnings("checkstyle:parameternumber")

maven-resolver-impl/src/test/java/org/eclipse/aether/internal/impl/DefaultRepositorySystemTest.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
package org.eclipse.aether.internal.impl;
2020

2121
import java.util.Arrays;
22+
import java.util.Collections;
2223
import java.util.List;
2324

2425
import org.eclipse.aether.DefaultRepositorySystemSession;
@@ -64,7 +65,8 @@ void init() {
6465
new StubSyncContextFactory(),
6566
new DefaultRemoteRepositoryManager(
6667
new DefaultUpdatePolicyAnalyzer(), new DefaultChecksumPolicyProvider()),
67-
new DefaultRepositorySystemLifecycle());
68+
new DefaultRepositorySystemLifecycle(),
69+
Collections.emptyMap());
6870
session = TestUtils.newSession();
6971
}
7072

0 commit comments

Comments
 (0)