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;

Reply via email to