Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -173,7 +173,6 @@ public Validated<Object> validate() {

public static class Accumulator {
@Nullable MavenResolutionResult updatedRootMarker;
@Nullable MavenDownloadingException scannerException;
final Map<ResolvedGroupArtifactVersion, MavenResolutionResult> gavToOriginalMarker = new HashMap<>();
final Map<ResolvedGroupArtifactVersion, MavenResolutionResult> gavToNewMarker = new HashMap<>();

Expand Down Expand Up @@ -296,20 +295,33 @@ public Xml.Document visitDocument(Xml.Document document, ExecutionContext ctx) {
return document;
}

// Pre-compute the updated MavenResolutionResult with the new parent info
// Pre-compute the updated MavenResolutionResult with the new parent info.
// Attempt a deep resolve so that descendant pom markers can reflect the new
// parent's dependencyManagement. If the deep resolve fails (for instance,
// the new parent's dependencyManagement references properties whose names or
// values only become valid after the visitor — or a prior recipe such as
// RenamePropertyKey — edits the XML), fall back to a shallow marker that
// just swaps in the new parent reference. Each pom's marker is re-resolved
// later by `maybeUpdateModel` once the XML edits land.
Parent updatedParentRef = new Parent(
new GroupArtifactVersion(targetGroupId, targetArtifactId, targetVersion.get()),
targetRelativePath
);
Pom updatedPom = mrr.getPom().getRequested().withParent(updatedParentRef);
ResolvedPom updatedResolvedPom = mrr.getPom()
.withRequested(updatedPom)
.resolve(ctx, new MavenPomDownloader(
mrr.getProjectPoms(), ctx, mrr.getMavenSettings(), mrr.getActiveProfiles()));
ResolvedPom updatedResolvedPom;
try {
updatedResolvedPom = mrr.getPom()
.withRequested(updatedPom)
.resolve(ctx, new MavenPomDownloader(
mrr.getProjectPoms(), ctx, mrr.getMavenSettings(), mrr.getActiveProfiles()));
} catch (MavenDownloadingException deepResolveFailure) {
updatedResolvedPom = mrr.getPom().withRequested(updatedPom);
}
acc.updatedRootMarker = mrr.withPom(updatedResolvedPom);
}
} catch (MavenDownloadingException e) {
acc.scannerException = e;
} catch (MavenDownloadingException ignored) {
// Metadata download failure for the new parent's version metadata — the
// visitor's own resolve will surface this as a warning on the parent tag.
}
}
return document;
Expand Down Expand Up @@ -466,9 +478,6 @@ public Xml.Tag visitTag(Xml.Tag tag, ExecutionContext ctx) {
}
return e.warn(tag);
}
if (acc.scannerException != null) {
t = acc.scannerException.warn(t);
}
}
}
return t;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,11 @@
import org.openrewrite.test.RewriteTest;

import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import static org.assertj.core.api.Assertions.assertThat;
import static org.openrewrite.java.Assertions.mavenProject;
import static org.openrewrite.maven.Assertions.pomXml;

class UpgradeParentVersionTest implements RewriteTest {
Expand Down Expand Up @@ -302,4 +306,72 @@ void upgradeParentWithCIFriendlyVersionsAndNullProperty() {
)
);
}

@Test
void jacksonBomVersionRename() {
rewriteRun(
spec -> spec.recipes(
new RenamePropertyKey(
"jackson-bom.version",
"jackson-2-bom.version"
),
new UpgradeParentVersion(
"org.springframework.boot",
"spring-boot-starter-parent",
"4.0.X",
null,
null)),
mavenProject("jackson-bom-rename-demo",
pomXml(
"""
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>3.4.0</version>
<relativePath/>
</parent>
<groupId>com.example</groupId>
<artifactId>demo</artifactId>
<version>0.0.1-SNAPSHOT</version>
<properties>
<java.version>17</java.version>
<jackson-bom.version>2.21.2</jackson-bom.version>
</properties>
</project>
""",
spec -> spec.after(pom -> {
Matcher version = Pattern.compile("spring-boot-starter-parent</artifactId>\\s*<version>(4\\.0\\.\\d+(?:-[\\w\\.]+)?)</version>").matcher(pom);
assertThat(version.find()).describedAs("Expected Spring Boot 4.0.x parent in %s", pom).isTrue();

//language=xml
return String.format("""
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>%s</version>
<relativePath/>
</parent>
<groupId>com.example</groupId>
<artifactId>demo</artifactId>
<version>0.0.1-SNAPSHOT</version>
<properties>
<java.version>17</java.version>
<jackson-2-bom.version>2.21.2</jackson-2-bom.version>
</properties>
</project>
""", version.group(1));
})
)
)
);
}

}