Skip to content

Commit 6322f4d

Browse files
authored
Merge branch 'main' into spring-projects-experimentalgh-428
2 parents 08f07f1 + f8447ac commit 6322f4d

File tree

66 files changed

+2860
-563
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

66 files changed

+2860
-563
lines changed

.github/workflows/mvn-build.yml

Lines changed: 0 additions & 21 deletions
This file was deleted.

README.adoc

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
= Spring Boot Migrator (SBM)
22

3+
image:https://badges.gitter.im/spring-boot-migrator/community.svg[link="https://gitter.im/spring-boot-migrator/community?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge"]
4+
35
[quote]
46
____
57
Spring Boot Migrator (SBM) aims to help developers upgrade or migrate to https://spring.io/projects/spring-boot[Spring Boot] by providing recipes for automated migrations.

applications/spring-shell/src/test/java/org/springframework/sbm/BootUpgrade_27_30_IntegrationTest.java

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,30 @@ void migrateSimpleApplication() {
5656
verifyAutoConfigurationIsRefactored();
5757
verifyEhCacheVersionIsUpgraded();
5858
verifyJohnzonCoreDependencyIsUpgraded();
59+
verifyWireMockDependency();
60+
verifySpringCloudDependency();
61+
}
62+
63+
private void verifyWireMockDependency() {
64+
Optional<Dependency> wireMock =
65+
getDependencyByArtifactId("wiremock-jre8-standalone");
66+
67+
assertThat(wireMock).isPresent();
68+
assertThat(wireMock.get().getVersion()).isEqualTo("2.34.0");
69+
}
70+
71+
private void verifySpringCloudDependency() {
72+
assertThat(getProperty("spring-cloud.version")).isEqualTo("2022.0.0-M4");
73+
}
74+
75+
private String getProperty(String property) {
76+
return getRootBuildFile()
77+
.getMarkers()
78+
.findFirst(MavenResolutionResult.class)
79+
.get()
80+
.getPom()
81+
.getProperties()
82+
.get(property);
5983
}
6084

6185
private void buildProject() {

applications/spring-shell/src/test/java/org/springframework/sbm/BootUpgrade_27_30_MultiModule_IntegrationTest.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -153,7 +153,8 @@ private void verifyPropertyConfigurationUpdate() {
153153
"spring.datasource.driverClassName=org.h2.Driver\n" +
154154
"spring.datasource.username=sa\n" +
155155
"spring.datasource.password=password\n" +
156-
"spring.jpa.database-platform=org.hibernate.dialect.H2Dialect\n");
156+
"spring.jpa.database-platform=org.hibernate.dialect.H2Dialect\n" +
157+
"logging.pattern.dateformat=yyyy-MM-dd HH:mm:ss.SSS\n");
157158
}
158159

159160
private void verifyEhCacheVersionIsUpgraded() {

applications/spring-shell/src/test/resources/testcode/boot-migration-27-30/pom.xml

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
<description>boot-upgrade-27_30</description>
1616
<properties>
1717
<java.version>17</java.version>
18+
<spring-cloud.version>2021.0.4</spring-cloud.version>
1819
</properties>
1920

2021
<dependencies>
@@ -35,6 +36,11 @@
3536
<artifactId>h2</artifactId>
3637
<scope>runtime</scope>
3738
</dependency>
39+
<dependency>
40+
<groupId>com.github.tomakehurst</groupId>
41+
<artifactId>wiremock-jre8</artifactId>
42+
<version>2.26.3</version>
43+
</dependency>
3844
<dependency>
3945
<groupId>io.projectreactor</groupId>
4046
<artifactId>reactor-core</artifactId>
@@ -54,7 +60,17 @@
5460
<scope>test</scope>
5561
</dependency>
5662
</dependencies>
57-
63+
<dependencyManagement>
64+
<dependencies>
65+
<dependency>
66+
<groupId>org.springframework.cloud</groupId>
67+
<artifactId>spring-cloud-dependencies</artifactId>
68+
<version>${spring-cloud.version}</version>
69+
<type>pom</type>
70+
<scope>import</scope>
71+
</dependency>
72+
</dependencies>
73+
</dependencyManagement>
5874
<repositories>
5975
<repository>
6076
<id>spring-snapshot</id>

ci/images/ci-image/Dockerfile

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ ENV JAVA_HOME /opt/openjdk
1515
ENV PATH $PATH:$JAVA_HOME/bin
1616
ENV MAVEN_HOME /usr/share/maven
1717
ENV MAVEN_CONFIG "$USER_HOME_DIR/.m2"
18+
ENV JAVA_TOOL_OPTIONS -Dfile.encoding=UTF8
1819

1920
ADD docker-lib.sh /docker-lib.sh
2021

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

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -195,6 +195,11 @@ public boolean contains(Path resourcePath) {
195195
return getModuleResources().stream().anyMatch(r -> r.getAbsolutePath().equals(resourcePath));
196196
}
197197

198+
@Override
199+
public String toString() {
200+
return getBuildFile().getSourcePath() + " [" + getBuildFile().getCoordinates() + "]";
201+
}
202+
198203
/**
199204
* Class provides filtering on the list of resources in a {@code ProjectResourceSet}.
200205
* As all read methods rely on {@code stream()}, only this stream has to be filtered. :fingers_crossed:

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

Lines changed: 24 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -143,7 +143,11 @@ public String getDisplayName() {
143143

144144
private final RewriteExecutionContext executionContext;
145145

146-
public OpenRewriteMavenBuildFile(Path absoluteProjectPath, Xml.Document sourceFile, ApplicationEventPublisher eventPublisher, RewriteExecutionContext executionContext) {
146+
147+
public OpenRewriteMavenBuildFile(Path absoluteProjectPath,
148+
Xml.Document sourceFile,
149+
ApplicationEventPublisher eventPublisher,
150+
RewriteExecutionContext executionContext) {
147151
super(absoluteProjectPath, sourceFile);
148152
this.eventPublisher = eventPublisher;
149153
this.executionContext = executionContext;
@@ -272,14 +276,25 @@ public List<Dependency> getRequestedDependencies() {
272276
.map(d -> mapDependency(d))
273277
.map(d -> {
274278
if(d.getType() == null || d.getClassifier() == null || d.getVersion() == null) {
275-
List<ResolvedDependency> dependencies = getPom().findDependencies(d.getGroupId(), d.getArtifactId(),
276-
d.getScope() != null ? Scope.fromName(d.getScope()) : null);
279+
280+
String groupId = evaluate(d.getGroupId());
281+
String artifactId = evaluate(d.getArtifactId());
282+
String version = evaluate(d.getVersion());
283+
284+
List<ResolvedDependency> dependencies = getPom().findDependencies(
285+
groupId,
286+
artifactId,
287+
d.getScope() != null ? Scope.fromName(d.getScope()) : null
288+
);
277289
ResolvedDependency resolvedDependency = dependencies.get(0);
278290
d.setVersion(resolvedDependency.getVersion());
279291
d.setClassifier(resolvedDependency.getClassifier());
280292
d.setType(resolvedDependency.getType());
293+
d.setArtifactId(artifactId);
294+
d.setGroupId(groupId);
295+
281296
if(d.getScope() == null ) {
282-
String s = resolveScope(d.getGroupId(), d.getArtifactId(), d.getType(), d.getClassifier());
297+
String s = resolveScope(groupId, artifactId, d.getType(), d.getClassifier());
283298
d.setScope(s);
284299
}
285300
}
@@ -359,19 +374,6 @@ private String resolveScope(String groupId, String artifactId, @Nullable String
359374
return managedScope != null ? managedScope.name().toLowerCase() : null;
360375
}
361376

362-
private String calculateVersion(org.openrewrite.maven.tree.Dependency d) {
363-
String version = null;
364-
if (d.getVersion() != null && !d.getVersion().startsWith("${")) {
365-
version = d.getVersion();
366-
} else {
367-
String managedVersion = getPom().getPom().getManagedVersion(d.getGroupId(), d.getArtifactId(), null, null);
368-
if (managedVersion != null) {
369-
version = managedVersion;
370-
}
371-
}
372-
return version;
373-
}
374-
375377
private org.springframework.sbm.build.api.Dependency mapDependency(Scope scope, ResolvedDependency d) {
376378
return new Dependency(
377379
d.getGroupId(),
@@ -627,9 +629,8 @@ public String getArtifactId() {
627629

628630
@Override
629631
public String getVersion() {
630-
return getPom().getPom().getVersion();
632+
return evaluate(getPom().getPom().getVersion());
631633
}
632-
633634
@Override
634635
public String getCoordinates() {
635636
return getGroupId() + ":" + getArtifactId() + ":" + getVersion();
@@ -886,4 +887,8 @@ public Tag visitTag(Tag tag, ExecutionContext context) {
886887
mavenVisitor.visitDocument(getSourceFile(), executionContext);
887888

888889
}
890+
891+
private String evaluate(String expression) {
892+
return getPom().getPom().getValue(expression);
893+
}
889894
}

components/sbm-core/src/main/java/org/springframework/sbm/build/migration/actions/AddMinimalPomXml.java

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,6 @@
2020
import freemarker.template.Template;
2121
import lombok.Setter;
2222
import org.openrewrite.Parser;
23-
import org.openrewrite.java.JavaParser;
2423
import org.openrewrite.xml.tree.Xml;
2524
import org.springframework.beans.factory.annotation.Autowired;
2625
import org.springframework.sbm.build.impl.OpenRewriteMavenBuildFile;
@@ -65,7 +64,10 @@ public void apply(ProjectContext context) {
6564
RewriteMavenParser rewriteMavenParser = new RewriteMavenParser();
6665
Parser.Input input = new Parser.Input(Path.of("pom.xml"), () -> new ByteArrayInputStream(src.getBytes(StandardCharsets.UTF_8)));
6766
Xml.Document maven = rewriteMavenParser.parseInputs(List.of(input), null, new RewriteExecutionContext(getEventPublisher())).get(0);
68-
OpenRewriteMavenBuildFile rewriteMavenBuildFile = new OpenRewriteMavenBuildFile(context.getProjectRootDirectory(), maven, getEventPublisher(), new RewriteExecutionContext(getEventPublisher()));
67+
OpenRewriteMavenBuildFile rewriteMavenBuildFile = new OpenRewriteMavenBuildFile(
68+
context.getProjectRootDirectory(),
69+
maven, getEventPublisher(), new RewriteExecutionContext(getEventPublisher())
70+
);
6971
context.getProjectResources().add(rewriteMavenBuildFile);
7072
}
7173
}

components/sbm-core/src/main/java/org/springframework/sbm/build/resource/BuildFileResourceWrapper.java

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,6 @@
3333
public class BuildFileResourceWrapper implements ProjectResourceWrapper<OpenRewriteMavenBuildFile> {
3434

3535
private final ApplicationEventPublisher eventPublisher;
36-
private final JavaParser javaParser;
3736

3837
@Override
3938
public boolean shouldHandle(RewriteSourceFileHolder<? extends SourceFile> rewriteSourceFileHolder) {
@@ -43,7 +42,12 @@ public boolean shouldHandle(RewriteSourceFileHolder<? extends SourceFile> rewrit
4342
@Override
4443
public OpenRewriteMavenBuildFile wrapRewriteSourceFileHolder(RewriteSourceFileHolder<? extends SourceFile> rewriteSourceFileHolder) {
4544
Xml.Document maven = (Xml.Document) rewriteSourceFileHolder.getSourceFile();
46-
return new OpenRewriteMavenBuildFile(rewriteSourceFileHolder.getAbsoluteProjectDir(), maven, eventPublisher, new RewriteExecutionContext(eventPublisher));
45+
46+
return new OpenRewriteMavenBuildFile(
47+
rewriteSourceFileHolder.getAbsoluteProjectDir(),
48+
maven, eventPublisher,
49+
new RewriteExecutionContext(eventPublisher)
50+
);
4751
}
4852

4953
}

components/sbm-core/src/main/java/org/springframework/sbm/engine/git/GitSupport.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -59,9 +59,8 @@ public static Optional<Repository> findRepository(File repo) {
5959
Optional<Repository> repository = Optional.empty();
6060
try {
6161
repository = Optional.of(new FileRepositoryBuilder().findGitDir(repo).setMustExist(true).build());
62-
6362
} catch (IllegalArgumentException | IOException e) {
64-
log.error("Could not find .git in the given directory '{}' or any of it's parents", repo, e);
63+
log.debug("Could not find .git in the given directory '{}' or any of it's parents", repo, e);
6564
}
6665
return repository;
6766
}

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@ public interface Method {
5151

5252
Visibility getVisibility();
5353

54-
String getReturnValue();
54+
Optional<String> getReturnValue();
5555

5656
void rename(String methodPattern, String newName);
5757

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

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -22,14 +22,14 @@
2222
import org.openrewrite.java.tree.J;
2323
import org.openrewrite.java.tree.JavaType;
2424
import org.openrewrite.java.tree.Statement;
25+
import org.openrewrite.java.tree.TypeTree;
2526
import org.openrewrite.java.tree.TypeUtils;
2627
import org.springframework.sbm.java.api.Annotation;
2728
import org.springframework.sbm.java.api.Method;
2829
import org.springframework.sbm.java.api.MethodParam;
2930
import org.springframework.sbm.java.api.Visibility;
3031
import org.springframework.sbm.java.refactoring.JavaRefactoring;
3132
import org.springframework.sbm.project.resource.RewriteSourceFileHolder;
32-
import org.springframework.sbm.project.resource.SbmApplicationProperties;
3333
import org.springframework.sbm.support.openrewrite.GenericOpenRewriteRecipe;
3434
import org.springframework.sbm.support.openrewrite.java.AddAnnotationVisitor;
3535
import org.springframework.sbm.support.openrewrite.java.RemoveAnnotationVisitor;
@@ -158,9 +158,13 @@ public Visibility getVisibility() {
158158
}
159159

160160
@Override
161-
public String getReturnValue() {
162-
JavaType.FullyQualified fullyQualified = TypeUtils.asFullyQualified(getMethodDecl().getReturnTypeExpression().getType());
163-
return fullyQualified.getFullyQualifiedName();
161+
public Optional<String> getReturnValue() {
162+
TypeTree returnTypeExpression = getMethodDecl().getReturnTypeExpression();
163+
if (returnTypeExpression == null || returnTypeExpression.getType() == JavaType.Primitive.Void) {
164+
return Optional.empty();
165+
}
166+
167+
return Optional.of(TypeUtils.asFullyQualified(returnTypeExpression.getType()).getFullyQualifiedName());
164168
}
165169

166170
// FIXME: renaming method should not require a methodPattern in this context

components/sbm-core/src/main/java/org/springframework/sbm/java/migration/visitor/VisitorUtils.java

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
import org.openrewrite.java.JavaIsoVisitor;
2222
import org.openrewrite.java.JavaVisitor;
2323
import org.openrewrite.java.MethodMatcher;
24+
import org.openrewrite.java.tree.Expression;
2425
import org.openrewrite.java.tree.J;
2526
import org.openrewrite.java.tree.J.MethodDeclaration;
2627
import org.openrewrite.java.tree.J.MethodInvocation;
@@ -151,7 +152,7 @@ public static class AdjustTypesFromExpressionMarkers extends Recipe {
151152

152153
@Override
153154
public String getDisplayName() {
154-
return "Adjustt type based on marked expressions";
155+
return "Adjust type based on marked expressions";
155156
}
156157

157158
@Override
@@ -161,12 +162,15 @@ protected TreeVisitor<?, ExecutionContext> getVisitor() {
161162
@Override
162163
public Return visitReturn(Return _return, ExecutionContext p) {
163164
Return r = super.visitReturn(_return, p);
164-
MarkReturnType marker = r.getExpression().getMarkers().findFirst(MarkReturnType.class).orElse(null);
165-
if (marker != null) {
166-
removeMarker(r.getExpression(), marker);
167-
MethodDeclaration method = getCursor().firstEnclosing(MethodDeclaration.class);
168-
if (method != null) {
169-
doAfterVisit(new ChangeMethodReturnTypeRecipe(m -> m.getId().equals(method.getId()), marker.getExpression(), marker.getImports()));
165+
Expression expression = r.getExpression();
166+
if (expression != null) {
167+
MarkReturnType marker = expression.getMarkers().findFirst(MarkReturnType.class).orElse(null);
168+
if (marker != null) {
169+
removeMarker(expression, marker);
170+
MethodDeclaration method = getCursor().firstEnclosing(MethodDeclaration.class);
171+
if (method != null) {
172+
doAfterVisit(new ChangeMethodReturnTypeRecipe(m -> m.getId().equals(method.getId()), marker.getExpression(), marker.getImports()));
173+
}
170174
}
171175
}
172176
return r;

0 commit comments

Comments
 (0)