From 56986647f0c8b8a162d548d52c70572b939f1d0a Mon Sep 17 00:00:00 2001 From: Tim te Beek Date: Wed, 3 Jul 2024 11:32:25 +0200 Subject: [PATCH] Handle MavenMetadata parser result NPE as reported by community member (#4285) * Handle MavenMetadata parser result NPE as reported by community member * Replicate how metadata would be null --- .../maven/internal/MavenPomDownloader.java | 10 +- .../openrewrite/maven/tree/MavenMetadata.java | 4 +- .../maven/internal/MavenMetadataTest.java | 99 ++++++++++--------- 3 files changed, 64 insertions(+), 49 deletions(-) diff --git a/rewrite-maven/src/main/java/org/openrewrite/maven/internal/MavenPomDownloader.java b/rewrite-maven/src/main/java/org/openrewrite/maven/internal/MavenPomDownloader.java index f23a68d460c..b23f0cc52c1 100644 --- a/rewrite-maven/src/main/java/org/openrewrite/maven/internal/MavenPomDownloader.java +++ b/rewrite-maven/src/main/java/org/openrewrite/maven/internal/MavenPomDownloader.java @@ -267,11 +267,17 @@ public MavenMetadata downloadMetadata(GroupArtifactVersion gav, @Nullable Resolv // A maven repository can be expressed as a URI with a file scheme Path path = Paths.get(URI.create(uri)); if (Files.exists(path)) { - result = Optional.of(MavenMetadata.parse(Files.readAllBytes(path))); + MavenMetadata parsed = MavenMetadata.parse(Files.readAllBytes(path)); + if (parsed != null) { + result = Optional.of(parsed); + } } } else { byte[] responseBody = requestAsAuthenticatedOrAnonymous(repo, uri); - result = Optional.of(MavenMetadata.parse(responseBody)); + MavenMetadata parsed = MavenMetadata.parse(responseBody); + if (parsed != null) { + result = Optional.of(parsed); + } } } catch (HttpSenderResponseException e) { repositoryResponses.put(repo, e.getMessage()); diff --git a/rewrite-maven/src/main/java/org/openrewrite/maven/tree/MavenMetadata.java b/rewrite-maven/src/main/java/org/openrewrite/maven/tree/MavenMetadata.java index 2c8d3eb635f..c9085b46fcf 100644 --- a/rewrite-maven/src/main/java/org/openrewrite/maven/tree/MavenMetadata.java +++ b/rewrite-maven/src/main/java/org/openrewrite/maven/tree/MavenMetadata.java @@ -80,9 +80,9 @@ public static MavenMetadata parse(InputStream document) { } } - public static MavenMetadata parse(byte[] document) throws IOException { + public static @Nullable MavenMetadata parse(byte[] document) throws IOException { MavenMetadata metadata = MavenXmlMapper.readMapper().readValue(document, MavenMetadata.class); - if (metadata.getVersioning() != null && metadata.getVersioning().getVersions() == null) { + if (metadata != null && metadata.getVersioning() != null && metadata.getVersioning().getVersions() == null) { return new MavenMetadata(new Versioning(emptyList(), metadata.getVersioning().getSnapshotVersions(), metadata.getVersioning().getSnapshot())); } return metadata; diff --git a/rewrite-maven/src/test/java/org/openrewrite/maven/internal/MavenMetadataTest.java b/rewrite-maven/src/test/java/org/openrewrite/maven/internal/MavenMetadataTest.java index 396f09f0f2c..cd3b87a8195 100644 --- a/rewrite-maven/src/test/java/org/openrewrite/maven/internal/MavenMetadataTest.java +++ b/rewrite-maven/src/test/java/org/openrewrite/maven/internal/MavenMetadataTest.java @@ -17,6 +17,7 @@ import org.intellij.lang.annotations.Language; import org.junit.jupiter.api.Test; +import org.openrewrite.Issue; import org.openrewrite.maven.tree.MavenMetadata; import java.io.IOException; @@ -28,20 +29,20 @@ class MavenMetadataTest { @Test void deserializeMetadata() throws IOException { @Language("xml") String metadata = """ - - org.springframework.boot - spring-boot - - 2.4.2 - 2.4.2 - - 2.4.1 - 2.4.2 - - 20210115042754 - - - """; + + org.springframework.boot + spring-boot + + 2.4.2 + 2.4.2 + + 2.4.1 + 2.4.2 + + 20210115042754 + + + """; MavenMetadata parsed = MavenMetadata.parse(metadata.getBytes()); assertThat(parsed.getVersioning().getVersions()).hasSize(2); @@ -51,39 +52,47 @@ void deserializeMetadata() throws IOException { @Test void deserializeSnapshotMetadata() throws IOException { @Language("xml") String metadata = """ - - org.openrewrite.recipe - rewrite-recommendations - 0.1.0-SNAPSHOT - - - 20220927.033510 - 223 - - - - pom.asc - 0.1.0-20220927.033510-223 - 20220927033510 - - - pom - 0.1.0-20220927.033510-223 - 20220927033510 - - - - - """; + + org.openrewrite.recipe + rewrite-recommendations + 0.1.0-SNAPSHOT + + + 20220927.033510 + 223 + + + + pom.asc + 0.1.0-20220927.033510-223 + 20220927033510 + + + pom + 0.1.0-20220927.033510-223 + 20220927033510 + + + + + """; MavenMetadata parsed = MavenMetadata.parse(metadata.getBytes()); + MavenMetadata.Versioning versioning = parsed.getVersioning(); - assertThat(parsed.getVersioning().getSnapshot().getTimestamp()).isEqualTo("20220927.033510"); - assertThat(parsed.getVersioning().getSnapshot().getBuildNumber()).isEqualTo("223"); - assertThat(parsed.getVersioning().getVersions()).isNotNull(); - assertThat(parsed.getVersioning().getSnapshotVersions()).hasSize(2); - assertThat(parsed.getVersioning().getSnapshotVersions().get(0).getExtension()).isNotNull(); - assertThat(parsed.getVersioning().getSnapshotVersions().get(0).getValue()).isNotNull(); - assertThat(parsed.getVersioning().getSnapshotVersions().get(0).getUpdated()).isNotNull(); + assertThat(versioning.getSnapshot().getTimestamp()).isEqualTo("20220927.033510"); + assertThat(versioning.getSnapshot().getBuildNumber()).isEqualTo("223"); + assertThat(versioning.getVersions()).isNotNull(); + assertThat(versioning.getSnapshotVersions()).hasSize(2); + assertThat(versioning.getSnapshotVersions().get(0).getExtension()).isNotNull(); + assertThat(versioning.getSnapshotVersions().get(0).getValue()).isNotNull(); + assertThat(versioning.getSnapshotVersions().get(0).getUpdated()).isNotNull(); + } + + + @Test + @Issue("https://github.com/openrewrite/rewrite/pull/4285") + void deserializeMetadataWithEmptyVersions() throws IOException { + assertThat(MavenMetadata.parse("\n".getBytes())).isNull(); } }