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:22 UTC
[maven] 01/01: [MNG-7407] Introduce a ModelVersionProcessor component to make CI Friendly Versions pluggable
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