You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@maven.apache.org by mi...@apache.org on 2022/02/19 12:59:21 UTC

[maven] branch MNG-7407 created (now 262f564)

This is an automated email from the ASF dual-hosted git repository.

michaelo pushed a change to branch MNG-7407
in repository https://gitbox.apache.org/repos/asf/maven.git.


      at 262f564  [MNG-7407] Introduce a ModelVersionProcessor component to make CI Friendly Versions pluggable

This branch includes the following new commits:

     new 262f564  [MNG-7407] Introduce a ModelVersionProcessor component to make CI Friendly Versions pluggable

The 1 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.


[maven] 01/01: [MNG-7407] Introduce a ModelVersionProcessor component to make CI Friendly Versions pluggable

Posted by mi...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

michaelo pushed a commit to branch MNG-7407
in repository https://gitbox.apache.org/repos/asf/maven.git

commit 262f564060673c494af7d35077956fa00ea5079d
Author: Christoph Läubrich <ch...@laeubi-soft.de>
AuthorDate: Sun Feb 6 19:23:14 2022 +0100

    [MNG-7407] Introduce a ModelVersionProcessor component to make CI Friendly Versions pluggable
    
    This closes #675
---
 .../model/building/DefaultModelBuilderFactory.java | 13 +++-
 .../AbstractStringBasedModelInterpolator.java      | 25 ++------
 .../DefaultModelVersionProcessor.java              | 69 ++++++++++++++++++++++
 .../interpolation/ModelVersionProcessor.java}      | 33 ++++++++---
 .../StringSearchModelInterpolator.java             | 10 +---
 .../StringVisitorModelInterpolator.java            |  5 +-
 .../model/validation/DefaultModelValidator.java    | 30 +++++-----
 .../StringSearchModelInterpolatorTest.java         |  8 ++-
 .../StringVisitorModelInterpolatorTest.java        |  2 +-
 .../validation/DefaultModelValidatorTest.java      |  4 +-
 10 files changed, 141 insertions(+), 58 deletions(-)

diff --git a/maven-model-builder/src/main/java/org/apache/maven/model/building/DefaultModelBuilderFactory.java b/maven-model-builder/src/main/java/org/apache/maven/model/building/DefaultModelBuilderFactory.java
index 6334f1b..8c7b603 100644
--- a/maven-model-builder/src/main/java/org/apache/maven/model/building/DefaultModelBuilderFactory.java
+++ b/maven-model-builder/src/main/java/org/apache/maven/model/building/DefaultModelBuilderFactory.java
@@ -26,7 +26,9 @@ import org.apache.maven.model.composition.DefaultDependencyManagementImporter;
 import org.apache.maven.model.composition.DependencyManagementImporter;
 import org.apache.maven.model.inheritance.DefaultInheritanceAssembler;
 import org.apache.maven.model.inheritance.InheritanceAssembler;
+import org.apache.maven.model.interpolation.DefaultModelVersionProcessor;
 import org.apache.maven.model.interpolation.ModelInterpolator;
+import org.apache.maven.model.interpolation.ModelVersionProcessor;
 import org.apache.maven.model.interpolation.StringVisitorModelInterpolator;
 import org.apache.maven.model.io.DefaultModelReader;
 import org.apache.maven.model.io.ModelReader;
@@ -259,12 +261,19 @@ public class DefaultModelBuilderFactory
     {
         UrlNormalizer normalizer = newUrlNormalizer();
         PathTranslator pathTranslator = newPathTranslator();
-        return new StringVisitorModelInterpolator( pathTranslator, normalizer );
+        ModelVersionProcessor versionProcessor = newModelVersionPropertiesProcessor();
+        return new StringVisitorModelInterpolator( pathTranslator, normalizer, versionProcessor );
+    }
+
+    protected ModelVersionProcessor newModelVersionPropertiesProcessor()
+    {
+        return new DefaultModelVersionProcessor();
     }
 
     protected ModelValidator newModelValidator()
     {
-        return new DefaultModelValidator();
+        ModelVersionProcessor processor = newModelVersionPropertiesProcessor();
+        return new DefaultModelValidator( processor );
     }
 
     protected ModelNormalizer newModelNormalizer()
diff --git a/maven-model-builder/src/main/java/org/apache/maven/model/interpolation/AbstractStringBasedModelInterpolator.java b/maven-model-builder/src/main/java/org/apache/maven/model/interpolation/AbstractStringBasedModelInterpolator.java
index 588b913..9fb48a2 100644
--- a/maven-model-builder/src/main/java/org/apache/maven/model/interpolation/AbstractStringBasedModelInterpolator.java
+++ b/maven-model-builder/src/main/java/org/apache/maven/model/interpolation/AbstractStringBasedModelInterpolator.java
@@ -52,12 +52,6 @@ import org.codehaus.plexus.interpolation.ValueSource;
 public abstract class AbstractStringBasedModelInterpolator
     implements ModelInterpolator
 {
-    public static final String SHA1_PROPERTY = "sha1";
-
-    public static final String CHANGELIST_PROPERTY = "changelist";
-
-    public static final String REVISION_PROPERTY = "revision";
-
     private static final List<String> PROJECT_PREFIXES = Arrays.asList( "pom.", "project." );
 
     private static final Collection<String> TRANSLATED_PATH_EXPRESSIONS;
@@ -84,12 +78,15 @@ public abstract class AbstractStringBasedModelInterpolator
 
     private final PathTranslator pathTranslator;
     private final UrlNormalizer urlNormalizer;
+    private final ModelVersionProcessor versionProcessor;
 
     @Inject
-    public AbstractStringBasedModelInterpolator( PathTranslator pathTranslator, UrlNormalizer urlNormalizer )
+    public AbstractStringBasedModelInterpolator( PathTranslator pathTranslator, UrlNormalizer urlNormalizer,
+                                                 ModelVersionProcessor processor )
     {
         this.pathTranslator = pathTranslator;
         this.urlNormalizer = urlNormalizer;
+        this.versionProcessor = processor;
     }
 
     protected List<ValueSource> createValueSources( final Model model, final File projectDir,
@@ -151,18 +148,8 @@ public abstract class AbstractStringBasedModelInterpolator
 
         // Overwrite existing values in model properties. Otherwise it's not possible
         // to define the version via command line: mvn -Drevision=6.5.7 ...
-        if ( config.getSystemProperties().containsKey( REVISION_PROPERTY ) )
-        {
-            modelProperties.put( REVISION_PROPERTY, config.getSystemProperties().get( REVISION_PROPERTY ) );
-        }
-        if ( config.getSystemProperties().containsKey( CHANGELIST_PROPERTY ) )
-        {
-            modelProperties.put( CHANGELIST_PROPERTY, config.getSystemProperties().get( CHANGELIST_PROPERTY ) );
-        }
-        if ( config.getSystemProperties().containsKey( SHA1_PROPERTY ) )
-        {
-            modelProperties.put( SHA1_PROPERTY, config.getSystemProperties().get( SHA1_PROPERTY ) );
-        }
+        versionProcessor.overwriteModelProperties( modelProperties, config );
+
         valueSources.add( new MapBasedValueSource( modelProperties ) );
 
         valueSources.add( new MapBasedValueSource( config.getSystemProperties() ) );
diff --git a/maven-model-builder/src/main/java/org/apache/maven/model/interpolation/DefaultModelVersionProcessor.java b/maven-model-builder/src/main/java/org/apache/maven/model/interpolation/DefaultModelVersionProcessor.java
new file mode 100644
index 0000000..27e3469
--- /dev/null
+++ b/maven-model-builder/src/main/java/org/apache/maven/model/interpolation/DefaultModelVersionProcessor.java
@@ -0,0 +1,69 @@
+package org.apache.maven.model.interpolation;
+
+/*
+ * 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.
+ */
+
+import java.util.Properties;
+
+import javax.inject.Named;
+import javax.inject.Singleton;
+
+import org.apache.maven.model.building.ModelBuildingRequest;
+
+/**
+ * Maven default implementation of the {@link ModelVersionProcessor} to support
+ * <a href="https://maven.apache.org/maven-ci-friendly.html">CI Friendly Versions</a>
+ */
+@Named
+@Singleton
+public class DefaultModelVersionProcessor
+    implements ModelVersionProcessor
+{
+
+    private static final String SHA1_PROPERTY = "sha1";
+
+    private static final String CHANGELIST_PROPERTY = "changelist";
+
+    private static final String REVISION_PROPERTY = "revision";
+
+    @Override
+    public boolean isValidProperty( String property )
+    {
+        return REVISION_PROPERTY.equals( property ) || CHANGELIST_PROPERTY.equals( property )
+            || SHA1_PROPERTY.equals( property );
+    }
+
+    @Override
+    public void overwriteModelProperties( Properties modelProperties, ModelBuildingRequest request )
+    {
+        if ( request.getSystemProperties().containsKey( REVISION_PROPERTY ) )
+        {
+            modelProperties.put( REVISION_PROPERTY, request.getSystemProperties().get( REVISION_PROPERTY ) );
+        }
+        if ( request.getSystemProperties().containsKey( CHANGELIST_PROPERTY ) )
+        {
+            modelProperties.put( CHANGELIST_PROPERTY, request.getSystemProperties().get( CHANGELIST_PROPERTY ) );
+        }
+        if ( request.getSystemProperties().containsKey( SHA1_PROPERTY ) )
+        {
+            modelProperties.put( SHA1_PROPERTY, request.getSystemProperties().get( SHA1_PROPERTY ) );
+        }
+
+    }
+}
diff --git a/maven-model-builder/src/test/java/org/apache/maven/model/interpolation/StringVisitorModelInterpolatorTest.java b/maven-model-builder/src/main/java/org/apache/maven/model/interpolation/ModelVersionProcessor.java
similarity index 50%
copy from maven-model-builder/src/test/java/org/apache/maven/model/interpolation/StringVisitorModelInterpolatorTest.java
copy to maven-model-builder/src/main/java/org/apache/maven/model/interpolation/ModelVersionProcessor.java
index e4b11cc..06b17f3 100644
--- a/maven-model-builder/src/test/java/org/apache/maven/model/interpolation/StringVisitorModelInterpolatorTest.java
+++ b/maven-model-builder/src/main/java/org/apache/maven/model/interpolation/ModelVersionProcessor.java
@@ -9,7 +9,7 @@ package org.apache.maven.model.interpolation;
  * "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
+ *  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
@@ -19,10 +19,29 @@ package org.apache.maven.model.interpolation;
  * under the License.
  */
 
-public class StringVisitorModelInterpolatorTest extends AbstractModelInterpolatorTest
+import java.util.Properties;
+
+import org.apache.maven.model.building.ModelBuildingRequest;
+
+/**
+ * Allows a fixed set of properties that are valid inside a version and that could be overwritten for example on the
+ * commandline
+ */
+public interface ModelVersionProcessor
 {
-    protected ModelInterpolator createInterpolator()
-    {
-        return new StringVisitorModelInterpolator( null, null );
-    }
-}
\ No newline at end of file
+
+    /**
+     * @param property the property to check
+     * @return <code>true</code> if this is a valid property for this processor
+     */
+    boolean isValidProperty( String property );
+
+    /**
+     * This method is responsible for examining the request and possibly overwrite of the valid properties in the model
+     *
+     * @param modelProperties
+     * @param request
+     */
+    void overwriteModelProperties( Properties modelProperties, ModelBuildingRequest request );
+
+}
diff --git a/maven-model-builder/src/main/java/org/apache/maven/model/interpolation/StringSearchModelInterpolator.java b/maven-model-builder/src/main/java/org/apache/maven/model/interpolation/StringSearchModelInterpolator.java
index d775fe3..99f55bd 100644
--- a/maven-model-builder/src/main/java/org/apache/maven/model/interpolation/StringSearchModelInterpolator.java
+++ b/maven-model-builder/src/main/java/org/apache/maven/model/interpolation/StringSearchModelInterpolator.java
@@ -68,14 +68,10 @@ public class StringSearchModelInterpolator
     }
 
     @Inject
-    public StringSearchModelInterpolator( PathTranslator pathTranslator, UrlNormalizer urlNormalizer )
+    public StringSearchModelInterpolator( PathTranslator pathTranslator, UrlNormalizer urlNormalizer,
+                                          ModelVersionProcessor processor )
     {
-        super( pathTranslator, urlNormalizer );
-    }
-
-    StringSearchModelInterpolator()
-    {
-        super( null, null );
+        super( pathTranslator, urlNormalizer, processor );
     }
 
     @Override
diff --git a/maven-model-builder/src/main/java/org/apache/maven/model/interpolation/StringVisitorModelInterpolator.java b/maven-model-builder/src/main/java/org/apache/maven/model/interpolation/StringVisitorModelInterpolator.java
index e639a50..e2438d5 100644
--- a/maven-model-builder/src/main/java/org/apache/maven/model/interpolation/StringVisitorModelInterpolator.java
+++ b/maven-model-builder/src/main/java/org/apache/maven/model/interpolation/StringVisitorModelInterpolator.java
@@ -92,9 +92,10 @@ public class StringVisitorModelInterpolator
     extends AbstractStringBasedModelInterpolator
 {
     @Inject
-    public StringVisitorModelInterpolator( PathTranslator pathTranslator, UrlNormalizer urlNormalizer )
+    public StringVisitorModelInterpolator( PathTranslator pathTranslator, UrlNormalizer urlNormalizer,
+                                           ModelVersionProcessor processor )
     {
-        super( pathTranslator, urlNormalizer );
+        super( pathTranslator, urlNormalizer, processor );
     }
 
     interface InnerInterpolator
diff --git a/maven-model-builder/src/main/java/org/apache/maven/model/validation/DefaultModelValidator.java b/maven-model-builder/src/main/java/org/apache/maven/model/validation/DefaultModelValidator.java
index 7ac53a4..93a99cc 100644
--- a/maven-model-builder/src/main/java/org/apache/maven/model/validation/DefaultModelValidator.java
+++ b/maven-model-builder/src/main/java/org/apache/maven/model/validation/DefaultModelValidator.java
@@ -44,7 +44,7 @@ import org.apache.maven.model.building.ModelProblem.Severity;
 import org.apache.maven.model.building.ModelProblem.Version;
 import org.apache.maven.model.building.ModelProblemCollector;
 import org.apache.maven.model.building.ModelProblemCollectorRequest;
-import org.apache.maven.model.interpolation.AbstractStringBasedModelInterpolator;
+import org.apache.maven.model.interpolation.ModelVersionProcessor;
 import org.codehaus.plexus.util.StringUtils;
 
 import java.io.File;
@@ -58,6 +58,7 @@ import java.util.Set;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
 
+import javax.inject.Inject;
 import javax.inject.Named;
 import javax.inject.Singleton;
 
@@ -72,11 +73,6 @@ public class DefaultModelValidator
 
     private static final Pattern EXPRESSION_NAME_PATTERN = Pattern.compile( "\\$\\{(.+?)\\}" );
 
-    private static final List<String> CI_FRIENDLY_POSSIBLE_PROPERTY_NAMES =
-        Arrays.asList( AbstractStringBasedModelInterpolator.REVISION_PROPERTY,
-                       AbstractStringBasedModelInterpolator.CHANGELIST_PROPERTY,
-                       AbstractStringBasedModelInterpolator.SHA1_PROPERTY );
-
     private static final String ILLEGAL_FS_CHARS = "\\/:\"<>|?*";
 
     private static final String ILLEGAL_VERSION_CHARS = ILLEGAL_FS_CHARS;
@@ -89,6 +85,14 @@ public class DefaultModelValidator
 
     private final Set<String> validProfileIds = new HashSet<>();
 
+    private final ModelVersionProcessor versionProcessor;
+
+    @Inject
+    public DefaultModelValidator( ModelVersionProcessor versionProcessor )
+    {
+        this.versionProcessor = versionProcessor;
+    }
+
     @Override
     public void validateFileModel( Model m, ModelBuildingRequest request, ModelProblemCollector problems )
     {
@@ -762,7 +766,7 @@ public class DefaultModelValidator
                                           String prefix2, ModelBuildingRequest request )
     {
         Map<String, Repository> index = new HashMap<>();
-        
+
         for ( Repository repository : repositories )
         {
             validateStringNotEmpty( prefix, prefix2, "id", problems, Severity.ERROR, Version.V20, repository.getId(),
@@ -783,7 +787,7 @@ public class DefaultModelValidator
                     }
                 }
             }
-            
+
             String key = repository.getId();
 
             Repository existing = index.get( key );
@@ -998,17 +1002,11 @@ public class DefaultModelValidator
             return true;
         }
 
-        //
-        // Acceptable versions for continuous delivery
-        //
-        // changelist
-        // revision
-        // sha1
-        //
         Matcher m = EXPRESSION_NAME_PATTERN.matcher( string.trim() );
         while ( m.find() )
         {
-            if ( !CI_FRIENDLY_POSSIBLE_PROPERTY_NAMES.contains( m.group( 1 ) ) )
+            String property = m.group( 1 );
+            if ( !versionProcessor.isValidProperty( property ) )
             {
                 addViolation( problems, severity, version, fieldName, null,
                               "contains an expression but should be a constant.", tracker );
diff --git a/maven-model-builder/src/test/java/org/apache/maven/model/interpolation/StringSearchModelInterpolatorTest.java b/maven-model-builder/src/test/java/org/apache/maven/model/interpolation/StringSearchModelInterpolatorTest.java
index 50f4df0..cc2f297 100644
--- a/maven-model-builder/src/test/java/org/apache/maven/model/interpolation/StringSearchModelInterpolatorTest.java
+++ b/maven-model-builder/src/test/java/org/apache/maven/model/interpolation/StringSearchModelInterpolatorTest.java
@@ -58,7 +58,7 @@ public class StringSearchModelInterpolatorTest
 {
     protected ModelInterpolator createInterpolator()
     {
-        return new StringSearchModelInterpolator();
+        return new StringSearchModelInterpolator( null, null, new DefaultModelVersionProcessor() );
     }
 
     @Test
@@ -579,7 +579,8 @@ public class StringSearchModelInterpolatorTest
         request.setUserProperties( props );
 
         SimpleProblemCollector problems = new SimpleProblemCollector();
-        StringSearchModelInterpolator interpolator = new StringSearchModelInterpolator();
+        StringSearchModelInterpolator interpolator =
+            new StringSearchModelInterpolator( null, null, new DefaultModelVersionProcessor() );
         interpolator.interpolateObject( new ClassWithFinalField(), new Model(), null, request, problems );
 
         assertProblemFree( problems );
@@ -605,7 +606,8 @@ public class StringSearchModelInterpolatorTest
         model.setLocation( "", new InputLocation( 1, 1, source ) );
 
         SimpleProblemCollector problems = new SimpleProblemCollector();
-        StringSearchModelInterpolator interpolator = new StringSearchModelInterpolator();
+        StringSearchModelInterpolator interpolator =
+            new StringSearchModelInterpolator( null, null, new DefaultModelVersionProcessor() );
         interpolator.interpolateObject( model, model, null, request, problems );
 
         assertProblemFree( problems );
diff --git a/maven-model-builder/src/test/java/org/apache/maven/model/interpolation/StringVisitorModelInterpolatorTest.java b/maven-model-builder/src/test/java/org/apache/maven/model/interpolation/StringVisitorModelInterpolatorTest.java
index e4b11cc..8fa92ce 100644
--- a/maven-model-builder/src/test/java/org/apache/maven/model/interpolation/StringVisitorModelInterpolatorTest.java
+++ b/maven-model-builder/src/test/java/org/apache/maven/model/interpolation/StringVisitorModelInterpolatorTest.java
@@ -23,6 +23,6 @@ public class StringVisitorModelInterpolatorTest extends AbstractModelInterpolato
 {
     protected ModelInterpolator createInterpolator()
     {
-        return new StringVisitorModelInterpolator( null, null );
+        return new StringVisitorModelInterpolator( null, null, new DefaultModelVersionProcessor() );
     }
 }
\ No newline at end of file
diff --git a/maven-model-builder/src/test/java/org/apache/maven/model/validation/DefaultModelValidatorTest.java b/maven-model-builder/src/test/java/org/apache/maven/model/validation/DefaultModelValidatorTest.java
index 4517eb7..0008419 100644
--- a/maven-model-builder/src/test/java/org/apache/maven/model/validation/DefaultModelValidatorTest.java
+++ b/maven-model-builder/src/test/java/org/apache/maven/model/validation/DefaultModelValidatorTest.java
@@ -26,6 +26,7 @@ import org.apache.maven.model.Model;
 import org.apache.maven.model.building.DefaultModelBuildingRequest;
 import org.apache.maven.model.building.ModelBuildingRequest;
 import org.apache.maven.model.building.SimpleProblemCollector;
+import org.apache.maven.model.interpolation.DefaultModelVersionProcessor;
 import org.apache.maven.model.io.xpp3.MavenXpp3Reader;
 import org.junit.jupiter.api.AfterEach;
 import org.junit.jupiter.api.BeforeEach;
@@ -103,7 +104,8 @@ public class DefaultModelValidatorTest
     public void setUp()
         throws Exception
     {
-        validator = new DefaultModelValidator();
+        validator =
+            new DefaultModelValidator( new DefaultModelVersionProcessor() );
     }
 
     @AfterEach