From 40a5463052623d07ad0e6dadfce9765c5577903e Mon Sep 17 00:00:00 2001 From: Sam Snyder Date: Fri, 26 Jan 2024 15:30:06 -0800 Subject: [PATCH] Fix application of mirrors/auth to repositories whose URLs involve property substitution --- .../maven/internal/MavenPomDownloader.java | 4 +- .../java/org/openrewrite/maven/tree/Pom.java | 28 +++++--- .../openrewrite/maven/tree/ResolvedPom.java | 23 +++++-- .../internal/MavenPomDownloaderTest.java | 64 ++++++++++++++++--- 4 files changed, 94 insertions(+), 25 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 663a567a689..f22ef5f8604 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 @@ -680,10 +680,12 @@ Collection distinctNormalizedRepositories( @Nullable public MavenRepository normalizeRepository(MavenRepository originalRepository, MavenExecutionContextView ctx, @Nullable ResolvedPom containingPom) { Optional result = null; - MavenRepository repository = applyAuthenticationToRepository(applyMirrors(originalRepository)); + MavenRepository repository = originalRepository; if (containingPom != null) { + // Parameter substitution in case a repository is defined like "${ARTIFACTORY_URL}/repo" repository = repository.withUri(containingPom.getValue(repository.getUri())); } + repository = applyAuthenticationToRepository(applyMirrors(repository)); try { if (repository.isKnownToExist()) { return repository; diff --git a/rewrite-maven/src/main/java/org/openrewrite/maven/tree/Pom.java b/rewrite-maven/src/main/java/org/openrewrite/maven/tree/Pom.java index 253d8273757..3cd64c08fa7 100644 --- a/rewrite-maven/src/main/java/org/openrewrite/maven/tree/Pom.java +++ b/rewrite-maven/src/main/java/org/openrewrite/maven/tree/Pom.java @@ -15,6 +15,8 @@ */ package org.openrewrite.maven.tree; +import lombok.AllArgsConstructor; +import lombok.Builder; import lombok.Value; import lombok.With; import org.openrewrite.ExecutionContext; @@ -38,6 +40,8 @@ */ @Value @With +@Builder +@AllArgsConstructor public class Pom { /** @@ -68,14 +72,22 @@ public static int getModelVersion() { @Nullable String packaging; - Map properties; - List dependencyManagement; - List dependencies; - List repositories; - List licenses; - List profiles; - List plugins; - List pluginManagement; + @Builder.Default + Map properties = emptyMap(); + @Builder.Default + List dependencyManagement = emptyList(); + @Builder.Default + List dependencies = emptyList(); + @Builder.Default + List repositories = emptyList(); + @Builder.Default + List licenses = emptyList(); + @Builder.Default + List profiles = emptyList(); + @Builder.Default + List plugins = emptyList(); + @Builder.Default + List pluginManagement = emptyList(); public String getGroupId() { return gav.getGroupId(); diff --git a/rewrite-maven/src/main/java/org/openrewrite/maven/tree/ResolvedPom.java b/rewrite-maven/src/main/java/org/openrewrite/maven/tree/ResolvedPom.java index 87fe5276ed4..78b4fbb6eb8 100644 --- a/rewrite-maven/src/main/java/org/openrewrite/maven/tree/ResolvedPom.java +++ b/rewrite-maven/src/main/java/org/openrewrite/maven/tree/ResolvedPom.java @@ -22,6 +22,7 @@ import com.fasterxml.jackson.databind.node.ArrayNode; import com.fasterxml.jackson.databind.node.JsonNodeFactory; import com.fasterxml.jackson.databind.node.ObjectNode; +import lombok.Builder; import lombok.Getter; import lombok.Value; import lombok.With; @@ -48,6 +49,7 @@ @JsonIdentityInfo(generator = ObjectIdGenerators.IntSequenceGenerator.class, property = "@ref") @Getter +@Builder public class ResolvedPom { public static final PropertyPlaceholderHelper placeholderHelper = new PropertyPlaceholderHelper("${", "}", null); @@ -82,25 +84,32 @@ public ResolvedPom(Pom requested, Iterable activeProfiles) { } @NonFinal - Map properties; + @Builder.Default + Map properties = emptyMap(); @NonFinal - List dependencyManagement; + @Builder.Default + List dependencyManagement = emptyList(); @NonFinal - List initialRepositories; + @Builder.Default + List initialRepositories = emptyList(); @NonFinal - List repositories; + @Builder.Default + List repositories = emptyList(); @NonFinal - List requestedDependencies; + @Builder.Default + List requestedDependencies = emptyList(); @NonFinal - List plugins; + @Builder.Default + List plugins = emptyList(); @NonFinal - List pluginManagement; + @Builder.Default + List pluginManagement = emptyList(); /** diff --git a/rewrite-maven/src/test/java/org/openrewrite/maven/internal/MavenPomDownloaderTest.java b/rewrite-maven/src/test/java/org/openrewrite/maven/internal/MavenPomDownloaderTest.java index da028d29a10..29466213242 100755 --- a/rewrite-maven/src/test/java/org/openrewrite/maven/internal/MavenPomDownloaderTest.java +++ b/rewrite-maven/src/test/java/org/openrewrite/maven/internal/MavenPomDownloaderTest.java @@ -44,11 +44,11 @@ import java.util.concurrent.atomic.AtomicInteger; import java.util.function.Consumer; -import static java.util.Collections.emptyList; -import static java.util.Collections.emptyMap; +import static java.util.Collections.*; import static org.assertj.core.api.Assertions.*; import static org.junit.jupiter.api.Assertions.assertDoesNotThrow; import static org.junit.jupiter.api.Assertions.assertThrows; +import static org.openrewrite.maven.tree.MavenRepository.MAVEN_CENTRAL; @SuppressWarnings({"HttpUrlsUsage"}) class MavenPomDownloaderTest { @@ -141,7 +141,7 @@ public void repository(MavenRepository mavenRepository, @Nullable ResolvedPom co try { new MavenPomDownloader(ctx) - .download(new GroupArtifactVersion("org.openrewrite", "rewrite-core", "7.0.0"), null, null, Collections.singletonList(nonexistentRepo)); + .download(new GroupArtifactVersion("org.openrewrite", "rewrite-core", "7.0.0"), null, null, singletonList(nonexistentRepo)); } catch (Exception e) { // not expected to succeed } @@ -171,7 +171,7 @@ public void repositoryAccessFailed(String uri, Throwable e) { try { new MavenPomDownloader(ctx) - .download(new GroupArtifactVersion("org.openrewrite", "rewrite-core", "7.0.0"), null, null, Collections.singletonList(nonexistentRepo)); + .download(new GroupArtifactVersion("org.openrewrite", "rewrite-core", "7.0.0"), null, null, singletonList(nonexistentRepo)); } catch (Exception e) { // not expected to succeed } @@ -182,14 +182,62 @@ public void repositoryAccessFailed(String uri, Throwable e) { .isEmpty(); } + @Test + void mirrorsOverrideRepositoriesInPom() { + var ctx = MavenExecutionContextView.view(new InMemoryExecutionContext()); + ctx.setMavenSettings(MavenSettings.parse(new Parser.Input(Paths.get("settings.xml"), () -> new ByteArrayInputStream( + //language=xml + """ + + + + mirror + https://artifactory.moderne.ninja/artifactory/moderne-cache + * + + + + """.getBytes() + )), ctx)); + + Path pomPath = Paths.get("pom.xml"); + Pom pom = Pom.builder() + .sourcePath(pomPath) + .repository(MAVEN_CENTRAL) + .properties(singletonMap("REPO_URL", MAVEN_CENTRAL.getUri())) + .gav(new ResolvedGroupArtifactVersion( + "${REPO_URL}", "org.openrewrite", "rewrite-core", "7.0.0", null)) + .build(); + ResolvedPom resolvedPom = ResolvedPom.builder() + .requested(pom) + .properties(singletonMap("REPO_URL", MAVEN_CENTRAL.getUri())) + .repositories(singletonList(MAVEN_CENTRAL)) + .build(); + + Map pomsByPath = new HashMap<>(); + pomsByPath.put(pomPath, pom); + + MavenPomDownloader mpd = new MavenPomDownloader(pomsByPath, ctx); + MavenRepository normalized = mpd.normalizeRepository( + MavenRepository.builder().id("whatever").uri("${REPO_URL}").build(), + ctx, + resolvedPom + ); + assertThat(normalized) + .extracting(MavenRepository::getUri) + .isEqualTo("https://artifactory.moderne.ninja/artifactory/moderne-cache"); + } + @Disabled("Flaky on CI") @Test void normalizeOssSnapshots() { var downloader = new MavenPomDownloader(emptyMap(), ctx); MavenRepository oss = downloader.normalizeRepository( MavenRepository.builder().id("oss").uri("https://oss.sonatype.org/content/repositories/snapshots").build(), - MavenExecutionContextView.view(ctx), - null); + MavenExecutionContextView.view(ctx), null); assertThat(oss).isNotNull(); assertThat(oss.getUri()).isEqualTo("https://oss.sonatype.org/content/repositories/snapshots"); @@ -239,9 +287,7 @@ void normalizeRejectConnectException() { var downloader = new MavenPomDownloader(emptyMap(), ctx); var normalizedRepository = downloader.normalizeRepository( MavenRepository.builder().id("id").uri("https//localhost").build(), - MavenExecutionContextView.view(ctx), - null - ); + MavenExecutionContextView.view(ctx), null); assertThat(normalizedRepository).isEqualTo(null); }