diff --git a/versions-common/src/test/java/org/codehaus/mojo/versions/api/PomHelperTest.java b/versions-common/src/test/java/org/codehaus/mojo/versions/api/PomHelperTest.java index 3b68895020..a36be2ca1a 100644 --- a/versions-common/src/test/java/org/codehaus/mojo/versions/api/PomHelperTest.java +++ b/versions-common/src/test/java/org/codehaus/mojo/versions/api/PomHelperTest.java @@ -25,8 +25,16 @@ import java.io.File; import java.io.StringReader; import java.net.URL; +import java.nio.file.Files; +import java.nio.file.Path; +import java.util.Collections; +import java.util.LinkedHashMap; +import java.util.Map; +import org.apache.commons.io.FileUtils; import org.apache.maven.model.Model; +import org.apache.maven.model.io.DefaultModelWriter; +import org.apache.maven.model.io.ModelWriter; import org.apache.maven.model.io.xpp3.MavenXpp3Reader; import org.apache.maven.plugin.logging.SystemStreamLog; import org.apache.maven.plugin.testing.AbstractMojoTestCase; @@ -49,6 +57,9 @@ * Tests the methods of {@link PomHelper}. */ public class PomHelperTest extends AbstractMojoTestCase { + private static final int NUMBER_OF_CHILD_PROJECTS = 30; + private static final String DEFAULT_VERSION = "1.0.0-SNAPSHOT"; + @Rule public MojoRule mojoRule = new MojoRule(this); @@ -219,4 +230,50 @@ public void testIssue505ChildModules() throws Exception { mojoRule.readMavenProject(new File("src/test/resources/org/codehaus/mojo/versions/api/issue-505")); assertThat(PomHelper.getChildModels(project, new SystemStreamLog()).entrySet(), hasSize(3)); } + + @Test + public void testChildModelsForMultiLevelProject() throws Exception { + Path tempDirectory = Files.createTempDirectory("testChildModelsForLargeNumberOfModules"); + ModelWriter modelWriter = new DefaultModelWriter(); + Map createdModels = new LinkedHashMap<>(); + + try { + Model rootProject = createSimpleModel("root"); + createdModels.put(tempDirectory, rootProject); + for (int levelOne = 0; levelOne < NUMBER_OF_CHILD_PROJECTS; levelOne++) { + Model levelOneProject = createSimpleModel("child-" + levelOne); + Path levelOneProjectDirectory = tempDirectory.resolve(levelOneProject.getArtifactId()); + rootProject.addModule(levelOneProject.getArtifactId()); + createdModels.put(levelOneProjectDirectory, levelOneProject); + + for (int levelTwo = 0; levelTwo < NUMBER_OF_CHILD_PROJECTS; levelTwo++) { + Model levelTwoProject = createSimpleModel("child-" + levelOne + "-" + levelTwo); + Path levelTwoProjectDirectory = levelOneProjectDirectory.resolve(levelTwoProject.getArtifactId()); + levelOneProject.addModule(levelTwoProject.getArtifactId()); + createdModels.put(levelTwoProjectDirectory, levelTwoProject); + } + } + + for (Map.Entry entry : createdModels.entrySet()) { + modelWriter.write(entry.getKey().resolve("pom.xml").toFile(), Collections.emptyMap(), entry.getValue()); + } + + MavenProject project = mojoRule.readMavenProject(tempDirectory.toFile()); + + assertThat( + PomHelper.getChildModels(project, new SystemStreamLog()).entrySet(), hasSize(createdModels.size())); + } finally { + FileUtils.deleteDirectory(tempDirectory.toFile()); + } + } + + private Model createSimpleModel(String artifactId) { + Model module = new Model(); + module.setGroupId("child.test"); + module.setArtifactId(artifactId); + module.setVersion(DEFAULT_VERSION); + module.setPackaging("pom"); + module.setModelVersion("4.0.0"); + return module; + } } diff --git a/versions-maven-plugin/src/main/java/org/codehaus/mojo/versions/SetMojo.java b/versions-maven-plugin/src/main/java/org/codehaus/mojo/versions/SetMojo.java index 4cfdacae24..645116e0b3 100644 --- a/versions-maven-plugin/src/main/java/org/codehaus/mojo/versions/SetMojo.java +++ b/versions-maven-plugin/src/main/java/org/codehaus/mojo/versions/SetMojo.java @@ -39,6 +39,7 @@ import java.util.TimeZone; import java.util.TreeMap; import java.util.regex.Pattern; +import java.util.stream.Collectors; import org.apache.maven.artifact.ArtifactUtils; import org.apache.maven.model.Model; @@ -65,6 +66,7 @@ import org.codehaus.plexus.components.interactivity.PrompterException; import org.codehaus.plexus.util.StringUtils; +import static java.util.Optional.ofNullable; import static org.codehaus.plexus.util.StringUtils.isEmpty; /** @@ -348,9 +350,22 @@ public void execute() throws MojoExecutionException, MojoFailureException { Pattern.compile(RegexUtils.convertWildcardsToRegex(fixNullOrEmpty(oldVersion, "*"), true)); for (Model m : reactor.values()) { - final String mGroupId = PomHelper.getGroupId(m); - final String mArtifactId = PomHelper.getArtifactId(m); - final String mVersion = PomHelper.getVersion(m); + Map properties = ofNullable(m.getProperties()) + .map(p -> p.entrySet().parallelStream() + .collect(Collectors.toMap(e -> e.getKey().toString(), e -> e.getValue() + .toString()))) + .orElse(null); + + String mGroupId = PomHelper.getGroupId(m); + String mArtifactId = PomHelper.getArtifactId(m); + String mVersion = PomHelper.getVersion(m); + + if (properties != null) { + mGroupId = PomHelper.evaluate(mGroupId, properties); + mArtifactId = PomHelper.evaluate(mArtifactId, properties); + mVersion = PomHelper.evaluate(mVersion, properties); + } + if ((processAllModules || groupIdRegex.matcher(mGroupId).matches() && artifactIdRegex.matcher(mArtifactId).matches()) diff --git a/versions-maven-plugin/src/test/java/org/codehaus/mojo/versions/SetMojoTest.java b/versions-maven-plugin/src/test/java/org/codehaus/mojo/versions/SetMojoTest.java index 1decf8f987..68596bbe5e 100644 --- a/versions-maven-plugin/src/test/java/org/codehaus/mojo/versions/SetMojoTest.java +++ b/versions-maven-plugin/src/test/java/org/codehaus/mojo/versions/SetMojoTest.java @@ -158,4 +158,35 @@ public void testSetOldVersionMismatchProcessAllModules() throws Exception { String.join("", Files.readAllLines(tempDir.resolve("pom.xml"))), not(containsString("bar"))); } + + private void testSetParameterValue(String filename) throws Exception { + Files.copy( + Paths.get("src/test/resources/org/codehaus/mojo/set/issue-855/").resolve(filename), + tempDir.resolve("pom.xml")); + SetMojo mojo = (SetMojo) mojoRule.lookupConfiguredMojo(tempDir.toFile(), "set"); + mojo.execute(); + assertThat( + String.join("", Files.readAllLines(tempDir.resolve("pom.xml"))), + containsString("testing")); + } + + @Test + public void testSetParameterValueSimple() throws Exception { + testSetParameterValue("pom-simple.xml"); + } + + @Test + public void testSetParameterValueBuildNumber() throws Exception { + testSetParameterValue("pom-build-number.xml"); + } + + @Test + public void testSetParameterValueUndefined() throws Exception { + testSetParameterValue("pom-undefined.xml"); + } + + @Test + public void testSetParameterValueMultipleProps() throws Exception { + testSetParameterValue("pom-multiple-props.xml"); + } } diff --git a/versions-maven-plugin/src/test/resources/org/codehaus/mojo/set/issue-855/pom-build-number.xml b/versions-maven-plugin/src/test/resources/org/codehaus/mojo/set/issue-855/pom-build-number.xml new file mode 100644 index 0000000000..ccb50602c6 --- /dev/null +++ b/versions-maven-plugin/src/test/resources/org/codehaus/mojo/set/issue-855/pom-build-number.xml @@ -0,0 +1,29 @@ + + org.example + test-versions + ${revision} + 4.0.0 + + + 1.0.0-${buildNumber}-SNAPSHOT + + + + + + + org.codehaus.mojo + versions-maven-plugin + + set + + + testing + false + + + + + diff --git a/versions-maven-plugin/src/test/resources/org/codehaus/mojo/set/issue-855/pom-multiple-props.xml b/versions-maven-plugin/src/test/resources/org/codehaus/mojo/set/issue-855/pom-multiple-props.xml new file mode 100644 index 0000000000..ccb50602c6 --- /dev/null +++ b/versions-maven-plugin/src/test/resources/org/codehaus/mojo/set/issue-855/pom-multiple-props.xml @@ -0,0 +1,29 @@ + + org.example + test-versions + ${revision} + 4.0.0 + + + 1.0.0-${buildNumber}-SNAPSHOT + + + + + + + org.codehaus.mojo + versions-maven-plugin + + set + + + testing + false + + + + + diff --git a/versions-maven-plugin/src/test/resources/org/codehaus/mojo/set/issue-855/pom-simple.xml b/versions-maven-plugin/src/test/resources/org/codehaus/mojo/set/issue-855/pom-simple.xml new file mode 100644 index 0000000000..f685fd06d1 --- /dev/null +++ b/versions-maven-plugin/src/test/resources/org/codehaus/mojo/set/issue-855/pom-simple.xml @@ -0,0 +1,29 @@ + + org.example + test-versions + ${revision} + 4.0.0 + + + 1.3 + + + + + + + org.codehaus.mojo + versions-maven-plugin + + set + + + testing + false + + + + + diff --git a/versions-maven-plugin/src/test/resources/org/codehaus/mojo/set/issue-855/pom-undefined.xml b/versions-maven-plugin/src/test/resources/org/codehaus/mojo/set/issue-855/pom-undefined.xml new file mode 100644 index 0000000000..ccb50602c6 --- /dev/null +++ b/versions-maven-plugin/src/test/resources/org/codehaus/mojo/set/issue-855/pom-undefined.xml @@ -0,0 +1,29 @@ + + org.example + test-versions + ${revision} + 4.0.0 + + + 1.0.0-${buildNumber}-SNAPSHOT + + + + + + + org.codehaus.mojo + versions-maven-plugin + + set + + + testing + false + + + + +