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 a2acc89ad..9178d5aed 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 @@ -135,7 +135,11 @@ public String getDisplayName() { private final RewriteExecutionContext executionContext; - public OpenRewriteMavenBuildFile(Path absoluteProjectPath, Xml.Document sourceFile, ApplicationEventPublisher eventPublisher, RewriteExecutionContext executionContext) { + + public OpenRewriteMavenBuildFile(Path absoluteProjectPath, + Xml.Document sourceFile, + ApplicationEventPublisher eventPublisher, + RewriteExecutionContext executionContext) { super(absoluteProjectPath, sourceFile); this.eventPublisher = eventPublisher; this.executionContext = executionContext; @@ -264,14 +268,25 @@ public List getRequestedDependencies() { .map(d -> mapDependency(d)) .map(d -> { if(d.getType() == null || d.getClassifier() == null || d.getVersion() == null) { - List dependencies = getPom().findDependencies(d.getGroupId(), d.getArtifactId(), - d.getScope() != null ? Scope.fromName(d.getScope()) : null); + + String groupId = evaluate(d.getGroupId()); + String artifactId = evaluate(d.getArtifactId()); + String version = evaluate(d.getVersion()); + + List dependencies = getPom().findDependencies( + groupId, + artifactId, + d.getScope() != null ? Scope.fromName(d.getScope()) : null + ); ResolvedDependency resolvedDependency = dependencies.get(0); d.setVersion(resolvedDependency.getVersion()); d.setClassifier(resolvedDependency.getClassifier()); d.setType(resolvedDependency.getType()); + d.setArtifactId(artifactId); + d.setGroupId(groupId); + if(d.getScope() == null ) { - String s = resolveScope(d.getGroupId(), d.getArtifactId(), d.getType(), d.getClassifier()); + String s = resolveScope(groupId, artifactId, d.getType(), d.getClassifier()); d.setScope(s); } } @@ -351,19 +366,6 @@ private String resolveScope(String groupId, String artifactId, @Nullable String return managedScope != null ? managedScope.name().toLowerCase() : null; } - private String calculateVersion(org.openrewrite.maven.tree.Dependency d) { - String version = null; - if (d.getVersion() != null && !d.getVersion().startsWith("${")) { - version = d.getVersion(); - } else { - String managedVersion = getPom().getPom().getManagedVersion(d.getGroupId(), d.getArtifactId(), null, null); - if (managedVersion != null) { - version = managedVersion; - } - } - return version; - } - private org.springframework.sbm.build.api.Dependency mapDependency(Scope scope, ResolvedDependency d) { return new Dependency( d.getGroupId(), @@ -617,9 +619,8 @@ public String getArtifactId() { @Override public String getVersion() { - return getPom().getPom().getVersion(); + return evaluate(getPom().getPom().getVersion()); } - @Override public String getCoordinates() { return getGroupId() + ":" + getArtifactId() + ":" + getVersion(); @@ -796,4 +797,8 @@ public void removePlugins(String... coordinates) { } } + + private String evaluate(String expression) { + return getPom().getPom().getValue(expression); + } } 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 5589ef33e..f234b915c 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 @@ -20,7 +20,6 @@ import freemarker.template.Template; import lombok.Setter; import org.openrewrite.Parser; -import org.openrewrite.java.JavaParser; import org.openrewrite.xml.tree.Xml; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.sbm.build.impl.OpenRewriteMavenBuildFile; @@ -65,7 +64,10 @@ public void apply(ProjectContext context) { RewriteMavenParser rewriteMavenParser = new RewriteMavenParser(); Parser.Input input = new Parser.Input(Path.of("pom.xml"), () -> new ByteArrayInputStream(src.getBytes(StandardCharsets.UTF_8))); Xml.Document maven = rewriteMavenParser.parseInputs(List.of(input), null, new RewriteExecutionContext(getEventPublisher())).get(0); - OpenRewriteMavenBuildFile rewriteMavenBuildFile = new OpenRewriteMavenBuildFile(context.getProjectRootDirectory(), maven, getEventPublisher(), new RewriteExecutionContext(getEventPublisher())); + OpenRewriteMavenBuildFile rewriteMavenBuildFile = new OpenRewriteMavenBuildFile( + context.getProjectRootDirectory(), + maven, getEventPublisher(), new RewriteExecutionContext(getEventPublisher()) + ); context.getProjectResources().add(rewriteMavenBuildFile); } } 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 246103030..0b8418fba 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 @@ -33,7 +33,6 @@ public class BuildFileResourceWrapper implements ProjectResourceWrapper { private final ApplicationEventPublisher eventPublisher; - private final JavaParser javaParser; @Override public boolean shouldHandle(RewriteSourceFileHolder rewriteSourceFileHolder) { @@ -43,7 +42,12 @@ public boolean shouldHandle(RewriteSourceFileHolder rewrit @Override public OpenRewriteMavenBuildFile wrapRewriteSourceFileHolder(RewriteSourceFileHolder rewriteSourceFileHolder) { Xml.Document maven = (Xml.Document) rewriteSourceFileHolder.getSourceFile(); - return new OpenRewriteMavenBuildFile(rewriteSourceFileHolder.getAbsoluteProjectDir(), maven, eventPublisher, new RewriteExecutionContext(eventPublisher)); + + return new OpenRewriteMavenBuildFile( + rewriteSourceFileHolder.getAbsoluteProjectDir(), + maven, eventPublisher, + new RewriteExecutionContext(eventPublisher) + ); } } diff --git a/components/sbm-core/src/main/java/org/springframework/sbm/project/parser/MavenConfigHandler.java b/components/sbm-core/src/main/java/org/springframework/sbm/project/parser/MavenConfigHandler.java new file mode 100644 index 000000000..e716cef96 --- /dev/null +++ b/components/sbm-core/src/main/java/org/springframework/sbm/project/parser/MavenConfigHandler.java @@ -0,0 +1,63 @@ +/* + * Copyright 2021 - 2022 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.project.parser; + +import lombok.RequiredArgsConstructor; +import org.springframework.core.io.Resource; +import org.springframework.stereotype.Component; + +import java.io.IOException; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Optional; +import java.util.Properties; + +@Component +@RequiredArgsConstructor +public class MavenConfigHandler { + + public void injectMavenConfigIntoSystemProperties(List resources) { + + Optional mavenConfig = resources.stream().filter(k -> "maven.config".equals(k.getFilename())) + .findFirst(); + + Map mavenConfigMap = new HashMap<>(); + + if (mavenConfig.isPresent()) { + Properties properties = new Properties(); + try { + properties.load(mavenConfig.get().getInputStream()); + + properties.forEach((key, value) -> { + + String varKey = key.toString(); + + if (varKey.startsWith("-D")) { + mavenConfigMap.put(varKey.replace("-D", ""), value.toString()); + } + }); + + } catch (IOException e) { + + throw new RuntimeException(e); + } + } + + mavenConfigMap.keySet().forEach(k -> System.setProperty(k, mavenConfigMap.get(k))); + } +} diff --git a/components/sbm-core/src/main/java/org/springframework/sbm/project/parser/MavenProjectParser.java b/components/sbm-core/src/main/java/org/springframework/sbm/project/parser/MavenProjectParser.java index a398cbe0a..fa5de69b6 100644 --- a/components/sbm-core/src/main/java/org/springframework/sbm/project/parser/MavenProjectParser.java +++ b/components/sbm-core/src/main/java/org/springframework/sbm/project/parser/MavenProjectParser.java @@ -32,7 +32,6 @@ import org.openrewrite.maven.utilities.MavenArtifactDownloader; import org.openrewrite.xml.tree.Xml; import org.springframework.context.ApplicationEventPublisher; -import org.springframework.core.io.FileSystemResource; import org.springframework.core.io.Resource; import org.springframework.sbm.build.impl.MavenBuildFileUtil; import org.springframework.sbm.build.impl.RewriteMavenParser; @@ -45,11 +44,8 @@ import java.nio.file.Path; import java.nio.file.Paths; import java.util.*; -import java.util.function.UnaryOperator; import java.util.stream.Collectors; -import static java.util.Collections.emptyList; - /** * Parse a Maven project on disk into a list of {@link org.openrewrite.SourceFile} including * Maven, Java, YAML, properties, and XML AST representations of sources and resources found. @@ -63,25 +59,15 @@ public class MavenProjectParser { private final ResourceParser resourceParser; private final RewriteMavenParser mavenParser; private final MavenArtifactDownloader artifactDownloader; -// private final JavaParser.Builder javaParserBuilder; private final ApplicationEventPublisher eventPublisher; private final JavaProvenanceMarkerFactory javaProvenanceMarkerFactory; - private final JavaParser javaParser; -// public MavenProjectParser(ResourceParser resourceParser, -// MavenArtifactDownloader artifactDownloader, -// MavenParser.Builder mavenParserBuilder, -// JavaParser.Builder javaParserBuilder, -// ApplicationEventPublisher eventPublisher, JavaProvenanceMarkerFactory javaProvenanceMarkerFactory, ExecutionContext ctx) { -// this.resourceParser = resourceParser; -// this.mavenParser = mavenParserBuilder.build(); -// this.artifactDownloader = artifactDownloader; -//// this.javaParserBuilder = javaParserBuilder; -// this.eventPublisher = eventPublisher; -// this.javaProvenanceMarkerFactory = javaProvenanceMarkerFactory; -// } + private final MavenConfigHandler mavenConfigHandler; public List parse(Path projectDirectory, List resources) { + + mavenConfigHandler.injectMavenConfigIntoSystemProperties(resources); + ExecutionContext ctx = new RewriteExecutionContext(); @Nullable BuildEnvironment buildEnvironment = null; GitProvenance gitProvenance = GitProvenance.fromProjectDirectory(projectDirectory, buildEnvironment); @@ -178,86 +164,12 @@ public List parse(Path projectDirectory, List resources) { testResourceMarker.add(gitProvenance); List testResources = resourceParser.parse(projectDirectory, filteredResources, testResourceMarker); sourceFiles.addAll(testResources); - -// -// List mainMarkers = new ArrayList<>(javaProvenanceMarkers); -// mainMarkers.add(javaParser.getSourceSet(ctx)); -// sourceFiles.addAll(ListUtils.map( -// resourceParser.parse( -// projectDirectory, -// mainResourceFolder, -// ctx -// ), -// addProvenance(mainMarkers) -// )); - - - /* - - // -------- - // Test Java sources - List testJavaSources1 = getTestJavaSources(mavenProjectDirectory, resources, mavenResolution); - - JavaTypeCache typeCache = new JavaTypeCache(); - JavaSourceSet testJavaSourceSet = JavaSourceSet.build("test", dependencies, typeCache, true); - - List testSourcesParserInput = testJavaSources1.stream().map(js -> new Parser.Input(getPath(js), () -> { - eventPublisher.publishEvent(new StartedScanningProjectResourceEvent(getPath(js))); - InputStream content = getInputStream(js); - return content; - })).collect(Collectors.toList()); - - List testCompilationUnits = javaParser.parseInputs(testSourcesParserInput, mavenProjectDirectory, ctx); - UnaryOperator sourceFileUnaryOperator = addMarkers(testJavaSourceSet, javaProvenanceMarkers); - sourceFiles.addAll(ListUtils.map(testCompilationUnits, sourceFileUnaryOperator)); - - // ------- - - JavaTypeCache typeCache = new JavaTypeCache(); - JavaSourceSet mainProvenance = JavaSourceSet.build("main", dependencies, typeCache, true); - - List javaSources = getJavaSources(projectDirectory, resources, pomXml); - - List javaSourcesInput = javaSources.stream().map(js -> new Parser.Input(getPath(js), () -> { - eventPublisher.publishEvent(new StartedScanningProjectResourceEvent(getPath(js))); - InputStream content = getInputStream(js); - return content; - })).collect(Collectors.toList()); - - eventPublisher.publishEvent(new StartedScanningProjectResourceSetEvent("Java [main]: '" + mavenResolution.getPom().getArtifactId() + "'", javaSourcesInput.size())); - List compilationUnits = javaParser.parseInputs(javaSourcesInput, projectDirectory, ctx); - eventPublisher.publishEvent(new FinishedScanningProjectResourceSetEvent()); - - javaParser.parse(pomXml.getJavaSources(projectDirectory, ctx) javaSources, projectDirectory, ctx) - sourceFiles.addAll(ListUtils.map(compilationUnits, addProvenance(javaProvenanceMarkers, mainProvenance))); - - List testDependencies = downloadArtifacts(mavenResolution.getDependencies().get(Scope.Test)); - JavaSourceSet testProvenance = JavaSourceSet.build("test", testDependencies, typeCache, true); - javaParser.setClasspath(testDependencies); - - List testJavaSources = getTestJavaSources(projectDirectory, resources, pomXml); - List testJavaSourcesInput = testJavaSources.stream().map(js -> new Parser.Input(getPath(js), () -> { - eventPublisher.publishEvent(new StartedScanningProjectResourceEvent(getPath(js))); - return getInputStream(js); - })).collect(Collectors.toList()); - - eventPublisher.publishEvent(new StartedScanningProjectResourceSetEvent("Java [test]: '" + mavenResolution.getPom().getArtifactId() + "'", testJavaSourcesInput.size())); - List testCompilationUnits = javaParser.parseInputs(testJavaSourcesInput, projectDirectory, ctx); - eventPublisher.publishEvent(new FinishedScanningProjectResourceSetEvent()); - - sourceFiles.addAll(ListUtils.map(testCompilationUnits, addProvenance(javaProvenanceMarkers, testProvenance))); - - parseResources(getWebappResources(projectDirectory, resources, pomXml), projectDirectory, sourceFiles, javaProvenanceMarkers, mainProvenance); - parseResources(getMulesoftResources(projectDirectory, resources, pomXml), projectDirectory, sourceFiles, javaProvenanceMarkers, mainProvenance); - parseResources(getResources(projectDirectory, resources, pomXml), projectDirectory, sourceFiles, javaProvenanceMarkers, mainProvenance); - parseResources(getTestResources(projectDirectory, resources, pomXml), projectDirectory, sourceFiles, javaProvenanceMarkers, testProvenance); - - */ } return ListUtils.map(sourceFiles, s -> s.withMarkers(s.getMarkers().addIfAbsent(gitProvenance))); } + private List parseTestJavaSources(Path projectDirectory, List resources, ExecutionContext ctx, JavaParser javaParser, Xml.Document pomXml, Xml.Document mavenWithMarkers, Path mavenProjectDirectory, List javaProvenanceMarkers) { MavenResolutionResult mavenResolution = MavenBuildFileUtil.getMavenResolution(mavenWithMarkers); List resolvedDependencies = mavenResolution.getDependencies().get(Scope.Test); @@ -307,78 +219,7 @@ private List parseMainJavaSources(Path projectDirectory, List return mainCompilationUnits; } -/* - void createProjectProvenance(Path baseDir) { - String javaRuntimeVersion = System.getProperty("java.runtime.version"); - String javaVendor = System.getProperty("java.vm.vendor"); - String sourceCompatibility = javaRuntimeVersion; - String targetCompatibility = javaRuntimeVersion; - - String propertiesSourceCompatibility = (String) mavenProject.getProperties().get("maven.compiler.source"); - if (propertiesSourceCompatibility != null) { - sourceCompatibility = propertiesSourceCompatibility; - } - String propertiesTargetCompatibility = (String) mavenProject.getProperties().get("maven.compiler.target"); - if (propertiesTargetCompatibility != null) { - targetCompatibility = propertiesTargetCompatibility; - } - - BuildEnvironment buildEnvironment = BuildEnvironment.build(System::getenv); - return Stream.of( - buildEnvironment, - gitProvenance(baseDir, buildEnvironment), - new BuildTool(randomId(), BuildTool.Type.Maven, runtime.getMavenVersion()), - new JavaVersion(randomId(), javaRuntimeVersion, javaVendor, sourceCompatibility, targetCompatibility), - new JavaProject(randomId(), mavenProject.getName(), new JavaProject.Publication( - mavenProject.getGroupId(), - mavenProject.getArtifactId(), - mavenProject.getVersion() - ))) - .filter(Objects::nonNull) - .collect(toList()); - } - - */ - - @Nullable - private GitProvenance gitProvenance(Path baseDir, @Nullable BuildEnvironment buildEnvironment) { - try { - return GitProvenance.fromProjectDirectory(baseDir, buildEnvironment); - } catch (Exception e) { - // Logging at a low level as this is unlikely to happen except in non-git projects, where it is expected - log.debug("Unable to determine git provenance", e); - } - return null; - } - - private Path normalizeSourcePath(Path projectDirectory, Path sourcePath) { - return null; - } - private List getWebappResources(Path projectDir, List resources, Xml.Document maven) { - MavenResolutionResult mavenResolution = MavenBuildFileUtil.findMavenResolution(maven).get(); - if (!"jar".equals(mavenResolution.getPom().getPackaging()) && !"bundle".equals(mavenResolution.getPom().getPackaging())) { - return emptyList(); - } - Path inPath = projectDir.resolve(maven.getSourcePath()).getParent().resolve(Paths.get("src", "main", "webapp")); - return resources.stream() - .filter(r -> getPath(r).startsWith(inPath) /* && Stream.of(".properties", ".xml", ".yml", ".yaml").anyMatch(fe -> r.getPath().toString().endsWith(fe))) - .collect(Collectors.toList()); - } - - private List getMulesoftResources(Path projectDir, List resources, Xml.Document maven) { - Set mulePaths = Set.of( - projectDir.resolve(maven.getSourcePath()).getParent().resolve(Paths.get("src", "main", "app")), - projectDir.resolve(maven.getSourcePath()).getParent().resolve(Paths.get("src", "main", "mule")), - projectDir.resolve(maven.getSourcePath()).getParent().resolve(Paths.get("src", "main", "api")) - ); -// Path appPath = projectDir.resolve(maven.getSourcePath()).getParent().resolve(Paths.get("src", "main", "app")); -// Path mulePath = projectDir.resolve(maven.getSourcePath()).getParent().resolve(Paths.get("src", "main", "mule")); -// Path apiPath = projectDir.resolve(maven.getSourcePath()).getParent().resolve(Paths.get("src", "main", "api")); - return resources.stream() - .filter(r -> mulePaths.stream().anyMatch(appPath -> getPath(r).startsWith(appPath.toString())) /* && Stream.of(".properties", ".xml", ".yml", ".yaml").anyMatch(fe -> r.getPath().toString().endsWith(fe))*/) - .collect(Collectors.toList()); - } public static List filterMavenPoms(List resources) { @@ -389,9 +230,7 @@ public static List filterMavenPoms(List resources) { } public List getJavaSources(Path projectDir, List resources, Xml.Document maven) { -// if (!"jar".equals(maven.getMavenModel().getPom().getPackaging()) && !"bundle".equals(maven.getMavenModel().getPom().getPackaging())) { -// return emptyList(); -// } + Path inPath = projectDir.resolve(maven.getSourcePath()).getParent().resolve(Paths.get("src", "main", "java")); return resources.stream() .filter(r -> getPath(r).startsWith(inPath) && getPath(r).toString().endsWith(".java")) @@ -405,134 +244,6 @@ public List getTestJavaSources(Path projectDir, List resourc .collect(Collectors.toList()); } - - public List getResources(Path projectDir, List resources, Xml.Document maven) { -// if (!"jar".equals(maven.getMavenModel().getPom().getPackaging()) && !"bundle".equals(maven.getMavenModel().getPom().getPackaging())) { -// return emptyList(); -// } - Path inPath = projectDir.resolve(maven.getSourcePath()).getParent().resolve(Paths.get("src", "main", "resources")); - return resources.stream() - .filter(r -> getPath(r).startsWith(inPath) /* && Stream.of(".properties", ".xml", ".yml", ".yaml").anyMatch(fe -> r.getPath().toString().endsWith(fe))*/) - .collect(Collectors.toList()); - } - - public List getTestResources(Path projectDir, List resources, Xml.Document maven) { -// if (!"jar".equals(maven.getMavenModel().getPom().getPackaging()) && !"bundle".equals(maven.getMavenModel().getPom().getPackaging())) { -// return emptyList(); -// } - Path inPath = projectDir.resolve(maven.getSourcePath()).getParent().resolve(Paths.get("src", "test", "resources")); - return resources.stream() - .filter(r -> getPath(r).startsWith(inPath) /*&& Stream.of(".properties", ".xml", ".yml", ".yaml").anyMatch(fe -> r.getPath().toString().endsWith(fe))*/) - .collect(Collectors.toList()); - } - - private List mapToResource(List testResources) { - - return testResources.stream() - .map(p -> new FileSystemResource(p)) - .collect(Collectors.toList()); - } -/* - private void parseResources(List resources, Path projectDirectory, List sourceFiles, List projectProvenance, JavaSourceSet sourceSet) { - XmlParser xmlParser = new XmlParser(); - - List xmlFiles = resources.stream() - .filter(p -> xmlParser.accept(getPath(p))) - .map(r -> new Parser.Input(getPath(r), () -> { - eventPublisher.publishEvent(new StartedScanningProjectResourceEvent(getPath(r))); - return getInputStream(r); - })) - .collect(Collectors.toList()); - - eventPublisher.publishEvent(new StartedScanningProjectResourceSetEvent("Xml", xmlFiles.size())); - - List documents = xmlParser.parseInputs( - // TODO: duplicates - xmlFiles, - projectDirectory, - ctx - ); - sourceFiles.addAll(ListUtils.map(documents, addProvenance(projectProvenance, sourceSet))); - - eventPublisher.publishEvent(new FinishedScanningProjectResourceSetEvent()); - - - - YamlParser yamlParser = new YamlParser(); - List yamlFiles = resources.stream() - .filter(p -> yamlParser.accept(getPath(p))) - .map(r -> new Parser.Input(getPath(r), () -> { - eventPublisher.publishEvent(new StartedScanningProjectResourceEvent(getPath(r))); - return getInputStream(r); - })) - .collect(Collectors.toList()); - - eventPublisher.publishEvent(new StartedScanningProjectResourceSetEvent("Yaml", yamlFiles.size())); - - List yamls = yamlParser.parseInputs( - yamlFiles, - projectDirectory, - ctx - ); - sourceFiles.addAll(ListUtils.map(yamls, addProvenance(projectProvenance, sourceSet))); - - eventPublisher.publishEvent(new FinishedScanningProjectResourceSetEvent()); - - - - PropertiesParser propertiesParser = new PropertiesParser(); - List propertiesFiles = resources.stream() - .filter(p -> propertiesParser.accept(getPath(p))) - .map(r -> new Parser.Input(getPath(r), () -> { - eventPublisher.publishEvent(new StartedScanningProjectResourceEvent(getPath(r))); - return getInputStream(r); - })) - .collect(Collectors.toList()); - - eventPublisher.publishEvent(new StartedScanningProjectResourceSetEvent("Properties", propertiesFiles.size())); - - List properties = propertiesParser.parseInputs( - propertiesFiles, - projectDirectory, - ctx - ); - sourceFiles.addAll(ListUtils.map(properties, addProvenance(projectProvenance, sourceSet))); - - eventPublisher.publishEvent(new FinishedScanningProjectResourceSetEvent()); - - - - eventPublisher.publishEvent(new StartedScanningProjectResourceSetEvent("other files", propertiesFiles.size())); - - List otherFiles = resources.stream() - .filter(p -> !xmlParser.accept(getPath(p)) && !yamlParser.accept(getPath(p)) && !propertiesParser.accept(getPath(p))) - .map(r -> new Parser.Input(getPath(r), () -> { - eventPublisher.publishEvent(new StartedScanningProjectResourceEvent(getPath(r))); - return getInputStream(r); - })) - .collect(Collectors.toList()); - - List textfiles = new PlainTextParser().parseInputs( - otherFiles, - projectDirectory, - ctx - ); - sourceFiles.addAll(ListUtils.map(textfiles, addProvenance(projectProvenance, sourceSet))); - - eventPublisher.publishEvent(new FinishedScanningProjectResourceSetEvent()); - } - - */ - - @Deprecated - private UnaryOperator addMarkers(JavaSourceSet sourceSet, List projectProvenance) { - return s -> { - s = addMarkers(s, projectProvenance); - s = s.withMarkers(s.getMarkers().addIfAbsent(sourceSet)); - return s; - }; - } - private S addMarkers(S s, List markers) { for (Marker marker : markers) { s = s.withMarkers(s.getMarkers().addIfAbsent(marker)); @@ -540,16 +251,6 @@ private S addMarkers(S s, List markers) { return s; } - /* - private UnaryOperator addProvenance(List projectProvenance) { - return s -> { - s = addProjectProvenance(s, projectProvenance); - s = s.withMarkers(s.getMarkers().addIfAbsent(sourceSet)); - return s; - }; - } - */ - // TODO: #7 move into central place as downloading artifacts will also be required when dependencies are added to build file private List downloadArtifacts(List dependencies) { diff --git a/components/sbm-core/src/test/java/org/springframework/sbm/project/buildfile/OpenRewriteMavenBuildFileTest.java b/components/sbm-core/src/test/java/org/springframework/sbm/project/buildfile/OpenRewriteMavenBuildFileTest.java index 2f42c7a6a..d42cdf206 100644 --- a/components/sbm-core/src/test/java/org/springframework/sbm/project/buildfile/OpenRewriteMavenBuildFileTest.java +++ b/components/sbm-core/src/test/java/org/springframework/sbm/project/buildfile/OpenRewriteMavenBuildFileTest.java @@ -229,6 +229,89 @@ void shouldNotDuplicateDependencyInManagedDependencySetting() { } } + @Nested + class ResolvingMavenVariableTest { + + @Test + void itResolvesVariables() { + @Language("xml") + String pom = """ + + + 4.0.0 + javax.validation + demo + 1.0.0 + + 2.0.1.Final + + demo + + + ${project.groupId} + validation-api + ${javaValidationApiVersion} + + + + """; + + BuildFile buildFile = TestProjectContext + .buildProjectContext() + .withMavenRootBuildFileSource(pom) + .build() + .getApplicationModules() + .list() + .get(0) + .getBuildFile(); + + assertThat(buildFile.getRequestedDependencies()).hasSize(1); + Dependency javaValidationApiDependency = buildFile.getRequestedDependencies().get(0); + assertThat(javaValidationApiDependency.getGroupId()).isEqualTo("javax.validation"); + assertThat(javaValidationApiDependency.getVersion()).isEqualTo("2.0.1.Final"); + } + + @Test + void itResolvesVariableFromMavenConfig() { + @Language("xml") + String pom = """ + + + 4.0.0 + javax.validation + demo + ${revision} + + 2.0.1.Final + + demo + + + ${project.groupId} + validation-api + ${javaValidationApiVersion} + + + + """; + + BuildFile buildFile = TestProjectContext + .buildProjectContext() + .addProjectResource(".mvn/maven.config", """ + -Drevision=1.0.0 + """) + .withMavenRootBuildFileSource(pom) + .build() + .getApplicationModules() + .list() + .get(0) + .getBuildFile(); + + assertThat(buildFile.getVersion()).isEqualTo("1.0.0"); + } + } @Test @Tag("integration") diff --git a/components/sbm-core/src/test/java/org/springframework/sbm/project/parser/MavenConfigHandlerTest.java b/components/sbm-core/src/test/java/org/springframework/sbm/project/parser/MavenConfigHandlerTest.java new file mode 100644 index 000000000..802cd5fa2 --- /dev/null +++ b/components/sbm-core/src/test/java/org/springframework/sbm/project/parser/MavenConfigHandlerTest.java @@ -0,0 +1,65 @@ +/* + * Copyright 2021 - 2022 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.project.parser; + +import org.junit.jupiter.api.Test; +import org.springframework.core.io.Resource; +import org.springframework.sbm.project.TestDummyResource; + +import java.nio.file.Path; +import java.util.List; + +import static org.assertj.core.api.Assertions.assertThat; + +class MavenConfigHandlerTest { + + private final MavenConfigHandler target = new MavenConfigHandler(); + + @Test + public void shouldNotErrorWhenMavenConfigIsWrong() { + + String contents = """ + -Horror Story:, + A developer used PHP, + ** Scary music Intensifies ** + """; + + int propertySizeBefore = System.getProperties().keySet().size(); + List mavenConfigResource = List.of(new TestDummyResource(Path.of(".mvn/maven.config"), contents)); + target.injectMavenConfigIntoSystemProperties(mavenConfigResource); + int propertySizeAfter = System.getProperties().keySet().size(); + + assertThat(propertySizeAfter).isEqualTo(propertySizeBefore); + } + + @Test + public void parsesMavenConfig() { + + String contents = """ + -Drevision = 1.0.0 + -Dlicense.projectName=projectName + helloworld=hello + """; + + + target.injectMavenConfigIntoSystemProperties(List.of(new TestDummyResource(Path.of(".mvn/maven.config"), contents))); + + assertThat(System.getProperty("revision")).isEqualTo("1.0.0"); + assertThat(System.getProperty("license.projectName")).isEqualTo("projectName"); + assertThat(System.getProperty("helloworld")).isNull(); + } +} diff --git a/components/sbm-core/src/test/java/org/springframework/sbm/project/resource/TestProjectContext.java b/components/sbm-core/src/test/java/org/springframework/sbm/project/resource/TestProjectContext.java index 1ec2c2744..53779e3df 100644 --- a/components/sbm-core/src/test/java/org/springframework/sbm/project/resource/TestProjectContext.java +++ b/components/sbm-core/src/test/java/org/springframework/sbm/project/resource/TestProjectContext.java @@ -42,6 +42,7 @@ import org.springframework.sbm.project.parser.DependencyHelper; import org.springframework.sbm.project.parser.JavaProvenanceMarkerFactory; import org.springframework.sbm.project.parser.MavenProjectParser; +import org.springframework.sbm.project.parser.MavenConfigHandler; import org.springframework.sbm.project.parser.ProjectContextInitializer; import org.springframework.sbm.project.parser.ResourceParser; import org.springframework.sbm.project.parser.RewriteJsonParser; @@ -459,7 +460,8 @@ public ProjectContext build() { JavaRefactoringFactory javaRefactoringFactory = new JavaRefactoringFactoryImpl(projectResourceSetHolder); // create ProjectResourceWrapperRegistry and register Java and Maven resource wrapper - BuildFileResourceWrapper buildFileResourceWrapper = new BuildFileResourceWrapper(eventPublisher, javaParser); + BuildFileResourceWrapper buildFileResourceWrapper = new BuildFileResourceWrapper( + eventPublisher); resourceWrapperList.add(buildFileResourceWrapper); JavaSourceProjectResourceWrapper javaSourceProjectResourceWrapper = new JavaSourceProjectResourceWrapper(javaRefactoringFactory, javaParser); resourceWrapperList.add(javaSourceProjectResourceWrapper); @@ -516,7 +518,14 @@ private ProjectContextInitializer createProjectContextInitializer(ProjectContext MavenArtifactDownloader artifactDownloader = new RewriteMavenArtifactDownloader(); JavaProvenanceMarkerFactory javaProvenanceMarkerFactory = new JavaProvenanceMarkerFactory(); - MavenProjectParser mavenProjectParser = new MavenProjectParser(resourceParser, mavenParser, artifactDownloader, eventPublisher, javaProvenanceMarkerFactory, javaParser); + MavenProjectParser mavenProjectParser = new MavenProjectParser( + resourceParser, + mavenParser, + artifactDownloader, + eventPublisher, + javaProvenanceMarkerFactory, + javaParser, + new MavenConfigHandler()); GitSupport gitSupport = mock(GitSupport.class); when(gitSupport.repoExists(projectRoot.toFile())).thenReturn(true);