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

This closes #675
This commit is contained in:
Christoph Läubrich 2022-02-06 19:23:14 +01:00 committed by Michael Osipov
parent 0be5e406d7
commit 62cf29bab3
10 changed files with 163 additions and 53 deletions

View File

@ -26,7 +26,9 @@
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 @@ protected ModelInterpolator newModelInterpolator()
{
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()

View File

@ -52,12 +52,6 @@
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 Object getValue( String expression )
// 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() ) );

View File

@ -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 ) );
}
}
}

View File

@ -0,0 +1,47 @@
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 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
{
/**
* @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 );
}

View File

@ -68,14 +68,10 @@ private interface InnerInterpolator
}
@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

View File

@ -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

View File

@ -44,7 +44,7 @@
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.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 )
{
@ -998,17 +1002,11 @@ private boolean validateVersionNoExpression( String fieldName, ModelProblemColle
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 );

View File

@ -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 void testFinalFieldsExcludedFromInterpolation()
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 void locationTrackerShouldBeExcludedFromInterpolation()
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 );

View File

@ -23,6 +23,6 @@ public class StringVisitorModelInterpolatorTest extends AbstractModelInterpolato
{
protected ModelInterpolator createInterpolator()
{
return new StringVisitorModelInterpolator( null, null );
return new StringVisitorModelInterpolator( null, null, new DefaultModelVersionProcessor() );
}
}

View File

@ -26,6 +26,7 @@
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,7 @@ private void assertContains( String msg, String substring )
public void setUp()
throws Exception
{
validator = new DefaultModelValidator();
validator = new DefaultModelValidator( new DefaultModelVersionProcessor() );
}
@AfterEach