Skip to content

Commit acd6d20

Browse files
committed
WIP
1 parent 0fb8fed commit acd6d20

File tree

12 files changed

+323
-156
lines changed

12 files changed

+323
-156
lines changed

components/sbm-core/src/main/java/org/springframework/sbm/engine/precondition/JavaSourceDirExistsPreconditionCheck.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@
2828
class JavaSourceDirExistsPreconditionCheck extends PreconditionCheck {
2929

3030
private static final String JAVA_SRC_DIR = "src/main/java";
31-
private static final String PATTERN = "**/src/main/java/**";
31+
private static final String PATTERN = "/**/src/main/java/**";
3232
private final PathMatcher pathMatcher = new OsAgnosticPathMatcher();
3333
private final LinuxWindowsPathUnifier pathUnifier = new LinuxWindowsPathUnifier();
3434

components/sbm-core/src/main/java/org/springframework/sbm/java/impl/DependencyChangeHandler.java

Lines changed: 48 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,8 @@
2424
import org.openrewrite.java.internal.JavaTypeCache;
2525
import org.openrewrite.java.marker.JavaSourceSet;
2626
import org.openrewrite.java.tree.J;
27+
import org.openrewrite.java.tree.JavaType;
28+
import org.openrewrite.marker.Marker;
2729
import org.openrewrite.marker.Markers;
2830
import org.openrewrite.maven.MavenExecutionContextView;
2931
import org.openrewrite.maven.MavenSettings;
@@ -35,6 +37,7 @@
3537
import org.springframework.rewrite.parsers.RewriteProjectParser;
3638
import org.springframework.rewrite.parsers.SourceFileParser;
3739
import org.springframework.rewrite.parsers.maven.ClasspathDependencies;
40+
import org.springframework.rewrite.project.resource.RewriteSourceFileHolder;
3841
import org.springframework.rewrite.utils.JavaHelper;
3942
import org.springframework.sbm.build.api.ApplicationModules;
4043
import org.springframework.sbm.build.api.BuildFile;
@@ -50,6 +53,9 @@
5053
import java.io.ByteArrayInputStream;
5154
import java.nio.file.Path;
5255
import java.util.*;
56+
import java.util.function.Predicate;
57+
import java.util.stream.Collectors;
58+
import java.util.stream.Stream;
5359

5460
/**
5561
* @author Fabian Krüger
@@ -62,6 +68,7 @@ public class DependencyChangeHandler {
6268
private final ExecutionContext executionContext;
6369

6470
private SourceFileParser sourceFileParser;
71+
6572
/**
6673
* Handle changes of the dependency list in {@code currentBuildFile}.
6774
* First the affected java sources in the module of the {@code currentBuildFile} are recompiled.
@@ -105,7 +112,7 @@ private static Module getModuleForBuildFile(OpenRewriteMavenBuildFile currentBui
105112

106113
private Map<String, List<DependingModuleInfo>> createDependencyToModuleMappings(ApplicationModules applicationModules) {
107114
Map<String, List<DependingModuleInfo>> map = new HashMap<>();
108-
for(Module m : applicationModules.list()) {
115+
for (Module m : applicationModules.list()) {
109116
m.getBuildFile().getDeclaredDependencies().forEach(d -> {
110117
String scope = JavaHelper.uppercaseFirstChar(d.getEffectiveScope().toLowerCase());
111118
DependingModuleInfo moduleInfo = new DependingModuleInfo(d.getGav(), Scope.valueOf(scope), m);
@@ -123,7 +130,7 @@ private void updateSourceFileHolder(ProjectContext projectContext, List<SourceFi
123130

124131
projectContext.getProjectResources().stream()
125132
.forEach(r -> {
126-
if(recompiledClassesPaths.contains(r.getAbsolutePath().toString())) {
133+
if (recompiledClassesPaths.contains(r.getAbsolutePath().toString())) {
127134
int i = recompiledClassesPaths.indexOf(r.getAbsolutePath().toString());
128135
SourceFile sourceFile = recompiledClasses.get(i);
129136
r.replaceWith(sourceFile);
@@ -164,32 +171,56 @@ private List<SourceFile> recompileModuleClasses(Module module) {
164171
Set<Path> compileClasspath = scopeListMap.get(Scope.Compile);
165172
List<SourceFile> result = new ArrayList<>();
166173
List<JavaSource> mainJavaSourceSet = module.getMainJavaSourceSet().list();
167-
if(!mainJavaSourceSet.isEmpty()) {
174+
if (!mainJavaSourceSet.isEmpty()) {
175+
176+
JavaTypeCache typeCache = new JavaTypeCache();
177+
178+
// build map of markers
179+
Map<Path, List<Marker>> markerMap = mainJavaSourceSet.stream()
180+
.filter(OpenRewriteJavaSource.class::isInstance)
181+
.map(OpenRewriteJavaSource.class::cast)
182+
.map(OpenRewriteJavaSource::getResource)
183+
.map(RewriteSourceFileHolder::getSourceFile)
184+
.collect(Collectors.toMap(
185+
(J.CompilationUnit js) -> js.getSourcePath(),
186+
(J.CompilationUnit js) -> js.getMarkers().getMarkers().stream().filter(Predicate.not(JavaSourceSet.class::isInstance)).toList()
187+
));
188+
168189
List<Parser.Input> mainSources = mainJavaSourceSet.stream()
169190
.map(ja -> new Parser.Input(ja.getAbsolutePath(), () -> new ByteArrayInputStream(ja.print().getBytes())))
170191
.toList();
171-
JavaTypeCache typeCache = new JavaTypeCache();
172192
JavaParser javaParser = javaParserBuilder
173193
.typeCache(typeCache)
174194
.classpath(compileClasspath)
175-
.clone()
176195
.build();
177-
JavaSourceSet javaSourceSet = JavaSourceSet.build("main", compileClasspath, typeCache, false);
178-
Markers markers = mainJavaSourceSet.get(0).getResource().getSourceFile().getMarkers();
179-
markers.removeByType(JavaSourceSet.class);
180-
markers.addIfAbsent(javaSourceSet);
181-
ClasspathDependencies classpathDependencies = markers.findFirst(ClasspathDependencies.class).get();
182-
classpathDependencies.setDependencies(new ArrayList<>(compileClasspath));
183196
List<SourceFile> main = javaParser.parseInputs(mainSources, module.getProjectRootDir(), executionContext)
184-
.map(sf -> sf.withMarkers(markers))
185197
.map(SourceFile.class::cast)
186198
.toList();
187199

188-
result.addAll(main);
200+
JavaSourceSet javaSourceSet = JavaSourceSet.build("main", compileClasspath, typeCache, true);
201+
202+
List<J.CompilationUnit> sourceFiles = main.stream().map(s -> {
203+
List<Marker> newMarkers = new ArrayList<>();
204+
List<Marker> inheritedMarkers = markerMap.get(s.getSourcePath());
205+
if(inheritedMarkers == null) {
206+
throw new IllegalStateException("Could not find marker for path '%s' in markerMap: '%s'".formatted(s.getSourcePath(), markerMap));
207+
}
208+
newMarkers.addAll(inheritedMarkers);
209+
newMarkers.add(javaSourceSet);
210+
return s.withMarkers(Markers.build(newMarkers));
211+
})
212+
.map(J.CompilationUnit.class::cast)
213+
.toList();
214+
// .stream()
215+
// .map()
216+
//// .map(sf -> sf.withMarkers(sf.getMarkers().removeByType(JavaSourceSet.class).addIfAbsent(javaSourceSet)))
217+
// .map(SourceFile.class::cast)
218+
// .toList();
219+
result.addAll(sourceFiles);
189220
}
190221

191222
List<JavaSource> testJavaSourceSet = module.getTestJavaSourceSet().list();
192-
if(!testJavaSourceSet.isEmpty()) {
223+
if (!testJavaSourceSet.isEmpty()) {
193224
List<Parser.Input> testSources = testJavaSourceSet.stream()
194225
.map(ja -> new Parser.Input(ja.getAbsolutePath(), () -> new ByteArrayInputStream(ja.print().getBytes())))
195226
.toList();
@@ -315,11 +346,11 @@ private Map<Scope, Set<Path>> flattenToCompileAndTestScope(Map<Scope, Set<Path>>
315346
Arrays.stream(Scope.values())
316347
.forEach(scope -> {
317348
Set<Path> paths = resolvedDependencies.get(scope);
318-
if(paths != null) {
319-
if(scope.isInClasspathOf(Scope.Compile)) {
349+
if (paths != null) {
350+
if (scope.isInClasspathOf(Scope.Compile)) {
320351
boiled.computeIfAbsent(Scope.Compile, k -> new HashSet<>()).addAll(paths);
321352
}
322-
if(scope.isInClasspathOf(Scope.Test)) {
353+
if (scope.isInClasspathOf(Scope.Test)) {
323354
boiled.computeIfAbsent(Scope.Test, k -> new HashSet<>()).addAll(paths);
324355
}
325356
}

components/sbm-core/src/main/java/org/springframework/sbm/java/impl/OpenRewriteMember.java

Lines changed: 85 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -18,8 +18,6 @@
1818
import lombok.Getter;
1919
import lombok.extern.slf4j.Slf4j;
2020
import org.openrewrite.ExecutionContext;
21-
import org.openrewrite.Parser;
22-
import org.openrewrite.SourceFile;
2321
import org.openrewrite.internal.lang.Nullable;
2422
import org.openrewrite.java.JavaIsoVisitor;
2523
import org.openrewrite.java.JavaParser;
@@ -28,29 +26,23 @@
2826
import org.openrewrite.java.marker.JavaSourceSet;
2927
import org.openrewrite.java.tree.J;
3028
import org.openrewrite.java.tree.J.VariableDeclarations.NamedVariable;
31-
import org.openrewrite.java.tree.JavaSourceFile;
3229
import org.openrewrite.java.tree.JavaType;
3330
import org.openrewrite.java.tree.TypeTree;
3431
import org.openrewrite.marker.Markers;
35-
import org.springframework.rewrite.parsers.RewriteExecutionContext;
32+
import org.springframework.rewrite.parsers.JavaParserBuilder;
3633
import org.springframework.rewrite.parsers.maven.ClasspathDependencies;
3734
import org.springframework.rewrite.project.resource.RewriteSourceFileHolder;
3835
import org.springframework.rewrite.support.openrewrite.GenericOpenRewriteRecipe;
3936
import org.springframework.sbm.java.api.Annotation;
40-
import org.springframework.sbm.java.api.JavaSource;
4137
import org.springframework.sbm.java.api.Member;
42-
import org.springframework.sbm.java.api.Type;
4338
import org.springframework.sbm.java.refactoring.JavaRefactoring;
44-
import org.springframework.rewrite.parsers.JavaParserBuilder;
45-
import org.springframework.sbm.support.openrewrite.java.AddAnnotationVisitor;
4639
import org.springframework.sbm.support.openrewrite.java.RemoveAnnotationVisitor;
4740

4841
import java.io.ByteArrayInputStream;
49-
import java.util.ArrayList;
50-
import java.util.Comparator;
51-
import java.util.List;
52-
import java.util.UUID;
42+
import java.nio.file.Path;
43+
import java.util.*;
5344
import java.util.stream.Collectors;
45+
import java.util.stream.Stream;
5446

5547
@Getter
5648
@Slf4j
@@ -67,6 +59,7 @@ public class OpenRewriteMember implements Member {
6759
private final JavaRefactoring refactoring;
6860
private final JavaParserBuilder javaParserBuilder;
6961

62+
7063
public OpenRewriteMember(
7164
J.VariableDeclarations variableDecls, NamedVariable namedVar,
7265
RewriteSourceFileHolder<J.CompilationUnit> rewriteSourceFileHolder, JavaRefactoring refactoring, JavaParserBuilder javaParser) {
@@ -151,8 +144,86 @@ public J.VariableDeclarations visitVariableDeclarations(J.VariableDeclarations m
151144

152145
@Override
153146
public void addAnnotation(String snippet, String annotationImport, String... otherImports) {
154-
AddAnnotationVisitor visitor = new AddAnnotationVisitor(() -> javaParserBuilder, getVariableDeclarations(), snippet, annotationImport, otherImports);
155-
refactoring.refactor(rewriteSourceFileHolder, visitor);
147+
GenericOpenRewriteRecipe<JavaIsoVisitor<ExecutionContext>> recipe = new GenericOpenRewriteRecipe<>(() -> new JavaIsoVisitor<>() {
148+
149+
// private JavaSourceSet main;
150+
// private List<Path> classpath;
151+
// private Set<String> imports;
152+
// private List<JavaType.FullyQualified> newCLasspathFqn;
153+
// private JavaTypeCache typeCache;
154+
// private boolean visitCu = false;
155+
156+
// @Override
157+
// public J.CompilationUnit visitCompilationUnit(J.CompilationUnit compilationUnit, ExecutionContext executionContext) {
158+
// J.CompilationUnit cu = super.visitCompilationUnit(compilationUnit, executionContext);
159+
// if(visitCu) {
160+
// // TODO: De ganze Zirkus hier nochmal
161+
// JavaSourceSet javaSourceSet = cu.getMarkers().findFirst(JavaSourceSet.class).get();
162+
// Field field = ReflectionUtils.findField(JavaSourceSet.class, "classpath");
163+
// ReflectionUtils.makeAccessible(field);
164+
// ReflectionUtils.setField(field, javaSourceSet, newCLasspathFqn);
165+
// imports.forEach(i -> maybeAddImport(i));
166+
// visitCu = false;
167+
// final J.CompilationUnit tmpCu = cu;
168+
// J.CompilationUnit cu1 = (J.CompilationUnit) JavaParser.fromJavaVersion().typeCache(typeCache).classpath(classpath).clone().build().parseInputs(List.of(new JavaParser.Input(cu.getSourcePath(), () -> new ByteArrayInputStream(tmpCu.printAll().getBytes()))), null, executionContext).toList().get(0);
169+
// cu = cu1.withMarkers(Markers.build(List.of(main)));
170+
// }
171+
// return cu;
172+
// }
173+
174+
@Override
175+
public J.VariableDeclarations visitVariableDeclarations(J.VariableDeclarations multiVariable, ExecutionContext executionContext) {
176+
J.VariableDeclarations vd = super.visitVariableDeclarations(multiVariable, executionContext);
177+
if (vd == getVariableDeclarations()) {
178+
J.CompilationUnit cu = getCursor().dropParentUntil(J.CompilationUnit.class::isInstance).getValue();
179+
List<Path> classpathJars = cu.getMarkers().findFirst(ClasspathDependencies.class).get().getDependencies();
180+
// JavaSourceSet javaSourceSet = cu.getMarkers().findFirst(JavaSourceSet.class).get();
181+
// JavaTypeCache typeCache = new JavaTypeCache();
182+
183+
Set<String> imports = Stream.concat(Stream.of(annotationImport), Stream.of(annotationImport)).collect(Collectors.toSet());
184+
JavaTypeCache typeCache = new JavaTypeCache();
185+
186+
187+
188+
JavaParser.Builder<? extends JavaParser, ?> javaParser = JavaParser.fromJavaVersion().typeCache(typeCache.clone()).classpath(classpathJars);
189+
190+
vd = JavaTemplate.builder(snippet)
191+
.imports(new ArrayList<>(imports).toArray(String[]::new))
192+
.javaParser(javaParser)
193+
.build()
194+
.apply(getCursor(), vd.getCoordinates().addAnnotation(Comparator.comparing(J.Annotation::getSimpleName)));
195+
imports.forEach(i -> maybeAddImport(i, false));
196+
197+
// final J.CompilationUnit tmpCu = cu;
198+
// J.CompilationUnit cu1 = (J.CompilationUnit) JavaParser.fromJavaVersion().typeCache(typeCache).classpath(classpath).build().parseInputs(List.of(new JavaParser.Input(cu.getSourcePath(), () -> new ByteArrayInputStream(tmpCu.printAll().getBytes()))), null, executionContext).toList().get(0);
199+
200+
/*
201+
visitCu = false;
202+
final J.CompilationUnit tmpCu = cu;
203+
J.CompilationUnit cu1 = (J.CompilationUnit) JavaParser.fromJavaVersion().typeCache(typeCache).classpath(classpath).build().parseInputs(List.of(new JavaParser.Input(cu.getSourcePath(), () -> new ByteArrayInputStream(tmpCu.printAll().getBytes()))), null, executionContext).toList().get(0);
204+
JavaSourceSet newJavaSourceSet = JavaSourceSet.build(javaSourceSet.getName(), cu.getMarkers().findFirst(ClasspathDependencies.class).get().getDependencies(), typeCache, true);
205+
cu = cu1.withMarkers(cu1.getMarkers().removeByType(JavaSourceSet.class).addIfAbsent(newJavaSourceSet));
206+
// cu = cu1.withMarkers(Markers.build(List.of(main)));
207+
208+
209+
// J.CompilationUnit cu = getRewriteSourceFileHolder().getSourceFile();
210+
// classpath = cu.getMarkers().findFirst(ClasspathDependencies.class).get().getDependencies();
211+
imports = Stream.concat(Stream.of(annotationImport), Stream.of(annotationImport)).collect(Collectors.toSet());
212+
// // FIXME: main is not always correct
213+
// typeCache = new JavaTypeCache();
214+
// main = JavaSourceSet.build("main", classpath, typeCache, true);
215+
216+
newCLasspathFqn = main.getClasspath();
217+
218+
visitCu = true;
219+
imports.forEach(i -> maybeAddImport(i, false));
220+
221+
*/
222+
}
223+
return vd;
224+
}
225+
});
226+
refactoring.refactor(rewriteSourceFileHolder, recipe);
156227
}
157228

158229
@Override

components/sbm-core/src/main/java/org/springframework/sbm/java/refactoring/JavaGlobalRefactoringImpl.java

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,9 @@
2828
import org.springframework.rewrite.project.resource.ProjectResourceSet;
2929
import org.springframework.rewrite.project.resource.RewriteSourceFileHolder;
3030
import org.springframework.rewrite.support.openrewrite.GenericOpenRewriteRecipe;
31+
import org.springframework.rewrite.utils.LinuxWindowsPathUnifier;
3132

33+
import java.nio.file.Path;
3234
import java.util.Arrays;
3335
import java.util.List;
3436
import java.util.UUID;
@@ -139,11 +141,19 @@ void processResults(List<Result> changes) {
139141
}
140142

141143
private void processResult(Result result) {
142-
UUID id = result.getBefore().getId();
143-
144-
RewriteSourceFileHolder<J.CompilationUnit> match = findRewriteSourceFileHolderHoldingCompilationUnitWithId(id);
144+
if(result.getAfter() != null) {
145+
RewriteSourceFileHolder<J.CompilationUnit> match = findRewriteSourceFileHolderHoldingCompilationUnitWithPath(result.getAfter().getSourcePath());
146+
match.replaceWith((J.CompilationUnit) result.getAfter());
147+
}
148+
}
145149

146-
match.replaceWith((J.CompilationUnit) result.getAfter());
150+
private RewriteSourceFileHolder<J.CompilationUnit> findRewriteSourceFileHolderHoldingCompilationUnitWithPath(Path sourcePath) {
151+
return projectResourceSet.stream()
152+
.filter(pr -> LinuxWindowsPathUnifier.pathEquals(pr.getSourcePath(), sourcePath))
153+
.filter(pr -> J.CompilationUnit.class.isAssignableFrom(pr.getSourceFile().getClass()))
154+
.map(pr -> (RewriteSourceFileHolder<J.CompilationUnit>) pr)
155+
.findAny()
156+
.orElseThrow(() -> new RuntimeException("Not matching modification found"));
147157
}
148158

149159
private RewriteSourceFileHolder<J.CompilationUnit> findRewriteSourceFileHolderHoldingCompilationUnitWithId(UUID id) {

components/sbm-core/src/test/java/org/springframework/sbm/build/api/Module_contains_Test.java

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,6 @@ public class SomeClassTest {}
6464
}
6565

6666
@Test
67-
@ExpectedToFail("https://github.com/spring-projects/spring-rewrite-commons/issues/37")
6867
void multiModuleProject() {
6968
String rootPom = PomBuilder
7069
.buildPom("com.example:parent:1.0")
@@ -81,7 +80,6 @@ void multiModuleProject() {
8180

8281
String moduleInModule1Pom = PomBuilder.buildPom("com.example:parent:1.0", "../..", "module-in-module1").build();
8382

84-
8583
String javaClass = """
8684
package com.example;
8785
public class SomeClass {}

components/sbm-core/src/test/java/org/springframework/sbm/engine/precondition/JavaSourceDirExistsPreconditionCheckTest.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@ void shouldReturnSuccessMessageWhenJavaSourceDirExists() throws IOException {
4747
JavaSourceDirExistsPreconditionCheck sut = new JavaSourceDirExistsPreconditionCheck();
4848
Resource r1 = mock(Resource.class);
4949
File f1 = mock(File.class);
50-
when(f1.toPath()).thenReturn(Path.of("src/main/java/some/Class.java"));
50+
when(f1.toPath()).thenReturn(Path.of("/absolute/path/src/main/java/some/Class.java"));
5151
when(r1.getFile()).thenReturn(f1);
5252
List<Resource> resources = List.of(r1);
5353
PreconditionCheckResult checkResult = sut.verify(Path.of("."), resources);

0 commit comments

Comments
 (0)