mavenPoms = parser.parse(List.of(projectResource.getAbsolutePath()), null, executionContext);
+ Xml.Document mavenPom = mavenPoms.get(0);
+ OpenRewriteMavenBuildFile buildFile = new OpenRewriteMavenBuildFile(absoluteProjectDir, mavenPom, eventPublisher, javaParser, executionContext);
projectResources.replace(i, buildFile);
result.add(buildFile);
}
diff --git a/components/sbm-core/src/main/java/org/springframework/sbm/build/impl/Refactoring.java b/components/sbm-core/src/main/java/org/springframework/sbm/build/impl/Refactoring.java
index 61f62fb0c..85fe0a10a 100644
--- a/components/sbm-core/src/main/java/org/springframework/sbm/build/impl/Refactoring.java
+++ b/components/sbm-core/src/main/java/org/springframework/sbm/build/impl/Refactoring.java
@@ -20,9 +20,10 @@
import org.openrewrite.Result;
import org.openrewrite.maven.MavenParser;
import org.openrewrite.maven.MavenVisitor;
-import org.openrewrite.maven.tree.Maven;
+import org.openrewrite.xml.tree.Xml;
import org.springframework.sbm.project.resource.RewriteSourceFileHolder;
import org.springframework.sbm.support.openrewrite.GenericOpenRewriteRecipe;
+import org.springframework.util.ReflectionUtils;
import java.util.Arrays;
import java.util.List;
@@ -31,7 +32,7 @@
@RequiredArgsConstructor
class Refactoring {
- private final RewriteSourceFileHolder pom;
+ private final RewriteSourceFileHolder pom;
public void execute(MavenVisitor... visitors) {
List results = Arrays.stream(visitors)
@@ -64,8 +65,8 @@ private void processResult(Result result) {
MavenParser parser = MavenParser
.builder()
.build();
- Maven wrappedMavenFile = parser.parse(result.getAfter().printAll()).get(0);
- wrappedMavenFile = (Maven) wrappedMavenFile.withSourcePath(pom.getSourceFile().getSourcePath());
+ Xml.Document wrappedMavenFile = parser.parse(result.getAfter().printAll()).get(0);
+ wrappedMavenFile = (Xml.Document) wrappedMavenFile.withSourcePath(pom.getSourceFile().getSourcePath());
pom.replaceWith(wrappedMavenFile);
}
}
diff --git a/components/sbm-core/src/main/java/org/springframework/sbm/build/impl/RewriteMavenArtifactDownloader.java b/components/sbm-core/src/main/java/org/springframework/sbm/build/impl/RewriteMavenArtifactDownloader.java
new file mode 100644
index 000000000..9b59a4a1d
--- /dev/null
+++ b/components/sbm-core/src/main/java/org/springframework/sbm/build/impl/RewriteMavenArtifactDownloader.java
@@ -0,0 +1,54 @@
+/*
+ * 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.build.impl;
+
+import lombok.extern.slf4j.Slf4j;
+import lombok.extern.slf4j.XSlf4j;
+import org.openrewrite.internal.lang.Nullable;
+import org.openrewrite.ipc.http.HttpSender;
+import org.openrewrite.maven.MavenSettings;
+import org.openrewrite.maven.cache.LocalMavenArtifactCache;
+import org.openrewrite.maven.cache.MavenArtifactCache;
+import org.openrewrite.maven.cache.ReadOnlyLocalMavenArtifactCache;
+import org.openrewrite.maven.utilities.MavenArtifactDownloader;
+import org.springframework.stereotype.Component;
+
+import java.nio.file.Paths;
+import java.util.function.Consumer;
+
+@Slf4j
+@Component
+public class RewriteMavenArtifactDownloader extends MavenArtifactDownloader {
+
+ // TODO: #7 make artifactCache configurable
+ public RewriteMavenArtifactDownloader() {
+ super(
+ new LocalMavenArtifactCache(Paths.get(System.getProperty("user.home"), ".m2", "repository")).orElse(
+ new LocalMavenArtifactCache(Paths.get(System.getProperty("user.home"), ".rewrite", "cache", "artifacts"))
+ ),
+ null,
+ (t) -> log.error("Error while downloading dependencies", t)
+ );
+
+// super(new LocalMavenArtifactCache(Paths.get(System.getProperty("user.home"), ".m2", "repository")),
+// null,
+// (t) -> log.error("Error while downloading dependencies", t));
+ }
+
+ public RewriteMavenArtifactDownloader(MavenArtifactCache mavenArtifactCache, @Nullable MavenSettings settings, HttpSender httpSender, Consumer onError) {
+ super(mavenArtifactCache, settings, httpSender, onError);
+ }
+}
diff --git a/components/sbm-core/src/main/java/org/springframework/sbm/build/impl/RewriteMavenParser.java b/components/sbm-core/src/main/java/org/springframework/sbm/build/impl/RewriteMavenParser.java
index 00fa0a17a..dd6aedf88 100644
--- a/components/sbm-core/src/main/java/org/springframework/sbm/build/impl/RewriteMavenParser.java
+++ b/components/sbm-core/src/main/java/org/springframework/sbm/build/impl/RewriteMavenParser.java
@@ -15,30 +15,40 @@
*/
package org.springframework.sbm.build.impl;
-import org.springframework.sbm.openrewrite.RewriteExecutionContext;
import org.jetbrains.annotations.NotNull;
import org.openrewrite.ExecutionContext;
import org.openrewrite.Parser;
import org.openrewrite.internal.lang.Nullable;
import org.openrewrite.maven.MavenParser;
-import org.openrewrite.maven.tree.Maven;
+import org.openrewrite.xml.tree.Xml;
+import org.springframework.sbm.openrewrite.RewriteExecutionContext;
import org.springframework.stereotype.Component;
import java.nio.file.Path;
import java.util.List;
+import java.util.Optional;
@Component
-public class RewriteMavenParser implements Parser {
+public class RewriteMavenParser implements Parser {
private final MavenParser parser;
+ // FIXME: #7 This does not work for singleton Spring bean, also profiles and cache cannot be changed
+ public RewriteMavenParser(Path projectRoot) {
+ this.parser = initMavenParser(new RewriteExecutionContext(), Optional.ofNullable(projectRoot));
+ }
+
public RewriteMavenParser() {
- this.parser = initMavenParser(new RewriteExecutionContext());
+ this.parser = initMavenParser(new RewriteExecutionContext(), Optional.empty());
}
@NotNull
- private MavenParser initMavenParser(RewriteExecutionContext executionContext) {
+ private MavenParser initMavenParser(RewriteExecutionContext executionContext, Optional projectRoot) {
MavenParser.Builder builder = MavenParser.builder();
+ if(projectRoot.isPresent()) {
+ builder.mavenConfig(projectRoot.get().resolve(".mvn/maven.config"));
+ }
+ builder.build();
// if(executionContext.getMavenProfiles().length > 0) {
// builder.activeProfiles(executionContext.getMavenProfiles());
// }
@@ -52,12 +62,12 @@ private MavenParser initMavenParser(RewriteExecutionContext executionContext) {
}
@Override
- public List parse(String... sources) {
+ public List parse(String... sources) {
return parser.parse(sources);
}
@Override
- public List parseInputs(Iterable sources, @Nullable Path relativeTo, ExecutionContext ctx) {
+ public List parseInputs(Iterable sources, @Nullable Path relativeTo, ExecutionContext ctx) {
return parser.parseInputs(sources, relativeTo, ctx);
}
@@ -65,4 +75,9 @@ public List parseInputs(Iterable sources, @Nullable Path relativeT
public boolean accept(Path path) {
return parser.accept(path);
}
+
+ @Override
+ public Path sourcePathFromSourceText(Path prefix, String sourceCode) {
+ return parser.sourcePathFromSourceText(prefix, sourceCode);
+ }
}
diff --git a/components/sbm-core/src/main/java/org/springframework/sbm/build/migration/MavenPomCacheProvider.java b/components/sbm-core/src/main/java/org/springframework/sbm/build/migration/MavenPomCacheProvider.java
index 763c2bb03..81f3df4df 100644
--- a/components/sbm-core/src/main/java/org/springframework/sbm/build/migration/MavenPomCacheProvider.java
+++ b/components/sbm-core/src/main/java/org/springframework/sbm/build/migration/MavenPomCacheProvider.java
@@ -15,47 +15,36 @@
*/
package org.springframework.sbm.build.migration;
-import org.springframework.sbm.engine.annotations.StatefulComponent;
import org.jetbrains.annotations.NotNull;
import org.openrewrite.maven.cache.InMemoryMavenPomCache;
-import org.openrewrite.maven.cache.MapdbMavenPomCache;
import org.openrewrite.maven.cache.MavenPomCache;
import org.openrewrite.maven.cache.RocksdbMavenPomCache;
+import org.springframework.sbm.engine.annotations.StatefulComponent;
import javax.annotation.PostConstruct;
-import java.io.File;
import java.nio.file.Path;
-import java.nio.file.Paths;
@StatefulComponent
public class MavenPomCacheProvider {
- private MavenPomCache pomCache;
-
- @PostConstruct
- void postConstruct() {
- pomCache = inMemory(); //rocksdb(); // mapdb();
- }
-
- public MavenPomCache getPomCache() {
- return pomCache == null ? inMemory() : pomCache;
- }
-
- private MavenPomCache inMemory() {
- return new InMemoryMavenPomCache();
- }
-
- private void mapdb() {
- File workspace = Paths.get(System.getProperty("user.home"), ".rewrite", "cache", "poms").toFile();
- new MapdbMavenPomCache(
- workspace,
- null
- );
- }
-
- @NotNull
- private RocksdbMavenPomCache rocksdb() {
- return new RocksdbMavenPomCache(Path.of(".").toAbsolutePath());
- }
+ private MavenPomCache pomCache;
+
+ @PostConstruct
+ void postConstruct() {
+ pomCache = rocksdb();
+ }
+
+ public MavenPomCache getPomCache() {
+ return pomCache == null ? inMemory() : pomCache;
+ }
+
+ private MavenPomCache inMemory() {
+ return new InMemoryMavenPomCache();
+ }
+
+ @NotNull
+ private RocksdbMavenPomCache rocksdb() {
+ return new RocksdbMavenPomCache(Path.of(".").toAbsolutePath());
+ }
}
diff --git a/components/sbm-core/src/main/java/org/springframework/sbm/build/migration/actions/AddMinimalPomXml.java b/components/sbm-core/src/main/java/org/springframework/sbm/build/migration/actions/AddMinimalPomXml.java
index 1bedb5b27..1d8b57296 100644
--- a/components/sbm-core/src/main/java/org/springframework/sbm/build/migration/actions/AddMinimalPomXml.java
+++ b/components/sbm-core/src/main/java/org/springframework/sbm/build/migration/actions/AddMinimalPomXml.java
@@ -16,17 +16,18 @@
package org.springframework.sbm.build.migration.actions;
import com.fasterxml.jackson.annotation.JsonIgnore;
-import org.springframework.sbm.build.impl.OpenRewriteMavenBuildFile;
-import org.springframework.sbm.build.impl.RewriteMavenParser;
-import org.springframework.sbm.engine.context.ProjectContext;
-import org.springframework.sbm.engine.recipe.AbstractAction;
-import org.springframework.sbm.openrewrite.RewriteExecutionContext;
import freemarker.template.Configuration;
import freemarker.template.Template;
import lombok.Setter;
import org.openrewrite.Parser;
-import org.openrewrite.maven.tree.Maven;
+import org.openrewrite.java.JavaParser;
+import org.openrewrite.xml.tree.Xml;
import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.sbm.build.impl.OpenRewriteMavenBuildFile;
+import org.springframework.sbm.build.impl.RewriteMavenParser;
+import org.springframework.sbm.engine.context.ProjectContext;
+import org.springframework.sbm.engine.recipe.AbstractAction;
+import org.springframework.sbm.openrewrite.RewriteExecutionContext;
import java.io.ByteArrayInputStream;
import java.io.StringWriter;
@@ -43,6 +44,11 @@ public class AddMinimalPomXml extends AbstractAction {
@Setter
private Configuration configuration;
+ @Autowired
+ @JsonIgnore
+ @Setter
+ private JavaParser javaParser;
+
@Override
public void apply(ProjectContext context) {
String projectDir = context.getProjectRootDirectory().toString();
@@ -63,9 +69,9 @@ public void apply(ProjectContext context) {
String src = writer.toString();
RewriteMavenParser rewriteMavenParser = new RewriteMavenParser();
Parser.Input input = new Parser.Input(Path.of("pom.xml"), () -> new ByteArrayInputStream(src.getBytes(StandardCharsets.UTF_8)));
- Maven maven = rewriteMavenParser.parseInputs(List.of(input), null, new RewriteExecutionContext(getEventPublisher())).get(0);
+ Xml.Document maven = rewriteMavenParser.parseInputs(List.of(input), null, new RewriteExecutionContext(getEventPublisher())).get(0);
// Maven document = (Maven) maven.withSourcePath(Path.of("pom.xml"));
- OpenRewriteMavenBuildFile rewriteMavenBuildFile = new OpenRewriteMavenBuildFile(context.getProjectRootDirectory(), maven, getEventPublisher(), new RewriteExecutionContext(getEventPublisher()));
+ OpenRewriteMavenBuildFile rewriteMavenBuildFile = new OpenRewriteMavenBuildFile(context.getProjectRootDirectory(), maven, getEventPublisher(), javaParser, new RewriteExecutionContext(getEventPublisher()));
context.getProjectResources().add(rewriteMavenBuildFile);
}
}
diff --git a/components/sbm-core/src/main/java/org/springframework/sbm/build/migration/actions/AddRepositoryAction.java b/components/sbm-core/src/main/java/org/springframework/sbm/build/migration/actions/AddRepositoryAction.java
new file mode 100644
index 000000000..36d83246f
--- /dev/null
+++ b/components/sbm-core/src/main/java/org/springframework/sbm/build/migration/actions/AddRepositoryAction.java
@@ -0,0 +1,75 @@
+/*
+ * 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.build.migration.actions;
+
+import lombok.Setter;
+import org.springframework.sbm.build.api.RepositoryDefinition;
+import org.springframework.sbm.engine.context.ProjectContext;
+import org.springframework.sbm.engine.recipe.AbstractAction;
+
+/**
+ * Adds Repository to pom.xml
+ */
+@Setter
+public class AddRepositoryAction extends AbstractAction {
+
+ private String id;
+ private String url;
+ private String name;
+ private String layout;
+ private Boolean snapshotsEnabled;
+ private String snapshotsChecksumPolicy;
+ private String snapShotsUpdatePolicy;
+ private Boolean releasesEnabled;
+ private String releasesChecksumPolicy;
+ private String releasesUpdatePolicy;
+
+
+ @Override
+ public void apply(ProjectContext context) {
+ RepositoryDefinition.RepositoryDefinitionBuilder builder = RepositoryDefinition.builder();
+
+ builder.id(id)
+ .name(name)
+ .url(url);
+
+ if (snapshotsEnabled != null) {
+ builder.snapshotsEnabled(snapshotsEnabled);
+ }
+ if (snapShotsUpdatePolicy != null) {
+ builder.snapShotsUpdatePolicy(snapShotsUpdatePolicy);
+ }
+ if (snapshotsChecksumPolicy != null) {
+ builder.snapshotsChecksumPolicy(snapshotsChecksumPolicy);
+ }
+
+ if (releasesEnabled != null) {
+ builder.releasesEnabled(releasesEnabled);
+ }
+ if (releasesUpdatePolicy != null) {
+ builder.releasesUpdatePolicy(releasesUpdatePolicy);
+ }
+ if (releasesChecksumPolicy != null) {
+ builder.releasesChecksumPolicy(releasesChecksumPolicy);
+ }
+ if (layout != null) {
+ builder.layout(layout);
+ }
+
+ RepositoryDefinition repository = builder.build();
+ context.getApplicationModules().getRootModule().getBuildFile().addRepository(repository);
+ }
+}
diff --git a/components/sbm-core/src/main/java/org/springframework/sbm/build/migration/actions/BumpParentPomVersion.java b/components/sbm-core/src/main/java/org/springframework/sbm/build/migration/actions/BumpParentPomVersion.java
new file mode 100644
index 000000000..af95c5228
--- /dev/null
+++ b/components/sbm-core/src/main/java/org/springframework/sbm/build/migration/actions/BumpParentPomVersion.java
@@ -0,0 +1,53 @@
+/*
+ * 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.build.migration.actions;
+
+import lombok.Setter;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.sbm.build.api.ApplicationModule;
+import org.springframework.sbm.build.api.BuildFile;
+import org.springframework.sbm.engine.context.ProjectContext;
+import org.springframework.sbm.engine.recipe.AbstractAction;
+
+import javax.validation.constraints.NotNull;
+
+@Slf4j
+public class BumpParentPomVersion extends AbstractAction {
+
+ @Setter
+ @NotNull
+ private String groupId;
+ @Setter
+ @NotNull
+ private String artifactId;
+ @Setter
+ @NotNull
+ private String toVersion;
+
+ @Override
+ public void apply(ProjectContext context) {
+ context.getApplicationModules().stream()
+ .map(ApplicationModule::getBuildFile)
+ .filter(BuildFile::hasParent)
+ .filter(b -> b.getParentPomDeclaration().get().getGroupId().equals(groupId))
+ .filter(b -> b.getParentPomDeclaration().get().getArtifactId().equals(artifactId))
+ .forEach(b -> b.upgradeParentVersion(toVersion));
+ }
+
+ private boolean hasParentPom(ProjectContext context) {
+ return context.getBuildFile().hasParent();
+ }
+}
diff --git a/components/sbm-core/src/main/java/org/springframework/sbm/build/migration/actions/SetProperty.java b/components/sbm-core/src/main/java/org/springframework/sbm/build/migration/actions/SetProperty.java
new file mode 100644
index 000000000..351db127c
--- /dev/null
+++ b/components/sbm-core/src/main/java/org/springframework/sbm/build/migration/actions/SetProperty.java
@@ -0,0 +1,32 @@
+/*
+ * 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.build.migration.actions;
+
+import lombok.Setter;
+import org.springframework.sbm.engine.context.ProjectContext;
+import org.springframework.sbm.engine.recipe.AbstractAction;
+
+@Setter
+public class SetProperty extends AbstractAction {
+
+ private String propertyName;
+ private String propertyValue;
+
+ @Override
+ public void apply(ProjectContext context) {
+ context.getBuildFile().setProperty(propertyName, propertyValue);
+ }
+}
diff --git a/components/sbm-core/src/main/java/org/springframework/sbm/build/migration/conditions/NoRepositoryExistsCondition.java b/components/sbm-core/src/main/java/org/springframework/sbm/build/migration/conditions/NoRepositoryExistsCondition.java
new file mode 100644
index 000000000..e1ea32278
--- /dev/null
+++ b/components/sbm-core/src/main/java/org/springframework/sbm/build/migration/conditions/NoRepositoryExistsCondition.java
@@ -0,0 +1,38 @@
+/*
+ * 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.build.migration.conditions;
+
+import lombok.Setter;
+import org.springframework.sbm.engine.context.ProjectContext;
+import org.springframework.sbm.engine.recipe.Condition;
+
+@Setter
+public class NoRepositoryExistsCondition implements Condition {
+
+ private String id;
+ private String url;
+
+ @Override
+ public String getDescription() {
+ return "Check that no Repository definition with same id or url exists";
+ }
+
+ @Override
+ public boolean evaluate(ProjectContext context) {
+ return context.getBuildFile().getRepositories().stream()
+ .noneMatch(r -> r.getId().equals(id) || r.getUrl().equals(url));
+ }
+}
diff --git a/components/sbm-core/src/main/java/org/springframework/sbm/build/migration/recipe/AddMavenPlugin.java b/components/sbm-core/src/main/java/org/springframework/sbm/build/migration/recipe/AddMavenPlugin.java
index 04c3164a8..ca0a088de 100644
--- a/components/sbm-core/src/main/java/org/springframework/sbm/build/migration/recipe/AddMavenPlugin.java
+++ b/components/sbm-core/src/main/java/org/springframework/sbm/build/migration/recipe/AddMavenPlugin.java
@@ -15,19 +15,20 @@
*/
package org.springframework.sbm.build.migration.recipe;
-import org.springframework.sbm.build.api.Plugin;
import lombok.Data;
import lombok.EqualsAndHashCode;
import org.openrewrite.ExecutionContext;
import org.openrewrite.Recipe;
import org.openrewrite.TreeVisitor;
import org.openrewrite.maven.MavenVisitor;
-import org.openrewrite.maven.tree.Maven;
import org.openrewrite.xml.AddToTagVisitor;
import org.openrewrite.xml.ChangeTagValueVisitor;
import org.openrewrite.xml.XPathMatcher;
+import org.openrewrite.xml.tree.Content;
import org.openrewrite.xml.tree.Xml;
+import org.springframework.sbm.build.api.Plugin;
+import java.util.List;
import java.util.Optional;
import java.util.stream.Collectors;
@@ -35,128 +36,127 @@
@EqualsAndHashCode(callSuper = true)
public class AddMavenPlugin extends Recipe {
- private static final XPathMatcher BUILD_MATCHER = new XPathMatcher("/project/build");
-
- private final Plugin plugin;
-
- @Override
- protected TreeVisitor, ExecutionContext> getVisitor() {
- return new AddPluginVisitor();
- }
-
- private class AddPluginVisitor extends MavenVisitor {
-
- @Override
- public Maven visitMaven(Maven maven, ExecutionContext ctx) {
- Xml.Tag root = maven.getRoot();
- if (!root.getChild("build").isPresent()) {
- doAfterVisit(new AddToTagVisitor<>(root,
- Xml.Tag.build("\n" +
- "\n" +
- createPluginTagString() +
- "\n" +
- ""),
- new MavenTagInsertionComparator(root.getChildren())));
- }
-
- return super.visitMaven(maven, ctx);
- }
-
-
- public Xml visitTag(Xml.Tag tag, ExecutionContext ctx) {
- Xml.Tag t = (Xml.Tag) super.visitTag(tag, ctx);
- if (BUILD_MATCHER.matches(this.getCursor())) {
- Optional maybePlugins = t.getChild("plugins");
- if (!maybePlugins.isPresent()) {
- this.doAfterVisit(new AddToTagVisitor(t, Xml.Tag.build("")));
- } else {
- Xml.Tag plugins = maybePlugins.get();
- Optional maybePlugin = plugins.getChildren().stream().filter((pluginx) -> {
- return pluginx.getName().equals("plugin") && plugin.getGroupId().equals(pluginx.getChildValue("groupId").orElse(null)) &&
- plugin.getArtifactId().equals(pluginx.getChildValue("artifactId").orElse(null));
- }).findAny();
- if (maybePlugin.isPresent()) {
- Xml.Tag plugin = maybePlugin.get();
- if (AddMavenPlugin.this.plugin.getVersion() != null && !AddMavenPlugin.this.plugin.getVersion().equals(plugin.getChildValue("version").orElse(null))) {
- this.doAfterVisit(new ChangeTagValueVisitor(plugin.getChild("version").get(), AddMavenPlugin.this.plugin.getVersion()));
- }
- } else {
- Xml.Tag pluginTag = Xml.Tag.build(createPluginTagString());
- this.doAfterVisit(new AddToTagVisitor(plugins, pluginTag));
- }
- }
- }
-
- return t;
- }
- }
-
- private String createPluginTagString() {
- StringBuilder sb = new StringBuilder();
- sb.append("\n");
- sb.append("");
- sb.append(plugin.getGroupId());
- sb.append("\n");
- sb.append("");
- sb.append(plugin.getArtifactId());
- sb.append("\n");
- sb.append(renderVersion());
- sb.append(renderExecutions());
- sb.append(plugin.getConfiguration() != null ? plugin.getConfiguration().trim() + "\n" : "");
- sb.append(plugin.getDependencies() != null ? plugin.getDependencies().trim() + "\n" : "");
- sb.append("\n");
- return sb.toString();
- }
-
- private String renderGoal(String goal) {
- return "" + goal + "";
- }
-
- private String renderVersion() {
- return plugin.getVersion() != null ? "" + plugin.getVersion() + "\n" : "";
- }
-
- private String renderExecutions() {
- if (plugin.getExecutions() == null || plugin.getExecutions().isEmpty()) return "";
- String executions = AddMavenPlugin.this.plugin.getExecutions().stream()
- .map(this::renderExecution)
- .collect(Collectors.joining("\n"));
- return "\n" + executions + "\n\n";
- }
-
- private String renderExecution(Plugin.Execution execution) {
- return "\n" +
- renderId(execution) +
- renderGoals(execution) +
- renderPhase(execution) +
- renderConfiguration(execution) +
- "";
- }
-
- private String renderConfiguration(Plugin.Execution execution) {
- return execution.getConfiguration() == null ? "" : execution.getConfiguration().trim();
- }
-
- private String renderId(Plugin.Execution execution) {
- return execution.getId() != null && !execution.getId().isBlank() ? "" + execution.getId() + "\n" : "";
- }
-
- private String renderGoals(Plugin.Execution execution) {
- if (execution.getGoals() == null || execution.getGoals().isEmpty()) return "";
- String goals = execution.getGoals()
- .stream()
- .map(this::renderGoal)
- .collect(Collectors.joining("\n"));
- return "\n" + goals + "\n\n";
- }
-
- private String renderPhase(Plugin.Execution execution) {
- return execution.getPhase() == null ? "" : "" + execution.getPhase() + "";
- }
-
- @Override
- public String getDisplayName() {
- return "Add Maven Plugin";
- }
+ private static final XPathMatcher BUILD_MATCHER = new XPathMatcher("/project/build");
+
+ private final Plugin plugin;
+
+ @Override
+ protected TreeVisitor, ExecutionContext> getVisitor() {
+ return new AddPluginVisitor();
+ }
+
+ private class AddPluginVisitor extends MavenVisitor {
+
+ @Override
+ public Xml.Document visitDocument(Xml.Document maven, ExecutionContext ctx) {
+ Xml.Document m = (Xml.Document) super.visitDocument(maven, ctx);
+
+ Xml.Tag root = maven.getRoot();
+ if (!root.getChild("build").isPresent()) {
+ List collect = root.getContent().stream().map(Content.class::cast).collect(Collectors.toList());
+ doAfterVisit(new AddToTagVisitor<>(root,
+ Xml.Tag.build(
+ "\n" + "\n" + createPluginTagString() + "\n" + ""),
+ new MavenTagInsertionComparator(collect)));
+ }
+
+ return m;
+ }
+
+ public Xml visitTag(Xml.Tag tag, ExecutionContext ctx) {
+ Xml.Tag t = (Xml.Tag) super.visitTag(tag, ctx);
+ if (BUILD_MATCHER.matches(this.getCursor())) {
+ Optional maybePlugins = t.getChild("plugins");
+ if (!maybePlugins.isPresent()) {
+ this.doAfterVisit(new AddToTagVisitor(t, Xml.Tag.build("")));
+ }
+ else {
+ Xml.Tag plugins = maybePlugins.get();
+ Optional maybePlugin = plugins.getChildren().stream().filter((pluginx) -> {
+ return pluginx.getName().equals("plugin")
+ && plugin.getGroupId().equals(pluginx.getChildValue("groupId").orElse(null))
+ && plugin.getArtifactId().equals(pluginx.getChildValue("artifactId").orElse(null));
+ }).findAny();
+ if (maybePlugin.isPresent()) {
+ Xml.Tag plugin = maybePlugin.get();
+ if (AddMavenPlugin.this.plugin.getVersion() != null && !AddMavenPlugin.this.plugin.getVersion()
+ .equals(plugin.getChildValue("version").orElse(null))) {
+ this.doAfterVisit(new ChangeTagValueVisitor(plugin.getChild("version").get(),
+ AddMavenPlugin.this.plugin.getVersion()));
+ }
+ }
+ else {
+ Xml.Tag pluginTag = Xml.Tag.build(createPluginTagString());
+ this.doAfterVisit(new AddToTagVisitor(plugins, pluginTag));
+ }
+ }
+ }
+
+ return t;
+ }
+
+ }
+
+ private String createPluginTagString() {
+ StringBuilder sb = new StringBuilder();
+ sb.append("\n");
+ sb.append("");
+ sb.append(plugin.getGroupId());
+ sb.append("\n");
+ sb.append("");
+ sb.append(plugin.getArtifactId());
+ sb.append("\n");
+ sb.append(renderVersion());
+ sb.append(renderExecutions());
+ sb.append(plugin.getConfiguration() != null ? plugin.getConfiguration().trim() + "\n" : "");
+ sb.append(plugin.getDependencies() != null ? plugin.getDependencies().trim() + "\n" : "");
+ sb.append("\n");
+ return sb.toString();
+ }
+
+ private String renderGoal(String goal) {
+ return "" + goal + "";
+ }
+
+ private String renderVersion() {
+ return plugin.getVersion() != null ? "" + plugin.getVersion() + "\n" : "";
+ }
+
+ private String renderExecutions() {
+ if (plugin.getExecutions() == null || plugin.getExecutions().isEmpty())
+ return "";
+ String executions = AddMavenPlugin.this.plugin.getExecutions().stream().map(this::renderExecution)
+ .collect(Collectors.joining("\n"));
+ return "\n" + executions + "\n\n";
+ }
+
+ private String renderExecution(Plugin.Execution execution) {
+ return "\n" + renderId(execution) + renderGoals(execution) + renderPhase(execution)
+ + renderConfiguration(execution) + "";
+ }
+
+ private String renderConfiguration(Plugin.Execution execution) {
+ return execution.getConfiguration() == null ? "" : execution.getConfiguration().trim();
+ }
+
+ private String renderId(Plugin.Execution execution) {
+ return execution.getId() != null && !execution.getId().isBlank() ? "" + execution.getId() + "\n" : "";
+ }
+
+ private String renderGoals(Plugin.Execution execution) {
+ if (execution.getGoals() == null || execution.getGoals().isEmpty())
+ return "";
+ String goals = execution.getGoals().stream().map(this::renderGoal).collect(Collectors.joining("\n"));
+ return "\n" + goals + "\n\n";
+ }
+
+ private String renderPhase(Plugin.Execution execution) {
+ return execution.getPhase() == null ? "" : "" + execution.getPhase() + "";
+ }
+
+ @Override
+ public String getDisplayName() {
+ return "Add Maven Plugin";
+ }
}
diff --git a/components/sbm-core/src/main/java/org/springframework/sbm/build/migration/recipe/MavenTagInsertionComparator.java b/components/sbm-core/src/main/java/org/springframework/sbm/build/migration/recipe/MavenTagInsertionComparator.java
index a2677750f..6df33775d 100644
--- a/components/sbm-core/src/main/java/org/springframework/sbm/build/migration/recipe/MavenTagInsertionComparator.java
+++ b/components/sbm-core/src/main/java/org/springframework/sbm/build/migration/recipe/MavenTagInsertionComparator.java
@@ -15,6 +15,7 @@
*/
package org.springframework.sbm.build.migration.recipe;
+import org.openrewrite.xml.tree.Content;
import org.openrewrite.xml.tree.Xml;
import java.util.*;
@@ -28,7 +29,7 @@
* GAV coordinates, SCM, properties, but before plugins.
* "After" ordering preference takes priority over "before".
*/
-class MavenTagInsertionComparator implements Comparator {
+class MavenTagInsertionComparator implements Comparator {
private static final List canonicalOrdering = Arrays.asList(
"modelVersion",
"parent",
@@ -62,15 +63,14 @@ class MavenTagInsertionComparator implements Comparator {
"profiles"
);
- private final Map existingIndices = new IdentityHashMap<>();
+ private final Map existingIndices = new IdentityHashMap<>();
- MavenTagInsertionComparator(List existingTags) {
+ MavenTagInsertionComparator(List existingTags) {
for (int i = 0; i < existingTags.size(); i++) {
existingIndices.put(existingTags.get(i), i);
}
}
- @Override
public int compare(Xml.Tag t1, Xml.Tag t2) {
int i1 = existingIndices.getOrDefault(t1, -1);
int i2 = existingIndices.getOrDefault(t2, -1);
@@ -102,4 +102,12 @@ public int compare(Xml.Tag t1, Xml.Tag t2) {
}
}
}
+
+ @Override
+ public int compare(Content o1, Content o2) {
+ if(Xml.Tag.class.isInstance(o1) && Xml.Tag.class.isInstance(o2)) {
+ return compare(Xml.Tag.class.cast(o1), Xml.Tag.class.cast(o2));
+ }
+ return o1.getPrefix().compareTo(o2.getPrefix());
+ }
}
diff --git a/components/sbm-core/src/main/java/org/springframework/sbm/build/migration/recipe/RemoveMavenPlugin.java b/components/sbm-core/src/main/java/org/springframework/sbm/build/migration/recipe/RemoveMavenPlugin.java
index a80400b56..d6c85e9c5 100644
--- a/components/sbm-core/src/main/java/org/springframework/sbm/build/migration/recipe/RemoveMavenPlugin.java
+++ b/components/sbm-core/src/main/java/org/springframework/sbm/build/migration/recipe/RemoveMavenPlugin.java
@@ -47,7 +47,7 @@ protected TreeVisitor, ExecutionContext> getVisitor() {
return new RemoveMavenPluginVisitor();
}
- private class RemoveMavenPluginVisitor extends MavenVisitor {
+ private class RemoveMavenPluginVisitor extends MavenVisitor {
@Override
public Xml visitTag(Xml.Tag tag, ExecutionContext ctx) {
@@ -59,7 +59,7 @@ public Xml visitTag(Xml.Tag tag, ExecutionContext ctx) {
private boolean hasGroupAndArtifact(String groupId, String artifactId) {
Xml.Tag tag = getCursor().getValue();
- return groupId.equals(tag.getChildValue("groupId").orElse(model.getGroupId())) &&
+ return groupId.equals(tag.getChildValue("groupId").get()) &&
tag.getChildValue("artifactId")
.map(a -> a.equals(artifactId))
.orElse(artifactId == null);
diff --git a/components/sbm-core/src/main/java/org/springframework/sbm/build/migration/visitor/AddOrUpdateDependencyManagement.java b/components/sbm-core/src/main/java/org/springframework/sbm/build/migration/visitor/AddOrUpdateDependencyManagement.java
index 789d6e1e5..17309252c 100644
--- a/components/sbm-core/src/main/java/org/springframework/sbm/build/migration/visitor/AddOrUpdateDependencyManagement.java
+++ b/components/sbm-core/src/main/java/org/springframework/sbm/build/migration/visitor/AddOrUpdateDependencyManagement.java
@@ -15,13 +15,13 @@
*/
package org.springframework.sbm.build.migration.visitor;
-import org.springframework.sbm.build.api.Dependency;
import org.openrewrite.ExecutionContext;
import org.openrewrite.maven.MavenVisitor;
-import org.openrewrite.xml.AutoFormat;
+import org.openrewrite.xml.format.AutoFormat;
import org.openrewrite.xml.tree.Content;
import org.openrewrite.xml.tree.Xml;
import org.openrewrite.xml.tree.Xml.Tag;
+import org.springframework.sbm.build.api.Dependency;
import org.springframework.util.Assert;
import java.util.ArrayList;
@@ -29,7 +29,7 @@
import java.util.List;
import java.util.function.Predicate;
-public class AddOrUpdateDependencyManagement extends MavenVisitor {
+public class AddOrUpdateDependencyManagement extends MavenVisitor {
/*
* What does this visitor do?
diff --git a/components/sbm-core/src/main/java/org/springframework/sbm/build/migration/visitor/RemoveDependencyVersion.java b/components/sbm-core/src/main/java/org/springframework/sbm/build/migration/visitor/RemoveDependencyVersion.java
index f226076fa..368bab7d2 100644
--- a/components/sbm-core/src/main/java/org/springframework/sbm/build/migration/visitor/RemoveDependencyVersion.java
+++ b/components/sbm-core/src/main/java/org/springframework/sbm/build/migration/visitor/RemoveDependencyVersion.java
@@ -20,7 +20,7 @@
import org.openrewrite.*;
import org.openrewrite.internal.lang.Nullable;
import org.openrewrite.maven.MavenVisitor;
-import org.openrewrite.maven.tree.Pom;
+import org.openrewrite.maven.tree.ResolvedDependency;
import org.openrewrite.maven.tree.Scope;
import org.openrewrite.xml.RemoveContentVisitor;
import org.openrewrite.xml.tree.Xml;
@@ -72,17 +72,19 @@ public Validated validate() {
scope, s -> !Scope.Invalid.equals(Scope.fromName(s))));
}
- private class RemoveDependencyVersionVisitor extends MavenVisitor {
+ private class RemoveDependencyVersionVisitor extends MavenVisitor {
+
@Override
public Xml visitTag(Xml.Tag tag, ExecutionContext ctx) {
if (isDependencyTag(groupId, artifactId)) {
- Pom.Dependency dependency = findDependency(tag);
+ ResolvedDependency dependency = findDependency(tag);
Optional versionTag = tag.getChild("version");
if (dependency != null && versionTag.isPresent()) {
Scope checkScope = scope != null ? Scope.fromName(scope) : null;
- if (checkScope == null || checkScope == dependency.getScope() ||
- (dependency.getScope() != null && dependency.getScope().isInClasspathOf(checkScope))) {
+ if (checkScope == null ||
+ checkScope.equals(dependency.getRequested().getScope()) ||
+ (dependency.getRequested().getScope() != null && Scope.fromName(dependency.getRequested().getScope()).isInClasspathOf(checkScope))) {
doAfterVisit(new RemoveContentVisitor<>(versionTag.get(), true));
}
}
@@ -90,6 +92,5 @@ public Xml visitTag(Xml.Tag tag, ExecutionContext ctx) {
return super.visitTag(tag, ctx);
}
-
}
}
diff --git a/components/sbm-core/src/main/java/org/springframework/sbm/build/migration/visitor/SetPackaging.java b/components/sbm-core/src/main/java/org/springframework/sbm/build/migration/visitor/SetPackaging.java
deleted file mode 100644
index 045da4357..000000000
--- a/components/sbm-core/src/main/java/org/springframework/sbm/build/migration/visitor/SetPackaging.java
+++ /dev/null
@@ -1,153 +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.build.migration.visitor;
-
-import org.openrewrite.ExecutionContext;
-import org.openrewrite.Option;
-import org.openrewrite.Recipe;
-import org.openrewrite.TreeVisitor;
-import org.openrewrite.internal.lang.Nullable;
-import org.openrewrite.maven.MavenVisitor;
-import org.openrewrite.maven.tree.Maven;
-import org.openrewrite.maven.tree.Pom;
-import org.openrewrite.xml.AddToTagVisitor;
-import org.openrewrite.xml.ChangeTagValueVisitor;
-import org.openrewrite.xml.XPathMatcher;
-import org.openrewrite.xml.tree.Content;
-import org.openrewrite.xml.tree.Xml;
-import org.springframework.util.ReflectionUtils;
-
-import java.lang.reflect.Field;
-import java.util.Map;
-import java.util.Optional;
-import java.util.stream.Collectors;
-
-/**
- * @author Alex Boyko
- */
-public class SetPackaging extends Recipe {
-
- private static final XPathMatcher PACKAGING_MATCHER = new XPathMatcher("/project/packaging");
- private static final XPathMatcher PROJECT_MATCHER = new XPathMatcher("/project");
-
- @Option(
- displayName = "Packaging",
- description = "The type of packaging to set",
- example = "jar"
- )
- @Nullable
- private final String packaging;
-
- public SetPackaging(String packaging) {
- this.packaging = packaging;
- }
-
- public String getDisplayName() {
- return "Set Maven project packaging type";
- }
-
- public String getDescription() {
- return "Sets the packaging type of the Maven project. Either adds the packaging tag if it is missing or changes its context if present. If 'null' specified the tag will be removed";
- }
-
- protected boolean canEqual(@Nullable final Object other) {
- return other instanceof SetPackaging;
- }
-
- protected TreeVisitor, ExecutionContext> getVisitor() {
- return new SetPackagingVisitor();
- }
-
- private class SetPackagingVisitor extends MavenVisitor {
-
- private Xml.Tag foundPackagingTag = null;
-
- @Override
- public Maven visitMaven(Maven maven, ExecutionContext ctx) {
- Maven m = super.visitMaven(maven, ctx);
- Pom pom = m.getModel();
- // TODO: Replace this Recipe with ChangePackaging from Rewrite
- Field reflectionOverridesField = ReflectionUtils.findField(Pom.class, "propertyOverrides");
- ReflectionUtils.makeAccessible(reflectionOverridesField);
- Map effectiveProperties = (Map) ReflectionUtils.getField(reflectionOverridesField, pom);
- Pom recreatedPom = Pom.build(
- pom.getGroupId(),
- pom.getArtifactId(),
- pom.getVersion(),
- pom.getDatedSnapshotVersion(),
- pom.getName(),
- pom.getDescription(),
- packaging,
- pom.getClassifier(),
- pom.getParent(),
- pom.getDependencies(),
- pom.getDependencyManagement(),
- pom.getLicenses(),
- pom.getRepositories(),
- pom.getProperties(),
- effectiveProperties,
- false
- );
- if (recreatedPom.equals(m.getModel())) {
- // TODO: discuss with Rewrite
- return m;
- } else {
- return m.withModel(recreatedPom);
- }
- }
-
- @Override
- public Xml visitTag(Xml.Tag tag, ExecutionContext context) {
- if (PROJECT_MATCHER.matches(getCursor())) {
- return visitProjectTag(tag, context);
- } else if (PACKAGING_MATCHER.matches(getCursor())) {
- return visitPackagingTag(tag, context);
- } else {
- return super.visitTag(tag, context);
- }
- }
-
- private Xml.Tag visitProjectTag(Xml.Tag tag, ExecutionContext context) {
- Xml.Tag t = (Xml.Tag) super.visitTag(tag, context);
- if (foundPackagingTag != null) {
- if (packaging == null) {
- t = t.withContent(t.getContent().stream().filter(c -> c != foundPackagingTag).collect(Collectors.toList()));
- }
- } else {
- if (packaging != null) {
- doAfterVisit(new AddToTagVisitor(t, Xml.Tag.build("" + packaging + "")));
- }
- }
- return t;
- }
-
- private Xml.Tag visitPackagingTag(Xml.Tag tag, ExecutionContext context) {
- foundPackagingTag = tag;
- if (packaging != null) {
- Optional extends Content> presentPackaging = tag.getContent().stream()
- .filter(Xml.CharData.class::isInstance)
- .filter(cd -> packaging.equalsIgnoreCase(((Xml.CharData) cd).getText()))
- .findFirst();
- if (presentPackaging.isEmpty()) {
- doAfterVisit(new ChangeTagValueVisitor(tag, packaging));
- }
- }
- return tag;
- }
-
- }
-
-}
diff --git a/components/sbm-core/src/main/java/org/springframework/sbm/build/resource/BuildFileResourceWrapper.java b/components/sbm-core/src/main/java/org/springframework/sbm/build/resource/BuildFileResourceWrapper.java
index 05ec02eef..c373d132f 100644
--- a/components/sbm-core/src/main/java/org/springframework/sbm/build/resource/BuildFileResourceWrapper.java
+++ b/components/sbm-core/src/main/java/org/springframework/sbm/build/resource/BuildFileResourceWrapper.java
@@ -15,15 +15,16 @@
*/
package org.springframework.sbm.build.resource;
-import org.springframework.sbm.build.impl.OpenRewriteMavenBuildFile;
-import org.springframework.sbm.openrewrite.RewriteExecutionContext;
-import org.springframework.sbm.project.resource.ProjectResourceWrapper;
-import org.springframework.sbm.project.resource.RewriteSourceFileHolder;
import lombok.RequiredArgsConstructor;
import org.openrewrite.SourceFile;
-import org.openrewrite.maven.tree.Maven;
+import org.openrewrite.java.JavaParser;
+import org.openrewrite.xml.tree.Xml;
import org.springframework.context.ApplicationEventPublisher;
import org.springframework.core.annotation.Order;
+import org.springframework.sbm.build.impl.OpenRewriteMavenBuildFile;
+import org.springframework.sbm.openrewrite.RewriteExecutionContext;
+import org.springframework.sbm.project.resource.ProjectResourceWrapper;
+import org.springframework.sbm.project.resource.RewriteSourceFileHolder;
import org.springframework.stereotype.Component;
@Component
@@ -32,16 +33,17 @@
public class BuildFileResourceWrapper implements ProjectResourceWrapper {
private final ApplicationEventPublisher eventPublisher;
+ private final JavaParser javaParser;
@Override
public boolean shouldHandle(RewriteSourceFileHolder extends SourceFile> rewriteSourceFileHolder) {
- return Maven.class.isAssignableFrom(rewriteSourceFileHolder.getSourceFile().getClass());
+ return Xml.Document.class.isAssignableFrom(rewriteSourceFileHolder.getSourceFile().getClass()) && rewriteSourceFileHolder.getAbsolutePath().endsWith("pom.xml");
}
@Override
public OpenRewriteMavenBuildFile wrapRewriteSourceFileHolder(RewriteSourceFileHolder extends SourceFile> rewriteSourceFileHolder) {
- Maven maven = Maven.class.cast(rewriteSourceFileHolder.getSourceFile());
- return new OpenRewriteMavenBuildFile(rewriteSourceFileHolder.getAbsoluteProjectDir(), maven, eventPublisher, new RewriteExecutionContext(eventPublisher));
+ Xml.Document maven = (Xml.Document) rewriteSourceFileHolder.getSourceFile();
+ return new OpenRewriteMavenBuildFile(rewriteSourceFileHolder.getAbsoluteProjectDir(), maven, eventPublisher, javaParser, new RewriteExecutionContext(eventPublisher));
}
}
diff --git a/components/sbm-core/src/main/java/org/springframework/sbm/common/migration/actions/DocumentationExtraction.java b/components/sbm-core/src/main/java/org/springframework/sbm/common/migration/actions/DocumentationExtraction.java
index a480b0fbc..beb63eaea 100644
--- a/components/sbm-core/src/main/java/org/springframework/sbm/common/migration/actions/DocumentationExtraction.java
+++ b/components/sbm-core/src/main/java/org/springframework/sbm/common/migration/actions/DocumentationExtraction.java
@@ -32,7 +32,7 @@ public class DocumentationExtraction extends AbstractAction {
public void apply(ProjectContext context) {
Path rootDirectory = context.getProjectRootDirectory();
- context.getApplicationModules().list().forEach(module -> {
+ context.getModules().forEach(module -> {
Path sourcePath = module.getBaseJavaSourceLocation().getSourceFolder();
Path sourceDir = rootDirectory.relativize(sourcePath);
module.getMainJavaSources().stream()
diff --git a/components/sbm-core/src/main/java/org/springframework/sbm/engine/context/ProjectContext.java b/components/sbm-core/src/main/java/org/springframework/sbm/engine/context/ProjectContext.java
index 557ab8171..5afcbb0e3 100644
--- a/components/sbm-core/src/main/java/org/springframework/sbm/engine/context/ProjectContext.java
+++ b/components/sbm-core/src/main/java/org/springframework/sbm/engine/context/ProjectContext.java
@@ -15,6 +15,7 @@
*/
package org.springframework.sbm.engine.context;
+import org.openrewrite.java.JavaParser;
import org.springframework.sbm.build.api.ApplicationModule;
import org.springframework.sbm.build.api.ApplicationModules;
import org.springframework.sbm.build.api.BuildFile;
@@ -42,19 +43,31 @@ public class ProjectContext {
private BasePackageCalculator basePackageCalculator;
private final ProjectResourceSet projectResources;
private String revision;
+ private final JavaParser javaParser;
- public ProjectContext(JavaRefactoringFactory javaRefactoringFactory, Path projectRootDirectory, ProjectResourceSet projectResources, BasePackageCalculator basePackageCalculator) {
+ public ProjectContext(JavaRefactoringFactory javaRefactoringFactory, Path projectRootDirectory, ProjectResourceSet projectResources, BasePackageCalculator basePackageCalculator, JavaParser javaParser) {
this.projectRootDirectory = projectRootDirectory.toAbsolutePath();
this.projectResources = projectResources;
this.javaRefactoringFactory = javaRefactoringFactory;
this.basePackageCalculator = basePackageCalculator;
+ this.javaParser = javaParser;
}
public ProjectResourceSet getProjectResources() {
return projectResources;
}
+ public List getModules() {
+ return search(new BuildFileProjectResourceFilter()).stream()
+ .map(this::mapToModule)
+ .collect(Collectors.toList());
+ }
+ private ApplicationModule mapToModule(BuildFile buildFile) {
+ String buildFileName = "";
+ Path modulePath = projectRootDirectory.relativize(buildFile.getAbsolutePath().getParent());
+ return new ApplicationModule(buildFileName, buildFile, projectRootDirectory, modulePath, getProjectResources(), javaRefactoringFactory, basePackageCalculator, javaParser);
+ }
public BuildFile getBuildFile() {
return search(new RootBuildFileFilter());
@@ -70,15 +83,7 @@ public ProjectJavaSources getProjectJavaSources() {
}
public ApplicationModules getApplicationModules() {
- List applicationModules = search(new BuildFileProjectResourceFilter()).stream()
- .map(this::mapToModule)
- .collect(Collectors.toList());
- return new ApplicationModules(applicationModules);
+ return new ApplicationModules(getModules());
}
- private ApplicationModule mapToModule(BuildFile buildFile) {
- String buildFileName = "";
- Path modulePath = projectRootDirectory.relativize(buildFile.getAbsolutePath().getParent());
- return new ApplicationModule(buildFileName, buildFile, projectRootDirectory, modulePath, getProjectResources(), javaRefactoringFactory, basePackageCalculator);
- }
}
diff --git a/components/sbm-core/src/main/java/org/springframework/sbm/engine/context/ProjectContextFactory.java b/components/sbm-core/src/main/java/org/springframework/sbm/engine/context/ProjectContextFactory.java
index d055dc8ec..7cb62286c 100644
--- a/components/sbm-core/src/main/java/org/springframework/sbm/engine/context/ProjectContextFactory.java
+++ b/components/sbm-core/src/main/java/org/springframework/sbm/engine/context/ProjectContextFactory.java
@@ -15,6 +15,7 @@
*/
package org.springframework.sbm.engine.context;
+import org.openrewrite.java.JavaParser;
import org.springframework.sbm.build.api.BuildFile;
import org.springframework.sbm.build.filter.BuildFileProjectResourceFilter;
import org.springframework.sbm.java.refactoring.JavaRefactoringFactory;
@@ -37,6 +38,7 @@ public class ProjectContextFactory {
private final ProjectResourceSetHolder projectResourceSetHolder;
private final JavaRefactoringFactory javaRefactoringFactory;
private final BasePackageCalculator basePackageCalculator;
+ private final JavaParser javaParser;
@NotNull
public ProjectContext createProjectContext(Path projectDir, ProjectResourceSet projectResourceSet) {
@@ -44,7 +46,7 @@ public ProjectContext createProjectContext(Path projectDir, ProjectResourceSet p
applyProjectResourceWrappers(projectResourceSet);
List buildFiles = new BuildFileProjectResourceFilter().apply(projectResourceSet);
ClasspathRegistry.initializeFromBuildFiles(buildFiles);
- ProjectContext projectContext = new ProjectContext(javaRefactoringFactory, projectDir, projectResourceSet, basePackageCalculator);
+ ProjectContext projectContext = new ProjectContext(javaRefactoringFactory, projectDir, projectResourceSet, basePackageCalculator, javaParser);
return projectContext;
}
diff --git a/components/sbm-core/src/main/java/org/springframework/sbm/engine/events/StartDownloadingDependencyEvent.java b/components/sbm-core/src/main/java/org/springframework/sbm/engine/events/StartDownloadingDependencyEvent.java
index 9866ab951..8a2c1a92d 100644
--- a/components/sbm-core/src/main/java/org/springframework/sbm/engine/events/StartDownloadingDependencyEvent.java
+++ b/components/sbm-core/src/main/java/org/springframework/sbm/engine/events/StartDownloadingDependencyEvent.java
@@ -16,13 +16,13 @@
package org.springframework.sbm.engine.events;
import lombok.Getter;
-import org.openrewrite.maven.tree.Pom;
+import org.openrewrite.maven.tree.Dependency;
public class StartDownloadingDependencyEvent {
@Getter
- private final Pom.Dependency dependency;
+ private final Dependency dependency;
- public StartDownloadingDependencyEvent(Pom.Dependency d) {
+ public StartDownloadingDependencyEvent(Dependency d) {
this.dependency = d;
}
}
diff --git a/components/sbm-core/src/main/java/org/springframework/sbm/engine/recipe/Action.java b/components/sbm-core/src/main/java/org/springframework/sbm/engine/recipe/Action.java
index 4697db861..1467aebe1 100644
--- a/components/sbm-core/src/main/java/org/springframework/sbm/engine/recipe/Action.java
+++ b/components/sbm-core/src/main/java/org/springframework/sbm/engine/recipe/Action.java
@@ -36,7 +36,7 @@ default void applyWithStatusEvent(ProjectContext context) {
try {
apply(context);
} catch(Exception e) {
- throw new ActionFailedException("Action ["+ getClass().getName()+"] with description '"+this.getDescription()+"' failed: " + e.getMessage(), e);
+ throw new ActionFailedException("'"+this.getDescription()+"' failed: " + e.getMessage(), e);
}
if (eventPublisher != null) {
eventPublisher.publishEvent(new ActionFinishedEvent(getDescription()));
diff --git a/components/sbm-core/src/main/java/org/springframework/sbm/java/JavaSourceProjectResourceWrapper.java b/components/sbm-core/src/main/java/org/springframework/sbm/java/JavaSourceProjectResourceWrapper.java
index 7731dd37e..3f7ef28c3 100644
--- a/components/sbm-core/src/main/java/org/springframework/sbm/java/JavaSourceProjectResourceWrapper.java
+++ b/components/sbm-core/src/main/java/org/springframework/sbm/java/JavaSourceProjectResourceWrapper.java
@@ -15,6 +15,7 @@
*/
package org.springframework.sbm.java;
+import org.openrewrite.java.JavaParser;
import org.springframework.sbm.java.impl.OpenRewriteJavaSource;
import org.springframework.sbm.java.refactoring.JavaRefactoring;
import org.springframework.sbm.java.refactoring.JavaRefactoringFactory;
@@ -30,6 +31,7 @@
public class JavaSourceProjectResourceWrapper implements ProjectResourceWrapper {
private final JavaRefactoringFactory javaRefactoringFactory;
+ private final JavaParser javaParser;
@Override
public boolean shouldHandle(RewriteSourceFileHolder extends SourceFile> rewriteSourceFileHolder) {
@@ -40,6 +42,6 @@ public boolean shouldHandle(RewriteSourceFileHolder extends SourceFile> rewrit
public OpenRewriteJavaSource wrapRewriteSourceFileHolder(RewriteSourceFileHolder extends SourceFile> rewriteSourceFileHolder) {
J.CompilationUnit compilationUnit = J.CompilationUnit.class.cast(rewriteSourceFileHolder.getSourceFile());
JavaRefactoring refactoring = javaRefactoringFactory.createRefactoring(compilationUnit);
- return new OpenRewriteJavaSource(rewriteSourceFileHolder.getAbsoluteProjectDir(), compilationUnit, refactoring);
+ return new OpenRewriteJavaSource(rewriteSourceFileHolder.getAbsoluteProjectDir(), compilationUnit, refactoring, javaParser);
}
}
diff --git a/components/sbm-core/src/main/java/org/springframework/sbm/java/api/JavaSource.java b/components/sbm-core/src/main/java/org/springframework/sbm/java/api/JavaSource.java
index 2faa013db..540eeea3d 100644
--- a/components/sbm-core/src/main/java/org/springframework/sbm/java/api/JavaSource.java
+++ b/components/sbm-core/src/main/java/org/springframework/sbm/java/api/JavaSource.java
@@ -69,4 +69,6 @@ public interface JavaSource extends ProjectResource {
String print();
void removeUnusedImports();
+
+ void replaceImport(String p, String replace);
}
diff --git a/components/sbm-core/src/main/java/org/springframework/sbm/java/impl/ClasspathRegistry.java b/components/sbm-core/src/main/java/org/springframework/sbm/java/impl/ClasspathRegistry.java
index bc38300cb..cb9b01e99 100644
--- a/components/sbm-core/src/main/java/org/springframework/sbm/java/impl/ClasspathRegistry.java
+++ b/components/sbm-core/src/main/java/org/springframework/sbm/java/impl/ClasspathRegistry.java
@@ -15,13 +15,14 @@
*/
package org.springframework.sbm.java.impl;
-import org.springframework.sbm.build.api.BuildFile;
-import org.springframework.sbm.project.parser.DependencyHelper;
-import org.springframework.sbm.project.resource.RewriteSourceFileHolder;
import lombok.extern.slf4j.Slf4j;
-import org.openrewrite.maven.tree.Maven;
-import org.openrewrite.maven.tree.Pom;
+import org.openrewrite.maven.internal.MavenPomDownloader;
+import org.openrewrite.maven.tree.ResolvedDependency;
import org.openrewrite.maven.tree.Scope;
+import org.springframework.sbm.build.api.BuildFile;
+import org.springframework.sbm.build.impl.OpenRewriteMavenBuildFile;
+import org.springframework.sbm.build.impl.RewriteMavenArtifactDownloader;
+import org.springframework.sbm.project.parser.DependencyHelper;
import java.nio.file.Path;
import java.util.*;
@@ -35,111 +36,123 @@
@Slf4j
public class ClasspathRegistry {
- private static DependencyHelper dependencyHelper = new DependencyHelper();
-
- /**
- * Dependencies found during scan.
- * These dependencies are immutable.
- */
- private final ConcurrentSkipListMap initialDependencies = new ConcurrentSkipListMap(Comparator.comparing(Pom.Dependency::getCoordinates));
-
- /**
- * Dependencies at the current state of migration.
- * These dependencies can change over time when dependencies were added or removed by {@code Action}s.
- */
- private final ConcurrentSkipListMap currentDependencies = new ConcurrentSkipListMap(Comparator.comparing(Pom.Dependency::getCoordinates));
-
-
- private ClasspathRegistry() {
- }
-
- public static ClasspathRegistry initialize(Set dependencies) {
- return DependenciesRegistryHolder.initialDependencies(dependencies);
- }
-
- public static void initialize(List> buildFiles) {
- Set effectiveDependencies = new HashSet<>();
- buildFiles.forEach(bf -> {
- effectiveDependencies.addAll(bf.getSourceFile().getModel().getDependencies(Scope.Compile));
- effectiveDependencies.addAll(bf.getSourceFile().getModel().getDependencies(Scope.Test));
- effectiveDependencies.addAll(bf.getSourceFile().getModel().getDependencies(Scope.Provided));
- effectiveDependencies.addAll(bf.getSourceFile().getModel().getDependencies(Scope.Runtime));
- // TODO: system ?
- });
- ClasspathRegistry.initialize(effectiveDependencies);
- }
-
- public static void initializeFromBuildFiles(List buildFiles) {
- ClasspathRegistry.getInstance().clear();
- Set effectiveDependencies = new HashSet<>();
- buildFiles.forEach(bf -> {
- effectiveDependencies.addAll(bf.getEffectiveDependencies(Scope.Compile));
- effectiveDependencies.addAll(bf.getEffectiveDependencies(Scope.Test));
- effectiveDependencies.addAll(bf.getEffectiveDependencies(Scope.Provided));
- effectiveDependencies.addAll(bf.getEffectiveDependencies(Scope.Runtime));
- // TODO: system ?
- });
- ClasspathRegistry.initialize(effectiveDependencies);
- }
-
- public void clear() {
- initialDependencies.clear();
- currentDependencies.clear();
- }
-
- private static class DependenciesRegistryHolder {
- public static final ClasspathRegistry INSTANCE = new ClasspathRegistry();
-
- public static ClasspathRegistry initialDependencies(Set dependencies) {
- INSTANCE.initDependencies(dependencies);
- return INSTANCE;
- }
- }
-
- public static ClasspathRegistry getInstance() {
- return DependenciesRegistryHolder.INSTANCE;
- }
-
- public void addDependency(Pom.Dependency... deps) {
- Arrays.asList(deps).forEach(dep -> {
- initDependency(dep, currentDependencies);
- });
- }
-
- public void removeDependency(Pom.Dependency... deps) {
- Arrays.asList(deps).forEach(currentDependencies::remove);
- }
-
- public void removeDependency(String... coordinates) {
- Arrays.asList(coordinates)
- .forEach(coordinate -> currentDependencies.keySet().forEach(dep -> {
- if (dep.getCoordinates().equals(coordinate)) {
- currentDependencies.remove(coordinate);
- }
- }));
- }
-
- public Set getInitialDependencies() {
- return new HashSet<>(initialDependencies.values());
- }
-
- public Set getCurrentDependencies() {
- return new HashSet<>(currentDependencies.values());
- }
-
- private void initDependencies(Set deps) {
- initialDependencies.clear();
- currentDependencies.clear();
- deps.forEach(dep -> {
- initDependency(dep, initialDependencies, currentDependencies);
- });
- }
-
- private void initDependency(Pom.Dependency d, Map... maps) {
- Optional dependencyPath = dependencyHelper.downloadArtifact(d);
- if (dependencyPath.isPresent()) {
- Stream.of(maps).forEach(m -> m.put(d, dependencyPath.get()));
- }
- }
+ private static final DependencyHelper dependencyHelper = new DependencyHelper();
+
+ /**
+ * Dependencies found during scan. These dependencies are immutable.
+ */
+ private final ConcurrentSkipListMap initialDependencies = new ConcurrentSkipListMap(
+ Comparator.comparing(r -> r.getGav().toString()));
+
+ /**
+ * Dependencies at the current state of migration. These dependencies can change over
+ * time when dependencies were added or removed by {@code Action}s.
+ */
+ private final ConcurrentSkipListMap currentDependencies = new ConcurrentSkipListMap(
+ Comparator.comparing(r -> r.getGav().toString()));
+
+ private ClasspathRegistry() {
+ }
+
+ public static ClasspathRegistry initialize(Set dependencies) {
+ return DependenciesRegistryHolder.initialDependencies(dependencies);
+ }
+
+ // FIXME: remove unused method
+ // public static void initialize(List>
+ // buildFiles) {
+ // Set effectiveDependencies = new HashSet<>();
+ // buildFiles.forEach(bf -> {
+ // });
+ // ClasspathRegistry.initialize(effectiveDependencies);
+ // }
+
+ public static void initializeFromBuildFiles(List buildFiles) {
+ ClasspathRegistry.getInstance().clear();
+ Set effectiveDependencies = new HashSet<>();
+ buildFiles.forEach(bf -> {
+ Map> dependencies = ((OpenRewriteMavenBuildFile) bf).getPom().getDependencies();
+ // FIXME: #7 respect scope
+ effectiveDependencies.addAll(dependencies.get(Scope.Compile));
+ effectiveDependencies.addAll(dependencies.get(Scope.Test));
+ effectiveDependencies.addAll(dependencies.get(Scope.Provided));
+ effectiveDependencies.addAll(dependencies.get(Scope.Runtime));
+ });
+ ClasspathRegistry.initialize(effectiveDependencies);
+ }
+
+ private static org.openrewrite.maven.tree.Dependency mapToRewriteDependency(
+ org.springframework.sbm.build.api.Dependency dependency) {
+ return null;
+ }
+
+ public void clear() {
+ initialDependencies.clear();
+ currentDependencies.clear();
+ }
+
+ private static class DependenciesRegistryHolder {
+
+ public static final ClasspathRegistry INSTANCE = new ClasspathRegistry();
+
+ public static ClasspathRegistry initialDependencies(Set dependencies) {
+ INSTANCE.initDependencies(dependencies);
+ return INSTANCE;
+ }
+
+ }
+
+ public static ClasspathRegistry getInstance() {
+ return DependenciesRegistryHolder.INSTANCE;
+ }
+
+ public void addDependency(ResolvedDependency... deps) {
+ Arrays.asList(deps).forEach(dep -> {
+ initDependency(dep, currentDependencies);
+ });
+ }
+
+ public void removeDependency(ResolvedDependency... deps) {
+ Arrays.asList(deps).forEach(currentDependencies::remove);
+ }
+
+ public void removeDependency(String... coordinates) {
+ Arrays.asList(coordinates).forEach(coordinate -> currentDependencies.keySet().forEach(dep -> {
+ if (dep.getGav().toString().equals(coordinate)) {
+ currentDependencies.remove(coordinate);
+ }
+ }));
+ }
+
+ public Set getInitialDependencies() {
+ return new HashSet<>(initialDependencies.values());
+ }
+
+ public Set getCurrentDependencies() {
+ return new HashSet<>(currentDependencies.values());
+ }
+
+ private void initDependencies(Set deps) {
+ initialDependencies.clear();
+ currentDependencies.clear();
+ deps.forEach(dep -> {
+ initDependency(dep, initialDependencies, currentDependencies);
+ });
+ }
+
+ private void initDependency(ResolvedDependency d, Map... maps) {
+ Path dependencyPath = new RewriteMavenArtifactDownloader().downloadArtifact(d);
+ if(dependencyPath != null) {
+ Stream.of(maps).forEach(m -> m.put(d, dependencyPath));
+ } else {
+ System.out.println(d.getGav() + " has no jars. It has type " + d.getType());
+ initDependencies(new HashSet<>(d.getDependencies()));
+ }
+
+// Optional dependencyPath = dependencyHelper.downloadArtifact(d);
+// if (dependencyPath.isPresent()) {
+// Stream.of(maps).forEach(m -> m.put(d, dependencyPath.get()));
+// }
+ }
}
diff --git a/components/sbm-core/src/main/java/org/springframework/sbm/java/impl/DependenciesChangedEventHandler.java b/components/sbm-core/src/main/java/org/springframework/sbm/java/impl/DependenciesChangedEventHandler.java
index ebc62f8da..3e2f42663 100644
--- a/components/sbm-core/src/main/java/org/springframework/sbm/java/impl/DependenciesChangedEventHandler.java
+++ b/components/sbm-core/src/main/java/org/springframework/sbm/java/impl/DependenciesChangedEventHandler.java
@@ -39,11 +39,11 @@
public class DependenciesChangedEventHandler {
private final ProjectContextHolder projectContextHolder;
private final ApplicationEventPublisher applicationEventPublisher;
+ private JavaParser javaParser;
@EventListener
public void onDependenciesChanged(DependenciesChangedEvent event) {
if (projectContextHolder.getProjectContext() != null) {
- JavaParser currentJavaParser = JavaParserFactory.getCurrentJavaParser();
Set compilationUnitsSet = projectContextHolder.getProjectContext().getProjectJavaSources().asStream()
.map(js -> js.getResource().getSourceFile())
.map(js -> new Parser.Input(js.getSourcePath(), () -> new ByteArrayInputStream(js.printAll().getBytes(StandardCharsets.UTF_8))))
@@ -51,8 +51,14 @@ public void onDependenciesChanged(DependenciesChangedEvent event) {
List compilationUnits = new ArrayList<>(compilationUnitsSet);
Path projectRootDirectory = projectContextHolder.getProjectContext().getProjectRootDirectory();
- List parsedCompilationUnits = currentJavaParser.parseInputs(compilationUnits, projectRootDirectory, new RewriteExecutionContext(applicationEventPublisher));
-
+ // FIXME: #7 only affected modules and source sets must be parsed
+ javaParser = JavaParser.fromJavaVersion().classpath(ClasspathRegistry.getInstance().getCurrentDependencies()).build();
+ //javaParser.setClasspath(ClasspathRegistry.getInstance().getCurrentDependencies());
+ // FIXME: #7 handle "test"
+ // FIXME: #7 Provide a unified interface that calculates source set names by path
+ javaParser.setSourceSet("main");
+ List parsedCompilationUnits = javaParser.parseInputs(compilationUnits, null, new RewriteExecutionContext(applicationEventPublisher));
+ // ((J.VariableDeclarations)parsedCompilationUnits.get(0).getClasses().get(0).getBody().getStatements().get(0)).getLeadingAnnotations().get(0).getType()
parsedCompilationUnits.forEach(cu -> {
projectContextHolder.getProjectContext().getProjectJavaSources().asStream()
.filter(js -> js.getResource().getAbsolutePath().equals(projectRootDirectory.resolve(cu.getSourcePath()).normalize()))
diff --git a/components/sbm-core/src/main/java/org/springframework/sbm/java/impl/JavaParserFactory.java b/components/sbm-core/src/main/java/org/springframework/sbm/java/impl/JavaParserFactory.java
index 03253b217..7ad62b44d 100644
--- a/components/sbm-core/src/main/java/org/springframework/sbm/java/impl/JavaParserFactory.java
+++ b/components/sbm-core/src/main/java/org/springframework/sbm/java/impl/JavaParserFactory.java
@@ -17,6 +17,7 @@
import org.jetbrains.annotations.NotNull;
import org.openrewrite.java.JavaParser;
+import org.springframework.sbm.project.resource.SbmApplicationProperties;
import java.nio.file.Path;
import java.util.ArrayList;
@@ -25,17 +26,22 @@
/**
*
*/
+@Deprecated(since = "0.12.0", forRemoval = true)
public class JavaParserFactory {
+ @Deprecated
public static @NotNull JavaParser getInitialJavaParser() {
Set dependencies = ClasspathRegistry.getInstance().getInitialDependencies();
- JavaParser javaParser = new RewriteJavaParser(new ArrayList<>(dependencies));
+ JavaParser javaParser = new RewriteJavaParser(new SbmApplicationProperties());
+ javaParser.setClasspath(new ArrayList<>(dependencies));
return javaParser;
}
+ @Deprecated
public static @NotNull JavaParser getCurrentJavaParser() {
Set dependencies = ClasspathRegistry.getInstance().getCurrentDependencies();
- JavaParser javaParser = new RewriteJavaParser(new ArrayList<>(dependencies));
+ JavaParser javaParser = new RewriteJavaParser(new SbmApplicationProperties());
+ javaParser.setClasspath(new ArrayList<>(dependencies));
return javaParser;
}
}
diff --git a/components/sbm-core/src/main/java/org/springframework/sbm/java/impl/OpenRewriteAnnotation.java b/components/sbm-core/src/main/java/org/springframework/sbm/java/impl/OpenRewriteAnnotation.java
index 54a306126..8efb509fa 100644
--- a/components/sbm-core/src/main/java/org/springframework/sbm/java/impl/OpenRewriteAnnotation.java
+++ b/components/sbm-core/src/main/java/org/springframework/sbm/java/impl/OpenRewriteAnnotation.java
@@ -15,6 +15,7 @@
*/
package org.springframework.sbm.java.impl;
+import org.openrewrite.java.JavaParser;
import org.springframework.sbm.java.api.Annotation;
import org.springframework.sbm.java.api.Expression;
import org.springframework.sbm.java.refactoring.JavaRefactoring;
@@ -35,10 +36,12 @@ public class OpenRewriteAnnotation implements Annotation {
private final J.Annotation wrapped;
private final JavaRefactoring refactoring;
+ private final JavaParser javaParser;
- public OpenRewriteAnnotation(J.Annotation a, JavaRefactoring refactoring) {
+ public OpenRewriteAnnotation(J.Annotation a, JavaRefactoring refactoring, JavaParser javaParser) {
this.wrapped = a;
this.refactoring = refactoring;
+ this.javaParser = javaParser;
}
// FIXME: [FK] thoroughly test this method
@@ -76,7 +79,7 @@ public boolean hasAttribute(String timeout) {
@Override
public void setAttribute(String attribute, Object value, Class valueType) {
- AddOrReplaceAnnotationAttribute visitor = new AddOrReplaceAnnotationAttribute(() -> JavaParserFactory.getCurrentJavaParser(), wrapped, attribute, value, valueType);
+ AddOrReplaceAnnotationAttribute visitor = new AddOrReplaceAnnotationAttribute(() -> javaParser, wrapped, attribute, value, valueType);
refactoring.refactor(visitor);
}
diff --git a/components/sbm-core/src/main/java/org/springframework/sbm/java/impl/OpenRewriteJavaSource.java b/components/sbm-core/src/main/java/org/springframework/sbm/java/impl/OpenRewriteJavaSource.java
index 6860f2d0a..d4d66f54b 100644
--- a/components/sbm-core/src/main/java/org/springframework/sbm/java/impl/OpenRewriteJavaSource.java
+++ b/components/sbm-core/src/main/java/org/springframework/sbm/java/impl/OpenRewriteJavaSource.java
@@ -15,20 +15,18 @@
*/
package org.springframework.sbm.java.impl;
-import org.springframework.sbm.java.api.*;
-import org.springframework.sbm.java.migration.visitor.ReplaceLiteralVisitor;
-import org.springframework.sbm.java.refactoring.JavaRefactoring;
-import org.springframework.sbm.project.resource.RewriteSourceFileHolder;
-import org.springframework.sbm.search.recipe.CommentJavaSearchResult;
import org.openrewrite.*;
-import org.openrewrite.java.ChangeMethodName;
-import org.openrewrite.java.JavaPrinter;
-import org.openrewrite.java.RemoveUnusedImports;
+import org.openrewrite.java.*;
import org.openrewrite.java.search.FindAnnotations;
import org.openrewrite.java.search.FindReferencedTypes;
import org.openrewrite.java.tree.J;
import org.openrewrite.java.tree.JavaType;
import org.openrewrite.marker.Marker;
+import org.springframework.sbm.java.api.*;
+import org.springframework.sbm.java.migration.visitor.ReplaceLiteralVisitor;
+import org.springframework.sbm.java.refactoring.JavaRefactoring;
+import org.springframework.sbm.project.resource.RewriteSourceFileHolder;
+import org.springframework.sbm.search.recipe.CommentJavaSearchResult;
import java.io.File;
import java.nio.file.Path;
@@ -40,16 +38,12 @@
public class OpenRewriteJavaSource extends RewriteSourceFileHolder implements JavaSource {
private final JavaRefactoring refactoring;
+ private final JavaParser javaParser;
- @Deprecated
- public OpenRewriteJavaSource(J.CompilationUnit wrapped, JavaRefactoring refactoring) {
- super(Path.of("DOES_NOT_EXIST"), wrapped);
- this.refactoring = refactoring;
- }
-
- public OpenRewriteJavaSource(Path absoluteProjectPath, J.CompilationUnit compilationUnit, JavaRefactoring refactoring) {
+ public OpenRewriteJavaSource(Path absoluteProjectPath, J.CompilationUnit compilationUnit, JavaRefactoring refactoring, JavaParser javaParser) {
super(absoluteProjectPath, compilationUnit);
this.refactoring = refactoring;
+ this.javaParser = javaParser;
}
@Deprecated
@@ -69,7 +63,7 @@ public J.CompilationUnit getCompilationUnit() {
@Override
public List getTypes() {
return getCompilationUnit().getClasses().stream()
- .map(cd -> new OpenRewriteType(cd, getResource(), refactoring))
+ .map(cd -> new OpenRewriteType(cd, getResource(), refactoring, javaParser))
.collect(Collectors.toList());
}
@@ -95,6 +89,13 @@ public List getImports() {
.collect(Collectors.toList());
}
+ /**
+ * Check if this JavaSource has any import starting with the any of the given {@code impoorts}.
+ *
+ * Internally {@code .contains(impoort)} is used to check against all imports
+ *
+ * @param impoort array of import starting patterns
+ */
@Override
public boolean hasImportStartingWith(String... impoort) {
return getImports().stream()
@@ -132,7 +133,7 @@ public Path getSourceFolder() {
@Override
public void renameMethodCalls(String methodMatchingPattern, String newName) {
- ChangeMethodName changeMethodName = new ChangeMethodName(methodMatchingPattern, newName, true);
+ ChangeMethodName changeMethodName = new ChangeMethodName(methodMatchingPattern, newName, true, false);
refactoring.refactor(getResource(), changeMethodName);
}
@@ -157,7 +158,7 @@ public void replaceConstant(StaticFieldAccessTransformer transform) {
@Override
public List getAnnotations(String fqName, Expression scope) {
return FindAnnotations.find(((OpenRewriteExpression) scope).getWrapped(), fqName).stream()
- .map(e -> Wrappers.wrap(e, refactoring))
+ .map(e -> Wrappers.wrap(e, refactoring, javaParser))
.collect(Collectors.toList());
}
@@ -215,6 +216,12 @@ public void removeUnusedImports() {
apply(new RemoveUnusedImports());
}
+ @Override
+ public void replaceImport(String p, String replace) {
+ ChangePackage changePackage = new ChangePackage(p, replace, true);
+ apply(changePackage);
+ }
+
/**
* {@inheritDoc}
*/
diff --git a/components/sbm-core/src/main/java/org/springframework/sbm/java/impl/OpenRewriteMember.java b/components/sbm-core/src/main/java/org/springframework/sbm/java/impl/OpenRewriteMember.java
index cb3e54697..cefa8a4c2 100644
--- a/components/sbm-core/src/main/java/org/springframework/sbm/java/impl/OpenRewriteMember.java
+++ b/components/sbm-core/src/main/java/org/springframework/sbm/java/impl/OpenRewriteMember.java
@@ -19,8 +19,6 @@
import org.springframework.sbm.java.api.Member;
import org.springframework.sbm.java.refactoring.JavaRefactoring;
import org.springframework.sbm.project.resource.RewriteSourceFileHolder;
-import org.springframework.sbm.support.openrewrite.java.AddAnnotationVisitor;
-import org.springframework.sbm.support.openrewrite.java.RemoveAnnotationVisitor;
import lombok.Getter;
import lombok.extern.slf4j.Slf4j;
import org.openrewrite.internal.lang.Nullable;
@@ -29,6 +27,8 @@
import org.openrewrite.java.tree.J.VariableDeclarations.NamedVariable;
import org.openrewrite.java.tree.JavaType;
import org.openrewrite.java.tree.TypeTree;
+import org.springframework.sbm.support.openrewrite.java.AddAnnotationVisitor;
+import org.springframework.sbm.support.openrewrite.java.RemoveAnnotationVisitor;
import java.util.List;
import java.util.UUID;
@@ -38,6 +38,8 @@
@Slf4j
public class OpenRewriteMember implements Member {
+ boolean isOutdated;
+
private final UUID variableDeclId;
private final RewriteSourceFileHolder rewriteSourceFileHolder;
@@ -45,21 +47,23 @@ public class OpenRewriteMember implements Member {
private final NamedVariable namedVar;
private final JavaRefactoring refactoring;
+ private final JavaParser javaParser;
public OpenRewriteMember(
J.VariableDeclarations variableDecls, NamedVariable namedVar,
- RewriteSourceFileHolder rewriteSourceFileHolder, JavaRefactoring refactoring) {
+ RewriteSourceFileHolder rewriteSourceFileHolder, JavaRefactoring refactoring, JavaParser javaParser) {
this.variableDeclId = variableDecls.getId();
this.namedVar = namedVar;
this.rewriteSourceFileHolder = rewriteSourceFileHolder;
this.refactoring = refactoring;
+ this.javaParser = javaParser;
}
@Override
public List getAnnotations() {
return getVariableDeclarations().getLeadingAnnotations()
.stream()
- .map(la -> new OpenRewriteAnnotation(la, refactoring))
+ .map(la -> new OpenRewriteAnnotation(la, refactoring, javaParser))
.collect(Collectors.toList());
}
@@ -70,17 +74,28 @@ public Annotation getAnnotation(String annotation) {
return getVariableDeclarations().getLeadingAnnotations()
.stream()
.filter(a -> {
- JavaType.Class type = (JavaType.Class) a.getType();
- if (type == null) {
- String simpleName = ((J.Identifier) a.getAnnotationType()).getSimpleName();
- log.error("Could not get Type for annotation: '" + simpleName + "' while comparing with '" + annotation + "'.");
+
+ JavaType type1 = a.getType();
+ if (type1.getClass().isAssignableFrom(JavaType.Unknown.class)) {
+ log.error("Could not get Type for annotation: '" + annotation + "'.");
+ return false;
+ } else if (type1.getClass().isAssignableFrom(JavaType.Class.class)) {
+ JavaType.Class type = (JavaType.Class) a.getType();
+ if (type == null) {
+ String simpleName = ((J.Identifier) a.getAnnotationType()).getSimpleName();
+ log.error("Could not get Type for annotation: '" + simpleName + "' while comparing with '" + annotation + "'.");
+ return false;
+ }
+ String fullyQualifiedName = type.getFullyQualifiedName();
+ return annotation.equals(fullyQualifiedName);
+ } else {
+ log.error("Unknown JavaType type '" + type1.getClass() + "'");
return false;
}
- String fullyQualifiedName = type.getFullyQualifiedName();
- return annotation.equals(fullyQualifiedName);
+
})
.findFirst()
- .map(a -> Wrappers.wrap(a, refactoring))
+ .map(a -> Wrappers.wrap(a, refactoring, javaParser))
.orElse(null);
}
@@ -95,13 +110,12 @@ public boolean hasAnnotation(String annotationFqName) {
@Override
public void addAnnotation(String fqName) {
String snippet = "@" + fqName.substring(fqName.lastIndexOf('.') + 1);
- AddAnnotationVisitor addAnnotationVisitor = new AddAnnotationVisitor(() -> JavaParserFactory.getCurrentJavaParser(), getVariableDeclarations(), snippet, fqName);
+ AddAnnotationVisitor addAnnotationVisitor = new AddAnnotationVisitor(() -> javaParser, getVariableDeclarations(), snippet, fqName);
refactoring.refactor(rewriteSourceFileHolder, addAnnotationVisitor);
}
@Override
public void addAnnotation(String snippet, String annotationImport, String... otherImports) {
- JavaParser javaParser = JavaParserFactory.getCurrentJavaParser();
AddAnnotationVisitor visitor = new AddAnnotationVisitor(() -> javaParser, getVariableDeclarations(), snippet, annotationImport, otherImports);
refactoring.refactor(rewriteSourceFileHolder, visitor);
}
@@ -130,6 +144,7 @@ public String getName() {
@Override
public void removeAnnotation(Annotation annotation) {
+ // TODO: Maybe replace RemoveAnnotationVisitor with OpenRewrite's recipe
RemoveAnnotationVisitor removeAnnotationRecipe = new RemoveAnnotationVisitor(getVariableDeclarations(), annotation.getFullyQualifiedName());
refactoring.refactor(rewriteSourceFileHolder, removeAnnotationRecipe);
}
diff --git a/components/sbm-core/src/main/java/org/springframework/sbm/java/impl/OpenRewriteMethod.java b/components/sbm-core/src/main/java/org/springframework/sbm/java/impl/OpenRewriteMethod.java
index 413aaeac7..74e95301b 100644
--- a/components/sbm-core/src/main/java/org/springframework/sbm/java/impl/OpenRewriteMethod.java
+++ b/components/sbm-core/src/main/java/org/springframework/sbm/java/impl/OpenRewriteMethod.java
@@ -15,28 +15,30 @@
*/
package org.springframework.sbm.java.impl;
+import lombok.extern.slf4j.Slf4j;
+import org.openrewrite.Recipe;
+import org.openrewrite.java.ChangeMethodName;
+import org.openrewrite.java.JavaParser;
+import org.openrewrite.java.tree.J;
+import org.openrewrite.java.tree.JavaType;
+import org.openrewrite.java.tree.Statement;
+import org.openrewrite.java.tree.TypeUtils;
import org.springframework.sbm.java.api.Annotation;
import org.springframework.sbm.java.api.Method;
import org.springframework.sbm.java.api.MethodParam;
import org.springframework.sbm.java.api.Visibility;
import org.springframework.sbm.java.refactoring.JavaRefactoring;
import org.springframework.sbm.project.resource.RewriteSourceFileHolder;
+import org.springframework.sbm.project.resource.SbmApplicationProperties;
import org.springframework.sbm.support.openrewrite.GenericOpenRewriteRecipe;
import org.springframework.sbm.support.openrewrite.java.AddAnnotationVisitor;
import org.springframework.sbm.support.openrewrite.java.RemoveAnnotationVisitor;
-import lombok.extern.slf4j.Slf4j;
-import org.openrewrite.Recipe;
-import org.openrewrite.java.ChangeMethodName;
-import org.openrewrite.java.JavaParser;
-import org.openrewrite.java.tree.J;
-import org.openrewrite.java.tree.JavaType;
-import org.openrewrite.java.tree.Statement;
-import org.openrewrite.java.tree.TypeUtils;
import java.util.List;
import java.util.Objects;
import java.util.Optional;
import java.util.UUID;
+import java.util.function.Supplier;
import java.util.regex.Pattern;
import java.util.stream.Collectors;
@@ -48,12 +50,14 @@ public class OpenRewriteMethod implements Method {
private final RewriteSourceFileHolder sourceFile;
private final JavaRefactoring refactoring;
+ private final JavaParser javaParser;
public OpenRewriteMethod(
- RewriteSourceFileHolder sourceFile, J.MethodDeclaration methodDecl, JavaRefactoring refactoring) {
+ RewriteSourceFileHolder sourceFile, J.MethodDeclaration methodDecl, JavaRefactoring refactoring, JavaParser javaParser) {
this.sourceFile = sourceFile;
methodDeclId = methodDecl.getId();
this.refactoring = refactoring;
+ this.javaParser = javaParser;
}
@Override
@@ -63,7 +67,7 @@ public List getParams() {
return List.of();
}
return typeParameters.stream()
- .map(p -> new OpenRewriteMethodParam(sourceFile, p, refactoring))
+ .map(p -> new OpenRewriteMethodParam(sourceFile, p, refactoring, javaParser))
.collect(Collectors.toList());
}
@@ -71,7 +75,7 @@ public List getParams() {
public List getAnnotations() {
return getMethodDecl().getLeadingAnnotations()
.stream()
- .map(a -> new OpenRewriteAnnotation(a, refactoring))
+ .map(a -> new OpenRewriteAnnotation(a, refactoring, javaParser))
.collect(Collectors.toList());
}
@@ -102,8 +106,11 @@ public void removeAnnotation(Annotation annotation) {
@Override
public void addAnnotation(String snippet, String annotationImport, String... otherImports) {
- JavaParser javaParser = JavaParserFactory.getCurrentJavaParser();
- Recipe visitor = new GenericOpenRewriteRecipe<>(() -> new AddAnnotationVisitor(javaParser, getMethodDecl(), snippet, annotationImport, otherImports));
+ // FIXME: #7 requires a fresh instance of JavaParser to update typesInUse
+ Recipe visitor = new GenericOpenRewriteRecipe<>(() -> {
+ Supplier javaParserSupplier = () -> JavaParser.fromJavaVersion().classpath(ClasspathRegistry.getInstance().getCurrentDependencies()).build();
+ return new AddAnnotationVisitor(javaParserSupplier, getMethodDecl(), snippet, annotationImport, otherImports);
+ });
refactoring.refactor(sourceFile, visitor);
}
@@ -160,7 +167,7 @@ public String getReturnValue() {
@Override
public void rename(String methodPattern, String methodName) {
// FIXME: method pattern requires type, either define in Type or provide fqName of type declaring method
- ChangeMethodName changeMethodName = new ChangeMethodName(methodPattern, methodName, true);
+ ChangeMethodName changeMethodName = new ChangeMethodName(methodPattern, methodName, true, false);
refactoring.refactor(changeMethodName);
}
}
diff --git a/components/sbm-core/src/main/java/org/springframework/sbm/java/impl/OpenRewriteMethodParam.java b/components/sbm-core/src/main/java/org/springframework/sbm/java/impl/OpenRewriteMethodParam.java
index 1b58fb5fc..5cb3fd657 100644
--- a/components/sbm-core/src/main/java/org/springframework/sbm/java/impl/OpenRewriteMethodParam.java
+++ b/components/sbm-core/src/main/java/org/springframework/sbm/java/impl/OpenRewriteMethodParam.java
@@ -39,18 +39,20 @@ public class OpenRewriteMethodParam implements MethodParam {
private final Statement wrappedMethodParam;
private final JavaRefactoring refactoring;
+ private final JavaParser javaParser;
- public OpenRewriteMethodParam(RewriteSourceFileHolder sourceFile, Statement statement, JavaRefactoring refactoring) {
+ public OpenRewriteMethodParam(RewriteSourceFileHolder sourceFile, Statement statement, JavaRefactoring refactoring, JavaParser javaParser) {
wrappedMethodParam = statement;
this.sourceFile = sourceFile;
this.refactoring = refactoring;
+ this.javaParser = javaParser;
}
@Override
public List getAnnotations() {
if (wrappedMethodParam instanceof J.VariableDeclarations) {
return ((J.VariableDeclarations) wrappedMethodParam).getLeadingAnnotations().stream()
- .map(a -> new OpenRewriteAnnotation(a, refactoring))
+ .map(a -> new OpenRewriteAnnotation(a, refactoring, javaParser))
.collect(Collectors.toList());
}
return List.of();
diff --git a/components/sbm-core/src/main/java/org/springframework/sbm/java/impl/OpenRewriteRecipeJavaSearch.java b/components/sbm-core/src/main/java/org/springframework/sbm/java/impl/OpenRewriteRecipeJavaSearch.java
index 1ae37c3a4..6c1f403f9 100644
--- a/components/sbm-core/src/main/java/org/springframework/sbm/java/impl/OpenRewriteRecipeJavaSearch.java
+++ b/components/sbm-core/src/main/java/org/springframework/sbm/java/impl/OpenRewriteRecipeJavaSearch.java
@@ -34,16 +34,17 @@
public class OpenRewriteRecipeJavaSearch {
private final Function, List> searchRecipe;
+ private final JavaParser javaParser;
- public OpenRewriteRecipeJavaSearch(Function, List> searchRecipe) {
+ public OpenRewriteRecipeJavaSearch(Function, List> searchRecipe, JavaParser javaParser) {
this.searchRecipe = searchRecipe;
+ this.javaParser = javaParser;
}
public void commentFindings(List extends JavaSource> javaSources, String commentText) {
List cus = getCompilationUnits(javaSources);
List results = this.searchRecipe.apply(cus);
String comment = "\n/*\n" + commentText + "\n*/\n";
- JavaParser javaParser = JavaParserFactory.getCurrentJavaParser();
results.stream()
.forEach(result -> {
OpenRewriteJavaSource affectedJavaSource = javaSources.stream()
diff --git a/components/sbm-core/src/main/java/org/springframework/sbm/java/impl/OpenRewriteType.java b/components/sbm-core/src/main/java/org/springframework/sbm/java/impl/OpenRewriteType.java
index e2e386e7e..fc0e972ab 100644
--- a/components/sbm-core/src/main/java/org/springframework/sbm/java/impl/OpenRewriteType.java
+++ b/components/sbm-core/src/main/java/org/springframework/sbm/java/impl/OpenRewriteType.java
@@ -15,35 +15,32 @@
*/
package org.springframework.sbm.java.impl;
-import org.openrewrite.java.tree.JavaSourceFile;
-import org.openrewrite.marker.SearchResult;
+import org.openrewrite.java.*;
+import org.openrewrite.java.format.WrappingAndBraces;
import org.springframework.sbm.java.api.*;
import org.springframework.sbm.java.migration.visitor.RemoveImplementsVisitor;
import org.springframework.sbm.java.refactoring.JavaRefactoring;
-import org.springframework.sbm.openrewrite.RewriteExecutionContext;
+import org.springframework.sbm.project.resource.SbmApplicationProperties;
import org.springframework.sbm.project.resource.RewriteSourceFileHolder;
-import org.springframework.sbm.support.openrewrite.GenericOpenRewriteRecipe;
-import org.springframework.sbm.support.openrewrite.java.AddAnnotationVisitor;
-import org.springframework.sbm.support.openrewrite.java.FindCompilationUnitContainingType;
-import org.springframework.sbm.support.openrewrite.java.RemoveAnnotationVisitor;
import lombok.extern.slf4j.Slf4j;
import org.openrewrite.ExecutionContext;
import org.openrewrite.Recipe;
-import org.openrewrite.java.JavaIsoVisitor;
-import org.openrewrite.java.JavaTemplate;
-import org.openrewrite.java.MethodMatcher;
-import org.openrewrite.java.RemoveUnusedImports;
import org.openrewrite.java.search.DeclaresMethod;
import org.openrewrite.java.tree.J;
import org.openrewrite.java.tree.J.ClassDeclaration;
import org.openrewrite.java.tree.JavaType;
import org.openrewrite.java.tree.JavaType.Class;
import org.openrewrite.java.tree.TypeUtils;
+import org.springframework.sbm.support.openrewrite.GenericOpenRewriteRecipe;
+import org.springframework.sbm.support.openrewrite.java.AddAnnotationVisitor;
+import org.springframework.sbm.support.openrewrite.java.FindCompilationUnitContainingType;
+import org.springframework.sbm.support.openrewrite.java.RemoveAnnotationVisitor;
import java.util.List;
import java.util.Optional;
import java.util.Set;
import java.util.UUID;
+import java.util.function.Supplier;
import java.util.stream.Collectors;
import java.util.stream.Stream;
@@ -56,12 +53,14 @@ public class OpenRewriteType implements Type {
private final JavaRefactoring refactoring;
private final ClassDeclaration classDeclaration;
+ private JavaParser javaParser;
- public OpenRewriteType(J.ClassDeclaration classDeclaration, RewriteSourceFileHolder rewriteSourceFileHolder, JavaRefactoring refactoring) {
+ public OpenRewriteType(ClassDeclaration classDeclaration, RewriteSourceFileHolder rewriteSourceFileHolder, JavaRefactoring refactoring, JavaParser javaParser) {
this.classDeclId = classDeclaration.getId();
this.classDeclaration = classDeclaration;
this.rewriteSourceFileHolder = rewriteSourceFileHolder;
this.refactoring = refactoring;
+ this.javaParser = javaParser;
}
public List getMembers() {
@@ -72,7 +71,7 @@ public List getMembers() {
private Stream createMembers(JavaRefactoring refactoring, J.VariableDeclarations variableDecls) {
return variableDecls.getVariables().stream()
- .map(namedVar -> new OpenRewriteMember(variableDecls, namedVar, rewriteSourceFileHolder, refactoring));
+ .map(namedVar -> new OpenRewriteMember(variableDecls, namedVar, rewriteSourceFileHolder, refactoring, javaParser));
}
@Override
@@ -93,27 +92,30 @@ public boolean hasAnnotation(String annotation) {
@Override
public List findAnnotations(String annotation) {
return findORAnnotations(annotation).stream()
- .map(a -> Wrappers.wrap(a, refactoring)).collect(Collectors.toList());
+ .map(a -> Wrappers.wrap(a, refactoring, javaParser)).collect(Collectors.toList());
}
@Override
public List getAnnotations() {
return getClassDeclaration().getLeadingAnnotations().stream()
- .map(a -> new OpenRewriteAnnotation(a, refactoring))
+ .map(a -> new OpenRewriteAnnotation(a, refactoring, javaParser))
.collect(Collectors.toList());
}
@Override
public void addAnnotation(String fqName) {
- // FIXME: does not work, JavaParser needs to be ThreadSafe
+ // FIXME: Hack, JavaParser should have latest classpath
+ Supplier javaParserSupplier = () -> JavaParser.fromJavaVersion().classpath(ClasspathRegistry.getInstance().getCurrentDependencies()).build();
String snippet = "@" + fqName.substring(fqName.lastIndexOf('.') + 1);
- AddAnnotationVisitor addAnnotationVisitor = new AddAnnotationVisitor(() -> JavaParserFactory.getCurrentJavaParser(), getClassDeclaration(), snippet, fqName);
+ AddAnnotationVisitor addAnnotationVisitor = new AddAnnotationVisitor(javaParserSupplier, getClassDeclaration(), snippet, fqName);
refactoring.refactor(rewriteSourceFileHolder, addAnnotationVisitor);
}
@Override
public void addAnnotation(String snippet, String annotationImport, String... otherImports) {
- AddAnnotationVisitor addAnnotationVisitor = new AddAnnotationVisitor(() -> JavaParserFactory.getCurrentJavaParser(), getClassDeclaration(), snippet, annotationImport, otherImports);
+ // FIXME: #7 JavaParser does not update typesInUse
+ Supplier javaParserSupplier = () -> JavaParser.fromJavaVersion().classpath(ClasspathRegistry.getInstance().getCurrentDependencies()).build();
+ AddAnnotationVisitor addAnnotationVisitor = new AddAnnotationVisitor(javaParserSupplier, getClassDeclaration(), snippet, annotationImport, otherImports);
Recipe recipe = new GenericOpenRewriteRecipe<>(() -> addAnnotationVisitor);
refactoring.refactor(rewriteSourceFileHolder, recipe);
}
@@ -128,6 +130,7 @@ public Annotation getAnnotation(String fqName) {
@Override
// FIXME: reuse
public void removeAnnotation(String fqName) {
+ // TODO: See if RemoveAnnotationVisitor can be replaced with OpenRewrite's version
Recipe removeAnnotationRecipe = new GenericOpenRewriteRecipe<>(() -> new RemoveAnnotationVisitor(getClassDeclaration(), fqName))
.doNext(new RemoveUnusedImports());
refactoring.refactor(rewriteSourceFileHolder, removeAnnotationRecipe);
@@ -143,7 +146,7 @@ public void removeAnnotation(Annotation annotation) {
@Override
public List getMethods() {
return Utils.getMethods(getClassDeclaration()).stream()
- .map(m -> new OpenRewriteMethod(rewriteSourceFileHolder, m, refactoring))
+ .map(m -> new OpenRewriteMethod(rewriteSourceFileHolder, m, refactoring, javaParser))
.collect(Collectors.toList());
}
@@ -152,28 +155,39 @@ public void addMethod(String methodTemplate, Set requiredImports) {
this.apply(new GenericOpenRewriteRecipe<>(() -> new JavaIsoVisitor() {
@Override
public J.ClassDeclaration visitClassDeclaration(J.ClassDeclaration classDecl, ExecutionContext executionContext) {
+ // FIXME: #7 hack, get JavaParser as SpringBean with access to classpath
+ javaParser = new RewriteJavaParser(new SbmApplicationProperties());
+ javaParser.setClasspath(ClasspathRegistry.getInstance().getCurrentDependencies());
+
J.ClassDeclaration cd = super.visitClassDeclaration(classDecl, executionContext);
- JavaTemplate template = JavaTemplate.builder(() -> getCursor().getParent(), methodTemplate).javaParser(() -> JavaParserFactory.getCurrentJavaParser())
- .imports(requiredImports.toArray(new String[]{}))
+ JavaTemplate template = JavaTemplate
+ .builder(() -> getCursor().getParent(), methodTemplate)
+ .javaParser(() -> javaParser)
+ .imports(requiredImports.toArray(new String[0]))
.build();
requiredImports.forEach(this::maybeAddImport);
cd = cd.withTemplate(template, cd.getBody().getCoordinates().lastStatement());
return cd;
}
- }));
+ }).doNext(new WrappingAndBraces()));
}
private List findORAnnotations(String annotation) {
return getClassDeclaration().getLeadingAnnotations()
.stream()
.filter(a -> {
- JavaType.Class type = (JavaType.Class) a.getAnnotationType().getType();
- if (type == null) {
- String simpleName = ((J.Identifier) a.getAnnotationType()).getSimpleName();
+ Object typeObject = a.getAnnotationType().getType();
+ String simpleName = ((J.Identifier) a.getAnnotationType()).getSimpleName();
+ if (JavaType.Unknown.class.isInstance(typeObject)) {
log.warn("Could not resolve Type for annotation: '" + simpleName + "' while comparing with '" + annotation + "'.");
return false;
+ } else if (JavaType.Class.class.isInstance(typeObject)) {
+ Class type = Class.class.cast(typeObject);
+ return annotation.equals(type.getFullyQualifiedName());
+ } else {
+ log.warn("Could not resolve Type for annotation: '" + simpleName + "' (" + typeObject + ") while comparing with '" + annotation + "'.");
+ return false;
}
- return annotation.equals(type.getFullyQualifiedName());
})
.collect(Collectors.toList());
}
@@ -245,7 +259,7 @@ private Optional buildForJavaType(JavaType.FullyQualified jt) {
.filter(c -> c.getType().getFullyQualifiedName().equals(jt.getFullyQualifiedName().trim()))
.findFirst()
.orElseThrow();
- return Optional.of(new OpenRewriteType(classDeclaration, modifiableCompilationUnit, refactoring));
+ return Optional.of(new OpenRewriteType(classDeclaration, modifiableCompilationUnit, refactoring, javaParser));
}
@Override
@@ -281,13 +295,9 @@ public boolean hasMethod(String methodPattern) {
// TODO: parse and validate methodPattern
methodPattern = this.getFullyQualifiedName() + " " + methodPattern;
DeclaresMethod declaresMethod = new DeclaresMethod(new MethodMatcher(methodPattern, true));
- JavaSourceFile javaSourceFile = declaresMethod.visitJavaSourceFile(rewriteSourceFileHolder.getSourceFile(), new RewriteExecutionContext());
- Optional match = javaSourceFile.getMarkers().findFirst(SearchResult.class);
- return match.isPresent() ? true : false;
- // this.getClassDeclaration()
- // List> matches = refactoring.find(rewriteSourceFileHolder, new GenericOpenRewriteRecipe<>(() -> declaresMethod));
+ List> matches = refactoring.find(rewriteSourceFileHolder, new GenericOpenRewriteRecipe<>(() -> declaresMethod));
// TODO: searches in all classes, either filter result list or provide findInCurrent() or similar
- // return !matches.isEmpty();
+ return !matches.isEmpty();
}
@Override
@@ -314,8 +324,8 @@ public Method getMethod(String methodPattern) {
* .....
*
* @param visibility of the member
- * @param type the fully qualified type of the member
- * @param name of the member
+ * @param type the fully qualified type of the member
+ * @param name of the member
*/
@Override
public void addMember(Visibility visibility, String type, String name) {
@@ -324,11 +334,11 @@ public void addMember(Visibility visibility, String type, String name) {
public ClassDeclaration visitClassDeclaration(ClassDeclaration classDecl, ExecutionContext executionContext) {
ClassDeclaration cd = super.visitClassDeclaration(classDecl, executionContext);
JavaType javaType = JavaType.buildType(type);
- String className = ((JavaType.FullyQualified)javaType).getClassName();
+ String className = ((JavaType.FullyQualified) javaType).getClassName();
- JavaTemplate javaTemplate = JavaTemplate.builder(() -> getCursor().getParent(), "@Autowired\n"+ visibility.getVisibilityName() +" "+className+" "+name+";")
+ JavaTemplate javaTemplate = JavaTemplate.builder(() -> getCursor().getParent(), "@Autowired\n" + visibility.getVisibilityName() + " " + className + " " + name + ";")
.imports(type, "org.springframework.beans.factory.annotation.Autowired")
- .javaParser(() -> JavaParserFactory.getCurrentJavaParser())
+ .javaParser(() -> javaParser)
.build();
maybeAddImport(type);
diff --git a/components/sbm-core/src/main/java/org/springframework/sbm/java/impl/ProjectJavaSourcesImpl.java b/components/sbm-core/src/main/java/org/springframework/sbm/java/impl/ProjectJavaSourcesImpl.java
index 6847f40ab..b5fa0839a 100644
--- a/components/sbm-core/src/main/java/org/springframework/sbm/java/impl/ProjectJavaSourcesImpl.java
+++ b/components/sbm-core/src/main/java/org/springframework/sbm/java/impl/ProjectJavaSourcesImpl.java
@@ -15,16 +15,6 @@
*/
package org.springframework.sbm.java.impl;
-import org.openrewrite.java.tree.TypeTree;
-import org.springframework.sbm.java.api.MethodCall;
-import org.springframework.sbm.java.api.JavaSource;
-import org.springframework.sbm.java.api.JavaSourceAndType;
-import org.springframework.sbm.java.api.ProjectJavaSources;
-import org.springframework.sbm.java.api.Type;
-import org.springframework.sbm.java.filter.JavaSourceListFilter;
-import org.springframework.sbm.java.refactoring.JavaGlobalRefactoring;
-import org.springframework.sbm.project.resource.ProjectResourceSet;
-import org.springframework.sbm.project.resource.RewriteSourceFileHolder;
import lombok.extern.slf4j.Slf4j;
import org.openrewrite.Recipe;
import org.openrewrite.java.ChangeType;
@@ -33,6 +23,11 @@
import org.openrewrite.java.tree.J;
import org.openrewrite.java.tree.JavaType;
import org.openrewrite.java.tree.TypeUtils;
+import org.springframework.sbm.java.api.*;
+import org.springframework.sbm.java.filter.JavaSourceListFilter;
+import org.springframework.sbm.java.refactoring.JavaGlobalRefactoring;
+import org.springframework.sbm.project.resource.ProjectResourceSet;
+import org.springframework.sbm.project.resource.RewriteSourceFileHolder;
import java.util.ArrayList;
import java.util.List;
@@ -72,7 +67,7 @@ public List> find(Recipe findCompilat
@Override
public void replaceType(String annotation, String withAnnotation) {
- ChangeType visitor = new ChangeType(annotation, withAnnotation);
+ ChangeType visitor = new ChangeType(annotation, withAnnotation, false);
globalRefactoring.refactor(visitor);
}
@@ -126,17 +121,15 @@ public List findTypesImplementing(String type) {
private boolean hasTypeImplementing(J.ClassDeclaration c, String type) {
try {
- List implmeneting = c.getImplements();
- return implmeneting != null &&
- implmeneting
+ return c.getImplements() != null &&
+ c.getImplements()
.stream()
.anyMatch(intaface -> {
JavaType.FullyQualified fullyQualified = TypeUtils.asFullyQualified(
intaface.getType()
);
if(fullyQualified == null) {
- String simpleName = ((J.Identifier) ((J.ParameterizedType) intaface).getClazz()).getSimpleName();
- log.error("Could not resolve implemented type '" + simpleName + "'");
+ log.error("Could not resolve implemented type '" + ((J.Identifier)intaface).getSimpleName() + "'");
return false;
}
return fullyQualified
diff --git a/components/sbm-core/src/main/java/org/springframework/sbm/java/impl/ReplaceStaticFieldAccessVisitor.java b/components/sbm-core/src/main/java/org/springframework/sbm/java/impl/ReplaceStaticFieldAccessVisitor.java
index 63ebcd472..8b709d93e 100644
--- a/components/sbm-core/src/main/java/org/springframework/sbm/java/impl/ReplaceStaticFieldAccessVisitor.java
+++ b/components/sbm-core/src/main/java/org/springframework/sbm/java/impl/ReplaceStaticFieldAccessVisitor.java
@@ -56,27 +56,25 @@ public J.FieldAccess visitFieldAccess(FieldAccess fieldAccess, ExecutionContext
if (newStaticFieldAccess.isPresent() && differ(newStaticFieldAccess.get(), fieldAccess)) {
JavaType.Class newClassType = JavaType.Class.build(newStaticFieldAccess.get().getFqClassName());
- J.Identifier ident = J.Identifier.build(UUID.randomUUID(), Space.EMPTY, Markers.EMPTY, newClassType.getClassName(), newClassType);
+ J.Identifier ident = new J.Identifier(UUID.randomUUID(), Space.EMPTY, Markers.EMPTY, newClassType.getClassName(), newClassType, null); // FIXME: #497 correct?!
String newFieldName = newStaticFieldAccess.get().getField();
+ J.Identifier identifier = new J.Identifier(
+ UUID.randomUUID(),
+ Space.EMPTY,
+ Markers.EMPTY,
+ newFieldName,
+ newClassType,
+ null
+ );
FieldAccess af = new J.FieldAccess(
UUID.randomUUID(),
Space.build(" ", List.of()),
Markers.EMPTY,
ident,
- new JLeftPadded<>(
- Space.EMPTY,
- J.Identifier.build(
- UUID.randomUUID(),
- Space.EMPTY,
- Markers.EMPTY,
- newFieldName,
- newClassType
- ),
- Markers.EMPTY
- ),
- newClassType
+ JLeftPadded.build(identifier),
+ null // FIXME: #497 correct?!
);
maybeRemoveImport(currentTargetClassType);
diff --git a/components/sbm-core/src/main/java/org/springframework/sbm/java/impl/RewriteJavaParser.java b/components/sbm-core/src/main/java/org/springframework/sbm/java/impl/RewriteJavaParser.java
index ef2cc036f..bb8d60ec6 100644
--- a/components/sbm-core/src/main/java/org/springframework/sbm/java/impl/RewriteJavaParser.java
+++ b/components/sbm-core/src/main/java/org/springframework/sbm/java/impl/RewriteJavaParser.java
@@ -15,44 +15,40 @@
*/
package org.springframework.sbm.java.impl;
+import lombok.Getter;
import org.jetbrains.annotations.NotNull;
import org.openrewrite.ExecutionContext;
import org.openrewrite.internal.lang.Nullable;
import org.openrewrite.java.JavaParser;
+import org.openrewrite.java.marker.JavaSourceSet;
import org.openrewrite.java.tree.J;
-import org.springframework.stereotype.Component;
+import org.springframework.sbm.engine.annotations.StatefulComponent;
+import org.springframework.sbm.openrewrite.RewriteExecutionContext;
+import org.springframework.sbm.project.resource.SbmApplicationProperties;
import java.nio.file.Path;
-import java.util.Arrays;
import java.util.Collection;
+import java.util.Collections;
import java.util.List;
-@Component
+@StatefulComponent
public class RewriteJavaParser implements JavaParser {
- private final boolean javaParserShouldLogCompilationWarningsAndErrors = true;
- private final boolean javaParserRelaxedClassTypeMatching = true;
+ private final SbmApplicationProperties sbmApplicationProperties;
+ @Getter
+ private final JavaParser javaParser;
- private JavaParser javaParser;
// satisfies DI
- public RewriteJavaParser() {
- this(List.of());
- }
-
- public RewriteJavaParser(Path... classpath) {
- this(Arrays.asList(classpath));
- }
-
- public RewriteJavaParser(List classpath) {
- javaParser = buildJavaParser(classpath);
+ public RewriteJavaParser(SbmApplicationProperties sbmApplicationProperties) {
+ this.sbmApplicationProperties = sbmApplicationProperties;
+ javaParser = buildJavaParser(Collections.emptySet());
}
@NotNull
private JavaParser buildJavaParser(Collection classpath) {
Builder extends JavaParser, ?> builder = JavaParser.fromJavaVersion()
- .logCompilationWarningsAndErrors(javaParserShouldLogCompilationWarningsAndErrors)
- .relaxedClassTypeMatching(javaParserRelaxedClassTypeMatching);
+ .logCompilationWarningsAndErrors(sbmApplicationProperties.isJavaParserLoggingCompilationWarningsAndErrors());
if (!classpath.isEmpty()) {
builder.classpath(classpath);
}
@@ -62,7 +58,7 @@ private JavaParser buildJavaParser(Collection classpath) {
@Override
public List parseInputs(Iterable sources, @Nullable Path relativeTo, ExecutionContext ctx) {
reset();
- return this.javaParser.parseInputs(sources, null, ctx);
+ return this.javaParser.parseInputs(sources, relativeTo, ctx);
}
@Override
@@ -72,7 +68,17 @@ public JavaParser reset() {
@Override
public void setClasspath(Collection classpath) {
- this.javaParser = buildJavaParser(classpath);
+ this.javaParser.setClasspath(classpath);
+ }
+
+ @Override
+ public void setSourceSet(String sourceSet) {
+ this.javaParser.setSourceSet(sourceSet);
+ }
+
+ @Override
+ public JavaSourceSet getSourceSet(ExecutionContext ctx) {
+ return this.javaParser.getSourceSet(ctx);
}
public List parse(List javaResources, ExecutionContext executionContext) {
@@ -80,7 +86,9 @@ public List parse(List javaResources, ExecutionContext
return this.parse(javaResources, null, executionContext);
}
- public JavaParser getDelegateJavaParser() {
- return javaParser;
+ @Override
+ public List parse(String... sources) {
+ ExecutionContext ctx = new RewriteExecutionContext();
+ return this.parse(ctx, sources);
}
}
diff --git a/components/sbm-core/src/main/java/org/springframework/sbm/java/impl/Wrappers.java b/components/sbm-core/src/main/java/org/springframework/sbm/java/impl/Wrappers.java
index 2be65a0cd..a60d736b8 100644
--- a/components/sbm-core/src/main/java/org/springframework/sbm/java/impl/Wrappers.java
+++ b/components/sbm-core/src/main/java/org/springframework/sbm/java/impl/Wrappers.java
@@ -15,6 +15,7 @@
*/
package org.springframework.sbm.java.impl;
+import org.openrewrite.java.JavaParser;
import org.springframework.sbm.java.api.Annotation;
import org.springframework.sbm.java.refactoring.JavaRefactoring;
import org.openrewrite.java.tree.Expression;
@@ -32,8 +33,8 @@ public static Expression unwrap(org.springframework.sbm.java.api.Expression e) {
return ((OpenRewriteExpression) e).getWrapped();
}
- public static Annotation wrap(J.Annotation a, JavaRefactoring refactoring) {
- return new OpenRewriteAnnotation(a, refactoring);
+ public static Annotation wrap(J.Annotation a, JavaRefactoring refactoring, JavaParser javaParser) {
+ return new OpenRewriteAnnotation(a, refactoring, javaParser);
}
public static J.Annotation unwrap(Annotation annotation) {
diff --git a/components/sbm-core/src/main/java/org/springframework/sbm/java/migration/actions/RemoveTypeAnnotationAction.java b/components/sbm-core/src/main/java/org/springframework/sbm/java/migration/actions/RemoveTypeAnnotationAction.java
index ee09079b5..54b304e64 100644
--- a/components/sbm-core/src/main/java/org/springframework/sbm/java/migration/actions/RemoveTypeAnnotationAction.java
+++ b/components/sbm-core/src/main/java/org/springframework/sbm/java/migration/actions/RemoveTypeAnnotationAction.java
@@ -31,7 +31,8 @@ public class RemoveTypeAnnotationAction extends AbstractAction {
@Override
public void apply(ProjectContext context) {
- context.getProjectJavaSources().asStream()
+ context.getProjectJavaSources().list()
+ .stream()
.flatMap(js -> js.getTypes().stream())
.filter(type -> type.hasAnnotation(annotation))
.forEach(type -> type.removeAnnotation(annotation));
diff --git a/components/sbm-core/src/main/java/org/springframework/sbm/java/migration/recipes/FindReplaceFieldAccessors.java b/components/sbm-core/src/main/java/org/springframework/sbm/java/migration/recipes/FindReplaceFieldAccessors.java
index c6e9a8c0a..0300adeda 100644
--- a/components/sbm-core/src/main/java/org/springframework/sbm/java/migration/recipes/FindReplaceFieldAccessors.java
+++ b/components/sbm-core/src/main/java/org/springframework/sbm/java/migration/recipes/FindReplaceFieldAccessors.java
@@ -39,7 +39,7 @@ public class FindReplaceFieldAccessors extends Recipe {
final private Map mappings;
final private String simpleReplaceFqName;
- private Supplier javaParserSupplier;
+ private final Supplier javaParserSupplier;
@Override
public String getDisplayName() {
@@ -69,12 +69,12 @@ public J visitFieldAccess(J.FieldAccess fieldAccess, ExecutionContext ctx) {
if (asClass != null && asClass.getFullyQualifiedName().equals(findFqName) &&
replaceField != null) {
maybeRemoveImportAndParentTypeImports(findFqName);
- maybeAddImport(replaceFqName);
+ maybeAddImport(replaceFqName);
JavaType replaceType = JavaType.buildType(replaceFqName);
fa = fa
- .withName(fa.getName().withName(replaceField))
+ .withName(fa.getName().withSimpleName(replaceField))
.withType(replaceType)
- .withTarget(Identifier.build(target.getId(), target.getPrefix(), target.getMarkers(), simpleReplaceFqName, replaceType));
+ .withTarget(new Identifier(target.getId(), target.getPrefix(), target.getMarkers(), simpleReplaceFqName, replaceType, null)); // FIXME: #497 correct?
}
return fa;
}
@@ -87,13 +87,6 @@ private void maybeRemoveImportAndParentTypeImports(String fqName) {
maybeRemoveImportAndParentTypeImports(fqName.substring(0, idx));
}
}
-
- @Override
- public @Nullable J preVisit(J tree, ExecutionContext p) {
- // FIXME: remove parser passing
- getCursor().putMessage("java-parser", javaParserSupplier);
- return super.preVisit(tree, p);
- }
};
}
diff --git a/components/sbm-core/src/main/java/org/springframework/sbm/java/migration/recipes/RewriteConstructorInvocation.java b/components/sbm-core/src/main/java/org/springframework/sbm/java/migration/recipes/RewriteConstructorInvocation.java
index b664ae72d..9420302cf 100644
--- a/components/sbm-core/src/main/java/org/springframework/sbm/java/migration/recipes/RewriteConstructorInvocation.java
+++ b/components/sbm-core/src/main/java/org/springframework/sbm/java/migration/recipes/RewriteConstructorInvocation.java
@@ -15,10 +15,7 @@
*/
package org.springframework.sbm.java.migration.recipes;
-import java.util.Arrays;
-import java.util.function.Consumer;
-import java.util.function.Predicate;
-
+import lombok.RequiredArgsConstructor;
import org.openrewrite.ExecutionContext;
import org.openrewrite.Recipe;
import org.openrewrite.TreeVisitor;
@@ -28,7 +25,9 @@
import org.openrewrite.java.tree.J.NewClass;
import org.openrewrite.java.tree.TypeUtils;
-import lombok.RequiredArgsConstructor;
+import java.util.Arrays;
+import java.util.function.Consumer;
+import java.util.function.Predicate;
@RequiredArgsConstructor
public class RewriteConstructorInvocation extends Recipe {
@@ -72,9 +71,9 @@ private void addImport(String fqName) {
public static Predicate constructorMatcher(String typeFqName, String... parameterTypes) {
return n -> {
if (n.getConstructorType() != null
- && n.getConstructorType().getResolvedSignature() != null
+ && n.getConstructorType().isConstructor()
&& typeFqName.equals(n.getConstructorType().getDeclaringType().getFullyQualifiedName())) {
- String[] paramTypes = n.getConstructorType().getResolvedSignature().getParamTypes()
+ String[] paramTypes = n.getConstructorType().getParameterTypes()
.stream()
.map(t -> TypeUtils.asFullyQualified(t).getFullyQualifiedName())
.toArray(String[]::new);
@@ -84,7 +83,7 @@ public static Predicate constructorMatcher(String typeFqName, String..
};
}
- public static interface Transformer {
+ public interface Transformer {
J transform(JavaVisitor visitor, NewClass n, Consumer addImport);
diff --git a/components/sbm-core/src/main/java/org/springframework/sbm/java/migration/recipes/RewriteMethodInvocation.java b/components/sbm-core/src/main/java/org/springframework/sbm/java/migration/recipes/RewriteMethodInvocation.java
index 0cf33c7ef..d2ed23a15 100644
--- a/components/sbm-core/src/main/java/org/springframework/sbm/java/migration/recipes/RewriteMethodInvocation.java
+++ b/components/sbm-core/src/main/java/org/springframework/sbm/java/migration/recipes/RewriteMethodInvocation.java
@@ -77,10 +77,9 @@ public interface Transformer {
public static RewriteMethodInvocation renameMethodInvocation(Predicate matcher, String newName, String newType) {
JavaType type = JavaType.buildType(newType);
return new RewriteMethodInvocation(matcher, (v, m, a) -> {
- return m
- .withName(m.getName().withName(newName))
- .withSelect(m.getSelect().withType(type))
- .withType(m.getType().withDeclaringType(TypeUtils.asFullyQualified(type)));
+ return m.withName(m.getName().withSimpleName(newName))
+ .withMethodType(m.getMethodType().withReturnType(type))
+ .withDeclaringType(TypeUtils.asFullyQualified(type));
});
}
diff --git a/components/sbm-core/src/main/java/org/springframework/sbm/java/migration/visitor/VisitorUtils.java b/components/sbm-core/src/main/java/org/springframework/sbm/java/migration/visitor/VisitorUtils.java
index 92e48f787..ae2b7c903 100644
--- a/components/sbm-core/src/main/java/org/springframework/sbm/java/migration/visitor/VisitorUtils.java
+++ b/components/sbm-core/src/main/java/org/springframework/sbm/java/migration/visitor/VisitorUtils.java
@@ -15,7 +15,6 @@
*/
package org.springframework.sbm.java.migration.visitor;
-import org.springframework.sbm.java.migration.recipes.ChangeMethodReturnTypeRecipe;
import org.openrewrite.*;
import org.openrewrite.internal.lang.NonNull;
import org.openrewrite.internal.lang.Nullable;
@@ -30,6 +29,7 @@
import org.openrewrite.marker.Marker;
import org.openrewrite.marker.Markers;
import org.openrewrite.marker.SearchResult;
+import org.springframework.sbm.java.migration.recipes.ChangeMethodReturnTypeRecipe;
import java.lang.reflect.Method;
import java.util.Objects;
@@ -106,13 +106,21 @@ public AddTemplateMark(UUID addTo, String template, Recipe recipe) {
public static class MarkReturnType implements Marker {
+ private UUID id;
private final SearchResult searchResult;
private String expression;
private String[] imports;
+ // TODO: Remove recipe parameter
public MarkReturnType(UUID id, Recipe recipe, @Nullable String expression, String... imports) {
-// super(id, recipe);
- // FIXME: what was recipe used for?
+ this.id = id;
+ this.searchResult = new SearchResult(id, "MarkReturnType");
+ this.expression = expression;
+ this.imports = imports;
+ }
+
+ public MarkReturnType(UUID id, Recipe recipe, String description, String expression, String[] imports) {
+ this.id = id;
this.searchResult = new SearchResult(id, "MarkReturnType");
this.expression = expression;
this.imports = imports;
@@ -131,6 +139,12 @@ public UUID getId() {
return searchResult.getId();
}
+ @Override
+ public T withId(final UUID id) {
+ MarkReturnType commentJavaSearchResult = this.id == id ? this : new MarkReturnType(id, null, searchResult.getDescription(), expression, imports);
+ return (T) commentJavaSearchResult;
+ }
+
}
public static class AdjustTypesFromExpressionMarkers extends Recipe {
diff --git a/components/sbm-core/src/main/java/org/springframework/sbm/java/refactoring/JavaGlobalRefactoringImpl.java b/components/sbm-core/src/main/java/org/springframework/sbm/java/refactoring/JavaGlobalRefactoringImpl.java
index 4bc1abccb..b2d253f40 100644
--- a/components/sbm-core/src/main/java/org/springframework/sbm/java/refactoring/JavaGlobalRefactoringImpl.java
+++ b/components/sbm-core/src/main/java/org/springframework/sbm/java/refactoring/JavaGlobalRefactoringImpl.java
@@ -15,6 +15,7 @@
*/
package org.springframework.sbm.java.refactoring;
+import org.springframework.sbm.openrewrite.RewriteExecutionContext;
import org.springframework.sbm.project.resource.ProjectResourceSet;
import org.springframework.sbm.project.resource.RewriteSourceFileHolder;
import org.springframework.sbm.support.openrewrite.GenericOpenRewriteRecipe;
@@ -127,7 +128,8 @@ private RewriteSourceFileHolder findRewriteSourceFileHolderHo
}
List executeRecipe(List compilationUnits, Recipe recipe) {
- List results = recipe.run(compilationUnits);
+ // FIXME #7 added RewriteExecutionContext here, remove again?
+ List results = recipe.run(compilationUnits, new RewriteExecutionContext());
// List results = recipe.run(compilationUnits, new RewriteExecutionContext(), new ForkJoinScheduler(new ForkJoinPool(1)), 10, 1);
return results;
}
diff --git a/components/sbm-core/src/main/java/org/springframework/sbm/openrewrite/RewriteExecutionContext.java b/components/sbm-core/src/main/java/org/springframework/sbm/openrewrite/RewriteExecutionContext.java
index 1d2ac2769..d70225381 100644
--- a/components/sbm-core/src/main/java/org/springframework/sbm/openrewrite/RewriteExecutionContext.java
+++ b/components/sbm-core/src/main/java/org/springframework/sbm/openrewrite/RewriteExecutionContext.java
@@ -53,7 +53,7 @@ private static Consumer createErrorHandler() {
} else if(t instanceof MavenDownloadingException) {
log.warn(t.getMessage());
} else {
- log.warn("Exception occured!", t);
+ log.error("Exception occured!", t);
}
};
return errorConsumer;
diff --git a/components/sbm-core/src/main/java/org/springframework/sbm/project/parser/DependencyHelper.java b/components/sbm-core/src/main/java/org/springframework/sbm/project/parser/DependencyHelper.java
index 7b0a8a15e..72993654e 100644
--- a/components/sbm-core/src/main/java/org/springframework/sbm/project/parser/DependencyHelper.java
+++ b/components/sbm-core/src/main/java/org/springframework/sbm/project/parser/DependencyHelper.java
@@ -16,16 +16,13 @@
package org.springframework.sbm.project.parser;
import lombok.extern.slf4j.Slf4j;
+import org.openrewrite.internal.lang.Nullable;
import org.openrewrite.maven.cache.LocalMavenArtifactCache;
import org.openrewrite.maven.cache.ReadOnlyLocalMavenArtifactCache;
-import org.openrewrite.maven.internal.MavenDownloadingException;
import org.openrewrite.maven.internal.MavenParsingException;
-import org.openrewrite.maven.tree.MavenRepository;
-import org.openrewrite.maven.tree.Pom;
-import org.openrewrite.maven.tree.Scope;
+import org.openrewrite.maven.tree.*;
import org.openrewrite.maven.utilities.MavenArtifactDownloader;
-import java.net.URI;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.*;
@@ -35,11 +32,15 @@
@Slf4j
public class DependencyHelper {
- public List downloadArtifacts(Consumer errorHandler, Set dependencies) {
+ public List downloadArtifacts(Consumer