Skip to content

Commit 26c2823

Browse files
committed
Fix ternary operator processing in DefaultInterpolator
When processing ternary expressions like ${release:+${foo}:-${bar}} or ${versionCore}${release:+-DEVELOPER}, the DefaultInterpolator was incorrectly continuing to process subsequent operators after a decision had been made on the first operator. This fix adds a break statement after each successful operator evaluation to stop processing any remaining operators once a decision has been made, ensuring that: 1. When 'release' is true and 'foo' is empty, correctly evaluates to an empty string 2. When 'release' is true, correctly evaluates to just Added test cases to verify both scenarios.
1 parent 88d6b92 commit 26c2823

File tree

4 files changed

+64
-5
lines changed

4 files changed

+64
-5
lines changed

impl/maven-core/src/test/java/org/apache/maven/project/DefaultMavenProjectBuilderTest.java

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,11 +23,15 @@
2323
import java.nio.file.Files;
2424
import java.nio.file.Path;
2525
import java.nio.file.StandardCopyOption;
26+
import java.util.Arrays;
27+
import java.util.Collections;
2628
import java.util.List;
29+
import java.util.Properties;
2730

2831
import org.apache.maven.api.model.InputLocation;
2932
import org.apache.maven.api.model.InputSource;
3033
import org.apache.maven.artifact.Artifact;
34+
import org.apache.maven.execution.MavenSession;
3135
import org.apache.maven.impl.InternalSession;
3236
import org.apache.maven.internal.impl.DefaultProject;
3337
import org.apache.maven.internal.impl.InternalMavenSession;
@@ -514,8 +518,15 @@ public void testBuildParentVersionRangeExternallyWithChildRevisionExpression() t
514518
@Test
515519
public void testParentVersionResolvedFromNestedProperties() throws Exception {
516520
File f1 = getTestFile("src/test/resources/projects/pom-parent-version-from-nested-properties/pom.xml");
517-
MavenProject mp = this.getProjectFromRemoteRepository(f1);
518-
assertEquals("0.1.0-RELEASE", mp.getVersion());
521+
ProjectBuildingRequest request = newBuildingRequest();
522+
MavenSession session = InternalMavenSession.from(request.getRepositorySession()).getMavenSession();
523+
524+
MavenProject mp = projectBuilder.build(f1, request).getProject();
525+
assertEquals("0.1.0-DEVELOPER", mp.getVersion());
526+
527+
session.getUserProperties().put("release", "true");
528+
mp = projectBuilder.build(f1, request).getProject();
529+
assertEquals("0.1.0", mp.getVersion());
519530
}
520531

521532
@Test

impl/maven-core/src/test/resources/projects/pom-parent-version-from-nested-properties/pom.xml

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,9 +11,7 @@
1111

1212
<properties>
1313
<versionCore>0.1.0</versionCore>
14-
<releaseProp>-RELEASE</releaseProp>
15-
<release>${releaseProp:--DEVELOPER}</release>
16-
<revision>${versionCore}${release:--NOT_DEV}</revision>
14+
<revision>${versionCore}${release:+:--DEVELOPER}</revision>
1715
</properties>
1816

1917
</project>

impl/maven-impl/src/main/java/org/apache/maven/impl/model/DefaultInterpolator.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -334,10 +334,14 @@ private static String processSubstitution(
334334
if (":+".equals(op)) {
335335
if (substValue != null && !substValue.isEmpty()) {
336336
substValue = processedOpValue;
337+
// Skip any remaining operators since we've made a decision
338+
break;
337339
}
338340
} else if (":-".equals(op)) {
339341
if (substValue == null || substValue.isEmpty()) {
340342
substValue = processedOpValue;
343+
// Skip any remaining operators since we've made a decision
344+
break;
341345
}
342346
} else {
343347
throw new InterpolatorException("Bad substitution operator in: ${" + org + "}");

impl/maven-impl/src/test/java/org/apache/maven/impl/model/DefaultInterpolatorTest.java

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -169,6 +169,52 @@ void testExpansion() {
169169
assertEquals("", props.get("c_cp"));
170170
}
171171

172+
@Test
173+
void testTernary() {
174+
Map<String, String> props;
175+
176+
props = new LinkedHashMap<>();
177+
props.put("foo", "-FOO");
178+
props.put("bar", "-BAR");
179+
props.put("version", "1.0${release:+${foo}:-${bar}}");
180+
performSubstitution(props);
181+
assertEquals("1.0-BAR", props.get("version"));
182+
183+
props = new LinkedHashMap<>();
184+
props.put("release", "true");
185+
props.put("foo", "-FOO");
186+
props.put("bar", "-BAR");
187+
props.put("version", "1.0${release:+${foo}:-${bar}}");
188+
performSubstitution(props);
189+
assertEquals("1.0-FOO", props.get("version"));
190+
191+
props = new LinkedHashMap<>();
192+
props.put("foo", "");
193+
props.put("bar", "-BAR");
194+
props.put("version", "1.0${release:+${foo}:-${bar}}");
195+
performSubstitution(props);
196+
assertEquals("1.0-BAR", props.get("version"));
197+
198+
props = new LinkedHashMap<>();
199+
props.put("release", "true");
200+
props.put("foo", "");
201+
props.put("bar", "-BAR");
202+
props.put("version", "1.0${release:+${foo}:-${bar}}");
203+
performSubstitution(props);
204+
assertEquals("1.0", props.get("version"));
205+
206+
props = new LinkedHashMap<>();
207+
props.put("version", "1.0${release:+:--BAR}");
208+
performSubstitution(props);
209+
assertEquals("1.0-BAR", props.get("version"));
210+
211+
props = new LinkedHashMap<>();
212+
props.put("release", "true");
213+
props.put("version", "1.0${release:+:--BAR}");
214+
performSubstitution(props);
215+
assertEquals("1.0", props.get("version"));
216+
}
217+
172218
@Test
173219
void testXdg() {
174220
Map<String, String> props;

0 commit comments

Comments
 (0)