From 78110cf609b8b322ecc28b5293a69530f9491b0a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fabian=20Kr=C3=BCger?= Date: Mon, 6 Nov 2023 20:15:56 +0100 Subject: [PATCH 1/2] Read Maven user settings and credentials - Clean up and fix ParserParityTestHelper - Move MavenSettingsInitializer - Adopt changes in sbm-core - Integration test for dependency retrieval from private repo --- ...te.yml => build-sbm-support-rewrite.yml--} | 0 .gitignore | 2 +- .../sbm/test/RecipeTestSupport.java | 2 +- .../build/impl/MavenSettingsInitializer.java | 41 -- .../build/impl/OpenRewriteMavenBuildFile.java | 2 +- .../sbm/build/impl/RewriteMavenParser.java | 8 +- .../migration/actions/AddMinimalPomXml.java | 2 +- .../resource/BuildFileResourceWrapper.java | 2 +- .../sbm/java/impl/ClasspathRegistry.java | 2 +- .../archfitfun/ExecutionScopeArchFitTest.java | 2 +- .../sbm/java/impl/ClasspathRegistryTest.java | 5 +- .../JavaProvenanceMarkerFactoryTest.java | 7 +- .../parser/ProjectContextInitializerTest.java | 4 +- .../project-with-maven-settings/.gitignore | 3 - sbm-support-rewrite/.gitignore | 2 + sbm-support-rewrite/pom.xml | 26 +- .../autoconfigure/ScopeConfiguration.java | 5 - .../parsers/RewriteParserConfiguration.java | 40 +- .../sbm/parsers/maven/BuildFileParser.java | 13 +- .../parsers/maven/MavenPasswordDecrypter.java | 23 +- .../maven/MavenSettingsInitializer.java | 88 +++++ .../RewriteMavenArtifactDownloader.java | 2 +- .../RewriteParserMavenConfiguration.java | 65 ++++ .../java/org/openrewrite/JavaParserTest.java | 2 +- .../sbm/PrivateArtifactRepositoryTest.java | 362 ++++++++++++++++++ .../sbm/parsers/BuildFileParserTest.java | 12 +- .../parsers/CompareParserRecipeRunTest.java | 6 +- .../RewriteProjectParserParityTest.java | 260 +------------ .../sbm/parsers/RewriteProjectParserTest.java | 10 +- .../parsers/RewriteRecipeDiscoveryTest.java | 15 +- .../maven/MavenExecutionRequestFactory.java | 5 + .../sbm/parsers/maven/MavenExecutor.java | 1 + .../maven/MavenProjectAnalyzerTest.java | 1 - .../maven}/MavenSettingsInitializerTest.java | 52 +-- .../sbm/test/util/ParallelParsingResult.java | 2 +- .../sbm/test/util/ParserExecutionHelper.java | 20 +- .../sbm/test/util/ParserParityTestHelper.java | 356 ++++++++++++----- .../private-repository/.gitignore | 17 + .../private-repository/README.adoc | 36 ++ .../dependency-project/pom.xml.template | 25 ++ .../example/dependency/DependencyClass.java | 13 + .../dependent-project/pom.xml.template | 33 ++ .../com/example/dependent/DependentClass.java | 7 + ...pendency-project-1.0-20231105.102337-1.jar | Bin 0 -> 2436 bytes ...ency-project-1.0-20231105.102337-1.jar.md5 | 1 + ...ncy-project-1.0-20231105.102337-1.jar.sha1 | 1 + ...pendency-project-1.0-20231105.102337-1.pom | 25 ++ ...ency-project-1.0-20231105.102337-1.pom.md5 | 1 + ...ncy-project-1.0-20231105.102337-1.pom.sha1 | 1 + .../1.0-SNAPSHOT/dependency-project-1.0.jar | Bin 0 -> 2436 bytes .../1.0-SNAPSHOT/maven-metadata.xml | 25 ++ .../1.0-SNAPSHOT/maven-metadata.xml.md5 | 1 + .../1.0-SNAPSHOT/maven-metadata.xml.sha1 | 1 + .../dependency-project/maven-metadata.xml | 11 + .../dependency-project/maven-metadata.xml.md5 | 1 + .../maven-metadata.xml.sha1 | 1 + .../reposilite-data/shared.configuration.json | 75 ++++ .../user.home/.m2/settings-clear-password.xml | 14 + .../user.home/.m2/settings-security.xml | 4 + .../user.home/.m2/settings.xml.template | 15 + .../user-home/.m2/settings-security.xml | 4 + .../user-home/.m2/settings.xml | 12 +- 62 files changed, 1248 insertions(+), 526 deletions(-) rename .github/workflows/{build-sbm-support-rewrite.yml => build-sbm-support-rewrite.yml--} (100%) delete mode 100644 components/sbm-core/src/main/java/org/springframework/sbm/build/impl/MavenSettingsInitializer.java delete mode 100644 components/sbm-core/testcode/project-with-maven-settings/.gitignore create mode 100644 sbm-support-rewrite/.gitignore create mode 100644 sbm-support-rewrite/src/main/java/org/springframework/sbm/parsers/maven/MavenSettingsInitializer.java rename sbm-support-rewrite/src/main/java/org/springframework/sbm/parsers/{ => maven}/RewriteMavenArtifactDownloader.java (97%) create mode 100644 sbm-support-rewrite/src/main/java/org/springframework/sbm/parsers/maven/RewriteParserMavenConfiguration.java create mode 100644 sbm-support-rewrite/src/test/java/org/springframework/sbm/PrivateArtifactRepositoryTest.java rename {components/sbm-core/src/test/java/org/springframework/sbm/build/impl => sbm-support-rewrite/src/test/java/org/springframework/sbm/parsers/maven}/MavenSettingsInitializerTest.java (63%) create mode 100644 sbm-support-rewrite/testcode/maven-projects/private-repository/.gitignore create mode 100644 sbm-support-rewrite/testcode/maven-projects/private-repository/README.adoc create mode 100644 sbm-support-rewrite/testcode/maven-projects/private-repository/dependency-project/pom.xml.template create mode 100644 sbm-support-rewrite/testcode/maven-projects/private-repository/dependency-project/src/main/java/com/example/dependency/DependencyClass.java create mode 100644 sbm-support-rewrite/testcode/maven-projects/private-repository/dependent-project/pom.xml.template create mode 100644 sbm-support-rewrite/testcode/maven-projects/private-repository/dependent-project/src/main/java/com/example/dependent/DependentClass.java create mode 100644 sbm-support-rewrite/testcode/maven-projects/private-repository/reposilite-data/repositories/snapshots/com/example/dependency/dependency-project/1.0-SNAPSHOT/dependency-project-1.0-20231105.102337-1.jar create mode 100644 sbm-support-rewrite/testcode/maven-projects/private-repository/reposilite-data/repositories/snapshots/com/example/dependency/dependency-project/1.0-SNAPSHOT/dependency-project-1.0-20231105.102337-1.jar.md5 create mode 100644 sbm-support-rewrite/testcode/maven-projects/private-repository/reposilite-data/repositories/snapshots/com/example/dependency/dependency-project/1.0-SNAPSHOT/dependency-project-1.0-20231105.102337-1.jar.sha1 create mode 100644 sbm-support-rewrite/testcode/maven-projects/private-repository/reposilite-data/repositories/snapshots/com/example/dependency/dependency-project/1.0-SNAPSHOT/dependency-project-1.0-20231105.102337-1.pom create mode 100644 sbm-support-rewrite/testcode/maven-projects/private-repository/reposilite-data/repositories/snapshots/com/example/dependency/dependency-project/1.0-SNAPSHOT/dependency-project-1.0-20231105.102337-1.pom.md5 create mode 100644 sbm-support-rewrite/testcode/maven-projects/private-repository/reposilite-data/repositories/snapshots/com/example/dependency/dependency-project/1.0-SNAPSHOT/dependency-project-1.0-20231105.102337-1.pom.sha1 create mode 100644 sbm-support-rewrite/testcode/maven-projects/private-repository/reposilite-data/repositories/snapshots/com/example/dependency/dependency-project/1.0-SNAPSHOT/dependency-project-1.0.jar create mode 100644 sbm-support-rewrite/testcode/maven-projects/private-repository/reposilite-data/repositories/snapshots/com/example/dependency/dependency-project/1.0-SNAPSHOT/maven-metadata.xml create mode 100644 sbm-support-rewrite/testcode/maven-projects/private-repository/reposilite-data/repositories/snapshots/com/example/dependency/dependency-project/1.0-SNAPSHOT/maven-metadata.xml.md5 create mode 100644 sbm-support-rewrite/testcode/maven-projects/private-repository/reposilite-data/repositories/snapshots/com/example/dependency/dependency-project/1.0-SNAPSHOT/maven-metadata.xml.sha1 create mode 100644 sbm-support-rewrite/testcode/maven-projects/private-repository/reposilite-data/repositories/snapshots/com/example/dependency/dependency-project/maven-metadata.xml create mode 100644 sbm-support-rewrite/testcode/maven-projects/private-repository/reposilite-data/repositories/snapshots/com/example/dependency/dependency-project/maven-metadata.xml.md5 create mode 100644 sbm-support-rewrite/testcode/maven-projects/private-repository/reposilite-data/repositories/snapshots/com/example/dependency/dependency-project/maven-metadata.xml.sha1 create mode 100644 sbm-support-rewrite/testcode/maven-projects/private-repository/reposilite-data/shared.configuration.json create mode 100644 sbm-support-rewrite/testcode/maven-projects/private-repository/user.home/.m2/settings-clear-password.xml create mode 100644 sbm-support-rewrite/testcode/maven-projects/private-repository/user.home/.m2/settings-security.xml create mode 100644 sbm-support-rewrite/testcode/maven-projects/private-repository/user.home/.m2/settings.xml.template create mode 100644 sbm-support-rewrite/testcode/maven-projects/project-with-maven-settings/user-home/.m2/settings-security.xml rename {components/sbm-core/testcode => sbm-support-rewrite/testcode/maven-projects}/project-with-maven-settings/user-home/.m2/settings.xml (81%) diff --git a/.github/workflows/build-sbm-support-rewrite.yml b/.github/workflows/build-sbm-support-rewrite.yml-- similarity index 100% rename from .github/workflows/build-sbm-support-rewrite.yml rename to .github/workflows/build-sbm-support-rewrite.yml-- diff --git a/.gitignore b/.gitignore index 8533136fe..538687f9d 100644 --- a/.gitignore +++ b/.gitignore @@ -20,4 +20,4 @@ out/ pom.xml.versionsBackup **/src/generated/java/META-INF **.java-version -.rewrite-cache +.rewrite-cache \ No newline at end of file diff --git a/components/recipe-test-support/src/main/java/org/springframework/sbm/test/RecipeTestSupport.java b/components/recipe-test-support/src/main/java/org/springframework/sbm/test/RecipeTestSupport.java index fab62c8c7..aac1f0024 100644 --- a/components/recipe-test-support/src/main/java/org/springframework/sbm/test/RecipeTestSupport.java +++ b/components/recipe-test-support/src/main/java/org/springframework/sbm/test/RecipeTestSupport.java @@ -17,7 +17,7 @@ import org.springframework.sbm.boot.autoconfigure.ScopeConfiguration; import org.springframework.sbm.build.impl.MavenBuildFileRefactoringFactory; -import org.springframework.sbm.build.impl.MavenSettingsInitializer; +import org.springframework.sbm.parsers.maven.MavenSettingsInitializer; import org.springframework.sbm.build.impl.RewriteMavenParser; import org.springframework.sbm.engine.context.ProjectContextHolder; import org.springframework.sbm.engine.context.RewriteJavaSearchActionDeserializer; diff --git a/components/sbm-core/src/main/java/org/springframework/sbm/build/impl/MavenSettingsInitializer.java b/components/sbm-core/src/main/java/org/springframework/sbm/build/impl/MavenSettingsInitializer.java deleted file mode 100644 index d05845e52..000000000 --- a/components/sbm-core/src/main/java/org/springframework/sbm/build/impl/MavenSettingsInitializer.java +++ /dev/null @@ -1,41 +0,0 @@ -/* - * Copyright 2021 - 2023 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * https://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.springframework.sbm.build.impl; - -import org.openrewrite.ExecutionContext; -import org.openrewrite.maven.MavenExecutionContextView; -import org.openrewrite.maven.MavenSettings; -import org.springframework.stereotype.Component; - -import java.nio.file.Files; -import java.nio.file.Path; - -/** - * @author Fabian Krüger - */ -@Component -public class MavenSettingsInitializer { - public void initializeMavenSettings(ExecutionContext executionContext) { - // Read .m2/settings.xml - // TODO: Add support for global Maven settings (${maven.home}/conf/settings.xml). - MavenExecutionContextView mavenExecutionContextView = MavenExecutionContextView.view(executionContext); - Path mavenSettingsFile = Path.of(System.getProperty("user.home")).resolve(".m2/settings.xml"); - if (Files.exists(mavenSettingsFile)) { - MavenSettings mavenSettings = MavenSettings.parse(mavenSettingsFile, mavenExecutionContextView); - mavenExecutionContextView.setMavenSettings(mavenSettings); - } - } -} diff --git a/components/sbm-core/src/main/java/org/springframework/sbm/build/impl/OpenRewriteMavenBuildFile.java b/components/sbm-core/src/main/java/org/springframework/sbm/build/impl/OpenRewriteMavenBuildFile.java index 271b1ac37..6cc2ffc24 100644 --- a/components/sbm-core/src/main/java/org/springframework/sbm/build/impl/OpenRewriteMavenBuildFile.java +++ b/components/sbm-core/src/main/java/org/springframework/sbm/build/impl/OpenRewriteMavenBuildFile.java @@ -40,7 +40,7 @@ import org.springframework.sbm.build.migration.visitor.AddOrUpdateDependencyManagement; import org.springframework.sbm.java.impl.ClasspathRegistry; import org.springframework.sbm.project.resource.RewriteSourceFileHolder; -import org.springframework.sbm.parsers.RewriteMavenArtifactDownloader; +import org.springframework.sbm.parsers.maven.RewriteMavenArtifactDownloader; import org.springframework.sbm.support.openrewrite.GenericOpenRewriteRecipe; import org.springframework.util.Assert; diff --git a/components/sbm-core/src/main/java/org/springframework/sbm/build/impl/RewriteMavenParser.java b/components/sbm-core/src/main/java/org/springframework/sbm/build/impl/RewriteMavenParser.java index de1328f7f..de9e8dc1b 100644 --- a/components/sbm-core/src/main/java/org/springframework/sbm/build/impl/RewriteMavenParser.java +++ b/components/sbm-core/src/main/java/org/springframework/sbm/build/impl/RewriteMavenParser.java @@ -21,12 +21,10 @@ import org.openrewrite.SourceFile; import org.openrewrite.internal.lang.Nullable; import org.openrewrite.maven.MavenParser; -import org.openrewrite.xml.XmlParser; -import org.openrewrite.xml.tree.Xml; +import org.springframework.sbm.parsers.maven.MavenSettingsInitializer; import org.springframework.stereotype.Component; import java.nio.file.Path; -import java.util.List; import java.util.stream.Stream; /** @@ -76,7 +74,7 @@ public Stream parse(String... sources) { @Override public Stream parse(ExecutionContext ctx, String... sources) { - mavenSettingsInitializer.initializeMavenSettings(ctx); + mavenSettingsInitializer.initializeMavenSettings(); return parser.parse(ctx, sources); } @@ -90,7 +88,7 @@ public Stream parseInputs(Iterable sources, @Nullable Path re if (relativeTo != null) { initMavenParser(ctx, relativeTo); } else { - mavenSettingsInitializer.initializeMavenSettings(ctx); + mavenSettingsInitializer.initializeMavenSettings(); } return parser.parseInputs(sources, relativeTo, ctx); } diff --git a/components/sbm-core/src/main/java/org/springframework/sbm/build/migration/actions/AddMinimalPomXml.java b/components/sbm-core/src/main/java/org/springframework/sbm/build/migration/actions/AddMinimalPomXml.java index dfb2bd83e..0dcb0384b 100644 --- a/components/sbm-core/src/main/java/org/springframework/sbm/build/migration/actions/AddMinimalPomXml.java +++ b/components/sbm-core/src/main/java/org/springframework/sbm/build/migration/actions/AddMinimalPomXml.java @@ -28,7 +28,7 @@ import org.springframework.sbm.build.impl.RewriteMavenParser; import org.springframework.sbm.engine.context.ProjectContext; import org.springframework.sbm.engine.recipe.AbstractAction; -import org.springframework.sbm.parsers.RewriteMavenArtifactDownloader; +import org.springframework.sbm.parsers.maven.RewriteMavenArtifactDownloader; import java.io.ByteArrayInputStream; import java.io.StringWriter; diff --git a/components/sbm-core/src/main/java/org/springframework/sbm/build/resource/BuildFileResourceWrapper.java b/components/sbm-core/src/main/java/org/springframework/sbm/build/resource/BuildFileResourceWrapper.java index 33bae72db..23d13a16f 100644 --- a/components/sbm-core/src/main/java/org/springframework/sbm/build/resource/BuildFileResourceWrapper.java +++ b/components/sbm-core/src/main/java/org/springframework/sbm/build/resource/BuildFileResourceWrapper.java @@ -24,7 +24,7 @@ import org.springframework.sbm.build.impl.MavenBuildFileRefactoring; import org.springframework.sbm.build.impl.MavenBuildFileRefactoringFactory; import org.springframework.sbm.build.impl.OpenRewriteMavenBuildFile; -import org.springframework.sbm.parsers.RewriteMavenArtifactDownloader; +import org.springframework.sbm.parsers.maven.RewriteMavenArtifactDownloader; import org.springframework.sbm.project.resource.ProjectResourceWrapper; import org.springframework.sbm.project.resource.RewriteSourceFileHolder; import org.springframework.stereotype.Component; diff --git a/components/sbm-core/src/main/java/org/springframework/sbm/java/impl/ClasspathRegistry.java b/components/sbm-core/src/main/java/org/springframework/sbm/java/impl/ClasspathRegistry.java index 98dcbb127..771e9945a 100644 --- a/components/sbm-core/src/main/java/org/springframework/sbm/java/impl/ClasspathRegistry.java +++ b/components/sbm-core/src/main/java/org/springframework/sbm/java/impl/ClasspathRegistry.java @@ -21,7 +21,7 @@ import org.openrewrite.maven.tree.Scope; import org.springframework.sbm.build.api.BuildFile; import org.springframework.sbm.build.impl.OpenRewriteMavenBuildFile; -import org.springframework.sbm.parsers.RewriteMavenArtifactDownloader; +import org.springframework.sbm.parsers.maven.RewriteMavenArtifactDownloader; import org.springframework.sbm.project.parser.DependencyHelper; import java.nio.file.Path; diff --git a/components/sbm-core/src/test/java/org/springframework/sbm/archfitfun/ExecutionScopeArchFitTest.java b/components/sbm-core/src/test/java/org/springframework/sbm/archfitfun/ExecutionScopeArchFitTest.java index 984fe6631..bb6f0c714 100644 --- a/components/sbm-core/src/test/java/org/springframework/sbm/archfitfun/ExecutionScopeArchFitTest.java +++ b/components/sbm-core/src/test/java/org/springframework/sbm/archfitfun/ExecutionScopeArchFitTest.java @@ -28,7 +28,7 @@ import org.springframework.core.io.FileSystemResource; import org.springframework.sbm.boot.autoconfigure.SbmSupportRewriteConfiguration; import org.springframework.sbm.boot.autoconfigure.ScopeConfiguration; -import org.springframework.sbm.build.impl.MavenSettingsInitializer; +import org.springframework.sbm.parsers.maven.MavenSettingsInitializer; import org.springframework.sbm.engine.commands.ApplicableRecipeListCommand; import org.springframework.sbm.engine.commands.ApplyCommand; import org.springframework.sbm.engine.commands.ScanCommand; diff --git a/components/sbm-core/src/test/java/org/springframework/sbm/java/impl/ClasspathRegistryTest.java b/components/sbm-core/src/test/java/org/springframework/sbm/java/impl/ClasspathRegistryTest.java index 61e5103a9..cfa457994 100644 --- a/components/sbm-core/src/test/java/org/springframework/sbm/java/impl/ClasspathRegistryTest.java +++ b/components/sbm-core/src/test/java/org/springframework/sbm/java/impl/ClasspathRegistryTest.java @@ -22,9 +22,10 @@ import org.openrewrite.maven.tree.ResolvedDependency; import org.openrewrite.maven.tree.Scope; import org.openrewrite.xml.tree.Xml; -import org.springframework.sbm.build.impl.MavenSettingsInitializer; import org.springframework.sbm.build.impl.RewriteMavenParser; import org.springframework.sbm.parsers.RewriteExecutionContext; +import org.springframework.sbm.parsers.maven.MavenSettingsInitializer; +import org.springframework.sbm.scopes.ProjectMetadata; import java.util.List; import java.util.Set; @@ -105,7 +106,7 @@ void classpathRegistryShouldKeepOnlyExternalDependencies() { ExecutionContext executionContext = new RewriteExecutionContext(); List poms = new RewriteMavenParser( - new MavenSettingsInitializer(), + new MavenSettingsInitializer(executionContext, new ProjectMetadata()), executionContext ).parse(parentPom, pom1, pom2) .map(Xml.Document.class::cast) diff --git a/components/sbm-core/src/test/java/org/springframework/sbm/project/parser/JavaProvenanceMarkerFactoryTest.java b/components/sbm-core/src/test/java/org/springframework/sbm/project/parser/JavaProvenanceMarkerFactoryTest.java index 86fe15c2f..a3d94d4d5 100644 --- a/components/sbm-core/src/test/java/org/springframework/sbm/project/parser/JavaProvenanceMarkerFactoryTest.java +++ b/components/sbm-core/src/test/java/org/springframework/sbm/project/parser/JavaProvenanceMarkerFactoryTest.java @@ -17,14 +17,16 @@ import org.jetbrains.annotations.NotNull; import org.junit.jupiter.api.Test; +import org.openrewrite.ExecutionContext; import org.openrewrite.java.marker.JavaProject; import org.openrewrite.java.marker.JavaVersion; import org.openrewrite.marker.BuildTool; import org.openrewrite.marker.Marker; import org.openrewrite.xml.tree.Xml; -import org.springframework.sbm.build.impl.MavenSettingsInitializer; import org.springframework.sbm.build.impl.RewriteMavenParser; import org.springframework.sbm.parsers.RewriteExecutionContext; +import org.springframework.sbm.parsers.maven.MavenSettingsInitializer; +import org.springframework.sbm.scopes.ProjectMetadata; import java.nio.file.Path; import java.util.List; @@ -63,7 +65,8 @@ void test() { ""; Path projectDirectory = Path.of("./faked-project-dir/pom.xml"); - Xml.Document maven = new RewriteMavenParser(new MavenSettingsInitializer(), new RewriteExecutionContext()).parse(pomXmlSource).toList().get(0).withSourcePath(Path.of("pom.xml")); + ExecutionContext executionContext = new RewriteExecutionContext(); + Xml.Document maven = new RewriteMavenParser(new MavenSettingsInitializer(executionContext, new ProjectMetadata()), executionContext).parse(pomXmlSource).toList().get(0).withSourcePath(Path.of("pom.xml")); List javaProvenanceMarkers = sut.createJavaProvenanceMarkers(maven, projectDirectory, new RewriteExecutionContext()); diff --git a/components/sbm-core/src/test/java/org/springframework/sbm/project/parser/ProjectContextInitializerTest.java b/components/sbm-core/src/test/java/org/springframework/sbm/project/parser/ProjectContextInitializerTest.java index 61c6c253f..ce8475af8 100644 --- a/components/sbm-core/src/test/java/org/springframework/sbm/project/parser/ProjectContextInitializerTest.java +++ b/components/sbm-core/src/test/java/org/springframework/sbm/project/parser/ProjectContextInitializerTest.java @@ -34,7 +34,7 @@ import org.springframework.core.io.Resource; import org.springframework.core.io.ResourceLoader; import org.springframework.sbm.boot.autoconfigure.ScopeConfiguration; -import org.springframework.sbm.build.impl.MavenSettingsInitializer; +import org.springframework.sbm.parsers.maven.MavenSettingsInitializer; import org.springframework.sbm.build.impl.RewriteMavenParser; import org.springframework.sbm.build.migration.MavenPomCacheProvider; import org.springframework.sbm.engine.commands.ScanCommand; @@ -64,7 +64,7 @@ import static org.assertj.core.api.Assertions.assertThat; import static org.springframework.sbm.project.parser.ResourceVerifierTestHelper.*; -import org.springframework.sbm.parsers.RewriteMavenArtifactDownloader; +import org.springframework.sbm.parsers.maven.RewriteMavenArtifactDownloader; @SpringBootTest(classes = { ProjectContextInitializer.class, diff --git a/components/sbm-core/testcode/project-with-maven-settings/.gitignore b/components/sbm-core/testcode/project-with-maven-settings/.gitignore deleted file mode 100644 index 907e5f127..000000000 --- a/components/sbm-core/testcode/project-with-maven-settings/.gitignore +++ /dev/null @@ -1,3 +0,0 @@ -.m2/repository/ -.config -.rewrite \ No newline at end of file diff --git a/sbm-support-rewrite/.gitignore b/sbm-support-rewrite/.gitignore new file mode 100644 index 000000000..3fffeaa1f --- /dev/null +++ b/sbm-support-rewrite/.gitignore @@ -0,0 +1,2 @@ +/testcode/**/target/** +/testcode/**/.rewrite-cache/** \ No newline at end of file diff --git a/sbm-support-rewrite/pom.xml b/sbm-support-rewrite/pom.xml index 4be8876c6..a9fd0c760 100644 --- a/sbm-support-rewrite/pom.xml +++ b/sbm-support-rewrite/pom.xml @@ -230,7 +230,6 @@ org.codehaus.plexus plexus-cipher ${plexus-cypher.version} - test org.apache.maven.shared @@ -249,6 +248,31 @@ ${junit-pioneer.version} test + + + + org.springframework.boot + spring-boot-testcontainers + test + + + org.testcontainers + junit-jupiter + test + + + org.apache.commons + commons-text + 1.10.0 + test + + + org.powermock + powermock-core + 2.0.9 + test + + diff --git a/sbm-support-rewrite/src/main/java/org/springframework/sbm/boot/autoconfigure/ScopeConfiguration.java b/sbm-support-rewrite/src/main/java/org/springframework/sbm/boot/autoconfigure/ScopeConfiguration.java index bf83a1bd9..60e5ff889 100644 --- a/sbm-support-rewrite/src/main/java/org/springframework/sbm/boot/autoconfigure/ScopeConfiguration.java +++ b/sbm-support-rewrite/src/main/java/org/springframework/sbm/boot/autoconfigure/ScopeConfiguration.java @@ -17,8 +17,6 @@ import org.openrewrite.ExecutionContext; import org.openrewrite.InMemoryExecutionContext; -import org.openrewrite.java.AddOrUpdateAnnotationAttribute; -import org.openrewrite.maven.MavenExecutionContextView; import org.openrewrite.maven.cache.MavenPomCache; import org.springframework.beans.factory.config.BeanFactoryPostProcessor; import org.springframework.boot.autoconfigure.AutoConfiguration; @@ -74,9 +72,6 @@ Supplier executionContextSupplier() { @org.springframework.sbm.scopes.annotations.ScanScope ExecutionContext executionContext(ProjectMetadata projectMetadata, Supplier executionContextSupplier, MavenPomCache mavenPomCache) { ExecutionContext executionContext = executionContextSupplier.get(); - MavenExecutionContextView contextView = MavenExecutionContextView.view(executionContext); - contextView.setMavenSettings(projectMetadata.getMavenSettings()); - contextView.setPomCache(mavenPomCache); return executionContext; } diff --git a/sbm-support-rewrite/src/main/java/org/springframework/sbm/parsers/RewriteParserConfiguration.java b/sbm-support-rewrite/src/main/java/org/springframework/sbm/parsers/RewriteParserConfiguration.java index ba10f96cc..0b15c91ab 100644 --- a/sbm-support-rewrite/src/main/java/org/springframework/sbm/parsers/RewriteParserConfiguration.java +++ b/sbm-support-rewrite/src/main/java/org/springframework/sbm/parsers/RewriteParserConfiguration.java @@ -17,7 +17,6 @@ import lombok.extern.slf4j.Slf4j; import org.openrewrite.ExecutionContext; -import org.openrewrite.maven.MavenExecutionContextView; import org.openrewrite.maven.cache.*; import org.openrewrite.maven.utilities.MavenArtifactDownloader; import org.openrewrite.tree.ParsingEventListener; @@ -34,13 +33,11 @@ import org.springframework.sbm.parsers.events.RewriteParsingEventListenerAdapter; import org.springframework.sbm.parsers.maven.*; import org.springframework.sbm.project.resource.SbmApplicationProperties; -import org.springframework.sbm.scopes.ProjectMetadata; import org.springframework.sbm.scopes.ScanScope; import java.io.PrintWriter; import java.io.StringWriter; import java.nio.file.Path; -import java.nio.file.Paths; import java.util.function.Consumer; @@ -52,19 +49,9 @@ @Slf4j @AutoConfiguration(after = {ScopeConfiguration.class}) @EnableConfigurationProperties({ParserProperties.class, SbmApplicationProperties.class}) -@Import({ScanScope.class, ScopeConfiguration.class}) +@Import({ScanScope.class, ScopeConfiguration.class, RewriteParserMavenConfiguration.class}) public class RewriteParserConfiguration { - @Bean - MavenPasswordDecrypter mavenPasswordDecrypter() { - return new MavenPasswordDecrypter(); - } - - @Bean - MavenProvenanceMarkerFactory mavenProvenanceMarkerFactory() { - return new MavenProvenanceMarkerFactory(); - } - @Bean ProvenanceMarkerFactory provenanceMarkerFactory(MavenProvenanceMarkerFactory mavenPovenanceMarkerFactory) { return new ProvenanceMarkerFactory(mavenPovenanceMarkerFactory); @@ -76,38 +63,19 @@ JavaParserBuilder javaParserBuilder() { return new JavaParserBuilder(); } - @Bean - BuildFileParser buildFileParser() { - return new BuildFileParser(); - } - - - @Bean - @ConditionalOnMissingBean(MavenArtifactCache.class) - MavenArtifactCache mavenArtifactCache() { - return new LocalMavenArtifactCache(Paths.get(System.getProperty("user.home"), ".m2", "repository")).orElse( - new LocalMavenArtifactCache(Paths.get(System.getProperty("user.home"), ".rewrite", "cache", "artifacts")) - ); - } - @Bean Consumer artifactDownloaderErrorConsumer() { return (t) -> {throw new RuntimeException(t);}; } @Bean - RewriteMavenArtifactDownloader artifactDownloader(MavenArtifactCache mavenArtifactCache, ProjectMetadata projectMetadata, Consumer artifactDownloaderErrorConsumer) { - return new RewriteMavenArtifactDownloader(mavenArtifactCache, projectMetadata.getMavenSettings(), artifactDownloaderErrorConsumer); - } - - @Bean - ModuleParser helperWithoutAGoodName() { + ModuleParser moduleParser() { return new ModuleParser(); } @Bean - MavenModuleParser mavenModuleParser(ParserProperties parserPropeties, ModuleParser moduleParser) { - return new MavenModuleParser(parserPropeties, moduleParser); + MavenModuleParser mavenModuleParser(ParserProperties parserProperties, ModuleParser moduleParser) { + return new MavenModuleParser(parserProperties, moduleParser); } @Bean diff --git a/sbm-support-rewrite/src/main/java/org/springframework/sbm/parsers/maven/BuildFileParser.java b/sbm-support-rewrite/src/main/java/org/springframework/sbm/parsers/maven/BuildFileParser.java index 74c3e70ad..82f84440a 100644 --- a/sbm-support-rewrite/src/main/java/org/springframework/sbm/parsers/maven/BuildFileParser.java +++ b/sbm-support-rewrite/src/main/java/org/springframework/sbm/parsers/maven/BuildFileParser.java @@ -21,9 +21,7 @@ import org.openrewrite.Parser; import org.openrewrite.SourceFile; import org.openrewrite.marker.Marker; -import org.openrewrite.maven.MavenExecutionContextView; import org.openrewrite.maven.MavenParser; -import org.openrewrite.maven.MavenSettings; import org.openrewrite.xml.tree.Xml; import org.springframework.core.io.Resource; import org.springframework.sbm.utils.ResourceUtil; @@ -47,6 +45,8 @@ @RequiredArgsConstructor public class BuildFileParser { + private final MavenSettingsInitializer mavenSettingsInitilizer; + /** * Parse a list of Maven Pom files to a {@code List} of {@link Xml.Document}s. * The {@link Xml.Document}s get marked with {@link org.openrewrite.maven.tree.MavenResolutionResult} and the provided provenance markers. @@ -87,7 +87,7 @@ public List parseBuildFiles( MavenParser.Builder mavenParserBuilder = MavenParser.builder().mavenConfig(baseDir.resolve(".mvn/maven.config")); // 385 : 387 - initializeMavenSettings(executionContext); + mavenSettingsInitilizer.initializeMavenSettings(); // 395 : 398 mavenParserBuilder.activeProfiles(activeProfiles.toArray(new String[]{})); @@ -139,13 +139,6 @@ private Stream parsePoms(Path baseDir, List pomFiles, Ma return mavenParserBuilder.build().parseInputs(pomFileInputs, baseDir, executionContext).map(Xml.Document.class::cast); } - private void initializeMavenSettings(ExecutionContext executionContext) { - // FIXME: https://github.com/spring-projects-experimental/spring-boot-migrator/issues/880 - String repo = "file://" + Path.of(System.getProperty("user.home")).resolve(".m2/repository") + "/"; - MavenSettings mavenSettings = new MavenSettings(repo, null, null, null, null); - MavenExecutionContextView.view(executionContext).setMavenSettings(mavenSettings); - } - public List filterAndSortBuildFiles(List resources) { return resources.stream() .filter(r -> "pom.xml".equals(ResourceUtil.getPath(r).toFile().getName())) diff --git a/sbm-support-rewrite/src/main/java/org/springframework/sbm/parsers/maven/MavenPasswordDecrypter.java b/sbm-support-rewrite/src/main/java/org/springframework/sbm/parsers/maven/MavenPasswordDecrypter.java index 4a9ef930f..382b6c131 100644 --- a/sbm-support-rewrite/src/main/java/org/springframework/sbm/parsers/maven/MavenPasswordDecrypter.java +++ b/sbm-support-rewrite/src/main/java/org/springframework/sbm/parsers/maven/MavenPasswordDecrypter.java @@ -17,6 +17,9 @@ import lombok.RequiredArgsConstructor; import org.openrewrite.maven.MavenSettings; +import org.sonatype.plexus.components.cipher.DefaultPlexusCipher; +import org.sonatype.plexus.components.cipher.PlexusCipherException; +import org.sonatype.plexus.components.sec.dispatcher.DefaultSecDispatcher; import org.sonatype.plexus.components.sec.dispatcher.SecDispatcher; import org.sonatype.plexus.components.sec.dispatcher.SecDispatcherException; @@ -31,25 +34,33 @@ * * @author Fabian Krüger */ -@RequiredArgsConstructor -// TODO: should be package private -public class MavenPasswordDecrypter { +class MavenPasswordDecrypter { - public void decryptMavenServerPasswords(SecDispatcher secDispatcher, MavenSettings mavenSettings, Path mavenSecuritySettingsFile) { + private final SecDispatcher secDispatcher; + + public MavenPasswordDecrypter() { + try { + this.secDispatcher = new DefaultSecDispatcher(new DefaultPlexusCipher()); + } catch (PlexusCipherException e) { + throw new RuntimeException(e); + } + } + + public void decryptMavenServerPasswords(MavenSettings mavenSettings, Path mavenSecuritySettingsFile) { System.setProperty("settings.security", mavenSecuritySettingsFile.toString()); if (mavenSettings.getServers() != null && mavenSettings.getServers().getServers() != null) { List servers = mavenSettings.getServers().getServers(); for (int i = 0; i < servers.size(); i++) { MavenSettings.Server server = servers.get(i); if (server.getPassword() != null) { - MavenSettings.Server serverWithDecodedPw = decryptPassword(secDispatcher, server); + MavenSettings.Server serverWithDecodedPw = decryptPassword(server); servers.set(i, serverWithDecodedPw); } } } } - private MavenSettings.Server decryptPassword(SecDispatcher secDispatcher, MavenSettings.Server server) { + private MavenSettings.Server decryptPassword(MavenSettings.Server server) { try { String decryptionResult = secDispatcher.decrypt(server.getPassword()); return server.withPassword(decryptionResult); diff --git a/sbm-support-rewrite/src/main/java/org/springframework/sbm/parsers/maven/MavenSettingsInitializer.java b/sbm-support-rewrite/src/main/java/org/springframework/sbm/parsers/maven/MavenSettingsInitializer.java new file mode 100644 index 000000000..434276f0e --- /dev/null +++ b/sbm-support-rewrite/src/main/java/org/springframework/sbm/parsers/maven/MavenSettingsInitializer.java @@ -0,0 +1,88 @@ +/* + * Copyright 2021 - 2023 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.springframework.sbm.parsers.maven; + +import lombok.RequiredArgsConstructor; +import org.openrewrite.ExecutionContext; +import org.openrewrite.internal.lang.Nullable; +import org.openrewrite.maven.MavenExecutionContextView; +import org.openrewrite.maven.MavenSettings; +import org.openrewrite.maven.internal.RawRepositories; +import org.openrewrite.maven.tree.MavenRepository; +import org.openrewrite.maven.tree.ProfileActivation; +import org.springframework.sbm.scopes.ProjectMetadata; +import org.springframework.stereotype.Component; + +import java.nio.file.Files; +import java.nio.file.Path; +import java.util.List; + +/** + * Initialize {@link MavenSettings} with information from {@code ~/.m2/settings.xml} and {@code settings-security.xml}. + * + * @author Fabian Krüger + */ +@Component +@RequiredArgsConstructor +public class MavenSettingsInitializer { + + private final ExecutionContext executionContext; + private final ProjectMetadata projectMetadata; + private final MavenPasswordDecrypter passwordDecrypter; + + public MavenSettingsInitializer(ExecutionContext executionContext, ProjectMetadata projectMetadata) { + this.executionContext = executionContext; + this.projectMetadata = projectMetadata; + passwordDecrypter = new MavenPasswordDecrypter(); + } + + public void initializeMavenSettings() { + Path userHome = Path.of(System.getProperty("user.home")); + String m2RepoPath = userHome.resolve(".m2/repository").toAbsolutePath().normalize() + "/"; + String repo = "file://" + m2RepoPath; + Path mavenSettingsFile = userHome.resolve(".m2/settings.xml"); + Path mavenSecuritySettingsFile = userHome.resolve(".m2/settings-security.xml"); + + MavenRepository mavenRepository = new MavenRepository("local", repo, null, null, true, null, null, null); + MavenSettings.Profile defaultProfile = new MavenSettings.Profile("default", null, new RawRepositories()); + MavenSettings.@Nullable Profiles profiles = new MavenSettings.Profiles(List.of(defaultProfile)); + MavenSettings.@Nullable ActiveProfiles activeProfiles = new MavenSettings.ActiveProfiles(List.of("default")); + MavenSettings.@Nullable Mirrors mirrors = new MavenSettings.Mirrors(); + MavenSettings.Servers servers = new MavenSettings.Servers(); + MavenSettings mavenSettings = new MavenSettings(m2RepoPath, mavenRepository, profiles, activeProfiles, mirrors, servers); + + // TODO: Add support for global Maven settings (${maven.home}/conf/settings.xml). + MavenExecutionContextView mavenExecutionContextView = MavenExecutionContextView.view(executionContext); + if (Files.exists(mavenSettingsFile)) { + mavenSettings = mavenSettings.merge(MavenSettings.parse(mavenSettingsFile, mavenExecutionContextView)); + if(mavenSecuritySettingsFile.toFile().exists()) { + passwordDecrypter.decryptMavenServerPasswords(mavenSettings, mavenSecuritySettingsFile); + } + } +// +// if(mavenSettings.getMavenLocal() == null) { +// mavenSettings.setMavenLocal(new MavenRepository("local", repo, null, null, true, null, null, null)); +// } +// +// if(mavenSettings.getActiveProfiles() == null) { +// mavenSettings.set +// } + + mavenExecutionContextView.setMavenSettings(mavenSettings); + projectMetadata.setMavenSettings(mavenSettings); + } + +} diff --git a/sbm-support-rewrite/src/main/java/org/springframework/sbm/parsers/RewriteMavenArtifactDownloader.java b/sbm-support-rewrite/src/main/java/org/springframework/sbm/parsers/maven/RewriteMavenArtifactDownloader.java similarity index 97% rename from sbm-support-rewrite/src/main/java/org/springframework/sbm/parsers/RewriteMavenArtifactDownloader.java rename to sbm-support-rewrite/src/main/java/org/springframework/sbm/parsers/maven/RewriteMavenArtifactDownloader.java index 183772206..b0c09f336 100644 --- a/sbm-support-rewrite/src/main/java/org/springframework/sbm/parsers/RewriteMavenArtifactDownloader.java +++ b/sbm-support-rewrite/src/main/java/org/springframework/sbm/parsers/maven/RewriteMavenArtifactDownloader.java @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.springframework.sbm.parsers; +package org.springframework.sbm.parsers.maven; import lombok.extern.slf4j.Slf4j; import org.openrewrite.internal.lang.Nullable; diff --git a/sbm-support-rewrite/src/main/java/org/springframework/sbm/parsers/maven/RewriteParserMavenConfiguration.java b/sbm-support-rewrite/src/main/java/org/springframework/sbm/parsers/maven/RewriteParserMavenConfiguration.java new file mode 100644 index 000000000..49ce157e2 --- /dev/null +++ b/sbm-support-rewrite/src/main/java/org/springframework/sbm/parsers/maven/RewriteParserMavenConfiguration.java @@ -0,0 +1,65 @@ +/* + * Copyright 2021 - 2023 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.springframework.sbm.parsers.maven; + +import org.openrewrite.ExecutionContext; +import org.openrewrite.maven.cache.LocalMavenArtifactCache; +import org.openrewrite.maven.cache.MavenArtifactCache; +import org.springframework.boot.autoconfigure.AutoConfiguration; +import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Import; +import org.springframework.sbm.boot.autoconfigure.ScopeConfiguration; +import org.springframework.sbm.scopes.ProjectMetadata; + +import java.nio.file.Paths; +import java.util.function.Consumer; + +/** + * @author Fabian Krüger + */ +@AutoConfiguration +@Import({ScopeConfiguration.class}) +public class RewriteParserMavenConfiguration { + + @Bean + MavenProvenanceMarkerFactory mavenProvenanceMarkerFactory() { + return new MavenProvenanceMarkerFactory(); + } + + @Bean + BuildFileParser buildFileParser(MavenSettingsInitializer mavenSettingsInitializer) { + return new BuildFileParser(mavenSettingsInitializer); + } + + @Bean + RewriteMavenArtifactDownloader artifactDownloader(MavenArtifactCache mavenArtifactCache, ProjectMetadata projectMetadata, Consumer artifactDownloaderErrorConsumer) { + return new RewriteMavenArtifactDownloader(mavenArtifactCache, projectMetadata.getMavenSettings(), artifactDownloaderErrorConsumer); + } + + @Bean + @ConditionalOnMissingBean(MavenArtifactCache.class) + MavenArtifactCache mavenArtifactCache() { + return new LocalMavenArtifactCache(Paths.get(System.getProperty("user.home"), ".m2", "repository")).orElse( + new LocalMavenArtifactCache(Paths.get(System.getProperty("user.home"), ".rewrite", "cache", "artifacts")) + ); + } + + @Bean + MavenSettingsInitializer mavenSettingsInitializer(ExecutionContext executionContext, ProjectMetadata projectMetadata) { + return new MavenSettingsInitializer(executionContext, projectMetadata); + } +} diff --git a/sbm-support-rewrite/src/test/java/org/openrewrite/JavaParserTest.java b/sbm-support-rewrite/src/test/java/org/openrewrite/JavaParserTest.java index 73c255557..1d4ccb437 100644 --- a/sbm-support-rewrite/src/test/java/org/openrewrite/JavaParserTest.java +++ b/sbm-support-rewrite/src/test/java/org/openrewrite/JavaParserTest.java @@ -36,7 +36,7 @@ public class JavaParserTest { @Test @DisplayName("shouldHaveTypeInUse") - @Disabled("Examination test") + @Disabled("Examination the JavaParser") void shouldHaveTypeInUse() { String localM2Repo = Path.of(System.getProperty("user.home")).resolve(".m2/repository").toString(); diff --git a/sbm-support-rewrite/src/test/java/org/springframework/sbm/PrivateArtifactRepositoryTest.java b/sbm-support-rewrite/src/test/java/org/springframework/sbm/PrivateArtifactRepositoryTest.java new file mode 100644 index 000000000..ec4a6d5c5 --- /dev/null +++ b/sbm-support-rewrite/src/test/java/org/springframework/sbm/PrivateArtifactRepositoryTest.java @@ -0,0 +1,362 @@ +/* + * Copyright 2021 - 2023 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.springframework.sbm; + +import org.apache.commons.io.FileUtils; +import org.apache.maven.shared.invoker.*; +import org.junit.jupiter.api.*; +import org.junit.jupiter.api.io.TempDir; +import org.openrewrite.java.marker.JavaSourceSet; +import org.openrewrite.java.tree.J; +import org.openrewrite.java.tree.JavaType; +import org.openrewrite.maven.cache.LocalMavenArtifactCache; +import org.openrewrite.maven.cache.MavenArtifactCache; +import org.openrewrite.maven.tree.MavenRepository; +import org.powermock.reflect.Whitebox; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.sbm.boot.autoconfigure.SbmSupportRewriteConfiguration; +import org.springframework.sbm.parsers.RewriteProjectParser; +import org.springframework.sbm.parsers.RewriteProjectParsingResult; +import org.springframework.sbm.parsers.maven.SbmTestConfiguration; +import org.springframework.util.FileSystemUtils; +import org.testcontainers.containers.GenericContainer; +import org.testcontainers.junit.jupiter.Container; +import org.testcontainers.junit.jupiter.Testcontainers; +import org.testcontainers.utility.DockerImageName; +import org.testcontainers.utility.MountableFile; + +import java.io.*; +import java.net.URL; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.util.Arrays; +import java.util.List; +import java.util.zip.ZipEntry; +import java.util.zip.ZipInputStream; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Fail.fail; + +/** + * Test that dependencies from a private repository can be downloaded with provided credentials. + *

+ * A secured private repository is started as Docker container and a project depending on a dependency + * only available through the repository gets parsed. + * Verifying the types of the dependency were resolved proves that the secured access to the repository was successful + * and thus credentials provided were decrypted and used. + * All resources for this test live under {@code ./testcode/maven-projects/private-repository}. + *

    + *
  • {@code dependency-project} provides the code for the dependency {@code com.acme.dependency:dependency-project:1.0-SNAPSHOT}.
  • + *
  • {@code dependent-project} provides code that depends on {@code dependency-project}.
  • + *
  • {@code user.home} provides {@code .m2} and required Maven files {@code settings.xml} and {@code settings-security.xml}
  • + *
  • {@code reposilite-data} provides files used by reposilite to provide the required configuration and state (auth + dependency)
  • + *
+ *

+ * The test starts a private repository in a Docker container, removes any cached local jars + * and scans {@code dependent-project}. + * It then verifies that type information from {@code com.acme.dependency:dependency-project:1.0-SNAPSHOT} + * was retrieved from the private repository. + *

+ * The credentials are provided through {@code ~/.m2/settings.xml} and {@code ~/.m2/settings-security.xml}. + * To not interfere the local Maven installation and configuration, the user home directory is redirected + * to {@code ./testcode/maven-projects/private-repository/user.home}. + * Therefor the Maven {@code .m2} is pointing to {@code ./testcode/maven-projects/private-repository/user.home/.m2} + * and configuration files are taken from there. + * + * @author Fabian Krüger + */ +@SpringBootTest(classes = {MavenArtifactCacheTestConfig.class, SbmSupportRewriteConfiguration.class, SbmTestConfiguration.class}) +@Testcontainers +public class PrivateArtifactRepositoryTest { + + // All test resources live here + public static final String TESTCODE_DIR = "testcode/maven-projects/private-repository"; + + // The private Artifact repository (reposilite) provides the dependency. + @Container + static GenericContainer reposilite = new GenericContainer(DockerImageName.parse("dzikoysk/reposilite:3.4.10")) + .withExposedPorts(8080) + // copy required config files and cached dependency to repository + .withCopyFileToContainer( + MountableFile.forHostPath("./" + TESTCODE_DIR + "/reposilite-data"), + "/app/data" + ) + // Create temp user 'user' with password 'secret' + .withEnv("REPOSILITE_OPTS", "--token user:secret --shared-config shared.configuration.json"); + + public static final String DEPENDENCY_CLASS_FQNAME = "com.example.dependency.DependencyClass"; + private static final String NEW_USER_HOME = Path.of(".").resolve(TESTCODE_DIR + "/user.home").toAbsolutePath().normalize().toString(); + private static final Path DEPENDENCY_PATH_IN_LOCAL_MAVEN_REPO = Path.of(NEW_USER_HOME + "/.m2/repository/com/example/dependency/dependency-project").toAbsolutePath().normalize(); + private static final File LOCAL_MAVEN_REPOSITORY = Path.of(NEW_USER_HOME + "/.m2/repository").toFile(); + private static MavenRepository originalMavenRepository; + private static String originalUserHome; + @Autowired + private RewriteProjectParser parser; + + @BeforeAll + static void beforeAll(@TempDir Path tempDir) { + originalUserHome = System.getProperty("user.home"); + System.setProperty("user.home", NEW_USER_HOME); + originalMavenRepository = MavenRepository.MAVEN_LOCAL_DEFAULT; + // overwrites MavenRepository.MAVEN_LOCAL_DEFAULT which is statically initialized and used previous value of + // 'user.home'. This constant is used elsewhere to retrieve the default local Maven repo URI. + // To reflect the new user.home this constant is overwritten using Powermock Whitebox class and then set back + // in after the test. + MavenRepository mavenRepository = new MavenRepository("local", new File(System.getProperty("user.home") + "/.m2/repository").toURI().toString(), "true", "true", true, null, null, false); + Whitebox.setInternalState(MavenRepository.class, "MAVEN_LOCAL_DEFAULT", mavenRepository); + } + + @AfterAll + static void afterAll() { + // set back to initial values + System.setProperty("user.home", originalUserHome); + Whitebox.setInternalState(MavenRepository.class, "MAVEN_LOCAL_DEFAULT", originalMavenRepository); + FileSystemUtils.deleteRecursively(LOCAL_MAVEN_REPOSITORY); + } + + @BeforeEach + void beforeEach() throws IOException { + Integer port = reposilite.getMappedPort(8080); + System.out.println("Reposilite: http://localhost:" + port + " login with user:secret"); + TestHelper.renderTemplates(port); + TestHelper.clearDependencyFromLocalMavenRepo(); + } + + @Test + @DisplayName("Maven settings should be read from secured private repo") + void mavenSettingsShouldBeReadFromSecuredPrivateRepo() { + verifyDependencyDoesNotExistInLocalMavenRepo(); + RewriteProjectParsingResult parsingResult = parseDependentProject(); + verifyDependencyExistsInLocalMavenRepo(); + verifyTypesFromDependencyWereResolved(parsingResult); + } + + private static void verifyTypesFromDependencyWereResolved(RewriteProjectParsingResult parsingResult) { + J.CompilationUnit cu = (J.CompilationUnit) parsingResult.sourceFiles().stream().filter(s -> s.getSourcePath().toFile().getName().endsWith(".java")).findFirst().get(); + List fqClassesInUse = cu.getTypesInUse().getTypesInUse().stream().filter(JavaType.FullyQualified.class::isInstance).map(JavaType.FullyQualified.class::cast).map(JavaType.FullyQualified::getFullyQualifiedName).toList(); + + // DependencyClass must be in list of used types + assertThat(fqClassesInUse).contains(DEPENDENCY_CLASS_FQNAME); + + // type should be on classpath + List classpathFqNames = cu.getMarkers().findFirst(JavaSourceSet.class).get().getClasspath().stream().map(fqn -> fqn.getFullyQualifiedName()).toList(); + assertThat(classpathFqNames).contains(DEPENDENCY_CLASS_FQNAME); + + // Type of member should be resolvable + J.ClassDeclaration classDeclaration = cu.getClasses().get(0); + JavaType.Class type = (JavaType.Class) ((J.VariableDeclarations) classDeclaration.getBody().getStatements().get(0)).getType(); + assertThat(type.getFullyQualifiedName()).isEqualTo(DEPENDENCY_CLASS_FQNAME); + } + + private static void verifyDependencyExistsInLocalMavenRepo() { + Path snapshotDir = DEPENDENCY_PATH_IN_LOCAL_MAVEN_REPO.resolve("1.0-SNAPSHOT").toAbsolutePath().normalize(); + assertThat(snapshotDir).isDirectory(); + assertThat(Arrays.stream(snapshotDir.toFile().listFiles()).map(f -> f.getName()).findFirst().get()).matches("dependency-project-1.0-.*\\.jar"); + } + + private RewriteProjectParsingResult parseDependentProject() { + Path migrateApplication = Path.of(TESTCODE_DIR + "/dependent-project"); + RewriteProjectParsingResult parsingResult = parser.parse(migrateApplication); + return parsingResult; + } + + private static void verifyDependencyDoesNotExistInLocalMavenRepo() { + Path dependencyArtifactDir = DEPENDENCY_PATH_IN_LOCAL_MAVEN_REPO.getParent(); + assertThat(LOCAL_MAVEN_REPOSITORY).isDirectory(); + assertThat(LOCAL_MAVEN_REPOSITORY.listFiles()).isEmpty(); + } + + class TestHelper { + + public static final String $USER_HOME_PLACEHOLDER = "${user.home}"; + public static final String $PORT_PLACEHOLDER = "${port}"; + + private static void renderTemplates(Integer port) throws IOException { + // create pom.xml with correct port for dependency-project + Path dependencyPomTmplPath = Path.of(TESTCODE_DIR + "/dependency-project/pom.xml.template").toAbsolutePath().normalize(); + Path dependencyPomPath = renderPomXml(port, dependencyPomTmplPath); + + // create pom.xml with correct port for dependent-project + Path dependentPomTmplPath = Path.of(TESTCODE_DIR + "/dependent-project/pom.xml.template").toAbsolutePath().normalize(); + Path dependentPomPath = renderPomXml(port, dependentPomTmplPath); + + // adjust path in settings.xml + Path settingsXmlTmplPath = Path.of("./").resolve(NEW_USER_HOME + "/.m2/settings.xml.template").toAbsolutePath().normalize(); + renderSettingsXml(NEW_USER_HOME, settingsXmlTmplPath); + } + + private static Path renderSettingsXml(String testcodeDir, Path settingsXmlTmplPath) throws IOException { + String settingsXmlContent = Files.readString(settingsXmlTmplPath); + String replaced = settingsXmlContent.replace($USER_HOME_PLACEHOLDER, testcodeDir); + Path settingsXmlPath = Path.of(settingsXmlTmplPath.toString().replace(".template", "")); + return Files.writeString(settingsXmlPath, replaced); + } + + private static Path renderPomXml(Integer port, Path pomXmlTmplPath) throws IOException { + String given = Files.readString(pomXmlTmplPath); + String replaced = given.replace($PORT_PLACEHOLDER, port.toString()); + Path pomXmlPath = Path.of(pomXmlTmplPath.toString().replace(".template", "")); + return Files.writeString(pomXmlPath, replaced); + } + + static void clearDependencyFromLocalMavenRepo() { + try { + FileSystemUtils.deleteRecursively(DEPENDENCY_PATH_IN_LOCAL_MAVEN_REPO); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + } + + /* + * Currently not used as the dependency is provided to the container (cached). + * But kept in case deployment of the dependency or building the dependent project is needed. + */ + class DeploymentHelper { + + void deployDependency(Path pomXmlPath) throws MavenInvocationException { + InvocationRequest request = new DefaultInvocationRequest(); + request.setPomFile(pomXmlPath.toFile()); + request.setShowErrors(true); + request.setUserSettingsFile(Path.of(TESTCODE_DIR + "/user.home/.m2/settings-clear-password.xml").toFile()); + request.setGoals(List.of("deploy")); + request.setLocalRepositoryDirectory(LOCAL_MAVEN_REPOSITORY); + request.setBatchMode(true); + Invoker invoker = new DefaultInvoker(); + invoker.setMavenHome(Path.of(TESTCODE_DIR + "/user.home/apache-maven-3.9.5").toFile()); + InvocationResult result = invoker.execute(request); + if (result.getExitCode() != 0) { + if (result.getExecutionException() != null) { + fail("Maven deploy failed.", result.getExecutionException()); + } else { + fail("Maven deploy failed. Exit code: " + result.getExitCode()); + } + } + } + + private void buildProject(Path dependentPomPath) throws MavenInvocationException { + InvocationRequest request = new DefaultInvocationRequest(); + request.setPomFile(dependentPomPath.toFile()); + request.setShowErrors(true); + request.setUserSettingsFile(Path.of(TESTCODE_DIR + "/user.home/.m2/settings.xml").toFile()); + request.setGoals(List.of("clean", "package")); + request.setLocalRepositoryDirectory(LOCAL_MAVEN_REPOSITORY); + request.setBatchMode(true); + request.setGlobalChecksumPolicy(InvocationRequest.CheckSumPolicy.Warn); + request.setOutputHandler(s -> System.out.println(s)); + Invoker invoker = new DefaultInvoker(); + invoker.setMavenHome(Path.of(TESTCODE_DIR + "/user.home/apache-maven-3.9.5").toFile()); + InvocationResult result = invoker.execute(request); + if (result.getExitCode() != 0) { + if (result.getExecutionException() != null) { + fail("Maven clean package failed.", result.getExecutionException()); + } else { + fail("Maven clean package. Exit code: " + result.getExitCode()); + } + } + } + + static void installMavenForTestIfNotExists(Path tempDir) { + if (!Path.of("./testcode/maven-projects/private-repository/user.home/apache-maven-3.9.5/bin/mvn").toFile().exists()) { + String mavenDownloadUrl = "https://dlcdn.apache.org/maven/maven-3/3.9.5/binaries/apache-maven-3.9.5-bin.zip"; + try { + Path mavenInstallDir = Path.of(TESTCODE_DIR + "/user.home"); + File downloadedMavenZipFile = tempDir.resolve("apache-maven-3.9.5-bin.zip").toFile(); + FileUtils.copyURLToFile( + new URL(mavenDownloadUrl), + downloadedMavenZipFile, + 10000, + 30000); + Unzipper.unzip(downloadedMavenZipFile, mavenInstallDir); + File file = mavenInstallDir.resolve("apache-maven-3.9.5/bin/mvn").toFile(); + file.setExecutable(true, false); + assertThat(file.canExecute()).isTrue(); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + } + + class Unzipper { + private static void unzip(File downloadedMavenZipFile, Path mavenInstallDir) { + try { + byte[] buffer = new byte[1024]; + ZipInputStream zis = null; + + zis = new ZipInputStream(new FileInputStream(downloadedMavenZipFile)); + + ZipEntry zipEntry = zis.getNextEntry(); + while (zipEntry != null) { + File newFile = newFile(mavenInstallDir.toFile(), zipEntry); + if (zipEntry.isDirectory()) { + if (!newFile.isDirectory() && !newFile.mkdirs()) { + throw new IOException("Failed to create directory " + newFile); + } + } else { + // fix for Windows-created archives + File parent = newFile.getParentFile(); + if (!parent.isDirectory() && !parent.mkdirs()) { + throw new IOException("Failed to create directory " + parent); + } + + // write file content + FileOutputStream fos = new FileOutputStream(newFile); + int len; + while ((len = zis.read(buffer)) > 0) { + fos.write(buffer, 0, len); + } + fos.close(); + } + zipEntry = zis.getNextEntry(); + } + zis.closeEntry(); + zis.close(); + } catch (FileNotFoundException e) { + throw new RuntimeException(e); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + + public static File newFile(File destinationDir, ZipEntry zipEntry) throws IOException { + File destFile = new File(destinationDir, zipEntry.getName()); + + String destDirPath = destinationDir.getCanonicalPath(); + String destFilePath = destFile.getCanonicalPath(); + + if (!destFilePath.startsWith(destDirPath + java.io.File.separator)) { + throw new IOException("Entry is outside of the target dir: " + zipEntry.getName()); + } + + return destFile; + } + } + } + +} + +// Overwrite MavenArtifactCache to use the modified 'user.home'. +@Configuration +class MavenArtifactCacheTestConfig { + @Bean + MavenArtifactCache mavenArtifactCache() { + return new LocalMavenArtifactCache(Paths.get(System.getProperty("user.home"), ".m2", "repository")); + } +} \ No newline at end of file diff --git a/sbm-support-rewrite/src/test/java/org/springframework/sbm/parsers/BuildFileParserTest.java b/sbm-support-rewrite/src/test/java/org/springframework/sbm/parsers/BuildFileParserTest.java index 3d6082ea0..d566551ba 100644 --- a/sbm-support-rewrite/src/test/java/org/springframework/sbm/parsers/BuildFileParserTest.java +++ b/sbm-support-rewrite/src/test/java/org/springframework/sbm/parsers/BuildFileParserTest.java @@ -16,6 +16,7 @@ package org.springframework.sbm.parsers; import org.intellij.lang.annotations.Language; +import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Nested; import org.junit.jupiter.api.Test; @@ -26,6 +27,8 @@ import org.openrewrite.xml.tree.Xml; import org.springframework.core.io.Resource; import org.springframework.sbm.parsers.maven.BuildFileParser; +import org.springframework.sbm.parsers.maven.MavenSettingsInitializer; +import org.springframework.sbm.scopes.ProjectMetadata; import org.springframework.sbm.test.util.DummyResource; import org.springframework.sbm.utils.ResourceUtil; @@ -99,7 +102,14 @@ public class GivenSimpleMavenMultiModuleProject { """; - private final BuildFileParser sut = new BuildFileParser(); + private BuildFileParser sut; + + @BeforeEach + void beforeEach() { + ExecutionContext executionContext = new InMemoryExecutionContext(t -> {throw new RuntimeException(t);}); + MavenSettingsInitializer mavenSettingsInitializer = new MavenSettingsInitializer(executionContext, new ProjectMetadata()); + sut = new BuildFileParser(mavenSettingsInitializer); + } @Test void filterAndSortBuildFiles_shouldReturnSortedListOfFilteredBuildFiles() { diff --git a/sbm-support-rewrite/src/test/java/org/springframework/sbm/parsers/CompareParserRecipeRunTest.java b/sbm-support-rewrite/src/test/java/org/springframework/sbm/parsers/CompareParserRecipeRunTest.java index 8c7002bbe..2cfecc1fd 100644 --- a/sbm-support-rewrite/src/test/java/org/springframework/sbm/parsers/CompareParserRecipeRunTest.java +++ b/sbm-support-rewrite/src/test/java/org/springframework/sbm/parsers/CompareParserRecipeRunTest.java @@ -17,8 +17,6 @@ import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; -import org.junitpioneer.jupiter.ExpectedToFail; -import org.junitpioneer.jupiter.Issue; import org.openrewrite.ExecutionContext; import org.openrewrite.Recipe; import org.openrewrite.RecipeRun; @@ -63,8 +61,8 @@ public class CompareParserRecipeRunTest { void runningARecipeWithRewriteMavenParserYieldsTheSameResultAsWithRewriteProjectParser() { Path baseDir = TestProjectHelper.getMavenProject("parser-recipe-run"); ParallelParsingResult parallelParsingResult = new ParserExecutionHelper().parseParallel(baseDir); - RewriteProjectParsingResult sutParsingResult = parallelParsingResult.testedParsingResult(); - RewriteProjectParsingResult compParsingResult = parallelParsingResult.comparingParsingResult(); + RewriteProjectParsingResult sutParsingResult = parallelParsingResult.actualParsingResult(); + RewriteProjectParsingResult compParsingResult = parallelParsingResult.expectedParsingResult(); AtomicInteger counter = new AtomicInteger(0); diff --git a/sbm-support-rewrite/src/test/java/org/springframework/sbm/parsers/RewriteProjectParserParityTest.java b/sbm-support-rewrite/src/test/java/org/springframework/sbm/parsers/RewriteProjectParserParityTest.java index 7d7107173..fe30cc39e 100644 --- a/sbm-support-rewrite/src/test/java/org/springframework/sbm/parsers/RewriteProjectParserParityTest.java +++ b/sbm-support-rewrite/src/test/java/org/springframework/sbm/parsers/RewriteProjectParserParityTest.java @@ -26,47 +26,27 @@ import org.openrewrite.InMemoryExecutionContext; import org.openrewrite.Parser; import org.openrewrite.SourceFile; -import org.openrewrite.java.JavaParser; -import org.openrewrite.java.internal.JavaTypeCache; -import org.openrewrite.java.marker.JavaProject; -import org.openrewrite.java.marker.JavaSourceSet; -import org.openrewrite.java.marker.JavaVersion; -import org.openrewrite.java.tree.J; -import org.openrewrite.java.tree.JavaType; -import org.openrewrite.marker.BuildTool; -import org.openrewrite.marker.GitProvenance; -import org.openrewrite.marker.OperatingSystemProvenance; -import org.openrewrite.marker.ci.GithubActionsBuildEnvironment; -import org.openrewrite.maven.MavenExecutionContextView; -import org.openrewrite.maven.MavenSettings; -import org.openrewrite.maven.cache.CompositeMavenPomCache; -import org.openrewrite.maven.tree.MavenResolutionResult; import org.openrewrite.shaded.jgit.api.errors.GitAPIException; import org.openrewrite.tree.ParsingEventListener; import org.openrewrite.tree.ParsingExecutionContextView; -import org.openrewrite.xml.style.Autodetect; -import org.openrewrite.xml.tree.Xml; import org.springframework.sbm.parsers.maven.ComparingParserFactory; import org.springframework.sbm.parsers.maven.RewriteMavenProjectParser; -import org.springframework.sbm.test.util.TestProjectHelper; import org.springframework.sbm.test.util.DummyResource; import org.springframework.sbm.test.util.ParserParityTestHelper; -import org.springframework.test.util.ReflectionTestUtils; +import org.springframework.sbm.test.util.TestProjectHelper; -import java.nio.charset.Charset; import java.nio.file.Path; -import java.time.Duration; import java.time.Instant; import java.time.ZoneId; import java.time.format.DateTimeFormatter; import java.time.format.FormatStyle; -import java.util.*; -import java.util.function.Consumer; -import java.util.stream.Collectors; +import java.util.ArrayList; +import java.util.List; +import java.util.Locale; +import java.util.Set; import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Fail.fail; -import static org.mockito.Mockito.mock; @@ -131,37 +111,6 @@ public static void main(String[] args){ } """; - - List classpath = List.of( - Path.of("/Users/fkrueger/.m2/repository/org/springframework/boot/spring-boot-starter/3.1.1/spring-boot-starter-3.1.1.jar"), - Path.of("/Users/fkrueger/.m2/repository/org/springframework/boot/spring-boot/3.1.1/spring-boot-3.1.1.jar"), - Path.of("/Users/fkrueger/.m2/repository/org/springframework/spring-context/6.0.10/spring-context-6.0.10.jar"), - Path.of("/Users/fkrueger/.m2/repository/org/springframework/spring-aop/6.0.10/spring-aop-6.0.10.jar"), - Path.of("/Users/fkrueger/.m2/repository/org/springframework/spring-beans/6.0.10/spring-beans-6.0.10.jar"), - Path.of("/Users/fkrueger/.m2/repository/org/springframework/spring-expression/6.0.10/spring-expression-6.0.10.jar"), - Path.of("/Users/fkrueger/.m2/repository/org/springframework/boot/spring-boot-autoconfigure/3.1.1/spring-boot-autoconfigure-3.1.1.jar"), - Path.of("/Users/fkrueger/.m2/repository/org/springframework/boot/spring-boot-starter-logging/3.1.1/spring-boot-starter-logging-3.1.1.jar"), - Path.of("/Users/fkrueger/.m2/repository/ch/qos/logback/logback-classic/1.4.8/logback-classic-1.4.8.jar"), - Path.of("/Users/fkrueger/.m2/repository/ch/qos/logback/logback-core/1.4.8/logback-core-1.4.8.jar"), - Path.of("/Users/fkrueger/.m2/repository/org/slf4j/slf4j-api/2.0.7/slf4j-api-2.0.7.jar"), - Path.of("/Users/fkrueger/.m2/repository/org/apache/logging/log4j/log4j-to-slf4j/2.20.0/log4j-to-slf4j-2.20.0.jar"), - Path.of("/Users/fkrueger/.m2/repository/org/apache/logging/log4j/log4j-api/2.20.0/log4j-api-2.20.0.jar"), - Path.of("/Users/fkrueger/.m2/repository/org/slf4j/jul-to-slf4j/2.0.7/jul-to-slf4j-2.0.7.jar"), - Path.of("/Users/fkrueger/.m2/repository/jakarta/annotation/jakarta.annotation-api/2.1.1/jakarta.annotation-api-2.1.1.jar"), - Path.of("/Users/fkrueger/.m2/repository/org/springframework/spring-core/6.0.10/spring-core-6.0.10.jar"), - Path.of("/Users/fkrueger/.m2/repository/org/springframework/spring-jcl/6.0.10/spring-jcl-6.0.10.jar"), - Path.of("/Users/fkrueger/.m2/repository/org/yaml/snakeyaml/1.33/snakeyaml-1.33.jar") - ); - JavaTypeCache javaTypeCache = new JavaTypeCache(); - SourceFile sourceFile = JavaParser.fromJavaVersion().classpath(classpath).typeCache(javaTypeCache) - .build() - .parse(javaClass) - .toList() - .get(0); - - JavaSourceSet.build("main", classpath, javaTypeCache, true); - - TestProjectHelper.createTestProject(tempDir) .withResources( new DummyResource(tempDir.resolve("src/main/java/com/example/MyMain.java"), javaClass), @@ -178,7 +127,6 @@ public static void main(String[] args){ ParserParityTestHelper .scanProjectDir(tempDir) .withParserProperties(comparingParserProperties) - .parseSequentially() .verifyParity(); } @@ -187,68 +135,6 @@ private static InMemoryExecutionContext createExecutionContext() { return new InMemoryExecutionContext(t -> t.printStackTrace()); } - private void verifyParsingResult(RewriteProjectParsingResult parsingResult, ParserType parserType) { - // Verify result - List sourceFiles = parsingResult.sourceFiles(); - assertThat(sourceFiles).isNotEmpty(); - assertThat(sourceFiles).hasSize(2); - SourceFile pom = sourceFiles.get(0); - assertThat(pom).isInstanceOf(Xml.Document.class); - int expectedNumMarkers = 7; - if (System.getenv("GITHUB_ACTION_REF") != null) { - expectedNumMarkers = 8; - } - assertThat(pom.getMarkers().getMarkers()).hasSize(expectedNumMarkers); - assertThat(pom.getMarkers().findFirst(MavenResolutionResult.class).get().getPom().getRequested().getDependencies()).hasSize(1); - assertThat(pom.getMarkers().findFirst(GitProvenance.class)).isNotNull(); - assertThat(pom.getMarkers().findFirst(OperatingSystemProvenance.class)).isNotNull(); - assertThat(pom.getMarkers().findFirst(BuildTool.class)).isNotNull(); - assertThat(pom.getMarkers().findFirst(JavaVersion.class)).isNotNull(); - assertThat(pom.getMarkers().findFirst(JavaProject.class)).isNotNull(); - assertThat(pom.getMarkers().findFirst(Autodetect.class)).isNotNull(); - - assertThat(sourceFiles.get(1)).isInstanceOf(J.CompilationUnit.class); - J.CompilationUnit compilationUnit = J.CompilationUnit.class.cast(sourceFiles.get(1)); - assertThat(compilationUnit.getMarkers().getMarkers()).hasSize(expectedNumMarkers); - assertThat(compilationUnit.getMarkers().findFirst(GitProvenance.class)).isNotNull(); - assertThat(compilationUnit.getMarkers().findFirst(OperatingSystemProvenance.class)).isNotNull(); - assertThat(compilationUnit.getMarkers().findFirst(BuildTool.class)).isNotNull(); - assertThat(compilationUnit.getMarkers().findFirst(JavaVersion.class)).isNotNull(); - assertThat(compilationUnit.getMarkers().findFirst(JavaProject.class)).isNotNull(); - assertThat(compilationUnit.getMarkers().findFirst(JavaSourceSet.class)).isNotNull(); - assertThat(compilationUnit.getMarkers().findFirst(Autodetect.class)).isNotNull(); - List typeInUse = new ArrayList<>(); - typeInUse.addAll(compilationUnit.getTypesInUse().getTypesInUse()); - assertThat(typeInUse).hasSize(7); - List fqnTypesInUse = typeInUse.stream() - .filter(JavaType.class::isInstance) - .map(JavaType.class::cast) - .map(JavaType::toString) - .toList(); - assertThat(fqnTypesInUse).contains("org.springframework.boot.autoconfigure.SpringBootApplication"); - assertThat(fqnTypesInUse).contains("void"); - assertThat(fqnTypesInUse).contains("java.lang.String"); - assertThat(fqnTypesInUse).contains("java.lang.Class"); - assertThat(fqnTypesInUse).contains("org.springframework.boot.SpringApplication"); - assertThat(fqnTypesInUse).contains("com.example.MyMain"); - assertThat(fqnTypesInUse).contains("org.springframework.boot.autoconfigure.SpringBootApplication"); - - List classpath = compilationUnit.getMarkers().findFirst(JavaSourceSet.class).get().getClasspath() - .stream() - .map(JavaType.FullyQualified::getFullyQualifiedName) - .toList(); - - // Classpath contains classes from JDK and spring-boot-starter - assertThat(classpath).contains( - "org.springframework.boot.web.reactive.context.ApplicationReactiveWebEnvironment", - "org.springframework.context.ApplicationContext", - "java.math.BigInteger" - ); - - verifyExecutionContext(parsingResult, parserType); - // TODO: Add test that uses Maven settings and encrypted passwords - } - @Test @DisplayName("Parse multi-module-1") void parseMultiModule1() { @@ -280,6 +166,7 @@ void shouldParseMavenConfigProject() { void parseCheckstyle() { Path baseDir = getMavenProject("checkstyle"); ParserParityTestHelper.scanProjectDir(baseDir) + .parseSequentially() .verifyParity((comparingParsingResult, testedParsingResult) -> { assertThat(comparingParsingResult.sourceFiles().stream().map(sf -> sf.getSourcePath().toString()).toList()).contains("checkstyle/rules.xml"); assertThat(comparingParsingResult.sourceFiles().stream().map(sf -> sf.getSourcePath().toString()).toList()).contains("checkstyle/suppressions.xml"); @@ -323,141 +210,6 @@ public void parsed(Parser.Input input, SourceFile sourceFile) { .verifyParity(); } - private static void verifyExecutionContext(RewriteProjectParsingResult parsingResult, ParserType parserType) { - ExecutionContext resultingExecutionContext = parsingResult.executionContext(); - assertThat(resultingExecutionContext).isNotNull(); - - Map messages = (Map) ReflectionTestUtils.getField(resultingExecutionContext, "messages"); - - // 1 - assertThat( - (Object) resultingExecutionContext.getMessage("org.openrewrite.maven.settings") - ).isSameAs( - MavenExecutionContextView.view(resultingExecutionContext).getSettings() - ); - assertThat(MavenExecutionContextView.view(resultingExecutionContext).getSettings()).isInstanceOf(MavenSettings.class); - - // 2 - assertThat( - (Object) resultingExecutionContext.getMessage("org.openrewrite.maven.auth") - ).isSameAs( - MavenExecutionContextView.view(resultingExecutionContext).getCredentials() - ); - assertThat(MavenExecutionContextView.view(resultingExecutionContext).getCredentials()).isEmpty(); - - // 3 - assertThat( - messages.get("org.openrewrite.parser.charset") - ) - .isSameAs( - ParsingExecutionContextView.view(resultingExecutionContext).getCharset() - ); - assertThat(ParsingExecutionContextView.view(resultingExecutionContext).getCharset()).isEqualTo(Charset.forName("UTF-8")); - - // 4 - assertThat( - ((Duration) resultingExecutionContext.getMessage(ExecutionContext.RUN_TIMEOUT)).toMillis() - ).isGreaterThan(10); - - // 5 - assertThat( - (List) resultingExecutionContext.getMessage("org.openrewrite.maven.activeProfiles") - ).isSameAs( - MavenExecutionContextView.view(resultingExecutionContext).getActiveProfiles() - ); - assertThat(MavenExecutionContextView.view(resultingExecutionContext).getActiveProfiles()).isEmpty(); - - // 6 - assertThat( - messages.get("org.openrewrite.maven.mirrors") - ).isSameAs( - MavenExecutionContextView.view(resultingExecutionContext).getMirrors() - ); - assertThat(MavenExecutionContextView.view(resultingExecutionContext).getMirrors()).isEmpty(); - - // 7 - assertThat( - messages.get("org.openrewrite.maven.localRepo") - ).isSameAs( - MavenExecutionContextView.view(resultingExecutionContext).getLocalRepository() - ); - assertThat(MavenExecutionContextView.view(resultingExecutionContext).getLocalRepository().getId()).isEqualTo("local"); - assertThat( - MavenExecutionContextView.view(resultingExecutionContext).getLocalRepository().getUri() - ).isEqualTo( - "file://" + Path.of(System.getProperty("user.home")).resolve(".m2").resolve("repository").toAbsolutePath().normalize() + "/" - ); - - // 8 - assertThat( - messages.get("org.openrewrite.maven.pomCache") - ).isInstanceOf(CompositeMavenPomCache.class); - assertThat(MavenExecutionContextView.view(resultingExecutionContext).getPomCache()).isInstanceOf(CompositeMavenPomCache.class); - - // 9 - // This fails sometimes when multiple tests are run together. The resolution time has been 0 and null - /*assertThat( - messages.get("org.openrewrite.maven.resolutionTime") - ).isEqualTo( - MavenExecutionContextView.view(resultingExecutionContext).getResolutionTime().toMillis() - ); - assertThat(MavenExecutionContextView.view(resultingExecutionContext).getResolutionTime()).isInstanceOf(Duration.class); - assertThat(MavenExecutionContextView.view(resultingExecutionContext).getResolutionTime()).isNotNull(); //.toMillis()).isGreaterThanOrEqualTo(0);*/ - - // 10 - assertThat( - messages.get("org.openrewrite.maven.repos") - ).isSameAs( - MavenExecutionContextView.view(resultingExecutionContext).getRepositories() - ); - assertThat(MavenExecutionContextView.view(resultingExecutionContext).getRepositories()).isEmpty(); - } - - - private void verifyMavenParser(RewriteProjectParsingResult parsingResult) { - verify(parsingResult.sourceFiles().get(0), Xml.Document.class, "pom.xml", document -> { - // further verifications specific to this source file - }); - verify(parsingResult.sourceFiles().get(1), Xml.Document.class, "module-b/pom.xml"); - verify(parsingResult.sourceFiles().get(2), Xml.Document.class, "module-a/pom.xml"); - } - - private void verify(SourceFile sourceFile, Class clazz, String resourcePath) { - verify(sourceFile, clazz, resourcePath, t -> { - }); - } - - private void verify(SourceFile sourceFile, Class clazz, String resourcePath, Consumer verify) { - if (!clazz.isInstance(sourceFile)) { - fail("Given sourceFile '%s' is not of type %s".formatted(sourceFile.getSourcePath(), clazz)); - } - if (!resourcePath.equals(sourceFile.getSourcePath().toString())) { - fail("Actual path '%s' did not match expected path '%s'".formatted(sourceFile.getSourcePath().toString(), resourcePath)); - } - if (Xml.Document.class == clazz) { - Xml.Document pom = Xml.Document.class.cast(sourceFile); - int numExpectedMarkers = 7; - if (System.getenv("GITHUB_ACTION_REF") != null) { - numExpectedMarkers = 8; - } - assertThat(pom.getMarkers().getMarkers()) - .as(() -> pom.getMarkers().getMarkers().stream().map(m -> m.getClass().getName()).collect(Collectors.joining("\n"))) - .hasSize(numExpectedMarkers); - - assertThat(pom.getMarkers().findFirst(MavenResolutionResult.class)).isPresent(); - if (System.getenv("GITHUB_ACTION_REF") != null) { - assertThat(pom.getMarkers().findFirst(GithubActionsBuildEnvironment.class)).isPresent(); - } - assertThat(pom.getMarkers().findFirst(GitProvenance.class)).isNotNull(); - assertThat(pom.getMarkers().findFirst(OperatingSystemProvenance.class)).isNotNull(); - assertThat(pom.getMarkers().findFirst(BuildTool.class)).isNotNull(); - assertThat(pom.getMarkers().findFirst(JavaVersion.class)).isNotNull(); - assertThat(pom.getMarkers().findFirst(JavaProject.class)).isNotNull(); - assertThat(pom.getMarkers().findFirst(Autodetect.class)).isNotNull(); - verify.accept((T) pom); - } - } - private Path getMavenProject(String s) { return Path.of("./testcode/maven-projects/").resolve(s).toAbsolutePath().normalize(); } diff --git a/sbm-support-rewrite/src/test/java/org/springframework/sbm/parsers/RewriteProjectParserTest.java b/sbm-support-rewrite/src/test/java/org/springframework/sbm/parsers/RewriteProjectParserTest.java index fe9ae4395..6f0a0864c 100644 --- a/sbm-support-rewrite/src/test/java/org/springframework/sbm/parsers/RewriteProjectParserTest.java +++ b/sbm-support-rewrite/src/test/java/org/springframework/sbm/parsers/RewriteProjectParserTest.java @@ -25,11 +25,15 @@ import org.openrewrite.SourceFile; import org.openrewrite.tree.ParsingEventListener; import org.openrewrite.tree.ParsingExecutionContextView; +import org.sonatype.plexus.components.cipher.DefaultPlexusCipher; +import org.sonatype.plexus.components.cipher.PlexusCipherException; +import org.sonatype.plexus.components.sec.dispatcher.DefaultSecDispatcher; import org.springframework.beans.factory.config.ConfigurableListableBeanFactory; import org.springframework.context.ApplicationEventPublisher; import org.springframework.core.io.DefaultResourceLoader; import org.springframework.core.io.Resource; import org.springframework.sbm.parsers.maven.*; +import org.springframework.sbm.scopes.ProjectMetadata; import org.springframework.sbm.scopes.ScanScope; import org.springframework.sbm.test.util.DummyResource; import org.springframework.sbm.utils.ResourceUtil; @@ -86,15 +90,17 @@ public static void main(String[] args){ @Test @DisplayName("Parse simple Maven project") - void parseSimpleMavenProject(@TempDir Path tempDir) { + void parseSimpleMavenProject(@TempDir Path tempDir) throws PlexusCipherException { Path basePath = tempDir; ParserProperties parserProperties = new ParserProperties(); ModuleParser mavenMojoParserPrivateMethods = new ModuleParser(); ExecutionContext executionContext = new InMemoryExecutionContext(t -> {throw new RuntimeException(t);}); MavenModuleParser mavenModuleParser = new MavenModuleParser(parserProperties, mavenMojoParserPrivateMethods); + ProjectMetadata projectMetadata = new ProjectMetadata(); + MavenSettingsInitializer mavenSettingsInitializer = new MavenSettingsInitializer(executionContext, projectMetadata); RewriteProjectParser projectParser = new RewriteProjectParser( new ProvenanceMarkerFactory(new MavenProvenanceMarkerFactory()), - new BuildFileParser(), + new BuildFileParser(mavenSettingsInitializer), new SourceFileParser(mavenModuleParser), new StyleDetector(), parserProperties, diff --git a/sbm-support-rewrite/src/test/java/org/springframework/sbm/parsers/RewriteRecipeDiscoveryTest.java b/sbm-support-rewrite/src/test/java/org/springframework/sbm/parsers/RewriteRecipeDiscoveryTest.java index 7662eeeed..b74b3a161 100644 --- a/sbm-support-rewrite/src/test/java/org/springframework/sbm/parsers/RewriteRecipeDiscoveryTest.java +++ b/sbm-support-rewrite/src/test/java/org/springframework/sbm/parsers/RewriteRecipeDiscoveryTest.java @@ -66,7 +66,6 @@ public static void beforeAll() { void shouldDiscoverDummyRecipes() { RewriteRecipeDiscovery recipeDiscovery = buildRecipeDiscovery(); String[] acceptPackages = {}; -// Path jarPath = Path.of(System.getProperty("user.home")).resolve(".m2").resolve("repository/org/springframework/sbm/openrewrite-dummy-recipe/1.0-SNAPSHOT/openrewrite-dummy-recipe-1.0-SNAPSHOT.jar"); ClasspathScanningLoader classpathScanningLoader = new ClasspathScanningLoader(new Properties(), acceptPackages); List dummyRecipe = recipeDiscovery.discoverFilteredRecipes(List.of("com.example.recipes.DummyRecipe"), new Properties(), acceptPackages, classpathScanningLoader); assertThat(dummyRecipe).isNotNull(); @@ -114,7 +113,6 @@ void loadOpenRewriteRecipes() { .contains(DummyRecipe.class.getName()); List recipes = Environment.builder() -// .scanJar() .load(resourceLoader) .build() .listRecipes(); @@ -122,8 +120,6 @@ void loadOpenRewriteRecipes() { assertThat(recipes).isNotEmpty(); assertThat(recipes) -// .map(Object::getClass) -// .map(Class::getName) .map(Recipe::getName) .contains(DummyRecipe.class.getName()); @@ -137,7 +133,8 @@ void loadOpenRewriteRecipes() { void loadRecipeFromClasspath2() { String[] acceptPackages = {}; // "com.example" ClasspathScanningLoader loader = new ClasspathScanningLoader(new Properties(), acceptPackages); - Path jarPath = Path.of("/Users/fkrueger/.m2/repository/org/openrewrite/recipe/rewrite-spring/4.36.0/rewrite-spring-4.36.0.jar");// Path.of(System.getProperty("user.home")).resolve(".m2").resolve("repository/org/springframework/sbm/openrewrite-dummy-recipe/1.0-SNAPSHOT/openrewrite-dummy-recipe-1.0-SNAPSHOT.jar"); + String path = System.getProperty("user.home"); + Path jarPath = Path.of(path + "/.m2/repository/org/openrewrite/recipe/rewrite-spring/4.36.0/rewrite-spring-4.36.0.jar"); ClasspathScanningLoader classpathScanningLoader = new ClasspathScanningLoader(jarPath, new Properties(), Set.of(loader), getClass().getClassLoader()); @@ -166,6 +163,7 @@ void shouldFindRecipesByTag() { } @Test + @Disabled("WIP: No assertions") @DisplayName("Should Find Recipe Categories") void shouldFindRecipeCategories() { ResourceLoader resourceLoader = new ClasspathScanningLoader(new Properties(), new String[]{}); @@ -215,13 +213,6 @@ void shouldFindRecipeDescriptorByName() { assertThat(maintainer.getMaintainer()).isEqualTo("SBM"); assertThat(maintainer.getLogo()).isNull(); }, Index.atIndex(1)); - - /*System.out.println("Recipes: " + descriptor.getRecipeList()); - System.out.println("DataTables: " + descriptor.getDataTables()); - System.out.println("Estimated effort: " + descriptor.getEstimatedEffortPerOccurrence()); - System.out.println("Examples: " + descriptor.getExamples()); - System.out.println("Options: " + descriptor.getOptions()); - System.out.println("Tags: " + descriptor.getTags());*/ } @Test diff --git a/sbm-support-rewrite/src/test/java/org/springframework/sbm/parsers/maven/MavenExecutionRequestFactory.java b/sbm-support-rewrite/src/test/java/org/springframework/sbm/parsers/maven/MavenExecutionRequestFactory.java index 5f8159dae..c9b1ef37b 100644 --- a/sbm-support-rewrite/src/test/java/org/springframework/sbm/parsers/maven/MavenExecutionRequestFactory.java +++ b/sbm-support-rewrite/src/test/java/org/springframework/sbm/parsers/maven/MavenExecutionRequestFactory.java @@ -28,6 +28,7 @@ import org.codehaus.plexus.PlexusContainer; import org.codehaus.plexus.component.repository.exception.ComponentLookupException; +import java.io.File; import java.nio.file.Path; import java.util.List; import java.util.Map; @@ -60,6 +61,10 @@ public MavenExecutionRequest createMavenExecutionRequest(PlexusContainer plexusC request.setShowErrors(true); request.setLocalRepositoryPath(LOCAL_REPOSITORY); request.setPluginArtifactRepositories(List.of(repository)); + File userSettingsFile = Path.of(System.getProperty("user.home")).resolve(".m2/settings.xml").toFile(); + if(userSettingsFile.exists()) { + request.setUserSettingsFile(userSettingsFile); + } List activatedProfiles = mavenConfigFileParser.getActivatedProfiles(baseDir); if (activatedProfiles.isEmpty()) { diff --git a/sbm-support-rewrite/src/test/java/org/springframework/sbm/parsers/maven/MavenExecutor.java b/sbm-support-rewrite/src/test/java/org/springframework/sbm/parsers/maven/MavenExecutor.java index fc30ec96d..ac243e64f 100644 --- a/sbm-support-rewrite/src/test/java/org/springframework/sbm/parsers/maven/MavenExecutor.java +++ b/sbm-support-rewrite/src/test/java/org/springframework/sbm/parsers/maven/MavenExecutor.java @@ -24,6 +24,7 @@ import org.codehaus.plexus.component.repository.exception.ComponentLookupException; import java.nio.file.Path; +import java.util.ArrayList; import java.util.List; import java.util.function.Consumer; diff --git a/sbm-support-rewrite/src/test/java/org/springframework/sbm/parsers/maven/MavenProjectAnalyzerTest.java b/sbm-support-rewrite/src/test/java/org/springframework/sbm/parsers/maven/MavenProjectAnalyzerTest.java index 84e110cf6..9937dbd31 100644 --- a/sbm-support-rewrite/src/test/java/org/springframework/sbm/parsers/maven/MavenProjectAnalyzerTest.java +++ b/sbm-support-rewrite/src/test/java/org/springframework/sbm/parsers/maven/MavenProjectAnalyzerTest.java @@ -27,7 +27,6 @@ import org.openrewrite.maven.utilities.MavenArtifactDownloader; import org.springframework.core.io.Resource; import org.springframework.sbm.parsers.MavenProject; -import org.springframework.sbm.parsers.RewriteMavenArtifactDownloader; import org.springframework.sbm.test.util.DummyResource; import org.springframework.sbm.utils.ResourceUtil; diff --git a/components/sbm-core/src/test/java/org/springframework/sbm/build/impl/MavenSettingsInitializerTest.java b/sbm-support-rewrite/src/test/java/org/springframework/sbm/parsers/maven/MavenSettingsInitializerTest.java similarity index 63% rename from components/sbm-core/src/test/java/org/springframework/sbm/build/impl/MavenSettingsInitializerTest.java rename to sbm-support-rewrite/src/test/java/org/springframework/sbm/parsers/maven/MavenSettingsInitializerTest.java index 21c46bb27..c47340803 100644 --- a/components/sbm-core/src/test/java/org/springframework/sbm/build/impl/MavenSettingsInitializerTest.java +++ b/sbm-support-rewrite/src/test/java/org/springframework/sbm/parsers/maven/MavenSettingsInitializerTest.java @@ -13,12 +13,18 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.springframework.sbm.build.impl; +package org.springframework.sbm.parsers.maven; -import org.junit.jupiter.api.*; +import org.junit.jupiter.api.Test; +import org.junitpioneer.jupiter.SetSystemProperty; import org.openrewrite.maven.MavenExecutionContextView; +import org.openrewrite.maven.MavenSettings; import org.openrewrite.maven.tree.MavenRepository; +import org.sonatype.plexus.components.cipher.DefaultPlexusCipher; +import org.sonatype.plexus.components.cipher.PlexusCipherException; +import org.sonatype.plexus.components.sec.dispatcher.DefaultSecDispatcher; import org.springframework.sbm.parsers.RewriteExecutionContext; +import org.springframework.sbm.scopes.ProjectMetadata; import java.net.URI; import java.net.URISyntaxException; @@ -31,32 +37,15 @@ */ class MavenSettingsInitializerTest { - // localRepository.getUri() will differ from '"file:" + userHome + "/.m2/repository/"' because - // MavenRepository.MAVEN_LOCAL_DEFAULT gets returned and this field is statically initialized. - // For this test it means that running the test in isolation succeeds but running it in combination - // with a test that loads MavenRepository before 'user.home' was changed in this test, it fails. - // And maybe even worse, running this test before others would set the local maven repository to the - // dummy dir used in this test. - // To prevent this it will be initialized (if it wasn't already) with the original settings with this line: - MavenRepository mavenLocalDefault = MavenRepository.MAVEN_LOCAL_DEFAULT; - private String actualUserHome; - private Path fakedUserHome; - - @BeforeEach - void beforeEach() { - // Faking the local maven dir to provide the settings.xml for this test - fakedUserHome = Path.of("./testcode/project-with-maven-settings/user-home").toAbsolutePath().normalize(); - actualUserHome = System.getProperty("user.home"); - System.setProperty("user.home", fakedUserHome.toString()); - } - @Test - void mavenParserMustAdhereToSettingsXmlTest() throws URISyntaxException { - + @SetSystemProperty(key = "user.home", value = "./testcode/maven-projects/project-with-maven-settings/user-home") + void mavenParserMustAdhereToSettingsXmlTest() throws URISyntaxException, PlexusCipherException { RewriteExecutionContext executionContext = new RewriteExecutionContext(); - MavenSettingsInitializer sut = new MavenSettingsInitializer(); - sut.initializeMavenSettings(executionContext); + MavenSettingsInitializer sut = new MavenSettingsInitializer(executionContext, new ProjectMetadata()); + + sut.initializeMavenSettings(); + MavenExecutionContextView mavenExecutionContextView = MavenExecutionContextView.view(executionContext); assertThat(mavenExecutionContextView.getRepositories()).hasSize(1); @@ -72,12 +61,18 @@ void mavenParserMustAdhereToSettingsXmlTest() throws URISyntaxException { assertThat(localRepository.getSnapshots()).isNull(); String tmpDir = removeTrailingSlash(System.getProperty("java.io.tmpdir")); - String customLocalRepository = new URI("file://" + tmpDir).toString(); + String customLocalRepository = "file://" + Path.of(System.getProperty("user.home")).resolve(".m2/repository").toAbsolutePath().normalize().toString();// new URI("file://" + tmpDir).toString(); assertThat(removeTrailingSlash(localRepository.getUri())).isEqualTo(customLocalRepository); assertThat(localRepository.getSnapshots()).isNull(); assertThat(localRepository.isKnownToExist()).isTrue(); assertThat(localRepository.getUsername()).isNull(); assertThat(localRepository.getPassword()).isNull(); + + // assert servers were read + MavenSettings mavenSettings = mavenExecutionContextView.getSettings(); + assertThat(mavenSettings.getServers().getServers()).hasSize(1); + assertThat(mavenSettings.getServers().getServers().get(0).getUsername()).isEqualTo("user"); + assertThat(mavenSettings.getServers().getServers().get(0).getPassword()).isEqualTo("secret"); } String removeTrailingSlash(String string) { @@ -87,9 +82,4 @@ String removeTrailingSlash(String string) { return string; } - @AfterEach - public void reset() { - // reset - System.setProperty("user.home", actualUserHome); - } } \ No newline at end of file diff --git a/sbm-support-rewrite/src/test/java/org/springframework/sbm/test/util/ParallelParsingResult.java b/sbm-support-rewrite/src/test/java/org/springframework/sbm/test/util/ParallelParsingResult.java index b709e06fc..47be45e06 100644 --- a/sbm-support-rewrite/src/test/java/org/springframework/sbm/test/util/ParallelParsingResult.java +++ b/sbm-support-rewrite/src/test/java/org/springframework/sbm/test/util/ParallelParsingResult.java @@ -20,5 +20,5 @@ /** * @author Fabian Krüger */ -public record ParallelParsingResult(RewriteProjectParsingResult comparingParsingResult, RewriteProjectParsingResult testedParsingResult) { +public record ParallelParsingResult(RewriteProjectParsingResult expectedParsingResult, RewriteProjectParsingResult actualParsingResult) { } diff --git a/sbm-support-rewrite/src/test/java/org/springframework/sbm/test/util/ParserExecutionHelper.java b/sbm-support-rewrite/src/test/java/org/springframework/sbm/test/util/ParserExecutionHelper.java index 969a52370..2b4e75579 100644 --- a/sbm-support-rewrite/src/test/java/org/springframework/sbm/test/util/ParserExecutionHelper.java +++ b/sbm-support-rewrite/src/test/java/org/springframework/sbm/test/util/ParserExecutionHelper.java @@ -29,6 +29,7 @@ import java.util.concurrent.CountDownLatch; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; +import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.AtomicReference; /** @@ -54,25 +55,22 @@ public ParallelParsingResult parseParallel(Path baseDir, ParserProperties parser ExecutorService threadPool = Executors.newFixedThreadPool(2); - AtomicReference testedParsingResultRef = new AtomicReference<>(); - AtomicReference comparingParsingResultRef = new AtomicReference<>(); + AtomicReference actualParsingResultRef = new AtomicReference<>(); + AtomicReference expectedParsingResultRef = new AtomicReference<>(); threadPool.submit(() -> { - System.out.println("Start parsing with RewriteProjectParser"); - RewriteProjectParsingResult tmpTestedParserResult = parseWithRewriteProjectParser(baseDir, parserProperties, executionContext); - testedParsingResultRef.set(tmpTestedParserResult); + RewriteProjectParsingResult parsingResult = parseWithRewriteProjectParser(baseDir, parserProperties);; + actualParsingResultRef.set(parsingResult); latch.countDown(); }); threadPool.submit(() -> { - System.out.println("Start parsing with RewriteMavenProjectParser"); - RewriteProjectParsingResult tmpComparingParserResult = parseWithComparingParser(baseDir, parserProperties, executionContext); - comparingParsingResultRef.set(tmpComparingParserResult); + RewriteProjectParsingResult parsingResult = parseWithComparingParser(baseDir, parserProperties, executionContext); + expectedParsingResultRef.set(parsingResult); latch.countDown(); }); - latch.await(); - return new ParallelParsingResult(comparingParsingResultRef.get(), testedParsingResultRef.get()); + return new ParallelParsingResult(expectedParsingResultRef.get(), actualParsingResultRef.get()); } catch (InterruptedException e) { throw new RuntimeException(e); } @@ -87,7 +85,7 @@ public RewriteProjectParsingResult parseWithComparingParser(Path baseDir, Parser } } - public RewriteProjectParsingResult parseWithRewriteProjectParser(Path baseDir, ParserProperties parserProperties, ExecutionContext executionContext) { + public RewriteProjectParsingResult parseWithRewriteProjectParser(Path baseDir, ParserProperties parserProperties) { AtomicReference atomicRef = new AtomicReference<>(); new ApplicationContextRunner().withUserConfiguration(SbmSupportRewriteConfiguration.class) .withBean("parser-org.springframework.sbm.parsers.ParserProperties", ParserProperties.class, () -> parserProperties) diff --git a/sbm-support-rewrite/src/test/java/org/springframework/sbm/test/util/ParserParityTestHelper.java b/sbm-support-rewrite/src/test/java/org/springframework/sbm/test/util/ParserParityTestHelper.java index 509b6a5c8..6c3d577df 100644 --- a/sbm-support-rewrite/src/test/java/org/springframework/sbm/test/util/ParserParityTestHelper.java +++ b/sbm-support-rewrite/src/test/java/org/springframework/sbm/test/util/ParserParityTestHelper.java @@ -15,6 +15,9 @@ */ package org.springframework.sbm.test.util; +import lombok.RequiredArgsConstructor; +import org.assertj.core.api.SoftAssertions; +import org.jetbrains.annotations.NotNull; import org.openrewrite.ExecutionContext; import org.openrewrite.SourceFile; import org.openrewrite.java.marker.JavaSourceSet; @@ -22,13 +25,19 @@ import org.openrewrite.marker.Marker; import org.openrewrite.marker.Markers; import org.openrewrite.maven.MavenSettings; +import org.openrewrite.maven.tree.MavenResolutionResult; +import org.openrewrite.maven.tree.ResolvedDependency; +import org.openrewrite.maven.tree.Scope; import org.openrewrite.style.Style; import org.springframework.sbm.parsers.ParserProperties; import org.springframework.sbm.parsers.RewriteProjectParsingResult; +import java.net.URI; +import java.net.URISyntaxException; import java.nio.file.Path; import java.util.*; import java.util.function.BiConsumer; +import java.util.function.BiPredicate; import java.util.stream.Collectors; import static org.assertj.core.api.Assertions.assertThat; @@ -42,7 +51,7 @@ public class ParserParityTestHelper { private boolean isParallelParse = true; private ExecutionContext executionContext; - public ParserParityTestHelper(Path baseDir) { + private ParserParityTestHelper(Path baseDir) { this.baseDir = baseDir; } @@ -65,136 +74,311 @@ public ParserParityTestHelper withParserProperties(ParserProperties parserProper return this; } + public ParserParityTestHelper withExecutionContextForComparingParser(ExecutionContext executionContext) { + this.executionContext = executionContext; + return this; + } + + /** + * Use this method when no additional assertions required. + */ public void verifyParity() { - verifyParity((comparingParsingResult, testedParsingResult) -> { + verifyParity((expectedParsingResult, actualParsingResult) -> { // nothing extra to verify }); } - public void verifyParity(ParserResultParityChecker parserResultParityChecker) { - RewriteProjectParsingResult comparingParserResult = null; - RewriteProjectParsingResult testedParserResult = null; + /** + * Use this method if additional assertions are required. + */ + public void verifyParity(CustomParserResultParityChecker customParserResultParityChecker) { + RewriteProjectParsingResult expectedParserResult = null; + RewriteProjectParsingResult actualParserResult = null; ParserExecutionHelper parserExecutionHelper = new ParserExecutionHelper(); if (isParallelParse) { ParallelParsingResult result = parserExecutionHelper.parseParallel(baseDir, parserProperties, executionContext); - comparingParserResult = result.comparingParsingResult(); - testedParserResult = result.testedParsingResult(); + expectedParserResult = result.expectedParsingResult(); + actualParserResult = result.actualParsingResult(); } else { - testedParserResult = parserExecutionHelper.parseWithRewriteProjectParser(baseDir, parserProperties, executionContext); - comparingParserResult = parserExecutionHelper.parseWithComparingParser(baseDir, parserProperties, executionContext); + actualParserResult = parserExecutionHelper.parseWithRewriteProjectParser(baseDir, parserProperties); + expectedParserResult = parserExecutionHelper.parseWithComparingParser(baseDir, parserProperties, executionContext); } + DefaultParserResultParityChecker.verifyParserResultParity(baseDir, expectedParserResult, actualParserResult); - // Number of parsed sources should always be the same - assertThat(comparingParserResult.sourceFiles().size()) - .as(renderErrorMessage(comparingParserResult, testedParserResult)) - .isEqualTo(testedParserResult.sourceFiles().size()); + // additional checks + customParserResultParityChecker.accept(actualParserResult, expectedParserResult); + } - // The paths of sources should be the same - List comparingResultPaths = comparingParserResult.sourceFiles().stream().map(sf -> baseDir.resolve(sf.getSourcePath()).toAbsolutePath().normalize().toString()).toList(); - List testedResultPaths = testedParserResult.sourceFiles().stream().map(sf -> baseDir.resolve(sf.getSourcePath()).toAbsolutePath().normalize().toString()).toList(); - assertThat(testedResultPaths).containsExactlyInAnyOrder(comparingResultPaths.toArray(String[]::new)); + public interface CustomParserResultParityChecker extends BiConsumer { + @Override + void accept(RewriteProjectParsingResult expectedParsingResult, RewriteProjectParsingResult actualParsingResult); + } - // The Markers of all resources should be the same - verifyMarkersAreTheSame(comparingParserResult, testedParserResult); + @RequiredArgsConstructor + private class DefaultParserResultParityChecker { - parserResultParityChecker.accept(testedParserResult, comparingParserResult); - } + public static void verifyParserResultParity(Path baseDir, RewriteProjectParsingResult expectedParserResult, RewriteProjectParsingResult actualParserResult) { + verifyEqualNumberOfParsedResources(expectedParserResult, actualParserResult); + verifyEqualResourcePaths(baseDir, expectedParserResult, actualParserResult); + RewriteMarkerParityVerifier.verifyEqualMarkers(expectedParserResult, actualParserResult); + } - private static String renderErrorMessage(RewriteProjectParsingResult comparingParserResult, RewriteProjectParsingResult testedParserResult) { - List collect = new ArrayList<>(); - if (comparingParserResult.sourceFiles().size() > testedParserResult.sourceFiles().size()) { - collect = comparingParserResult.sourceFiles().stream() - .filter(element -> !testedParserResult.sourceFiles().contains(element)) - .collect(Collectors.toList()); - } else { - collect = testedParserResult.sourceFiles().stream() - .filter(element -> !comparingParserResult.sourceFiles().contains(element)) - .collect(Collectors.toList()); + private static void verifyEqualResourcePaths(Path baseDir, RewriteProjectParsingResult expectedParserResult, RewriteProjectParsingResult actualParserResult) { + List expectedResultPaths = expectedParserResult.sourceFiles().stream().map(sf -> baseDir.resolve(sf.getSourcePath()).toAbsolutePath().normalize().toString()).toList(); + List actualResultPaths = actualParserResult.sourceFiles().stream().map(sf -> baseDir.resolve(sf.getSourcePath()).toAbsolutePath().normalize().toString()).toList(); + assertThat(actualResultPaths).containsExactlyInAnyOrder(expectedResultPaths.toArray(String[]::new)); + } + + private static void verifyEqualNumberOfParsedResources(RewriteProjectParsingResult expectedParserResult, RewriteProjectParsingResult actualParserResult) { + assertThat(actualParserResult.sourceFiles().size()) + .as(renderErrorMessage(expectedParserResult, actualParserResult)) + .isEqualTo(expectedParserResult.sourceFiles().size()); + } + + private static String renderErrorMessage(RewriteProjectParsingResult expectedParserResult, RewriteProjectParsingResult actualParserResult) { + List collect = new ArrayList<>(); + if (expectedParserResult.sourceFiles().size() > actualParserResult.sourceFiles().size()) { + collect = expectedParserResult.sourceFiles().stream() + .filter(element -> !actualParserResult.sourceFiles().contains(element)) + .collect(Collectors.toList()); + } else { + collect = actualParserResult.sourceFiles().stream() + .filter(element -> !expectedParserResult.sourceFiles().contains(element)) + .collect(Collectors.toList()); + } + + return "ComparingParserResult had %d sourceFiles whereas TestedParserResult had %d sourceFiles. Files were %s".formatted(expectedParserResult.sourceFiles().size(), actualParserResult.sourceFiles().size(), collect); } - return "ComparingParserResult had %d sourceFiles whereas TestedParserResult had %d sourceFiles. Files were %s".formatted(comparingParserResult.sourceFiles().size(), testedParserResult.sourceFiles().size(), collect); } - private void verifyMarkersAreTheSame(RewriteProjectParsingResult comparingParserResult, RewriteProjectParsingResult testedParserResult) { - List comparingSourceFiles = comparingParserResult.sourceFiles(); - List testedSourceFiles = testedParserResult.sourceFiles(); + private static class RewriteMarkerParityVerifier { + static void verifyEqualMarkers(RewriteProjectParsingResult expectedParserResult, RewriteProjectParsingResult actualParserResult) { + List expectedSourceFiles = expectedParserResult.sourceFiles(); + List actualSourceFiles = actualParserResult.sourceFiles(); - // bring to same order - comparingSourceFiles.sort(Comparator.comparing(SourceFile::getSourcePath)); - testedSourceFiles.sort(Comparator.comparing(SourceFile::getSourcePath)); + // bring to same order + expectedSourceFiles.sort(Comparator.comparing(SourceFile::getSourcePath)); + actualSourceFiles.sort(Comparator.comparing(SourceFile::getSourcePath)); - for (SourceFile curComparingSourceFile : comparingSourceFiles) { - int index = comparingSourceFiles.indexOf(curComparingSourceFile); - SourceFile curTestedSourceFile = testedSourceFiles.get(index); + // Compare and verify markers of all source files + for (SourceFile curExpectedSourceFile : expectedSourceFiles) { + int index = expectedSourceFiles.indexOf(curExpectedSourceFile); + SourceFile curGivenSourceFile = actualSourceFiles.get(index); + verifyEqualSourceFileMarkers(curExpectedSourceFile, curGivenSourceFile); + } + } - Markers comparingMarkers = curComparingSourceFile.getMarkers(); - List comparingMarkersList = comparingMarkers.getMarkers(); - Markers testedMarkers = curTestedSourceFile.getMarkers(); - List testedMarkersList = testedMarkers.getMarkers(); + static void verifyEqualSourceFileMarkers(SourceFile curExpectedSourceFile, SourceFile curGivenSourceFile) { + Markers expectedMarkers = curExpectedSourceFile.getMarkers(); + List expectedMarkersList = expectedMarkers.getMarkers(); + Markers givenMarkers = curGivenSourceFile.getMarkers(); + List actualMarkersList = givenMarkers.getMarkers(); - assertThat(comparingMarkersList) - .usingRecursiveComparison() - .withStrictTypeChecking() - .ignoringCollectionOrder() - .ignoringFields( - // classpath compared further down - "classpath", - // FIXME: https://github.com/spring-projects-experimental/spring-boot-migrator/issues/982 - "styles" - ) - .ignoringFieldsOfTypes( - UUID.class, - // FIXME: https://github.com/spring-projects-experimental/spring-boot-migrator/issues/880 - MavenSettings.class, - // FIXME: https://github.com/spring-projects-experimental/spring-boot-migrator/issues/982 - Style.class) - .isEqualTo(testedMarkersList); + assertThat(actualMarkersList.size()).isEqualTo(expectedMarkersList.size()); + + SoftAssertions softAssertions = new SoftAssertions(); + + actualMarkersList.sort(Comparator.comparing(o -> o.getClass().getName())); + expectedMarkersList.sort(Comparator.comparing(o -> o.getClass().getName())); + + expectedMarkersList.forEach(expectedMarker -> { + int i = expectedMarkersList.indexOf(expectedMarker); + Marker actualMarker = actualMarkersList.get(i); + + assertThat(actualMarker).isInstanceOf(expectedMarker.getClass()); - if (curComparingSourceFile.getMarkers().findFirst(JavaSourceSet.class).isPresent()) { + if (MavenResolutionResult.class.isInstance(actualMarker)) { + MavenResolutionResult expected = (MavenResolutionResult) expectedMarker; + MavenResolutionResult actual = (MavenResolutionResult) actualMarker; + compareMavenResolutionResultMarker(softAssertions, expected, actual); + } else { + compareMarker(softAssertions, expectedMarker, actualMarker); + } + + }); + + softAssertions.assertAll(); + + if (curExpectedSourceFile.getMarkers().findFirst(JavaSourceSet.class).isPresent()) { // Tested parser must have JavaSourceSet marker when comparing parser has it - assertThat(testedMarkers.findFirst(JavaSourceSet.class)).isPresent(); + assertThat(givenMarkers.findFirst(JavaSourceSet.class)).isPresent(); // assert classpath equality - List comparingClasspath = comparingMarkers.findFirst(JavaSourceSet.class).get().getClasspath().stream().map(JavaType.FullyQualified::getFullyQualifiedName).toList(); - List testedClasspath = testedMarkers.findFirst(JavaSourceSet.class).get().getClasspath().stream().map(JavaType.FullyQualified::getFullyQualifiedName).toList(); + List expectedClasspath = expectedMarkers.findFirst(JavaSourceSet.class).get().getClasspath().stream().map(JavaType.FullyQualified::getFullyQualifiedName).toList(); + List actualClasspath = givenMarkers.findFirst(JavaSourceSet.class).get().getClasspath().stream().map(JavaType.FullyQualified::getFullyQualifiedName).toList(); - assertThat(comparingClasspath.size()).isEqualTo(testedClasspath.size()); + assertThat(actualClasspath.size()).isEqualTo(expectedClasspath.size()); - assertThat(comparingClasspath) + assertThat(expectedClasspath) .withFailMessage(() -> { - List additionalElementsInComparingClasspath = comparingClasspath.stream() - .filter(element -> !testedClasspath.contains(element)) + List additionalElementsInExpectedClasspath = expectedClasspath.stream() + .filter(element -> !actualClasspath.contains(element)) .collect(Collectors.toList()); - if (!additionalElementsInComparingClasspath.isEmpty()) { - return "Classpath of comparing and tested parser differ: comparing classpath contains additional entries: %s".formatted(additionalElementsInComparingClasspath); + if (!additionalElementsInExpectedClasspath.isEmpty()) { + return "Classpath of comparing and tested parser differ: comparing classpath contains additional entries: %s".formatted(additionalElementsInExpectedClasspath); } - List additionalElementsInTestedClasspath = testedClasspath.stream() - .filter(element -> !comparingClasspath.contains(element)) + List additionalElementsInActualClasspath = actualClasspath.stream() + .filter(element -> !expectedClasspath.contains(element)) .collect(Collectors.toList()); - if (!additionalElementsInTestedClasspath.isEmpty()) { - return "Classpath of comparing and tested parser differ: tested classpath contains additional entries: %s".formatted(additionalElementsInTestedClasspath); + if (!additionalElementsInActualClasspath.isEmpty()) { + return "Classpath of comparing and tested parser differ: tested classpath contains additional entries: %s".formatted(additionalElementsInActualClasspath); } - return "Bang!"; + throw new IllegalStateException("Something went terribly wrong..."); }) - .containsExactlyInAnyOrder(testedClasspath.toArray(String[]::new)); + .containsExactlyInAnyOrder(actualClasspath.toArray(String[]::new)); } + } + + static void compareMavenResolutionResultMarker(SoftAssertions softAssertions, MavenResolutionResult expected, MavenResolutionResult actual) { + softAssertions.assertThat(actual) + .usingRecursiveComparison() + .withEqualsForFieldsMatchingRegexes( + customRepositoryEquals("mavenSettings.localRepository"), + "mavenSettings.localRepository", + ".*\\.repository", + "mavenSettings.mavenLocal.uri" + ) + .ignoringFields( + "modules", // checked further down + "dependencies", // checked further down + "parent.modules" // TODO: https://github.com/spring-projects-experimental/spring-boot-migrator/issues/991 + ) + .ignoringFieldsOfTypes( + UUID.class) + .isEqualTo(expected); + + // verify modules + verifyEqualModulesInMavenResolutionResult(softAssertions, expected, actual); + + // verify dependencies + verifyEqualDependencies(softAssertions, expected, actual); } - } - public ParserParityTestHelper withExecutionContextForComparingParser(ExecutionContext executionContext) { - this.executionContext = executionContext; - return this; - } + private static void verifyEqualDependencies(SoftAssertions softAssertions, MavenResolutionResult expected, MavenResolutionResult actual) { + Set keys = expected.getDependencies().keySet(); + keys.forEach(k -> { + List expectedDependencies = expected.getDependencies().get(k); + List actualDependencies = actual.getDependencies().get(k); + + // same order + expectedDependencies.sort(Comparator.comparing(o -> o.getGav().toString())); + actualDependencies.sort(Comparator.comparing(o -> o.getGav().toString())); + + softAssertions.assertThat(actualDependencies) + .usingRecursiveComparison() + .withEqualsForFieldsMatchingRegexes( + customRepositoryEquals(".*\\.repository"), + ".*\\.repository") + .ignoringFieldsOfTypes( + UUID.class + ) + .isEqualTo(expectedDependencies); + }); + } + + private static void verifyEqualModulesInMavenResolutionResult(SoftAssertions softAssertions, MavenResolutionResult expected, MavenResolutionResult actual) { + List expectedModules = expected.getModules(); + List actualModules = actual.getModules(); + // bring modules in same order + expectedModules.sort(Comparator.comparing(o -> o.getPom().getGav().toString())); + actualModules.sort(Comparator.comparing(o -> o.getPom().getGav().toString())); + // test modules + expectedModules.forEach(cm -> { + MavenResolutionResult actualMavenResolutionResult = actualModules.get(expectedModules.indexOf(cm)); + compareMavenResolutionResultMarker(softAssertions, cm, actualMavenResolutionResult); + }); + } + + /** + * Custom equals comparing fields names with 'repository' URI. + * This is required because the repository URI can be 'file:host' or 'file//host' which is effectively the same. + * But the strict comparison fails. + * This custom equals method can be used instead. + *

+         * .withEqualsForFieldsMatchingRegexes(
+         *                  customRepositoryEquals(),
+         *                  ".*\\.repository"
+         * )
+         * 
+ */ + @NotNull + private static BiPredicate customRepositoryEquals(String s) { +// System.out.println(s); + return (Object actual, Object expected) -> { + // field null? + if (actual == null) { + if (expected == null) { + return true; + } + return false; + } + // normal equals? + boolean equals = actual.equals(expected); + if (equals) { + return true; + } + // Compare Repository URI + if (actual.getClass() == actual.getClass()) { + if (actual instanceof URI) { + URI f1 = (URI) actual; + URI f2 = (URI) expected; + return equals ? true : f1.getScheme().equals(f2.getScheme()) && + f1.getHost().equals(f2.getHost()) && + f1.getPath().equals(f2.getPath()) && + f1.getFragment().equals(f2.getFragment()); + } else if (actual instanceof String) { + try { + URI f1 = new URI((String) actual); + URI f2 = new URI((String) expected); + return f1.getScheme() == null ? (f2.getScheme() == null ? true : false) : f1.getScheme().equals(f2.getScheme()) && + (f1.getHost() == null ? (f2.getHost() == null ? true : false) : f1.getHost().equals(f2.getHost())) && + f1.getPath().equals(f2.getPath()) && + f1.getFragment() == null ? (f2.getFragment() == null ? true : false) : f1.getFragment().equals(f2.getFragment()); + } catch (URISyntaxException e) { + throw new RuntimeException(e); + } + } else { + return false; + } + } else { + return false; + } + + }; + } + + static void compareMarker(SoftAssertions softAssertions, Marker expectedMarker, Marker actualMarker) { + softAssertions.assertThat(actualMarker) + .usingRecursiveComparison() + .withStrictTypeChecking() + .ignoringCollectionOrder() + .withEqualsForFields(equalsClasspath(), "classpath") + .ignoringFields( + // FIXME: https://github.com/spring-projects-experimental/spring-boot-migrator/issues/982 + "styles" + ) + .ignoringFieldsOfTypes( + UUID.class, + // FIXME: https://github.com/spring-projects-experimental/spring-boot-migrator/issues/982 + Style.class) + .isEqualTo(expectedMarker); + } + + private static BiPredicate equalsClasspath() { + return (List c1, List c2) -> { + List c1Sorted = c1.stream().map(JavaType.FullyQualified::getFullyQualifiedName).sorted().toList(); + List c2Sorted = c2.stream().map(JavaType.FullyQualified::getFullyQualifiedName).sorted().toList(); + return c1Sorted.equals(c2Sorted); + }; + } - public interface ParserResultParityChecker extends BiConsumer { - @Override - void accept(RewriteProjectParsingResult comparingParsingResult, RewriteProjectParsingResult testedParsingResult); } } diff --git a/sbm-support-rewrite/testcode/maven-projects/private-repository/.gitignore b/sbm-support-rewrite/testcode/maven-projects/private-repository/.gitignore new file mode 100644 index 000000000..cc73b93b9 --- /dev/null +++ b/sbm-support-rewrite/testcode/maven-projects/private-repository/.gitignore @@ -0,0 +1,17 @@ +/testcode/**/target/** +/testcode/testcode/**/.rewrite-cache/** +/dependency-project/pom.xml +/dependency-project/target +/dependent-project/pom.xml +/dependent-project/target +/user.home/.config/ +/user.home/apache-maven-3.9.5/ +/user.home/.m2/repository +/user.home/.m2/settings.xml +!/user.home/.m2/settings.xml.template +!/user.home/.m2/settings-security.xml +/reposilite-data/static +/reposilite-data/.local +/reposilite-data/plugins +/reposilite-data/reposilite.db +/reposilite-data/configuration.cdn diff --git a/sbm-support-rewrite/testcode/maven-projects/private-repository/README.adoc b/sbm-support-rewrite/testcode/maven-projects/private-repository/README.adoc new file mode 100644 index 000000000..094c99e9d --- /dev/null +++ b/sbm-support-rewrite/testcode/maven-projects/private-repository/README.adoc @@ -0,0 +1,36 @@ +# Artifact Repository Test + +Test that artifacts available in a private artifact repository configured in `~/.m2/settings.xml` can be accessed. +This is important as many enterprise projects use their private artifact repository to retrieve private dependencies. + +- A private artifact repository using (https://github.com/dzikoysk/reposilite[reposilite]) is started in a Docker container. +The reposilite instance has a user configured (admin:secret) which can deploy and access artifacts. + +- The repositories in the artifact repository (e.g. snapshot) require successful authentication (deploy + download). + +- `dependency-project` has a simple class `DependencyClass` and gets deployed to the artifact repository. + +- `dependent-project` depends on `dependency-project` and has a class `DependentClass` that uses `DependencyClass` + +- `dependent-project` gets parsed + +- The resulting AST has the type information of `dependency-project` resolved when the repository information and credentials were read from `settings.xml` and `security-settings.xml`. + +Technical requirements: + +- The port of the Docker container is dynamic and used in settings.xml and pom.xml. +- The local Maven installation of any system should not be affected by this test. +- The location of the Maven dir `.m2` must therefore point to a different location while the test is running. + + + + + + +This requires temporarily a different `.m2` location, here `testcode/maven-projects/private-repository/user.home/.m2`. +When deploying the `dependency-project` the path to `settings.xml` is provided, pointing to `testcode/maven-projects/private-repository/user.home/.m2/settings.xml`. +This file declares the location of the local Maven repository pointing to the same dir. +Because these paths can't be relative for this test and absolute paths + + +The `user.home` is set to point to `testcode/maven-projects/private-repository/user.home` which contains a `.m2` directory providing access configuration to the reposilite instance through `.m2/settings.xml` and `.m2/security-settings.xml`, diff --git a/sbm-support-rewrite/testcode/maven-projects/private-repository/dependency-project/pom.xml.template b/sbm-support-rewrite/testcode/maven-projects/private-repository/dependency-project/pom.xml.template new file mode 100644 index 000000000..920e5e677 --- /dev/null +++ b/sbm-support-rewrite/testcode/maven-projects/private-repository/dependency-project/pom.xml.template @@ -0,0 +1,25 @@ + + + 4.0.0 + + com.example.dependency + dependency-project + 1.0-SNAPSHOT + + dependency-project + + + UTF-8 + 17 + 17 + + + + + repository-snapshots + Snapshots Repository + http://localhost:${port}/snapshots + + + diff --git a/sbm-support-rewrite/testcode/maven-projects/private-repository/dependency-project/src/main/java/com/example/dependency/DependencyClass.java b/sbm-support-rewrite/testcode/maven-projects/private-repository/dependency-project/src/main/java/com/example/dependency/DependencyClass.java new file mode 100644 index 000000000..67b1f0dd1 --- /dev/null +++ b/sbm-support-rewrite/testcode/maven-projects/private-repository/dependency-project/src/main/java/com/example/dependency/DependencyClass.java @@ -0,0 +1,13 @@ +package com.example.dependency; +public class DependencyClass +{ + private String value; + + public String getValue() { + return value; + } + + public void setValue(String value) { + this.value = value; + } +} diff --git a/sbm-support-rewrite/testcode/maven-projects/private-repository/dependent-project/pom.xml.template b/sbm-support-rewrite/testcode/maven-projects/private-repository/dependent-project/pom.xml.template new file mode 100644 index 000000000..797073c0d --- /dev/null +++ b/sbm-support-rewrite/testcode/maven-projects/private-repository/dependent-project/pom.xml.template @@ -0,0 +1,33 @@ + + + 4.0.0 + + com.example.dependent + dependent-project + 1.0-SNAPSHOT + + dependent-project + + + UTF-8 + 17 + 17 + + + + + com.example.dependency + dependency-project + 1.0-SNAPSHOT + + + + + + repository-snapshots + Snapshots Repository + http://localhost:${port}/snapshots + + + diff --git a/sbm-support-rewrite/testcode/maven-projects/private-repository/dependent-project/src/main/java/com/example/dependent/DependentClass.java b/sbm-support-rewrite/testcode/maven-projects/private-repository/dependent-project/src/main/java/com/example/dependent/DependentClass.java new file mode 100644 index 000000000..2fead286c --- /dev/null +++ b/sbm-support-rewrite/testcode/maven-projects/private-repository/dependent-project/src/main/java/com/example/dependent/DependentClass.java @@ -0,0 +1,7 @@ +package com.example.dependent; + +import com.example.dependency.DependencyClass; + +public class DependentClass { + private DependencyClass dependencyClass; +} diff --git a/sbm-support-rewrite/testcode/maven-projects/private-repository/reposilite-data/repositories/snapshots/com/example/dependency/dependency-project/1.0-SNAPSHOT/dependency-project-1.0-20231105.102337-1.jar b/sbm-support-rewrite/testcode/maven-projects/private-repository/reposilite-data/repositories/snapshots/com/example/dependency/dependency-project/1.0-SNAPSHOT/dependency-project-1.0-20231105.102337-1.jar new file mode 100644 index 0000000000000000000000000000000000000000..7e3c1683c36f46a4c97f2fab0989bd065004af28 GIT binary patch literal 2436 zcmWIWW@h1HVBlb2_#BlQ&VU3sfoxyb5Jz24KR5jVpfVAlG7hk^819U30YK?MAO?ye zl=(XPdAhj>Nh+~un^BLjma69a<|ZqK{G z!@)TxvA9?-8ASF5ob@~8An`jsYQ9ol>-M)zcJr@|9nba-Tr-ycOIN^;hfdDsh6vy?N^KbPVtWxU*z0` z1ygu_ZS6_DmVDvPws>bzQ|4v7+-8SeC-~TYJhObWM@6!s@W+TF2fNF6xBcxn|D0#4 zYQI?1Lc<#@Jexy~Jrs4`Ilt%SdC3zIcl4JjPqh0KIA!zX26sFErLV#d7kyJXc~SO{ z{_H=i7oPZ|wEyL{@3{eU*GuY_PrvX@@=W3;59UJkt9)nIPFOeT!JNL}MVpOQmB=|s zCGOI`%KXZvN^^W~Z=sr(U>c`uzu|W=JG_0%p778po?$z(^=!W?*oj zByJ0UDXAhir*%@S|6v7@w)fw)XWbLu^>b$H#)^d(Q-YJ1e-t~t@$eRhhP==BxwriG zS{C_&G@N;fejw@#W|((%cJF;Yt}#ndxiy!>XV)l%j~y}z0+sm_~LHc4;p z<>VgeZA_gr(w+)UFcPh+oAtPOO1suXnfx_3F24RMwf4M{`Kix}b@R`2&A+k1$K&-3 z9YtA{&hrwtHO_~ejFEYLzwBiGkz=3y&M3A2v0l25J5!|n*V@~&k4YSKzoif`HE?a+ zgDoMvO}yD9ydBMKC--{ZXUTuun0l7t^><1|;B|18$oBTMG;C#`KgXdR<>)DB+Yc(Hk+ppgHT;+%VGVRMhUu?g&i0!g* zNrmf&mnTl@9QR>;7ZN7VDgEHEXw!k#Qn#8d4?h*FMY8gGTrW3RFjdrV=6k;nlOB|; zPYW~3oqj5^iS@qW#SKZ)UU6lAuAQEj?d$t{e#r0h;rdfcA9r7TVRW3mmHBFKbN_S2 zAKM?6FS~q@A5m`Z0A@BV#WH1YVEhIFu{)*l49w33sYNB3sm0zpS|@$Hee^#1Z1nZi z^*HP8dDeT~6OO9(w7Y(${71QhomX)zUDPXJSv5yi%M}ICZI*X!^6~H>F-l zzF_-p$;MLsqrHF;m@XNaM3`|`2tY>zfdIo>M-YuvJ%F^~t{^~)L10OvI*^2GL#i&2 zEyh;BgSCS#UI}DEihG1p(RF|dd45}ayn!_ literal 0 HcmV?d00001 diff --git a/sbm-support-rewrite/testcode/maven-projects/private-repository/reposilite-data/repositories/snapshots/com/example/dependency/dependency-project/1.0-SNAPSHOT/dependency-project-1.0-20231105.102337-1.jar.md5 b/sbm-support-rewrite/testcode/maven-projects/private-repository/reposilite-data/repositories/snapshots/com/example/dependency/dependency-project/1.0-SNAPSHOT/dependency-project-1.0-20231105.102337-1.jar.md5 new file mode 100644 index 000000000..49cdda0c0 --- /dev/null +++ b/sbm-support-rewrite/testcode/maven-projects/private-repository/reposilite-data/repositories/snapshots/com/example/dependency/dependency-project/1.0-SNAPSHOT/dependency-project-1.0-20231105.102337-1.jar.md5 @@ -0,0 +1 @@ +5c1fa9eb9814ca94bec1d507acb02910 \ No newline at end of file diff --git a/sbm-support-rewrite/testcode/maven-projects/private-repository/reposilite-data/repositories/snapshots/com/example/dependency/dependency-project/1.0-SNAPSHOT/dependency-project-1.0-20231105.102337-1.jar.sha1 b/sbm-support-rewrite/testcode/maven-projects/private-repository/reposilite-data/repositories/snapshots/com/example/dependency/dependency-project/1.0-SNAPSHOT/dependency-project-1.0-20231105.102337-1.jar.sha1 new file mode 100644 index 000000000..27e747716 --- /dev/null +++ b/sbm-support-rewrite/testcode/maven-projects/private-repository/reposilite-data/repositories/snapshots/com/example/dependency/dependency-project/1.0-SNAPSHOT/dependency-project-1.0-20231105.102337-1.jar.sha1 @@ -0,0 +1 @@ +453d6aa069f223e17d5505601a3a3a7f576d61f4 \ No newline at end of file diff --git a/sbm-support-rewrite/testcode/maven-projects/private-repository/reposilite-data/repositories/snapshots/com/example/dependency/dependency-project/1.0-SNAPSHOT/dependency-project-1.0-20231105.102337-1.pom b/sbm-support-rewrite/testcode/maven-projects/private-repository/reposilite-data/repositories/snapshots/com/example/dependency/dependency-project/1.0-SNAPSHOT/dependency-project-1.0-20231105.102337-1.pom new file mode 100644 index 000000000..78420e9bc --- /dev/null +++ b/sbm-support-rewrite/testcode/maven-projects/private-repository/reposilite-data/repositories/snapshots/com/example/dependency/dependency-project/1.0-SNAPSHOT/dependency-project-1.0-20231105.102337-1.pom @@ -0,0 +1,25 @@ + + + 4.0.0 + + com.example.dependency + dependency-project + 1.0-SNAPSHOT + + dependency-project + + + UTF-8 + 17 + 17 + + + + + repository-snapshots + Snapshots Repository + http://localhost:52260/snapshots + + + diff --git a/sbm-support-rewrite/testcode/maven-projects/private-repository/reposilite-data/repositories/snapshots/com/example/dependency/dependency-project/1.0-SNAPSHOT/dependency-project-1.0-20231105.102337-1.pom.md5 b/sbm-support-rewrite/testcode/maven-projects/private-repository/reposilite-data/repositories/snapshots/com/example/dependency/dependency-project/1.0-SNAPSHOT/dependency-project-1.0-20231105.102337-1.pom.md5 new file mode 100644 index 000000000..940ac3b57 --- /dev/null +++ b/sbm-support-rewrite/testcode/maven-projects/private-repository/reposilite-data/repositories/snapshots/com/example/dependency/dependency-project/1.0-SNAPSHOT/dependency-project-1.0-20231105.102337-1.pom.md5 @@ -0,0 +1 @@ +b5e883c0ee08ff935cf96727bb8623f4 \ No newline at end of file diff --git a/sbm-support-rewrite/testcode/maven-projects/private-repository/reposilite-data/repositories/snapshots/com/example/dependency/dependency-project/1.0-SNAPSHOT/dependency-project-1.0-20231105.102337-1.pom.sha1 b/sbm-support-rewrite/testcode/maven-projects/private-repository/reposilite-data/repositories/snapshots/com/example/dependency/dependency-project/1.0-SNAPSHOT/dependency-project-1.0-20231105.102337-1.pom.sha1 new file mode 100644 index 000000000..50ec63f3c --- /dev/null +++ b/sbm-support-rewrite/testcode/maven-projects/private-repository/reposilite-data/repositories/snapshots/com/example/dependency/dependency-project/1.0-SNAPSHOT/dependency-project-1.0-20231105.102337-1.pom.sha1 @@ -0,0 +1 @@ +534f31aa5ef763fe4562871d4dbb167a5cdc26f0 \ No newline at end of file diff --git a/sbm-support-rewrite/testcode/maven-projects/private-repository/reposilite-data/repositories/snapshots/com/example/dependency/dependency-project/1.0-SNAPSHOT/dependency-project-1.0.jar b/sbm-support-rewrite/testcode/maven-projects/private-repository/reposilite-data/repositories/snapshots/com/example/dependency/dependency-project/1.0-SNAPSHOT/dependency-project-1.0.jar new file mode 100644 index 0000000000000000000000000000000000000000..7e3c1683c36f46a4c97f2fab0989bd065004af28 GIT binary patch literal 2436 zcmWIWW@h1HVBlb2_#BlQ&VU3sfoxyb5Jz24KR5jVpfVAlG7hk^819U30YK?MAO?ye zl=(XPdAhj>Nh+~un^BLjma69a<|ZqK{G z!@)TxvA9?-8ASF5ob@~8An`jsYQ9ol>-M)zcJr@|9nba-Tr-ycOIN^;hfdDsh6vy?N^KbPVtWxU*z0` z1ygu_ZS6_DmVDvPws>bzQ|4v7+-8SeC-~TYJhObWM@6!s@W+TF2fNF6xBcxn|D0#4 zYQI?1Lc<#@Jexy~Jrs4`Ilt%SdC3zIcl4JjPqh0KIA!zX26sFErLV#d7kyJXc~SO{ z{_H=i7oPZ|wEyL{@3{eU*GuY_PrvX@@=W3;59UJkt9)nIPFOeT!JNL}MVpOQmB=|s zCGOI`%KXZvN^^W~Z=sr(U>c`uzu|W=JG_0%p778po?$z(^=!W?*oj zByJ0UDXAhir*%@S|6v7@w)fw)XWbLu^>b$H#)^d(Q-YJ1e-t~t@$eRhhP==BxwriG zS{C_&G@N;fejw@#W|((%cJF;Yt}#ndxiy!>XV)l%j~y}z0+sm_~LHc4;p z<>VgeZA_gr(w+)UFcPh+oAtPOO1suXnfx_3F24RMwf4M{`Kix}b@R`2&A+k1$K&-3 z9YtA{&hrwtHO_~ejFEYLzwBiGkz=3y&M3A2v0l25J5!|n*V@~&k4YSKzoif`HE?a+ zgDoMvO}yD9ydBMKC--{ZXUTuun0l7t^><1|;B|18$oBTMG;C#`KgXdR<>)DB+Yc(Hk+ppgHT;+%VGVRMhUu?g&i0!g* zNrmf&mnTl@9QR>;7ZN7VDgEHEXw!k#Qn#8d4?h*FMY8gGTrW3RFjdrV=6k;nlOB|; zPYW~3oqj5^iS@qW#SKZ)UU6lAuAQEj?d$t{e#r0h;rdfcA9r7TVRW3mmHBFKbN_S2 zAKM?6FS~q@A5m`Z0A@BV#WH1YVEhIFu{)*l49w33sYNB3sm0zpS|@$Hee^#1Z1nZi z^*HP8dDeT~6OO9(w7Y(${71QhomX)zUDPXJSv5yi%M}ICZI*X!^6~H>F-l zzF_-p$;MLsqrHF;m@XNaM3`|`2tY>zfdIo>M-YuvJ%F^~t{^~)L10OvI*^2GL#i&2 zEyh;BgSCS#UI}DEihG1p(RF|dd45}ayn!_ literal 0 HcmV?d00001 diff --git a/sbm-support-rewrite/testcode/maven-projects/private-repository/reposilite-data/repositories/snapshots/com/example/dependency/dependency-project/1.0-SNAPSHOT/maven-metadata.xml b/sbm-support-rewrite/testcode/maven-projects/private-repository/reposilite-data/repositories/snapshots/com/example/dependency/dependency-project/1.0-SNAPSHOT/maven-metadata.xml new file mode 100644 index 000000000..aacf3480f --- /dev/null +++ b/sbm-support-rewrite/testcode/maven-projects/private-repository/reposilite-data/repositories/snapshots/com/example/dependency/dependency-project/1.0-SNAPSHOT/maven-metadata.xml @@ -0,0 +1,25 @@ + + + com.example.dependency + dependency-project + + 20231105102337 + + 20231105.102337 + 1 + + + + pom + 1.0-20231105.102337-1 + 20231105102337 + + + jar + 1.0-20231105.102337-1 + 20231105102337 + + + + 1.0-SNAPSHOT + diff --git a/sbm-support-rewrite/testcode/maven-projects/private-repository/reposilite-data/repositories/snapshots/com/example/dependency/dependency-project/1.0-SNAPSHOT/maven-metadata.xml.md5 b/sbm-support-rewrite/testcode/maven-projects/private-repository/reposilite-data/repositories/snapshots/com/example/dependency/dependency-project/1.0-SNAPSHOT/maven-metadata.xml.md5 new file mode 100644 index 000000000..03c2d4d82 --- /dev/null +++ b/sbm-support-rewrite/testcode/maven-projects/private-repository/reposilite-data/repositories/snapshots/com/example/dependency/dependency-project/1.0-SNAPSHOT/maven-metadata.xml.md5 @@ -0,0 +1 @@ +40910b0eb66467f44ca8792bfe5a847e \ No newline at end of file diff --git a/sbm-support-rewrite/testcode/maven-projects/private-repository/reposilite-data/repositories/snapshots/com/example/dependency/dependency-project/1.0-SNAPSHOT/maven-metadata.xml.sha1 b/sbm-support-rewrite/testcode/maven-projects/private-repository/reposilite-data/repositories/snapshots/com/example/dependency/dependency-project/1.0-SNAPSHOT/maven-metadata.xml.sha1 new file mode 100644 index 000000000..24af63b0f --- /dev/null +++ b/sbm-support-rewrite/testcode/maven-projects/private-repository/reposilite-data/repositories/snapshots/com/example/dependency/dependency-project/1.0-SNAPSHOT/maven-metadata.xml.sha1 @@ -0,0 +1 @@ +6262ab25ed0f7e2128fb26fab1acd090c535abaf \ No newline at end of file diff --git a/sbm-support-rewrite/testcode/maven-projects/private-repository/reposilite-data/repositories/snapshots/com/example/dependency/dependency-project/maven-metadata.xml b/sbm-support-rewrite/testcode/maven-projects/private-repository/reposilite-data/repositories/snapshots/com/example/dependency/dependency-project/maven-metadata.xml new file mode 100644 index 000000000..10b9e9598 --- /dev/null +++ b/sbm-support-rewrite/testcode/maven-projects/private-repository/reposilite-data/repositories/snapshots/com/example/dependency/dependency-project/maven-metadata.xml @@ -0,0 +1,11 @@ + + + com.example.dependency + dependency-project + + + 1.0-SNAPSHOT + + 20231105102337 + + diff --git a/sbm-support-rewrite/testcode/maven-projects/private-repository/reposilite-data/repositories/snapshots/com/example/dependency/dependency-project/maven-metadata.xml.md5 b/sbm-support-rewrite/testcode/maven-projects/private-repository/reposilite-data/repositories/snapshots/com/example/dependency/dependency-project/maven-metadata.xml.md5 new file mode 100644 index 000000000..fa762d2be --- /dev/null +++ b/sbm-support-rewrite/testcode/maven-projects/private-repository/reposilite-data/repositories/snapshots/com/example/dependency/dependency-project/maven-metadata.xml.md5 @@ -0,0 +1 @@ +9bf1c816b6c0f8166efd71605db83682 \ No newline at end of file diff --git a/sbm-support-rewrite/testcode/maven-projects/private-repository/reposilite-data/repositories/snapshots/com/example/dependency/dependency-project/maven-metadata.xml.sha1 b/sbm-support-rewrite/testcode/maven-projects/private-repository/reposilite-data/repositories/snapshots/com/example/dependency/dependency-project/maven-metadata.xml.sha1 new file mode 100644 index 000000000..3aa41af3a --- /dev/null +++ b/sbm-support-rewrite/testcode/maven-projects/private-repository/reposilite-data/repositories/snapshots/com/example/dependency/dependency-project/maven-metadata.xml.sha1 @@ -0,0 +1 @@ +4fa1150761b6af92a0b232fe8ec688b9e90d0f88 \ No newline at end of file diff --git a/sbm-support-rewrite/testcode/maven-projects/private-repository/reposilite-data/shared.configuration.json b/sbm-support-rewrite/testcode/maven-projects/private-repository/reposilite-data/shared.configuration.json new file mode 100644 index 000000000..90c3c48d0 --- /dev/null +++ b/sbm-support-rewrite/testcode/maven-projects/private-repository/reposilite-data/shared.configuration.json @@ -0,0 +1,75 @@ +{ + "statistics": { + "enabled": true, + "resolvedRequestsInterval": "MONTHLY" + }, + "web": { + "forwardedIp": "X-Forwarded-For" + }, + "frontend": { + "id": "reposilite-repository", + "title": "Reposilite Repository", + "description": "Public Maven repository hosted through the Reposilite", + "organizationWebsite": "https://reposilite.com", + "organizationLogo": "https://avatars.githubusercontent.com/u/88636591", + "icpLicense": "" + }, + "authentication": { + "ldap": { + "enabled": false, + "ssl": false, + "hostname": "ldap.domain.com", + "port": 389, + "baseDn": "dc=company,dc=com", + "searchUserDn": "cn=reposilite,ou=admins,dc=domain,dc=com", + "searchUserPassword": "reposilite-admin-secret", + "typeAttribute": "person", + "userAttribute": "cn", + "userFilter": "(&(objectClass=person)(ou=Maven Users))", + "userType": "PERSISTENT" + } + }, + "maven": { + "repositories": [ + { + "id": "releases", + "visibility": "PRIVATE", + "redeployment": false, + "preserveSnapshots": false, + "storageProvider": { + "type": "fs", + "quota": "100%", + "mount": "" + }, + "storagePolicy": "PRIORITIZE_UPSTREAM_METADATA", + "proxied": [] + }, + { + "id": "snapshots", + "visibility": "PRIVATE", + "redeployment": true, + "preserveSnapshots": false, + "storageProvider": { + "type": "fs", + "quota": "100%", + "mount": "./snapshots" + }, + "storagePolicy": "PRIORITIZE_UPSTREAM_METADATA", + "proxied": [] + }, + { + "id": "private", + "visibility": "PRIVATE", + "redeployment": false, + "preserveSnapshots": false, + "storageProvider": { + "type": "fs", + "quota": "100%", + "mount": "" + }, + "storagePolicy": "PRIORITIZE_UPSTREAM_METADATA", + "proxied": [] + } + ] + } +} \ No newline at end of file diff --git a/sbm-support-rewrite/testcode/maven-projects/private-repository/user.home/.m2/settings-clear-password.xml b/sbm-support-rewrite/testcode/maven-projects/private-repository/user.home/.m2/settings-clear-password.xml new file mode 100644 index 000000000..4d2209073 --- /dev/null +++ b/sbm-support-rewrite/testcode/maven-projects/private-repository/user.home/.m2/settings-clear-password.xml @@ -0,0 +1,14 @@ + + + /Users/fkrueger/projects/spring-boot-migrator/sbm-support-rewrite/testcode/maven-projects/private-repository/user.home/.m2/repository + + + + repository-snapshots + user + + secret + + + diff --git a/sbm-support-rewrite/testcode/maven-projects/private-repository/user.home/.m2/settings-security.xml b/sbm-support-rewrite/testcode/maven-projects/private-repository/user.home/.m2/settings-security.xml new file mode 100644 index 000000000..69a679944 --- /dev/null +++ b/sbm-support-rewrite/testcode/maven-projects/private-repository/user.home/.m2/settings-security.xml @@ -0,0 +1,4 @@ + + + {BzCEWWQMgMkHk0P8+Rr+hsscSisZT6A4+G9Mub7f/m4=} + \ No newline at end of file diff --git a/sbm-support-rewrite/testcode/maven-projects/private-repository/user.home/.m2/settings.xml.template b/sbm-support-rewrite/testcode/maven-projects/private-repository/user.home/.m2/settings.xml.template new file mode 100644 index 000000000..6994fc296 --- /dev/null +++ b/sbm-support-rewrite/testcode/maven-projects/private-repository/user.home/.m2/settings.xml.template @@ -0,0 +1,15 @@ + + + ${user.home}/.m2/repository + + + + repository-snapshots + user + + {iKYxpFKiVu0HTAe4w0RAzev3TAav0DG8wEom2qNoRws=} + + + + diff --git a/sbm-support-rewrite/testcode/maven-projects/project-with-maven-settings/user-home/.m2/settings-security.xml b/sbm-support-rewrite/testcode/maven-projects/project-with-maven-settings/user-home/.m2/settings-security.xml new file mode 100644 index 000000000..69a679944 --- /dev/null +++ b/sbm-support-rewrite/testcode/maven-projects/project-with-maven-settings/user-home/.m2/settings-security.xml @@ -0,0 +1,4 @@ + + + {BzCEWWQMgMkHk0P8+Rr+hsscSisZT6A4+G9Mub7f/m4=} + \ No newline at end of file diff --git a/components/sbm-core/testcode/project-with-maven-settings/user-home/.m2/settings.xml b/sbm-support-rewrite/testcode/maven-projects/project-with-maven-settings/user-home/.m2/settings.xml similarity index 81% rename from components/sbm-core/testcode/project-with-maven-settings/user-home/.m2/settings.xml rename to sbm-support-rewrite/testcode/maven-projects/project-with-maven-settings/user-home/.m2/settings.xml index 36c701728..ba1731765 100644 --- a/components/sbm-core/testcode/project-with-maven-settings/user-home/.m2/settings.xml +++ b/sbm-support-rewrite/testcode/maven-projects/project-with-maven-settings/user-home/.m2/settings.xml @@ -3,6 +3,16 @@ xmlns='http://maven.apache.org/SETTINGS/1.0.0' xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance'> ${java.io.tmpdir} + + + + repository-snapshots + user + + {iKYxpFKiVu0HTAe4w0RAzev3TAav0DG8wEom2qNoRws=} + + + @@ -43,4 +53,4 @@ 80 - + \ No newline at end of file From 53c117df18d67b83335bcc62f01fa87b5b3d22ea Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fabian=20Kr=C3=BCger?= Date: Fri, 10 Nov 2023 11:38:56 +0100 Subject: [PATCH 2/2] Remove duplicate build --- .github/workflows/build-sbm-revamp.yml | 3 --- 1 file changed, 3 deletions(-) diff --git a/.github/workflows/build-sbm-revamp.yml b/.github/workflows/build-sbm-revamp.yml index 30599208f..a6d80009b 100644 --- a/.github/workflows/build-sbm-revamp.yml +++ b/.github/workflows/build-sbm-revamp.yml @@ -22,9 +22,6 @@ jobs: working-directory: sbm-support-rewrite run: mvn --batch-mode clean install - - name: clean install skipTests - run: mvn clean install -DskipTests - - name: clean run: mvn clean