Skip to content

Commit d4dc28c

Browse files
committed
Fix tests and adjust to changes in OR 8.1.2
1 parent 210a059 commit d4dc28c

File tree

8 files changed

+62
-38
lines changed

8 files changed

+62
-38
lines changed

components/sbm-core/src/main/java/org/springframework/sbm/engine/context/ProjectContextHolder.java

+2
Original file line numberDiff line numberDiff line change
@@ -17,11 +17,13 @@
1717

1818
import lombok.Getter;
1919
import lombok.Setter;
20+
import org.springframework.sbm.scopes.annotations.ScanScope;
2021
import org.springframework.stereotype.Component;
2122

2223
@Component
2324
@Getter
2425
@Setter
26+
@ScanScope
2527
public class ProjectContextHolder {
2628
private ProjectContext projectContext;
2729
}

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

+5-3
Original file line numberDiff line numberDiff line change
@@ -21,9 +21,9 @@
2121
import org.springframework.sbm.engine.context.ProjectContextHolder;
2222
import lombok.RequiredArgsConstructor;
2323
import org.openrewrite.Parser;
24-
import org.openrewrite.java.JavaParser;
2524
import org.openrewrite.java.tree.J;
2625
import org.springframework.context.event.EventListener;
26+
import org.springframework.sbm.parsers.JavaParserBuilder;
2727
import org.springframework.stereotype.Component;
2828

2929
import java.io.ByteArrayInputStream;
@@ -39,7 +39,7 @@
3939
@RequiredArgsConstructor
4040
public class DependenciesChangedEventHandler {
4141
private final ProjectContextHolder projectContextHolder;
42-
private final JavaParser javaParser;
42+
private final JavaParserBuilder javaParserBuilder;
4343
private final ExecutionContext executionContext;
4444

4545
@EventListener
@@ -53,7 +53,7 @@ public void onDependenciesChanged(DependenciesChangedEvent event) {
5353

5454
Path projectRootDirectory = projectContextHolder.getProjectContext().getProjectRootDirectory();
5555

56-
Stream<SourceFile> parsedCompilationUnits = javaParser.parseInputs(compilationUnits, null, executionContext);
56+
Stream<SourceFile> parsedCompilationUnits = javaParserBuilder.build().parseInputs(compilationUnits, null, executionContext);
5757
// ((J.VariableDeclarations)parsedCompilationUnits.get(0).getClasses().get(0).getBody().getStatements().get(0)).getLeadingAnnotations().get(0).getType()
5858
parsedCompilationUnits
5959
.filter(J.CompilationUnit.class::isInstance)
@@ -63,6 +63,8 @@ public void onDependenciesChanged(DependenciesChangedEvent event) {
6363
.filter(js -> js.getResource().getAbsolutePath().equals(projectRootDirectory.resolve(cu.getSourcePath()).normalize()))
6464
.forEach(js -> js.getResource().replaceWith(cu));
6565
});
66+
} else {
67+
throw new IllegalStateException("Could not get ProjectContext from ProjectContextHolder.");
6668
}
6769
}
6870
}

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

+13-2
Original file line numberDiff line numberDiff line change
@@ -16,15 +16,13 @@
1616
package org.springframework.sbm.java.impl;
1717

1818
import org.openrewrite.*;
19-
import org.openrewrite.internal.InMemoryLargeSourceSet;
2019
import org.openrewrite.java.*;
2120
import org.openrewrite.java.format.WrappingAndBraces;
2221
import org.openrewrite.java.tree.*;
2322
import org.springframework.sbm.java.api.*;
2423
import org.springframework.sbm.java.migration.visitor.RemoveImplementsVisitor;
2524
import org.springframework.sbm.java.refactoring.JavaRefactoring;
2625
import org.springframework.sbm.parsers.JavaParserBuilder;
27-
import org.springframework.sbm.project.resource.SbmApplicationProperties;
2826
import org.springframework.sbm.project.resource.RewriteSourceFileHolder;
2927
import lombok.extern.slf4j.Slf4j;
3028
import org.openrewrite.java.search.DeclaresMethod;
@@ -156,6 +154,9 @@ public void addMethod(String methodTemplate, Set<String> requiredImports) {
156154
@Override
157155
public ClassDeclaration visitClassDeclaration(ClassDeclaration classDecl, ExecutionContext executionContext) {
158156
ClassDeclaration cd = super.visitClassDeclaration(classDecl, executionContext);
157+
J.CompilationUnit cu = getCursor().dropParentUntil(J.CompilationUnit.class::isInstance).getValue();
158+
checkTypeAvailability(cu, requiredImports);
159+
159160
JavaTemplate template = JavaTemplate
160161
.builder(methodTemplate)
161162
.javaParser(javaParserBuilder)
@@ -169,6 +170,16 @@ public ClassDeclaration visitClassDeclaration(ClassDeclaration classDecl, Execut
169170
this.apply(new WrappingAndBraces());
170171
}
171172

173+
private void checkTypeAvailability(J.CompilationUnit cd, Set<String> requiredImports) {
174+
List<String> missingTypes = cd.getTypesInUse().getTypesInUse().stream()
175+
.map(JavaType::toString)
176+
.filter(t -> !requiredImports.contains(t))
177+
.toList();
178+
if(!missingTypes.isEmpty()) {
179+
throw new IllegalArgumentException("These types %s are not available to in compilation unit %s".formatted(missingTypes, cd.getSourcePath()));
180+
}
181+
}
182+
172183

173184
private List<J.Annotation> findORAnnotations(String annotation) {
174185
return getClassDeclaration().getLeadingAnnotations()

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

+1
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@
3636

3737
@Component
3838
@ScanScope
39+
@Deprecated
3940
public class RewriteJavaParser implements JavaParser {
4041

4142
private final SbmApplicationProperties sbmApplicationProperties;

components/sbm-core/src/main/java/org/springframework/sbm/project/parser/ProjectContextInitializer.java

+3-1
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
import org.springframework.core.io.Resource;
2222
import org.springframework.sbm.engine.context.ProjectContext;
2323
import org.springframework.sbm.engine.context.ProjectContextFactory;
24+
import org.springframework.sbm.engine.context.ProjectContextHolder;
2425
import org.springframework.sbm.engine.git.Commit;
2526
import org.springframework.sbm.engine.git.GitSupport;
2627
import org.springframework.sbm.project.RewriteSourceFileWrapper;
@@ -41,6 +42,7 @@ public class ProjectContextInitializer {
4142
private final GitSupport gitSupport;
4243
private final RewriteSourceFileWrapper rewriteSourceFileWrapper;
4344
private final ExecutionContext executionContext;
45+
private final ProjectContextHolder projectContextHolder;
4446

4547
public ProjectContext initProjectContext(Path projectDir, List<Resource> resources) {
4648
final Path absoluteProjectDir = projectDir.toAbsolutePath().normalize();
@@ -54,7 +56,7 @@ public ProjectContext initProjectContext(Path projectDir, List<Resource> resourc
5456
ProjectContext projectContext = projectContextFactory.createProjectContext(projectDir, projectResourceSet);
5557

5658
storeGitCommitHash(projectDir, projectContext);
57-
59+
projectContextHolder.setProjectContext(projectContext);
5860
return projectContext;
5961
}
6062

components/sbm-core/src/test/java/org/springframework/sbm/java/impl/OpenRewriteTypeTest.java

+33-31
Original file line numberDiff line numberDiff line change
@@ -309,12 +309,14 @@ void testAddMethod() {
309309
@Test
310310
void testAddMethod2() {
311311
String template =
312-
"@Bean\n" +
313-
"IntegrationFlow http_routeFlow() {\n" +
314-
"return IntegrationFlows.from(Http.inboundChannelAdapter(\"/test\")).handle((p, h) -> p)\n" +
315-
".log(LoggingHandler.Level.INFO)\n" +
316-
".get();\n" +
317-
"}\n";
312+
"""
313+
@Bean
314+
IntegrationFlow http_routeFlow() {
315+
return IntegrationFlows.from(Http.inboundChannelAdapter("/test")).handle((p, h) -> p)
316+
.log(LoggingHandler.Level.INFO)
317+
.get();
318+
}
319+
""";
318320

319321
Set<String> requiredImports = Set.of("org.springframework.integration.transformer.ObjectToStringTransformer",
320322
"org.springframework.context.annotation.Configuration",
@@ -326,40 +328,40 @@ void testAddMethod2() {
326328
"org.springframework.integration.http.dsl.Http");
327329

328330
ProjectContext context = TestProjectContext.buildProjectContext()
329-
.withBuildFileHavingDependencies("org.springframework.boot:spring-boot-starter-integration:2.5.5",
330-
"org.springframework.boot:spring-boot-starter-web:2.5.5")
331-
.withJavaSource("src/main/java/Config.java", "public class Config {}")
331+
.withBuildFileHavingDependencies(
332+
"org.springframework.boot:spring-boot-starter-integration:2.5.5",
333+
"org.springframework.boot:spring-boot-starter-web:2.5.5"
334+
)
335+
.withJavaSource("src/main/java", "public class Config {}")
332336
.build();
333337

334-
long before = System.currentTimeMillis();
335-
336-
context.getBuildFile().addDependency(Dependency.builder()
338+
context.getApplicationModules().getRootModule().getBuildFile().addDependency(Dependency.builder()
337339
.groupId("org.springframework.integration")
338340
.artifactId("spring-integration-http")
339341
.version("5.4.4")
340342
.build());
341343

342-
long timeSpent = System.currentTimeMillis() - before;
343-
System.out.println("Adding a dependency took: " + (timeSpent/1000) + " sec.");
344-
345-
Type type = context.getProjectJavaSources().list().get(0).getTypes().get(0);
344+
JavaSource javaSource = context.getProjectJavaSources().findJavaSourceDeclaringType("Config").get();
345+
Type type = javaSource.getTypes().get(0);
346346
type.addMethod(template, requiredImports);
347347

348-
assertThat(context.getProjectJavaSources().list().get(0).print()).isEqualTo(
349-
"import org.springframework.context.annotation.Bean;\n" +
350-
"import org.springframework.integration.dsl.IntegrationFlow;\n" +
351-
"import org.springframework.integration.dsl.IntegrationFlows;\n" +
352-
"import org.springframework.integration.handler.LoggingHandler;\n" +
353-
"import org.springframework.integration.http.dsl.Http;\n" +
354-
"\n" +
355-
"public class Config {\n" +
356-
" @Bean\n" +
357-
" IntegrationFlow http_routeFlow() {\n" +
358-
" return IntegrationFlows.from(Http.inboundChannelAdapter(\"/test\")).handle((p, h) -> p)\n" +
359-
" .log(LoggingHandler.Level.INFO)\n" +
360-
" .get();\n" +
361-
" }\n" +
362-
"}"
348+
assertThat(javaSource.print()).isEqualTo(
349+
"""
350+
import org.springframework.context.annotation.Bean;
351+
import org.springframework.integration.dsl.IntegrationFlow;
352+
import org.springframework.integration.dsl.IntegrationFlows;
353+
import org.springframework.integration.handler.LoggingHandler;
354+
import org.springframework.integration.http.dsl.Http;
355+
356+
public class Config {
357+
@Bean
358+
IntegrationFlow http_routeFlow() {
359+
return IntegrationFlows.from(Http.inboundChannelAdapter("/test")).handle((p, h) -> p)
360+
.log(LoggingHandler.Level.INFO)
361+
.get();
362+
}
363+
}
364+
"""
363365
);
364366
}
365367

components/sbm-core/src/test/java/org/springframework/sbm/project/buildfile/OpenRewriteMavenBuildFileTest.java

+2-1
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@
3535
import org.springframework.sbm.java.impl.DependenciesChangedEventHandler;
3636
import org.springframework.sbm.java.impl.RewriteJavaParser;
3737
import org.springframework.sbm.openrewrite.RewriteExecutionContext;
38+
import org.springframework.sbm.parsers.JavaParserBuilder;
3839
import org.springframework.sbm.project.resource.SbmApplicationProperties;
3940
import org.springframework.sbm.project.resource.TestProjectContext;
4041

@@ -563,7 +564,7 @@ public class Cat {
563564
assertThat(fireEvent.getResolvedDependencies().get(0).toString()).endsWith("javax/validation/validation-api/2.0.1.Final/validation-api-2.0.1.Final.jar");
564565

565566
// call DependenciesChangedEventHandler to trigger recompile
566-
RewriteJavaParser rewriteJavaParser = new RewriteJavaParser(new SbmApplicationProperties(), executionContext);
567+
JavaParserBuilder rewriteJavaParser = new JavaParserBuilder();
567568
ProjectContextHolder projectContextHolder = new ProjectContextHolder();
568569
projectContextHolder.setProjectContext(context);
569570
DependenciesChangedEventHandler handler = new DependenciesChangedEventHandler(projectContextHolder, rewriteJavaParser, executionContext);

components/sbm-core/src/test/java/org/springframework/sbm/project/resource/TestProjectContext.java

+3
Original file line numberDiff line numberDiff line change
@@ -384,6 +384,9 @@ public Builder withJavaSource(Path sourcePathDir, String sourceCode) {
384384
if (sourcePathDir.isAbsolute()) {
385385
throw new IllegalArgumentException("Source path must be relative to project root dir.");
386386
}
387+
if(sourcePathDir.toString().endsWith(".java")) {
388+
throw new IllegalArgumentException("The provided path '%s' should only be the source path, e.g. 'src/main/'java'. Package and filename will be calculated from provided source code.".formatted(sourcePathDir));
389+
}
387390
String fqName = JavaSourceUtil.retrieveFullyQualifiedClassFileName(sourceCode);
388391
Path sourcePath = sourcePathDir.resolve(fqName);
389392
this.resourcesWithRelativePaths.put(sourcePath, sourceCode);

0 commit comments

Comments
 (0)