diff --git a/rewrite-maven/src/main/java/org/openrewrite/maven/AddProperty.java b/rewrite-maven/src/main/java/org/openrewrite/maven/AddProperty.java index f632aac4cdb..62c18f76154 100644 --- a/rewrite-maven/src/main/java/org/openrewrite/maven/AddProperty.java +++ b/rewrite-maven/src/main/java/org/openrewrite/maven/AddProperty.java @@ -17,11 +17,11 @@ import lombok.EqualsAndHashCode; import lombok.Value; -import org.openrewrite.*; +import org.openrewrite.ExecutionContext; +import org.openrewrite.Option; +import org.openrewrite.Recipe; +import org.openrewrite.TreeVisitor; import org.openrewrite.internal.lang.Nullable; -import org.openrewrite.xml.AddToTagVisitor; -import org.openrewrite.xml.ChangeTagValueVisitor; -import org.openrewrite.xml.TagNameComparator; import org.openrewrite.xml.tree.Xml; import java.util.Optional; @@ -71,63 +71,32 @@ public String getDescription() { @Override public TreeVisitor getVisitor() { - return new AddPropertyVisitor( - key.replace("${", "").replace("}", ""), value, preserveExistingValue, trustParent); - } -} - -@Value -@EqualsAndHashCode(callSuper = false) -class AddPropertyVisitor extends MavenIsoVisitor { - String key; - String value; - @Nullable Boolean preserveExistingValue; - @Nullable Boolean trustParent; - - @Override - public Xml.Document visitDocument(Xml.Document document, ExecutionContext ctx) { - String parentValue = getResolutionResult().getPom().getRequested().getProperties().get(key); - if ((Boolean.TRUE.equals(trustParent) && (parentValue == null || value.equals(parentValue))) - || value.equals(getResolutionResult().getPom().getProperties().get(key))) { - return document; - } - - // If there is a parent pom in the same project, update the property there instead - if (document.getRoot().getChild("parent") - .flatMap(tag -> tag.getChild("relativePath")) - .flatMap(Xml.Tag::getValue) - .isPresent()) { - if (Boolean.TRUE.equals(preserveExistingValue)) { - return document; + final String keyToReplace = key.replace("${", "").replace("}", ""); + return new MavenIsoVisitor() { + public Xml.Document visitDocument(Xml.Document document, ExecutionContext ctx) { + String parentValue = getResolutionResult().getPom().getRequested().getProperties().get(key); + if ((Boolean.TRUE.equals(trustParent) && (parentValue == null || value.equals(parentValue))) + || value.equals(getResolutionResult().getPom().getProperties().get(key))) { + return document; + } + + // If there is a parent pom in the same project, update the property there instead + if (document.getRoot().getChild("parent") + .flatMap(tag -> tag.getChild("relativePath")) + .flatMap(Xml.Tag::getValue) + .flatMap(v -> v.trim().isEmpty() ? Optional.empty() : Optional.of(v)) + .isPresent()) { + if (Boolean.TRUE.equals(preserveExistingValue)) { + return document; + } + // If the property is expected to be in the parent, there's no need for it in the child pom + return (Xml.Document) new RemoveProperty(key).getVisitor() + .visitNonNull(document, ctx); + } + return (Xml.Document) new AddPropertyVisitor(keyToReplace, value, preserveExistingValue) + .visitNonNull(document, ctx); } - // If the property is expected to be in the parent, there's no need for it in the child pom - return (Xml.Document) new RemoveProperty(key).getVisitor() - .visitNonNull(document, ctx); - } - - Xml.Document d = super.visitDocument(document, ctx); - Xml.Tag root = d.getRoot(); - Optional properties = root.getChild("properties"); - if (!properties.isPresent()) { - Xml.Tag propertiesTag = Xml.Tag.build("\n<" + key + ">" + value + "\n"); - d = (Xml.Document) new AddToTagVisitor(root, propertiesTag, new MavenTagInsertionComparator(root.getChildren())).visitNonNull(d, ctx); - } else if (!properties.get().getChildValue(key).isPresent()) { - Xml.Tag propertyTag = Xml.Tag.build("<" + key + ">" + value + ""); - d = (Xml.Document) new AddToTagVisitor<>(properties.get(), propertyTag, new TagNameComparator()).visitNonNull(d, ctx); - } - if (d != document) { - maybeUpdateModel(); - } - return d; - } - - @Override - public Xml.Tag visitTag(Xml.Tag tag, ExecutionContext ctx) { - if (!Boolean.TRUE.equals(preserveExistingValue) - && isPropertyTag() && key.equals(tag.getName()) - && !value.equals(tag.getValue().orElse(null))) { - doAfterVisit(new ChangeTagValueVisitor<>(tag, value)); - } - return super.visitTag(tag, ctx); + }; } } + diff --git a/rewrite-maven/src/main/java/org/openrewrite/maven/AddPropertyVisitor.java b/rewrite-maven/src/main/java/org/openrewrite/maven/AddPropertyVisitor.java new file mode 100644 index 00000000000..10f894fb52b --- /dev/null +++ b/rewrite-maven/src/main/java/org/openrewrite/maven/AddPropertyVisitor.java @@ -0,0 +1,63 @@ +/* + * Copyright 2022 the original author or authors. + *

+ * Licensed 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 + *

+ * https://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.openrewrite.maven; + +import lombok.EqualsAndHashCode; +import lombok.Value; +import org.openrewrite.ExecutionContext; +import org.openrewrite.internal.lang.Nullable; +import org.openrewrite.xml.AddToTagVisitor; +import org.openrewrite.xml.ChangeTagValueVisitor; +import org.openrewrite.xml.TagNameComparator; +import org.openrewrite.xml.tree.Xml; + +import java.util.Optional; + +@Value +@EqualsAndHashCode(callSuper = false) +public class AddPropertyVisitor extends MavenIsoVisitor { + String key; + String value; + @Nullable Boolean preserveExistingValue; + + @Override + public Xml.Document visitDocument(Xml.Document document, ExecutionContext ctx) { + Xml.Document d = super.visitDocument(document, ctx); + Xml.Tag root = d.getRoot(); + Optional properties = root.getChild("properties"); + if (!properties.isPresent()) { + Xml.Tag propertiesTag = Xml.Tag.build("\n<" + key + ">" + value + "\n"); + d = (Xml.Document) new AddToTagVisitor(root, propertiesTag, new MavenTagInsertionComparator(root.getChildren())).visitNonNull(d, ctx); + } else if (!properties.get().getChildValue(key).isPresent()) { + Xml.Tag propertyTag = Xml.Tag.build("<" + key + ">" + value + ""); + d = (Xml.Document) new AddToTagVisitor<>(properties.get(), propertyTag, new TagNameComparator()).visitNonNull(d, ctx); + } + if (d != document) { + maybeUpdateModel(); + } + return d; + } + + @Override + public Xml.Tag visitTag(Xml.Tag tag, ExecutionContext ctx) { + if (!Boolean.TRUE.equals(preserveExistingValue) + && isPropertyTag() && key.equals(tag.getName()) + && !value.equals(tag.getValue().orElse(null))) { + doAfterVisit(new ChangeTagValueVisitor<>(tag, value)); + } + return super.visitTag(tag, ctx); + } +} diff --git a/rewrite-maven/src/test/java/org/openrewrite/maven/AddPropertyTest.java b/rewrite-maven/src/test/java/org/openrewrite/maven/AddPropertyTest.java index 0c07e059b4c..f1b3c4feda3 100644 --- a/rewrite-maven/src/test/java/org/openrewrite/maven/AddPropertyTest.java +++ b/rewrite-maven/src/test/java/org/openrewrite/maven/AddPropertyTest.java @@ -163,6 +163,115 @@ void trustParent() { ); } + @Test + void ifRemoteParentIsDefined() { + rewriteRun( + pomXml( + """ + + + org.springframework.boot + spring-boot-starter-parent + 3.2.2 + + com.mycompany.app + my-parent + 1 + + """,""" + + + org.springframework.boot + spring-boot-starter-parent + 3.2.2 + + com.mycompany.app + my-parent + 1 + + value + + + """ + + ) + ); + } + + @Test + void ifRemoteParentIsDefined_2() { + rewriteRun( + pomXml( + """ + + + org.springframework.boot + spring-boot-starter-parent + 3.2.2 + + + com.mycompany.app + my-parent + 1 + + """,""" + + + org.springframework.boot + spring-boot-starter-parent + 3.2.2 + + + com.mycompany.app + my-parent + 1 + + value + + + """ + + ) + ); + } + + @Test + void ifRemoteParentIsDefined_3() { + rewriteRun( + pomXml( + """ + + + org.springframework.boot + spring-boot-starter-parent + 3.2.2 + + + com.mycompany.app + my-parent + 1 + + """,""" + + + org.springframework.boot + spring-boot-starter-parent + 3.2.2 + + + com.mycompany.app + my-parent + 1 + + value + + + """ + + ) + ); + } + @DocumentExample @Test void addFirstProperty() {