diff --git a/components/sbm-recipes-boot-upgrade/src/main/java/org/springframework/sbm/boot/upgrade_27_30/checks/CommonsMultipartResolverBeanFinder.java b/components/sbm-recipes-boot-upgrade/src/main/java/org/springframework/sbm/boot/upgrade_27_30/checks/CommonsMultipartResolverBeanFinder.java deleted file mode 100644 index b682755ed..000000000 --- a/components/sbm-recipes-boot-upgrade/src/main/java/org/springframework/sbm/boot/upgrade_27_30/checks/CommonsMultipartResolverBeanFinder.java +++ /dev/null @@ -1,35 +0,0 @@ -/* - * Copyright 2021 - 2022 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * https://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.springframework.sbm.boot.upgrade_27_30.checks; - -import org.jetbrains.annotations.NotNull; -import org.springframework.sbm.boot.common.finder.MatchingMethod; -import org.springframework.sbm.boot.common.finder.SpringBeanMethodDeclarationFinder; -import org.springframework.sbm.engine.context.ProjectContext; -import org.springframework.stereotype.Component; - -import java.util.List; - -@Component -public class CommonsMultipartResolverBeanFinder implements Sbm30_Finder> { - private static final String COMMONS_MULTIPART_RESOLVER_CLASS = "org.springframework.web.multipart.commons.CommonsMultipartResolver"; - - @Override - public @NotNull List findMatches(ProjectContext context) { - return context.search(new SpringBeanMethodDeclarationFinder(COMMONS_MULTIPART_RESOLVER_CLASS)); - } -} diff --git a/components/sbm-recipes-boot-upgrade/src/main/java/org/springframework/sbm/boot/upgrade_27_30/checks/CommonsMultipartResolverSectionBuilder.java b/components/sbm-recipes-boot-upgrade/src/main/java/org/springframework/sbm/boot/upgrade_27_30/checks/CommonsMultipartResolverSectionBuilder.java deleted file mode 100644 index 215a8428f..000000000 --- a/components/sbm-recipes-boot-upgrade/src/main/java/org/springframework/sbm/boot/upgrade_27_30/checks/CommonsMultipartResolverSectionBuilder.java +++ /dev/null @@ -1,79 +0,0 @@ -/* - * Copyright 2021 - 2022 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * https://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.springframework.sbm.boot.upgrade_27_30.checks; - -import lombok.RequiredArgsConstructor; -import org.springframework.sbm.boot.asciidoctor.ChangeSection; -import org.springframework.sbm.boot.asciidoctor.Section; -import org.springframework.sbm.boot.asciidoctor.TodoList; -import org.springframework.sbm.boot.common.finder.MatchingMethod; -import org.springframework.sbm.boot.upgrade_27_30.Sbu30_UpgradeSectionBuilder; -import org.springframework.sbm.engine.context.ProjectContext; -import org.springframework.stereotype.Component; - -import java.util.List; - -@Component -@RequiredArgsConstructor -public class CommonsMultipartResolverSectionBuilder implements Sbu30_UpgradeSectionBuilder { - - private final CommonsMultipartResolverBeanFinder finder; - - @Override - public boolean isApplicable(ProjectContext projectContext) { - return ! finder.findMatches(projectContext).isEmpty(); - } - - @Override - public Section build(ProjectContext projectContext) { - List matchingMethods = finder.findMatches(projectContext); - - - - return ChangeSection.RelevantChangeSection.builder() - .title("`CommonsMultipartResolver` support has been removed") - .paragraph("Support for Spring Framework’s `CommonsMultipartResolver` has been removed following its removal in Spring Framework 6") - .relevanceSection() - .paragraph("The scan found bean declarations of type `CommonsMultipartResolver`.") - .todoSection() - .paragraph("Remove beans of type `CommonsMultipartResolver` and rely on Spring Boot auto-configuration") - .todoList(this.buildTodoList(matchingMethods)) - .build(); - } - - private TodoList buildTodoList(List matchingMethods) { - TodoList.TodoListBuilder todoListBuilder = TodoList.builder(); - matchingMethods.forEach(m -> { - todoListBuilder.todo( - TodoList.Todo.builder() - .text(String.format("Remove from class `%s`", m.getType().getFullyQualifiedName())) - .build() - ); - }); - return todoListBuilder.build(); - } - - private TodoList createTodo(String s) { - return TodoList.builder() - .todo( - TodoList.Todo.builder() - .text(String.format("Remove from class `%s`", s)) - .build() - ) - .build(); - } -} diff --git a/components/sbm-recipes-boot-upgrade/src/main/java/org/springframework/sbm/boot/upgrade_27_30/report/helper/CommonsMultipartResolverHelper.java b/components/sbm-recipes-boot-upgrade/src/main/java/org/springframework/sbm/boot/upgrade_27_30/report/helper/CommonsMultipartResolverHelper.java new file mode 100644 index 000000000..6a243019e --- /dev/null +++ b/components/sbm-recipes-boot-upgrade/src/main/java/org/springframework/sbm/boot/upgrade_27_30/report/helper/CommonsMultipartResolverHelper.java @@ -0,0 +1,58 @@ +/* + * Copyright 2021 - 2022 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.springframework.sbm.boot.upgrade_27_30.report.helper; + +import org.springframework.sbm.boot.common.finder.MatchingMethod; +import org.springframework.sbm.boot.common.finder.SpringBeanMethodDeclarationFinder; +import org.springframework.sbm.boot.upgrade_27_30.report.SpringBootUpgradeReportSection; +import org.springframework.sbm.engine.context.ProjectContext; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +public class CommonsMultipartResolverHelper implements SpringBootUpgradeReportSection.Helper>{ + private static final String COMMONS_MULTIPART_RESOLVER_CLASS = "org.springframework.web.multipart.commons.CommonsMultipartResolver"; + private List types; + + @Override + public String getDescription() { + return null; + } + + @Override + public boolean evaluate(ProjectContext context) { + List search = context + .search( + new SpringBeanMethodDeclarationFinder( + COMMONS_MULTIPART_RESOLVER_CLASS + ) + ); + + types = search.stream() + .map(k -> k.getType().getFullyQualifiedName()) + .collect(Collectors.toList()); + + return !search.isEmpty(); + } + + @Override + public Map> getData() { + return Map.of("types", types); + } +} diff --git a/components/sbm-recipes-boot-upgrade/src/main/resources/recipes/boot-new-report.yaml b/components/sbm-recipes-boot-upgrade/src/main/resources/recipes/boot-new-report.yaml index 9ec5a16e0..c7e859817 100644 --- a/components/sbm-recipes-boot-upgrade/src/main/resources/recipes/boot-new-report.yaml +++ b/components/sbm-recipes-boot-upgrade/src/main/resources/recipes/boot-new-report.yaml @@ -323,6 +323,22 @@ contributors: - "Sandeep Nagaraj[@sanagaraj-pivotal]" + - title: Commons Multipart Upload + helper: org.springframework.sbm.boot.upgrade_27_30.report.helper.CommonsMultipartResolverHelper + change: |- + Support for Spring Framework’s `CommonsMultipartResolver` has been removed following its removal in Spring Framework 6 + affected: |- + We found usage of `CommonsMultipartResolver` in following files: + + <#list types as type> + * `${type}` + + remediation: + description: |- + Remove beans of type `CommonsMultipartResolver` and rely on Spring Boot auto-configuration + gitHubIssue: 541 + contributors: + - "Sandeep Nagaraj[@sanagaraj-pivotal]" footer: |- We want to say thank you to all Contributors: diff --git a/components/sbm-recipes-boot-upgrade/src/test/java/org/springframework/sbm/boot/upgrade_27_30/checks/CommonsMultipartResolverSectionBuilderTest.java b/components/sbm-recipes-boot-upgrade/src/test/java/org/springframework/sbm/boot/upgrade_27_30/checks/CommonsMultipartResolverSectionBuilderTest.java deleted file mode 100644 index 601c4c444..000000000 --- a/components/sbm-recipes-boot-upgrade/src/test/java/org/springframework/sbm/boot/upgrade_27_30/checks/CommonsMultipartResolverSectionBuilderTest.java +++ /dev/null @@ -1,75 +0,0 @@ -/* - * Copyright 2021 - 2022 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * https://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.springframework.sbm.boot.upgrade_27_30.checks; - -import org.junit.jupiter.api.Test; -import org.springframework.sbm.boot.asciidoctor.Section; -import org.springframework.sbm.boot.common.finder.MatchingMethod; -import org.springframework.sbm.engine.context.ProjectContext; -import org.springframework.sbm.java.api.Type; - -import java.util.List; - -import static org.assertj.core.api.Assertions.assertThat; -import static org.mockito.ArgumentMatchers.matches; -import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.when; - -class CommonsMultipartResolverSectionBuilderTest { - - @Test - void test_renameMe() { - CommonsMultipartResolverBeanFinder finder = mock(CommonsMultipartResolverBeanFinder.class); - - Type type = mock(Type.class); - Type type2 = mock(Type.class); - - ProjectContext context = mock(ProjectContext.class); - CommonsMultipartResolverSectionBuilder sut = new CommonsMultipartResolverSectionBuilder(finder); - List matches = List.of( - new MatchingMethod(null, type, null), - new MatchingMethod(null, type2, null) - ); - - when(finder.findMatches(context)).thenReturn(matches); - when(type.getFullyQualifiedName()).thenReturn("com.foo.bar.SomeClass"); - when(type2.getFullyQualifiedName()).thenReturn("com.foo.baz.AnotherClass"); - - Section section = sut.build(context); - - String rendered = SectionRendererTestUtil.render(section); - assertThat(rendered).isEqualTo( - """ - === `CommonsMultipartResolver` support has been removed - Support for Spring Framework’s `CommonsMultipartResolver` has been removed following its removal in Spring Framework 6 - - ==== Relevance - - The scan found bean declarations of type `CommonsMultipartResolver`. - - ==== Todo - - Remove beans of type `CommonsMultipartResolver` and rely on Spring Boot auto-configuration - - - * [ ] Remove from class `com.foo.bar.SomeClass` - * [ ] Remove from class `com.foo.baz.AnotherClass` - """ - ); - } - -} \ No newline at end of file diff --git a/components/sbm-recipes-boot-upgrade/src/test/java/org/springframework/sbm/boot/upgrade_27_30/report/helper/CommonsMultipartResolverHelperTest.java b/components/sbm-recipes-boot-upgrade/src/test/java/org/springframework/sbm/boot/upgrade_27_30/report/helper/CommonsMultipartResolverHelperTest.java new file mode 100644 index 000000000..03278ee50 --- /dev/null +++ b/components/sbm-recipes-boot-upgrade/src/test/java/org/springframework/sbm/boot/upgrade_27_30/report/helper/CommonsMultipartResolverHelperTest.java @@ -0,0 +1,162 @@ +/* + * Copyright 2021 - 2022 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.springframework.sbm.boot.upgrade_27_30.report.helper; + +import org.intellij.lang.annotations.Language; +import org.junit.jupiter.api.Test; +import org.springframework.sbm.boot.upgrade_27_30.report.SpringBootUpgradeReportTestSupport; +import org.springframework.sbm.engine.context.ProjectContext; +import org.springframework.sbm.project.resource.TestProjectContext; + +public class CommonsMultipartResolverHelperTest { + + @Test + public void detectsCommonsMultiPartResolverClass() { + @Language("java") + String commonsMultiPartClass = """ + package example; + + import org.springframework.context.annotation.Bean; + import org.springframework.web.multipart.commons.CommonsMultipartResolver; + + public class SongUploadConfig { + + @Bean + public CommonsMultipartResolver commonsMultipartResolver() { + final CommonsMultipartResolver commonsMultipartResolver = new CommonsMultipartResolver(); + commonsMultipartResolver.setMaxUploadSize(-1); + return commonsMultipartResolver; + } + } + """; + + ProjectContext context = TestProjectContext.buildProjectContext() + .addJavaSource("src/main/java", commonsMultiPartClass) + .withBuildFileHavingDependencies("org.springframework.boot:spring-boot-starter-web:2.7.1") + .build(); + + SpringBootUpgradeReportTestSupport + .generatedSection("Commons Multipart Upload") + .fromProjectContext(context) + .shouldRenderAs( + """ + === Commons Multipart Upload + Issue: https://github.com/spring-projects-experimental/spring-boot-migrator/issues/541[#541], Contributors: https://github.com/sanagaraj-pivotal[@sanagaraj-pivotal^, role="ext-link"] + + ==== What Changed + Support for Spring Framework’s `CommonsMultipartResolver` has been removed following its removal in Spring Framework 6 + + ==== Why is the application affected + We found usage of `CommonsMultipartResolver` in following files: + + * `example.SongUploadConfig` + + ==== Remediation + Remove beans of type `CommonsMultipartResolver` and rely on Spring Boot auto-configuration + + + """ + ); + } + + @Test + public void detectsCommonMultiPartResolverInMultipleFiles() { + @Language("java") + String commonsMultiPartClass1 = """ + package example; + + import org.springframework.context.annotation.Bean; + import org.springframework.web.multipart.commons.CommonsMultipartResolver; + + public class SongUploadConfig { + + @Bean + public CommonsMultipartResolver songMultiPartUploader() { + final CommonsMultipartResolver commonsMultipartResolver = new CommonsMultipartResolver(); + commonsMultipartResolver.setMaxUploadSize(10); + return commonsMultipartResolver; + } + } + """; + + String commonsMultiPartClass2 = """ + package example; + + import org.springframework.context.annotation.Bean; + import org.springframework.web.multipart.commons.CommonsMultipartResolver; + + public class VideoUploadConfig { + + @Bean + public CommonsMultipartResolver songMultiPartUploader() { + final CommonsMultipartResolver commonsMultipartResolver = new CommonsMultipartResolver(); + commonsMultipartResolver.setMaxUploadSize(10); + return commonsMultipartResolver; + } + } + """; + ProjectContext context = TestProjectContext.buildProjectContext() + .addJavaSource("src/main/java", commonsMultiPartClass1) + .addJavaSource("src/main/java", commonsMultiPartClass2) + .withBuildFileHavingDependencies("org.springframework.boot:spring-boot-starter-web:2.7.1") + .build(); + + SpringBootUpgradeReportTestSupport + .generatedSection("Commons Multipart Upload") + .fromProjectContext(context) + .shouldRenderAs( + """ + === Commons Multipart Upload + Issue: https://github.com/spring-projects-experimental/spring-boot-migrator/issues/541[#541], Contributors: https://github.com/sanagaraj-pivotal[@sanagaraj-pivotal^, role="ext-link"] + + ==== What Changed + Support for Spring Framework’s `CommonsMultipartResolver` has been removed following its removal in Spring Framework 6 + + ==== Why is the application affected + We found usage of `CommonsMultipartResolver` in following files: + + * `example.SongUploadConfig` + * `example.VideoUploadConfig` + + ==== Remediation + Remove beans of type `CommonsMultipartResolver` and rely on Spring Boot auto-configuration + + + """ + ); + } + + @Test + public void doesNotReportMigrationGuidanceWhenNoCommonsMultiPartResolverIsFound() { + @Language("java") + String aClass = """ + package example; + + public class A {} + """; + + ProjectContext context = TestProjectContext.buildProjectContext() + .addJavaSource("src/main/java", aClass) + .withBuildFileHavingDependencies("org.springframework.boot:spring-boot-starter-web:2.7.1") + .build(); + + SpringBootUpgradeReportTestSupport + .generatedSection("Commons Multipart Upload") + .fromProjectContext(context) + .shouldNotRender(); + } +}