diff --git a/sbm-support-rewrite/src/main/java/org/springframework/sbm/parsers/ModuleParser.java b/sbm-support-rewrite/src/main/java/org/springframework/sbm/parsers/ModuleParser.java deleted file mode 100644 index 106c48222..000000000 --- a/sbm-support-rewrite/src/main/java/org/springframework/sbm/parsers/ModuleParser.java +++ /dev/null @@ -1,278 +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.parsers; - -import lombok.extern.slf4j.Slf4j; -import org.jetbrains.annotations.NotNull; -import org.openrewrite.ExecutionContext; -import org.openrewrite.FileAttributes; -import org.openrewrite.Parser; -import org.openrewrite.SourceFile; -import org.openrewrite.internal.lang.Nullable; -import org.openrewrite.java.JavaParser; -import org.openrewrite.java.internal.JavaTypeCache; -import org.openrewrite.java.marker.JavaSourceSet; -import org.openrewrite.java.tree.J; -import org.openrewrite.java.tree.JavaType; -import org.openrewrite.marker.Generated; -import org.openrewrite.marker.Marker; -import org.openrewrite.marker.Markers; -import org.openrewrite.xml.tree.Xml; -import org.springframework.core.io.Resource; -import org.springframework.sbm.utils.ResourceUtil; - -import java.io.InputStream; -import java.nio.file.Files; -import java.nio.file.Path; -import java.nio.file.Paths; -import java.util.*; -import java.util.function.Predicate; -import java.util.function.Supplier; -import java.util.function.UnaryOperator; -import java.util.stream.Collectors; -import java.util.stream.Stream; - -import static org.openrewrite.Tree.randomId; - -/** - * @author Fabian Krüger - */ -@Slf4j -public class ModuleParser { - - /** - * Add {@link Marker}s to {@link SourceFile}. - */ - public UnaryOperator addProvenance( - Path baseDir, - List provenance, - @Nullable Collection generatedSources - ) { - return s -> { - Markers markers = s.getMarkers(); - for (Marker marker : provenance) { - markers = markers.addIfAbsent(marker); - } - if (generatedSources != null && generatedSources.contains(baseDir.resolve(s.getSourcePath()))) { - markers = markers.addIfAbsent(new Generated(randomId())); - } - return s.withMarkers(markers); - }; - } - - /** - * Parse Java sources and resources under {@code src/main} of current module. - */ - public SourceSetParsingResult processMainSources( - Path baseDir, - List resources, - Xml.Document moduleBuildFile, - JavaParser.Builder javaParserBuilder, - RewriteResourceParser rp, - List provenanceMarkers, - Set alreadyParsed, - ExecutionContext executionContext, - MavenProject currentProject - ) { - log.info("Processing main sources in module '%s'".formatted(currentProject.getProjectId())); - // FIXME: 945 - // Some annotation processors output generated sources to the /target directory. These are added for parsing but - // should be filtered out of the final SourceFile list. - - List mainJavaSources = new ArrayList<>(); - List javaSourcesInTarget = currentProject.getJavaSourcesInTarget(); // listJavaSources(resources, currentProject.getBasedir().resolve(currentProject.getBuildDirectory())); - List javaSourcesInMain = currentProject.getMainJavaSources(); // listJavaSources(resources, currentProject.getBasedir().resolve(currentProject.getSourceDirectory())); - mainJavaSources.addAll(javaSourcesInTarget); - mainJavaSources.addAll(javaSourcesInMain); - - log.info("[%s] Parsing source files".formatted(currentProject)); - - // FIXME 945 classpath - // - Resolve dependencies to non-reactor projects from Maven repository - // - Resolve dependencies to reactor projects by providing the sources - // javaParserBuilder.classpath(byte[]) - - // we're processing a module here. The classpath of the module consists of all declared dependencies and their transitive dependencies too. - // For dependencies to projects that belong to the current rector... - // They'd either need to be built with Maven before to guarantee that the jars are installed to local Maven repo. - // Or, the classpath must be created from the sources of the project. - - - List dependencies = currentProject.getCompileClasspathElements(); - - javaParserBuilder.classpath(dependencies); - - JavaTypeCache typeCache = new JavaTypeCache(); - javaParserBuilder.typeCache(typeCache); - - Iterable inputs = mainJavaSources.stream() - .map(r -> { - FileAttributes fileAttributes = null; - Path path = ResourceUtil.getPath(r); - boolean isSynthetic = Files.exists(path); - Supplier inputStreamSupplier = () -> ResourceUtil.getInputStream(r); - Parser.Input input = new Parser.Input(path, fileAttributes, inputStreamSupplier, isSynthetic); - return input; - }) - .toList(); - - Set localClassesCp = new HashSet<>(); - JavaSourceSet javaSourceSet = sourceSet("main", dependencies, typeCache); - List cus = javaParserBuilder.build() - .parseInputs(inputs, baseDir, executionContext) - .peek(s -> { - ((J.CompilationUnit)s).getClasses() - .stream() - .map(J.ClassDeclaration::getType) - .forEach(localClassesCp::add); - - alreadyParsed.add(baseDir.resolve(s.getSourcePath())); - }) - .toList(); - - // TODO: This is a hack: - // Parsed java sources are not themselves on the classpath (here). - // The actual parsing happens when the stream is terminated (toList), - // therefore the toList() must be called before the parsed compilation units can be added to the classpath - List mainProjectProvenance = new ArrayList<>(provenanceMarkers); - javaSourceSet = appendToClasspath(localClassesCp, javaSourceSet); - mainProjectProvenance.add(javaSourceSet); - - List parsedJavaPaths = javaSourcesInTarget.stream().map(ResourceUtil::getPath).toList(); - Stream parsedJava = cus.stream().map(addProvenance(baseDir, mainProjectProvenance, parsedJavaPaths)); - log.debug("[%s] Scanned %d java source files in main scope.".formatted(currentProject, mainJavaSources.size())); - - //Filter out any generated source files from the returned list, as we do not want to apply the recipe to the - //generated files. - Path buildDirectory = Paths.get(currentProject.getBuildDirectory()); - List sourceFiles = parsedJava - .filter(s -> !s.getSourcePath().startsWith(buildDirectory)) - .collect(Collectors.toCollection(ArrayList::new)); - - int sourcesParsedBefore = alreadyParsed.size(); - alreadyParsed.addAll(parsedJavaPaths); - List parsedResourceFiles = rp.parse(currentProject.getModulePath().resolve("src/main/resources"), resources, alreadyParsed) - .map(addProvenance(baseDir, mainProjectProvenance, null)) - .toList(); - - log.debug("[%s] Scanned %d resource files in main scope.".formatted(currentProject, (alreadyParsed.size() - sourcesParsedBefore))); - // Any resources parsed from "main/resources" should also have the main source set added to them. - sourceFiles.addAll(parsedResourceFiles); - return new SourceSetParsingResult(sourceFiles, javaSourceSet.getClasspath()); - } - - /** - * Add entries that don't exist in the classpath of {@code javaSourceSet} from {@code appendingClasspath}. - */ - @NotNull - private static JavaSourceSet appendToClasspath(Set appendingClasspath, JavaSourceSet javaSourceSet) { - List curCp = javaSourceSet.getClasspath(); - appendingClasspath.forEach(f -> { - if(!curCp.contains(f)) { - curCp.add(f); - } - }); - javaSourceSet = javaSourceSet.withClasspath(new ArrayList<>(curCp)); - return javaSourceSet; - } - - @NotNull - private static JavaSourceSet sourceSet(String name, List dependencies, JavaTypeCache typeCache) { - return JavaSourceSet.build(name, dependencies, typeCache, false); - } - - - /** - * Parse Java sources and resource files under {@code src/test}. - */ - public SourceSetParsingResult processTestSources( - Path baseDir, - Xml.Document moduleBuildFile, - JavaParser.Builder javaParserBuilder, - RewriteResourceParser rp, - List provenanceMarkers, - Set alreadyParsed, - ExecutionContext executionContext, - MavenProject currentProject, - List resources, - List classpath) { - log.info("Processing test sources in module '%s'".formatted(currentProject.getProjectId())); - - List testDependencies = currentProject.getTestClasspathElements(); - - javaParserBuilder.classpath(testDependencies); - JavaTypeCache typeCache = new JavaTypeCache(); - javaParserBuilder.typeCache(typeCache); - - List testJavaSources = listJavaSources(resources, currentProject.getBasedir().resolve(currentProject.getTestSourceDirectory())); - alreadyParsed.addAll(testJavaSources.stream().map(ResourceUtil::getPath).toList()); - - Iterable inputs = testJavaSources.stream() - .map(r -> new Parser.Input(ResourceUtil.getPath(r), () -> ResourceUtil.getInputStream(r))) - .toList(); - - final List localClassesCp = new ArrayList<>(); - List cus = javaParserBuilder.build() - .parseInputs(inputs, baseDir, executionContext) - .peek(s -> { - ((J.CompilationUnit) s).getClasses() - .stream() - .map(J.ClassDeclaration::getType) - .forEach(localClassesCp::add); - alreadyParsed.add(baseDir.resolve(s.getSourcePath())); - }) - .toList(); - - List markers = new ArrayList<>(provenanceMarkers); - - JavaSourceSet javaSourceSet = sourceSet("test", testDependencies, typeCache); - Set curClasspath = Stream.concat(classpath.stream(), localClassesCp.stream()).collect(Collectors.toSet()); - javaSourceSet = appendToClasspath(curClasspath, javaSourceSet); - markers.add(javaSourceSet); - Stream parsedJava = cus.stream().map(addProvenance(baseDir, markers, null)); - - log.debug("[%s] Scanned %d java source files in test scope.".formatted(currentProject, testJavaSources.size())); - Stream sourceFiles = parsedJava; - - // Any resources parsed from "test/resources" should also have the test source set added to them. - int sourcesParsedBefore = alreadyParsed.size(); - Stream parsedResourceFiles = rp.parse(currentProject.getBasedir().resolve("src/test/resources"), resources, alreadyParsed) - .map(addProvenance(baseDir, markers, null)); - log.debug("[%s] Scanned %d resource files in test scope.".formatted(currentProject, (alreadyParsed.size() - sourcesParsedBefore))); - sourceFiles = Stream.concat(sourceFiles, parsedResourceFiles); - List result = sourceFiles.toList(); - return new SourceSetParsingResult(result, javaSourceSet.getClasspath()); - } - - - // FIXME: 945 take Java sources from resources - private static List listJavaSources(List resources, Path sourceDirectory) { - return resources.stream() - .filter(whenIn(sourceDirectory)) - .filter(whenFileNameEndsWithJava()) - .toList(); - } - - @NotNull - private static Predicate whenFileNameEndsWithJava() { - return p -> ResourceUtil.getPath(p).getFileName().toString().endsWith(".java"); - } - - @NotNull - private static Predicate whenIn(Path sourceDirectory) { - return r -> ResourceUtil.getPath(r).toString().startsWith(sourceDirectory.toString()); - } -} diff --git a/sbm-support-rewrite/src/main/java/org/springframework/sbm/parsers/ParserContext.java b/sbm-support-rewrite/src/main/java/org/springframework/sbm/parsers/ParserContext.java index aa1893707..033673a17 100644 --- a/sbm-support-rewrite/src/main/java/org/springframework/sbm/parsers/ParserContext.java +++ b/sbm-support-rewrite/src/main/java/org/springframework/sbm/parsers/ParserContext.java @@ -19,6 +19,7 @@ import lombok.RequiredArgsConstructor; import org.openrewrite.xml.tree.Xml; import org.springframework.core.io.Resource; +import org.springframework.sbm.parsers.maven.MavenProject; import org.springframework.sbm.utils.ResourceUtil; import java.nio.file.Path; 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 0b15c91ab..9a4466623 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 @@ -69,13 +69,8 @@ Consumer artifactDownloaderErrorConsumer() { } @Bean - ModuleParser moduleParser() { - return new ModuleParser(); - } - - @Bean - MavenModuleParser mavenModuleParser(ParserProperties parserProperties, ModuleParser moduleParser) { - return new MavenModuleParser(parserProperties, moduleParser); + MavenModuleParser mavenModuleParser(ParserProperties parserProperties) { + return new MavenModuleParser(parserProperties); } @Bean diff --git a/sbm-support-rewrite/src/main/java/org/springframework/sbm/parsers/maven/MavenModuleParser.java b/sbm-support-rewrite/src/main/java/org/springframework/sbm/parsers/maven/MavenModuleParser.java index e4fea1538..8fcee6c86 100644 --- a/sbm-support-rewrite/src/main/java/org/springframework/sbm/parsers/maven/MavenModuleParser.java +++ b/sbm-support-rewrite/src/main/java/org/springframework/sbm/parsers/maven/MavenModuleParser.java @@ -17,27 +17,42 @@ import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; +import org.jetbrains.annotations.NotNull; import org.openrewrite.ExecutionContext; +import org.openrewrite.FileAttributes; +import org.openrewrite.Parser; import org.openrewrite.SourceFile; +import org.openrewrite.internal.lang.Nullable; import org.openrewrite.java.JavaParser; +import org.openrewrite.java.internal.JavaTypeCache; +import org.openrewrite.java.marker.JavaSourceSet; +import org.openrewrite.java.tree.J; import org.openrewrite.java.tree.JavaType; +import org.openrewrite.marker.Generated; import org.openrewrite.marker.Marker; +import org.openrewrite.marker.Markers; import org.openrewrite.style.NamedStyles; import org.openrewrite.tree.ParsingExecutionContextView; import org.openrewrite.xml.tree.Xml; import org.springframework.core.io.Resource; import org.springframework.sbm.parsers.*; +import org.springframework.sbm.utils.ResourceUtil; +import java.io.InputStream; import java.nio.charset.Charset; +import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.PathMatcher; -import java.util.ArrayList; -import java.util.HashSet; -import java.util.List; -import java.util.Set; +import java.nio.file.Paths; +import java.util.*; +import java.util.function.Predicate; +import java.util.function.Supplier; +import java.util.function.UnaryOperator; import java.util.stream.Collectors; import java.util.stream.Stream; +import static org.openrewrite.Tree.randomId; + /** * @author Fabian Krüger */ @@ -46,7 +61,6 @@ public class MavenModuleParser { private final ParserProperties parserProperties; - private final ModuleParser mavenMojoProjectParserPrivateMethods; public List parseModuleSourceFiles( List resources, @@ -101,7 +115,7 @@ public List parseModuleSourceFiles( // parse other project resources Stream parsedResourceFiles = rp.parse(moduleBuildFilePath.getParent(), resources, alreadyParsed) // FIXME: handle generated sources - .map(mavenMojoProjectParserPrivateMethods.addProvenance(baseDir, provenanceMarkers, null)); + .map(addProvenance(baseDir, provenanceMarkers, null)); // 157:169 List mainAndTestSources = mergeAndFilterExcluded(baseDir, parserProperties.getIgnoredPathPatterns(), mainSourcesParsingResult.sourceFiles(), testSourcesParsingResult.sourceFiles()); List resourceFilesList = parsedResourceFiles.toList(); @@ -111,6 +125,26 @@ public List parseModuleSourceFiles( return sourceFiles; } + /** + * Add {@link Marker}s to {@link SourceFile}. + */ + public UnaryOperator addProvenance( + Path baseDir, + List provenance, + @Nullable Collection generatedSources + ) { + return s -> { + Markers markers = s.getMarkers(); + for (Marker marker : provenance) { + markers = markers.addIfAbsent(marker); + } + if (generatedSources != null && generatedSources.contains(baseDir.resolve(s.getSourcePath()))) { + markers = markers.addIfAbsent(new Generated(randomId())); + } + return s.withMarkers(markers); + }; + } + private List mergeAndFilterExcluded(Path baseDir, Set exclusions, List mainSources, List testSources) { List pathMatchers = exclusions.stream() .map(pattern -> baseDir.getFileSystem().getPathMatcher("glob:" + pattern)) @@ -129,7 +163,7 @@ private static boolean isNotExcluded(Path baseDir, List exclusions, } private SourceSetParsingResult parseTestSources(Path baseDir, MavenProject mavenProject, Xml.Document moduleBuildFile, JavaParser.Builder javaParserBuilder, RewriteResourceParser rp, List provenanceMarkers, Set alreadyParsed, ExecutionContext executionContext, List resources, List classpath) { - return mavenMojoProjectParserPrivateMethods.processTestSources(baseDir, moduleBuildFile, javaParserBuilder, rp, provenanceMarkers, alreadyParsed, executionContext, mavenProject, resources, classpath); + return processTestSources(baseDir, moduleBuildFile, javaParserBuilder, rp, provenanceMarkers, alreadyParsed, executionContext, mavenProject, resources, classpath); } /** @@ -142,7 +176,7 @@ private SourceSetParsingResult parseMainSources(Path baseDir, MavenProject maven // - mavenProject.getBuild().getSourceDirectory() // - mavenProject.getCompileClasspathElements() --> The classpath of the given project/module // - mavenProject.getBasedir().toPath() - return mavenMojoProjectParserPrivateMethods.processMainSources(baseDir, resources, moduleBuildFile, javaParserBuilder, rp, provenanceMarkers, alreadyParsed, executionContext, mavenProject); + return processMainSources(baseDir, resources, moduleBuildFile, javaParserBuilder, rp, provenanceMarkers, alreadyParsed, executionContext, mavenProject); // return invokeProcessMethod(baseDir, moduleBuildFile, javaParserBuilder, rp, provenanceMarkers, alreadyParsed, executionContext, "processMainSources"); } @@ -153,4 +187,208 @@ private Set pathsToOtherMavenProjects(MavenProject mavenProject, Path modu .collect(Collectors.toSet()); } + + + /** + * Parse Java sources and resources under {@code src/main} of current module. + */ + public SourceSetParsingResult processMainSources( + Path baseDir, + List resources, + Xml.Document moduleBuildFile, + JavaParser.Builder javaParserBuilder, + RewriteResourceParser rp, + List provenanceMarkers, + Set alreadyParsed, + ExecutionContext executionContext, + MavenProject currentProject + ) { + log.info("Processing main sources in module '%s'".formatted(currentProject.getProjectId())); + // FIXME: 945 + // Some annotation processors output generated sources to the /target directory. These are added for parsing but + // should be filtered out of the final SourceFile list. + + List mainJavaSources = new ArrayList<>(); + List javaSourcesInTarget = currentProject.getJavaSourcesInTarget(); // listJavaSources(resources, currentProject.getBasedir().resolve(currentProject.getBuildDirectory())); + List javaSourcesInMain = currentProject.getMainJavaSources(); // listJavaSources(resources, currentProject.getBasedir().resolve(currentProject.getSourceDirectory())); + mainJavaSources.addAll(javaSourcesInTarget); + mainJavaSources.addAll(javaSourcesInMain); + + log.info("[%s] Parsing source files".formatted(currentProject)); + + // FIXME 945 classpath + // - Resolve dependencies to non-reactor projects from Maven repository + // - Resolve dependencies to reactor projects by providing the sources + // javaParserBuilder.classpath(byte[]) + + // we're processing a module here. The classpath of the module consists of all declared dependencies and their transitive dependencies too. + // For dependencies to projects that belong to the current rector... + // They'd either need to be built with Maven before to guarantee that the jars are installed to local Maven repo. + // Or, the classpath must be created from the sources of the project. + + + List dependencies = currentProject.getCompileClasspathElements(); + + javaParserBuilder.classpath(dependencies); + + JavaTypeCache typeCache = new JavaTypeCache(); + javaParserBuilder.typeCache(typeCache); + + Iterable inputs = mainJavaSources.stream() + .map(r -> { + FileAttributes fileAttributes = null; + Path path = ResourceUtil.getPath(r); + boolean isSynthetic = Files.exists(path); + Supplier inputStreamSupplier = () -> ResourceUtil.getInputStream(r); + Parser.Input input = new Parser.Input(path, fileAttributes, inputStreamSupplier, isSynthetic); + return input; + }) + .toList(); + + Set localClassesCp = new HashSet<>(); + JavaSourceSet javaSourceSet = sourceSet("main", dependencies, typeCache); + List cus = javaParserBuilder.build() + .parseInputs(inputs, baseDir, executionContext) + .peek(s -> { + ((J.CompilationUnit)s).getClasses() + .stream() + .map(J.ClassDeclaration::getType) + .forEach(localClassesCp::add); + + alreadyParsed.add(baseDir.resolve(s.getSourcePath())); + }) + .toList(); + + // TODO: This is a hack: + // Parsed java sources are not themselves on the classpath (here). + // The actual parsing happens when the stream is terminated (toList), + // therefore the toList() must be called before the parsed compilation units can be added to the classpath + List mainProjectProvenance = new ArrayList<>(provenanceMarkers); + javaSourceSet = appendToClasspath(localClassesCp, javaSourceSet); + mainProjectProvenance.add(javaSourceSet); + + List parsedJavaPaths = javaSourcesInTarget.stream().map(ResourceUtil::getPath).toList(); + Stream parsedJava = cus.stream().map(addProvenance(baseDir, mainProjectProvenance, parsedJavaPaths)); + log.debug("[%s] Scanned %d java source files in main scope.".formatted(currentProject, mainJavaSources.size())); + + //Filter out any generated source files from the returned list, as we do not want to apply the recipe to the + //generated files. + Path buildDirectory = Paths.get(currentProject.getBuildDirectory()); + List sourceFiles = parsedJava + .filter(s -> !s.getSourcePath().startsWith(buildDirectory)) + .collect(Collectors.toCollection(ArrayList::new)); + + int sourcesParsedBefore = alreadyParsed.size(); + alreadyParsed.addAll(parsedJavaPaths); + List parsedResourceFiles = rp.parse(currentProject.getModulePath().resolve("src/main/resources"), resources, alreadyParsed) + .map(addProvenance(baseDir, mainProjectProvenance, null)) + .toList(); + + log.debug("[%s] Scanned %d resource files in main scope.".formatted(currentProject, (alreadyParsed.size() - sourcesParsedBefore))); + // Any resources parsed from "main/resources" should also have the main source set added to them. + sourceFiles.addAll(parsedResourceFiles); + return new SourceSetParsingResult(sourceFiles, javaSourceSet.getClasspath()); + } + + /** + * Add entries that don't exist in the classpath of {@code javaSourceSet} from {@code appendingClasspath}. + */ + @NotNull + private static JavaSourceSet appendToClasspath(Set appendingClasspath, JavaSourceSet javaSourceSet) { + List curCp = javaSourceSet.getClasspath(); + appendingClasspath.forEach(f -> { + if(!curCp.contains(f)) { + curCp.add(f); + } + }); + javaSourceSet = javaSourceSet.withClasspath(new ArrayList<>(curCp)); + return javaSourceSet; + } + + @NotNull + private static JavaSourceSet sourceSet(String name, List dependencies, JavaTypeCache typeCache) { + return JavaSourceSet.build(name, dependencies, typeCache, false); + } + + + /** + * Parse Java sources and resource files under {@code src/test}. + */ + public SourceSetParsingResult processTestSources( + Path baseDir, + Xml.Document moduleBuildFile, + JavaParser.Builder javaParserBuilder, + RewriteResourceParser rp, + List provenanceMarkers, + Set alreadyParsed, + ExecutionContext executionContext, + MavenProject currentProject, + List resources, + List classpath) { + log.info("Processing test sources in module '%s'".formatted(currentProject.getProjectId())); + + List testDependencies = currentProject.getTestClasspathElements(); + + javaParserBuilder.classpath(testDependencies); + JavaTypeCache typeCache = new JavaTypeCache(); + javaParserBuilder.typeCache(typeCache); + + List testJavaSources = listJavaSources(resources, currentProject.getBasedir().resolve(currentProject.getTestSourceDirectory())); + alreadyParsed.addAll(testJavaSources.stream().map(ResourceUtil::getPath).toList()); + + Iterable inputs = testJavaSources.stream() + .map(r -> new Parser.Input(ResourceUtil.getPath(r), () -> ResourceUtil.getInputStream(r))) + .toList(); + + final List localClassesCp = new ArrayList<>(); + List cus = javaParserBuilder.build() + .parseInputs(inputs, baseDir, executionContext) + .peek(s -> { + ((J.CompilationUnit) s).getClasses() + .stream() + .map(J.ClassDeclaration::getType) + .forEach(localClassesCp::add); + alreadyParsed.add(baseDir.resolve(s.getSourcePath())); + }) + .toList(); + + List markers = new ArrayList<>(provenanceMarkers); + + JavaSourceSet javaSourceSet = sourceSet("test", testDependencies, typeCache); + Set curClasspath = Stream.concat(classpath.stream(), localClassesCp.stream()).collect(Collectors.toSet()); + javaSourceSet = appendToClasspath(curClasspath, javaSourceSet); + markers.add(javaSourceSet); + Stream parsedJava = cus.stream().map(addProvenance(baseDir, markers, null)); + + log.debug("[%s] Scanned %d java source files in test scope.".formatted(currentProject, testJavaSources.size())); + Stream sourceFiles = parsedJava; + + // Any resources parsed from "test/resources" should also have the test source set added to them. + int sourcesParsedBefore = alreadyParsed.size(); + Stream parsedResourceFiles = rp.parse(currentProject.getBasedir().resolve("src/test/resources"), resources, alreadyParsed) + .map(addProvenance(baseDir, markers, null)); + log.debug("[%s] Scanned %d resource files in test scope.".formatted(currentProject, (alreadyParsed.size() - sourcesParsedBefore))); + sourceFiles = Stream.concat(sourceFiles, parsedResourceFiles); + List result = sourceFiles.toList(); + return new SourceSetParsingResult(result, javaSourceSet.getClasspath()); + } + + + // FIXME: 945 take Java sources from resources + private static List listJavaSources(List resources, Path sourceDirectory) { + return resources.stream() + .filter(whenIn(sourceDirectory)) + .filter(whenFileNameEndsWithJava()) + .toList(); + } + + @NotNull + private static Predicate whenFileNameEndsWithJava() { + return p -> ResourceUtil.getPath(p).getFileName().toString().endsWith(".java"); + } + + @NotNull + private static Predicate whenIn(Path sourceDirectory) { + return r -> ResourceUtil.getPath(r).toString().startsWith(sourceDirectory.toString()); + } } diff --git a/sbm-support-rewrite/src/main/java/org/springframework/sbm/parsers/MavenProject.java b/sbm-support-rewrite/src/main/java/org/springframework/sbm/parsers/maven/MavenProject.java similarity index 98% rename from sbm-support-rewrite/src/main/java/org/springframework/sbm/parsers/MavenProject.java rename to sbm-support-rewrite/src/main/java/org/springframework/sbm/parsers/maven/MavenProject.java index d2cc242a7..49575a844 100644 --- a/sbm-support-rewrite/src/main/java/org/springframework/sbm/parsers/MavenProject.java +++ b/sbm-support-rewrite/src/main/java/org/springframework/sbm/parsers/maven/MavenProject.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.Getter; import lombok.Setter; @@ -26,7 +26,6 @@ import org.openrewrite.maven.utilities.MavenArtifactDownloader; import org.openrewrite.xml.tree.Xml; import org.springframework.core.io.Resource; -import org.springframework.sbm.parsers.maven.MavenRuntimeInformation; import org.springframework.sbm.utils.ResourceUtil; import java.io.File; diff --git a/sbm-support-rewrite/src/main/java/org/springframework/sbm/parsers/maven/MavenProjectAnalyzer.java b/sbm-support-rewrite/src/main/java/org/springframework/sbm/parsers/maven/MavenProjectAnalyzer.java index e3f67b02e..a2b0f6283 100644 --- a/sbm-support-rewrite/src/main/java/org/springframework/sbm/parsers/maven/MavenProjectAnalyzer.java +++ b/sbm-support-rewrite/src/main/java/org/springframework/sbm/parsers/maven/MavenProjectAnalyzer.java @@ -20,7 +20,6 @@ import org.codehaus.plexus.util.xml.pull.XmlPullParserException; import org.openrewrite.maven.utilities.MavenArtifactDownloader; import org.springframework.core.io.Resource; -import org.springframework.sbm.parsers.MavenProject; import org.springframework.sbm.parsers.ParserContext; import org.springframework.sbm.utils.ResourceUtil; diff --git a/sbm-support-rewrite/src/main/java/org/springframework/sbm/parsers/maven/MavenProvenanceMarkerFactory.java b/sbm-support-rewrite/src/main/java/org/springframework/sbm/parsers/maven/MavenProvenanceMarkerFactory.java index 68cd8fe72..312c07ada 100644 --- a/sbm-support-rewrite/src/main/java/org/springframework/sbm/parsers/maven/MavenProvenanceMarkerFactory.java +++ b/sbm-support-rewrite/src/main/java/org/springframework/sbm/parsers/maven/MavenProvenanceMarkerFactory.java @@ -29,12 +29,10 @@ import org.openrewrite.marker.Marker; import org.openrewrite.marker.OperatingSystemProvenance; import org.openrewrite.marker.ci.BuildEnvironment; -import org.springframework.sbm.parsers.MavenProject; import java.nio.file.Path; import java.util.List; import java.util.Objects; -import java.util.stream.Collectors; import java.util.stream.Stream; diff --git a/sbm-support-rewrite/src/main/java/org/springframework/sbm/parsers/ProjectId.java b/sbm-support-rewrite/src/main/java/org/springframework/sbm/parsers/maven/ProjectId.java similarity index 96% rename from sbm-support-rewrite/src/main/java/org/springframework/sbm/parsers/ProjectId.java rename to sbm-support-rewrite/src/main/java/org/springframework/sbm/parsers/maven/ProjectId.java index 7ecce0a2b..425eb0f5d 100644 --- a/sbm-support-rewrite/src/main/java/org/springframework/sbm/parsers/ProjectId.java +++ b/sbm-support-rewrite/src/main/java/org/springframework/sbm/parsers/maven/ProjectId.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 java.util.Objects; diff --git a/sbm-support-rewrite/src/main/java/org/springframework/sbm/parsers/RecipeValidationErrorException.java b/sbm-support-rewrite/src/main/java/org/springframework/sbm/recipes/RecipeValidationErrorException.java similarity index 95% rename from sbm-support-rewrite/src/main/java/org/springframework/sbm/parsers/RecipeValidationErrorException.java rename to sbm-support-rewrite/src/main/java/org/springframework/sbm/recipes/RecipeValidationErrorException.java index 08a1d4c0d..bd27ef2a8 100644 --- a/sbm-support-rewrite/src/main/java/org/springframework/sbm/parsers/RecipeValidationErrorException.java +++ b/sbm-support-rewrite/src/main/java/org/springframework/sbm/recipes/RecipeValidationErrorException.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.recipes; /** * Thrown when recipe validation failed during discovery. diff --git a/sbm-support-rewrite/src/main/java/org/springframework/sbm/recipes/RewriteRecipeDiscovery.java b/sbm-support-rewrite/src/main/java/org/springframework/sbm/recipes/RewriteRecipeDiscovery.java index 9c11ff68e..980379539 100644 --- a/sbm-support-rewrite/src/main/java/org/springframework/sbm/recipes/RewriteRecipeDiscovery.java +++ b/sbm-support-rewrite/src/main/java/org/springframework/sbm/recipes/RewriteRecipeDiscovery.java @@ -24,7 +24,6 @@ import org.openrewrite.config.RecipeDescriptor; import org.openrewrite.config.ResourceLoader; import org.springframework.sbm.parsers.ParserProperties; -import org.springframework.sbm.parsers.RecipeValidationErrorException; import java.util.ArrayList; import java.util.Collection; 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 6f0a0864c..087641634 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 @@ -93,9 +93,8 @@ public static void main(String[] args){ 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); + MavenModuleParser mavenModuleParser = new MavenModuleParser(parserProperties); ProjectMetadata projectMetadata = new ProjectMetadata(); MavenSettingsInitializer mavenSettingsInitializer = new MavenSettingsInitializer(executionContext, projectMetadata); RewriteProjectParser projectParser = new RewriteProjectParser( 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 9937dbd31..d270b9c6d 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 @@ -26,7 +26,6 @@ import org.mockito.Mockito; import org.openrewrite.maven.utilities.MavenArtifactDownloader; import org.springframework.core.io.Resource; -import org.springframework.sbm.parsers.MavenProject; import org.springframework.sbm.test.util.DummyResource; import org.springframework.sbm.utils.ResourceUtil; diff --git a/sbm-support-rewrite/src/test/java/org/springframework/sbm/parsers/maven/ProvenanceMarkerFactoryTest.java b/sbm-support-rewrite/src/test/java/org/springframework/sbm/parsers/maven/ProvenanceMarkerFactoryTest.java index 2e0ab18f6..35b7cd399 100644 --- a/sbm-support-rewrite/src/test/java/org/springframework/sbm/parsers/maven/ProvenanceMarkerFactoryTest.java +++ b/sbm-support-rewrite/src/test/java/org/springframework/sbm/parsers/maven/ProvenanceMarkerFactoryTest.java @@ -35,7 +35,6 @@ import org.openrewrite.shaded.jgit.lib.Repository; import org.openrewrite.shaded.jgit.storage.file.FileRepositoryBuilder; import org.springframework.core.io.Resource; -import org.springframework.sbm.parsers.MavenProject; import org.springframework.sbm.parsers.ParserContext; import org.springframework.sbm.parsers.ParserProperties; import org.springframework.sbm.test.util.DummyResource;