diff --git a/rewrite-maven/src/main/java/org/openrewrite/maven/MavenVisitor.java b/rewrite-maven/src/main/java/org/openrewrite/maven/MavenVisitor.java index 0bca82c31b5..3a06aa994ca 100644 --- a/rewrite-maven/src/main/java/org/openrewrite/maven/MavenVisitor.java +++ b/rewrite-maven/src/main/java/org/openrewrite/maven/MavenVisitor.java @@ -35,8 +35,11 @@ public class MavenVisitor

extends XmlVisitor

{ static final XPathMatcher DEPENDENCY_MATCHER = new XPathMatcher("/project/dependencies/dependency"); + static final XPathMatcher PROFILE_DEPENDENCY_MATCHER = new XPathMatcher("/project/profiles/profile/dependencies/dependency"); static final XPathMatcher PLUGIN_DEPENDENCY_MATCHER = new XPathMatcher("//plugins/plugin/dependencies/dependency"); + static final XPathMatcher PROFILE_PLUGIN_DEPENDENCY_MATCHER = new XPathMatcher("/project/profiles/profile/build/plugins/plugin/dependencies/dependency"); static final XPathMatcher MANAGED_DEPENDENCY_MATCHER = new XPathMatcher("/project/dependencyManagement/dependencies/dependency"); + static final XPathMatcher PROFILE_MANAGED_DEPENDENCY_MATCHER = new XPathMatcher("/project/profiles/profile/dependencyManagement/dependencies/dependency"); static final XPathMatcher PROPERTY_MATCHER = new XPathMatcher("/project/properties/*"); static final XPathMatcher PLUGIN_MATCHER = new XPathMatcher("//plugins/plugin"); static final XPathMatcher PARENT_MATCHER = new XPathMatcher("/project/parent"); @@ -61,9 +64,9 @@ public boolean isAcceptable(SourceFile sourceFile, P p) { protected MavenResolutionResult getResolutionResult() { Iterator itr = getCursor() .getPath(Xml.Document.class::isInstance); - if(itr.hasNext()) { + if (itr.hasNext()) { Xml.Document newDocument = (Xml.Document) itr.next(); - if(document != null && document != newDocument) { + if (document != null && document != newDocument) { throw new IllegalStateException( "The same MavenVisitor instance has been used on two different XML documents. " + "This violates the Recipe contract that they will return a unique visitor instance every time getVisitor() is called."); @@ -96,6 +99,11 @@ public boolean isDependencyTag() { */ public boolean isDependencyTag(String groupId, String artifactId) { if (!isDependencyTag()) { + if (isTag("dependency") && PROFILE_DEPENDENCY_MATCHER.matches(getCursor())) { + Xml.Tag tag = getCursor().getValue(); + return matchesGlob(tag.getChildValue("groupId").orElse(null), groupId) && + matchesGlob(tag.getChildValue("artifactId").orElse(null), artifactId); + } return false; } Xml.Tag tag = getCursor().getValue(); @@ -132,7 +140,9 @@ public boolean isDependencyTag(String groupId, String artifactId) { } public boolean isPluginDependencyTag(String groupId, String artifactId) { - if (!PLUGIN_DEPENDENCY_MATCHER.matches(getCursor())) { + if (!isTag("dependency") || + !PLUGIN_DEPENDENCY_MATCHER.matches(getCursor()) && + !PROFILE_PLUGIN_DEPENDENCY_MATCHER.matches(getCursor())) { return false; } Xml.Tag tag = getCursor().getValue(); @@ -153,6 +163,11 @@ public boolean isManagedDependencyTag() { */ public boolean isManagedDependencyTag(String groupId, String artifactId) { if (!isManagedDependencyTag()) { + if (isTag("dependency") && PROFILE_MANAGED_DEPENDENCY_MATCHER.matches(getCursor())) { + Xml.Tag tag = getCursor().getValue(); + return matchesGlob(tag.getChildValue("groupId").orElse(null), groupId) && + matchesGlob(tag.getChildValue("artifactId").orElse(null), artifactId); + } return false; } Xml.Tag tag = getCursor().getValue(); diff --git a/rewrite-maven/src/test/java/org/openrewrite/maven/ChangeDependencyGroupIdAndArtifactIdTest.java b/rewrite-maven/src/test/java/org/openrewrite/maven/ChangeDependencyGroupIdAndArtifactIdTest.java index ed923a7ced6..c161d490a51 100644 --- a/rewrite-maven/src/test/java/org/openrewrite/maven/ChangeDependencyGroupIdAndArtifactIdTest.java +++ b/rewrite-maven/src/test/java/org/openrewrite/maven/ChangeDependencyGroupIdAndArtifactIdTest.java @@ -147,6 +147,64 @@ void changeManagedDependencyGroupIdAndArtifactId() { ); } + @Test + void changeProfileManagedDependencyGroupIdAndArtifactId() { + rewriteRun( + spec -> spec.recipe(new ChangeDependencyGroupIdAndArtifactId( + "javax.activation", + "javax.activation-api", + "jakarta.activation", + "jakarta.activation-api", + "2.1.0", + null + )), + pomXml( + """ + + 4.0.0 + com.mycompany.app + my-app + 1 + + + + + + javax.activation + javax.activation-api + 1.2.0 + + + + + + + """, + """ + + 4.0.0 + com.mycompany.app + my-app + 1 + + + + + + jakarta.activation + jakarta.activation-api + 2.1.0 + + + + + + + """ + ) + ); + } + @Test @Issue("https://github.com/openrewrite/rewrite-java-dependencies/issues/55") void requireNewGroupIdOrNewArtifactId() { @@ -1135,4 +1193,58 @@ void changeGroupIdOnWildcardArtifacts() { ) ); } + + @Test + void changeProfileDependencyGroupIdAndArtifactId() { + rewriteRun( + spec -> spec.recipe(new ChangeDependencyGroupIdAndArtifactId( + "javax.activation", + "javax.activation-api", + "jakarta.activation", + "jakarta.activation-api", + "2.1.0", + null + )), + pomXml( + """ + + 4.0.0 + com.mycompany.app + my-app + 1 + + + + + javax.activation + javax.activation-api + 1.2.0 + + + + + + """, + """ + + 4.0.0 + com.mycompany.app + my-app + 1 + + + + + jakarta.activation + jakarta.activation-api + 2.1.0 + + + + + + """ + ) + ); + } } diff --git a/rewrite-maven/src/test/java/org/openrewrite/maven/ChangeManagedDependencyGroupIdAndArtifactIdTest.java b/rewrite-maven/src/test/java/org/openrewrite/maven/ChangeManagedDependencyGroupIdAndArtifactIdTest.java index 5006e8412c0..b1458dda26d 100644 --- a/rewrite-maven/src/test/java/org/openrewrite/maven/ChangeManagedDependencyGroupIdAndArtifactIdTest.java +++ b/rewrite-maven/src/test/java/org/openrewrite/maven/ChangeManagedDependencyGroupIdAndArtifactIdTest.java @@ -128,7 +128,7 @@ void changeManagedDependencyWithDynamicVersion() { } @Test - void latestPatch() { + void latestPatchMangedDependency() { rewriteRun( spec -> spec.recipe(new ChangeManagedDependencyGroupIdAndArtifactId( "javax.activation", @@ -176,4 +176,61 @@ void latestPatch() { ) ); } + + @Test + void changeProfileManagedDependencyGroupIdAndArtifactId() { + rewriteRun( + spec -> spec.recipe(new ChangeManagedDependencyGroupIdAndArtifactId( + "javax.activation", + "javax.activation-api", + "jakarta.activation", + "jakarta.activation-api", + "2.1.0" + )), + pomXml( + """ + + 4.0.0 + com.mycompany.app + my-app + 1 + + + + + + javax.activation + javax.activation-api + 1.2.0 + + + + + + + """, + """ + + 4.0.0 + com.mycompany.app + my-app + 1 + + + + + + jakarta.activation + jakarta.activation-api + 2.1.0 + + + + + + + """ + ) + ); + } }