Skip to content

Commit 6f70e52

Browse files
authored
[MRESOLVER-644] Artifact Transformer SPI (#605)
A SPI for artifact install/deploy request transformation. --- https://issues.apache.org/jira/browse/MRESOLVER-644
1 parent 9711a38 commit 6f70e52

File tree

7 files changed

+106
-0
lines changed

7 files changed

+106
-0
lines changed

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

+8
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,7 @@
6060
import org.eclipse.aether.repository.RepositoryPolicy;
6161
import org.eclipse.aether.spi.artifact.generator.ArtifactGenerator;
6262
import org.eclipse.aether.spi.artifact.generator.ArtifactGeneratorFactory;
63+
import org.eclipse.aether.spi.artifact.transformer.ArtifactTransformer;
6364
import org.eclipse.aether.spi.connector.ArtifactUpload;
6465
import org.eclipse.aether.spi.connector.MetadataDownload;
6566
import org.eclipse.aether.spi.connector.MetadataUpload;
@@ -99,6 +100,8 @@ public class DefaultDeployer implements Deployer {
99100

100101
private final Map<String, MetadataGeneratorFactory> metadataFactories;
101102

103+
private final Map<String, ArtifactTransformer> artifactTransformers;
104+
102105
private final SyncContextFactory syncContextFactory;
103106

104107
private final OfflineController offlineController;
@@ -113,6 +116,7 @@ public DefaultDeployer(
113116
UpdateCheckManager updateCheckManager,
114117
Map<String, ArtifactGeneratorFactory> artifactFactories,
115118
Map<String, MetadataGeneratorFactory> metadataFactories,
119+
Map<String, ArtifactTransformer> artifactTransformers,
116120
SyncContextFactory syncContextFactory,
117121
OfflineController offlineController) {
118122
this.pathProcessor = requireNonNull(pathProcessor, "path processor cannot be null");
@@ -125,6 +129,7 @@ public DefaultDeployer(
125129
this.updateCheckManager = requireNonNull(updateCheckManager, "update check manager cannot be null");
126130
this.artifactFactories = Collections.unmodifiableMap(artifactFactories);
127131
this.metadataFactories = Collections.unmodifiableMap(metadataFactories);
132+
this.artifactTransformers = Collections.unmodifiableMap(artifactTransformers);
128133
this.syncContextFactory = requireNonNull(syncContextFactory, "sync context factory cannot be null");
129134
this.offlineController = requireNonNull(offlineController, "offline controller cannot be null");
130135
}
@@ -142,6 +147,9 @@ public DeployResult deploy(RepositorySystemSession session, DeployRequest reques
142147
e);
143148
}
144149

150+
for (ArtifactTransformer transformer : artifactTransformers.values()) {
151+
request = transformer.transformDeployArtifacts(session, request);
152+
}
145153
try (SyncContext syncContext = syncContextFactory.newInstance(session, true)) {
146154
return deploy(syncContext, session, request);
147155
}

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

+8
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,7 @@
5252
import org.eclipse.aether.repository.LocalRepositoryManager;
5353
import org.eclipse.aether.spi.artifact.generator.ArtifactGenerator;
5454
import org.eclipse.aether.spi.artifact.generator.ArtifactGeneratorFactory;
55+
import org.eclipse.aether.spi.artifact.transformer.ArtifactTransformer;
5556
import org.eclipse.aether.spi.io.PathProcessor;
5657
import org.eclipse.aether.spi.synccontext.SyncContextFactory;
5758
import org.slf4j.Logger;
@@ -74,6 +75,8 @@ public class DefaultInstaller implements Installer {
7475

7576
private final Map<String, MetadataGeneratorFactory> metadataFactories;
7677

78+
private final Map<String, ArtifactTransformer> artifactTransformers;
79+
7780
private final SyncContextFactory syncContextFactory;
7881

7982
@Inject
@@ -82,19 +85,24 @@ public DefaultInstaller(
8285
RepositoryEventDispatcher repositoryEventDispatcher,
8386
Map<String, ArtifactGeneratorFactory> artifactFactories,
8487
Map<String, MetadataGeneratorFactory> metadataFactories,
88+
Map<String, ArtifactTransformer> artifactTransformers,
8589
SyncContextFactory syncContextFactory) {
8690
this.pathProcessor = requireNonNull(pathProcessor, "path processor cannot be null");
8791
this.repositoryEventDispatcher =
8892
requireNonNull(repositoryEventDispatcher, "repository event dispatcher cannot be null");
8993
this.artifactFactories = Collections.unmodifiableMap(artifactFactories);
9094
this.metadataFactories = Collections.unmodifiableMap(metadataFactories);
95+
this.artifactTransformers = Collections.unmodifiableMap(artifactTransformers);
9196
this.syncContextFactory = requireNonNull(syncContextFactory, "sync context factory cannot be null");
9297
}
9398

9499
@Override
95100
public InstallResult install(RepositorySystemSession session, InstallRequest request) throws InstallationException {
96101
requireNonNull(session, "session cannot be null");
97102
requireNonNull(request, "request cannot be null");
103+
for (ArtifactTransformer transformer : artifactTransformers.values()) {
104+
request = transformer.transformInstallArtifacts(session, request);
105+
}
98106
try (SyncContext syncContext = syncContextFactory.newInstance(session, false)) {
99107
return install(syncContext, session, request);
100108
}

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

+1
Original file line numberDiff line numberDiff line change
@@ -92,6 +92,7 @@ void setup() throws IOException {
9292
new StaticUpdateCheckManager(true),
9393
Collections.emptyMap(),
9494
Collections.emptyMap(),
95+
Collections.emptyMap(),
9596
new StubSyncContextFactory(),
9697
new DefaultOfflineController());
9798

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

+2
Original file line numberDiff line numberDiff line change
@@ -88,6 +88,7 @@ void setup() throws IOException {
8888
new StubRepositoryEventDispatcher(),
8989
Collections.emptyMap(),
9090
Collections.emptyMap(),
91+
Collections.emptyMap(),
9192
new StubSyncContextFactory());
9293
request = new InstallRequest();
9394
listener = new RecordingRepositoryListener();
@@ -339,6 +340,7 @@ public long copy(Path src, Path target, ProgressListener listener) throws IOExce
339340
new StubRepositoryEventDispatcher(),
340341
Collections.emptyMap(),
341342
Collections.emptyMap(),
343+
Collections.emptyMap(),
342344
new StubSyncContextFactory());
343345

344346
request = new InstallRequest();
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
/*
2+
* Licensed to the Apache Software Foundation (ASF) under one
3+
* or more contributor license agreements. See the NOTICE file
4+
* distributed with this work for additional information
5+
* regarding copyright ownership. The ASF licenses this file
6+
* to you under the Apache License, Version 2.0 (the
7+
* "License"); you may not use this file except in compliance
8+
* with the License. You may obtain a copy of the License at
9+
*
10+
* http://www.apache.org/licenses/LICENSE-2.0
11+
*
12+
* Unless required by applicable law or agreed to in writing,
13+
* software distributed under the License is distributed on an
14+
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
15+
* KIND, either express or implied. See the License for the
16+
* specific language governing permissions and limitations
17+
* under the License.
18+
*/
19+
package org.eclipse.aether.spi.artifact.transformer;
20+
21+
import org.eclipse.aether.RepositorySystemSession;
22+
import org.eclipse.aether.deployment.DeployRequest;
23+
import org.eclipse.aether.installation.InstallRequest;
24+
25+
/**
26+
* Install and deploy artifact transformer. This component can mangle install and deploy requests, replace artifacts,
27+
* add new artifacts and so on.
28+
*
29+
* @since 2.0.5
30+
*/
31+
public interface ArtifactTransformer {
32+
/**
33+
* Transform install artifacts.
34+
*
35+
* @param session never {@code null}
36+
* @param request never {@code null}
37+
* @return the transformed request, never {@code null}
38+
*/
39+
default InstallRequest transformInstallArtifacts(RepositorySystemSession session, InstallRequest request) {
40+
return request;
41+
}
42+
43+
/**
44+
* Transform deploy artifacts.
45+
*
46+
* @param session never {@code null}
47+
* @param request never {@code null}
48+
* @return the transformed request, never {@code null}
49+
*/
50+
default DeployRequest transformDeployArtifacts(RepositorySystemSession session, DeployRequest request) {
51+
return request;
52+
}
53+
}

maven-resolver-supplier-mvn3/src/main/java/org/eclipse/aether/supplier/RepositorySystemSupplier.java

+17
Original file line numberDiff line numberDiff line change
@@ -114,6 +114,7 @@
114114
import org.eclipse.aether.spi.artifact.ArtifactPredicateFactory;
115115
import org.eclipse.aether.spi.artifact.decorator.ArtifactDecoratorFactory;
116116
import org.eclipse.aether.spi.artifact.generator.ArtifactGeneratorFactory;
117+
import org.eclipse.aether.spi.artifact.transformer.ArtifactTransformer;
117118
import org.eclipse.aether.spi.checksums.ProvidedChecksumsSource;
118119
import org.eclipse.aether.spi.checksums.TrustedChecksumsSource;
119120
import org.eclipse.aether.spi.connector.RepositoryConnectorFactory;
@@ -728,6 +729,7 @@ protected Installer createInstaller() {
728729
getRepositoryEventDispatcher(),
729730
getArtifactGeneratorFactories(),
730731
getMetadataGeneratorFactories(),
732+
getArtifactTransformers(),
731733
getSyncContextFactory());
732734
}
733735

@@ -750,6 +752,7 @@ protected Deployer createDeployer() {
750752
getUpdateCheckManager(),
751753
getArtifactGeneratorFactories(),
752754
getMetadataGeneratorFactories(),
755+
getArtifactTransformers(),
753756
getSyncContextFactory(),
754757
getOfflineController());
755758
}
@@ -911,6 +914,20 @@ protected Map<String, ArtifactDecoratorFactory> createArtifactDecoratorFactories
911914

912915
// Maven provided
913916

917+
private Map<String, ArtifactTransformer> artifactTransformers;
918+
919+
public final Map<String, ArtifactTransformer> getArtifactTransformers() {
920+
checkClosed();
921+
if (artifactTransformers == null) {
922+
artifactTransformers = createArtifactTransformers();
923+
}
924+
return artifactTransformers;
925+
}
926+
927+
protected Map<String, ArtifactTransformer> createArtifactTransformers() {
928+
return new HashMap<>();
929+
}
930+
914931
private Map<String, MetadataGeneratorFactory> metadataGeneratorFactories;
915932

916933
public final Map<String, MetadataGeneratorFactory> getMetadataGeneratorFactories() {

maven-resolver-supplier-mvn4/src/main/java/org/eclipse/aether/supplier/RepositorySystemSupplier.java

+17
Original file line numberDiff line numberDiff line change
@@ -118,6 +118,7 @@
118118
import org.eclipse.aether.spi.artifact.ArtifactPredicateFactory;
119119
import org.eclipse.aether.spi.artifact.decorator.ArtifactDecoratorFactory;
120120
import org.eclipse.aether.spi.artifact.generator.ArtifactGeneratorFactory;
121+
import org.eclipse.aether.spi.artifact.transformer.ArtifactTransformer;
121122
import org.eclipse.aether.spi.checksums.ProvidedChecksumsSource;
122123
import org.eclipse.aether.spi.checksums.TrustedChecksumsSource;
123124
import org.eclipse.aether.spi.connector.RepositoryConnectorFactory;
@@ -732,6 +733,7 @@ protected Installer createInstaller() {
732733
getRepositoryEventDispatcher(),
733734
getArtifactGeneratorFactories(),
734735
getMetadataGeneratorFactories(),
736+
getArtifactTransformers(),
735737
getSyncContextFactory());
736738
}
737739

@@ -754,6 +756,7 @@ protected Deployer createDeployer() {
754756
getUpdateCheckManager(),
755757
getArtifactGeneratorFactories(),
756758
getMetadataGeneratorFactories(),
759+
getArtifactTransformers(),
757760
getSyncContextFactory(),
758761
getOfflineController());
759762
}
@@ -915,6 +918,20 @@ protected Map<String, ArtifactDecoratorFactory> createArtifactDecoratorFactories
915918

916919
// Maven provided
917920

921+
private Map<String, ArtifactTransformer> artifactTransformers;
922+
923+
public final Map<String, ArtifactTransformer> getArtifactTransformers() {
924+
checkClosed();
925+
if (artifactTransformers == null) {
926+
artifactTransformers = createArtifactTransformers();
927+
}
928+
return artifactTransformers;
929+
}
930+
931+
protected Map<String, ArtifactTransformer> createArtifactTransformers() {
932+
return new HashMap<>();
933+
}
934+
918935
private Map<String, MetadataGeneratorFactory> metadataGeneratorFactories;
919936

920937
public final Map<String, MetadataGeneratorFactory> getMetadataGeneratorFactories() {

0 commit comments

Comments
 (0)