Skip to content

Commit d28872f

Browse files
committed
wip
1 parent bf8dbf7 commit d28872f

File tree

7 files changed

+348
-2
lines changed

7 files changed

+348
-2
lines changed
Lines changed: 106 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,106 @@
1+
package org.openrewrite.maven;
2+
3+
import org.jetbrains.annotations.NotNull;
4+
import org.openrewrite.ExecutionContext;
5+
import org.openrewrite.Recipe;
6+
import org.openrewrite.TreeVisitor;
7+
import org.openrewrite.maven.tree.Maven;
8+
import org.openrewrite.xml.AddToTagVisitor;
9+
import org.openrewrite.xml.XPathMatcher;
10+
import org.openrewrite.xml.tree.Xml;
11+
import org.springframework.sbm.build.api.RepositoryDefinition;
12+
13+
import java.util.Optional;
14+
15+
public class AddMavenRepository extends Recipe {
16+
17+
private RepositoryDefinition mavenRepository;
18+
19+
public AddMavenRepository(RepositoryDefinition repository) {
20+
this.mavenRepository = repository;
21+
}
22+
23+
@Override
24+
public String getDisplayName() {
25+
return "Add a repository to Maven build file";
26+
}
27+
28+
@Override
29+
protected TreeVisitor<?, ExecutionContext> getVisitor() {
30+
return new AddRepositoryVisitor();
31+
}
32+
33+
private class AddRepositoryVisitor extends MavenVisitor {
34+
private AddRepositoryVisitor() {
35+
}
36+
37+
public Maven visitMaven(Maven maven, ExecutionContext ctx) {
38+
Xml.Tag parent = maven.getRoot();
39+
Optional<Xml.Tag> repositoriesTag = parent.getChild("repositories");
40+
if (repositoriesTag.isEmpty()) {
41+
addRepositoriesTag(parent);
42+
} else if(noRepositoryWithSameIdExists(repositoriesTag.get())){
43+
addRepositoryTag(repositoriesTag.get());
44+
}
45+
return super.visitMaven(maven, ctx);
46+
}
47+
48+
private boolean noRepositoryWithSameIdExists(Xml.Tag t) {
49+
return t.getChildren().stream().anyMatch(repo -> repo.getChildren().stream().anyMatch(c -> c.getName().equals("id") && false == c.getValue().get().equals(mavenRepository.getId())));
50+
}
51+
52+
private Xml.Tag addRepositoriesTag(Xml.Tag parent) {
53+
Xml.Tag repositoriesTag = Xml.Tag.build(
54+
"<repositories>\n" +
55+
renderRepositoryTag() +
56+
"</repositories>\n");
57+
this.doAfterVisit(new AddToTagVisitor(parent, repositoriesTag, new MavenTagInsertionComparator(parent.getChildren())));
58+
return repositoriesTag;
59+
}
60+
61+
private void addRepositoryTag(Xml.Tag parent) {
62+
AddToTagVisitor visitor = new AddToTagVisitor(parent, Xml.Tag.build(renderRepositoryTag()));
63+
this.doAfterVisit(visitor);
64+
}
65+
66+
private String renderRepositoryTag() {
67+
StringBuilder sb = new StringBuilder();
68+
sb.append("<repository>\n");
69+
sb.append("<id>" + mavenRepository.getId() + "</id>\n");
70+
if(mavenRepository.getName() != null) {
71+
sb.append("<name>").append(mavenRepository.getName()).append("</name>\n");
72+
}
73+
if(mavenRepository.getUrl() != null) {
74+
sb.append("<url>").append(mavenRepository.getUrl()).append("</url>\n");
75+
}
76+
if(mavenRepository.getReleasesEnabled() != null && mavenRepository.getReleasesEnabled() == true) {
77+
String releaseSection = renderSection("releases", mavenRepository.getReleasesChecksumPolicy(), mavenRepository.getReleasesUpdatePolicy());
78+
sb.append(releaseSection);
79+
}
80+
if(mavenRepository.getSnapshotsEnabled() != null && mavenRepository.getSnapshotsEnabled() == true) {
81+
String snapshotsSection = renderSection("snapshots", mavenRepository.getSnapshotsChecksumPolicy(), mavenRepository.getSnapShotsUpdatePolicy());
82+
sb.append(snapshotsSection);
83+
}
84+
sb.append("</repository>\n");
85+
return sb.toString();
86+
}
87+
88+
@NotNull
89+
private String renderSection(String type, String checksum, String update) {
90+
StringBuilder sb = new StringBuilder();
91+
92+
sb.append("<").append(type).append(">\n");
93+
sb.append("<enabled>true</enabled>\n");
94+
if (checksum != null) {
95+
sb.append("<checksumPolicy>").append(checksum).append("</checksumPolicy>\n");
96+
}
97+
if (update != null) {
98+
sb.append("<updatePolicy>").append(update).append("</updatePolicy>\n");
99+
}
100+
sb.append("</").append(type).append(">\n");
101+
return sb.toString();
102+
}
103+
104+
}
105+
106+
}
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
2+
package org.springframework.sbm.build.api;
3+
4+
import lombok.Builder;
5+
import lombok.Data;
6+
7+
@Data
8+
@Builder
9+
public class RepositoryDefinition {
10+
11+
private String id;
12+
private String url;
13+
private String name;
14+
private String layout;
15+
private Boolean snapshotsEnabled;
16+
private String snapshotsChecksumPolicy;
17+
private String snapShotsUpdatePolicy;
18+
private Boolean releasesEnabled;
19+
private String releasesChecksumPolicy;
20+
private String releasesUpdatePolicy;
21+
}

docs/boot-3.0.0-M3-upgrade.adoc

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
[plantuml,modules,png]
2+
....
3+
4+
component rewrite {
5+
}
6+
component "rewrite-spring" {
7+
}
8+
component "sbm-openrewrite-boot-upgrade" {
9+
}
10+
component "sbm-recipes-boot-upgrade" {
11+
}
12+
component "sbm-support-boot" {
13+
14+
}
15+
component "sbm-openrewrite" {
16+
}
17+
component "sbm-core" {
18+
19+
}
20+
21+
note left of sbm-openrewrite
22+
Only Helpers, Recipes and Visitors
23+
end note
24+
25+
note top of sbm-recipes-boot-upgrade
26+
Automated and manual SBM recipes
27+
for Spring Boot upgrades
28+
end note
29+
30+
note top of sbm-openrewrite-boot-upgrade
31+
No dependency on SBM,
32+
contains OpenRewrite Recipes and Visitors
33+
end note
34+
35+
36+
"sbm-support-boot" --> "sbm-core"
37+
"sbm-recipes-boot-upgrade" --> "sbm-support-boot"
38+
"sbm-recipes-boot-upgrade" --> "sbm-openrewrite-boot-upgrade"
39+
"sbm-recipes-boot-upgrade" --> "rewrite-spring"
40+
"sbm-core" --> "sbm-openrewrite"
41+
"sbm-openrewrite" --> rewrite
42+
"sbm-openrewrite-boot-upgrade" --> "sbm-openrewrite"
43+
"rewrite-spring" -> "rewrite"
44+
45+
46+
47+
....

spring-boot-upgrade-30/pom.xml

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,20 +15,31 @@
1515
~ limitations under the License.
1616
-->
1717

18-
<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">
18+
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
19+
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
1920
<modelVersion>4.0.0</modelVersion>
2021

2122
<groupId>org.springframework.sbm</groupId>
2223
<artifactId>spring-boot-upgrades-30</artifactId>
2324
<version>0.1.0-SNAPSHOT</version>
2425
<packaging>jar</packaging>
2526

27+
<properties>
28+
<maven.compiler.source>11</maven.compiler.source>
29+
<maven.compiler.target>11</maven.compiler.target>
30+
</properties>
31+
2632
<dependencies>
2733
<dependency>
2834
<groupId>org.openrewrite</groupId>
2935
<artifactId>rewrite-java</artifactId>
3036
<version>7.24.0</version>
3137
</dependency>
38+
<dependency>
39+
<groupId>org.openrewrite</groupId>
40+
<artifactId>rewrite-maven</artifactId>
41+
<version>7.24.0</version>
42+
</dependency>
3243
<dependency>
3344
<groupId>org.openrewrite</groupId>
3445
<artifactId>rewrite-java-17</artifactId>
Lines changed: 105 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,105 @@
1+
package org.openrewrite.java;
2+
3+
import org.jetbrains.annotations.NotNull;
4+
import org.openrewrite.ExecutionContext;
5+
import org.openrewrite.Recipe;
6+
import org.openrewrite.TreeVisitor;
7+
import org.openrewrite.maven.MavenIsoVisitor;
8+
import org.openrewrite.xml.AddToTagVisitor;
9+
import org.openrewrite.xml.tree.Xml;
10+
11+
import java.util.Optional;
12+
13+
public class AddMavenRepository extends Recipe {
14+
15+
private RepositoryDefinition mavenRepository;
16+
17+
public AddMavenRepository(RepositoryDefinition repository) {
18+
this.mavenRepository = repository;
19+
}
20+
21+
@Override
22+
public String getDisplayName() {
23+
return "Add a repository to Maven build file";
24+
}
25+
26+
@Override
27+
protected TreeVisitor<?, ExecutionContext> getVisitor() {
28+
return new AddRepositoryVisitor();
29+
}
30+
31+
private class AddRepositoryVisitor extends MavenIsoVisitor<ExecutionContext> {
32+
private AddRepositoryVisitor() {
33+
}
34+
35+
@Override
36+
public Xml.Document visitDocument(Xml.Document document, ExecutionContext ctx) {
37+
Xml.Tag parent = document.getRoot();
38+
Optional<Xml.Tag> repositoriesTag = parent.getChild("repositories");
39+
if (repositoriesTag.isEmpty()) {
40+
addRepositoriesTag(parent);
41+
} else if(noRepositoryWithSameIdExists(repositoriesTag.get())){
42+
addRepositoryTag(repositoriesTag.get());
43+
}
44+
return super.visitDocument(document, ctx);
45+
}
46+
47+
private boolean noRepositoryWithSameIdExists(Xml.Tag t) {
48+
return t.getChildren().stream().anyMatch(repo -> repo.getChildren().stream().anyMatch(c -> c.getName().equals("id") && false == c.getValue().get().equals(mavenRepository.getId())));
49+
}
50+
51+
private Xml.Tag addRepositoriesTag(Xml.Tag parent) {
52+
Xml.Tag repositoriesTag = Xml.Tag.build(
53+
"<repositories>\n" +
54+
renderRepositoryTag() +
55+
"</repositories>\n");
56+
this.doAfterVisit(new AddToTagVisitor(parent, repositoriesTag));
57+
return repositoriesTag;
58+
}
59+
60+
private void addRepositoryTag(Xml.Tag parent) {
61+
AddToTagVisitor visitor = new AddToTagVisitor(parent, Xml.Tag.build(renderRepositoryTag()));
62+
this.doAfterVisit(visitor);
63+
}
64+
65+
private String renderRepositoryTag() {
66+
StringBuilder sb = new StringBuilder();
67+
sb.append("<repository>\n");
68+
sb.append("<id>" + mavenRepository.getId() + "</id>\n");
69+
if(mavenRepository.getName() != null) {
70+
sb.append("<name>").append(mavenRepository.getName()).append("</name>\n");
71+
}
72+
if(mavenRepository.getUrl() != null) {
73+
sb.append("<url>").append(mavenRepository.getUrl()).append("</url>\n");
74+
}
75+
if(mavenRepository.getReleasesEnabled() != null && mavenRepository.getReleasesEnabled() == true) {
76+
String releaseSection = renderSection("releases", mavenRepository.getReleasesChecksumPolicy(), mavenRepository.getReleasesUpdatePolicy());
77+
sb.append(releaseSection);
78+
}
79+
if(mavenRepository.getSnapshotsEnabled() != null && mavenRepository.getSnapshotsEnabled() == true) {
80+
String snapshotsSection = renderSection("snapshots", mavenRepository.getSnapshotsChecksumPolicy(), mavenRepository.getSnapShotsUpdatePolicy());
81+
sb.append(snapshotsSection);
82+
}
83+
sb.append("</repository>\n");
84+
return sb.toString();
85+
}
86+
87+
@NotNull
88+
private String renderSection(String type, String checksum, String update) {
89+
StringBuilder sb = new StringBuilder();
90+
91+
sb.append("<").append(type).append(">\n");
92+
sb.append("<enabled>true</enabled>\n");
93+
if (checksum != null) {
94+
sb.append("<checksumPolicy>").append(checksum).append("</checksumPolicy>\n");
95+
}
96+
if (update != null) {
97+
sb.append("<updatePolicy>").append(update).append("</updatePolicy>\n");
98+
}
99+
sb.append("</").append(type).append(">\n");
100+
return sb.toString();
101+
}
102+
103+
}
104+
105+
}
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
package org.openrewrite.java;
2+
3+
import lombok.Builder;
4+
import lombok.Data;
5+
6+
@Data
7+
@Builder
8+
public class RepositoryDefinition {
9+
10+
private String id;
11+
private String url;
12+
private String name;
13+
private String layout;
14+
private Boolean snapshotsEnabled;
15+
private String snapshotsChecksumPolicy;
16+
private String snapShotsUpdatePolicy;
17+
private Boolean releasesEnabled;
18+
private String releasesChecksumPolicy;
19+
private String releasesUpdatePolicy;
20+
}
Lines changed: 37 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,48 @@
11
package org.openrewrite.java;
22

33
import org.junit.jupiter.api.Test;
4+
import org.openrewrite.Result;
5+
import org.openrewrite.java.tree.J;
6+
import org.openrewrite.maven.MavenParser;
7+
import org.openrewrite.test.RewriteTest;
8+
import org.openrewrite.xml.tree.Xml;
9+
10+
import java.util.List;
411

512
public class SomeTest {
613

714
@Test
815
void test() {
9-
// TODO:
16+
JavaParser javaParser = JavaParser.fromJavaVersion().build();
17+
String javaCode = "public class Banana {}";
18+
List<J.CompilationUnit> parse = javaParser.parse(javaCode);
19+
String recipeName = "";
20+
Result result = RewriteTest.fromRuntimeClasspath(recipeName)
21+
.run(parse)
22+
.get(0);
23+
24+
25+
}
26+
27+
@Test
28+
void testPom() {
29+
String pomXml =
30+
"<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" +
31+
" <modelVersion>4.0.0</modelVersion>\n" +
32+
" <groupId>org.springframework.sbm</groupId>\n" +
33+
" <artifactId>spring-boot-upgrades-30</artifactId>\n" +
34+
" <version>0.1.0-SNAPSHOT</version>\n" +
35+
" <packaging>jar</packaging>\n" +
36+
"</project>";
37+
List<Xml.Document> parse = MavenParser.builder().build().parse(pomXml);
38+
List<Result> run = new AddMavenRepository(RepositoryDefinition.builder()
39+
.id("spring-milestone")
40+
.url("some.url")
41+
.name("spring-milestone")
42+
.build())
43+
.run(parse);
44+
45+
System.out.println(run.get(0).getAfter().printAll());
1046
}
1147

1248
}

0 commit comments

Comments
 (0)