diff --git a/impl/maven-core/src/test/java/org/apache/maven/project/DefaultMavenProjectBuilderTest.java b/impl/maven-core/src/test/java/org/apache/maven/project/DefaultMavenProjectBuilderTest.java
index 9f7cc8ebe014..3c5bcdd0accd 100644
--- a/impl/maven-core/src/test/java/org/apache/maven/project/DefaultMavenProjectBuilderTest.java
+++ b/impl/maven-core/src/test/java/org/apache/maven/project/DefaultMavenProjectBuilderTest.java
@@ -28,6 +28,7 @@
import org.apache.maven.api.model.InputLocation;
import org.apache.maven.api.model.InputSource;
import org.apache.maven.artifact.Artifact;
+import org.apache.maven.execution.MavenSession;
import org.apache.maven.impl.InternalSession;
import org.apache.maven.internal.impl.DefaultProject;
import org.apache.maven.internal.impl.InternalMavenSession;
@@ -511,6 +512,21 @@ public void testBuildParentVersionRangeExternallyWithChildRevisionExpression() t
assertEquals("1.0-SNAPSHOT", mp.getVersion());
}
+ @Test
+ public void testParentVersionResolvedFromNestedProperties() throws Exception {
+ File f1 = getTestFile("src/test/resources/projects/pom-parent-version-from-nested-properties/pom.xml");
+ ProjectBuildingRequest request = newBuildingRequest();
+ MavenSession session =
+ InternalMavenSession.from(request.getRepositorySession()).getMavenSession();
+
+ MavenProject mp = projectBuilder.build(f1, request).getProject();
+ assertEquals("0.1.0-DEVELOPER", mp.getVersion());
+
+ session.getUserProperties().put("release", "true");
+ mp = projectBuilder.build(f1, request).getProject();
+ assertEquals("0.1.0", mp.getVersion());
+ }
+
@Test
public void testSubprojectDiscovery() throws Exception {
File pom = getTestFile("src/test/resources/projects/subprojects-discover/pom.xml");
diff --git a/impl/maven-core/src/test/resources/projects/pom-parent-version-from-nested-properties/pom.xml b/impl/maven-core/src/test/resources/projects/pom-parent-version-from-nested-properties/pom.xml
new file mode 100644
index 000000000000..dc232b74fa66
--- /dev/null
+++ b/impl/maven-core/src/test/resources/projects/pom-parent-version-from-nested-properties/pom.xml
@@ -0,0 +1,17 @@
+
+ 4.1.0
+
+ gid
+ aid
+ ${revision}
+ pom
+
+
+ 0.1.0
+ ${versionCore}${release:+:--DEVELOPER}
+
+
+
diff --git a/impl/maven-impl/src/main/java/org/apache/maven/impl/model/DefaultInterpolator.java b/impl/maven-impl/src/main/java/org/apache/maven/impl/model/DefaultInterpolator.java
index 41554274cdbf..0d969222d45d 100644
--- a/impl/maven-impl/src/main/java/org/apache/maven/impl/model/DefaultInterpolator.java
+++ b/impl/maven-impl/src/main/java/org/apache/maven/impl/model/DefaultInterpolator.java
@@ -334,10 +334,14 @@ private static String processSubstitution(
if (":+".equals(op)) {
if (substValue != null && !substValue.isEmpty()) {
substValue = processedOpValue;
+ // Skip any remaining operators since we've made a decision
+ break;
}
} else if (":-".equals(op)) {
if (substValue == null || substValue.isEmpty()) {
substValue = processedOpValue;
+ // Skip any remaining operators since we've made a decision
+ break;
}
} else {
throw new InterpolatorException("Bad substitution operator in: ${" + org + "}");
diff --git a/impl/maven-impl/src/main/java/org/apache/maven/impl/model/DefaultModelBuilder.java b/impl/maven-impl/src/main/java/org/apache/maven/impl/model/DefaultModelBuilder.java
index e918edf2a49f..82ebd5a770f1 100644
--- a/impl/maven-impl/src/main/java/org/apache/maven/impl/model/DefaultModelBuilder.java
+++ b/impl/maven-impl/src/main/java/org/apache/maven/impl/model/DefaultModelBuilder.java
@@ -43,8 +43,6 @@
import java.util.concurrent.atomic.AtomicReference;
import java.util.function.Supplier;
import java.util.function.UnaryOperator;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
import java.util.stream.Collectors;
import java.util.stream.Stream;
@@ -247,8 +245,6 @@ public ModelBuilderResult build(ModelBuilderRequest request) throws ModelBuilder
}
protected class ModelBuilderSessionState implements ModelProblemCollector {
- private static final Pattern REGEX = Pattern.compile("\\$\\{([^}]+)}");
-
final Session session;
final ModelBuilderRequest request;
final DefaultModelBuilderResult result;
@@ -585,26 +581,7 @@ private Dependency inferDependencyVersion(Model model, Dependency dep) {
}
String replaceCiFriendlyVersion(Map properties, String version) {
- // TODO: we're using a simple regex here, but we should probably use
- // a proper interpolation service to do the replacements
- // once one is available in maven-api-impl
- // https://issues.apache.org/jira/browse/MNG-8262
- if (version != null) {
- Matcher matcher = REGEX.matcher(version);
- if (matcher.find()) {
- StringBuilder result = new StringBuilder();
- do {
- // extract the key inside ${}
- String key = matcher.group(1);
- // get replacement from the map, or use the original ${xy} if not found
- String replacement = properties.getOrDefault(key, "\\" + matcher.group(0));
- matcher.appendReplacement(result, replacement);
- } while (matcher.find());
- matcher.appendTail(result); // Append the remaining part of the string
- return result.toString();
- }
- }
- return version;
+ return version != null ? interpolator.interpolate(version, properties::get) : null;
}
private void buildBuildPom() throws ModelBuilderException {
diff --git a/impl/maven-impl/src/test/java/org/apache/maven/impl/model/DefaultInterpolatorTest.java b/impl/maven-impl/src/test/java/org/apache/maven/impl/model/DefaultInterpolatorTest.java
index c0c06a271f0b..9d332e9a5194 100644
--- a/impl/maven-impl/src/test/java/org/apache/maven/impl/model/DefaultInterpolatorTest.java
+++ b/impl/maven-impl/src/test/java/org/apache/maven/impl/model/DefaultInterpolatorTest.java
@@ -169,6 +169,52 @@ void testExpansion() {
assertEquals("", props.get("c_cp"));
}
+ @Test
+ void testTernary() {
+ Map props;
+
+ props = new LinkedHashMap<>();
+ props.put("foo", "-FOO");
+ props.put("bar", "-BAR");
+ props.put("version", "1.0${release:+${foo}:-${bar}}");
+ performSubstitution(props);
+ assertEquals("1.0-BAR", props.get("version"));
+
+ props = new LinkedHashMap<>();
+ props.put("release", "true");
+ props.put("foo", "-FOO");
+ props.put("bar", "-BAR");
+ props.put("version", "1.0${release:+${foo}:-${bar}}");
+ performSubstitution(props);
+ assertEquals("1.0-FOO", props.get("version"));
+
+ props = new LinkedHashMap<>();
+ props.put("foo", "");
+ props.put("bar", "-BAR");
+ props.put("version", "1.0${release:+${foo}:-${bar}}");
+ performSubstitution(props);
+ assertEquals("1.0-BAR", props.get("version"));
+
+ props = new LinkedHashMap<>();
+ props.put("release", "true");
+ props.put("foo", "");
+ props.put("bar", "-BAR");
+ props.put("version", "1.0${release:+${foo}:-${bar}}");
+ performSubstitution(props);
+ assertEquals("1.0", props.get("version"));
+
+ props = new LinkedHashMap<>();
+ props.put("version", "1.0${release:+:--BAR}");
+ performSubstitution(props);
+ assertEquals("1.0-BAR", props.get("version"));
+
+ props = new LinkedHashMap<>();
+ props.put("release", "true");
+ props.put("version", "1.0${release:+:--BAR}");
+ performSubstitution(props);
+ assertEquals("1.0", props.get("version"));
+ }
+
@Test
void testXdg() {
Map props;