diff --git a/components/sbm-core/src/main/java/org/springframework/sbm/engine/recipe/ConditionDeserializer.java b/components/sbm-core/src/main/java/org/springframework/sbm/engine/recipe/ConditionDeserializer.java index b2d3f35f9..de9b7a46e 100644 --- a/components/sbm-core/src/main/java/org/springframework/sbm/engine/recipe/ConditionDeserializer.java +++ b/components/sbm-core/src/main/java/org/springframework/sbm/engine/recipe/ConditionDeserializer.java @@ -22,7 +22,6 @@ import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.deser.std.StdDeserializer; import org.springframework.beans.factory.config.AutowireCapableBeanFactory; -import org.springframework.util.ClassUtils; import java.io.IOException; diff --git a/components/sbm-openrewrite/src/main/java/org/openrewrite/maven/AddMavenRepository.java b/components/sbm-openrewrite/src/main/java/org/openrewrite/maven/AddMavenRepository.java index b19bde3cd..e762f17d5 100644 --- a/components/sbm-openrewrite/src/main/java/org/openrewrite/maven/AddMavenRepository.java +++ b/components/sbm-openrewrite/src/main/java/org/openrewrite/maven/AddMavenRepository.java @@ -27,7 +27,7 @@ public class AddMavenRepository extends Recipe { - private RepositoryDefinition mavenRepository; + private final RepositoryDefinition mavenRepository; public AddMavenRepository(RepositoryDefinition repository) { this.mavenRepository = repository; diff --git a/components/sbm-openrewrite/src/main/java/org/springframework/sbm/support/openrewrite/java/RemoveAnnotationVisitor.java b/components/sbm-openrewrite/src/main/java/org/springframework/sbm/support/openrewrite/java/RemoveAnnotationVisitor.java index e11dff451..9433547e3 100644 --- a/components/sbm-openrewrite/src/main/java/org/springframework/sbm/support/openrewrite/java/RemoveAnnotationVisitor.java +++ b/components/sbm-openrewrite/src/main/java/org/springframework/sbm/support/openrewrite/java/RemoveAnnotationVisitor.java @@ -17,11 +17,14 @@ import org.openrewrite.ExecutionContext; import org.openrewrite.java.JavaIsoVisitor; +import org.openrewrite.java.tree.Expression; import org.openrewrite.java.tree.J; +import org.openrewrite.java.tree.JavaType; import org.openrewrite.java.tree.JavaType.FullyQualified; import org.openrewrite.java.tree.TypeUtils; import java.util.List; +import java.util.Objects; import java.util.stream.Collectors; public class RemoveAnnotationVisitor extends JavaIsoVisitor<ExecutionContext> { @@ -35,6 +38,7 @@ public RemoveAnnotationVisitor(J target, String fqAnnotationName) { this.target = target; } + @Override public J.ClassDeclaration visitClassDeclaration(J.ClassDeclaration cd, ExecutionContext executionContext) { J.ClassDeclaration classDecl = super.visitClassDeclaration(cd, executionContext); if (target == classDecl) { @@ -46,14 +50,15 @@ public J.ClassDeclaration visitClassDeclaration(J.ClassDeclaration cd, Execution }) .collect(Collectors.toList()); if (classDecl.getLeadingAnnotations().size() != keptAnnotations.size()) { - // TODO: Analyze annotation for more types referenced by annotation and maybeRemoveImports, then remove the call to removeUnusedImports in MigrateJeeTransactionsToSpringBootAction maybeRemoveImport(fqAnnotationName); + maybeRemoveAnnotationParameterImports(classDecl.getLeadingAnnotations()); classDecl = classDecl.withLeadingAnnotations(keptAnnotations); } } return classDecl; } + @Override public J.MethodDeclaration visitMethodDeclaration(J.MethodDeclaration md, ExecutionContext executionContext) { J.MethodDeclaration methodDecl = super.visitMethodDeclaration(md, executionContext); if (target.getId().equals(methodDecl.getId())) { @@ -66,6 +71,7 @@ public J.MethodDeclaration visitMethodDeclaration(J.MethodDeclaration md, Execut .collect(Collectors.toList()); if (methodDecl.getLeadingAnnotations().size() != annotations.size()) { maybeRemoveImport(fqAnnotationName); + maybeRemoveAnnotationParameterImports(methodDecl.getLeadingAnnotations()); methodDecl = methodDecl.withLeadingAnnotations(annotations); } } @@ -84,10 +90,21 @@ public J.VariableDeclarations visitVariableDeclarations(J.VariableDeclarations m .collect(Collectors.toList()); if (multiVariable.getLeadingAnnotations().size() != annotations.size()) { maybeRemoveImport(fqAnnotationName); + maybeRemoveAnnotationParameterImports(multiVariable.getLeadingAnnotations()); multiVariable = multiVariable.withLeadingAnnotations(annotations); } } return multiVariable; } + private void maybeRemoveAnnotationParameterImports(List<J.Annotation> leadingAnnotations) { + leadingAnnotations + .stream() + .filter(a -> a.getArguments() != null && !a.getArguments().isEmpty()) + .flatMap(a -> a.getArguments().stream()) + .map(Expression::getType) + .map(TypeUtils::asFullyQualified) + .filter(Objects::nonNull) + .forEach(e -> maybeRemoveImport(TypeUtils.asFullyQualified(e))); + } } diff --git a/components/sbm-openrewrite/src/test/java/org/springframework/sbm/java/OpenRewriteTestSupport.java b/components/sbm-openrewrite/src/test/java/org/springframework/sbm/java/OpenRewriteTestSupport.java index ff9bc94ca..1044037b4 100644 --- a/components/sbm-openrewrite/src/test/java/org/springframework/sbm/java/OpenRewriteTestSupport.java +++ b/components/sbm-openrewrite/src/test/java/org/springframework/sbm/java/OpenRewriteTestSupport.java @@ -15,11 +15,11 @@ */ package org.springframework.sbm.java; +import org.intellij.lang.annotations.Language; import org.jboss.shrinkwrap.resolver.api.maven.Maven; import org.openrewrite.*; import org.springframework.sbm.java.util.JavaSourceUtil; import org.springframework.sbm.testhelper.common.utils.TestDiff; -import org.assertj.core.api.Assertions; import org.openrewrite.java.JavaIsoVisitor; import org.openrewrite.java.JavaParser; import org.openrewrite.java.JavaVisitor; @@ -33,6 +33,9 @@ import java.util.function.Supplier; import java.util.stream.Collectors; +import static org.assertj.core.api.Assertions.assertThat; +import static org.junit.jupiter.api.Assertions.assertNotNull; + public class OpenRewriteTestSupport { @@ -42,10 +45,10 @@ public class OpenRewriteTestSupport { * The first class name and package is used to retrieve the file path of the <code>J.CompilationUnit</code>. * * @param classpath entries in <code>artifact:gruopId:version</code> format. - * @param sourceCodes + * @param sourceCodes source code * @return list of <code>J.CompilationUnit</code>s */ - public static List<J.CompilationUnit> createCompilationUnitsFromStrings(List<String> classpath, String... sourceCodes) { + public static List<J.CompilationUnit> createCompilationUnitsFromStrings(List<String> classpath, @Language("java") String... sourceCodes) { JavaParser javaParser = OpenRewriteTestSupport.getJavaParser(classpath.toArray(new String[]{})); List<J.CompilationUnit> compilationUnits = javaParser.parse(sourceCodes); return compilationUnits.stream() @@ -61,10 +64,10 @@ public static List<J.CompilationUnit> createCompilationUnitsFromStrings(List<Str * <p> * The first class name and package is used to retrieve the file path of the <code>J.CompilationUnit</code>. * - * @param sourceCodes + * @param sourceCodes source code * @return list of <code>J.CompilationUnit</code>s */ - public static List<J.CompilationUnit> createCompilationUnitsFromStrings(String... sourceCodes) { + public static List<J.CompilationUnit> createCompilationUnitsFromStrings(@Language("java") String... sourceCodes) { return createCompilationUnitsFromStrings(List.of(), sourceCodes); } @@ -73,19 +76,19 @@ public static List<J.CompilationUnit> createCompilationUnitsFromStrings(String.. * <p> * The first class name and package is used to retrieve the file path of the <code>J.CompilationUnit</code>. * - * @param sourceCode + * @param sourceCode source code * @return the created <code>J.CompilationUnit</code> */ - public static J.CompilationUnit createCompilationUnitFromString(String sourceCode) { + public static J.CompilationUnit createCompilationUnitFromString(@Language("java") String sourceCode) { return createCompilationUnitsFromStrings(List.of(), sourceCode).get(0); } - public static J.CompilationUnit createCompilationUnit(JavaParser parser, Path sourceFolder, String sourceCode) { + public static J.CompilationUnit createCompilationUnit(JavaParser parser, Path sourceFolder, @Language("java") String sourceCode) { J.CompilationUnit cu = parser.parse(sourceCode).get(0); return cu.withSourcePath(cu.getPackageDeclaration() == null ? sourceFolder.resolve(cu.getSourcePath()) : sourceFolder - .resolve(cu.getPackageDeclaration().getExpression().printTrimmed().replace('.', File.separatorChar)) + .resolve(cu.getPackageDeclaration().getPackageName().replace('.', File.separatorChar)) .resolve(cu.getSourcePath())); } @@ -98,12 +101,10 @@ public static J.CompilationUnit createCompilationUnit(JavaParser parser, Path so * @param classpath required for resolving dependencies to create a CompilationUnit from given */ public static <P> void verifyChange(Supplier<JavaIsoVisitor<ExecutionContext>> visitor, String given, String - expected, String... classpath) { verifyChange(visitor.get(), given, expected, classpath); } - /** * Verifies that applying the visitor to given results in expected. * @@ -112,7 +113,7 @@ public static <P> void verifyChange(Supplier<JavaIsoVisitor<ExecutionContext>> v * @param expected source code after applying the visitor * @param classpath required for resolving dependencies to create a CompilationUnit from given */ - public static <P> void verifyChange(JavaIsoVisitor<ExecutionContext> visitor, String given, String expected, String... classpath) { + public static <P> void verifyChange(JavaIsoVisitor<ExecutionContext> visitor, @Language("java") String given, String expected, String... classpath) { J.CompilationUnit compilationUnit = createCompilationUnit(given, classpath); verifyChange(visitor, compilationUnit, expected); } @@ -120,7 +121,7 @@ public static <P> void verifyChange(JavaIsoVisitor<ExecutionContext> visitor, St /** * Verifies that applying the visitor to given results in expected. * <p> - * Additionally it's verified that the returned change contains exactly given as before and expected as after + * Additionally, it's verified that the returned change contains exactly given as before and expected as after * <p> * Use this method if you had to create a CompilationUnit, e.g. to define a scope for the tested visitor. * If the visitor is not scoped it is probably easier (and less caller code) @@ -133,22 +134,26 @@ public static <P> void verifyChange(JavaIsoVisitor<ExecutionContext> visitor, St * @param given CompilationUnit the visitor will be applied on * @param expected source code after applying the visitor */ - public static <P> void verifyChange(JavaIsoVisitor<ExecutionContext> visitor, J.CompilationUnit given, String expected) { + public static void verifyChange(JavaIsoVisitor<ExecutionContext> visitor, J.CompilationUnit given, String expected) { final Collection<Result> newChanges = refactor(given, visitor).getResults(); - Assertions.assertThat(newChanges.iterator().hasNext()).as("No change was found.").isTrue(); - Assertions.assertThat(given.printAll()) - .as(TestDiff.of(given.printAll(), newChanges.iterator().next().getBefore().printAll())) - .isEqualTo(newChanges.iterator().next().getBefore().printAll()); + assertThat(newChanges.iterator().hasNext()).as("No change was found.").isTrue(); + SourceFile before = newChanges.iterator().next().getBefore(); + assertNotNull(before); + assertThat(given.printAll()) + .as(TestDiff.of(given.printAll(), before.printAll())) + .isEqualTo(before.printAll()); - Assertions.assertThat(newChanges.iterator().next().getAfter().printAll()) - .as(TestDiff.of(newChanges.iterator().next().getAfter().printAll(), expected)) + SourceFile after = newChanges.iterator().next().getAfter(); + assertNotNull(after); + assertThat(after.printAll()) + .as(TestDiff.of(after.printAll(), expected)) .isEqualTo(expected); } /** * Verifies that applying the visitor to given results in expected. * <p> - * It's does not check that given equals before in the change. + * It does not check that given equals before in the change. * Use this method if you had to create a CompilationUnit, e.g. to define a scope for the tested visitor. * If the visitor is not scoped it is probably easier (and less caller code) * to use @@ -160,13 +165,15 @@ public static <P> void verifyChange(JavaIsoVisitor<ExecutionContext> visitor, J. * @param given CompilationUnit the visitor will be applied on * @param expected source code after applying the visitor */ - public static <P> void verifyChangeIgnoringGiven(JavaIsoVisitor<ExecutionContext> visitor, String given, String expected, String... classpath) { + public static void verifyChangeIgnoringGiven(JavaIsoVisitor<ExecutionContext> visitor, @Language("java") String given, String expected, String... classpath) { J.CompilationUnit compilationUnit = createCompilationUnit(given, classpath); final Collection<Result> newChanges = refactor(compilationUnit, visitor).getResults(); - Assertions.assertThat(newChanges.iterator().hasNext()).as("No change was found.").isTrue(); - Assertions.assertThat(expected) - .as(TestDiff.of(expected, newChanges.iterator().next().getAfter().printAll())) - .isEqualTo(newChanges.iterator().next().getAfter().printAll()); + assertThat(newChanges.iterator().hasNext()).as("No change was found.").isTrue(); + SourceFile after = newChanges.iterator().next().getAfter(); + assertNotNull(after); + assertThat(expected) + .as(TestDiff.of(expected, after.printAll())) + .isEqualTo(after.printAll()); } /** @@ -176,10 +183,10 @@ public static <P> void verifyChangeIgnoringGiven(JavaIsoVisitor<ExecutionContext * @param given the source code to apply the visitor on * @param classpath required to compile the given sourceCode in 'groupId:artifactId:version' format */ - public static <P> void verifyNoChange(Supplier<JavaIsoVisitor<ExecutionContext>> visitor, String given, String... classpath) { + public static void verifyNoChange(Supplier<JavaIsoVisitor<ExecutionContext>> visitor, @Language("java") String given, String... classpath) { J.CompilationUnit compilationUnit = createCompilationUnit(given, classpath); final Collection<Result> newChanges = refactor(compilationUnit, visitor.get()).getResults(); - Assertions.assertThat(newChanges).isEmpty(); + assertThat(newChanges).isEmpty(); } /** @@ -189,10 +196,10 @@ public static <P> void verifyNoChange(Supplier<JavaIsoVisitor<ExecutionContext>> * @param given the source code to apply the visitor on * @param classpath required to compile the given sourceCode in 'groupId:artifactId:version' format */ - public static <P> void verifyNoChange(JavaIsoVisitor<ExecutionContext> visitor, String given, String... classpath) { + public static void verifyNoChange(JavaIsoVisitor<ExecutionContext> visitor, @Language("java") String given, String... classpath) { J.CompilationUnit compilationUnit = createCompilationUnit(given, classpath); final Collection<Result> newChanges = refactor(compilationUnit, visitor).getResults(); - Assertions.assertThat(newChanges).isEmpty(); + assertThat(newChanges).isEmpty(); } /** @@ -201,13 +208,14 @@ public static <P> void verifyNoChange(JavaIsoVisitor<ExecutionContext> visitor, * @param given sourceCode * @param classpath provided in 'groupId:artifactId:version' format */ - public static J.CompilationUnit createCompilationUnit(String given, String... classpath) { + public static J.CompilationUnit createCompilationUnit(@Language("java") String given, String... classpath) { JavaParser javaParser = getJavaParser(classpath); - List<J.CompilationUnit> compilationUnits = javaParser - .parse(given); - if (compilationUnits.size() > 1) + List<J.CompilationUnit> compilationUnits = javaParser.parse(given); + if (compilationUnits.size() > 1) { throw new RuntimeException("More than one compilation was found in given String"); + } + return compilationUnits.get(0); } diff --git a/components/sbm-openrewrite/src/test/java/org/springframework/sbm/support/openrewrite/api/RemoveImportTest.java b/components/sbm-openrewrite/src/test/java/org/springframework/sbm/support/openrewrite/api/RemoveImportTest.java index d7e8c8dee..16f8d5f14 100644 --- a/components/sbm-openrewrite/src/test/java/org/springframework/sbm/support/openrewrite/api/RemoveImportTest.java +++ b/components/sbm-openrewrite/src/test/java/org/springframework/sbm/support/openrewrite/api/RemoveImportTest.java @@ -15,6 +15,7 @@ */ package org.springframework.sbm.support.openrewrite.api; +import org.intellij.lang.annotations.Language; import org.openrewrite.RecipeRun; import org.springframework.sbm.java.OpenRewriteTestSupport; import org.springframework.sbm.support.openrewrite.GenericOpenRewriteRecipe; @@ -31,41 +32,42 @@ public class RemoveImportTest { @Test // Shows that the import to TransactionAttributeType is not removed when @TransactionAttribute is removed void failing() { - String source = - "import org.springframework.transaction.annotation.Propagation;\n" + - "import org.springframework.transaction.annotation.Transactional;\n" + - "\n" + - "import javax.ejb.TransactionAttributeType;\n" + - "import javax.ejb.TransactionAttribute;\n" + - "\n" + - "@TransactionAttribute(TransactionAttributeType.NEVER)\n" + - "public class TransactionalService {\n" + - " public void requiresNewFromType() {}\n" + - "\n" + - "\n" + - " @Transactional(propagation = Propagation.NOT_SUPPORTED)\n" + - " public void notSupported() {}\n" + - "}"; + @Language("java") + String source = """ + import org.springframework.transaction.annotation.Propagation; + import org.springframework.transaction.annotation.Transactional; + + import javax.ejb.TransactionAttributeType; + import javax.ejb.TransactionAttribute; + + @TransactionAttribute(TransactionAttributeType.NEVER) + public class TransactionalService { + public void requiresNewFromType() {} + + + @Transactional(propagation = Propagation.NOT_SUPPORTED) + public void notSupported() {} + }"""; final J.CompilationUnit compilationUnit = OpenRewriteTestSupport.createCompilationUnit(source, "javax.ejb:javax.ejb-api:3.2", "org.springframework.boot:spring-boot-starter-data-jpa:2.4.2"); RecipeRun results = new GenericOpenRewriteRecipe<>(() -> new RemoveAnnotationVisitor(compilationUnit.getClasses().get(0), "javax.ejb.TransactionAttribute")).run(List.of(compilationUnit)); J.CompilationUnit compilationUnit1 = (J.CompilationUnit) results.getResults().get(0).getAfter(); - assertThat(compilationUnit1.printAll()).isEqualTo( - "import org.springframework.transaction.annotation.Propagation;\n" + - "import org.springframework.transaction.annotation.Transactional;\n" + - "\n" + - "import javax.ejb.TransactionAttributeType;\n" + - "\n" + - "\n" + - "public class TransactionalService {\n" + - " public void requiresNewFromType() {}\n" + - "\n" + - "\n" + - " @Transactional(propagation = Propagation.NOT_SUPPORTED)\n" + - " public void notSupported() {}\n" + - "}" - ); + @Language("java") + String expected = """ + import org.springframework.transaction.annotation.Propagation; + import org.springframework.transaction.annotation.Transactional; + + + public class TransactionalService { + public void requiresNewFromType() {} + + + @Transactional(propagation = Propagation.NOT_SUPPORTED) + public void notSupported() {} + }"""; + + assertThat(compilationUnit1.printAll()).isEqualToNormalizingNewlines(expected); } } diff --git a/components/sbm-openrewrite/src/test/java/org/springframework/sbm/support/openrewrite/java/RemoveAnnotationVisitorTest.java b/components/sbm-openrewrite/src/test/java/org/springframework/sbm/support/openrewrite/java/RemoveAnnotationVisitorTest.java index 86094d0a2..a4c925346 100644 --- a/components/sbm-openrewrite/src/test/java/org/springframework/sbm/support/openrewrite/java/RemoveAnnotationVisitorTest.java +++ b/components/sbm-openrewrite/src/test/java/org/springframework/sbm/support/openrewrite/java/RemoveAnnotationVisitorTest.java @@ -15,6 +15,7 @@ */ package org.springframework.sbm.support.openrewrite.java; +import org.intellij.lang.annotations.Language; import org.openrewrite.RecipeRun; import org.springframework.sbm.java.OpenRewriteTestSupport; import org.springframework.sbm.support.openrewrite.GenericOpenRewriteRecipe; @@ -24,7 +25,6 @@ import org.openrewrite.java.tree.J; import java.util.List; -import java.util.stream.Collectors; import static org.assertj.core.api.Assertions.assertThat; @@ -33,22 +33,26 @@ class RemoveAnnotationVisitorTest { @Test void removeAnnotationOnTypeLevel() { - String javaSource = - "import org.junit.jupiter.api.extension.ExtendWith;\n" + - "import org.mockito.junit.jupiter.MockitoExtension;\n" + - "import org.junit.jupiter.api.Disabled;\n" + - "@ExtendWith(MockitoExtension.class)\n" + - "@Disabled\n" + - "public class Foo {" + - "}"; - - String expected = - "import org.mockito.junit.jupiter.MockitoExtension;\n" + - "import org.junit.jupiter.api.Disabled;\n" + - "\n" + - "@Disabled\n" + - "public class Foo {" + - "}"; + @Language("java") + String javaSource = """ + import org.junit.jupiter.api.extension.ExtendWith; + import org.mockito.junit.jupiter.MockitoExtension; + import org.junit.jupiter.api.Disabled; + + @ExtendWith(MockitoExtension.class) + @Disabled + public class Foo {} + """; + + @Language("java") + String expected = """ + import org.mockito.junit.jupiter.MockitoExtension; + import org.junit.jupiter.api.Disabled; + + + @Disabled + public class Foo {} + """; J.CompilationUnit cu = OpenRewriteTestSupport.createCompilationUnitsFromStrings(List.of("org.junit.jupiter:junit-jupiter-api:5.7.0"), javaSource).get(0); RemoveAnnotationVisitor sut = new RemoveAnnotationVisitor(cu.getClasses().get(0), "org.junit.jupiter.api.extension.ExtendWith"); @@ -58,87 +62,111 @@ void removeAnnotationOnTypeLevel() { @Test void removeAnnotationOnMethodLevel() { - String given = - "import javax.ejb.*;\n" + - "@TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)\n" + - "public class TransactionalService {\n" + - " public void requiresNewFromType() {}\n" + - " @TransactionAttribute(TransactionAttributeType.NOT_SUPPORTED)\n" + - " public void notSupported() {}\n" + - " @TransactionAttribute(TransactionAttributeType.MANDATORY)\n" + - " public void mandatory() {}\n" + - "}"; - - String expected = - "import javax.ejb.*;\n" + - "@TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)\n" + - "public class TransactionalService {\n" + - " public void requiresNewFromType() {}\n" + - " \n" + - " public void notSupported() {}\n" + - " \n" + - " public void mandatory() {}\n" + - "}"; + @Language("java") + String given = """ + import javax.ejb.*; + + @TransactionAttribute(TransactionAttributeType.REQUIRES_NEW) + public class TransactionalService { + + public void requiresNewFromType() {} + + @TransactionAttribute(TransactionAttributeType.NOT_SUPPORTED) + public void notSupported() {} + + @TransactionAttribute(TransactionAttributeType.MANDATORY) + public void mandatory() {} + } + """; + + @Language("java") + String expected = """ + import javax.ejb.*; + + @TransactionAttribute(TransactionAttributeType.REQUIRES_NEW) + public class TransactionalService { + + public void requiresNewFromType() {} + + \s + public void notSupported() {} + + \s + public void mandatory() {} + } + """; J.CompilationUnit cu = OpenRewriteTestSupport.createCompilationUnitsFromStrings(List.of("javax.ejb:javax.ejb-api:3.2"), given).get(0); List<J.MethodDeclaration> methodDeclarationList = cu.getClasses().get(0).getBody().getStatements().stream() .filter(J.MethodDeclaration.class::isInstance) .map(J.MethodDeclaration.class::cast) - .collect(Collectors.toList()); + .toList(); J.CompilationUnit result = cu; for (J.MethodDeclaration md : methodDeclarationList) { RemoveAnnotationVisitor sut1 = new RemoveAnnotationVisitor(md, "javax.ejb.TransactionAttribute"); - RecipeRun run = new GenericOpenRewriteRecipe(() -> sut1).run(List.of(result)); + RecipeRun run = new GenericOpenRewriteRecipe<>(() -> sut1).run(List.of(result)); if (!run.getResults().isEmpty()) { result = (J.CompilationUnit) run.getResults().get(0).getAfter(); } } - assertThat(result.print()).isEqualTo(expected); + assertThat(result.print()).isEqualToNormalizingNewlines(expected); } @Test void removeAnnotationOnMemberLevel() { - String given = - "import javax.ejb.*;\n" + - "@EJB\n" + - "public class TransactionalService {\n" + - " @EJB\n" + - " private Object that;\n" + - " private Object other;\n" + - " @EJB\n" + - " public void setEJB(Object some) {}\n" + - "}"; - - String expected = - "import javax.ejb.*;\n" + - "@EJB\n" + - "public class TransactionalService {\n" + - " \n" + - " private Object that;\n" + - " private Object other;\n" + - " @EJB\n" + - " public void setEJB(Object some) {}\n" + - "}"; + @Language("java") + String given = """ + import javax.ejb.EJB; + + @EJB + public class TransactionalService { + + @EJB + private Object that; + + private Object other; + + @EJB + public void setEJB(Object some) {} + } + """; + + @Language("java") + String expected = """ + import javax.ejb.EJB; + + @EJB + public class TransactionalService { + + \s + private Object that; + + private Object other; + + @EJB + public void setEJB(Object some) {} + } + """; J.CompilationUnit cu = OpenRewriteTestSupport.createCompilationUnitsFromStrings(List.of("javax.ejb:javax.ejb-api:3.2"), given).get(0); List<J.VariableDeclarations> variableDeclarations = cu.getClasses().get(0).getBody().getStatements().stream() .filter(J.VariableDeclarations.class::isInstance) .map(J.VariableDeclarations.class::cast) - .collect(Collectors.toList()); + .toList(); J.CompilationUnit result = cu; for (J.VariableDeclarations vd : variableDeclarations) { RemoveAnnotationVisitor sut1 = new RemoveAnnotationVisitor(vd, "javax.ejb.EJB"); - RecipeRun run = new GenericOpenRewriteRecipe(() -> sut1).run(List.of(result)); + RecipeRun run = new GenericOpenRewriteRecipe<>(() -> sut1).run(List.of(result)); if (!run.getResults().isEmpty()) { result = (J.CompilationUnit) run.getResults().get(0).getAfter(); } } - assertThat(result.print()).isEqualTo(expected); + assertThat(result.print()).isEqualToNormalizingNewlines(expected); } } \ No newline at end of file diff --git a/components/sbm-recipes-spring-framework/src/main/java/org/springframework/sbm/actions/spring/xml/migration/BeanMethodFactory.java b/components/sbm-recipes-spring-framework/src/main/java/org/springframework/sbm/actions/spring/xml/migration/BeanMethodFactory.java index 76dbf4a8d..7b0670e21 100644 --- a/components/sbm-recipes-spring-framework/src/main/java/org/springframework/sbm/actions/spring/xml/migration/BeanMethodFactory.java +++ b/components/sbm-recipes-spring-framework/src/main/java/org/springframework/sbm/actions/spring/xml/migration/BeanMethodFactory.java @@ -31,7 +31,6 @@ import java.io.InputStream; import java.nio.file.Path; import java.util.*; -import java.util.stream.Collectors; import static org.springframework.sbm.actions.spring.xml.migration.Helper.classNameMatches; import static org.springframework.sbm.actions.spring.xml.migration.Helper.isOfType; @@ -41,7 +40,6 @@ @RequiredArgsConstructor public class BeanMethodFactory { - private final Helper helper; private final ListBeanHandler listBeanHandler; private final GenericBeanHandler genericBeanHandler; @@ -57,7 +55,7 @@ void addBeanDefinitionsToType(MigrationContext migrationContext, TypeSpec.Builde List<XmlBeanDef> otherBeans = migrationContext.getBeanDefinitions().values() .stream() .filter(bd -> !classNameMatches(bd, "PropertyPlaceholderConfigurer")) - .collect(Collectors.toList()); + .toList(); // create otherBeans.forEach(beanDef -> { @@ -163,10 +161,8 @@ private void processPropertyLocation(MigrationContext migrationContext, String l properties.entrySet().stream() .map(p -> new Property(p.getKey(), p.getValue())) .forEach(p -> { - Optional<Class> aClass = resolvePropertyType(migrationContext, p); - if(aClass.isPresent()) { - p.setType(aClass.get()); - } + Optional<Class<?>> aClass = resolvePropertyType(migrationContext, p); + aClass.ifPresent(p::setType); propertiesFile.addProperty(p); }); } catch (IOException e) { @@ -174,11 +170,12 @@ private void processPropertyLocation(MigrationContext migrationContext, String l } } - private Optional<Class> resolvePropertyType(MigrationContext migrationContext, Property p) { + private Optional<Class<?>> resolvePropertyType(MigrationContext migrationContext, Property p) { return migrationContext.getBeanDefinitions().values().stream() .map(xmlBeanDef -> xmlBeanDef.getTypeOfProperty(migrationContext.getClassLoader(), p.getFieldName())) - .filter(t -> t.isPresent()) - .map(t -> t.get()) + .flatMap(Optional::stream) + //.filter(t -> t.isPresent()) + //.map(t -> t.get()) .findFirst(); } @@ -188,7 +185,7 @@ void createMembersForProperties(TypeSpec.Builder typeSpec, Set<PropertiesFile> p .forEach(es -> { String fieldName = es.getFieldName(); // get type of field -// bd.getTypeOfProperty(es.getKey()); + //bd.getTypeOfProperty(es.getKey()); Class<?> fieldType = es.getPropertyType(); // get type of field here and use as type of member typeSpec.addField(FieldSpec.builder(fieldType, fieldName, Modifier.PRIVATE) @@ -218,7 +215,7 @@ public MethodSpec createBeanConfigurationMethod(MigrationContext migrationContex } private boolean isListBeanDefinition(XmlBeanDef xmlBeanDefinition) { - return xmlBeanDefinition.getBeanDefinition().getBeanClassName().equals("org.springframework.beans.factory.config.ListFactoryBean"); + return "org.springframework.beans.factory.config.ListFactoryBean".equals(xmlBeanDefinition.getBeanDefinition().getBeanClassName()); } } diff --git a/components/sbm-recipes-spring-framework/src/main/java/org/springframework/sbm/actions/spring/xml/migration/XmlBeanDef.java b/components/sbm-recipes-spring-framework/src/main/java/org/springframework/sbm/actions/spring/xml/migration/XmlBeanDef.java index eda89162c..10e9f8b3e 100644 --- a/components/sbm-recipes-spring-framework/src/main/java/org/springframework/sbm/actions/spring/xml/migration/XmlBeanDef.java +++ b/components/sbm-recipes-spring-framework/src/main/java/org/springframework/sbm/actions/spring/xml/migration/XmlBeanDef.java @@ -36,7 +36,7 @@ public XmlBeanDef(String name, BeanDefinition beanDefinition) { this.beanDefinition = beanDefinition; } - public Optional<Class> getTypeOfProperty(ClassLoader classLoader, String property) { + public Optional<Class<?>> getTypeOfProperty(ClassLoader classLoader, String property) { boolean hasProperty = getBeanDefinition().getPropertyValues().stream() .filter(v -> v.getValue().getClass().isAssignableFrom(TypedStringValue.class)) .map(v -> (TypedStringValue) v.getValue())