From 86ae0f10e668b825fb1379258c3924f55980df97 Mon Sep 17 00:00:00 2001 From: hoanamzn Date: Tue, 16 Jul 2024 14:35:02 -0700 Subject: [PATCH 1/4] Exclude Maven built-in property from circular placeholder reference check. --- .../internal/PropertyPlaceholderHelper.java | 21 +++++++++++++++- .../PropertyPlaceholderHelperTest.java | 25 +++++++++++++++++++ 2 files changed, 45 insertions(+), 1 deletion(-) diff --git a/rewrite-core/src/main/java/org/openrewrite/internal/PropertyPlaceholderHelper.java b/rewrite-core/src/main/java/org/openrewrite/internal/PropertyPlaceholderHelper.java index 3c6ebdd1132..d8ce11c314e 100644 --- a/rewrite-core/src/main/java/org/openrewrite/internal/PropertyPlaceholderHelper.java +++ b/rewrite-core/src/main/java/org/openrewrite/internal/PropertyPlaceholderHelper.java @@ -15,6 +15,7 @@ */ package org.openrewrite.internal; +import org.openrewrite.internal.lang.NonNull; import org.openrewrite.internal.lang.Nullable; import java.util.*; @@ -27,12 +28,21 @@ * @author Rob Harrop */ public class PropertyPlaceholderHelper { + private static final Map wellKnownSimplePrefixes = new HashMap<>(4); + private static final List MAVEN_BUILT_IN_PROPERTY_PREFIXES = new ArrayList<>(); + static { wellKnownSimplePrefixes.put("}", "{"); wellKnownSimplePrefixes.put("]", "["); wellKnownSimplePrefixes.put(")", "("); + + MAVEN_BUILT_IN_PROPERTY_PREFIXES.add("project."); + MAVEN_BUILT_IN_PROPERTY_PREFIXES.add("pom."); + MAVEN_BUILT_IN_PROPERTY_PREFIXES.add("maven."); + MAVEN_BUILT_IN_PROPERTY_PREFIXES.add("env."); + MAVEN_BUILT_IN_PROPERTY_PREFIXES.add("settings."); } private final String placeholderPrefix; @@ -88,7 +98,7 @@ protected String parseStringValue(String value, Function placeho if (visitedPlaceholders == null) { visitedPlaceholders = new HashSet<>(4); } - if (!visitedPlaceholders.add(originalPlaceholder)) { + if (!visitedPlaceholders.add(originalPlaceholder) && !isMavenBuiltInProperty(originalPlaceholder)) { throw new IllegalArgumentException( "Circular placeholder reference '" + originalPlaceholder + "' in property definitions"); } @@ -160,4 +170,13 @@ private static boolean substringMatch(CharSequence str, int index, CharSequence } return true; } + + private static boolean isMavenBuiltInProperty(@NonNull final String originalPlaceholder) { + for (final String prefix : MAVEN_BUILT_IN_PROPERTY_PREFIXES) { + if (originalPlaceholder.startsWith(prefix)) { + return true; + } + } + return false; + } } diff --git a/rewrite-core/src/test/java/org/openrewrite/internal/PropertyPlaceholderHelperTest.java b/rewrite-core/src/test/java/org/openrewrite/internal/PropertyPlaceholderHelperTest.java index 532bdd46c93..1377b6ebefe 100644 --- a/rewrite-core/src/test/java/org/openrewrite/internal/PropertyPlaceholderHelperTest.java +++ b/rewrite-core/src/test/java/org/openrewrite/internal/PropertyPlaceholderHelperTest.java @@ -17,6 +17,10 @@ import org.junit.jupiter.api.Test; +import java.util.HashSet; +import java.util.Set; +import java.util.function.Function; + import static org.assertj.core.api.Assertions.assertThat; class PropertyPlaceholderHelperTest { @@ -31,4 +35,25 @@ void dashed() { }); assertThat(s).isEqualTo("hi jon"); } + + @Test + void testMavenBuiltInProperty() { + var helper = new PropertyPlaceholderHelper("${", "}", null); + final Set visitedPlaceholders = new HashSet<>(); + visitedPlaceholders.add("project.version"); + visitedPlaceholders.add("pom.basedir"); + visitedPlaceholders.add("maven.home"); + visitedPlaceholders.add("env.PATH"); + visitedPlaceholders.add("settings.localRepository"); + assertThat(helper.parseStringValue("${project.version}", Function.identity(), visitedPlaceholders)) + .isEqualTo("project.version"); + assertThat(helper.parseStringValue("${pom.basedir}", Function.identity(), visitedPlaceholders)) + .isEqualTo("pom.basedir"); + assertThat(helper.parseStringValue("${maven.home}", Function.identity(), visitedPlaceholders)) + .isEqualTo("maven.home"); + assertThat(helper.parseStringValue("${env.PATH}", Function.identity(), visitedPlaceholders)) + .isEqualTo("env.PATH"); + assertThat(helper.parseStringValue("${settings.localRepository}", Function.identity(), visitedPlaceholders)) + .isEqualTo("settings.localRepository"); + } } From 34decaf7cb11be0af0c2ec8d608295d27789faea Mon Sep 17 00:00:00 2001 From: hoanamzn Date: Tue, 16 Jul 2024 22:57:11 -0700 Subject: [PATCH 2/4] Revert "Exclude Maven built-in property from circular placeholder reference check." This reverts commit 86ae0f10e668b825fb1379258c3924f55980df97. --- .../internal/PropertyPlaceholderHelper.java | 21 +--------------- .../PropertyPlaceholderHelperTest.java | 25 ------------------- 2 files changed, 1 insertion(+), 45 deletions(-) diff --git a/rewrite-core/src/main/java/org/openrewrite/internal/PropertyPlaceholderHelper.java b/rewrite-core/src/main/java/org/openrewrite/internal/PropertyPlaceholderHelper.java index d8ce11c314e..3c6ebdd1132 100644 --- a/rewrite-core/src/main/java/org/openrewrite/internal/PropertyPlaceholderHelper.java +++ b/rewrite-core/src/main/java/org/openrewrite/internal/PropertyPlaceholderHelper.java @@ -15,7 +15,6 @@ */ package org.openrewrite.internal; -import org.openrewrite.internal.lang.NonNull; import org.openrewrite.internal.lang.Nullable; import java.util.*; @@ -28,21 +27,12 @@ * @author Rob Harrop */ public class PropertyPlaceholderHelper { - private static final Map wellKnownSimplePrefixes = new HashMap<>(4); - private static final List MAVEN_BUILT_IN_PROPERTY_PREFIXES = new ArrayList<>(); - static { wellKnownSimplePrefixes.put("}", "{"); wellKnownSimplePrefixes.put("]", "["); wellKnownSimplePrefixes.put(")", "("); - - MAVEN_BUILT_IN_PROPERTY_PREFIXES.add("project."); - MAVEN_BUILT_IN_PROPERTY_PREFIXES.add("pom."); - MAVEN_BUILT_IN_PROPERTY_PREFIXES.add("maven."); - MAVEN_BUILT_IN_PROPERTY_PREFIXES.add("env."); - MAVEN_BUILT_IN_PROPERTY_PREFIXES.add("settings."); } private final String placeholderPrefix; @@ -98,7 +88,7 @@ protected String parseStringValue(String value, Function placeho if (visitedPlaceholders == null) { visitedPlaceholders = new HashSet<>(4); } - if (!visitedPlaceholders.add(originalPlaceholder) && !isMavenBuiltInProperty(originalPlaceholder)) { + if (!visitedPlaceholders.add(originalPlaceholder)) { throw new IllegalArgumentException( "Circular placeholder reference '" + originalPlaceholder + "' in property definitions"); } @@ -170,13 +160,4 @@ private static boolean substringMatch(CharSequence str, int index, CharSequence } return true; } - - private static boolean isMavenBuiltInProperty(@NonNull final String originalPlaceholder) { - for (final String prefix : MAVEN_BUILT_IN_PROPERTY_PREFIXES) { - if (originalPlaceholder.startsWith(prefix)) { - return true; - } - } - return false; - } } diff --git a/rewrite-core/src/test/java/org/openrewrite/internal/PropertyPlaceholderHelperTest.java b/rewrite-core/src/test/java/org/openrewrite/internal/PropertyPlaceholderHelperTest.java index 1377b6ebefe..532bdd46c93 100644 --- a/rewrite-core/src/test/java/org/openrewrite/internal/PropertyPlaceholderHelperTest.java +++ b/rewrite-core/src/test/java/org/openrewrite/internal/PropertyPlaceholderHelperTest.java @@ -17,10 +17,6 @@ import org.junit.jupiter.api.Test; -import java.util.HashSet; -import java.util.Set; -import java.util.function.Function; - import static org.assertj.core.api.Assertions.assertThat; class PropertyPlaceholderHelperTest { @@ -35,25 +31,4 @@ void dashed() { }); assertThat(s).isEqualTo("hi jon"); } - - @Test - void testMavenBuiltInProperty() { - var helper = new PropertyPlaceholderHelper("${", "}", null); - final Set visitedPlaceholders = new HashSet<>(); - visitedPlaceholders.add("project.version"); - visitedPlaceholders.add("pom.basedir"); - visitedPlaceholders.add("maven.home"); - visitedPlaceholders.add("env.PATH"); - visitedPlaceholders.add("settings.localRepository"); - assertThat(helper.parseStringValue("${project.version}", Function.identity(), visitedPlaceholders)) - .isEqualTo("project.version"); - assertThat(helper.parseStringValue("${pom.basedir}", Function.identity(), visitedPlaceholders)) - .isEqualTo("pom.basedir"); - assertThat(helper.parseStringValue("${maven.home}", Function.identity(), visitedPlaceholders)) - .isEqualTo("maven.home"); - assertThat(helper.parseStringValue("${env.PATH}", Function.identity(), visitedPlaceholders)) - .isEqualTo("env.PATH"); - assertThat(helper.parseStringValue("${settings.localRepository}", Function.identity(), visitedPlaceholders)) - .isEqualTo("settings.localRepository"); - } } From 5034df072474f0e67c888be90a22227e6630211a Mon Sep 17 00:00:00 2001 From: hoanamzn Date: Tue, 16 Jul 2024 23:06:11 -0700 Subject: [PATCH 3/4] Give explicit property definitions higher precedence than Maven's implicit ones. --- .../openrewrite/maven/tree/ResolvedPom.java | 6 ++- .../openrewrite/maven/MavenParserTest.java | 50 +++++++++++++++++++ 2 files changed, 55 insertions(+), 1 deletion(-) diff --git a/rewrite-maven/src/main/java/org/openrewrite/maven/tree/ResolvedPom.java b/rewrite-maven/src/main/java/org/openrewrite/maven/tree/ResolvedPom.java index e970abd798f..8790900a5fb 100644 --- a/rewrite-maven/src/main/java/org/openrewrite/maven/tree/ResolvedPom.java +++ b/rewrite-maven/src/main/java/org/openrewrite/maven/tree/ResolvedPom.java @@ -278,6 +278,10 @@ private String getProperty(@Nullable String property) { if (property == null) { return null; } + final String propVal = properties.get(property); + if (propVal != null) { + return propVal; + } switch (property) { case "groupId": case "project.groupId": @@ -302,7 +306,7 @@ private String getProperty(@Nullable String property) { return requested.getParent() != null ? requested.getParent().getVersion() : null; } - return System.getProperty(property, properties.get(property)); + return System.getProperty(property); } @Nullable diff --git a/rewrite-maven/src/test/java/org/openrewrite/maven/MavenParserTest.java b/rewrite-maven/src/test/java/org/openrewrite/maven/MavenParserTest.java index 05d37789d11..e2580a456c5 100644 --- a/rewrite-maven/src/test/java/org/openrewrite/maven/MavenParserTest.java +++ b/rewrite-maven/src/test/java/org/openrewrite/maven/MavenParserTest.java @@ -3107,4 +3107,54 @@ void circularImportDependency() { ) ); } + + @Test + void circularMavenProperty() { + rewriteRun( + mavenProject("root", + pomXml( + """ + + example + example-root + pom + 1.0.0 + + + 1.0.1 + + + + example-child + + + """, + spec -> spec.afterRecipe(pomXml -> assertThat( + pomXml.getMarkers().findFirst(MavenResolutionResult.class).orElseThrow() + .getPom().getProperties().get("project.version")) + .isEqualTo("1.0.1")) + ), + mavenProject("circular-example-child", + pomXml( + """ + + + example + example-root + 1.0.0 + + + example-child + ${project.version} + + """, + spec -> spec.afterRecipe(pomXml -> { + MavenResolutionResult resolution = pomXml.getMarkers().findFirst(MavenResolutionResult.class).orElseThrow(); + assertThat(resolution.getPom().getVersion()).isEqualTo("1.0.1"); + }) + ) + ) + ) + ); + } } From 18b434c57d309895a349e1f40bfbd0017b96fbab Mon Sep 17 00:00:00 2001 From: Tim te Beek Date: Wed, 17 Jul 2024 10:45:27 +0200 Subject: [PATCH 4/4] Reformat test --- .../openrewrite/maven/tree/ResolvedPom.java | 2 +- .../openrewrite/maven/MavenParserTest.java | 238 +++++++++--------- 2 files changed, 120 insertions(+), 120 deletions(-) diff --git a/rewrite-maven/src/main/java/org/openrewrite/maven/tree/ResolvedPom.java b/rewrite-maven/src/main/java/org/openrewrite/maven/tree/ResolvedPom.java index 8790900a5fb..a900ba4a057 100644 --- a/rewrite-maven/src/main/java/org/openrewrite/maven/tree/ResolvedPom.java +++ b/rewrite-maven/src/main/java/org/openrewrite/maven/tree/ResolvedPom.java @@ -278,7 +278,7 @@ private String getProperty(@Nullable String property) { if (property == null) { return null; } - final String propVal = properties.get(property); + String propVal = properties.get(property); if (propVal != null) { return propVal; } diff --git a/rewrite-maven/src/test/java/org/openrewrite/maven/MavenParserTest.java b/rewrite-maven/src/test/java/org/openrewrite/maven/MavenParserTest.java index e2580a456c5..791f5d3208e 100644 --- a/rewrite-maven/src/test/java/org/openrewrite/maven/MavenParserTest.java +++ b/rewrite-maven/src/test/java/org/openrewrite/maven/MavenParserTest.java @@ -55,7 +55,7 @@ void rangeVersion() { com.mycompany.app my-app 1 - + junit @@ -79,7 +79,7 @@ void skipDependencyResolution() { com.mycompany.app my-app 1 - + foo @@ -128,7 +128,7 @@ void invalidRange() { com.mycompany.app my-app 1 - + junit @@ -517,7 +517,7 @@ void parse() { """ 4.0.0 - + com.mycompany.app my-app 1 @@ -527,7 +527,7 @@ void parse() { Trygve Laugstøl - + org.junit.jupiter @@ -583,11 +583,11 @@ void handlesRepositories() { """ 4.0.0 - + org.openrewrite.maven single-project 0.1.0-SNAPSHOT - + com.google.guava @@ -595,7 +595,7 @@ void handlesRepositories() { 29.0-jre - + jcenter @@ -617,15 +617,15 @@ void handlesPropertiesInDependencyScope() { """ 4.0.0 - + org.openrewrite.maven single-project 0.1.0-SNAPSHOT - + compile - + com.google.guava @@ -677,11 +677,11 @@ void selfRecursiveParent() { """ 4.0.0 - + com.mycompany.app my-app 1 - + com.mycompany.app my-app @@ -701,11 +701,11 @@ void selfRecursiveDependency() { """ 4.0.0 - + com.mycompany.app my-app 1 - + com.mycompany.app @@ -893,11 +893,11 @@ public MockResponse dispatch(RecordedRequest request) { resp.setBody(""" 4.0.0 - + com.foo bar 1.0.0 - + """ ); @@ -940,11 +940,11 @@ public MockResponse dispatch(RecordedRequest request) { """ 4.0.0 - + org.openrewrite.test foo 0.1.0-SNAPSHOT - + com.foo @@ -1130,17 +1130,17 @@ void indirectBomImportedFromParent() { """ 4.0.0 - + b org.openrewrite.maven 0.1.0-SNAPSHOT pom - + 1.8 1.8 - + @@ -1161,12 +1161,12 @@ void indirectBomImportedFromParent() { """ 4.0.0 - + c org.openrewrite.maven 0.1.0-SNAPSHOT pom - + @@ -1185,11 +1185,11 @@ void indirectBomImportedFromParent() { """ 4.0.0 - + org.openrewrite.maven d 0.1.0-SNAPSHOT - + 1.8 1.8 @@ -1406,7 +1406,7 @@ void dependencyManagementPropagatesToDependencies() { a-parent 0.1.0-SNAPSHOT pom - + @@ -1429,9 +1429,9 @@ void dependencyManagementPropagatesToDependencies() { 0.1.0-SNAPSHOT - + a - + org.openrewrite.maven @@ -1490,9 +1490,9 @@ void dependencyManagementPropagatesToDependencies() { 0.1.0-SNAPSHOT - + b - + org.openrewrite.maven @@ -1532,7 +1532,7 @@ void managedDependencyInTransitiveAndPom() { a 1.0.0 jar - + @@ -1542,7 +1542,7 @@ void managedDependencyInTransitiveAndPom() { - + junit @@ -1606,7 +1606,7 @@ void profileNoJdkActivation() { com.mycompany.app my-app 1 - + old-jdk @@ -1812,11 +1812,11 @@ void ciFriendlyVersionWithParent() { sample ${revision} pom - + sample-rest - + """, spec -> spec.path("pom.xml")), pomXml( @@ -1824,11 +1824,11 @@ void ciFriendlyVersionWithParent() { - + 4.0.0 sample-rest jar - + net.sample sample @@ -1854,14 +1854,14 @@ void canConnectProjectPomsWhenUsingCiFriendlyVersions() { sample ${revision} pom - + sample-parent sample-app sample-rest sample-web - + 0.0.0-SNAPSHOT @@ -1877,11 +1877,11 @@ void canConnectProjectPomsWhenUsingCiFriendlyVersions() { net.sample ${revision} pom - + 0.0.0-SNAPSHOT - + @@ -1903,24 +1903,24 @@ void canConnectProjectPomsWhenUsingCiFriendlyVersions() { - + 4.0.0 sample-app jar - + net.sample sample-parent ${revision} ../parent/pom.xml - + net.sample sample-rest - + net.sample sample-web @@ -1933,11 +1933,11 @@ void canConnectProjectPomsWhenUsingCiFriendlyVersions() { - + 4.0.0 sample-rest jar - + net.sample sample-parent @@ -1951,11 +1951,11 @@ void canConnectProjectPomsWhenUsingCiFriendlyVersions() { - + 4.0.0 sample-web jar - + net.sample sample-parent @@ -1982,14 +1982,14 @@ void ciFriendlyVersionsStillWorkAfterUpdateMavenModel() { sample ${revision} pom - + sample-parent sample-app sample-rest sample-web - + 0.0.0-SNAPSHOT @@ -2005,11 +2005,11 @@ void ciFriendlyVersionsStillWorkAfterUpdateMavenModel() { net.sample ${revision} pom - + 0.0.0-SNAPSHOT - + @@ -2031,29 +2031,29 @@ void ciFriendlyVersionsStillWorkAfterUpdateMavenModel() { - + 4.0.0 sample-app jar - + net.sample sample-parent ${revision} ../parent/pom.xml - + net.sample sample-rest - + net.sample sample-web - + junit junit @@ -2065,29 +2065,29 @@ void ciFriendlyVersionsStillWorkAfterUpdateMavenModel() { - + 4.0.0 sample-app jar - + net.sample sample-parent ${revision} ../parent/pom.xml - + net.sample sample-rest - + net.sample sample-web - + junit junit @@ -2101,11 +2101,11 @@ void ciFriendlyVersionsStillWorkAfterUpdateMavenModel() { - + 4.0.0 sample-rest jar - + net.sample sample-parent @@ -2119,11 +2119,11 @@ void ciFriendlyVersionsStillWorkAfterUpdateMavenModel() { - + 4.0.0 sample-web jar - + net.sample sample-parent @@ -2144,16 +2144,16 @@ void multipleCiFriendlyVersionPlaceholders() { 4.0.0 - + bogus.example parent ${revision}${changelist} pom - + sub - + 99999.0 -SNAPSHOT @@ -2166,13 +2166,13 @@ void multipleCiFriendlyVersionPlaceholders() { 4.0.0 - + bogus.example parent ${revision}${changelist} - + sub """, spec -> spec.path("sub/pom.xml")) @@ -2337,7 +2337,7 @@ void malformedPom() { com.mycompany.app my-app 1 - + junit @@ -2360,7 +2360,7 @@ void plugins() { org.openrewrite.maven a 0.1.0-SNAPSHOT - + @@ -2393,7 +2393,7 @@ void pluginWithoutConfig() { org.openrewrite.maven a 0.1.0-SNAPSHOT - + @@ -2444,9 +2444,9 @@ void pluginsFromParent() { org.openrewrite.maven b 0.1.0-SNAPSHOT - + pom - + @@ -2474,7 +2474,7 @@ void pluginManagement() { org.openrewrite.maven a 0.1.0-SNAPSHOT - + @@ -2529,9 +2529,9 @@ void pluginManagementFromParent() { org.openrewrite.maven b 0.1.0-SNAPSHOT - + pom - + @@ -2581,9 +2581,9 @@ void notInheritedPluginFromParent() { org.openrewrite.maven b 0.1.0-SNAPSHOT - + pom - + @@ -2613,9 +2613,9 @@ void mergePluginConfig() { org.openrewrite.maven b 0.1.0-SNAPSHOT - + pom - + @@ -2643,7 +2643,7 @@ void mergePluginConfig() { a - + @@ -2678,9 +2678,9 @@ void mergePluginConfigListOverride() { org.openrewrite.maven b 0.1.0-SNAPSHOT - + pom - + @@ -2710,7 +2710,7 @@ void mergePluginConfigListOverride() { a - + @@ -2750,9 +2750,9 @@ void mergePluginConfigListAppend() { org.openrewrite.maven b 0.1.0-SNAPSHOT - + pom - + @@ -2782,7 +2782,7 @@ void mergePluginConfigListAppend() { a - + @@ -2825,9 +2825,9 @@ void mergePluginConfigListAppendOverride() { org.openrewrite.maven b 0.1.0-SNAPSHOT - + pom - + @@ -2857,7 +2857,7 @@ void mergePluginConfigListAppendOverride() { a - + @@ -3115,18 +3115,18 @@ void circularMavenProperty() { pomXml( """ - example - example-root - pom - 1.0.0 - - - 1.0.1 - - - - example-child - + example + example-root + pom + 1.0.0 + + + 1.0.1 + + + + example-child + """, spec -> spec.afterRecipe(pomXml -> assertThat( @@ -3138,20 +3138,20 @@ void circularMavenProperty() { pomXml( """ - - example - example-root - 1.0.0 - - - example-child - ${project.version} + + example + example-root + 1.0.0 + + + example-child + ${project.version} """, - spec -> spec.afterRecipe(pomXml -> { - MavenResolutionResult resolution = pomXml.getMarkers().findFirst(MavenResolutionResult.class).orElseThrow(); - assertThat(resolution.getPom().getVersion()).isEqualTo("1.0.1"); - }) + spec -> spec.afterRecipe(pomXml -> assertThat( + pomXml.getMarkers().findFirst(MavenResolutionResult.class).orElseThrow() + .getPom().getVersion()) + .isEqualTo("1.0.1")) ) ) )