Skip to content

#159 Added action for Johnzon upgrade for Spring boot migration 2.7 t… #265

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 5 commits into from
Aug 3, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -104,6 +104,12 @@ public static Dependency fromCoordinates(String coordinate) {
.groupId(splitCoordinates[0])
.artifactId(splitCoordinates[1])
.version(splitCoordinates[2]).build();
} else if (splitCoordinates.length == 4) {
return Dependency.builder()
.groupId(splitCoordinates[0])
.artifactId(splitCoordinates[1])
.version(splitCoordinates[2])
.classifier(splitCoordinates[3]).build();
} else {
throw new IllegalArgumentException("Expected dependency in format groupid:artifactid[:version], but it is: " + coordinate);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -28,9 +28,19 @@ public void handlesErroneousCoordinateInput() {
assertThrows(IllegalArgumentException.class, () -> Dependency.fromCoordinates("one"));
}

@Test
public void handlesErroneousCoordinateFiveParts() {
assertThrows(IllegalArgumentException.class, () -> Dependency.fromCoordinates("one:two:three:four:five"));;
}

@Test
public void handlesErroneousCoordinateFourParts() {
assertThrows(IllegalArgumentException.class, () -> Dependency.fromCoordinates("one:two:three:four"));
Dependency dependency = Dependency.fromCoordinates("one:two:three:four");

assertThat(dependency.getGroupId()).isEqualTo("one");
assertThat(dependency.getArtifactId()).isEqualTo("two");
assertThat(dependency.getVersion()).isEqualTo("three");
assertThat(dependency.getClassifier()).isEqualTo("four");
}

@Test
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
package org.springframework.sbm.boot.upgrade_27_30.actions;

import org.springframework.sbm.boot.upgrade_27_30.conditions.JohnzonDependencyCondition;
import org.springframework.sbm.build.api.ApplicationModule;
import org.springframework.sbm.build.api.Dependency;
import org.springframework.sbm.engine.context.ProjectContext;
import org.springframework.sbm.engine.recipe.AbstractAction;

public class Boot_27_30_UpgradeReplaceJohnzonDependencies extends AbstractAction {

private static final String JOHNZON_DEPENDENCY_PATTERN = "org\\.apache\\.johnzon\\:johnzon-core\\:.*";
private static final String JOHNZON_DEPENDENCY = "org.apache.johnzon:johnzon-core:1.2.18:jakarta";

@Override
public void apply(ProjectContext context) {
context.getApplicationModules()
.stream()
.map(ApplicationModule::getBuildFile)
.peek(bf -> bf.removeDependenciesMatchingRegex(JOHNZON_DEPENDENCY_PATTERN))
.forEach(bf -> bf.addDependency(Dependency.fromCoordinates(JOHNZON_DEPENDENCY)));
}

@Override
public boolean isApplicable(ProjectContext context) {
return new JohnzonDependencyCondition().evaluate(context);
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
package org.springframework.sbm.boot.upgrade_27_30.conditions;

import org.springframework.sbm.build.api.ApplicationModule;
import org.springframework.sbm.engine.context.ProjectContext;
import org.springframework.sbm.engine.recipe.Condition;

/**
* This filter finds out if any of the resource uses Johnzon
*/
public class JohnzonDependencyCondition implements Condition {

private static final String JOHNZON_DEPENDENCY_PATTERN = "org\\.apache\\.johnzon\\:johnzon-core\\:.*";

@Override
public String getDescription() {
return "Checks if the project has declared dependency on Johnzon library";
}

@Override
public boolean evaluate(ProjectContext context) {
return context.getApplicationModules()
.stream()
.map(ApplicationModule::getBuildFile)
.anyMatch(b -> b.hasDeclaredDependencyMatchingRegex(JOHNZON_DEPENDENCY_PATTERN));
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,131 @@
package org.springframework.sbm.boot.upgrade_27_30.actions;

import org.junit.jupiter.api.Test;
import org.springframework.sbm.engine.context.ProjectContext;
import org.springframework.sbm.project.resource.TestProjectContext;

import java.nio.file.Path;

import static org.assertj.core.api.Assertions.assertThat;

public class Boot_27_30_UpgradeReplaceJohnzonDependenciesTest {

private static final String SELF_MANAGED_JOHNZON_UNSUPPORTED_DEPENDENCY = "org.apache.johnzon:johnzon-core:1.2.11";


private static final String SPRING_MANAGED_DEPENDENCY_POM = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" +
"<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" +
" <modelVersion>4.0.0</modelVersion>\n" +
" <parent>\n" +
" <groupId>org.springframework.boot</groupId>\n" +
" <artifactId>spring-boot-starter-parent</artifactId>\n" +
" <version>2.7.1</version>\n" +
" <relativePath/>\n" +
" </parent>\n" +
" <groupId>com.example</groupId>\n" +
" <artifactId>dummy-root</artifactId>\n" +
" <version>0.1.0-SNAPSHOT</version>\n" +
" <packaging>pom</packaging>\n" +
" <dependencies>\n" +
" <dependency>\n" +
" <groupId>org.apache.johnzon</groupId>\n" +
" <artifactId>johnzon-core</artifactId>\n" +
" </dependency>\n" +
" </dependencies>\n" +
"\n" +
"</project>" +
"\n";


private static final String SPRING_MANAGED_DEPENDENCY_EXPECTED_POM = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" +
"<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" +
" <modelVersion>4.0.0</modelVersion>\n" +
" <parent>\n" +
" <groupId>org.springframework.boot</groupId>\n" +
" <artifactId>spring-boot-starter-parent</artifactId>\n" +
" <version>2.7.1</version>\n" +
" <relativePath/>\n" +
" </parent>\n" +
" <groupId>com.example</groupId>\n" +
" <artifactId>dummy-root</artifactId>\n" +
" <version>0.1.0-SNAPSHOT</version>\n" +
" <packaging>pom</packaging>\n" +
" <dependencies>\n" +
" <dependency>\n" +
" <groupId>org.apache.johnzon</groupId>\n" +
" <artifactId>johnzon-core</artifactId>\n" +
" <version>1.2.18</version>\n" +
" <classifier>jakarta</classifier>\n" +
" </dependency>\n" +
" </dependencies>\n" +
"\n" +
"</project>" +
"\n";


private static final String EXPECTED_POM = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" +
"<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" +
" <modelVersion>4.0.0</modelVersion>\n" +
" <groupId>com.example</groupId>\n" +
" <artifactId>dummy-root</artifactId>\n" +
" <version>0.1.0-SNAPSHOT</version>\n" +
" <packaging>jar</packaging>\n" +
" <dependencies>\n" +
" <dependency>\n" +
" <groupId>org.apache.johnzon</groupId>\n" +
" <artifactId>johnzon-core</artifactId>\n" +
" <version>1.2.18</version>\n" +
" <classifier>jakarta</classifier>\n" +
" </dependency>\n" +
" </dependencies>\n" +
"\n" +
"</project>" +
"\n";



@Test
public void givenProjectWithSelfManagedJohnzonDependency_migrate_expectJohnzonDependencyUpdated(){
ProjectContext projectContext = getProjectContextWithJohnzonDependency(SELF_MANAGED_JOHNZON_UNSUPPORTED_DEPENDENCY);
Boot_27_30_UpgradeReplaceJohnzonDependencies upgradeReplaceJohnzonDependencies = new Boot_27_30_UpgradeReplaceJohnzonDependencies();
upgradeReplaceJohnzonDependencies.apply(projectContext);

assertThat(projectContext.getBuildFile().print()).isEqualToIgnoringNewLines(EXPECTED_POM);
}


@Test
public void givenProjectWithSpringManagedJohnzonDependency_migrate_expectJohnzonDependencyUpdated(){
ProjectContext projectContext = getProjectContextWithSpringManagedJohnzonDependency();
Boot_27_30_UpgradeReplaceJohnzonDependencies upgradeReplaceJohnzonDependencies = new Boot_27_30_UpgradeReplaceJohnzonDependencies();
upgradeReplaceJohnzonDependencies.apply(projectContext);

assertThat(projectContext.getBuildFile().print()).isEqualToIgnoringNewLines(SPRING_MANAGED_DEPENDENCY_EXPECTED_POM);
}

@Test
public void givenProjectWithoutJohnzonDependency_checkActionApplicability_expectFalse(){
ProjectContext projectContext = getProjectContextWithoutJohnzonDependency();
Boot_27_30_UpgradeReplaceJohnzonDependencies upgradeReplaceJohnzonDependencies = new Boot_27_30_UpgradeReplaceJohnzonDependencies();

assertThat(upgradeReplaceJohnzonDependencies.isApplicable(projectContext)).isFalse();
}

private ProjectContext getProjectContextWithJohnzonDependency(String dependencyCoordinates){
return TestProjectContext.buildProjectContext()
.withBuildFileHavingDependencies(dependencyCoordinates)
.build();
}

private ProjectContext getProjectContextWithoutJohnzonDependency(){
return TestProjectContext.buildProjectContext()
.withDummyRootBuildFile()
.build();
}

private ProjectContext getProjectContextWithSpringManagedJohnzonDependency(){
return TestProjectContext.buildProjectContext()
.addProjectResource(Path.of("pom.xml"), SPRING_MANAGED_DEPENDENCY_POM)
.build();
}
}