|
20 | 20 | import org.openrewrite.*; |
21 | 21 | import org.openrewrite.internal.ListUtils; |
22 | 22 | import org.openrewrite.internal.lang.Nullable; |
| 23 | +import org.openrewrite.maven.internal.MavenDownloadingException; |
23 | 24 | import org.openrewrite.maven.tree.*; |
| 25 | +import org.openrewrite.semver.LatestPatch; |
24 | 26 | import org.openrewrite.semver.Semver; |
25 | 27 | import org.openrewrite.semver.VersionComparator; |
26 | 28 | import org.openrewrite.xml.AddToTagVisitor; |
@@ -140,105 +142,124 @@ public Xml.Document visitDocument(Xml.Document document, ExecutionContext ctx) { |
140 | 142 | @Override |
141 | 143 | public Xml.Tag visitTag(Xml.Tag tag, ExecutionContext ctx) { |
142 | 144 | 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 | + } |
157 | 161 | } |
158 | | - } |
159 | 162 |
|
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()); |
166 | 176 | } |
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()); |
173 | 177 | } |
174 | 178 | } |
175 | | - } |
176 | | - } else if (isManagedDependencyTag(groupId, artifactId)) { |
| 179 | + } else if (isManagedDependencyTag(groupId, artifactId)) { |
177 | 180 |
|
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)) { |
182 | 185 |
|
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 | + } |
194 | 198 | } |
195 | 199 | } |
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 | + } |
219 | 223 | } |
| 224 | + break; |
220 | 225 | } |
221 | | - break; |
222 | 226 | } |
223 | 227 | } |
224 | 228 | } |
225 | 229 | } |
226 | 230 | } |
| 231 | + } catch (MavenDownloadingException exception) { |
| 232 | + return t.withException(exception, ctx); |
227 | 233 | } |
228 | 234 | return t; |
229 | 235 | } |
230 | 236 |
|
231 | 237 | @Nullable |
232 | 238 | private String findNewerVersion(String groupId, String artifactId, String version, ExecutionContext ctx) { |
233 | 239 |
|
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 | + } |
239 | 255 | } |
| 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; |
240 | 262 | } |
241 | | - return versionComparator.upgrade(version, versions).orElse(null); |
242 | 263 | } |
243 | 264 | } |
244 | 265 | } |
0 commit comments