Skip to content
Merged
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
1 change: 1 addition & 0 deletions rewrite-core/src/main/java/org/openrewrite/Tree.java
Original file line number Diff line number Diff line change
Expand Up @@ -134,6 +134,7 @@ default <T2 extends Tree> T2 safeCast() {
@SuppressWarnings("unchecked")
default <T extends Tree> T withException(Throwable throwable, @Nullable ExecutionContext ctx) {
if (ctx != null) {
ctx.getOnError().accept(throwable);
ctx.putMessage(Recipe.PANIC, "true");
}
RecipeRunException rre;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,9 @@
import org.openrewrite.*;
import org.openrewrite.internal.ListUtils;
import org.openrewrite.internal.lang.Nullable;
import org.openrewrite.maven.internal.MavenDownloadingException;
import org.openrewrite.maven.tree.*;
import org.openrewrite.semver.LatestPatch;
import org.openrewrite.semver.Semver;
import org.openrewrite.semver.VersionComparator;
import org.openrewrite.xml.AddToTagVisitor;
Expand Down Expand Up @@ -140,105 +142,124 @@ public Xml.Document visitDocument(Xml.Document document, ExecutionContext ctx) {
@Override
public Xml.Tag visitTag(Xml.Tag tag, ExecutionContext ctx) {
Xml.Tag t = super.visitTag(tag, ctx);
if (isDependencyTag(groupId, artifactId)) {

ResolvedDependency d = findDependency(tag);
if (d != null && d.getRepository() != null) {
//If the resolved dependency exists AND it does not represent an artifact that was parsed
//as a source file, attempt to find a new version.
String newerVersion = findNewerVersion(d.getGroupId(), d.getArtifactId(), d.getVersion(), ctx);
if (newerVersion != null) {
ResolvedManagedDependency dm = findManagedDependency(t);
if (dm != null) {
String requestedVersion = dm.getRequested().getVersion();
if (requestedVersion.startsWith("${")) {
doAfterVisit(new ChangePropertyValue(requestedVersion.substring(2, requestedVersion.length() - 1), newerVersion, overrideManagedVersion, false));
return t;
try {
if (isDependencyTag(groupId, artifactId)) {

ResolvedDependency d = findDependency(tag);
if (d != null && d.getRepository() != null) {
//If the resolved dependency exists AND it does not represent an artifact that was parsed
//as a source file, attempt to find a new version.
String newerVersion = findNewerVersion(d.getGroupId(), d.getArtifactId(), d.getVersion(), ctx);
if (newerVersion != null) {
ResolvedManagedDependency dm = findManagedDependency(t);
if (dm != null) {
String requestedVersion = dm.getRequested().getVersion();
if (requestedVersion.startsWith("${")) {
doAfterVisit(new ChangePropertyValue(requestedVersion.substring(2, requestedVersion.length() - 1), newerVersion, overrideManagedVersion, false));
return t;
}
}
}

Optional<Xml.Tag> version = t.getChild("version");
if (version.isPresent()) {
String requestedVersion = d.getRequested().getVersion();
if (requestedVersion != null && requestedVersion.startsWith("${")) {
doAfterVisit(new ChangePropertyValue(requestedVersion.substring(2, requestedVersion.length() - 1), newerVersion, overrideManagedVersion, false));
return t;
Optional<Xml.Tag> version = t.getChild("version");
if (version.isPresent()) {
String requestedVersion = d.getRequested().getVersion();
if (requestedVersion != null && requestedVersion.startsWith("${")) {
doAfterVisit(new ChangePropertyValue(requestedVersion.substring(2, requestedVersion.length() - 1), newerVersion, overrideManagedVersion, false));
return t;
}
t = (Xml.Tag) new ChangeTagValueVisitor<>(version.get(), newerVersion).visitNonNull(t, 0, getCursor());
} else if (Boolean.TRUE.equals(overrideManagedVersion)) {
//If the version is not present and the override managed version is set, add a new, explicit version tag.
Xml.Tag versionTag = Xml.Tag.build("<version>" + newerVersion + "</version>");
//noinspection ConstantConditions
t = (Xml.Tag) new AddToTagVisitor<ExecutionContext>(t, versionTag, new MavenTagInsertionComparator(t.getChildren())).visitNonNull(t, ctx, getCursor().getParent());
}
t = (Xml.Tag) new ChangeTagValueVisitor<Integer>(version.get(), newerVersion).visitNonNull(t, 0, getCursor());
} else if (Boolean.TRUE.equals(overrideManagedVersion)) {
//If the version is not present and the override managed version is set, add a new, explicit version tag.
Xml.Tag versionTag = Xml.Tag.build("<version>" + newerVersion + "</version>");
//noinspection ConstantConditions
t = (Xml.Tag) new AddToTagVisitor<ExecutionContext>(t, versionTag, new MavenTagInsertionComparator(t.getChildren())).visitNonNull(t, ctx, getCursor().getParent());
}
}
}
} else if (isManagedDependencyTag(groupId, artifactId)) {
} else if (isManagedDependencyTag(groupId, artifactId)) {

ResolvedManagedDependency matchedManagedDependency = findManagedDependency(t);
if (matchedManagedDependency != null) {
if (!projectArtifacts.contains(new GroupArtifact(matchedManagedDependency.getGroupId(), matchedManagedDependency.getArtifactId())) &&
matchesGlob(matchedManagedDependency.getGroupId(), groupId) && matchesGlob(matchedManagedDependency.getArtifactId(), artifactId)) {
ResolvedManagedDependency matchedManagedDependency = findManagedDependency(t);
if (matchedManagedDependency != null) {
if (!projectArtifacts.contains(new GroupArtifact(matchedManagedDependency.getGroupId(), matchedManagedDependency.getArtifactId())) &&
matchesGlob(matchedManagedDependency.getGroupId(), groupId) && matchesGlob(matchedManagedDependency.getArtifactId(), artifactId)) {

String requestedVersion = matchedManagedDependency.getRequested().getVersion();
assert (matchedManagedDependency.getVersion() != null);
String newerVersion = findNewerVersion(matchedManagedDependency.getGroupId(), matchedManagedDependency.getArtifactId(), matchedManagedDependency.getVersion(), ctx);
if (newerVersion != null) {
if (requestedVersion.startsWith("${")) {
doAfterVisit(new ChangePropertyValue(requestedVersion.substring(2, requestedVersion.length() - 1), newerVersion, overrideManagedVersion, false));
return t;
}
Xml.Tag childVersionTag = t.getChild("version").orElse(null);
if (childVersionTag != null) {
t = (Xml.Tag) new ChangeTagValueVisitor<Integer>(childVersionTag, newerVersion).visitNonNull(t, 0, getCursor());
String requestedVersion = matchedManagedDependency.getRequested().getVersion();
assert (matchedManagedDependency.getVersion() != null);
String newerVersion = findNewerVersion(matchedManagedDependency.getGroupId(), matchedManagedDependency.getArtifactId(), matchedManagedDependency.getVersion(), ctx);
if (newerVersion != null) {
if (requestedVersion.startsWith("${")) {
doAfterVisit(new ChangePropertyValue(requestedVersion.substring(2, requestedVersion.length() - 1), newerVersion, overrideManagedVersion, false));
return t;
}
Xml.Tag childVersionTag = t.getChild("version").orElse(null);
if (childVersionTag != null) {
t = (Xml.Tag) new ChangeTagValueVisitor<Integer>(childVersionTag, newerVersion).visitNonNull(t, 0, getCursor());
}
}
}
}
} else {
for (ResolvedManagedDependency dm : getResolutionResult().getPom().getDependencyManagement()) {
if (dm.getBomGav() != null) {
String tagGroup = getResolutionResult().getPom().getValue(tag.getChildValue("groupId").orElse(getResolutionResult().getPom().getGroupId()));
String tagArtifactId = getResolutionResult().getPom().getValue(tag.getChildValue("artifactId").orElse(""));

if (!projectArtifacts.contains(new GroupArtifact(tagGroup, tagArtifactId))) {
ResolvedGroupArtifactVersion bom = dm.getBomGav();

if (tagGroup != null && tagArtifactId != null && tagGroup.equals(bom.getGroupId()) && tagArtifactId.equals(bom.getArtifactId())) {

//noinspection ConstantConditions
String requestedVersion = dm.getRequestedBom().getVersion();
String newerVersion = findNewerVersion(bom.getGroupId(), bom.getArtifactId(), bom.getVersion(), ctx);
if (newerVersion != null) {
if (requestedVersion.startsWith("${")) {
doAfterVisit(new ChangePropertyValue(requestedVersion.substring(2, requestedVersion.length() - 1), newerVersion, overrideManagedVersion, false));
return t;
}
Xml.Tag childVersionTag = t.getChild("version").orElse(null);
if (childVersionTag != null) {
t = (Xml.Tag) new ChangeTagValueVisitor<Integer>(childVersionTag, newerVersion).visitNonNull(t, 0, getCursor());
} else {
for (ResolvedManagedDependency dm : getResolutionResult().getPom().getDependencyManagement()) {
if (dm.getBomGav() != null) {
String tagGroup = getResolutionResult().getPom().getValue(tag.getChildValue("groupId").orElse(getResolutionResult().getPom().getGroupId()));
String tagArtifactId = getResolutionResult().getPom().getValue(tag.getChildValue("artifactId").orElse(""));

if (!projectArtifacts.contains(new GroupArtifact(tagGroup, tagArtifactId))) {
ResolvedGroupArtifactVersion bom = dm.getBomGav();

if (tagGroup != null && tagArtifactId != null && tagGroup.equals(bom.getGroupId()) && tagArtifactId.equals(bom.getArtifactId())) {

//noinspection ConstantConditions
String requestedVersion = dm.getRequestedBom().getVersion();
String newerVersion = findNewerVersion(bom.getGroupId(), bom.getArtifactId(), bom.getVersion(), ctx);
if (newerVersion != null) {
if (requestedVersion.startsWith("${")) {
doAfterVisit(new ChangePropertyValue(requestedVersion.substring(2, requestedVersion.length() - 1), newerVersion, overrideManagedVersion, false));
return t;
}
Xml.Tag childVersionTag = t.getChild("version").orElse(null);
if (childVersionTag != null) {
t = (Xml.Tag) new ChangeTagValueVisitor<Integer>(childVersionTag, newerVersion).visitNonNull(t, 0, getCursor());
}
}
break;
}
break;
}
}
}
}
}
} catch (MavenDownloadingException exception) {
return t.withException(exception, ctx);
}
return t;
}

@Nullable
private String findNewerVersion(String groupId, String artifactId, String version, ExecutionContext ctx) {

MavenMetadata mavenMetadata = downloadMetadata(groupId, artifactId, ctx);
List<String> versions = new ArrayList<>();
for (String v : mavenMetadata.getVersioning().getVersions()) {
if (versionComparator.isValid(version, v)) {
versions.add(v);
if (versionComparator instanceof LatestPatch) {
//In the case of latest patch, a new version can only be derived if the current version is a semantic
//version. Check if the current version is valid candidate before attempting to download metadata.
if (!versionComparator.isValid(version, version)) {
return null;
}
}

try {
MavenMetadata mavenMetadata = downloadMetadata(groupId, artifactId, ctx);
List<String> versions = new ArrayList<>();
for (String v : mavenMetadata.getVersioning().getVersions()) {
if (versionComparator.isValid(version, v)) {
versions.add(v);
}
}
return versionComparator.upgrade(version, versions).orElse(null);
} catch (IllegalStateException e) {
//This can happen when we encounter exotic versions. Pass the error to the error handler and
//in the spirit of "do no harm", return null.
ctx.getOnError().accept(e);
return null;
}
return versionComparator.upgrade(version, versions).orElse(null);
}
}
}