diff --git a/rewrite-core/src/main/java/org/openrewrite/Tree.java b/rewrite-core/src/main/java/org/openrewrite/Tree.java index e7797b0ab7d..939acfc17e3 100644 --- a/rewrite-core/src/main/java/org/openrewrite/Tree.java +++ b/rewrite-core/src/main/java/org/openrewrite/Tree.java @@ -134,6 +134,7 @@ default T2 safeCast() { @SuppressWarnings("unchecked") default T withException(Throwable throwable, @Nullable ExecutionContext ctx) { if (ctx != null) { + ctx.getOnError().accept(throwable); ctx.putMessage(Recipe.PANIC, "true"); } RecipeRunException rre; diff --git a/rewrite-maven/src/main/java/org/openrewrite/maven/UpgradeDependencyVersion.java b/rewrite-maven/src/main/java/org/openrewrite/maven/UpgradeDependencyVersion.java index 6314d2a7b1f..875714f1cb0 100755 --- a/rewrite-maven/src/main/java/org/openrewrite/maven/UpgradeDependencyVersion.java +++ b/rewrite-maven/src/main/java/org/openrewrite/maven/UpgradeDependencyVersion.java @@ -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; @@ -140,90 +142,94 @@ 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 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 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("" + newerVersion + ""); + //noinspection ConstantConditions + t = (Xml.Tag) new AddToTagVisitor(t, versionTag, new MavenTagInsertionComparator(t.getChildren())).visitNonNull(t, ctx, getCursor().getParent()); } - 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("" + newerVersion + ""); - //noinspection ConstantConditions - t = (Xml.Tag) new AddToTagVisitor(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(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(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(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(childVersionTag, newerVersion).visitNonNull(t, 0, getCursor()); + } } + break; } - break; } } } } } + } catch (MavenDownloadingException exception) { + return t.withException(exception, ctx); } return t; } @@ -231,14 +237,29 @@ public Xml.Tag visitTag(Xml.Tag tag, ExecutionContext ctx) { @Nullable private String findNewerVersion(String groupId, String artifactId, String version, ExecutionContext ctx) { - MavenMetadata mavenMetadata = downloadMetadata(groupId, artifactId, ctx); - List 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 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); } } }