Skip to content

Commit f9dd9ea

Browse files
committed
[MNG-8232] Introduce ModelTransformer
# Conflicts: # api/maven-api-spi/src/main/resources/META-INF/maven/org.apache.maven.api.di.Inject
1 parent c166bd1 commit f9dd9ea

File tree

8 files changed

+150
-4
lines changed

8 files changed

+150
-4
lines changed

api/maven-api-core/src/main/java/org/apache/maven/api/services/ModelTransformerException.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,10 +18,14 @@
1818
*/
1919
package org.apache.maven.api.services;
2020

21+
import org.apache.maven.api.annotations.Experimental;
22+
2123
/**
24+
* Exception thrown when a {@link ModelTransformer} fails.
2225
*
2326
* @since 4.0.0
2427
*/
28+
@Experimental
2529
public class ModelTransformerException extends MavenException {
2630

2731
public ModelTransformerException(Exception e) {
Lines changed: 78 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,78 @@
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.apache.maven.api.spi;
20+
21+
import org.apache.maven.api.annotations.Experimental;
22+
import org.apache.maven.api.annotations.Nonnull;
23+
import org.apache.maven.api.model.Model;
24+
import org.apache.maven.api.services.ModelTransformerException;
25+
26+
/**
27+
* Marker interface for model transformers.
28+
*
29+
* @since 4.0.0
30+
*/
31+
@Experimental
32+
public interface ModelTransformer extends SpiService {
33+
34+
/**
35+
* Apply a transformation on the file model.
36+
*
37+
* This method will be called on each file model being loaded,
38+
* just before validation.
39+
*
40+
* @param model the input model
41+
* @return the transformed model, or the input model if no transformation is needed
42+
* @throws ModelTransformerException
43+
*/
44+
@Nonnull
45+
default Model transformFileModel(@Nonnull Model model) throws ModelTransformerException {
46+
return model;
47+
}
48+
49+
/**
50+
* Apply a transformation on the raw models.
51+
*
52+
* This method will be called on each raw model being loaded,
53+
* just before validation.
54+
*
55+
* @param model the input model
56+
* @return the transformed model, or the input model if no transformation is needed
57+
* @throws ModelTransformerException
58+
*/
59+
@Nonnull
60+
default Model transformRawModel(@Nonnull Model model) throws ModelTransformerException {
61+
return model;
62+
}
63+
64+
/**
65+
* Apply a transformation on the effective models.
66+
*
67+
* This method will be called on each effective model being loaded,
68+
* just before validation.
69+
*
70+
* @param model the input model
71+
* @return the transformed model, or the input model if no transformation is needed
72+
* @throws ModelTransformerException
73+
*/
74+
@Nonnull
75+
default Model transformEffectiveModel(@Nonnull Model model) throws ModelTransformerException {
76+
return model;
77+
}
78+
}
Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
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.apache.maven.api.spi;
20+
21+
import org.apache.maven.api.annotations.Experimental;
22+
import org.apache.maven.api.services.MavenException;
23+
24+
@Experimental
25+
public class ModelTransformerException extends MavenException {
26+
27+
public ModelTransformerException() {
28+
this(null, null);
29+
}
30+
31+
public ModelTransformerException(String message) {
32+
this(message, null);
33+
}
34+
35+
public ModelTransformerException(Throwable cause) {
36+
this(null, cause);
37+
}
38+
39+
public ModelTransformerException(String message, Throwable cause) {
40+
super(message, cause);
41+
}
42+
}

maven-api-impl/src/main/java/org/apache/maven/internal/impl/model/DefaultModelBuilder.java

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -144,6 +144,7 @@ public class DefaultModelBuilder implements ModelBuilder {
144144
private final ProfileActivationFilePathInterpolator profileActivationFilePathInterpolator;
145145
private final ModelTransformer transformer;
146146
private final ModelVersionParser versionParser;
147+
private final List<org.apache.maven.api.spi.ModelTransformer> transformers;
147148

148149
@SuppressWarnings("checkstyle:ParameterNumber")
149150
@Inject
@@ -165,7 +166,8 @@ public DefaultModelBuilder(
165166
PluginConfigurationExpander pluginConfigurationExpander,
166167
ProfileActivationFilePathInterpolator profileActivationFilePathInterpolator,
167168
ModelTransformer transformer,
168-
ModelVersionParser versionParser) {
169+
ModelVersionParser versionParser,
170+
List<org.apache.maven.api.spi.ModelTransformer> transformers) {
169171
this.modelProcessor = modelProcessor;
170172
this.modelValidator = modelValidator;
171173
this.modelNormalizer = modelNormalizer;
@@ -184,6 +186,7 @@ public DefaultModelBuilder(
184186
this.profileActivationFilePathInterpolator = profileActivationFilePathInterpolator;
185187
this.transformer = transformer;
186188
this.versionParser = versionParser;
189+
this.transformers = transformers;
187190
}
188191

189192
@Override
@@ -588,6 +591,10 @@ private ModelBuilderResult build(
588591
resultModel = pluginConfigurationExpander.expandPluginConfiguration(resultModel, request, problems);
589592
}
590593

594+
for (var transformer : transformers) {
595+
resultModel = transformer.transformEffectiveModel(resultModel);
596+
}
597+
591598
result.setEffectiveModel(resultModel);
592599

593600
// effective model validation
@@ -767,6 +774,10 @@ private Model doReadFileModel(
767774
}
768775
}
769776

777+
for (var transformer : transformers) {
778+
model = transformer.transformFileModel(model);
779+
}
780+
770781
problems.setSource(model);
771782
modelValidator.validateFileModel(model, request, problems);
772783
if (hasFatalErrors(problems)) {
@@ -809,6 +820,10 @@ private ModelData doReadRawModel(
809820
rawModel = rawModel.withModelVersion(namespace.substring(NAMESPACE_PREFIX.length()));
810821
}
811822

823+
for (var transformer : transformers) {
824+
rawModel = transformer.transformRawModel(rawModel);
825+
}
826+
812827
modelValidator.validateRawModel(rawModel, request, problems);
813828

814829
if (hasFatalErrors(problems)) {

maven-api-impl/src/test/java/org/apache/maven/internal/impl/standalone/RepositorySystemSupplier.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1059,7 +1059,8 @@ protected ModelBuilder createModelBuilder() {
10591059
new DefaultPluginConfigurationExpander(),
10601060
new ProfileActivationFilePathInterpolator(new DefaultPathTranslator(), new DefaultRootLocator()),
10611061
new BuildModelTransformer(),
1062-
new DefaultModelVersionParser(getVersionScheme()));
1062+
new DefaultModelVersionParser(getVersionScheme()),
1063+
List.of());
10631064
}
10641065

10651066
private RepositorySystem repositorySystem;

maven-core/src/main/java/org/apache/maven/internal/transformation/impl/DefaultConsumerPomBuilder.java

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -138,6 +138,9 @@ class DefaultConsumerPomBuilder implements ConsumerPomBuilder {
138138
@Inject
139139
private ProfileActivationFilePathInterpolator profileActivationFilePathInterpolator;
140140

141+
@Inject
142+
private List<org.apache.maven.api.spi.ModelTransformer> transformers;
143+
141144
Logger logger = LoggerFactory.getLogger(getClass());
142145

143146
@Override
@@ -193,7 +196,8 @@ public List<Profile> getActiveProfiles(
193196
pluginConfigurationExpander,
194197
profileActivationFilePathInterpolator,
195198
modelTransformer,
196-
versionParser);
199+
versionParser,
200+
transformers);
197201
InternalSession iSession = InternalSession.from(session);
198202
ModelBuilderRequest.ModelBuilderRequestBuilder request = ModelBuilderRequest.builder();
199203
request.projectBuild(true);

maven-core/src/main/resources/META-INF/maven/org.apache.maven.api.di.Inject

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ org.apache.maven.api.services.model.ProfileActivator
22
org.apache.maven.api.spi.LanguageProvider
33
org.apache.maven.api.spi.LifecycleProvider
44
org.apache.maven.api.spi.ModelParser
5+
org.apache.maven.api.spi.ModelTransformer
56
org.apache.maven.api.spi.PackagingProvider
67
org.apache.maven.internal.aether.DefaultRepositorySystemSessionFactory
78
org.apache.maven.internal.aether.LegacyRepositorySystemSessionExtender

maven-resolver-provider/src/main/java/org/apache/maven/repository/internal/MavenRepositorySystemSupplier.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1061,7 +1061,8 @@ protected ModelBuilder createModelBuilder() {
10611061
new DefaultPluginConfigurationExpander(),
10621062
new ProfileActivationFilePathInterpolator(new DefaultPathTranslator(), new DefaultRootLocator()),
10631063
new BuildModelTransformer(),
1064-
new DefaultModelVersionParser(getVersionScheme()));
1064+
new DefaultModelVersionParser(getVersionScheme()),
1065+
List.of());
10651066
}
10661067

10671068
private RepositorySystem repositorySystem;

0 commit comments

Comments
 (0)