diff --git a/maven-model-builder/src/main/java/org/apache/maven/model/building/DefaultModelBuilder.java b/maven-model-builder/src/main/java/org/apache/maven/model/building/DefaultModelBuilder.java index 931e8c5bd379..9d3a23f5a604 100644 --- a/maven-model-builder/src/main/java/org/apache/maven/model/building/DefaultModelBuilder.java +++ b/maven-model-builder/src/main/java/org/apache/maven/model/building/DefaultModelBuilder.java @@ -36,6 +36,7 @@ import java.util.Optional; import java.util.Properties; import java.util.function.Consumer; +import java.util.stream.IntStream; import org.apache.maven.artifact.versioning.DefaultArtifactVersion; import org.apache.maven.artifact.versioning.InvalidVersionSpecificationException; @@ -764,7 +765,7 @@ private List getProfiles(Model model, boolean clone) { private Model interpolateModel(Model model, ModelBuildingRequest request, ModelProblemCollector problems) { // save profile activations before interpolation, since they are evaluated with limited scope - List originalActivations = getProfiles(model, true); + List originalProfiles = getProfiles(model, true); Model interpolatedModel = modelInterpolator.interpolateModel(model, model.getProjectDirectory(), request, problems); @@ -791,8 +792,11 @@ private Model interpolateModel(Model model, ModelBuildingRequest request, ModelP } interpolatedModel.setPomFile(model.getPomFile()); - // restore profiles with file activation to their value before full interpolation - model.setProfiles(originalActivations); + // restore profiles with any activation to their value before full interpolation + List interpolatedProfiles = model.getProfiles(); + IntStream.range(0, interpolatedProfiles.size()).forEach(i -> interpolatedProfiles + .get(i) + .setActivation(originalProfiles.get(i).getActivation())); return interpolatedModel; } diff --git a/maven-model-builder/src/test/java/org/apache/maven/model/profile/DefaultProfileInterpolationTest.java b/maven-model-builder/src/test/java/org/apache/maven/model/profile/DefaultProfileInterpolationTest.java new file mode 100644 index 000000000000..0d227ab8e20f --- /dev/null +++ b/maven-model-builder/src/test/java/org/apache/maven/model/profile/DefaultProfileInterpolationTest.java @@ -0,0 +1,90 @@ +/* + * 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.model.profile; + +import java.io.File; + +import org.apache.maven.model.Model; +import org.apache.maven.model.Plugin; +import org.apache.maven.model.building.DefaultModelBuilderFactory; +import org.apache.maven.model.building.DefaultModelBuildingRequest; +import org.apache.maven.model.building.FileModelSource; +import org.apache.maven.model.building.ModelBuilder; +import org.apache.maven.model.building.ModelBuildingRequest; +import org.apache.maven.model.building.ModelBuildingResult; +import org.junit.Test; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; + +/** + * Tests model builder profile interpolation. + */ +public class DefaultProfileInterpolationTest { + private File getPom(String name) { + return new File("src/test/resources/poms/profile/" + name); + } + + /** + * MNG-8188: profile interpolation was "undone" by mistake. This UT executes reproducer and ensures that + * profile interpolated values (sans activation) are fully interpolated. + */ + @Test + public void profilePropertiesInterpolation() throws Exception { + ModelBuilder builder = new DefaultModelBuilderFactory().newInstance(); + assertNotNull(builder); + + DefaultModelBuildingRequest request = new DefaultModelBuildingRequest(); + request.setModelSource(new FileModelSource(getPom("mng8188.xml"))); + request.setValidationLevel(ModelBuildingRequest.VALIDATION_LEVEL_MAVEN_3_1); + + ModelBuildingResult result = builder.build(request); + assertNotNull(result); + Model effectiveModel = result.getEffectiveModel(); + assertNotNull(effectiveModel); + + Plugin interpolatedPlugin = null; + + // build/pluginManagement + for (Plugin plugin : effectiveModel.getBuild().getPluginManagement().getPlugins()) { + if ("spring-boot-maven-plugin".equals(plugin.getArtifactId())) { + interpolatedPlugin = plugin; + break; + } + } + assertNotNull(interpolatedPlugin); + assertEquals("3.3.1", interpolatedPlugin.getVersion()); + + // profiles/foo/build/pluginManagement + interpolatedPlugin = null; + for (Plugin plugin : effectiveModel + .getProfiles() + .get(0) + .getBuild() + .getPluginManagement() + .getPlugins()) { + if ("spring-boot-maven-plugin".equals(plugin.getArtifactId())) { + interpolatedPlugin = plugin; + break; + } + } + assertNotNull(interpolatedPlugin); + assertEquals("3.3.1", interpolatedPlugin.getVersion()); + } +} diff --git a/maven-model-builder/src/test/resources/poms/profile/mng8188.xml b/maven-model-builder/src/test/resources/poms/profile/mng8188.xml new file mode 100644 index 000000000000..ec85d44a4821 --- /dev/null +++ b/maven-model-builder/src/test/resources/poms/profile/mng8188.xml @@ -0,0 +1,62 @@ + + + + + + 4.0.0 + + profile + mng8188 + 1.0 + + + 3.3.1 + + + + + + + org.springframework.boot + spring-boot-maven-plugin + ${version.spring-boot} + + + + + + + + foo + + + + + org.springframework.boot + spring-boot-maven-plugin + ${version.spring-boot} + + + + + + + \ No newline at end of file