This is an automated email from the ASF dual-hosted git repository.
gnodet pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/maven.git
The following commit(s) were added to refs/heads/master by this push:
new 625b4561f0 [MNG-8232] Introduce ModelTransformer (#1702)
625b4561f0 is described below
commit 625b4561f042437efbab7e4a371bfd5535e8ce9c
Author: Guillaume Nodet <[email protected]>
AuthorDate: Thu Sep 12 08:15:53 2024 +0200
[MNG-8232] Introduce ModelTransformer (#1702)
---
.../api/services/ModelTransformerException.java | 4 ++
.../org/apache/maven/api/spi/ModelTransformer.java | 82 ++++++++++++++++++++++
.../maven/api/spi}/ModelTransformerException.java | 26 ++++---
.../internal/impl/model/DefaultModelBuilder.java | 17 ++++-
.../impl/standalone/RepositorySystemSupplier.java | 3 +-
.../impl/DefaultConsumerPomBuilder.java | 6 +-
.../internal/MavenRepositorySystemSupplier.java | 3 +-
7 files changed, 128 insertions(+), 13 deletions(-)
diff --git
a/api/maven-api-core/src/main/java/org/apache/maven/api/services/ModelTransformerException.java
b/api/maven-api-core/src/main/java/org/apache/maven/api/services/ModelTransformerException.java
index bf866c29a9..c68456beb4 100644
---
a/api/maven-api-core/src/main/java/org/apache/maven/api/services/ModelTransformerException.java
+++
b/api/maven-api-core/src/main/java/org/apache/maven/api/services/ModelTransformerException.java
@@ -18,10 +18,14 @@
*/
package org.apache.maven.api.services;
+import org.apache.maven.api.annotations.Experimental;
+
/**
+ * Exception thrown when a {@link ModelTransformer} fails.
*
* @since 4.0.0
*/
+@Experimental
public class ModelTransformerException extends MavenException {
public ModelTransformerException(Exception e) {
diff --git
a/api/maven-api-spi/src/main/java/org/apache/maven/api/spi/ModelTransformer.java
b/api/maven-api-spi/src/main/java/org/apache/maven/api/spi/ModelTransformer.java
new file mode 100644
index 0000000000..d37982993f
--- /dev/null
+++
b/api/maven-api-spi/src/main/java/org/apache/maven/api/spi/ModelTransformer.java
@@ -0,0 +1,82 @@
+/*
+ * 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.
+ */
+package org.apache.maven.api.spi;
+
+import org.apache.maven.api.annotations.Consumer;
+import org.apache.maven.api.annotations.Experimental;
+import org.apache.maven.api.annotations.Nonnull;
+import org.apache.maven.api.di.Named;
+import org.apache.maven.api.model.Model;
+import org.apache.maven.api.services.ModelTransformerException;
+
+/**
+ * Marker interface for model transformers.
+ *
+ * @since 4.0.0
+ */
+@Experimental
+@Consumer
+@Named
+public interface ModelTransformer extends SpiService {
+
+ /**
+ * Apply a transformation on the file model.
+ *
+ * This method will be called on each file model being loaded,
+ * just before validation.
+ *
+ * @param model the input model
+ * @return the transformed model, or the input model if no transformation
is needed
+ * @throws ModelTransformerException
+ */
+ @Nonnull
+ default Model transformFileModel(@Nonnull Model model) throws
ModelTransformerException {
+ return model;
+ }
+
+ /**
+ * Apply a transformation on the raw models.
+ *
+ * This method will be called on each raw model being loaded,
+ * just before validation.
+ *
+ * @param model the input model
+ * @return the transformed model, or the input model if no transformation
is needed
+ * @throws ModelTransformerException
+ */
+ @Nonnull
+ default Model transformRawModel(@Nonnull Model model) throws
ModelTransformerException {
+ return model;
+ }
+
+ /**
+ * Apply a transformation on the effective models.
+ *
+ * This method will be called on each effective model being loaded,
+ * just before validation.
+ *
+ * @param model the input model
+ * @return the transformed model, or the input model if no transformation
is needed
+ * @throws ModelTransformerException
+ */
+ @Nonnull
+ default Model transformEffectiveModel(@Nonnull Model model) throws
ModelTransformerException {
+ return model;
+ }
+}
diff --git
a/api/maven-api-core/src/main/java/org/apache/maven/api/services/ModelTransformerException.java
b/api/maven-api-spi/src/main/java/org/apache/maven/api/spi/ModelTransformerException.java
similarity index 63%
copy from
api/maven-api-core/src/main/java/org/apache/maven/api/services/ModelTransformerException.java
copy to
api/maven-api-spi/src/main/java/org/apache/maven/api/spi/ModelTransformerException.java
index bf866c29a9..d2f8443826 100644
---
a/api/maven-api-core/src/main/java/org/apache/maven/api/services/ModelTransformerException.java
+++
b/api/maven-api-spi/src/main/java/org/apache/maven/api/spi/ModelTransformerException.java
@@ -16,19 +16,27 @@
* specific language governing permissions and limitations
* under the License.
*/
-package org.apache.maven.api.services;
+package org.apache.maven.api.spi;
-/**
- *
- * @since 4.0.0
- */
+import org.apache.maven.api.annotations.Experimental;
+import org.apache.maven.api.services.MavenException;
+
+@Experimental
public class ModelTransformerException extends MavenException {
- public ModelTransformerException(Exception e) {
- super(e);
+ public ModelTransformerException() {
+ this(null, null);
+ }
+
+ public ModelTransformerException(String message) {
+ this(message, null);
+ }
+
+ public ModelTransformerException(Throwable cause) {
+ this(null, cause);
}
- public ModelTransformerException(String message, Throwable exception) {
- super(message, exception);
+ public ModelTransformerException(String message, Throwable cause) {
+ super(message, cause);
}
}
diff --git
a/maven-api-impl/src/main/java/org/apache/maven/internal/impl/model/DefaultModelBuilder.java
b/maven-api-impl/src/main/java/org/apache/maven/internal/impl/model/DefaultModelBuilder.java
index d341c75523..a0a563167f 100644
---
a/maven-api-impl/src/main/java/org/apache/maven/internal/impl/model/DefaultModelBuilder.java
+++
b/maven-api-impl/src/main/java/org/apache/maven/internal/impl/model/DefaultModelBuilder.java
@@ -145,6 +145,7 @@ public class DefaultModelBuilder implements ModelBuilder {
private final ProfileActivationFilePathInterpolator
profileActivationFilePathInterpolator;
private final ModelTransformer transformer;
private final ModelVersionParser versionParser;
+ private final List<org.apache.maven.api.spi.ModelTransformer> transformers;
@SuppressWarnings("checkstyle:ParameterNumber")
@Inject
@@ -166,7 +167,8 @@ public class DefaultModelBuilder implements ModelBuilder {
PluginConfigurationExpander pluginConfigurationExpander,
ProfileActivationFilePathInterpolator
profileActivationFilePathInterpolator,
ModelTransformer transformer,
- ModelVersionParser versionParser) {
+ ModelVersionParser versionParser,
+ List<org.apache.maven.api.spi.ModelTransformer> transformers) {
this.modelProcessor = modelProcessor;
this.modelValidator = modelValidator;
this.modelNormalizer = modelNormalizer;
@@ -185,6 +187,7 @@ public class DefaultModelBuilder implements ModelBuilder {
this.profileActivationFilePathInterpolator =
profileActivationFilePathInterpolator;
this.transformer = transformer;
this.versionParser = versionParser;
+ this.transformers = transformers;
}
@Override
@@ -590,6 +593,10 @@ public class DefaultModelBuilder implements ModelBuilder {
resultModel =
pluginConfigurationExpander.expandPluginConfiguration(resultModel, request,
problems);
}
+ for (var transformer : transformers) {
+ resultModel = transformer.transformEffectiveModel(resultModel);
+ }
+
result.setEffectiveModel(resultModel);
// effective model validation
@@ -803,6 +810,10 @@ public class DefaultModelBuilder implements ModelBuilder {
}
}
+ for (var transformer : transformers) {
+ model = transformer.transformFileModel(model);
+ }
+
problems.setSource(model);
modelValidator.validateFileModel(model, request, problems);
if (hasFatalErrors(problems)) {
@@ -845,6 +856,10 @@ public class DefaultModelBuilder implements ModelBuilder {
rawModel =
rawModel.withModelVersion(namespace.substring(NAMESPACE_PREFIX.length()));
}
+ for (var transformer : transformers) {
+ rawModel = transformer.transformRawModel(rawModel);
+ }
+
modelValidator.validateRawModel(rawModel, request, problems);
if (hasFatalErrors(problems)) {
diff --git
a/maven-api-impl/src/test/java/org/apache/maven/internal/impl/standalone/RepositorySystemSupplier.java
b/maven-api-impl/src/test/java/org/apache/maven/internal/impl/standalone/RepositorySystemSupplier.java
index e49924faeb..5115153bef 100644
---
a/maven-api-impl/src/test/java/org/apache/maven/internal/impl/standalone/RepositorySystemSupplier.java
+++
b/maven-api-impl/src/test/java/org/apache/maven/internal/impl/standalone/RepositorySystemSupplier.java
@@ -1059,7 +1059,8 @@ public class RepositorySystemSupplier implements
Supplier<RepositorySystem> {
new DefaultPluginConfigurationExpander(),
new ProfileActivationFilePathInterpolator(new
DefaultPathTranslator(), new DefaultRootLocator()),
new BuildModelTransformer(),
- new DefaultModelVersionParser(getVersionScheme()));
+ new DefaultModelVersionParser(getVersionScheme()),
+ List.of());
}
private RepositorySystem repositorySystem;
diff --git
a/maven-core/src/main/java/org/apache/maven/internal/transformation/impl/DefaultConsumerPomBuilder.java
b/maven-core/src/main/java/org/apache/maven/internal/transformation/impl/DefaultConsumerPomBuilder.java
index 8fee91057c..ad434baf8b 100644
---
a/maven-core/src/main/java/org/apache/maven/internal/transformation/impl/DefaultConsumerPomBuilder.java
+++
b/maven-core/src/main/java/org/apache/maven/internal/transformation/impl/DefaultConsumerPomBuilder.java
@@ -138,6 +138,9 @@ class DefaultConsumerPomBuilder implements
ConsumerPomBuilder {
@Inject
private ProfileActivationFilePathInterpolator
profileActivationFilePathInterpolator;
+ @Inject
+ private List<org.apache.maven.api.spi.ModelTransformer> transformers;
+
Logger logger = LoggerFactory.getLogger(getClass());
@Override
@@ -193,7 +196,8 @@ class DefaultConsumerPomBuilder implements
ConsumerPomBuilder {
pluginConfigurationExpander,
profileActivationFilePathInterpolator,
modelTransformer,
- versionParser);
+ versionParser,
+ transformers);
InternalSession iSession = InternalSession.from(session);
ModelBuilderRequest.ModelBuilderRequestBuilder request =
ModelBuilderRequest.builder();
request.projectBuild(true);
diff --git
a/maven-resolver-provider/src/main/java/org/apache/maven/repository/internal/MavenRepositorySystemSupplier.java
b/maven-resolver-provider/src/main/java/org/apache/maven/repository/internal/MavenRepositorySystemSupplier.java
index 9b321edba4..82baf4890a 100644
---
a/maven-resolver-provider/src/main/java/org/apache/maven/repository/internal/MavenRepositorySystemSupplier.java
+++
b/maven-resolver-provider/src/main/java/org/apache/maven/repository/internal/MavenRepositorySystemSupplier.java
@@ -1061,7 +1061,8 @@ public class MavenRepositorySystemSupplier implements
Supplier<RepositorySystem>
new DefaultPluginConfigurationExpander(),
new ProfileActivationFilePathInterpolator(new
DefaultPathTranslator(), new DefaultRootLocator()),
new BuildModelTransformer(),
- new DefaultModelVersionParser(getVersionScheme()));
+ new DefaultModelVersionParser(getVersionScheme()),
+ List.of());
}
private RepositorySystem repositorySystem;