Skip to content

Commit 1a9061c

Browse files
closes #159 Added action for Johnzon upgrade for Spring boot migration 2.7 t… (#265)
Co-authored-by: Ravi Gupta <[email protected]>
1 parent 41353a6 commit 1a9061c

File tree

5 files changed

+202
-1
lines changed

5 files changed

+202
-1
lines changed

components/sbm-core/src/main/java/org/springframework/sbm/build/api/Dependency.java

+6
Original file line numberDiff line numberDiff line change
@@ -104,6 +104,12 @@ public static Dependency fromCoordinates(String coordinate) {
104104
.groupId(splitCoordinates[0])
105105
.artifactId(splitCoordinates[1])
106106
.version(splitCoordinates[2]).build();
107+
} else if (splitCoordinates.length == 4) {
108+
return Dependency.builder()
109+
.groupId(splitCoordinates[0])
110+
.artifactId(splitCoordinates[1])
111+
.version(splitCoordinates[2])
112+
.classifier(splitCoordinates[3]).build();
107113
} else {
108114
throw new IllegalArgumentException("Expected dependency in format groupid:artifactid[:version], but it is: " + coordinate);
109115
}

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

+11-1
Original file line numberDiff line numberDiff line change
@@ -28,9 +28,19 @@ public void handlesErroneousCoordinateInput() {
2828
assertThrows(IllegalArgumentException.class, () -> Dependency.fromCoordinates("one"));
2929
}
3030

31+
@Test
32+
public void handlesErroneousCoordinateFiveParts() {
33+
assertThrows(IllegalArgumentException.class, () -> Dependency.fromCoordinates("one:two:three:four:five"));;
34+
}
35+
3136
@Test
3237
public void handlesErroneousCoordinateFourParts() {
33-
assertThrows(IllegalArgumentException.class, () -> Dependency.fromCoordinates("one:two:three:four"));
38+
Dependency dependency = Dependency.fromCoordinates("one:two:three:four");
39+
40+
assertThat(dependency.getGroupId()).isEqualTo("one");
41+
assertThat(dependency.getArtifactId()).isEqualTo("two");
42+
assertThat(dependency.getVersion()).isEqualTo("three");
43+
assertThat(dependency.getClassifier()).isEqualTo("four");
3444
}
3545

3646
@Test
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
package org.springframework.sbm.boot.upgrade_27_30.actions;
2+
3+
import org.springframework.sbm.boot.upgrade_27_30.conditions.JohnzonDependencyCondition;
4+
import org.springframework.sbm.build.api.ApplicationModule;
5+
import org.springframework.sbm.build.api.Dependency;
6+
import org.springframework.sbm.engine.context.ProjectContext;
7+
import org.springframework.sbm.engine.recipe.AbstractAction;
8+
9+
public class Boot_27_30_UpgradeReplaceJohnzonDependencies extends AbstractAction {
10+
11+
private static final String JOHNZON_DEPENDENCY_PATTERN = "org\\.apache\\.johnzon\\:johnzon-core\\:.*";
12+
private static final String JOHNZON_DEPENDENCY = "org.apache.johnzon:johnzon-core:1.2.18:jakarta";
13+
14+
@Override
15+
public void apply(ProjectContext context) {
16+
context.getApplicationModules()
17+
.stream()
18+
.map(ApplicationModule::getBuildFile)
19+
.peek(bf -> bf.removeDependenciesMatchingRegex(JOHNZON_DEPENDENCY_PATTERN))
20+
.forEach(bf -> bf.addDependency(Dependency.fromCoordinates(JOHNZON_DEPENDENCY)));
21+
}
22+
23+
@Override
24+
public boolean isApplicable(ProjectContext context) {
25+
return new JohnzonDependencyCondition().evaluate(context);
26+
}
27+
28+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
package org.springframework.sbm.boot.upgrade_27_30.conditions;
2+
3+
import org.springframework.sbm.build.api.ApplicationModule;
4+
import org.springframework.sbm.engine.context.ProjectContext;
5+
import org.springframework.sbm.engine.recipe.Condition;
6+
7+
/**
8+
* This filter finds out if any of the resource uses Johnzon
9+
*/
10+
public class JohnzonDependencyCondition implements Condition {
11+
12+
private static final String JOHNZON_DEPENDENCY_PATTERN = "org\\.apache\\.johnzon\\:johnzon-core\\:.*";
13+
14+
@Override
15+
public String getDescription() {
16+
return "Checks if the project has declared dependency on Johnzon library";
17+
}
18+
19+
@Override
20+
public boolean evaluate(ProjectContext context) {
21+
return context.getApplicationModules()
22+
.stream()
23+
.map(ApplicationModule::getBuildFile)
24+
.anyMatch(b -> b.hasDeclaredDependencyMatchingRegex(JOHNZON_DEPENDENCY_PATTERN));
25+
}
26+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,131 @@
1+
package org.springframework.sbm.boot.upgrade_27_30.actions;
2+
3+
import org.junit.jupiter.api.Test;
4+
import org.springframework.sbm.engine.context.ProjectContext;
5+
import org.springframework.sbm.project.resource.TestProjectContext;
6+
7+
import java.nio.file.Path;
8+
9+
import static org.assertj.core.api.Assertions.assertThat;
10+
11+
public class Boot_27_30_UpgradeReplaceJohnzonDependenciesTest {
12+
13+
private static final String SELF_MANAGED_JOHNZON_UNSUPPORTED_DEPENDENCY = "org.apache.johnzon:johnzon-core:1.2.11";
14+
15+
16+
private static final String SPRING_MANAGED_DEPENDENCY_POM = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" +
17+
"<project xmlns=\"http://maven.apache.org/POM/4.0.0\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\">\n" +
18+
" <modelVersion>4.0.0</modelVersion>\n" +
19+
" <parent>\n" +
20+
" <groupId>org.springframework.boot</groupId>\n" +
21+
" <artifactId>spring-boot-starter-parent</artifactId>\n" +
22+
" <version>2.7.1</version>\n" +
23+
" <relativePath/>\n" +
24+
" </parent>\n" +
25+
" <groupId>com.example</groupId>\n" +
26+
" <artifactId>dummy-root</artifactId>\n" +
27+
" <version>0.1.0-SNAPSHOT</version>\n" +
28+
" <packaging>pom</packaging>\n" +
29+
" <dependencies>\n" +
30+
" <dependency>\n" +
31+
" <groupId>org.apache.johnzon</groupId>\n" +
32+
" <artifactId>johnzon-core</artifactId>\n" +
33+
" </dependency>\n" +
34+
" </dependencies>\n" +
35+
"\n" +
36+
"</project>" +
37+
"\n";
38+
39+
40+
private static final String SPRING_MANAGED_DEPENDENCY_EXPECTED_POM = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" +
41+
"<project xmlns=\"http://maven.apache.org/POM/4.0.0\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\">\n" +
42+
" <modelVersion>4.0.0</modelVersion>\n" +
43+
" <parent>\n" +
44+
" <groupId>org.springframework.boot</groupId>\n" +
45+
" <artifactId>spring-boot-starter-parent</artifactId>\n" +
46+
" <version>2.7.1</version>\n" +
47+
" <relativePath/>\n" +
48+
" </parent>\n" +
49+
" <groupId>com.example</groupId>\n" +
50+
" <artifactId>dummy-root</artifactId>\n" +
51+
" <version>0.1.0-SNAPSHOT</version>\n" +
52+
" <packaging>pom</packaging>\n" +
53+
" <dependencies>\n" +
54+
" <dependency>\n" +
55+
" <groupId>org.apache.johnzon</groupId>\n" +
56+
" <artifactId>johnzon-core</artifactId>\n" +
57+
" <version>1.2.18</version>\n" +
58+
" <classifier>jakarta</classifier>\n" +
59+
" </dependency>\n" +
60+
" </dependencies>\n" +
61+
"\n" +
62+
"</project>" +
63+
"\n";
64+
65+
66+
private static final String EXPECTED_POM = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" +
67+
"<project xmlns=\"http://maven.apache.org/POM/4.0.0\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\">\n" +
68+
" <modelVersion>4.0.0</modelVersion>\n" +
69+
" <groupId>com.example</groupId>\n" +
70+
" <artifactId>dummy-root</artifactId>\n" +
71+
" <version>0.1.0-SNAPSHOT</version>\n" +
72+
" <packaging>jar</packaging>\n" +
73+
" <dependencies>\n" +
74+
" <dependency>\n" +
75+
" <groupId>org.apache.johnzon</groupId>\n" +
76+
" <artifactId>johnzon-core</artifactId>\n" +
77+
" <version>1.2.18</version>\n" +
78+
" <classifier>jakarta</classifier>\n" +
79+
" </dependency>\n" +
80+
" </dependencies>\n" +
81+
"\n" +
82+
"</project>" +
83+
"\n";
84+
85+
86+
87+
@Test
88+
public void givenProjectWithSelfManagedJohnzonDependency_migrate_expectJohnzonDependencyUpdated(){
89+
ProjectContext projectContext = getProjectContextWithJohnzonDependency(SELF_MANAGED_JOHNZON_UNSUPPORTED_DEPENDENCY);
90+
Boot_27_30_UpgradeReplaceJohnzonDependencies upgradeReplaceJohnzonDependencies = new Boot_27_30_UpgradeReplaceJohnzonDependencies();
91+
upgradeReplaceJohnzonDependencies.apply(projectContext);
92+
93+
assertThat(projectContext.getBuildFile().print()).isEqualToIgnoringNewLines(EXPECTED_POM);
94+
}
95+
96+
97+
@Test
98+
public void givenProjectWithSpringManagedJohnzonDependency_migrate_expectJohnzonDependencyUpdated(){
99+
ProjectContext projectContext = getProjectContextWithSpringManagedJohnzonDependency();
100+
Boot_27_30_UpgradeReplaceJohnzonDependencies upgradeReplaceJohnzonDependencies = new Boot_27_30_UpgradeReplaceJohnzonDependencies();
101+
upgradeReplaceJohnzonDependencies.apply(projectContext);
102+
103+
assertThat(projectContext.getBuildFile().print()).isEqualToIgnoringNewLines(SPRING_MANAGED_DEPENDENCY_EXPECTED_POM);
104+
}
105+
106+
@Test
107+
public void givenProjectWithoutJohnzonDependency_checkActionApplicability_expectFalse(){
108+
ProjectContext projectContext = getProjectContextWithoutJohnzonDependency();
109+
Boot_27_30_UpgradeReplaceJohnzonDependencies upgradeReplaceJohnzonDependencies = new Boot_27_30_UpgradeReplaceJohnzonDependencies();
110+
111+
assertThat(upgradeReplaceJohnzonDependencies.isApplicable(projectContext)).isFalse();
112+
}
113+
114+
private ProjectContext getProjectContextWithJohnzonDependency(String dependencyCoordinates){
115+
return TestProjectContext.buildProjectContext()
116+
.withBuildFileHavingDependencies(dependencyCoordinates)
117+
.build();
118+
}
119+
120+
private ProjectContext getProjectContextWithoutJohnzonDependency(){
121+
return TestProjectContext.buildProjectContext()
122+
.withDummyRootBuildFile()
123+
.build();
124+
}
125+
126+
private ProjectContext getProjectContextWithSpringManagedJohnzonDependency(){
127+
return TestProjectContext.buildProjectContext()
128+
.addProjectResource(Path.of("pom.xml"), SPRING_MANAGED_DEPENDENCY_POM)
129+
.build();
130+
}
131+
}

0 commit comments

Comments
 (0)