Skip to content

Commit 91f66c6

Browse files
authored
Failure to download metadata during UpgradeDependencyVersion should embed the exception and continue processing the pom file. (#2207)
* Configuration for how failures in UpgradeDependencyVersion should be handled * Add warnings when metadata cannot be downloaded * Leverage wither to add downloading exceptions. Co-authored-by: Tyler Van Gorder <tkvangorder@users.noreply.github.com>
1 parent 1d0500f commit 91f66c6

2 files changed

Lines changed: 96 additions & 74 deletions

File tree

rewrite-core/src/main/java/org/openrewrite/Tree.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -134,6 +134,7 @@ default <T2 extends Tree> T2 safeCast() {
134134
@SuppressWarnings("unchecked")
135135
default <T extends Tree> T withException(Throwable throwable, @Nullable ExecutionContext ctx) {
136136
if (ctx != null) {
137+
ctx.getOnError().accept(throwable);
137138
ctx.putMessage(Recipe.PANIC, "true");
138139
}
139140
RecipeRunException rre;

rewrite-maven/src/main/java/org/openrewrite/maven/UpgradeDependencyVersion.java

Lines changed: 95 additions & 74 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,9 @@
2020
import org.openrewrite.*;
2121
import org.openrewrite.internal.ListUtils;
2222
import org.openrewrite.internal.lang.Nullable;
23+
import org.openrewrite.maven.internal.MavenDownloadingException;
2324
import org.openrewrite.maven.tree.*;
25+
import org.openrewrite.semver.LatestPatch;
2426
import org.openrewrite.semver.Semver;
2527
import org.openrewrite.semver.VersionComparator;
2628
import org.openrewrite.xml.AddToTagVisitor;
@@ -140,105 +142,124 @@ public Xml.Document visitDocument(Xml.Document document, ExecutionContext ctx) {
140142
@Override
141143
public Xml.Tag visitTag(Xml.Tag tag, ExecutionContext ctx) {
142144
Xml.Tag t = super.visitTag(tag, ctx);
143-
if (isDependencyTag(groupId, artifactId)) {
144-
145-
ResolvedDependency d = findDependency(tag);
146-
if (d != null && d.getRepository() != null) {
147-
//If the resolved dependency exists AND it does not represent an artifact that was parsed
148-
//as a source file, attempt to find a new version.
149-
String newerVersion = findNewerVersion(d.getGroupId(), d.getArtifactId(), d.getVersion(), ctx);
150-
if (newerVersion != null) {
151-
ResolvedManagedDependency dm = findManagedDependency(t);
152-
if (dm != null) {
153-
String requestedVersion = dm.getRequested().getVersion();
154-
if (requestedVersion.startsWith("${")) {
155-
doAfterVisit(new ChangePropertyValue(requestedVersion.substring(2, requestedVersion.length() - 1), newerVersion, overrideManagedVersion, false));
156-
return t;
145+
try {
146+
if (isDependencyTag(groupId, artifactId)) {
147+
148+
ResolvedDependency d = findDependency(tag);
149+
if (d != null && d.getRepository() != null) {
150+
//If the resolved dependency exists AND it does not represent an artifact that was parsed
151+
//as a source file, attempt to find a new version.
152+
String newerVersion = findNewerVersion(d.getGroupId(), d.getArtifactId(), d.getVersion(), ctx);
153+
if (newerVersion != null) {
154+
ResolvedManagedDependency dm = findManagedDependency(t);
155+
if (dm != null) {
156+
String requestedVersion = dm.getRequested().getVersion();
157+
if (requestedVersion.startsWith("${")) {
158+
doAfterVisit(new ChangePropertyValue(requestedVersion.substring(2, requestedVersion.length() - 1), newerVersion, overrideManagedVersion, false));
159+
return t;
160+
}
157161
}
158-
}
159162

160-
Optional<Xml.Tag> version = t.getChild("version");
161-
if (version.isPresent()) {
162-
String requestedVersion = d.getRequested().getVersion();
163-
if (requestedVersion != null && requestedVersion.startsWith("${")) {
164-
doAfterVisit(new ChangePropertyValue(requestedVersion.substring(2, requestedVersion.length() - 1), newerVersion, overrideManagedVersion, false));
165-
return t;
163+
Optional<Xml.Tag> version = t.getChild("version");
164+
if (version.isPresent()) {
165+
String requestedVersion = d.getRequested().getVersion();
166+
if (requestedVersion != null && requestedVersion.startsWith("${")) {
167+
doAfterVisit(new ChangePropertyValue(requestedVersion.substring(2, requestedVersion.length() - 1), newerVersion, overrideManagedVersion, false));
168+
return t;
169+
}
170+
t = (Xml.Tag) new ChangeTagValueVisitor<>(version.get(), newerVersion).visitNonNull(t, 0, getCursor());
171+
} else if (Boolean.TRUE.equals(overrideManagedVersion)) {
172+
//If the version is not present and the override managed version is set, add a new, explicit version tag.
173+
Xml.Tag versionTag = Xml.Tag.build("<version>" + newerVersion + "</version>");
174+
//noinspection ConstantConditions
175+
t = (Xml.Tag) new AddToTagVisitor<ExecutionContext>(t, versionTag, new MavenTagInsertionComparator(t.getChildren())).visitNonNull(t, ctx, getCursor().getParent());
166176
}
167-
t = (Xml.Tag) new ChangeTagValueVisitor<Integer>(version.get(), newerVersion).visitNonNull(t, 0, getCursor());
168-
} else if (Boolean.TRUE.equals(overrideManagedVersion)) {
169-
//If the version is not present and the override managed version is set, add a new, explicit version tag.
170-
Xml.Tag versionTag = Xml.Tag.build("<version>" + newerVersion + "</version>");
171-
//noinspection ConstantConditions
172-
t = (Xml.Tag) new AddToTagVisitor<ExecutionContext>(t, versionTag, new MavenTagInsertionComparator(t.getChildren())).visitNonNull(t, ctx, getCursor().getParent());
173177
}
174178
}
175-
}
176-
} else if (isManagedDependencyTag(groupId, artifactId)) {
179+
} else if (isManagedDependencyTag(groupId, artifactId)) {
177180

178-
ResolvedManagedDependency matchedManagedDependency = findManagedDependency(t);
179-
if (matchedManagedDependency != null) {
180-
if (!projectArtifacts.contains(new GroupArtifact(matchedManagedDependency.getGroupId(), matchedManagedDependency.getArtifactId())) &&
181-
matchesGlob(matchedManagedDependency.getGroupId(), groupId) && matchesGlob(matchedManagedDependency.getArtifactId(), artifactId)) {
181+
ResolvedManagedDependency matchedManagedDependency = findManagedDependency(t);
182+
if (matchedManagedDependency != null) {
183+
if (!projectArtifacts.contains(new GroupArtifact(matchedManagedDependency.getGroupId(), matchedManagedDependency.getArtifactId())) &&
184+
matchesGlob(matchedManagedDependency.getGroupId(), groupId) && matchesGlob(matchedManagedDependency.getArtifactId(), artifactId)) {
182185

183-
String requestedVersion = matchedManagedDependency.getRequested().getVersion();
184-
assert (matchedManagedDependency.getVersion() != null);
185-
String newerVersion = findNewerVersion(matchedManagedDependency.getGroupId(), matchedManagedDependency.getArtifactId(), matchedManagedDependency.getVersion(), ctx);
186-
if (newerVersion != null) {
187-
if (requestedVersion.startsWith("${")) {
188-
doAfterVisit(new ChangePropertyValue(requestedVersion.substring(2, requestedVersion.length() - 1), newerVersion, overrideManagedVersion, false));
189-
return t;
190-
}
191-
Xml.Tag childVersionTag = t.getChild("version").orElse(null);
192-
if (childVersionTag != null) {
193-
t = (Xml.Tag) new ChangeTagValueVisitor<Integer>(childVersionTag, newerVersion).visitNonNull(t, 0, getCursor());
186+
String requestedVersion = matchedManagedDependency.getRequested().getVersion();
187+
assert (matchedManagedDependency.getVersion() != null);
188+
String newerVersion = findNewerVersion(matchedManagedDependency.getGroupId(), matchedManagedDependency.getArtifactId(), matchedManagedDependency.getVersion(), ctx);
189+
if (newerVersion != null) {
190+
if (requestedVersion.startsWith("${")) {
191+
doAfterVisit(new ChangePropertyValue(requestedVersion.substring(2, requestedVersion.length() - 1), newerVersion, overrideManagedVersion, false));
192+
return t;
193+
}
194+
Xml.Tag childVersionTag = t.getChild("version").orElse(null);
195+
if (childVersionTag != null) {
196+
t = (Xml.Tag) new ChangeTagValueVisitor<Integer>(childVersionTag, newerVersion).visitNonNull(t, 0, getCursor());
197+
}
194198
}
195199
}
196-
}
197-
} else {
198-
for (ResolvedManagedDependency dm : getResolutionResult().getPom().getDependencyManagement()) {
199-
if (dm.getBomGav() != null) {
200-
String tagGroup = getResolutionResult().getPom().getValue(tag.getChildValue("groupId").orElse(getResolutionResult().getPom().getGroupId()));
201-
String tagArtifactId = getResolutionResult().getPom().getValue(tag.getChildValue("artifactId").orElse(""));
202-
203-
if (!projectArtifacts.contains(new GroupArtifact(tagGroup, tagArtifactId))) {
204-
ResolvedGroupArtifactVersion bom = dm.getBomGav();
205-
206-
if (tagGroup != null && tagArtifactId != null && tagGroup.equals(bom.getGroupId()) && tagArtifactId.equals(bom.getArtifactId())) {
207-
208-
//noinspection ConstantConditions
209-
String requestedVersion = dm.getRequestedBom().getVersion();
210-
String newerVersion = findNewerVersion(bom.getGroupId(), bom.getArtifactId(), bom.getVersion(), ctx);
211-
if (newerVersion != null) {
212-
if (requestedVersion.startsWith("${")) {
213-
doAfterVisit(new ChangePropertyValue(requestedVersion.substring(2, requestedVersion.length() - 1), newerVersion, overrideManagedVersion, false));
214-
return t;
215-
}
216-
Xml.Tag childVersionTag = t.getChild("version").orElse(null);
217-
if (childVersionTag != null) {
218-
t = (Xml.Tag) new ChangeTagValueVisitor<Integer>(childVersionTag, newerVersion).visitNonNull(t, 0, getCursor());
200+
} else {
201+
for (ResolvedManagedDependency dm : getResolutionResult().getPom().getDependencyManagement()) {
202+
if (dm.getBomGav() != null) {
203+
String tagGroup = getResolutionResult().getPom().getValue(tag.getChildValue("groupId").orElse(getResolutionResult().getPom().getGroupId()));
204+
String tagArtifactId = getResolutionResult().getPom().getValue(tag.getChildValue("artifactId").orElse(""));
205+
206+
if (!projectArtifacts.contains(new GroupArtifact(tagGroup, tagArtifactId))) {
207+
ResolvedGroupArtifactVersion bom = dm.getBomGav();
208+
209+
if (tagGroup != null && tagArtifactId != null && tagGroup.equals(bom.getGroupId()) && tagArtifactId.equals(bom.getArtifactId())) {
210+
211+
//noinspection ConstantConditions
212+
String requestedVersion = dm.getRequestedBom().getVersion();
213+
String newerVersion = findNewerVersion(bom.getGroupId(), bom.getArtifactId(), bom.getVersion(), ctx);
214+
if (newerVersion != null) {
215+
if (requestedVersion.startsWith("${")) {
216+
doAfterVisit(new ChangePropertyValue(requestedVersion.substring(2, requestedVersion.length() - 1), newerVersion, overrideManagedVersion, false));
217+
return t;
218+
}
219+
Xml.Tag childVersionTag = t.getChild("version").orElse(null);
220+
if (childVersionTag != null) {
221+
t = (Xml.Tag) new ChangeTagValueVisitor<Integer>(childVersionTag, newerVersion).visitNonNull(t, 0, getCursor());
222+
}
219223
}
224+
break;
220225
}
221-
break;
222226
}
223227
}
224228
}
225229
}
226230
}
231+
} catch (MavenDownloadingException exception) {
232+
return t.withException(exception, ctx);
227233
}
228234
return t;
229235
}
230236

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

234-
MavenMetadata mavenMetadata = downloadMetadata(groupId, artifactId, ctx);
235-
List<String> versions = new ArrayList<>();
236-
for (String v : mavenMetadata.getVersioning().getVersions()) {
237-
if (versionComparator.isValid(version, v)) {
238-
versions.add(v);
240+
if (versionComparator instanceof LatestPatch) {
241+
//In the case of latest patch, a new version can only be derived if the current version is a semantic
242+
//version. Check if the current version is valid candidate before attempting to download metadata.
243+
if (!versionComparator.isValid(version, version)) {
244+
return null;
245+
}
246+
}
247+
248+
try {
249+
MavenMetadata mavenMetadata = downloadMetadata(groupId, artifactId, ctx);
250+
List<String> versions = new ArrayList<>();
251+
for (String v : mavenMetadata.getVersioning().getVersions()) {
252+
if (versionComparator.isValid(version, v)) {
253+
versions.add(v);
254+
}
239255
}
256+
return versionComparator.upgrade(version, versions).orElse(null);
257+
} catch (IllegalStateException e) {
258+
//This can happen when we encounter exotic versions. Pass the error to the error handler and
259+
//in the spirit of "do no harm", return null.
260+
ctx.getOnError().accept(e);
261+
return null;
240262
}
241-
return versionComparator.upgrade(version, versions).orElse(null);
242263
}
243264
}
244265
}

0 commit comments

Comments
 (0)