Add Rewrite Plugin Invoker for Gradle and Maven
This commit is contained in:
18
pom.xml
18
pom.xml
@@ -17,7 +17,7 @@
|
|||||||
<module>spring-rewrite-commons-examples</module>
|
<module>spring-rewrite-commons-examples</module>
|
||||||
<module>spring-rewrite-commons-starters</module>
|
<module>spring-rewrite-commons-starters</module>
|
||||||
<module>spring-rewrite-commons-gradle</module>
|
<module>spring-rewrite-commons-gradle</module>
|
||||||
<module>spring-rewrite-commons-maven-invoker</module>
|
<module>spring-rewrite-commons-plugin-invoker</module>
|
||||||
</modules>
|
</modules>
|
||||||
|
|
||||||
<organization>
|
<organization>
|
||||||
@@ -37,13 +37,15 @@
|
|||||||
<rewrite-polyglot.version>1.8.11</rewrite-polyglot.version>
|
<rewrite-polyglot.version>1.8.11</rewrite-polyglot.version>
|
||||||
<rewrite-maven-plugin.version>5.20.0</rewrite-maven-plugin.version>
|
<rewrite-maven-plugin.version>5.20.0</rewrite-maven-plugin.version>
|
||||||
<jaxb-api.version>2.3.1</jaxb-api.version>
|
<jaxb-api.version>2.3.1</jaxb-api.version>
|
||||||
|
<gradle-tooling-api.version>8.4</gradle-tooling-api.version>
|
||||||
|
<maven.version>3.9.1</maven.version>
|
||||||
|
<maven-invoker.version>3.2.0</maven-invoker.version>
|
||||||
|
<maven-shared-utils.version>3.4.2</maven-shared-utils.version>
|
||||||
|
|
||||||
<!-- testing dependencies -->
|
<!-- testing dependencies -->
|
||||||
<maven.version>3.9.1</maven.version>
|
|
||||||
<maven-resolver.version>1.9.13</maven-resolver.version>
|
<maven-resolver.version>1.9.13</maven-resolver.version>
|
||||||
<maven-wagon-http.version>3.5.3</maven-wagon-http.version>
|
<maven-wagon-http.version>3.5.3</maven-wagon-http.version>
|
||||||
<plexus-cypher.version>1.8</plexus-cypher.version>
|
<plexus-cypher.version>1.8</plexus-cypher.version>
|
||||||
<maven-invoker.version>3.2.0</maven-invoker.version>
|
|
||||||
<junit-pioneer.version>2.1.0</junit-pioneer.version>
|
<junit-pioneer.version>2.1.0</junit-pioneer.version>
|
||||||
|
|
||||||
<!-- documentation dependencies -->
|
<!-- documentation dependencies -->
|
||||||
@@ -117,6 +119,16 @@
|
|||||||
<version>${junit-pioneer.version}</version>
|
<version>${junit-pioneer.version}</version>
|
||||||
<scope>test</scope>
|
<scope>test</scope>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.gradle</groupId>
|
||||||
|
<artifactId>gradle-tooling-api</artifactId>
|
||||||
|
<version>${gradle-tooling-api.version}</version>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.openrewrite</groupId>
|
||||||
|
<artifactId>rewrite-core</artifactId>
|
||||||
|
<version>${rewrite.version}</version>
|
||||||
|
</dependency>
|
||||||
</dependencies>
|
</dependencies>
|
||||||
</dependencyManagement>
|
</dependencyManagement>
|
||||||
|
|
||||||
|
|||||||
@@ -9,16 +9,15 @@ Fabian Krüger
|
|||||||
|
|
||||||
== Overview
|
== Overview
|
||||||
Spring Rewrite Commons provides abstractions and parsers for https://github.com/openrewrite/[OpenRewrite].
|
Spring Rewrite Commons provides abstractions and parsers for https://github.com/openrewrite/[OpenRewrite].
|
||||||
The project can parse Java projects using Maven and apply OpenRewrite recipes without the need of a build tool plugin.
|
|
||||||
It aims to become the foundation for Spring Boot applications using OpenRewrite.
|
|
||||||
|
|
||||||
https://github.com/openrewrite/[OpenRewrite] is a code refactoring, remediation, and modernization automation tool providing a rich https://docs.openrewrite.org/recipes[catalog of recipes] for tasks like automated code transformations.
|
https://github.com/openrewrite/[OpenRewrite] is a code refactoring, remediation, and modernization automation tool providing a rich https://docs.openrewrite.org/recipes[catalog of recipes] for task like automated code transformations.
|
||||||
|
|
||||||
These are the main components offered by Spring Rewrite Commons:
|
These are the main components offered by Spring Rewrite Commons:
|
||||||
|
|
||||||
* `xref:concepts.adoc#_rewriteprojectparser[RewriteProjectParser]` - Parse a project to an OpenRewrite https://docs.openrewrite.org/concepts-explanations/lossless-semantic-trees[Lossless Semantic Tree] (LST).
|
* `xref:concepts.adoc#:_plugininvoker[RewritePlugin]` - Helper to execute OpenRewrite's Gradle or Maven plugin through Java
|
||||||
* `xref:concepts.adoc#_recipediscovery[RewriteRecipeDiscovery]` - Discover recipes on the classpath.
|
* `xref:concepts.adoc#_rewriteprojectparser[RewriteProjectParser]` - Parse a project to an OpenRewrite https://docs.openrewrite.org/concepts-explanations/lossless-semantic-trees[LST] outside a build tool plugin.
|
||||||
* `xref:concepts.adoc#_projectresourceset[ProjectResourceSet]` - Encapsulates the LST to run https://github.com/openrewrite/[OpenRewrite] recipes sequentially.
|
* `xref:concepts.adoc#_projectresourceset[ProjectResourceSet]` - Encapsulates the LST to run https://github.com/openrewrite/[OpenRewrite] recipes sequentially.
|
||||||
|
* `xref:concepts.adoc#_recipediscovery[RewriteRecipeDiscovery]` - Discover recipes on the classpath.
|
||||||
* `xref:concepts.adoc#_projectresourcesetserializer[ProjectResourceSetSerializer]` - Serialize the current state of the `ProjectResourceSet` to the filesystem.
|
* `xref:concepts.adoc#_projectresourcesetserializer[ProjectResourceSetSerializer]` - Serialize the current state of the `ProjectResourceSet` to the filesystem.
|
||||||
* Some helpers for xref:testing.adoc[testíng] also exist
|
* Some helpers for xref:testing.adoc[testíng] also exist
|
||||||
|
|
||||||
|
|||||||
@@ -149,6 +149,18 @@
|
|||||||
<version>${maven-invoker.version}</version>
|
<version>${maven-invoker.version}</version>
|
||||||
<scope>test</scope>
|
<scope>test</scope>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.springframework.rewrite</groupId>
|
||||||
|
<artifactId>spring-rewrite-commons-plugin-invoker-maven</artifactId>
|
||||||
|
<version>0.1.0-SNAPSHOT</version>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.springframework.rewrite</groupId>
|
||||||
|
<artifactId>spring-rewrite-commons-plugin-invoker-gradle</artifactId>
|
||||||
|
<version>0.1.0-SNAPSHOT</version>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>org.springframework.boot</groupId>
|
<groupId>org.springframework.boot</groupId>
|
||||||
<artifactId>spring-boot-starter-test</artifactId>
|
<artifactId>spring-boot-starter-test</artifactId>
|
||||||
|
|||||||
@@ -1,379 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright 2021 - 2023 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.rewrite.maven;
|
|
||||||
|
|
||||||
import org.apache.maven.shared.invoker.*;
|
|
||||||
|
|
||||||
import javax.swing.text.html.Option;
|
|
||||||
import java.io.File;
|
|
||||||
import java.nio.file.Files;
|
|
||||||
import java.nio.file.Path;
|
|
||||||
import java.util.ArrayList;
|
|
||||||
import java.util.Arrays;
|
|
||||||
import java.util.List;
|
|
||||||
import java.util.function.Consumer;
|
|
||||||
import java.util.stream.Collectors;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Executes OpenRewrite recipes by invoking local Maven installation. It requires
|
|
||||||
* MAVEN_HOME or M2_HOME to be set!
|
|
||||||
*
|
|
||||||
* @author Fabian Krüger
|
|
||||||
*/
|
|
||||||
public class MavenInvocationRewriteRecipeLauncher {
|
|
||||||
|
|
||||||
private MavenInvocationRequestFactory mavenInvocationRequestFactory = new MavenInvocationRequestFactory();
|
|
||||||
|
|
||||||
// private Invoker invoker = new DefaultInvoker();
|
|
||||||
|
|
||||||
public static Builders.OnDirBuilder applyRecipes(String... recipeNames) {
|
|
||||||
MavenInvokerRewriteRecipeLauncherBuilder builders = new MavenInvokerRewriteRecipeLauncherBuilder();
|
|
||||||
return builders.applyRecipes(recipeNames);
|
|
||||||
}
|
|
||||||
|
|
||||||
public static Builders.OnDirBuilder applyRecipes(List<String> recipeNames) {
|
|
||||||
MavenInvokerRewriteRecipeLauncherBuilder builders = new MavenInvokerRewriteRecipeLauncherBuilder();
|
|
||||||
return builders.applyRecipes(recipeNames);
|
|
||||||
}
|
|
||||||
|
|
||||||
private InvocationResult invokeRewritePlugin(Invoker invoker, Path baseDir, List<String> recipeNames,
|
|
||||||
List<String> dependencies, DebugConfig debugConfig, BuildConfig buildConfig, Consumer<String> lineConsumer,
|
|
||||||
RewritePluginGoals rewritePluginGoals) {
|
|
||||||
validateBaseDir(baseDir);
|
|
||||||
|
|
||||||
if (recipeNames.isEmpty()) {
|
|
||||||
throw new IllegalArgumentException("No recipe names provided.");
|
|
||||||
}
|
|
||||||
|
|
||||||
String openRewriteCommand = renderOpenRewriteCommand(recipeNames, dependencies, rewritePluginGoals);
|
|
||||||
return invokeMaven(invoker, baseDir, debugConfig, buildConfig, lineConsumer, openRewriteCommand);
|
|
||||||
}
|
|
||||||
|
|
||||||
public InvocationResult invokeRewritePlugin(Path baseDir, List<String> recipeNames, List<String> dependencies,
|
|
||||||
DebugConfig debugConfig, BuildConfig buildConfig, Consumer<String> lineConsumer,
|
|
||||||
RewritePluginGoals rewritePluginGoals) {
|
|
||||||
|
|
||||||
validateBaseDir(baseDir);
|
|
||||||
|
|
||||||
if (recipeNames.isEmpty()) {
|
|
||||||
throw new IllegalArgumentException("No recipe names provided.");
|
|
||||||
}
|
|
||||||
|
|
||||||
String openRewriteCommand = renderOpenRewriteCommand(recipeNames, dependencies, rewritePluginGoals);
|
|
||||||
return invokeMaven(new DefaultInvoker(), baseDir, debugConfig, buildConfig, lineConsumer, openRewriteCommand);
|
|
||||||
}
|
|
||||||
|
|
||||||
private void validateBaseDir(Path baseDir) {
|
|
||||||
if (baseDir == null) {
|
|
||||||
throw new IllegalArgumentException("Given baseDir was null.");
|
|
||||||
}
|
|
||||||
else if (!Files.exists(baseDir)) {
|
|
||||||
throw new IllegalArgumentException("Given baseDir '%s' does not exist.".formatted(baseDir));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private InvocationResult invokeMaven(Invoker invoker, Path baseDir, DebugConfig debugConfig,
|
|
||||||
BuildConfig buildConfig, Consumer<String> lineConsumer, String openRewriteCommand) {
|
|
||||||
List<String> goals = new ArrayList<>();
|
|
||||||
goals.add("clean");
|
|
||||||
goals.add("package");
|
|
||||||
goals.add("--fail-at-end");
|
|
||||||
goals.add(openRewriteCommand);
|
|
||||||
|
|
||||||
InvocationRequest request = mavenInvocationRequestFactory.createMavenInvocationRequest(baseDir, debugConfig,
|
|
||||||
buildConfig, goals, lineConsumer);
|
|
||||||
|
|
||||||
try {
|
|
||||||
return invoker.execute(request);
|
|
||||||
}
|
|
||||||
catch (MavenInvocationException e) {
|
|
||||||
throw new RuntimeException(e);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// public static InvocationResult invokeMaven(Path baseDir, BuildConfig buildConfig,
|
|
||||||
// DebugConfig debugConfig,
|
|
||||||
// Consumer<String> lineConsumer, List<String> providedGoals) {
|
|
||||||
// List<String> goals = new ArrayList<>(providedGoals);
|
|
||||||
//
|
|
||||||
// InvocationRequest mavenInvocationRequest = new
|
|
||||||
// MavenInvocationRequestFactory().createMavenInvocationRequest(baseDir, debugConfig,
|
|
||||||
// buildConfig, providedGoals, lineConsumer);
|
|
||||||
//
|
|
||||||
// String mavenHome = System.getenv("MAVEN_HOME");
|
|
||||||
// if (mavenHome == null) {
|
|
||||||
// mavenHome = System.getenv("M2_HOME");
|
|
||||||
// if (mavenHome == null) {
|
|
||||||
// throw new IllegalStateException(
|
|
||||||
// "MAVEN_HOME or M2_HOME must be set but System.getenv(\"MAVEN_HOME\") and
|
|
||||||
// System.getenv(\"M2_HOME\") returned null.");
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// if (buildConfig.isSkipTests()) {
|
|
||||||
// goals.add("-DskipTests");
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// Invoker invoker = new DefaultInvoker();
|
|
||||||
// InvocationRequest request = new DefaultInvocationRequest();
|
|
||||||
// request.setGoals(goals);
|
|
||||||
// request.setBatchMode(true);
|
|
||||||
// request.setMavenHome(new File(mavenHome));
|
|
||||||
// request.setBaseDirectory(baseDir.toFile());
|
|
||||||
// request.setOutputHandler(s -> lineConsumer.accept(s));
|
|
||||||
//
|
|
||||||
// StringBuilder mavenOpts = new StringBuilder();
|
|
||||||
// mavenOpts.append("-Xms1G -Xmx6G ");
|
|
||||||
// if (debugConfig != null && debugConfig.isDebugEnabled()) {
|
|
||||||
// mavenOpts.append(" -Xdebug
|
|
||||||
// -Xrunjdwp:transport=dt_socket,server=y,suspend=%s,address=%s "
|
|
||||||
// .formatted(debugConfig.isSuspend(), debugConfig.getPort()));
|
|
||||||
// }
|
|
||||||
// request.setMavenOpts(mavenOpts.toString());
|
|
||||||
//
|
|
||||||
// try {
|
|
||||||
// InvocationResult result = invoker.execute(request);
|
|
||||||
// return result;
|
|
||||||
// }
|
|
||||||
// catch (MavenInvocationException e) {
|
|
||||||
// throw new RuntimeException(e);
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
|
|
||||||
private static String renderOpenRewriteCommand(List<String> recipeNames, List<String> dependencies,
|
|
||||||
RewritePluginGoals rewritePluginGoal) {
|
|
||||||
StringBuilder sb = new StringBuilder();
|
|
||||||
sb.append("org.openrewrite.maven:rewrite-maven-plugin:").append(rewritePluginGoal.getGoalName()).append(" ");
|
|
||||||
String recipesList = recipeNames.stream().collect(Collectors.joining(","));
|
|
||||||
sb.append("-Drewrite.activeRecipes=").append(recipesList);
|
|
||||||
if (!dependencies.isEmpty()) {
|
|
||||||
String dependenciesList = dependencies.stream().collect(Collectors.joining(","));
|
|
||||||
sb.append(" ").append("-Drewrite.recipeArtifactCoordinates=").append(dependenciesList);
|
|
||||||
}
|
|
||||||
return sb.toString();
|
|
||||||
}
|
|
||||||
|
|
||||||
public class Builders {
|
|
||||||
|
|
||||||
public interface StartBuilder {
|
|
||||||
|
|
||||||
OnDirBuilder applyRecipes(String... recipeNames);
|
|
||||||
|
|
||||||
OnDirBuilder applyRecipes(List<String> recipeNames);
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
public interface OnDirBuilder {
|
|
||||||
|
|
||||||
OptionalBuilder onDir(Path baseDir);
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
public interface OptionalBuilder {
|
|
||||||
|
|
||||||
OptionalBuilder withDebugConfig(DebugConfig debugConfig);
|
|
||||||
|
|
||||||
OptionalBuilder withDependencies(String... dependencyGavs);
|
|
||||||
|
|
||||||
OptionalBuilder withDependencies(List<String> dependencyGavs);
|
|
||||||
|
|
||||||
OptionalBuilder withBuildConfig(BuildConfig buildConfig);
|
|
||||||
|
|
||||||
OptionalBuilder withOutputListener(Consumer<String> outputListener);
|
|
||||||
|
|
||||||
OptionalBuilder withInvoker(Invoker invoker);
|
|
||||||
|
|
||||||
InvocationResult run();
|
|
||||||
|
|
||||||
InvocationResult runNoFork();
|
|
||||||
|
|
||||||
InvocationResult dryRun();
|
|
||||||
|
|
||||||
InvocationResult dryRunNoFork();
|
|
||||||
|
|
||||||
InvocationResult discover();
|
|
||||||
|
|
||||||
InvocationResult cyclonedx();
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
public static class MavenInvokerRewriteRecipeLauncherBuilder
|
|
||||||
implements Builders.StartBuilder, Builders.OnDirBuilder, Builders.OptionalBuilder {
|
|
||||||
|
|
||||||
private Path baseDir;
|
|
||||||
|
|
||||||
private List<String> recipes = new ArrayList<>();
|
|
||||||
|
|
||||||
private List<String> dependencies = new ArrayList<>();
|
|
||||||
|
|
||||||
private BuildConfig buildConfig = BuildConfig.defaultConfig();
|
|
||||||
|
|
||||||
private DebugConfig debugConfig = DebugConfig.disabled();
|
|
||||||
|
|
||||||
private Consumer<String> outputListener = line -> System.out.println(line);
|
|
||||||
|
|
||||||
private Invoker invoker = new DefaultInvoker();
|
|
||||||
|
|
||||||
public Builders.OptionalBuilder onDir(String baseDir) {
|
|
||||||
this.baseDir = Path.of(baseDir).toAbsolutePath().normalize();
|
|
||||||
return this;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public Builders.OnDirBuilder applyRecipes(String... recipeNames) {
|
|
||||||
validateRecipeNames(Arrays.asList(recipeNames));
|
|
||||||
return this.applyRecipes(Arrays.asList(recipeNames));
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public Builders.OnDirBuilder applyRecipes(List<String> recipeNames) {
|
|
||||||
validateRecipeNames(recipeNames);
|
|
||||||
this.recipes = recipeNames;
|
|
||||||
return this;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public Builders.OptionalBuilder onDir(Path baseDir) {
|
|
||||||
this.baseDir = baseDir.toAbsolutePath().normalize();
|
|
||||||
return this;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public Builders.OptionalBuilder withOutputListener(Consumer<String> outputListener) {
|
|
||||||
this.outputListener = outputListener;
|
|
||||||
return this;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public Builders.OptionalBuilder withInvoker(Invoker invoker) {
|
|
||||||
this.invoker = invoker;
|
|
||||||
return this;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* mvn rewrite:run - RunBuilder the configured recipes and apply the changes
|
|
||||||
* locally.
|
|
||||||
*/
|
|
||||||
@Override
|
|
||||||
public InvocationResult run() {
|
|
||||||
return executeRewriteGoal(invoker, baseDir, recipes, dependencies, debugConfig, buildConfig, outputListener,
|
|
||||||
RewritePluginGoals.RUN);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* mvn rewrite:runNoFork - RunBuilder the configured recipes and apply the changes
|
|
||||||
* locally. This variant does not fork the Maven life cycle and can be a more
|
|
||||||
* efficient choice when using Rewrite within a CI workflow when combined with
|
|
||||||
* other Maven goals.
|
|
||||||
*/
|
|
||||||
@Override
|
|
||||||
public InvocationResult runNoFork() {
|
|
||||||
return executeRewriteGoal(invoker, baseDir, recipes, dependencies, debugConfig, buildConfig, outputListener,
|
|
||||||
RewritePluginGoals.RUN_NO_FORK);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* mvn rewrite:dryRun - Generate warnings to the console for any recipe that would
|
|
||||||
* make changes and generates a diff file in each maven modules' target folder.
|
|
||||||
*/
|
|
||||||
@Override
|
|
||||||
public InvocationResult dryRun() {
|
|
||||||
return executeRewriteGoal(invoker, baseDir, recipes, dependencies, debugConfig, buildConfig, outputListener,
|
|
||||||
RewritePluginGoals.DRY_RUN);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* mvn rewrite:dryRunNoFork - Generate warnings to the console for any recipe that
|
|
||||||
* would make changes and generates a diff file in each maven modules' target
|
|
||||||
* folder. This variant does not fork the Maven life cycle and can be a more
|
|
||||||
* efficient choice when using Rewrite within a CI workflow when combined with
|
|
||||||
* other Maven goals.
|
|
||||||
*/
|
|
||||||
@Override
|
|
||||||
public InvocationResult dryRunNoFork() {
|
|
||||||
return executeRewriteGoal(invoker, baseDir, recipes, dependencies, debugConfig, buildConfig, outputListener,
|
|
||||||
RewritePluginGoals.DRY_RUN_NO_FORK);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* mvn rewrite:discover - Generate a report of available recipes found on the
|
|
||||||
* classpath.
|
|
||||||
*/
|
|
||||||
@Override
|
|
||||||
public InvocationResult discover() {
|
|
||||||
return executeRewriteGoal(invoker, baseDir, recipes, dependencies, debugConfig, buildConfig, outputListener,
|
|
||||||
RewritePluginGoals.DISCOVER);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* mvn rewrite:cyclonedx - Generate a CycloneDx bill of materials outlining the
|
|
||||||
* project's dependencies, including transitive dependencies.
|
|
||||||
*
|
|
||||||
* @see <a href="https://cyclonedx.org/">CycloneDx</a>
|
|
||||||
*/
|
|
||||||
@Override
|
|
||||||
public InvocationResult cyclonedx() {
|
|
||||||
return executeRewriteGoal(invoker, baseDir, recipes, dependencies, debugConfig, buildConfig, outputListener,
|
|
||||||
RewritePluginGoals.CYCLONEDX);
|
|
||||||
}
|
|
||||||
|
|
||||||
private InvocationResult executeRewriteGoal(Invoker invoker, Path baseDir, List<String> recipeNames,
|
|
||||||
List<String> dependencies, DebugConfig debugConfig, BuildConfig buildConfig,
|
|
||||||
Consumer<String> lineConsumer, RewritePluginGoals rewritePluginGoals) {
|
|
||||||
MavenInvocationRewriteRecipeLauncher launcher = new MavenInvocationRewriteRecipeLauncher();
|
|
||||||
InvocationResult result = launcher.invokeRewritePlugin(invoker, baseDir, recipeNames, dependencies,
|
|
||||||
debugConfig, buildConfig, lineConsumer, rewritePluginGoals);
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
private void validateRecipeNames(List<String> recipeNames) {
|
|
||||||
if (recipeNames.isEmpty()) {
|
|
||||||
throw new IllegalArgumentException("At least one recipe name must be provided.");
|
|
||||||
}
|
|
||||||
|
|
||||||
if (recipeNames.stream().anyMatch(String::isBlank)) {
|
|
||||||
throw new IllegalArgumentException("At least one recipe name was blank.");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public Builders.OptionalBuilder withDependencies(String... dependencyGavs) {
|
|
||||||
return withDependencies(Arrays.asList(dependencyGavs));
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public Builders.OptionalBuilder withDependencies(List<String> dependencyGavs) {
|
|
||||||
this.dependencies = dependencyGavs;
|
|
||||||
return this;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public Builders.OptionalBuilder withBuildConfig(BuildConfig buildConfig) {
|
|
||||||
this.buildConfig = buildConfig;
|
|
||||||
return this;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public Builders.OptionalBuilder withDebugConfig(DebugConfig debugConfig) {
|
|
||||||
this.debugConfig = debugConfig;
|
|
||||||
return this;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
@@ -1,156 +0,0 @@
|
|||||||
package org.springframework.rewrite.maven;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Copyright 2021 - 2023 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.
|
|
||||||
*/
|
|
||||||
|
|
||||||
import org.apache.maven.shared.invoker.*;
|
|
||||||
import org.junit.jupiter.api.BeforeEach;
|
|
||||||
import org.junit.jupiter.api.DisplayName;
|
|
||||||
import org.junit.jupiter.api.Test;
|
|
||||||
import org.junit.jupiter.api.io.TempDir;
|
|
||||||
import org.mockito.ArgumentCaptor;
|
|
||||||
import org.mockito.Mock;
|
|
||||||
|
|
||||||
import java.nio.file.Path;
|
|
||||||
import java.util.ArrayList;
|
|
||||||
import java.util.Arrays;
|
|
||||||
import java.util.List;
|
|
||||||
import java.util.function.Consumer;
|
|
||||||
|
|
||||||
import static org.assertj.core.api.Assertions.assertThat;
|
|
||||||
import static org.junit.jupiter.api.Assertions.assertThrows;
|
|
||||||
import static org.mockito.Mockito.*;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @author Fabian Krüger
|
|
||||||
*/
|
|
||||||
class MavenInvocationRewriteRecipeLauncherIntegrationTest {
|
|
||||||
|
|
||||||
@Mock
|
|
||||||
private Path baseDir = Path.of("./testcode/maven-projects/simple").toAbsolutePath().normalize();
|
|
||||||
|
|
||||||
@Test
|
|
||||||
@DisplayName("invokeRewritePlugin() method test")
|
|
||||||
void invokeRewritePluginMethodTest() {
|
|
||||||
List<String> capturedLines = new ArrayList<>();
|
|
||||||
MavenInvocationRewriteRecipeLauncher sut = new MavenInvocationRewriteRecipeLauncher();
|
|
||||||
sut.invokeRewritePlugin(Path.of("./testcode/maven-projects/simple"),
|
|
||||||
List.of("org.openrewrite.java.RemoveUnusedImports"), new ArrayList<>(), DebugConfig.from(9090, false),
|
|
||||||
BuildConfig.builder().skipTests(true).withMemory("64M", "256M").build(), capturedLines::add,
|
|
||||||
RewritePluginGoals.DRY_RUN);
|
|
||||||
assertThat(capturedLines).contains("Listening for transport dt_socket at address: 9090",
|
|
||||||
"[INFO] --- maven-clean-plugin:2.5:clean (default-clean) @ simple ---", "[INFO] Tests are skipped.",
|
|
||||||
"[INFO] Using active recipe(s) [org.openrewrite.java.RemoveUnusedImports]",
|
|
||||||
"[INFO] Using active styles(s) []", "[INFO] BUILD SUCCESS");
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
@DisplayName("mavenInvocationRequestBuilder success")
|
|
||||||
void mavenInvoker() {
|
|
||||||
List<String> capturedLines = new ArrayList<>();
|
|
||||||
Path baseDir = Path.of("./testcode/maven-projects/simple").toAbsolutePath().normalize();
|
|
||||||
|
|
||||||
InvocationResult result = MavenInvocationRewriteRecipeLauncher
|
|
||||||
.applyRecipes("org.openrewrite.java.RemoveUnusedImports", "org.openrewrite.java.format.AutoFormat")
|
|
||||||
.onDir(baseDir)
|
|
||||||
.withOutputListener(capturedLines::add)
|
|
||||||
.dryRun();
|
|
||||||
|
|
||||||
assertThat(result.getExitCode()).isEqualTo(0);
|
|
||||||
assertThat(capturedLines).contains("[INFO] Scanning for projects...",
|
|
||||||
"[INFO] --- maven-clean-plugin:2.5:clean (default-clean) @ simple ---",
|
|
||||||
"[INFO] Using active recipe(s) [org.openrewrite.java.RemoveUnusedImports, org.openrewrite.java.format.AutoFormat]",
|
|
||||||
"[INFO] BUILD SUCCESS");
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
@DisplayName("with debug enabled")
|
|
||||||
void withDebugEnabled() {
|
|
||||||
List<String> capturedLines = new ArrayList<>();
|
|
||||||
|
|
||||||
InvocationResult result = MavenInvocationRewriteRecipeLauncher
|
|
||||||
.applyRecipes("org.openrewrite.java.RemoveUnusedImports")
|
|
||||||
.onDir(Path.of("./testcode/maven-projects/simple").toAbsolutePath().normalize())
|
|
||||||
.withOutputListener(capturedLines::add)
|
|
||||||
.withDebugConfig(DebugConfig.fromDefault())
|
|
||||||
.withBuildConfig(BuildConfig.builder().withMemory("1G", "6G").build())
|
|
||||||
.run();
|
|
||||||
assertThat(capturedLines).contains("Listening for transport dt_socket at address: 5005");
|
|
||||||
assertThat(result.getExitCode()).isEqualTo(0);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
@DisplayName("cyclonedx")
|
|
||||||
void cyclonedx() {
|
|
||||||
List<String> lines = new ArrayList<>();
|
|
||||||
MavenInvocationRewriteRecipeLauncher.Builders.OptionalBuilder builder = getBuilder(lines);
|
|
||||||
InvocationResult result = builder.cyclonedx();
|
|
||||||
assertThat(result.getExitCode()).isEqualTo(0);
|
|
||||||
assertThat(lines.stream().anyMatch(l -> l.endsWith(":cyclonedx (default-cli) @ simple ---"))).isTrue();
|
|
||||||
assertThat(baseDir.resolve("target/simple-0.1.0-SNAPSHOT-cyclonedx.xml")).exists();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
@DisplayName("dryRun")
|
|
||||||
void dryRun() {
|
|
||||||
List<String> lines = new ArrayList<>();
|
|
||||||
MavenInvocationRewriteRecipeLauncher.Builders.OptionalBuilder builder = getBuilder(lines);
|
|
||||||
InvocationResult result = builder.dryRun();
|
|
||||||
assertThat(result.getExitCode()).isEqualTo(0);
|
|
||||||
assertThat(lines.stream().anyMatch(l -> l.endsWith(":dryRun (default-cli) @ simple ---"))).isTrue();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
@DisplayName("dryRunNoFork")
|
|
||||||
void dryRunNoFork() {
|
|
||||||
List<String> lines = new ArrayList<>();
|
|
||||||
MavenInvocationRewriteRecipeLauncher.Builders.OptionalBuilder builder = getBuilder(lines);
|
|
||||||
InvocationResult result = builder.dryRunNoFork();
|
|
||||||
assertThat(result.getExitCode()).isEqualTo(0);
|
|
||||||
assertThat(lines.stream().anyMatch(l -> l.endsWith(":dryRunNoFork (default-cli) @ simple ---"))).isTrue();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
@DisplayName("runNoFork")
|
|
||||||
void runNoFork() {
|
|
||||||
List<String> lines = new ArrayList<>();
|
|
||||||
MavenInvocationRewriteRecipeLauncher.Builders.OptionalBuilder builder = getBuilder(lines);
|
|
||||||
InvocationResult result = builder.dryRunNoFork();
|
|
||||||
assertThat(result.getExitCode()).isEqualTo(0);
|
|
||||||
assertThat(lines.stream().anyMatch(l -> l.endsWith(":dryRunNoFork (default-cli) @ simple ---"))).isTrue();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
@DisplayName("discover")
|
|
||||||
void discover() {
|
|
||||||
List<String> lines = new ArrayList<>();
|
|
||||||
MavenInvocationRewriteRecipeLauncher.Builders.OptionalBuilder builder = getBuilder(lines);
|
|
||||||
InvocationResult result = builder.discover();
|
|
||||||
assertThat(result.getExitCode()).isEqualTo(0);
|
|
||||||
assertThat(lines).contains("[INFO] Available Recipes:", "[INFO] org.openrewrite.FindSourceFiles");
|
|
||||||
assertThat(lines.stream().anyMatch(l -> l.endsWith(":discover (default-cli) @ simple ---"))).isTrue();
|
|
||||||
}
|
|
||||||
|
|
||||||
private static MavenInvocationRewriteRecipeLauncher.Builders.OptionalBuilder getBuilder(List<String> lines) {
|
|
||||||
Path baseDir = Path.of("./testcode/maven-projects/simple").toAbsolutePath().normalize();
|
|
||||||
MavenInvocationRewriteRecipeLauncher.Builders.OptionalBuilder builder = MavenInvocationRewriteRecipeLauncher
|
|
||||||
.applyRecipes("org.openrewrite.java.RemoveUnusedImports")
|
|
||||||
.onDir(baseDir)
|
|
||||||
.withOutputListener(lines::add);
|
|
||||||
return builder;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
@@ -1,192 +0,0 @@
|
|||||||
package org.springframework.rewrite.maven;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Copyright 2021 - 2023 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.
|
|
||||||
*/
|
|
||||||
|
|
||||||
import org.apache.maven.shared.invoker.*;
|
|
||||||
import org.junit.jupiter.api.BeforeEach;
|
|
||||||
import org.junit.jupiter.api.DisplayName;
|
|
||||||
import org.junit.jupiter.api.Test;
|
|
||||||
import org.junit.jupiter.api.io.TempDir;
|
|
||||||
import org.mockito.ArgumentCaptor;
|
|
||||||
import org.mockito.Mock;
|
|
||||||
import org.springframework.test.util.ReflectionTestUtils;
|
|
||||||
|
|
||||||
import java.nio.file.Path;
|
|
||||||
import java.util.ArrayList;
|
|
||||||
import java.util.Arrays;
|
|
||||||
import java.util.List;
|
|
||||||
import java.util.function.Consumer;
|
|
||||||
|
|
||||||
import static org.assertj.core.api.Assertions.assertThat;
|
|
||||||
import static org.junit.jupiter.api.Assertions.assertThrows;
|
|
||||||
import static org.mockito.Mockito.*;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @author Fabian Krüger
|
|
||||||
*/
|
|
||||||
class MavenInvocationRewriteRecipeLauncherTest {
|
|
||||||
|
|
||||||
private static final int SUCCESS = 0;
|
|
||||||
|
|
||||||
private MavenInvocationRewriteRecipeLauncher.Builders.OptionalBuilder invokerBuilder;
|
|
||||||
|
|
||||||
@Mock
|
|
||||||
Invoker mavenInvoker = mock(Invoker.class);
|
|
||||||
|
|
||||||
private Path baseDir = Path.of("./testcode/maven-projects/simple").toAbsolutePath().normalize();
|
|
||||||
|
|
||||||
private List<String> capturedLines = new ArrayList<>();
|
|
||||||
|
|
||||||
private Consumer<String> outputListener = capturedLines::add;
|
|
||||||
|
|
||||||
@BeforeEach
|
|
||||||
void beforeEach() throws MavenInvocationException {
|
|
||||||
outputListener = capturedLines::add;
|
|
||||||
invokerBuilder = MavenInvocationRewriteRecipeLauncher
|
|
||||||
.applyRecipes("org.openrewrite.java.RemoveUnusedImports", "org.openrewrite.java.format.AutoFormat")
|
|
||||||
.onDir(baseDir)
|
|
||||||
.withInvoker(mavenInvoker)
|
|
||||||
.withOutputListener(outputListener);
|
|
||||||
|
|
||||||
InvocationResult result = new DummyInvocationResult();
|
|
||||||
when(mavenInvoker.execute(any(InvocationRequest.class))).thenReturn(result);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
@DisplayName("minimal")
|
|
||||||
void minimal() throws MavenInvocationException {
|
|
||||||
InvocationResult actualResult = invokerBuilder.run();
|
|
||||||
|
|
||||||
assertThat(actualResult.getExitCode()).isEqualTo(0);
|
|
||||||
String[] expectedGoals = { "clean", "package", "--fail-at-end",
|
|
||||||
"org.openrewrite.maven:rewrite-maven-plugin:run -Drewrite.activeRecipes=org.openrewrite.java.RemoveUnusedImports,org.openrewrite.java.format.AutoFormat" };
|
|
||||||
verifyCallToMaven(expectedGoals);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
@DisplayName("with dependencies")
|
|
||||||
void withDependencies() throws MavenInvocationException {
|
|
||||||
InvocationResult actualResult = invokerBuilder
|
|
||||||
.withDependencies("com.example:some-dep:1.0.0", "com.example:another-dep:1.0.0")
|
|
||||||
.run();
|
|
||||||
assertThat(actualResult.getExitCode()).isEqualTo(0);
|
|
||||||
String[] expectedGoals = { "clean", "package", "--fail-at-end",
|
|
||||||
"org.openrewrite.maven:rewrite-maven-plugin:run -Drewrite.activeRecipes=org.openrewrite.java.RemoveUnusedImports,org.openrewrite.java.format.AutoFormat -Drewrite.recipeArtifactCoordinates=com.example:some-dep:1.0.0,com.example:another-dep:1.0.0" };
|
|
||||||
verifyCallToMaven(expectedGoals);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
@DisplayName("with build tools config")
|
|
||||||
void withBuildToolConfig() throws MavenInvocationException {
|
|
||||||
|
|
||||||
InvocationResult actualResult = invokerBuilder
|
|
||||||
.withBuildConfig(BuildConfig.builder().withMemory("64M", "256M").skipTests(true).build())
|
|
||||||
.run();
|
|
||||||
assertThat(actualResult.getExitCode()).isEqualTo(0);
|
|
||||||
String[] expectedGoals = { "clean", "package", "--fail-at-end",
|
|
||||||
"org.openrewrite.maven:rewrite-maven-plugin:run -Drewrite.activeRecipes=org.openrewrite.java.RemoveUnusedImports,org.openrewrite.java.format.AutoFormat" };
|
|
||||||
verifyCallToMaven(expectedGoals, BuildConfig.builder().withMemory("64M", "256M").skipTests(true).build());
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
@DisplayName("builder")
|
|
||||||
void builder(@TempDir Path tempDir) {
|
|
||||||
InvocationResult result = MavenInvocationRewriteRecipeLauncher.applyRecipes("recipe1").onDir(tempDir).run();
|
|
||||||
|
|
||||||
MavenInvocationRewriteRecipeLauncher.applyRecipes("recipe1").onDir(tempDir).withDependencies("", "").run();
|
|
||||||
|
|
||||||
MavenInvocationRewriteRecipeLauncher.applyRecipes(List.of("NoName")).onDir(tempDir).withDependencies("").run();
|
|
||||||
|
|
||||||
// build tool config only
|
|
||||||
MavenInvocationRewriteRecipeLauncher.applyRecipes(List.of("NoName"))
|
|
||||||
.onDir(tempDir)
|
|
||||||
.withDependencies("")
|
|
||||||
.withBuildConfig(BuildConfig.defaultConfig())
|
|
||||||
.run();
|
|
||||||
|
|
||||||
// debug config only
|
|
||||||
MavenInvocationRewriteRecipeLauncher.applyRecipes("NoName")
|
|
||||||
.onDir(tempDir)
|
|
||||||
.withDependencies("")
|
|
||||||
.withDebugConfig(DebugConfig.disabled())
|
|
||||||
.run();
|
|
||||||
|
|
||||||
MavenInvocationRewriteRecipeLauncher.applyRecipes(List.of("NoName"))
|
|
||||||
.onDir(tempDir)
|
|
||||||
.withDependencies("")
|
|
||||||
.withDebugConfig(DebugConfig.disabled())
|
|
||||||
.dryRun();
|
|
||||||
|
|
||||||
// build tool and debug config
|
|
||||||
MavenInvocationRewriteRecipeLauncher.applyRecipes(List.of("NoName"))
|
|
||||||
.onDir(tempDir)
|
|
||||||
.withDependencies("")
|
|
||||||
.withBuildConfig(BuildConfig.defaultConfig())
|
|
||||||
.withDebugConfig(DebugConfig.disabled())
|
|
||||||
.run();
|
|
||||||
|
|
||||||
MavenInvocationRewriteRecipeLauncher.applyRecipes("NoName").onDir(tempDir).run();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
@DisplayName("missing recipeNames should throw exception")
|
|
||||||
void missingRecipeNamesShouldThrowException() {
|
|
||||||
assertThrows(IllegalArgumentException.class, () -> {
|
|
||||||
MavenInvocationRewriteRecipeLauncher.applyRecipes("").onDir(Path.of("")).run();
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
@DisplayName("mavenInvocationRequestBuilder extra memory")
|
|
||||||
void mavenInvokerExtraMemory() {
|
|
||||||
List<String> lines = new ArrayList<>();
|
|
||||||
Path baseDir = Path.of("./testcode/maven-projects/simple").toAbsolutePath().normalize();
|
|
||||||
|
|
||||||
InvocationResult result = MavenInvocationRewriteRecipeLauncher
|
|
||||||
.applyRecipes("org.openrewrite.java.RemoveUnusedImports")
|
|
||||||
.onDir(baseDir)
|
|
||||||
.withBuildConfig(BuildConfig.builder().skipTests(false).withMemory("32M", "1G").build())
|
|
||||||
.withOutputListener(lines::add)
|
|
||||||
.dryRun();
|
|
||||||
|
|
||||||
assertThat(result.getExitCode()).isEqualTo(SUCCESS);
|
|
||||||
assertThat(lines).contains("[INFO] Scanning for projects...",
|
|
||||||
"[INFO] --- maven-clean-plugin:2.5:clean (default-clean) @ simple ---", "[INFO] BUILD SUCCESS");
|
|
||||||
}
|
|
||||||
|
|
||||||
private void verifyCallToMaven(String[] expectedGoals) throws MavenInvocationException {
|
|
||||||
BuildConfig buildConfig = BuildConfig.defaultConfig();
|
|
||||||
verifyCallToMaven(expectedGoals, buildConfig, DebugConfig.disabled(), baseDir, outputListener,
|
|
||||||
Arrays.asList(expectedGoals));
|
|
||||||
}
|
|
||||||
|
|
||||||
private void verifyCallToMaven(String[] expectedGoals, BuildConfig buildConfig) throws MavenInvocationException {
|
|
||||||
verifyCallToMaven(expectedGoals, buildConfig, DebugConfig.disabled(), baseDir, outputListener,
|
|
||||||
Arrays.asList(expectedGoals));
|
|
||||||
}
|
|
||||||
|
|
||||||
private void verifyCallToMaven(String[] expectedGoals, BuildConfig buildConfig, DebugConfig debugConfig,
|
|
||||||
Path baseDir, Consumer<String> lineConsumer, List<String> givenGoals) throws MavenInvocationException {
|
|
||||||
InvocationRequest mavenInvocationRequest = new MavenInvocationRequestFactory()
|
|
||||||
.createMavenInvocationRequest(baseDir, debugConfig, buildConfig, givenGoals, lineConsumer);
|
|
||||||
ArgumentCaptor<InvocationRequest> captor = ArgumentCaptor.forClass(InvocationRequest.class);
|
|
||||||
verify(mavenInvoker).execute(captor.capture());
|
|
||||||
InvocationRequest request = captor.getValue();
|
|
||||||
assertThat(request).usingRecursiveComparison().isEqualTo(mavenInvocationRequest);
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
42
spring-rewrite-commons-plugin-invoker/pom.xml
Normal file
42
spring-rewrite-commons-plugin-invoker/pom.xml
Normal file
@@ -0,0 +1,42 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<project xmlns="http://maven.apache.org/POM/4.0.0"
|
||||||
|
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||||
|
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
||||||
|
<modelVersion>4.0.0</modelVersion>
|
||||||
|
<parent>
|
||||||
|
<groupId>org.springframework.rewrite</groupId>
|
||||||
|
<artifactId>spring-rewrite-commons</artifactId>
|
||||||
|
<version>0.1.0-SNAPSHOT</version>
|
||||||
|
</parent>
|
||||||
|
|
||||||
|
<artifactId>spring-rewrite-commons-plugin-invoker</artifactId>
|
||||||
|
<packaging>pom</packaging>
|
||||||
|
|
||||||
|
<properties>
|
||||||
|
<maven.compiler.source>17</maven.compiler.source>
|
||||||
|
<maven.compiler.target>17</maven.compiler.target>
|
||||||
|
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
|
||||||
|
</properties>
|
||||||
|
|
||||||
|
<modules>
|
||||||
|
<module>spring-rewrite-commons-plugin-invoker-shared</module>
|
||||||
|
<module>spring-rewrite-commons-plugin-invoker-maven</module>
|
||||||
|
<module>spring-rewrite-commons-plugin-invoker-gradle</module>
|
||||||
|
<module>spring-rewrite-commons-plugin-invoker-polyglot</module>
|
||||||
|
</modules>
|
||||||
|
|
||||||
|
<dependencyManagement>
|
||||||
|
<dependencies>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.springframework.rewrite</groupId>
|
||||||
|
<artifactId>spring-rewrite-commons-plugin-invoker-maven</artifactId>
|
||||||
|
<version>0.1.0-SNAPSHOT</version>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.springframework.rewrite</groupId>
|
||||||
|
<artifactId>spring-rewrite-commons-plugin-invoker-gradle</artifactId>
|
||||||
|
<version>0.1.0-SNAPSHOT</version>
|
||||||
|
</dependency>
|
||||||
|
</dependencies>
|
||||||
|
</dependencyManagement>
|
||||||
|
</project>
|
||||||
@@ -0,0 +1,47 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<project xmlns="http://maven.apache.org/POM/4.0.0"
|
||||||
|
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||||
|
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
||||||
|
<modelVersion>4.0.0</modelVersion>
|
||||||
|
<parent>
|
||||||
|
<groupId>org.springframework.rewrite</groupId>
|
||||||
|
<artifactId>spring-rewrite-commons-plugin-invoker</artifactId>
|
||||||
|
<version>0.1.0-SNAPSHOT</version>
|
||||||
|
</parent>
|
||||||
|
|
||||||
|
<artifactId>spring-rewrite-commons-plugin-invoker-gradle</artifactId>
|
||||||
|
|
||||||
|
<properties>
|
||||||
|
<maven.compiler.source>17</maven.compiler.source>
|
||||||
|
<maven.compiler.target>17</maven.compiler.target>
|
||||||
|
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
|
||||||
|
</properties>
|
||||||
|
|
||||||
|
<dependencies>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.gradle</groupId>
|
||||||
|
<artifactId>gradle-tooling-api</artifactId>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.springframework.rewrite</groupId>
|
||||||
|
<artifactId>spring-rewrite-commons-plugin-invoker-shared</artifactId>
|
||||||
|
<version>${project.version}</version>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.openrewrite</groupId>
|
||||||
|
<artifactId>rewrite-core</artifactId>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.springframework.boot</groupId>
|
||||||
|
<artifactId>spring-boot-starter-test</artifactId>
|
||||||
|
<scope>test</scope>
|
||||||
|
</dependency>
|
||||||
|
</dependencies>
|
||||||
|
|
||||||
|
<repositories>
|
||||||
|
<repository>
|
||||||
|
<id>gradle</id>
|
||||||
|
<url>https://repo.gradle.org/gradle/libs-releases</url>
|
||||||
|
</repository>
|
||||||
|
</repositories>
|
||||||
|
</project>
|
||||||
@@ -0,0 +1,42 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2021 - 2023 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.rewrite.plugin.gradle;
|
||||||
|
|
||||||
|
import org.openrewrite.marker.BuildTool;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author Fabian Krüger
|
||||||
|
*/
|
||||||
|
public class GradleInvocationResult {
|
||||||
|
|
||||||
|
private final String output;
|
||||||
|
|
||||||
|
private final String error;
|
||||||
|
|
||||||
|
public GradleInvocationResult(String output, String error) {
|
||||||
|
this.output = output;
|
||||||
|
this.error = error;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getOutput() {
|
||||||
|
return output;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getError() {
|
||||||
|
return error;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,63 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2021 - 2023 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.rewrite.plugin.gradle;
|
||||||
|
|
||||||
|
import org.gradle.tooling.BuildLauncher;
|
||||||
|
import org.gradle.tooling.GradleConnector;
|
||||||
|
import org.gradle.tooling.ProjectConnection;
|
||||||
|
import org.gradle.tooling.internal.consumer.DefaultGradleConnector;
|
||||||
|
|
||||||
|
import java.io.ByteArrayOutputStream;
|
||||||
|
import java.io.OutputStream;
|
||||||
|
import java.nio.file.Files;
|
||||||
|
import java.nio.file.Path;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author Fabian Krüger
|
||||||
|
*/
|
||||||
|
public class GradleInvoker {
|
||||||
|
|
||||||
|
private static BuildLauncher getBuildLauncher(Path baseDir, OutputStream os, String[] tasks) {
|
||||||
|
ProjectConnection connection = getProjectConnection(baseDir);
|
||||||
|
BuildLauncher buildLauncher = connection.newBuild().setStandardOutput(os).forTasks(tasks);
|
||||||
|
return buildLauncher;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static GradleInvocationResult runTasks(Path baseDir, String[] args, String... tasks) {
|
||||||
|
ByteArrayOutputStream os = new ByteArrayOutputStream();
|
||||||
|
ByteArrayOutputStream es = new ByteArrayOutputStream();
|
||||||
|
BuildLauncher buildLauncher = getBuildLauncher(baseDir, os, tasks);
|
||||||
|
buildLauncher.addArguments(args);
|
||||||
|
buildLauncher.setStandardError(es);
|
||||||
|
buildLauncher.run();
|
||||||
|
return new GradleInvocationResult(new String(os.toByteArray()), new String(es.toByteArray()));
|
||||||
|
}
|
||||||
|
|
||||||
|
protected static ProjectConnection getProjectConnection(Path projectDir) {
|
||||||
|
ProjectConnection connection;
|
||||||
|
var connector = (DefaultGradleConnector) GradleConnector.newConnector();
|
||||||
|
if (Files.exists(projectDir.resolve("gradle/wrapper/gradle-wrapper.properties"))) {
|
||||||
|
connector.useBuildDistribution();
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
connector.useGradleVersion("8.4");
|
||||||
|
}
|
||||||
|
|
||||||
|
connection = connector.forProjectDirectory(projectDir.toFile()).connect();
|
||||||
|
return connection;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,56 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2021 - 2023 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.rewrite.plugin.gradle;
|
||||||
|
|
||||||
|
import org.springframework.rewrite.plugin.shared.DebugConfig;
|
||||||
|
import org.springframework.rewrite.plugin.shared.PluginInvocationResult;
|
||||||
|
|
||||||
|
import java.nio.file.Path;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author Fabian Krüger
|
||||||
|
*/
|
||||||
|
public interface OpenRewriteGradlePluginBuilder {
|
||||||
|
|
||||||
|
public interface Recipes {
|
||||||
|
|
||||||
|
PluginVersion recipes(String... recipeNames);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public interface FinalizingBuilder {
|
||||||
|
|
||||||
|
FinalizingBuilder withDebugger(int port, boolean suspend);
|
||||||
|
|
||||||
|
FinalizingBuilder withDependencies(String... dependencies);
|
||||||
|
|
||||||
|
FinalizingBuilder withDebug();
|
||||||
|
|
||||||
|
FinalizingBuilder withMemory(String minMemory, String maxMemory);
|
||||||
|
|
||||||
|
FinalizingBuilder withDebugConfig(DebugConfig debugConfig);
|
||||||
|
|
||||||
|
PluginInvocationResult onDir(Path baseDir);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public interface PluginVersion {
|
||||||
|
|
||||||
|
FinalizingBuilder usingPluginVersion(String version);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,199 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2021 - 2023 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.rewrite.plugin.gradle;
|
||||||
|
|
||||||
|
import org.slf4j.Logger;
|
||||||
|
import org.slf4j.LoggerFactory;
|
||||||
|
import org.springframework.rewrite.plugin.shared.BuildConfig;
|
||||||
|
import org.springframework.rewrite.plugin.shared.DebugConfig;
|
||||||
|
import org.springframework.rewrite.plugin.shared.PluginInvocationResult;
|
||||||
|
|
||||||
|
import java.nio.file.Path;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.Arrays;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.stream.Collectors;
|
||||||
|
import java.util.stream.Stream;
|
||||||
|
|
||||||
|
import static org.springframework.rewrite.plugin.gradle.RewriteGradlePlugin.Task.*;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author Fabian Krüger
|
||||||
|
*/
|
||||||
|
public class RewriteGradlePlugin implements OpenRewriteGradlePluginBuilder.Recipes,
|
||||||
|
OpenRewriteGradlePluginBuilder.FinalizingBuilder, OpenRewriteGradlePluginBuilder.PluginVersion {
|
||||||
|
|
||||||
|
private static final Logger log = LoggerFactory.getLogger(RewriteGradlePlugin.class);
|
||||||
|
|
||||||
|
private Task task;
|
||||||
|
|
||||||
|
private List<String> dependencies = new ArrayList<>();
|
||||||
|
|
||||||
|
private String pluginVersion;
|
||||||
|
|
||||||
|
private List<String> recipes = new ArrayList<>();
|
||||||
|
|
||||||
|
private DebugConfig debugConfig = DebugConfig.disabled();
|
||||||
|
|
||||||
|
private String minMemory;
|
||||||
|
|
||||||
|
private String maxMemory;
|
||||||
|
|
||||||
|
private boolean debug = false;
|
||||||
|
|
||||||
|
public static OpenRewriteGradlePluginBuilder.Recipes run() {
|
||||||
|
return executeGradleRewritePlugin(RUN);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static OpenRewriteGradlePluginBuilder.Recipes dryRun() {
|
||||||
|
return executeGradleRewritePlugin(DRY_RUN);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static OpenRewriteGradlePluginBuilder.Recipes discover() {
|
||||||
|
return executeGradleRewritePlugin(DISCOVER);
|
||||||
|
}
|
||||||
|
|
||||||
|
private static OpenRewriteGradlePluginBuilder.Recipes executeGradleRewritePlugin(Task task) {
|
||||||
|
RewriteGradlePlugin plugin = new RewriteGradlePlugin();
|
||||||
|
plugin.task = task;
|
||||||
|
return plugin;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public OpenRewriteGradlePluginBuilder.PluginVersion recipes(String... recipeNames) {
|
||||||
|
this.recipes = Arrays.asList(recipeNames);
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public OpenRewriteGradlePluginBuilder.FinalizingBuilder withDebugger(int port, boolean suspend) {
|
||||||
|
this.debugConfig = DebugConfig.from(port, suspend);
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public OpenRewriteGradlePluginBuilder.FinalizingBuilder withDependencies(String... dependencies) {
|
||||||
|
this.dependencies = Arrays.asList(dependencies);
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public OpenRewriteGradlePluginBuilder.FinalizingBuilder withDebug() {
|
||||||
|
this.debug = true;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public OpenRewriteGradlePluginBuilder.FinalizingBuilder withMemory(String minMemory, String maxMemory) {
|
||||||
|
this.minMemory = minMemory;
|
||||||
|
this.maxMemory = maxMemory;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public PluginInvocationResult onDir(Path baseDir) {
|
||||||
|
baseDir = baseDir.toAbsolutePath().normalize();
|
||||||
|
BuildConfig buildConfig = BuildConfig.defaultConfig();
|
||||||
|
if (minMemory != null && !minMemory.isBlank()) {
|
||||||
|
buildConfig = BuildConfig.builder().withMemory(minMemory, maxMemory).build();
|
||||||
|
}
|
||||||
|
GradleInvocationResult result = execute(baseDir, debug, debugConfig, buildConfig, task, dependencies,
|
||||||
|
pluginVersion, recipes.toArray(String[]::new));
|
||||||
|
boolean success = result.getError() == null || result.getError().isEmpty();
|
||||||
|
return new PluginInvocationResult(success, result.getOutput());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public OpenRewriteGradlePluginBuilder.FinalizingBuilder withDebugConfig(DebugConfig debugConfig) {
|
||||||
|
this.debugConfig = debugConfig;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Executes given OpenRewrite recipes using Gradle Tooling API.
|
||||||
|
* @param baseDir the dir getting parsed
|
||||||
|
* @param debug print debug output
|
||||||
|
* @param debugConfig set remote debug config to debug the recipe execution
|
||||||
|
*/
|
||||||
|
static GradleInvocationResult execute(Path baseDir, boolean debug, DebugConfig debugConfig, BuildConfig buildConfig,
|
||||||
|
Task goal, List<String> dependencies, String pluginVersion, String... recipes) {
|
||||||
|
|
||||||
|
try (TempGradleInitFile initFile = new TempGradleInitFile(baseDir, dependencies, pluginVersion)) {
|
||||||
|
String initFileLocation = initFile.getPath().toString();
|
||||||
|
|
||||||
|
List<String> args = new ArrayList<>();
|
||||||
|
|
||||||
|
// provide init file location
|
||||||
|
args.add("-I%s".formatted(initFileLocation));
|
||||||
|
// the recipes
|
||||||
|
args.add("-Drewrite.activeRecipe=%s".formatted(Stream.of(recipes).collect(Collectors.joining(","))));
|
||||||
|
// debug outout
|
||||||
|
if (debug) {
|
||||||
|
args.add("-d");
|
||||||
|
}
|
||||||
|
// Remote debugging
|
||||||
|
if (debugConfig.isDebugEnabled()) {
|
||||||
|
args.add("-Dorg.gradle.logging.stacktrace=full");
|
||||||
|
args.add("-Dorg.gradle.debug=true");
|
||||||
|
args.add("-Dorg.gradle.debug.port=" + debugConfig.getPort());
|
||||||
|
args.add("-Dorg.gradle.debug.suspend=" + debugConfig.isSuspend());
|
||||||
|
}
|
||||||
|
// JVM Memory
|
||||||
|
List<String> jvmArgs = new ArrayList<>();
|
||||||
|
if (buildConfig.hasMemorySettings()) {
|
||||||
|
String min = buildConfig.getMemorySettings().getMin();
|
||||||
|
String max = buildConfig.getMemorySettings().getMax();
|
||||||
|
jvmArgs.add("-Xms%s -Xmx%s".formatted(min, max));
|
||||||
|
String jvmArgsStr = jvmArgs.stream().collect(Collectors.joining(" "));
|
||||||
|
args.add("-Dorg.gradle.jvmargs=%s".formatted(jvmArgsStr));
|
||||||
|
}
|
||||||
|
|
||||||
|
if (log.isDebugEnabled()) {
|
||||||
|
log.debug("Command: ./gradlew %s %s".formatted(goal.getTask(),
|
||||||
|
args.stream().collect(Collectors.joining(" "))));
|
||||||
|
log.debug(initFileLocation + " \n" + initFile.getContent());
|
||||||
|
}
|
||||||
|
|
||||||
|
return GradleInvoker.runTasks(baseDir, args.toArray(String[]::new), goal.getTask());
|
||||||
|
}
|
||||||
|
finally {
|
||||||
|
TempGradleInitFile.clear(baseDir);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public OpenRewriteGradlePluginBuilder.FinalizingBuilder usingPluginVersion(String version) {
|
||||||
|
this.pluginVersion = version;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
enum Task {
|
||||||
|
|
||||||
|
RUN("rewriteRun"), DRY_RUN("rewriteDryRun"), DISCOVER("rewriteDiscover");
|
||||||
|
|
||||||
|
private final String task;
|
||||||
|
|
||||||
|
Task(String task) {
|
||||||
|
this.task = task;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getTask() {
|
||||||
|
return task;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,107 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2021 - 2023 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.rewrite.plugin.gradle;
|
||||||
|
|
||||||
|
import java.io.Closeable;
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.nio.file.Files;
|
||||||
|
import java.nio.file.Path;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author Fabian Krüger
|
||||||
|
*/
|
||||||
|
public class TempGradleInitFile implements Closeable {
|
||||||
|
|
||||||
|
private static final String template = """
|
||||||
|
initscript {
|
||||||
|
repositories {
|
||||||
|
maven { url "https://plugins.gradle.org/m2" }
|
||||||
|
}
|
||||||
|
dependencies {
|
||||||
|
classpath("org.openrewrite:plugin:%s")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
rootProject {
|
||||||
|
plugins.apply(org.openrewrite.gradle.RewritePlugin)
|
||||||
|
dependencies {
|
||||||
|
%s
|
||||||
|
}
|
||||||
|
|
||||||
|
afterEvaluate {
|
||||||
|
if (repositories.isEmpty()) {
|
||||||
|
repositories {
|
||||||
|
mavenCentral()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
""";
|
||||||
|
|
||||||
|
private final Path gradleFile;
|
||||||
|
|
||||||
|
private final String initFileContent;
|
||||||
|
|
||||||
|
public TempGradleInitFile(Path baseDir, List<String> dependencies, String pluginVersion) {
|
||||||
|
String dependenciesStr = dependencies.stream()
|
||||||
|
.map(d -> " rewrite(\"" + d + "\")")
|
||||||
|
.collect(Collectors.joining("\n"));
|
||||||
|
initFileContent = template.formatted(pluginVersion, dependenciesStr);
|
||||||
|
try {
|
||||||
|
gradleFile = baseDir.resolve("recipes.init.gradle").toAbsolutePath().normalize();
|
||||||
|
gradleFile.toFile().getParentFile().mkdirs();
|
||||||
|
Files.writeString(gradleFile, initFileContent);
|
||||||
|
}
|
||||||
|
catch (IOException e) {
|
||||||
|
throw new RuntimeException(e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void clear(Path baseDir) {
|
||||||
|
Path gradleFile = baseDir.resolve("recipes.init.gradle");
|
||||||
|
if (Files.exists(gradleFile)) {
|
||||||
|
try {
|
||||||
|
Files.delete(gradleFile);
|
||||||
|
}
|
||||||
|
catch (IOException e) {
|
||||||
|
throw new RuntimeException(e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getContent() {
|
||||||
|
return initFileContent;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Path getPath() {
|
||||||
|
return gradleFile;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void close() {
|
||||||
|
if (Files.exists(gradleFile)) {
|
||||||
|
try {
|
||||||
|
Files.delete(gradleFile);
|
||||||
|
}
|
||||||
|
catch (IOException e) {
|
||||||
|
throw new RuntimeException(e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,145 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2021 - 2023 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.rewrite.plugin.gradle;
|
||||||
|
|
||||||
|
import org.junit.jupiter.api.DisplayName;
|
||||||
|
import org.junit.jupiter.api.Test;
|
||||||
|
import org.springframework.rewrite.plugin.shared.PluginInvocationResult;
|
||||||
|
import org.springframework.test.util.TestSocketUtils;
|
||||||
|
|
||||||
|
import java.nio.file.Path;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.Arrays;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.stream.Collectors;
|
||||||
|
import java.util.stream.Stream;
|
||||||
|
|
||||||
|
import static org.assertj.core.api.Assertions.assertThat;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author Fabian Krüger
|
||||||
|
*/
|
||||||
|
public class RewriteGradlePluginTest {
|
||||||
|
|
||||||
|
public static final String[] RECIPES = { "org.openrewrite.java.RemoveUnusedImports",
|
||||||
|
"org.openrewrite.java.format.NormalizeLineBreaks" };
|
||||||
|
|
||||||
|
public static final String[] EXTENDED_RECIPES = { "org.openrewrite.java.RemoveUnusedImports",
|
||||||
|
"org.openrewrite.java.format.NormalizeLineBreaks",
|
||||||
|
"org.openrewrite.java.migrate.jakarta.MaybeAddJakartaServletApi" };
|
||||||
|
|
||||||
|
public static final String[] DEFAULT_TASKS = new String[] { "compileJava", "processResources", "classes",
|
||||||
|
"compileTestJava", "rewriteResolveDependencies" };
|
||||||
|
|
||||||
|
public static final String EXTENDED_RECIPES_DEPS = "org.openrewrite.recipe:rewrite-migrate-java:2.9.0";
|
||||||
|
|
||||||
|
@Test
|
||||||
|
@DisplayName("simple project minimal setup")
|
||||||
|
void simpleProjectMinimalSetup() {
|
||||||
|
Path baseDir = Path.of("./testcode/gradle-projects/simple");
|
||||||
|
PluginInvocationResult result = RewriteGradlePlugin.dryRun()
|
||||||
|
.recipes(RECIPES)
|
||||||
|
.usingPluginVersion("6.10.0")
|
||||||
|
.onDir(baseDir);
|
||||||
|
|
||||||
|
String out = result.capturedOutput();
|
||||||
|
assertThat(result.success()).isTrue();
|
||||||
|
assertSuccessfulBuild(out);
|
||||||
|
assertTasksExecuted(out, DEFAULT_TASKS, "rewriteDryRun");
|
||||||
|
assertRecipesExecuted(out, RECIPES);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
@DisplayName("simple project skip tests")
|
||||||
|
void simpleProjectSkipTests() {
|
||||||
|
Path baseDir = Path.of("./testcode/gradle-projects/simple");
|
||||||
|
PluginInvocationResult result = RewriteGradlePlugin.run()
|
||||||
|
.recipes(RECIPES)
|
||||||
|
.usingPluginVersion("6.10.0")
|
||||||
|
.withMemory("256M", "1G")
|
||||||
|
.onDir(baseDir);
|
||||||
|
|
||||||
|
String out = result.capturedOutput();
|
||||||
|
assertThat(result.success()).isTrue();
|
||||||
|
assertSuccessfulBuild(out);
|
||||||
|
assertTasksExecuted(out, DEFAULT_TASKS, "rewriteRun");
|
||||||
|
assertRecipesExecuted(out, RECIPES);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
@DisplayName("simple project full config")
|
||||||
|
void simpleProjectFullConfig() {
|
||||||
|
Path baseDir = Path.of("./testcode/gradle-projects/simple");
|
||||||
|
|
||||||
|
int port = TestSocketUtils.findAvailableTcpPort();
|
||||||
|
|
||||||
|
PluginInvocationResult result = RewriteGradlePlugin.run()
|
||||||
|
.recipes(EXTENDED_RECIPES)
|
||||||
|
.usingPluginVersion("6.10.0")
|
||||||
|
.withDebugger(port, false)
|
||||||
|
.withDependencies(EXTENDED_RECIPES_DEPS)
|
||||||
|
.withDebug()
|
||||||
|
.withMemory("64M", "484M")
|
||||||
|
.onDir(baseDir);
|
||||||
|
|
||||||
|
assertThat(result.success()).isTrue();
|
||||||
|
String out = result.capturedOutput();
|
||||||
|
assertMemory(out, "64M", "484M");
|
||||||
|
assertDebugConfig(out, port, false);
|
||||||
|
assertRecipesExecuted(out, EXTENDED_RECIPES);
|
||||||
|
assertTasksExecuted(out, DEFAULT_TASKS, "rewriteRun");
|
||||||
|
}
|
||||||
|
|
||||||
|
private void assertDebugConfig(String out, int port, boolean suspend) {
|
||||||
|
assertThat(out).contains("-agentlib:jdwp=transport=dt_socket,server=y,suspend=%s,address=%s"
|
||||||
|
.formatted(suspend ? "y" : "n", port));
|
||||||
|
}
|
||||||
|
|
||||||
|
private void assertMemory(String out, String min, String max) {
|
||||||
|
assertThat(out).contains("-Xms%s".formatted(min));
|
||||||
|
assertThat(out).contains("-Xmx%s".formatted(max));
|
||||||
|
}
|
||||||
|
|
||||||
|
private void assertSuccessfulBuild(String out) {
|
||||||
|
assertThat(out).contains("BUILD SUCCESSFUL in");
|
||||||
|
}
|
||||||
|
|
||||||
|
private void assertTasksExecuted(String out, String[] defaultTasks, String rewriteTask) {
|
||||||
|
String[] tasks = tasksOf(defaultTasks, rewriteTask);
|
||||||
|
List<String> tasksOutput = Stream.of(tasks).map(t -> "Task :" + t).toList();
|
||||||
|
assertThat(out).contains(tasksOutput);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void assertRecipesExecuted(String out, String[] recipes) {
|
||||||
|
assertThat(out).containsIgnoringWhitespaces(
|
||||||
|
"All sources parsed, running active recipes: " + Stream.of(recipes).collect(Collectors.joining(",")));
|
||||||
|
}
|
||||||
|
|
||||||
|
private String[] tasksOf(String[] defaultTasks, String[] testTasks, String rewriteTask) {
|
||||||
|
List<String> tasksList = new ArrayList<>();
|
||||||
|
tasksList.addAll(Arrays.asList(defaultTasks));
|
||||||
|
if (testTasks != null) {
|
||||||
|
tasksList.addAll(Arrays.asList(testTasks));
|
||||||
|
}
|
||||||
|
tasksList.add(rewriteTask);
|
||||||
|
return tasksList.toArray(String[]::new);
|
||||||
|
}
|
||||||
|
|
||||||
|
private String[] tasksOf(String[] defaultTasks, String rewriteTask) {
|
||||||
|
return tasksOf(defaultTasks, null, rewriteTask);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,122 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2021 - 2023 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.rewrite.plugin.gradle;
|
||||||
|
|
||||||
|
import org.junit.jupiter.api.DisplayName;
|
||||||
|
import org.junit.jupiter.api.Test;
|
||||||
|
import org.junit.jupiter.api.io.TempDir;
|
||||||
|
|
||||||
|
import java.nio.file.Path;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
import static org.assertj.core.api.Assertions.assertThat;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author Fabian Krüger
|
||||||
|
*/
|
||||||
|
class TempGradleInitFileTest {
|
||||||
|
|
||||||
|
@Test
|
||||||
|
@DisplayName("should create and delete gradle init file")
|
||||||
|
void shouldCreateAndDeleteGradleInitFile(@TempDir Path temoDir) {
|
||||||
|
List<String> depemdemcies = List.of("dep1", "dep2");
|
||||||
|
String pluginVersion = "x.y.z";
|
||||||
|
|
||||||
|
assertThat(temoDir.resolve("recipes.init.gradle")).doesNotExist();
|
||||||
|
|
||||||
|
try (TempGradleInitFile initFile = new TempGradleInitFile(temoDir, depemdemcies, pluginVersion)) {
|
||||||
|
|
||||||
|
assertThat(temoDir.resolve("recipes.init.gradle")).exists();
|
||||||
|
|
||||||
|
assertThat(initFile.getContent()).isEqualTo("""
|
||||||
|
initscript {
|
||||||
|
repositories {
|
||||||
|
maven { url "https://plugins.gradle.org/m2" }
|
||||||
|
}
|
||||||
|
dependencies {
|
||||||
|
classpath("org.openrewrite:plugin:x.y.z")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
rootProject {
|
||||||
|
plugins.apply(org.openrewrite.gradle.RewritePlugin)
|
||||||
|
dependencies {
|
||||||
|
rewrite("dep1")
|
||||||
|
rewrite("dep2")
|
||||||
|
}
|
||||||
|
|
||||||
|
afterEvaluate {
|
||||||
|
if (repositories.isEmpty()) {
|
||||||
|
repositories {
|
||||||
|
mavenCentral()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
""");
|
||||||
|
}
|
||||||
|
|
||||||
|
assertThat(temoDir.resolve("recipes.init.gradle")).doesNotExist();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
@DisplayName("should create and delete gradle init file on exception")
|
||||||
|
void shouldCreateAndDeleteGradleInitFileOnException(@TempDir Path temoDir) {
|
||||||
|
List<String> depemdemcies = List.of("dep1", "dep2");
|
||||||
|
String pluginVersion = "x.y.z";
|
||||||
|
|
||||||
|
assertThat(temoDir.resolve("recipes.init.gradle")).doesNotExist();
|
||||||
|
try {
|
||||||
|
|
||||||
|
try (TempGradleInitFile initFile = new TempGradleInitFile(temoDir, depemdemcies, pluginVersion)) {
|
||||||
|
|
||||||
|
assertThat(temoDir.resolve("recipes.init.gradle")).exists();
|
||||||
|
|
||||||
|
assertThat(initFile.getContent()).isEqualTo("""
|
||||||
|
initscript {
|
||||||
|
repositories {
|
||||||
|
maven { url "https://plugins.gradle.org/m2" }
|
||||||
|
}
|
||||||
|
dependencies {
|
||||||
|
classpath("org.openrewrite:plugin:x.y.z")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
rootProject {
|
||||||
|
plugins.apply(org.openrewrite.gradle.RewritePlugin)
|
||||||
|
dependencies {
|
||||||
|
rewrite("dep1")
|
||||||
|
rewrite("dep2")
|
||||||
|
}
|
||||||
|
|
||||||
|
afterEvaluate {
|
||||||
|
if (repositories.isEmpty()) {
|
||||||
|
repositories {
|
||||||
|
mavenCentral()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
""");
|
||||||
|
throw new RuntimeException();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch (Exception e) {
|
||||||
|
assertThat(temoDir.resolve("recipes.init.gradle")).doesNotExist();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,42 @@
|
|||||||
|
.gradle
|
||||||
|
build/
|
||||||
|
!gradle/wrapper/gradle-wrapper.jar
|
||||||
|
!**/src/main/**/build/
|
||||||
|
!**/src/test/**/build/
|
||||||
|
|
||||||
|
### IntelliJ IDEA ###
|
||||||
|
.idea/modules.xml
|
||||||
|
.idea/jarRepositories.xml
|
||||||
|
.idea/compiler.xml
|
||||||
|
.idea/libraries/
|
||||||
|
*.iws
|
||||||
|
*.iml
|
||||||
|
*.ipr
|
||||||
|
out/
|
||||||
|
!**/src/main/**/out/
|
||||||
|
!**/src/test/**/out/
|
||||||
|
|
||||||
|
### Eclipse ###
|
||||||
|
.apt_generated
|
||||||
|
.classpath
|
||||||
|
.factorypath
|
||||||
|
.project
|
||||||
|
.settings
|
||||||
|
.springBeans
|
||||||
|
.sts4-cache
|
||||||
|
bin/
|
||||||
|
!**/src/main/**/bin/
|
||||||
|
!**/src/test/**/bin/
|
||||||
|
|
||||||
|
### NetBeans ###
|
||||||
|
/nbproject/private/
|
||||||
|
/nbbuild/
|
||||||
|
/dist/
|
||||||
|
/nbdist/
|
||||||
|
/.nb-gradle/
|
||||||
|
|
||||||
|
### VS Code ###
|
||||||
|
.vscode/
|
||||||
|
|
||||||
|
### Mac OS ###
|
||||||
|
.DS_Store
|
||||||
@@ -0,0 +1,19 @@
|
|||||||
|
plugins {
|
||||||
|
id("java")
|
||||||
|
}
|
||||||
|
|
||||||
|
group = "org.example"
|
||||||
|
version = "1.0-SNAPSHOT"
|
||||||
|
|
||||||
|
repositories {
|
||||||
|
mavenCentral()
|
||||||
|
}
|
||||||
|
|
||||||
|
dependencies {
|
||||||
|
testImplementation(platform("org.junit:junit-bom:5.9.1"))
|
||||||
|
testImplementation("org.junit.jupiter:junit-jupiter")
|
||||||
|
}
|
||||||
|
|
||||||
|
tasks.test {
|
||||||
|
useJUnitPlatform()
|
||||||
|
}
|
||||||
Binary file not shown.
@@ -0,0 +1,6 @@
|
|||||||
|
#Wed Mar 13 15:37:19 CET 2024
|
||||||
|
distributionBase=GRADLE_USER_HOME
|
||||||
|
distributionPath=wrapper/dists
|
||||||
|
distributionUrl=https\://services.gradle.org/distributions/gradle-8.4-bin.zip
|
||||||
|
zipStoreBase=GRADLE_USER_HOME
|
||||||
|
zipStorePath=wrapper/dists
|
||||||
@@ -0,0 +1,234 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
|
||||||
|
#
|
||||||
|
# Copyright © 2015-2021 the original 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.
|
||||||
|
#
|
||||||
|
|
||||||
|
##############################################################################
|
||||||
|
#
|
||||||
|
# Gradle start up script for POSIX generated by Gradle.
|
||||||
|
#
|
||||||
|
# Important for running:
|
||||||
|
#
|
||||||
|
# (1) You need a POSIX-compliant shell to run this script. If your /bin/sh is
|
||||||
|
# noncompliant, but you have some other compliant shell such as ksh or
|
||||||
|
# bash, then to run this script, type that shell name before the whole
|
||||||
|
# command line, like:
|
||||||
|
#
|
||||||
|
# ksh Gradle
|
||||||
|
#
|
||||||
|
# Busybox and similar reduced shells will NOT work, because this script
|
||||||
|
# requires all of these POSIX shell features:
|
||||||
|
# * functions;
|
||||||
|
# * expansions «$var», «${var}», «${var:-default}», «${var+SET}»,
|
||||||
|
# «${var#prefix}», «${var%suffix}», and «$( cmd )»;
|
||||||
|
# * compound commands having a testable exit status, especially «case»;
|
||||||
|
# * various built-in commands including «command», «set», and «ulimit».
|
||||||
|
#
|
||||||
|
# Important for patching:
|
||||||
|
#
|
||||||
|
# (2) This script targets any POSIX shell, so it avoids extensions provided
|
||||||
|
# by Bash, Ksh, etc; in particular arrays are avoided.
|
||||||
|
#
|
||||||
|
# The "traditional" practice of packing multiple parameters into a
|
||||||
|
# space-separated string is a well documented source of bugs and security
|
||||||
|
# problems, so this is (mostly) avoided, by progressively accumulating
|
||||||
|
# options in "$@", and eventually passing that to Java.
|
||||||
|
#
|
||||||
|
# Where the inherited environment variables (DEFAULT_JVM_OPTS, JAVA_OPTS,
|
||||||
|
# and GRADLE_OPTS) rely on word-splitting, this is performed explicitly;
|
||||||
|
# see the in-line comments for details.
|
||||||
|
#
|
||||||
|
# There are tweaks for specific operating systems such as AIX, CygWin,
|
||||||
|
# Darwin, MinGW, and NonStop.
|
||||||
|
#
|
||||||
|
# (3) This script is generated from the Groovy template
|
||||||
|
# https://github.com/gradle/gradle/blob/master/subprojects/plugins/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt
|
||||||
|
# within the Gradle project.
|
||||||
|
#
|
||||||
|
# You can find Gradle at https://github.com/gradle/gradle/.
|
||||||
|
#
|
||||||
|
##############################################################################
|
||||||
|
|
||||||
|
# Attempt to set APP_HOME
|
||||||
|
|
||||||
|
# Resolve links: $0 may be a link
|
||||||
|
app_path=$0
|
||||||
|
|
||||||
|
# Need this for daisy-chained symlinks.
|
||||||
|
while
|
||||||
|
APP_HOME=${app_path%"${app_path##*/}"} # leaves a trailing /; empty if no leading path
|
||||||
|
[ -h "$app_path" ]
|
||||||
|
do
|
||||||
|
ls=$( ls -ld "$app_path" )
|
||||||
|
link=${ls#*' -> '}
|
||||||
|
case $link in #(
|
||||||
|
/*) app_path=$link ;; #(
|
||||||
|
*) app_path=$APP_HOME$link ;;
|
||||||
|
esac
|
||||||
|
done
|
||||||
|
|
||||||
|
APP_HOME=$( cd "${APP_HOME:-./}" && pwd -P ) || exit
|
||||||
|
|
||||||
|
APP_NAME="Gradle"
|
||||||
|
APP_BASE_NAME=${0##*/}
|
||||||
|
|
||||||
|
# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
|
||||||
|
DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"'
|
||||||
|
|
||||||
|
# Use the maximum available, or set MAX_FD != -1 to use that value.
|
||||||
|
MAX_FD=maximum
|
||||||
|
|
||||||
|
warn () {
|
||||||
|
echo "$*"
|
||||||
|
} >&2
|
||||||
|
|
||||||
|
die () {
|
||||||
|
echo
|
||||||
|
echo "$*"
|
||||||
|
echo
|
||||||
|
exit 1
|
||||||
|
} >&2
|
||||||
|
|
||||||
|
# OS specific support (must be 'true' or 'false').
|
||||||
|
cygwin=false
|
||||||
|
msys=false
|
||||||
|
darwin=false
|
||||||
|
nonstop=false
|
||||||
|
case "$( uname )" in #(
|
||||||
|
CYGWIN* ) cygwin=true ;; #(
|
||||||
|
Darwin* ) darwin=true ;; #(
|
||||||
|
MSYS* | MINGW* ) msys=true ;; #(
|
||||||
|
NONSTOP* ) nonstop=true ;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
|
||||||
|
|
||||||
|
|
||||||
|
# Determine the Java command to use to start the JVM.
|
||||||
|
if [ -n "$JAVA_HOME" ] ; then
|
||||||
|
if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
|
||||||
|
# IBM's JDK on AIX uses strange locations for the executables
|
||||||
|
JAVACMD=$JAVA_HOME/jre/sh/java
|
||||||
|
else
|
||||||
|
JAVACMD=$JAVA_HOME/bin/java
|
||||||
|
fi
|
||||||
|
if [ ! -x "$JAVACMD" ] ; then
|
||||||
|
die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME
|
||||||
|
|
||||||
|
Please set the JAVA_HOME variable in your environment to match the
|
||||||
|
location of your Java installation."
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
JAVACMD=java
|
||||||
|
which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
|
||||||
|
|
||||||
|
Please set the JAVA_HOME variable in your environment to match the
|
||||||
|
location of your Java installation."
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Increase the maximum file descriptors if we can.
|
||||||
|
if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then
|
||||||
|
case $MAX_FD in #(
|
||||||
|
max*)
|
||||||
|
MAX_FD=$( ulimit -H -n ) ||
|
||||||
|
warn "Could not query maximum file descriptor limit"
|
||||||
|
esac
|
||||||
|
case $MAX_FD in #(
|
||||||
|
'' | soft) :;; #(
|
||||||
|
*)
|
||||||
|
ulimit -n "$MAX_FD" ||
|
||||||
|
warn "Could not set maximum file descriptor limit to $MAX_FD"
|
||||||
|
esac
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Collect all arguments for the java command, stacking in reverse order:
|
||||||
|
# * args from the command line
|
||||||
|
# * the main class name
|
||||||
|
# * -classpath
|
||||||
|
# * -D...appname settings
|
||||||
|
# * --module-path (only if needed)
|
||||||
|
# * DEFAULT_JVM_OPTS, JAVA_OPTS, and GRADLE_OPTS environment variables.
|
||||||
|
|
||||||
|
# For Cygwin or MSYS, switch paths to Windows format before running java
|
||||||
|
if "$cygwin" || "$msys" ; then
|
||||||
|
APP_HOME=$( cygpath --path --mixed "$APP_HOME" )
|
||||||
|
CLASSPATH=$( cygpath --path --mixed "$CLASSPATH" )
|
||||||
|
|
||||||
|
JAVACMD=$( cygpath --unix "$JAVACMD" )
|
||||||
|
|
||||||
|
# Now convert the arguments - kludge to limit ourselves to /bin/sh
|
||||||
|
for arg do
|
||||||
|
if
|
||||||
|
case $arg in #(
|
||||||
|
-*) false ;; # don't mess with options #(
|
||||||
|
/?*) t=${arg#/} t=/${t%%/*} # looks like a POSIX filepath
|
||||||
|
[ -e "$t" ] ;; #(
|
||||||
|
*) false ;;
|
||||||
|
esac
|
||||||
|
then
|
||||||
|
arg=$( cygpath --path --ignore --mixed "$arg" )
|
||||||
|
fi
|
||||||
|
# Roll the args list around exactly as many times as the number of
|
||||||
|
# args, so each arg winds up back in the position where it started, but
|
||||||
|
# possibly modified.
|
||||||
|
#
|
||||||
|
# NB: a `for` loop captures its iteration list before it begins, so
|
||||||
|
# changing the positional parameters here affects neither the number of
|
||||||
|
# iterations, nor the values presented in `arg`.
|
||||||
|
shift # remove old arg
|
||||||
|
set -- "$@" "$arg" # push replacement arg
|
||||||
|
done
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Collect all arguments for the java command;
|
||||||
|
# * $DEFAULT_JVM_OPTS, $JAVA_OPTS, and $GRADLE_OPTS can contain fragments of
|
||||||
|
# shell script including quotes and variable substitutions, so put them in
|
||||||
|
# double quotes to make sure that they get re-expanded; and
|
||||||
|
# * put everything else in single quotes, so that it's not re-expanded.
|
||||||
|
|
||||||
|
set -- \
|
||||||
|
"-Dorg.gradle.appname=$APP_BASE_NAME" \
|
||||||
|
-classpath "$CLASSPATH" \
|
||||||
|
org.gradle.wrapper.GradleWrapperMain \
|
||||||
|
"$@"
|
||||||
|
|
||||||
|
# Use "xargs" to parse quoted args.
|
||||||
|
#
|
||||||
|
# With -n1 it outputs one arg per line, with the quotes and backslashes removed.
|
||||||
|
#
|
||||||
|
# In Bash we could simply go:
|
||||||
|
#
|
||||||
|
# readarray ARGS < <( xargs -n1 <<<"$var" ) &&
|
||||||
|
# set -- "${ARGS[@]}" "$@"
|
||||||
|
#
|
||||||
|
# but POSIX shell has neither arrays nor command substitution, so instead we
|
||||||
|
# post-process each arg (as a line of input to sed) to backslash-escape any
|
||||||
|
# character that might be a shell metacharacter, then use eval to reverse
|
||||||
|
# that process (while maintaining the separation between arguments), and wrap
|
||||||
|
# the whole thing up as a single "set" statement.
|
||||||
|
#
|
||||||
|
# This will of course break if any of these variables contains a newline or
|
||||||
|
# an unmatched quote.
|
||||||
|
#
|
||||||
|
|
||||||
|
eval "set -- $(
|
||||||
|
printf '%s\n' "$DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS" |
|
||||||
|
xargs -n1 |
|
||||||
|
sed ' s~[^-[:alnum:]+,./:=@_]~\\&~g; ' |
|
||||||
|
tr '\n' ' '
|
||||||
|
)" '"$@"'
|
||||||
|
|
||||||
|
exec "$JAVACMD" "$@"
|
||||||
@@ -0,0 +1,89 @@
|
|||||||
|
@rem
|
||||||
|
@rem Copyright 2015 the original author or authors.
|
||||||
|
@rem
|
||||||
|
@rem Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
@rem you may not use this file except in compliance with the License.
|
||||||
|
@rem You may obtain a copy of the License at
|
||||||
|
@rem
|
||||||
|
@rem https://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
@rem
|
||||||
|
@rem Unless required by applicable law or agreed to in writing, software
|
||||||
|
@rem distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
@rem See the License for the specific language governing permissions and
|
||||||
|
@rem limitations under the License.
|
||||||
|
@rem
|
||||||
|
|
||||||
|
@if "%DEBUG%" == "" @echo off
|
||||||
|
@rem ##########################################################################
|
||||||
|
@rem
|
||||||
|
@rem Gradle startup script for Windows
|
||||||
|
@rem
|
||||||
|
@rem ##########################################################################
|
||||||
|
|
||||||
|
@rem Set local scope for the variables with windows NT shell
|
||||||
|
if "%OS%"=="Windows_NT" setlocal
|
||||||
|
|
||||||
|
set DIRNAME=%~dp0
|
||||||
|
if "%DIRNAME%" == "" set DIRNAME=.
|
||||||
|
set APP_BASE_NAME=%~n0
|
||||||
|
set APP_HOME=%DIRNAME%
|
||||||
|
|
||||||
|
@rem Resolve any "." and ".." in APP_HOME to make it shorter.
|
||||||
|
for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi
|
||||||
|
|
||||||
|
@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
|
||||||
|
set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m"
|
||||||
|
|
||||||
|
@rem Find java.exe
|
||||||
|
if defined JAVA_HOME goto findJavaFromJavaHome
|
||||||
|
|
||||||
|
set JAVA_EXE=java.exe
|
||||||
|
%JAVA_EXE% -version >NUL 2>&1
|
||||||
|
if "%ERRORLEVEL%" == "0" goto execute
|
||||||
|
|
||||||
|
echo.
|
||||||
|
echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
|
||||||
|
echo.
|
||||||
|
echo Please set the JAVA_HOME variable in your environment to match the
|
||||||
|
echo location of your Java installation.
|
||||||
|
|
||||||
|
goto fail
|
||||||
|
|
||||||
|
:findJavaFromJavaHome
|
||||||
|
set JAVA_HOME=%JAVA_HOME:"=%
|
||||||
|
set JAVA_EXE=%JAVA_HOME%/bin/java.exe
|
||||||
|
|
||||||
|
if exist "%JAVA_EXE%" goto execute
|
||||||
|
|
||||||
|
echo.
|
||||||
|
echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
|
||||||
|
echo.
|
||||||
|
echo Please set the JAVA_HOME variable in your environment to match the
|
||||||
|
echo location of your Java installation.
|
||||||
|
|
||||||
|
goto fail
|
||||||
|
|
||||||
|
:execute
|
||||||
|
@rem Setup the command line
|
||||||
|
|
||||||
|
set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
|
||||||
|
|
||||||
|
|
||||||
|
@rem Execute Gradle
|
||||||
|
"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %*
|
||||||
|
|
||||||
|
:end
|
||||||
|
@rem End local scope for the variables with windows NT shell
|
||||||
|
if "%ERRORLEVEL%"=="0" goto mainEnd
|
||||||
|
|
||||||
|
:fail
|
||||||
|
rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
|
||||||
|
rem the _cmd.exe /c_ return code!
|
||||||
|
if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1
|
||||||
|
exit /b 1
|
||||||
|
|
||||||
|
:mainEnd
|
||||||
|
if "%OS%"=="Windows_NT" endlocal
|
||||||
|
|
||||||
|
:omega
|
||||||
@@ -0,0 +1,2 @@
|
|||||||
|
rootProject.name = "simple"
|
||||||
|
|
||||||
@@ -0,0 +1,10 @@
|
|||||||
|
package org.example;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author Fabian Krüger
|
||||||
|
*/
|
||||||
|
public class Main {
|
||||||
|
public static void main(String[] args) {
|
||||||
|
System.out.println("Hello world!");
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -5,11 +5,11 @@
|
|||||||
<modelVersion>4.0.0</modelVersion>
|
<modelVersion>4.0.0</modelVersion>
|
||||||
<parent>
|
<parent>
|
||||||
<groupId>org.springframework.rewrite</groupId>
|
<groupId>org.springframework.rewrite</groupId>
|
||||||
<artifactId>spring-rewrite-commons</artifactId>
|
<artifactId>spring-rewrite-commons-plugin-invoker</artifactId>
|
||||||
<version>0.1.0-SNAPSHOT</version>
|
<version>0.1.0-SNAPSHOT</version>
|
||||||
</parent>
|
</parent>
|
||||||
|
|
||||||
<artifactId>spring-rewrite-commons-maven-invoker</artifactId>
|
<artifactId>spring-rewrite-commons-plugin-invoker-maven</artifactId>
|
||||||
|
|
||||||
<properties>
|
<properties>
|
||||||
<maven.compiler.source>17</maven.compiler.source>
|
<maven.compiler.source>17</maven.compiler.source>
|
||||||
@@ -25,9 +25,8 @@
|
|||||||
<dependency>
|
<dependency>
|
||||||
<groupId>org.apache.maven.shared</groupId>
|
<groupId>org.apache.maven.shared</groupId>
|
||||||
<artifactId>maven-shared-utils</artifactId>
|
<artifactId>maven-shared-utils</artifactId>
|
||||||
<version>3.4.2</version>
|
<version>${maven-shared-utils.version}</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>org.apache.maven.shared</groupId>
|
<groupId>org.apache.maven.shared</groupId>
|
||||||
<artifactId>maven-invoker</artifactId>
|
<artifactId>maven-invoker</artifactId>
|
||||||
@@ -85,6 +84,12 @@
|
|||||||
<version>${maven.version}</version>
|
<version>${maven.version}</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.springframework.rewrite</groupId>
|
||||||
|
<artifactId>spring-rewrite-commons-plugin-invoker-shared</artifactId>
|
||||||
|
<version>0.1.0-SNAPSHOT</version>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>org.springframework.boot</groupId>
|
<groupId>org.springframework.boot</groupId>
|
||||||
<artifactId>spring-boot-starter-test</artifactId>
|
<artifactId>spring-boot-starter-test</artifactId>
|
||||||
@@ -13,10 +13,12 @@
|
|||||||
* See the License for the specific language governing permissions and
|
* See the License for the specific language governing permissions and
|
||||||
* limitations under the License.
|
* limitations under the License.
|
||||||
*/
|
*/
|
||||||
package org.springframework.rewrite.maven;
|
package org.springframework.rewrite.plugin.maven;
|
||||||
|
|
||||||
import org.apache.maven.shared.invoker.*;
|
import org.apache.maven.shared.invoker.*;
|
||||||
import org.jetbrains.annotations.NotNull;
|
import org.jetbrains.annotations.NotNull;
|
||||||
|
import org.springframework.rewrite.plugin.shared.BuildConfig;
|
||||||
|
import org.springframework.rewrite.plugin.shared.DebugConfig;
|
||||||
|
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
import java.nio.file.Path;
|
import java.nio.file.Path;
|
||||||
@@ -30,7 +32,7 @@ import java.util.function.Consumer;
|
|||||||
public class MavenInvocationRequestFactory {
|
public class MavenInvocationRequestFactory {
|
||||||
|
|
||||||
@NotNull
|
@NotNull
|
||||||
public InvocationRequest createMavenInvocationRequest(Path baseDir, DebugConfig debugConfig,
|
public InvocationRequest createMavenInvocationRequest(Path baseDir, DebugConfig debugConfig, boolean debug,
|
||||||
BuildConfig buildConfig, List<String> givenGoals, Consumer<String> lineConsumer) {
|
BuildConfig buildConfig, List<String> givenGoals, Consumer<String> lineConsumer) {
|
||||||
List<String> goals = new ArrayList<>(givenGoals);
|
List<String> goals = new ArrayList<>(givenGoals);
|
||||||
String mavenHome = System.getenv("MAVEN_HOME");
|
String mavenHome = System.getenv("MAVEN_HOME");
|
||||||
@@ -52,15 +54,18 @@ public class MavenInvocationRequestFactory {
|
|||||||
request.setMavenHome(new File(mavenHome));
|
request.setMavenHome(new File(mavenHome));
|
||||||
request.setBaseDirectory(baseDir.toFile());
|
request.setBaseDirectory(baseDir.toFile());
|
||||||
request.setOutputHandler(s -> lineConsumer.accept(s));
|
request.setOutputHandler(s -> lineConsumer.accept(s));
|
||||||
|
if (debug) {
|
||||||
|
request.setDebug(true);
|
||||||
|
}
|
||||||
|
|
||||||
StringBuilder mavenOpts = new StringBuilder();
|
StringBuilder mavenOpts = new StringBuilder();
|
||||||
if (buildConfig.getMemorySettings() != null) {
|
if (buildConfig.hasMemorySettings()) {
|
||||||
mavenOpts.append("-Xms%s -Xmx%s ".formatted(buildConfig.getMemorySettings().getMin(),
|
mavenOpts.append("-Xms%s -Xmx%s ".formatted(buildConfig.getMemorySettings().getMin(),
|
||||||
buildConfig.getMemorySettings().getMax()));
|
buildConfig.getMemorySettings().getMax()));
|
||||||
}
|
}
|
||||||
if (debugConfig != null && debugConfig.isDebugEnabled()) {
|
if (debugConfig != null && debugConfig.isDebugEnabled()) {
|
||||||
mavenOpts.append(" -Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=%s,address=%s "
|
mavenOpts.append(" -Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=%s,address=%s "
|
||||||
.formatted(debugConfig.isSuspend(), debugConfig.getPort()));
|
.formatted(debugConfig.isSuspendEnabled(), debugConfig.getPort()));
|
||||||
}
|
}
|
||||||
request.setMavenOpts(mavenOpts.toString());
|
request.setMavenOpts(mavenOpts.toString());
|
||||||
return request;
|
return request;
|
||||||
@@ -13,21 +13,28 @@
|
|||||||
* See the License for the specific language governing permissions and
|
* See the License for the specific language governing permissions and
|
||||||
* limitations under the License.
|
* limitations under the License.
|
||||||
*/
|
*/
|
||||||
package org.springframework.rewrite.maven;
|
package org.springframework.rewrite.plugin.maven;
|
||||||
|
|
||||||
import org.apache.maven.shared.invoker.InvocationResult;
|
/**
|
||||||
import org.apache.maven.shared.utils.cli.CommandLineException;
|
* @author Fabian Krüger
|
||||||
|
*/
|
||||||
|
public class MavenInvocationResult {
|
||||||
|
|
||||||
public class DummyInvocationResult implements InvocationResult {
|
private final int exitCode;
|
||||||
|
|
||||||
@Override
|
private final String capturedLines;
|
||||||
public CommandLineException getExecutionException() {
|
|
||||||
return null;
|
public MavenInvocationResult(int exitCode, String capturedLines) {
|
||||||
|
this.exitCode = exitCode;
|
||||||
|
this.capturedLines = capturedLines;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public int getExitCode() {
|
public int getExitCode() {
|
||||||
return 0;
|
return exitCode;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
public String getCapturedLines() {
|
||||||
|
return capturedLines;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,57 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2021 - 2023 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.rewrite.plugin.maven;
|
||||||
|
|
||||||
|
import org.apache.maven.shared.invoker.*;
|
||||||
|
import org.jetbrains.annotations.NotNull;
|
||||||
|
import org.springframework.rewrite.plugin.shared.BuildConfig;
|
||||||
|
import org.springframework.rewrite.plugin.shared.DebugConfig;
|
||||||
|
import org.springframework.rewrite.plugin.shared.MemorySettings;
|
||||||
|
|
||||||
|
import java.nio.file.Path;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author Fabian Krüger
|
||||||
|
*/
|
||||||
|
public class MavenInvoker {
|
||||||
|
|
||||||
|
private static final Invoker invoker = new DefaultInvoker();
|
||||||
|
|
||||||
|
public static MavenInvocationResult runGoals(Path baseDir, DebugConfig debugConfig, boolean debug,
|
||||||
|
BuildConfig buildConfig, List<String> goals) {
|
||||||
|
try {
|
||||||
|
StringBuilder sb = new StringBuilder();
|
||||||
|
InvocationRequest request = createInvocationRequest(baseDir, debugConfig, debug, buildConfig, goals, sb);
|
||||||
|
InvocationResult result = invoker.execute(request);
|
||||||
|
return new MavenInvocationResult(result.getExitCode(), sb.toString());
|
||||||
|
}
|
||||||
|
catch (MavenInvocationException e) {
|
||||||
|
throw new RuntimeException(e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@NotNull
|
||||||
|
private static InvocationRequest createInvocationRequest(Path baseDir, DebugConfig debugConfig, boolean debug,
|
||||||
|
BuildConfig buildConfig, List<String> goals, StringBuilder sb) {
|
||||||
|
return new MavenInvocationRequestFactory().createMavenInvocationRequest(baseDir, debugConfig, debug,
|
||||||
|
buildConfig, goals, line -> {
|
||||||
|
sb.append(line).append("\n");
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,165 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2021 - 2023 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.rewrite.plugin.maven;
|
||||||
|
|
||||||
|
import org.springframework.rewrite.plugin.shared.BuildConfig;
|
||||||
|
import org.springframework.rewrite.plugin.shared.DebugConfig;
|
||||||
|
import org.springframework.rewrite.plugin.shared.PluginInvocationResult;
|
||||||
|
|
||||||
|
import java.nio.file.Path;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.Arrays;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
|
import static org.springframework.rewrite.plugin.maven.RewriteMavenPlugin.Goal.*;
|
||||||
|
|
||||||
|
public class RewriteMavenPlugin
|
||||||
|
implements RewriteMavenPluginBuilder.FinalizingBuilder, RewriteMavenPluginBuilder.Recipes {
|
||||||
|
|
||||||
|
private Goal goal;
|
||||||
|
|
||||||
|
private DebugConfig debugConfig;
|
||||||
|
|
||||||
|
private List<String> recipes = new ArrayList<>();
|
||||||
|
|
||||||
|
private String minMemory;
|
||||||
|
|
||||||
|
private String maxMemory;
|
||||||
|
|
||||||
|
private MavenInvocationRequestFactory factory = new MavenInvocationRequestFactory();
|
||||||
|
|
||||||
|
private List<String> dependencies = new ArrayList<>();
|
||||||
|
|
||||||
|
private boolean debug;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public RewriteMavenPluginBuilder.FinalizingBuilder withDependencies(String... dependencies) {
|
||||||
|
this.dependencies = Arrays.asList(dependencies);
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static RewriteMavenPluginBuilder.Recipes run() {
|
||||||
|
Goal run = RUN;
|
||||||
|
return executeMavenRewritePlugin(run);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static RewriteMavenPluginBuilder.Recipes runNoFork() {
|
||||||
|
Goal run = RUN_NO_FORK;
|
||||||
|
return executeMavenRewritePlugin(run);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static RewriteMavenPluginBuilder.Recipes dryRun() {
|
||||||
|
Goal run = DRY_RUN;
|
||||||
|
return executeMavenRewritePlugin(run);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static RewriteMavenPluginBuilder.Recipes dryRunNoFork() {
|
||||||
|
Goal run = DRY_RUN_NO_FORK;
|
||||||
|
return executeMavenRewritePlugin(run);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static RewriteMavenPluginBuilder.Recipes discover() {
|
||||||
|
Goal run = DISCOVER;
|
||||||
|
return executeMavenRewritePlugin(run);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static RewriteMavenPluginBuilder.Recipes cyclonedx() {
|
||||||
|
Goal run = CYCLONEDX;
|
||||||
|
return executeMavenRewritePlugin(run);
|
||||||
|
}
|
||||||
|
|
||||||
|
private static RewriteMavenPlugin executeMavenRewritePlugin(Goal run) {
|
||||||
|
RewriteMavenPlugin rewriteMavenPlugin = new RewriteMavenPlugin();
|
||||||
|
rewriteMavenPlugin.goal = run;
|
||||||
|
return rewriteMavenPlugin;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public RewriteMavenPluginBuilder.FinalizingBuilder recipes(String... recipeNames) {
|
||||||
|
this.recipes = Arrays.asList(recipeNames);
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public RewriteMavenPluginBuilder.FinalizingBuilder withDebugger(int port, boolean suspend) {
|
||||||
|
debugConfig = DebugConfig.from(port, suspend);
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public RewriteMavenPluginBuilder.FinalizingBuilder withDebug() {
|
||||||
|
this.debug = true;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public PluginInvocationResult onDir(Path baseDir) {
|
||||||
|
BuildConfig.Builder builder = BuildConfig.builder();
|
||||||
|
if (minMemory != null) {
|
||||||
|
builder.withMemory(minMemory, maxMemory);
|
||||||
|
}
|
||||||
|
MavenInvocationResult result = execute(baseDir, debug, debugConfig, builder.build(), goal, recipes,
|
||||||
|
dependencies);
|
||||||
|
|
||||||
|
return new PluginInvocationResult(result.getExitCode() != 0 ? false : true, result.getCapturedLines());
|
||||||
|
}
|
||||||
|
|
||||||
|
static MavenInvocationResult execute(Path baseDir, boolean debug, DebugConfig debugConfig, BuildConfig buildConfig,
|
||||||
|
Goal openRewriteGoal, List<String> recipes1, List<String> dependencies1) {
|
||||||
|
String openRewriteCommand = renderOpenRewriteCommand(recipes1, dependencies1, openRewriteGoal);
|
||||||
|
List<String> goals = List.of("--fail-at-end", openRewriteCommand);
|
||||||
|
return MavenInvoker.runGoals(baseDir, debugConfig, debug, buildConfig, goals);
|
||||||
|
}
|
||||||
|
|
||||||
|
private static String renderOpenRewriteCommand(List<String> recipeNames, List<String> dependencies,
|
||||||
|
Goal rewritePluginGoal) {
|
||||||
|
StringBuilder sb = new StringBuilder();
|
||||||
|
sb.append("org.openrewrite.maven:rewrite-maven-plugin:").append(rewritePluginGoal.getMaven()).append(" ");
|
||||||
|
String recipesList = recipeNames.stream().collect(Collectors.joining(","));
|
||||||
|
sb.append("-Drewrite.activeRecipes=").append(recipesList);
|
||||||
|
if (!dependencies.isEmpty()) {
|
||||||
|
String dependenciesList = dependencies.stream().collect(Collectors.joining(","));
|
||||||
|
sb.append(" ").append("-Drewrite.recipeArtifactCoordinates=").append(dependenciesList);
|
||||||
|
}
|
||||||
|
return sb.toString();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public RewriteMavenPluginBuilder.FinalizingBuilder withMemory(String minMemory, String maxMemory) {
|
||||||
|
this.minMemory = minMemory;
|
||||||
|
this.maxMemory = maxMemory;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public enum Goal {
|
||||||
|
|
||||||
|
RUN("run"), RUN_NO_FORK("runNoFork"), DRY_RUN("dryRun"), DRY_RUN_NO_FORK("dryRunNoFork"), DISCOVER("discover"),
|
||||||
|
CYCLONEDX("cyclonedx");
|
||||||
|
|
||||||
|
private final String maven;
|
||||||
|
|
||||||
|
Goal(String maven) {
|
||||||
|
this.maven = maven;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getMaven() {
|
||||||
|
return maven;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,47 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2021 - 2023 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.rewrite.plugin.maven;
|
||||||
|
|
||||||
|
import org.springframework.rewrite.plugin.shared.PluginInvocationResult;
|
||||||
|
|
||||||
|
import java.nio.file.Path;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author Fabian Krüger
|
||||||
|
*/
|
||||||
|
public interface RewriteMavenPluginBuilder {
|
||||||
|
|
||||||
|
public interface Recipes {
|
||||||
|
|
||||||
|
FinalizingBuilder recipes(String... recipeNames);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
interface FinalizingBuilder {
|
||||||
|
|
||||||
|
FinalizingBuilder withDependencies(String... dependencies);
|
||||||
|
|
||||||
|
FinalizingBuilder withDebugger(int port, boolean suspend);
|
||||||
|
|
||||||
|
FinalizingBuilder withDebug();
|
||||||
|
|
||||||
|
FinalizingBuilder withMemory(String s, String s1);
|
||||||
|
|
||||||
|
PluginInvocationResult onDir(Path baseDir);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -13,12 +13,14 @@
|
|||||||
* See the License for the specific language governing permissions and
|
* See the License for the specific language governing permissions and
|
||||||
* limitations under the License.
|
* limitations under the License.
|
||||||
*/
|
*/
|
||||||
package org.springframework.rewrite.maven;
|
package org.springframework.rewrite.plugin.maven;
|
||||||
|
|
||||||
import org.apache.maven.shared.invoker.InvocationRequest;
|
import org.apache.maven.shared.invoker.InvocationRequest;
|
||||||
import org.jetbrains.annotations.NotNull;
|
import org.jetbrains.annotations.NotNull;
|
||||||
import org.junit.jupiter.api.DisplayName;
|
import org.junit.jupiter.api.DisplayName;
|
||||||
import org.junit.jupiter.api.Test;
|
import org.junit.jupiter.api.Test;
|
||||||
|
import org.springframework.rewrite.plugin.shared.BuildConfig;
|
||||||
|
import org.springframework.rewrite.plugin.shared.DebugConfig;
|
||||||
|
|
||||||
import java.nio.file.Path;
|
import java.nio.file.Path;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
@@ -41,7 +43,7 @@ public class MavenInvocationRequestFactoryTest {
|
|||||||
};
|
};
|
||||||
Path baseDir = Path.of("./testcode/does-not-exist");
|
Path baseDir = Path.of("./testcode/does-not-exist");
|
||||||
|
|
||||||
InvocationRequest request = sut.createMavenInvocationRequest(baseDir, DebugConfig.disabled(),
|
InvocationRequest request = sut.createMavenInvocationRequest(baseDir, DebugConfig.disabled(), false,
|
||||||
BuildConfig.defaultConfig(), goals, lineConsumer);
|
BuildConfig.defaultConfig(), goals, lineConsumer);
|
||||||
|
|
||||||
assertThat(request.getGoals()).isEqualTo(goals);
|
assertThat(request.getGoals()).isEqualTo(goals);
|
||||||
@@ -59,7 +61,7 @@ public class MavenInvocationRequestFactoryTest {
|
|||||||
};
|
};
|
||||||
Path baseDir = Path.of("./testcode/does-not-exist");
|
Path baseDir = Path.of("./testcode/does-not-exist");
|
||||||
|
|
||||||
InvocationRequest request = sut.createMavenInvocationRequest(baseDir, DebugConfig.from(1234, true),
|
InvocationRequest request = sut.createMavenInvocationRequest(baseDir, DebugConfig.from(1234, true), true,
|
||||||
BuildConfig.defaultConfig(), goals, lineConsumer);
|
BuildConfig.defaultConfig(), goals, lineConsumer);
|
||||||
|
|
||||||
assertThat(request.getMavenOpts())
|
assertThat(request.getMavenOpts())
|
||||||
@@ -73,7 +75,7 @@ public class MavenInvocationRequestFactoryTest {
|
|||||||
List<String> lines = new ArrayList<>();
|
List<String> lines = new ArrayList<>();
|
||||||
Path baseDir = Path.of("./testcode/does-not-exist").toAbsolutePath().normalize();
|
Path baseDir = Path.of("./testcode/does-not-exist").toAbsolutePath().normalize();
|
||||||
@NotNull
|
@NotNull
|
||||||
InvocationRequest result = sut.createMavenInvocationRequest(baseDir, DebugConfig.disabled(),
|
InvocationRequest result = sut.createMavenInvocationRequest(baseDir, DebugConfig.disabled(), false,
|
||||||
BuildConfig.defaultConfig(), List.of("clean"), lines::add);
|
BuildConfig.defaultConfig(), List.of("clean"), lines::add);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -87,7 +89,7 @@ public class MavenInvocationRequestFactoryTest {
|
|||||||
};
|
};
|
||||||
Path baseDir = Path.of("./testcode/does-not-exist");
|
Path baseDir = Path.of("./testcode/does-not-exist");
|
||||||
|
|
||||||
InvocationRequest request = sut.createMavenInvocationRequest(baseDir, DebugConfig.disabled(),
|
InvocationRequest request = sut.createMavenInvocationRequest(baseDir, DebugConfig.disabled(), false,
|
||||||
BuildConfig.builder().withMemory("12M", "2G").skipTests(true).build(), goals, lineConsumer);
|
BuildConfig.builder().withMemory("12M", "2G").skipTests(true).build(), goals, lineConsumer);
|
||||||
|
|
||||||
assertThat(request.getMavenOpts()).isEqualTo("-Xms12M -Xmx2G ");
|
assertThat(request.getMavenOpts()).isEqualTo("-Xms12M -Xmx2G ");
|
||||||
@@ -0,0 +1,243 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2021 - 2023 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.rewrite.plugin.maven;
|
||||||
|
|
||||||
|
import org.junit.jupiter.api.DisplayName;
|
||||||
|
import org.junit.jupiter.api.Test;
|
||||||
|
import org.springframework.rewrite.plugin.shared.BuildConfig;
|
||||||
|
import org.springframework.rewrite.plugin.shared.DebugConfig;
|
||||||
|
import org.springframework.rewrite.plugin.shared.PluginInvocationResult;
|
||||||
|
import org.springframework.test.util.TestSocketUtils;
|
||||||
|
|
||||||
|
import java.nio.file.Path;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.Arrays;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.stream.Collectors;
|
||||||
|
import java.util.stream.Stream;
|
||||||
|
|
||||||
|
import static org.assertj.core.api.Assertions.assertThat;
|
||||||
|
import static org.assertj.core.api.Assertions.fail;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author Fabian Krüger
|
||||||
|
*/
|
||||||
|
class RewriteMavenPluginTest {
|
||||||
|
|
||||||
|
public static final String[] RECIPES = { "org.openrewrite.java.RemoveUnusedImports",
|
||||||
|
"org.openrewrite.java.format.NormalizeLineBreaks" };
|
||||||
|
|
||||||
|
public static final String[] EXTENDED_RECIPES = { "org.openrewrite.java.RemoveUnusedImports",
|
||||||
|
"org.openrewrite.java.format.NormalizeLineBreaks",
|
||||||
|
"org.openrewrite.java.migrate.jakarta.MaybeAddJakartaServletApi" };
|
||||||
|
|
||||||
|
public static final String EXTENDED_REFCIPES_DEPS = "org.openrewrite.recipe:rewrite-migrate-java:2.9.0";
|
||||||
|
|
||||||
|
public static final String[] DEFAULT_GOALS = new String[] { "resources", "compile", "testResources",
|
||||||
|
"testCompile" };
|
||||||
|
|
||||||
|
@Test
|
||||||
|
@DisplayName("simple project simple config")
|
||||||
|
void simpleProjectSimpleConfig() {
|
||||||
|
Path baseDir = Path.of("./testcode/maven-projects/simple").toAbsolutePath().normalize();
|
||||||
|
|
||||||
|
PluginInvocationResult result = RewriteMavenPlugin.run().recipes(RECIPES).onDir(baseDir);
|
||||||
|
|
||||||
|
String out = result.capturedOutput();
|
||||||
|
assertThat(result.success()).isTrue();
|
||||||
|
assertTasksExecuted(out, tasksOf(DEFAULT_GOALS, "run"));
|
||||||
|
assertRecipesExecuted(out, RECIPES);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
@DisplayName("builder runNoFork")
|
||||||
|
void simpleProjectSimpleConfigRunNoFork() {
|
||||||
|
Path baseDir = Path.of("./testcode/maven-projects/simple").toAbsolutePath().normalize();
|
||||||
|
PluginInvocationResult result = RewriteMavenPlugin.runNoFork().recipes(RECIPES).onDir(baseDir);
|
||||||
|
String out = result.capturedOutput();
|
||||||
|
assertThat(result.success()).isTrue();
|
||||||
|
assertTasksExecuted(out, "runNoFork");
|
||||||
|
assertRecipesExecuted(out, RECIPES);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
@DisplayName("builder dryRun")
|
||||||
|
void simpleProjectSimpleConfigDryRun() {
|
||||||
|
Path baseDir = Path.of("./testcode/maven-projects/simple").toAbsolutePath().normalize();
|
||||||
|
PluginInvocationResult result = RewriteMavenPlugin.dryRun().recipes(RECIPES).onDir(baseDir);
|
||||||
|
String out = result.capturedOutput();
|
||||||
|
assertThat(result.success()).isTrue();
|
||||||
|
assertTasksExecuted(out, tasksOf(DEFAULT_GOALS, "dryRun"));
|
||||||
|
assertRecipesExecuted(out, RECIPES);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
@DisplayName("builder dryRunNoFork")
|
||||||
|
void simpleProjectSimpleConfigDryRunNoFork() {
|
||||||
|
Path baseDir = Path.of("./testcode/maven-projects/simple").toAbsolutePath().normalize();
|
||||||
|
PluginInvocationResult result = RewriteMavenPlugin.dryRunNoFork().recipes(RECIPES).onDir(baseDir);
|
||||||
|
String out = result.capturedOutput();
|
||||||
|
assertThat(result.success()).isTrue();
|
||||||
|
assertTasksExecuted(out, "dryRunNoFork");
|
||||||
|
assertRecipesExecuted(out, RECIPES);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
@DisplayName("builder discover")
|
||||||
|
void simpleProjectSimpleConfigDiscover() {
|
||||||
|
Path baseDir = Path.of("./testcode/maven-projects/simple").toAbsolutePath().normalize();
|
||||||
|
PluginInvocationResult result = RewriteMavenPlugin.discover().recipes(RECIPES).onDir(baseDir);
|
||||||
|
String out = result.capturedOutput();
|
||||||
|
assertThat(result.success()).isTrue();
|
||||||
|
assertTasksExecuted(out, "discover");
|
||||||
|
assertThat(out).contains("[INFO] Available Recipes:");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
@DisplayName("builder cyclonedx")
|
||||||
|
void simpleProjectSimpleConfigCyclonedx() {
|
||||||
|
Path baseDir = Path.of("./testcode/maven-projects/simple").toAbsolutePath().normalize();
|
||||||
|
PluginInvocationResult result = RewriteMavenPlugin.cyclonedx().recipes(RECIPES).onDir(baseDir);
|
||||||
|
String out = result.capturedOutput();
|
||||||
|
System.out.println(out);
|
||||||
|
assertThat(result.success()).isTrue();
|
||||||
|
assertTasksExecuted(out, "cyclonedx");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
@DisplayName("simple project full config")
|
||||||
|
void simpleProjectFullConfig() {
|
||||||
|
|
||||||
|
int port = TestSocketUtils.findAvailableTcpPort();
|
||||||
|
Path baseDir = Path.of("./testcode/maven-projects/simple").toAbsolutePath().normalize();
|
||||||
|
PluginInvocationResult result = RewriteMavenPlugin.run()
|
||||||
|
.recipes(EXTENDED_RECIPES)
|
||||||
|
.withDependencies(EXTENDED_REFCIPES_DEPS)
|
||||||
|
.withDebugger(port, false)
|
||||||
|
.withDebug()
|
||||||
|
.withMemory("1G", "4G")
|
||||||
|
.onDir(baseDir);
|
||||||
|
|
||||||
|
String out = result.capturedOutput();
|
||||||
|
assertThat(result.success()).isTrue();
|
||||||
|
assertMemory(out, "1G", "4G");
|
||||||
|
assertDebugConfig(out, port, false);
|
||||||
|
assertTasksExecuted(out, tasksOf(DEFAULT_GOALS, "run"));
|
||||||
|
assertRecipesExecuted(out, EXTENDED_RECIPES);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
@DisplayName("execute dryRun")
|
||||||
|
void executeDryRun() {
|
||||||
|
|
||||||
|
int port = TestSocketUtils.findAvailableTcpPort();
|
||||||
|
Path baseDir = Path.of("./testcode/maven-projects/simple").toAbsolutePath().normalize();
|
||||||
|
MavenInvocationResult result = RewriteMavenPlugin.execute(baseDir, true, DebugConfig.from(port, false),
|
||||||
|
BuildConfig.builder().withMemory("1G", "4G").build(), RewriteMavenPlugin.Goal.DRY_RUN,
|
||||||
|
Arrays.asList(RECIPES), List.of());
|
||||||
|
String out = result.getCapturedLines();
|
||||||
|
assertDebugConfig(out, port, false);
|
||||||
|
assertMemory(out, "1G", "4G");
|
||||||
|
assertTasksExecuted(out, "dryRun");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
@DisplayName("execute dryRunNoFork")
|
||||||
|
void executeDryRunNoFork() {
|
||||||
|
Path baseDir = Path.of("./testcode/maven-projects/simple").toAbsolutePath().normalize();
|
||||||
|
verify(baseDir, RewriteMavenPlugin.Goal.DRY_RUN_NO_FORK, "dryRunNoFork");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
@DisplayName("execute run")
|
||||||
|
void executeRun() {
|
||||||
|
Path baseDir = Path.of("./testcode/maven-projects/simple").toAbsolutePath().normalize();
|
||||||
|
verify(baseDir, RewriteMavenPlugin.Goal.RUN, "run");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
@DisplayName("execute runNoFork")
|
||||||
|
void executeRunNoFork() {
|
||||||
|
Path baseDir = Path.of("./testcode/maven-projects/simple").toAbsolutePath().normalize();
|
||||||
|
verify(baseDir, RewriteMavenPlugin.Goal.RUN_NO_FORK, "runNoFork");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
@DisplayName("execute discover")
|
||||||
|
void executeDiscover() {
|
||||||
|
Path baseDir = Path.of("./testcode/maven-projects/simple").toAbsolutePath().normalize();
|
||||||
|
MavenInvocationResult result = RewriteMavenPlugin.execute(baseDir, false, DebugConfig.disabled(),
|
||||||
|
BuildConfig.fromDefault(), RewriteMavenPlugin.Goal.DISCOVER, Arrays.asList(EXTENDED_RECIPES),
|
||||||
|
List.of(EXTENDED_REFCIPES_DEPS));
|
||||||
|
String out = result.getCapturedLines();
|
||||||
|
assertThat(result.getExitCode()).isEqualTo(0);
|
||||||
|
assertTasksExecuted(out, "discover");
|
||||||
|
assertThat(out).contains("[INFO] Available Recipes:");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
@DisplayName("execute cylonedx")
|
||||||
|
void executeCyclonedx() {
|
||||||
|
Path baseDir = Path.of("./testcode/maven-projects/simple").toAbsolutePath().normalize();
|
||||||
|
MavenInvocationResult result = RewriteMavenPlugin.execute(baseDir, false, DebugConfig.disabled(),
|
||||||
|
BuildConfig.fromDefault(), RewriteMavenPlugin.Goal.CYCLONEDX, Arrays.asList(EXTENDED_RECIPES),
|
||||||
|
List.of(EXTENDED_REFCIPES_DEPS));
|
||||||
|
String out = result.getCapturedLines();
|
||||||
|
assertThat(result.getExitCode()).isEqualTo(0);
|
||||||
|
assertTasksExecuted(out, "cyclonedx");
|
||||||
|
}
|
||||||
|
|
||||||
|
private void verify(Path baseDir, RewriteMavenPlugin.Goal runNoFork, String expectedGoal) {
|
||||||
|
MavenInvocationResult result = RewriteMavenPlugin.execute(baseDir, false, DebugConfig.disabled(),
|
||||||
|
BuildConfig.fromDefault(), runNoFork, Arrays.asList(EXTENDED_RECIPES), List.of(EXTENDED_REFCIPES_DEPS));
|
||||||
|
String out = result.getCapturedLines();
|
||||||
|
assertThat(result.getExitCode()).isEqualTo(0);
|
||||||
|
assertRecipesExecuted(out, EXTENDED_RECIPES);
|
||||||
|
assertTasksExecuted(out, expectedGoal);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void assertTasksExecuted(String out, String... goals) {
|
||||||
|
if (goals.length == 0) {
|
||||||
|
fail("No goals provided");
|
||||||
|
}
|
||||||
|
Stream.of(goals).forEach(goal -> assertThat(out).contains(":" + goal + " "));
|
||||||
|
}
|
||||||
|
|
||||||
|
private String[] tasksOf(String[] defaultTasks, String rewriteTask) {
|
||||||
|
List<String> tasksList = new ArrayList<>();
|
||||||
|
tasksList.addAll(Arrays.asList(defaultTasks));
|
||||||
|
tasksList.add(rewriteTask);
|
||||||
|
return tasksList.toArray(String[]::new);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void assertRecipesExecuted(String out, String... recipes) {
|
||||||
|
assertThat(out)
|
||||||
|
.contains("active recipe(s) [%s]".formatted(Stream.of(recipes).collect(Collectors.joining(", "))));
|
||||||
|
}
|
||||||
|
|
||||||
|
private void assertMemory(String out, String min, String max) {
|
||||||
|
// Setting memory fails in GH Actions under Windows
|
||||||
|
if (!System.getenv().containsKey("GITHUB_ACTIONS") && !System.getProperty("os.name").contains("Windows")) {
|
||||||
|
assertThat(out).contains("env.MAVEN_OPTS= -Xms%s -Xmx%s".formatted(min, max));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void assertDebugConfig(String out, int port, boolean suspend) {
|
||||||
|
assertThat(out).contains("Listening for transport dt_socket at address: %s".formatted(port),
|
||||||
|
"-Xrunjdwp:transport=dt_socket,server=y,suspend=%s,address=%s".formatted(suspend ? "y" : "n", port));
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,5 @@
|
|||||||
|
package com.example;
|
||||||
|
|
||||||
|
public class TheClass {
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,5 @@
|
|||||||
|
package com.example;
|
||||||
|
|
||||||
|
public class TheClassTest {
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,35 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<project xmlns="http://maven.apache.org/POM/4.0.0"
|
||||||
|
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||||
|
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
||||||
|
<modelVersion>4.0.0</modelVersion>
|
||||||
|
<parent>
|
||||||
|
<groupId>org.springframework.rewrite</groupId>
|
||||||
|
<artifactId>spring-rewrite-commons-plugin-invoker</artifactId>
|
||||||
|
<version>0.1.0-SNAPSHOT</version>
|
||||||
|
</parent>
|
||||||
|
|
||||||
|
<artifactId>spring-rewrite-commons-plugin-invoker-polyglot</artifactId>
|
||||||
|
|
||||||
|
<properties>
|
||||||
|
<maven.compiler.source>17</maven.compiler.source>
|
||||||
|
<maven.compiler.target>17</maven.compiler.target>
|
||||||
|
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
|
||||||
|
</properties>
|
||||||
|
|
||||||
|
<dependencies>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.springframework.rewrite</groupId>
|
||||||
|
<artifactId>spring-rewrite-commons-plugin-invoker-maven</artifactId>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.springframework.rewrite</groupId>
|
||||||
|
<artifactId>spring-rewrite-commons-plugin-invoker-gradle</artifactId>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.springframework.boot</groupId>
|
||||||
|
<artifactId>spring-boot-starter-test</artifactId>
|
||||||
|
<scope>test</scope>
|
||||||
|
</dependency>
|
||||||
|
</dependencies>
|
||||||
|
</project>
|
||||||
@@ -0,0 +1,252 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2021 - 2023 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.rewrite.plugin.polyglot;
|
||||||
|
|
||||||
|
import org.slf4j.Logger;
|
||||||
|
import org.slf4j.LoggerFactory;
|
||||||
|
import org.springframework.rewrite.plugin.gradle.RewriteGradlePlugin;
|
||||||
|
import org.springframework.rewrite.plugin.gradle.OpenRewriteGradlePluginBuilder;
|
||||||
|
import org.springframework.rewrite.plugin.maven.RewriteMavenPlugin;
|
||||||
|
import org.springframework.rewrite.plugin.maven.RewriteMavenPluginBuilder;
|
||||||
|
import org.springframework.rewrite.plugin.shared.DebugConfig;
|
||||||
|
import org.springframework.rewrite.plugin.shared.PluginInvocationResult;
|
||||||
|
|
||||||
|
import java.nio.file.Files;
|
||||||
|
import java.nio.file.Path;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.Arrays;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author Fabian Krüger
|
||||||
|
*/
|
||||||
|
public class RewritePlugin implements OpenRewritePluginBuilder.GradlePluginVersion, OpenRewritePluginBuilder.Recipes,
|
||||||
|
OpenRewritePluginBuilder.FinalizingBuilder {
|
||||||
|
|
||||||
|
private static final Logger log = LoggerFactory.getLogger(RewriteGradlePlugin.class);
|
||||||
|
|
||||||
|
private Action action;
|
||||||
|
|
||||||
|
private String gradlePluginVersion;
|
||||||
|
|
||||||
|
private List<String> recipes = new ArrayList<>();
|
||||||
|
|
||||||
|
private boolean debug;
|
||||||
|
|
||||||
|
private DebugConfig debugConfig = DebugConfig.disabled();
|
||||||
|
|
||||||
|
private List<String> dependencies = new ArrayList<>();
|
||||||
|
|
||||||
|
private boolean preferGradle = false;
|
||||||
|
|
||||||
|
private String minMemory;
|
||||||
|
|
||||||
|
private String maxMemory;
|
||||||
|
|
||||||
|
public static OpenRewritePluginBuilder.GradlePluginVersion dryRun() {
|
||||||
|
RewritePlugin plugin = new RewritePlugin();
|
||||||
|
plugin.action = Action.DRY_RUN;
|
||||||
|
return plugin;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static OpenRewritePluginBuilder.GradlePluginVersion run() {
|
||||||
|
RewritePlugin plugin = new RewritePlugin();
|
||||||
|
plugin.action = Action.RUN;
|
||||||
|
return plugin;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static OpenRewritePluginBuilder.GradlePluginVersion discover() {
|
||||||
|
RewritePlugin plugin = new RewritePlugin();
|
||||||
|
plugin.action = Action.DISCOVER;
|
||||||
|
return plugin;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public OpenRewritePluginBuilder.Recipes gradlePluginVersion(String pluginVersion) {
|
||||||
|
this.gradlePluginVersion = pluginVersion;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public OpenRewritePluginBuilder.FinalizingBuilder recipes(String... recipes) {
|
||||||
|
this.recipes = Arrays.asList(recipes);
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public PluginInvocationResult onDir(Path baseDir) {
|
||||||
|
PluginInvocationResult result;
|
||||||
|
boolean mavenProject = isMavenProject(baseDir);
|
||||||
|
boolean gradleProject = isGradleProject(baseDir);
|
||||||
|
|
||||||
|
if (gradleProject && mavenProject && preferGradle) {
|
||||||
|
result = executeGradle(baseDir);
|
||||||
|
}
|
||||||
|
else if (mavenProject) {
|
||||||
|
result = executeMaven(baseDir);
|
||||||
|
}
|
||||||
|
else if (gradleProject) {
|
||||||
|
result = executeGradle(baseDir);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
throw new IllegalArgumentException(
|
||||||
|
"Neither pom.xml, build.gradle, nor build.gradle.kts was found in '%s'".formatted(baseDir));
|
||||||
|
}
|
||||||
|
return new PluginInvocationResult(true, result.capturedOutput());
|
||||||
|
}
|
||||||
|
|
||||||
|
private boolean isPolyglotProject(Path baseDir) {
|
||||||
|
return isMavenProject(baseDir) && isGradleProject(baseDir);
|
||||||
|
}
|
||||||
|
|
||||||
|
private PluginInvocationResult executeGradle(Path baseDir) {
|
||||||
|
PluginInvocationResult result;
|
||||||
|
OpenRewriteGradlePluginBuilder.Recipes builder;
|
||||||
|
switch (action) {
|
||||||
|
case DRY_RUN -> builder = RewriteGradlePlugin.dryRun();
|
||||||
|
case DISCOVER -> builder = RewriteGradlePlugin.discover();
|
||||||
|
default -> builder = RewriteGradlePlugin.run();
|
||||||
|
}
|
||||||
|
OpenRewriteGradlePluginBuilder.FinalizingBuilder finalizingBuilder = builder
|
||||||
|
.recipes(recipes.toArray(String[]::new))
|
||||||
|
.usingPluginVersion(gradlePluginVersion);
|
||||||
|
|
||||||
|
if (minMemory != null) {
|
||||||
|
finalizingBuilder = finalizingBuilder.withMemory(minMemory, maxMemory);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (debug) {
|
||||||
|
finalizingBuilder = finalizingBuilder.withDebug();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!dependencies.isEmpty()) {
|
||||||
|
finalizingBuilder.withDependencies(this.dependencies.toArray(String[]::new));
|
||||||
|
}
|
||||||
|
|
||||||
|
finalizingBuilder = finalizingBuilder.withDebugConfig(debugConfig);
|
||||||
|
|
||||||
|
result = finalizingBuilder.onDir(baseDir);
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
private PluginInvocationResult executeMaven(Path baseDir) {
|
||||||
|
PluginInvocationResult result;
|
||||||
|
RewriteMavenPluginBuilder.Recipes builder;
|
||||||
|
switch (action) {
|
||||||
|
case DRY_RUN -> builder = RewriteMavenPlugin.dryRun();
|
||||||
|
case DISCOVER -> builder = RewriteMavenPlugin.discover();
|
||||||
|
default -> builder = RewriteMavenPlugin.run();
|
||||||
|
}
|
||||||
|
RewriteMavenPluginBuilder.FinalizingBuilder finalizingBuilder = builder
|
||||||
|
.recipes(this.recipes.toArray(String[]::new));
|
||||||
|
if (minMemory != null) {
|
||||||
|
finalizingBuilder = finalizingBuilder.withMemory(minMemory, maxMemory);
|
||||||
|
}
|
||||||
|
if (debug) {
|
||||||
|
finalizingBuilder = finalizingBuilder.withDebug();
|
||||||
|
}
|
||||||
|
if (debugConfig != null) {
|
||||||
|
finalizingBuilder = finalizingBuilder.withDebugger(debugConfig.getPort(), debugConfig.isSuspend());
|
||||||
|
}
|
||||||
|
result = finalizingBuilder.onDir(baseDir);
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
private boolean isGradleProject(Path baseDir) {
|
||||||
|
return Files.exists(baseDir.resolve("build.gradle")) || Files.exists(baseDir.resolve("build.gradle.kts"));
|
||||||
|
}
|
||||||
|
|
||||||
|
private boolean isMavenProject(Path baseDir) {
|
||||||
|
return Files.exists(baseDir.resolve("pom.xml"));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public OpenRewritePluginBuilder.FinalizingBuilder dependencies(String... dependencies) {
|
||||||
|
this.dependencies = Arrays.asList(dependencies);
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public OpenRewritePluginBuilder.FinalizingBuilder withMemory(String minMemory, String maxMemory) {
|
||||||
|
this.minMemory = minMemory;
|
||||||
|
this.maxMemory = maxMemory;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public OpenRewritePluginBuilder.FinalizingBuilder withDebugging() {
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public OpenRewritePluginBuilder.FinalizingBuilder withDebugging(int port, boolean suspend) {
|
||||||
|
this.debugConfig = DebugConfig.from(port, suspend);
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public OpenRewritePluginBuilder.FinalizingBuilder withDebug() {
|
||||||
|
this.debug = true;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public OpenRewritePluginBuilder.FinalizingBuilder preferGradle() {
|
||||||
|
this.preferGradle = true;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public enum Action {
|
||||||
|
|
||||||
|
RUN, DRY_RUN, DISCOVER
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
class OpenRewritePluginBuilder {
|
||||||
|
|
||||||
|
public interface GradlePluginVersion {
|
||||||
|
|
||||||
|
Recipes gradlePluginVersion(String pluginVersion);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public interface Recipes {
|
||||||
|
|
||||||
|
OpenRewritePluginBuilder.FinalizingBuilder recipes(String... recipes);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public interface FinalizingBuilder {
|
||||||
|
|
||||||
|
PluginInvocationResult onDir(Path baseDir);
|
||||||
|
|
||||||
|
FinalizingBuilder dependencies(String... dependencies);
|
||||||
|
|
||||||
|
FinalizingBuilder withMemory(String min, String max);
|
||||||
|
|
||||||
|
FinalizingBuilder withDebugging();
|
||||||
|
|
||||||
|
FinalizingBuilder withDebugging(int port, boolean suspend);
|
||||||
|
|
||||||
|
FinalizingBuilder withDebug();
|
||||||
|
|
||||||
|
FinalizingBuilder preferGradle();
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,288 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2021 - 2023 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.rewrite.plugin.polyglot;
|
||||||
|
|
||||||
|
import org.apache.commons.lang3.stream.Streams;
|
||||||
|
import org.junit.jupiter.api.DisplayName;
|
||||||
|
import org.junit.jupiter.api.Nested;
|
||||||
|
import org.junit.jupiter.api.Test;
|
||||||
|
import org.springframework.rewrite.plugin.shared.PluginInvocationResult;
|
||||||
|
import org.springframework.test.util.TestSocketUtils;
|
||||||
|
|
||||||
|
import java.nio.file.Path;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.Arrays;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.stream.Collectors;
|
||||||
|
import java.util.stream.Stream;
|
||||||
|
|
||||||
|
import static org.assertj.core.api.Assertions.assertThat;
|
||||||
|
import static org.assertj.core.api.Assertions.fail;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author Fabian Krüger
|
||||||
|
*/
|
||||||
|
public class RewritePluginTest {
|
||||||
|
|
||||||
|
public static final String[] RECIPES = { "org.openrewrite.java.RemoveUnusedImports",
|
||||||
|
"org.openrewrite.java.format.NormalizeLineBreaks" };
|
||||||
|
|
||||||
|
public static final String[] EXTENDED_RECIPES = Stream
|
||||||
|
.concat(Stream.of(RECIPES), Stream.of("org.openrewrite.java.migrate.jakarta.MaybeAddJakartaServletApi"))
|
||||||
|
.toList()
|
||||||
|
.toArray(String[]::new);
|
||||||
|
|
||||||
|
public static final String EXTENDED_RECIPES_DEPS = "org.openrewrite.recipe:rewrite-migrate-java:2.9.0";
|
||||||
|
|
||||||
|
@Nested
|
||||||
|
class PolyglotTests {
|
||||||
|
|
||||||
|
@Test
|
||||||
|
@DisplayName("should prefer Maven over Gradle by default")
|
||||||
|
void shouldPreferMavenOverGradle() {
|
||||||
|
Path baseDir = Path.of("./testcode/polyglot-projects/simple-polyglot").toAbsolutePath().normalize();
|
||||||
|
PluginInvocationResult result = RewritePlugin.run()
|
||||||
|
.gradlePluginVersion("6.10.0")
|
||||||
|
.recipes(RECIPES)
|
||||||
|
.onDir(baseDir);
|
||||||
|
|
||||||
|
assertThat(result.capturedOutput()).contains("[INFO] >>> rewrite-maven-plugin:");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
@DisplayName("should prefer Gradle over Maven with flag")
|
||||||
|
void shouldPreferGradleOverMavenWithFlag() {
|
||||||
|
Path baseDir = Path.of("./testcode/polyglot-projects/simple-polyglot").toAbsolutePath().normalize();
|
||||||
|
PluginInvocationResult result = RewritePlugin.run()
|
||||||
|
.gradlePluginVersion("6.10.0")
|
||||||
|
.recipes(RECIPES)
|
||||||
|
.preferGradle()
|
||||||
|
.onDir(baseDir);
|
||||||
|
|
||||||
|
assertThat(result.capturedOutput()).contains("> Task :rewriteRun");
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Nested
|
||||||
|
class MavenTests {
|
||||||
|
|
||||||
|
public static final String[] DEFAULT_GOALS = new String[] { "resources", "compile", "testResources",
|
||||||
|
"testCompile" };
|
||||||
|
|
||||||
|
@Test
|
||||||
|
@DisplayName("simple Maven run")
|
||||||
|
void simpleMavenRun() {
|
||||||
|
Path baseDir = Path.of("./testcode/maven-projects/simple").toAbsolutePath().normalize();
|
||||||
|
verify(RewritePlugin.run(), baseDir, "run");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
@DisplayName("simple Maven dryRun")
|
||||||
|
void simpleMavenDryRun() {
|
||||||
|
Path baseDir = Path.of("./testcode/maven-projects/simple").toAbsolutePath().normalize();
|
||||||
|
verify(RewritePlugin.dryRun(), baseDir, "dryRun");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
@DisplayName("simple Maven discover")
|
||||||
|
void simpleMavenDiscover() {
|
||||||
|
Path baseDir = Path.of("./testcode/maven-projects/simple").toAbsolutePath().normalize();
|
||||||
|
PluginInvocationResult result = RewritePlugin.discover()
|
||||||
|
.gradlePluginVersion("1.2.3")
|
||||||
|
.recipes(RECIPES)
|
||||||
|
.onDir(baseDir);
|
||||||
|
|
||||||
|
assertBuildSuccessful(result);
|
||||||
|
String out = result.capturedOutput();
|
||||||
|
assertGoalsExecuted(out, "discover");
|
||||||
|
assertThat(out).contains("[INFO] Available Recipes:");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
@DisplayName("simple Maven full api")
|
||||||
|
void simpleMavenFullApi() {
|
||||||
|
int port = TestSocketUtils.findAvailableTcpPort();
|
||||||
|
Path baseDir = Path.of("./testcode/maven-projects/simple").toAbsolutePath().normalize();
|
||||||
|
PluginInvocationResult result = RewritePlugin.run()
|
||||||
|
.gradlePluginVersion("6.10.0")
|
||||||
|
.recipes(EXTENDED_RECIPES)
|
||||||
|
.dependencies(EXTENDED_RECIPES_DEPS)
|
||||||
|
.withMemory("18M", "280M")
|
||||||
|
.withDebug()
|
||||||
|
.withDebugging(port, false)
|
||||||
|
.onDir(baseDir);
|
||||||
|
assertBuildSuccessful(result);
|
||||||
|
String out = result.capturedOutput();
|
||||||
|
assertGoalsExecuted(out, DEFAULT_GOALS, "run");
|
||||||
|
assertMemory(out, "18M", "280M");
|
||||||
|
assertDebugConfig(out, port, false);
|
||||||
|
assertRecipesExecuted(out, EXTENDED_RECIPES);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void verify(OpenRewritePluginBuilder.GradlePluginVersion rewriteGoalExecution, Path baseDir,
|
||||||
|
String rewriteGoal) {
|
||||||
|
PluginInvocationResult result = rewriteGoalExecution.gradlePluginVersion("1.2.3")
|
||||||
|
.recipes(RECIPES)
|
||||||
|
.onDir(baseDir);
|
||||||
|
|
||||||
|
assertBuildSuccessful(result);
|
||||||
|
String out = result.capturedOutput();
|
||||||
|
assertGoalsExecuted(out, DEFAULT_GOALS, rewriteGoal);
|
||||||
|
assertRecipesExecuted(out, RECIPES);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void assertMemory(String out, String min, String max) {
|
||||||
|
// Setting memory fails in GH Actions under Windows
|
||||||
|
if (!System.getenv().containsKey("GITHUB_ACTIONS") && !System.getProperty("os.name").contains("Windows")) {
|
||||||
|
assertThat(out).contains("env.MAVEN_OPTS= -Xms%s -Xmx%s".formatted(min, max));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void assertDebugConfig(String out, int port, boolean suspend) {
|
||||||
|
assertThat(out).contains("Listening for transport dt_socket at address: %s".formatted(port),
|
||||||
|
"-Xrunjdwp:transport=dt_socket,server=y,suspend=%s,address=%s".formatted(suspend ? "y" : "n",
|
||||||
|
port));
|
||||||
|
}
|
||||||
|
|
||||||
|
private void assertBuildSuccessful(PluginInvocationResult result) {
|
||||||
|
assertThat(result.success()).isTrue();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void assertGoalsExecuted(String out, String... goals) {
|
||||||
|
if (goals.length == 0) {
|
||||||
|
fail("No goals provided");
|
||||||
|
}
|
||||||
|
Stream.of(goals).forEach(goal -> assertThat(out).contains(":" + goal + " "));
|
||||||
|
}
|
||||||
|
|
||||||
|
private void assertGoalsExecuted(String out, String[] defaultTasks, String rewriteTask) {
|
||||||
|
String[] tasks = tasksOf(defaultTasks, rewriteTask);
|
||||||
|
Streams.of(tasks).forEach(t -> assertThat(out).contains(t));
|
||||||
|
}
|
||||||
|
|
||||||
|
private void assertRecipesExecuted(String out, String... recipes) {
|
||||||
|
assertThat(out)
|
||||||
|
.contains("active recipe(s) [%s]".formatted(Stream.of(recipes).collect(Collectors.joining(", "))));
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Nested
|
||||||
|
class GradleTests {
|
||||||
|
|
||||||
|
public static final Path BASE_DIR = Path.of("./testcode/gradle-projects/simple").toAbsolutePath().normalize();
|
||||||
|
|
||||||
|
public static final String[] DEFAULT_TASKS = new String[] { "compileJava", "processResources", "classes",
|
||||||
|
"compileTestJava", "rewriteResolveDependencies" };
|
||||||
|
|
||||||
|
@Test
|
||||||
|
@DisplayName("simple Gradle run")
|
||||||
|
void simpleGradleRun() {
|
||||||
|
verify(RewritePlugin.run(), "rewriteRun");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
@DisplayName("simple Gradle dryRun")
|
||||||
|
void simpleGradleDryRun() {
|
||||||
|
verify(RewritePlugin.dryRun(), "rewriteDryRun");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
@DisplayName("simple Gradle discover")
|
||||||
|
void simpleGradleDiscover() {
|
||||||
|
PluginInvocationResult result = RewritePlugin.discover()
|
||||||
|
.gradlePluginVersion("6.10.0")
|
||||||
|
.recipes(RECIPES)
|
||||||
|
.onDir(BASE_DIR);
|
||||||
|
|
||||||
|
String out = result.capturedOutput();
|
||||||
|
assertSuccessfulBuild(out);
|
||||||
|
assertTasksExecuted(out, "rewriteDiscover");
|
||||||
|
assertThat(out).contains("Available Recipes:");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
@DisplayName("simple Gradle full API")
|
||||||
|
void simpleGradleFullApi() {
|
||||||
|
int port = TestSocketUtils.findAvailableTcpPort();
|
||||||
|
Path baseDir = Path.of("./testcode/gradle-projects/simple").toAbsolutePath().normalize();
|
||||||
|
PluginInvocationResult result = RewritePlugin.run()
|
||||||
|
.gradlePluginVersion("6.10.0")
|
||||||
|
.recipes(EXTENDED_RECIPES)
|
||||||
|
.dependencies(EXTENDED_RECIPES_DEPS)
|
||||||
|
.withDebug()
|
||||||
|
.withMemory("64M", "484M")
|
||||||
|
.withDebugging(port, false)
|
||||||
|
.onDir(baseDir);
|
||||||
|
|
||||||
|
assertThat(result.success()).isTrue();
|
||||||
|
String out = result.capturedOutput();
|
||||||
|
assertSuccessfulBuild(out);
|
||||||
|
assertMemory(out, "64M", "484M");
|
||||||
|
assertDebugConfig(out, port, false);
|
||||||
|
assertTasksExecuted(out, DEFAULT_TASKS, "rewriteRun");
|
||||||
|
assertRecipesExecuted(out, EXTENDED_RECIPES);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void verify(OpenRewritePluginBuilder.GradlePluginVersion run, String run1) {
|
||||||
|
PluginInvocationResult result = run.gradlePluginVersion("6.10.0").recipes(RECIPES).onDir(BASE_DIR);
|
||||||
|
|
||||||
|
String out = result.capturedOutput();
|
||||||
|
assertSuccessfulBuild(out);
|
||||||
|
assertTasksExecuted(out, DEFAULT_TASKS, run1);
|
||||||
|
assertRecipesExecuted(out, RECIPES);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void assertMemory(String out, String min, String max) {
|
||||||
|
assertThat(out).contains("-Xms%s".formatted(min));
|
||||||
|
assertThat(out).contains("-Xmx%s".formatted(max));
|
||||||
|
}
|
||||||
|
|
||||||
|
private void assertDebugConfig(String out, int port, boolean suspend) {
|
||||||
|
assertThat(out).contains("-agentlib:jdwp=transport=dt_socket,server=y,suspend=%s,address=%s"
|
||||||
|
.formatted(suspend ? "y" : "n", port));
|
||||||
|
}
|
||||||
|
|
||||||
|
private void assertSuccessfulBuild(String out) {
|
||||||
|
assertThat(out).contains("BUILD SUCCESSFUL in");
|
||||||
|
}
|
||||||
|
|
||||||
|
private void assertTasksExecuted(String out, String[] defaultTasks, String rewriteTask) {
|
||||||
|
String[] tasks = tasksOf(defaultTasks, rewriteTask);
|
||||||
|
assertTasksExecuted(out, tasks);
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void assertTasksExecuted(String out, String... tasks) {
|
||||||
|
List<String> tasksOutput = Stream.of(tasks).map(t -> "Task :" + t).toList();
|
||||||
|
assertThat(out).contains(tasksOutput);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void assertRecipesExecuted(String out, String[] recipes) {
|
||||||
|
assertThat(out).containsIgnoringWhitespaces("All sources parsed, running active recipes: "
|
||||||
|
+ Stream.of(recipes).collect(Collectors.joining(",")));
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
private String[] tasksOf(String[] defaultTasks, String rewriteTask) {
|
||||||
|
List<String> tasksList = new ArrayList<>();
|
||||||
|
tasksList.addAll(Arrays.asList(defaultTasks));
|
||||||
|
tasksList.add(rewriteTask);
|
||||||
|
return tasksList.toArray(String[]::new);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,42 @@
|
|||||||
|
.gradle
|
||||||
|
build/
|
||||||
|
!gradle/wrapper/gradle-wrapper.jar
|
||||||
|
!**/src/main/**/build/
|
||||||
|
!**/src/test/**/build/
|
||||||
|
|
||||||
|
### IntelliJ IDEA ###
|
||||||
|
.idea/modules.xml
|
||||||
|
.idea/jarRepositories.xml
|
||||||
|
.idea/compiler.xml
|
||||||
|
.idea/libraries/
|
||||||
|
*.iws
|
||||||
|
*.iml
|
||||||
|
*.ipr
|
||||||
|
out/
|
||||||
|
!**/src/main/**/out/
|
||||||
|
!**/src/test/**/out/
|
||||||
|
|
||||||
|
### Eclipse ###
|
||||||
|
.apt_generated
|
||||||
|
.classpath
|
||||||
|
.factorypath
|
||||||
|
.project
|
||||||
|
.settings
|
||||||
|
.springBeans
|
||||||
|
.sts4-cache
|
||||||
|
bin/
|
||||||
|
!**/src/main/**/bin/
|
||||||
|
!**/src/test/**/bin/
|
||||||
|
|
||||||
|
### NetBeans ###
|
||||||
|
/nbproject/private/
|
||||||
|
/nbbuild/
|
||||||
|
/dist/
|
||||||
|
/nbdist/
|
||||||
|
/.nb-gradle/
|
||||||
|
|
||||||
|
### VS Code ###
|
||||||
|
.vscode/
|
||||||
|
|
||||||
|
### Mac OS ###
|
||||||
|
.DS_Store
|
||||||
@@ -0,0 +1,19 @@
|
|||||||
|
plugins {
|
||||||
|
id("java")
|
||||||
|
}
|
||||||
|
|
||||||
|
group = "org.example"
|
||||||
|
version = "1.0-SNAPSHOT"
|
||||||
|
|
||||||
|
repositories {
|
||||||
|
mavenCentral()
|
||||||
|
}
|
||||||
|
|
||||||
|
dependencies {
|
||||||
|
testImplementation(platform("org.junit:junit-bom:5.9.1"))
|
||||||
|
testImplementation("org.junit.jupiter:junit-jupiter")
|
||||||
|
}
|
||||||
|
|
||||||
|
tasks.test {
|
||||||
|
useJUnitPlatform()
|
||||||
|
}
|
||||||
Binary file not shown.
@@ -0,0 +1,6 @@
|
|||||||
|
#Wed Mar 13 15:37:19 CET 2024
|
||||||
|
distributionBase=GRADLE_USER_HOME
|
||||||
|
distributionPath=wrapper/dists
|
||||||
|
distributionUrl=https\://services.gradle.org/distributions/gradle-8.4-bin.zip
|
||||||
|
zipStoreBase=GRADLE_USER_HOME
|
||||||
|
zipStorePath=wrapper/dists
|
||||||
@@ -0,0 +1,234 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
|
||||||
|
#
|
||||||
|
# Copyright © 2015-2021 the original 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.
|
||||||
|
#
|
||||||
|
|
||||||
|
##############################################################################
|
||||||
|
#
|
||||||
|
# Gradle start up script for POSIX generated by Gradle.
|
||||||
|
#
|
||||||
|
# Important for running:
|
||||||
|
#
|
||||||
|
# (1) You need a POSIX-compliant shell to run this script. If your /bin/sh is
|
||||||
|
# noncompliant, but you have some other compliant shell such as ksh or
|
||||||
|
# bash, then to run this script, type that shell name before the whole
|
||||||
|
# command line, like:
|
||||||
|
#
|
||||||
|
# ksh Gradle
|
||||||
|
#
|
||||||
|
# Busybox and similar reduced shells will NOT work, because this script
|
||||||
|
# requires all of these POSIX shell features:
|
||||||
|
# * functions;
|
||||||
|
# * expansions «$var», «${var}», «${var:-default}», «${var+SET}»,
|
||||||
|
# «${var#prefix}», «${var%suffix}», and «$( cmd )»;
|
||||||
|
# * compound commands having a testable exit status, especially «case»;
|
||||||
|
# * various built-in commands including «command», «set», and «ulimit».
|
||||||
|
#
|
||||||
|
# Important for patching:
|
||||||
|
#
|
||||||
|
# (2) This script targets any POSIX shell, so it avoids extensions provided
|
||||||
|
# by Bash, Ksh, etc; in particular arrays are avoided.
|
||||||
|
#
|
||||||
|
# The "traditional" practice of packing multiple parameters into a
|
||||||
|
# space-separated string is a well documented source of bugs and security
|
||||||
|
# problems, so this is (mostly) avoided, by progressively accumulating
|
||||||
|
# options in "$@", and eventually passing that to Java.
|
||||||
|
#
|
||||||
|
# Where the inherited environment variables (DEFAULT_JVM_OPTS, JAVA_OPTS,
|
||||||
|
# and GRADLE_OPTS) rely on word-splitting, this is performed explicitly;
|
||||||
|
# see the in-line comments for details.
|
||||||
|
#
|
||||||
|
# There are tweaks for specific operating systems such as AIX, CygWin,
|
||||||
|
# Darwin, MinGW, and NonStop.
|
||||||
|
#
|
||||||
|
# (3) This script is generated from the Groovy template
|
||||||
|
# https://github.com/gradle/gradle/blob/master/subprojects/plugins/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt
|
||||||
|
# within the Gradle project.
|
||||||
|
#
|
||||||
|
# You can find Gradle at https://github.com/gradle/gradle/.
|
||||||
|
#
|
||||||
|
##############################################################################
|
||||||
|
|
||||||
|
# Attempt to set APP_HOME
|
||||||
|
|
||||||
|
# Resolve links: $0 may be a link
|
||||||
|
app_path=$0
|
||||||
|
|
||||||
|
# Need this for daisy-chained symlinks.
|
||||||
|
while
|
||||||
|
APP_HOME=${app_path%"${app_path##*/}"} # leaves a trailing /; empty if no leading path
|
||||||
|
[ -h "$app_path" ]
|
||||||
|
do
|
||||||
|
ls=$( ls -ld "$app_path" )
|
||||||
|
link=${ls#*' -> '}
|
||||||
|
case $link in #(
|
||||||
|
/*) app_path=$link ;; #(
|
||||||
|
*) app_path=$APP_HOME$link ;;
|
||||||
|
esac
|
||||||
|
done
|
||||||
|
|
||||||
|
APP_HOME=$( cd "${APP_HOME:-./}" && pwd -P ) || exit
|
||||||
|
|
||||||
|
APP_NAME="Gradle"
|
||||||
|
APP_BASE_NAME=${0##*/}
|
||||||
|
|
||||||
|
# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
|
||||||
|
DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"'
|
||||||
|
|
||||||
|
# Use the maximum available, or set MAX_FD != -1 to use that value.
|
||||||
|
MAX_FD=maximum
|
||||||
|
|
||||||
|
warn () {
|
||||||
|
echo "$*"
|
||||||
|
} >&2
|
||||||
|
|
||||||
|
die () {
|
||||||
|
echo
|
||||||
|
echo "$*"
|
||||||
|
echo
|
||||||
|
exit 1
|
||||||
|
} >&2
|
||||||
|
|
||||||
|
# OS specific support (must be 'true' or 'false').
|
||||||
|
cygwin=false
|
||||||
|
msys=false
|
||||||
|
darwin=false
|
||||||
|
nonstop=false
|
||||||
|
case "$( uname )" in #(
|
||||||
|
CYGWIN* ) cygwin=true ;; #(
|
||||||
|
Darwin* ) darwin=true ;; #(
|
||||||
|
MSYS* | MINGW* ) msys=true ;; #(
|
||||||
|
NONSTOP* ) nonstop=true ;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
|
||||||
|
|
||||||
|
|
||||||
|
# Determine the Java command to use to start the JVM.
|
||||||
|
if [ -n "$JAVA_HOME" ] ; then
|
||||||
|
if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
|
||||||
|
# IBM's JDK on AIX uses strange locations for the executables
|
||||||
|
JAVACMD=$JAVA_HOME/jre/sh/java
|
||||||
|
else
|
||||||
|
JAVACMD=$JAVA_HOME/bin/java
|
||||||
|
fi
|
||||||
|
if [ ! -x "$JAVACMD" ] ; then
|
||||||
|
die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME
|
||||||
|
|
||||||
|
Please set the JAVA_HOME variable in your environment to match the
|
||||||
|
location of your Java installation."
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
JAVACMD=java
|
||||||
|
which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
|
||||||
|
|
||||||
|
Please set the JAVA_HOME variable in your environment to match the
|
||||||
|
location of your Java installation."
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Increase the maximum file descriptors if we can.
|
||||||
|
if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then
|
||||||
|
case $MAX_FD in #(
|
||||||
|
max*)
|
||||||
|
MAX_FD=$( ulimit -H -n ) ||
|
||||||
|
warn "Could not query maximum file descriptor limit"
|
||||||
|
esac
|
||||||
|
case $MAX_FD in #(
|
||||||
|
'' | soft) :;; #(
|
||||||
|
*)
|
||||||
|
ulimit -n "$MAX_FD" ||
|
||||||
|
warn "Could not set maximum file descriptor limit to $MAX_FD"
|
||||||
|
esac
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Collect all arguments for the java command, stacking in reverse order:
|
||||||
|
# * args from the command line
|
||||||
|
# * the main class name
|
||||||
|
# * -classpath
|
||||||
|
# * -D...appname settings
|
||||||
|
# * --module-path (only if needed)
|
||||||
|
# * DEFAULT_JVM_OPTS, JAVA_OPTS, and GRADLE_OPTS environment variables.
|
||||||
|
|
||||||
|
# For Cygwin or MSYS, switch paths to Windows format before running java
|
||||||
|
if "$cygwin" || "$msys" ; then
|
||||||
|
APP_HOME=$( cygpath --path --mixed "$APP_HOME" )
|
||||||
|
CLASSPATH=$( cygpath --path --mixed "$CLASSPATH" )
|
||||||
|
|
||||||
|
JAVACMD=$( cygpath --unix "$JAVACMD" )
|
||||||
|
|
||||||
|
# Now convert the arguments - kludge to limit ourselves to /bin/sh
|
||||||
|
for arg do
|
||||||
|
if
|
||||||
|
case $arg in #(
|
||||||
|
-*) false ;; # don't mess with options #(
|
||||||
|
/?*) t=${arg#/} t=/${t%%/*} # looks like a POSIX filepath
|
||||||
|
[ -e "$t" ] ;; #(
|
||||||
|
*) false ;;
|
||||||
|
esac
|
||||||
|
then
|
||||||
|
arg=$( cygpath --path --ignore --mixed "$arg" )
|
||||||
|
fi
|
||||||
|
# Roll the args list around exactly as many times as the number of
|
||||||
|
# args, so each arg winds up back in the position where it started, but
|
||||||
|
# possibly modified.
|
||||||
|
#
|
||||||
|
# NB: a `for` loop captures its iteration list before it begins, so
|
||||||
|
# changing the positional parameters here affects neither the number of
|
||||||
|
# iterations, nor the values presented in `arg`.
|
||||||
|
shift # remove old arg
|
||||||
|
set -- "$@" "$arg" # push replacement arg
|
||||||
|
done
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Collect all arguments for the java command;
|
||||||
|
# * $DEFAULT_JVM_OPTS, $JAVA_OPTS, and $GRADLE_OPTS can contain fragments of
|
||||||
|
# shell script including quotes and variable substitutions, so put them in
|
||||||
|
# double quotes to make sure that they get re-expanded; and
|
||||||
|
# * put everything else in single quotes, so that it's not re-expanded.
|
||||||
|
|
||||||
|
set -- \
|
||||||
|
"-Dorg.gradle.appname=$APP_BASE_NAME" \
|
||||||
|
-classpath "$CLASSPATH" \
|
||||||
|
org.gradle.wrapper.GradleWrapperMain \
|
||||||
|
"$@"
|
||||||
|
|
||||||
|
# Use "xargs" to parse quoted args.
|
||||||
|
#
|
||||||
|
# With -n1 it outputs one arg per line, with the quotes and backslashes removed.
|
||||||
|
#
|
||||||
|
# In Bash we could simply go:
|
||||||
|
#
|
||||||
|
# readarray ARGS < <( xargs -n1 <<<"$var" ) &&
|
||||||
|
# set -- "${ARGS[@]}" "$@"
|
||||||
|
#
|
||||||
|
# but POSIX shell has neither arrays nor command substitution, so instead we
|
||||||
|
# post-process each arg (as a line of input to sed) to backslash-escape any
|
||||||
|
# character that might be a shell metacharacter, then use eval to reverse
|
||||||
|
# that process (while maintaining the separation between arguments), and wrap
|
||||||
|
# the whole thing up as a single "set" statement.
|
||||||
|
#
|
||||||
|
# This will of course break if any of these variables contains a newline or
|
||||||
|
# an unmatched quote.
|
||||||
|
#
|
||||||
|
|
||||||
|
eval "set -- $(
|
||||||
|
printf '%s\n' "$DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS" |
|
||||||
|
xargs -n1 |
|
||||||
|
sed ' s~[^-[:alnum:]+,./:=@_]~\\&~g; ' |
|
||||||
|
tr '\n' ' '
|
||||||
|
)" '"$@"'
|
||||||
|
|
||||||
|
exec "$JAVACMD" "$@"
|
||||||
@@ -0,0 +1,89 @@
|
|||||||
|
@rem
|
||||||
|
@rem Copyright 2015 the original author or authors.
|
||||||
|
@rem
|
||||||
|
@rem Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
@rem you may not use this file except in compliance with the License.
|
||||||
|
@rem You may obtain a copy of the License at
|
||||||
|
@rem
|
||||||
|
@rem https://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
@rem
|
||||||
|
@rem Unless required by applicable law or agreed to in writing, software
|
||||||
|
@rem distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
@rem See the License for the specific language governing permissions and
|
||||||
|
@rem limitations under the License.
|
||||||
|
@rem
|
||||||
|
|
||||||
|
@if "%DEBUG%" == "" @echo off
|
||||||
|
@rem ##########################################################################
|
||||||
|
@rem
|
||||||
|
@rem Gradle startup script for Windows
|
||||||
|
@rem
|
||||||
|
@rem ##########################################################################
|
||||||
|
|
||||||
|
@rem Set local scope for the variables with windows NT shell
|
||||||
|
if "%OS%"=="Windows_NT" setlocal
|
||||||
|
|
||||||
|
set DIRNAME=%~dp0
|
||||||
|
if "%DIRNAME%" == "" set DIRNAME=.
|
||||||
|
set APP_BASE_NAME=%~n0
|
||||||
|
set APP_HOME=%DIRNAME%
|
||||||
|
|
||||||
|
@rem Resolve any "." and ".." in APP_HOME to make it shorter.
|
||||||
|
for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi
|
||||||
|
|
||||||
|
@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
|
||||||
|
set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m"
|
||||||
|
|
||||||
|
@rem Find java.exe
|
||||||
|
if defined JAVA_HOME goto findJavaFromJavaHome
|
||||||
|
|
||||||
|
set JAVA_EXE=java.exe
|
||||||
|
%JAVA_EXE% -version >NUL 2>&1
|
||||||
|
if "%ERRORLEVEL%" == "0" goto execute
|
||||||
|
|
||||||
|
echo.
|
||||||
|
echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
|
||||||
|
echo.
|
||||||
|
echo Please set the JAVA_HOME variable in your environment to match the
|
||||||
|
echo location of your Java installation.
|
||||||
|
|
||||||
|
goto fail
|
||||||
|
|
||||||
|
:findJavaFromJavaHome
|
||||||
|
set JAVA_HOME=%JAVA_HOME:"=%
|
||||||
|
set JAVA_EXE=%JAVA_HOME%/bin/java.exe
|
||||||
|
|
||||||
|
if exist "%JAVA_EXE%" goto execute
|
||||||
|
|
||||||
|
echo.
|
||||||
|
echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
|
||||||
|
echo.
|
||||||
|
echo Please set the JAVA_HOME variable in your environment to match the
|
||||||
|
echo location of your Java installation.
|
||||||
|
|
||||||
|
goto fail
|
||||||
|
|
||||||
|
:execute
|
||||||
|
@rem Setup the command line
|
||||||
|
|
||||||
|
set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
|
||||||
|
|
||||||
|
|
||||||
|
@rem Execute Gradle
|
||||||
|
"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %*
|
||||||
|
|
||||||
|
:end
|
||||||
|
@rem End local scope for the variables with windows NT shell
|
||||||
|
if "%ERRORLEVEL%"=="0" goto mainEnd
|
||||||
|
|
||||||
|
:fail
|
||||||
|
rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
|
||||||
|
rem the _cmd.exe /c_ return code!
|
||||||
|
if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1
|
||||||
|
exit /b 1
|
||||||
|
|
||||||
|
:mainEnd
|
||||||
|
if "%OS%"=="Windows_NT" endlocal
|
||||||
|
|
||||||
|
:omega
|
||||||
@@ -0,0 +1,2 @@
|
|||||||
|
rootProject.name = "simple"
|
||||||
|
|
||||||
@@ -0,0 +1,10 @@
|
|||||||
|
package org.example;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author Fabian Krüger
|
||||||
|
*/
|
||||||
|
public class Main {
|
||||||
|
public static void main(String[] args) {
|
||||||
|
System.out.println("Hello world!");
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,16 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<project xmlns="http://maven.apache.org/POM/4.0.0"
|
||||||
|
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||||
|
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
||||||
|
<modelVersion>4.0.0</modelVersion>
|
||||||
|
<groupId>com.example.maven</groupId>
|
||||||
|
<artifactId>simple</artifactId>
|
||||||
|
<version>0.1.0-SNAPSHOT</version>
|
||||||
|
|
||||||
|
<properties>
|
||||||
|
<maven.compiler.source>17</maven.compiler.source>
|
||||||
|
<maven.compiler.target>17</maven.compiler.target>
|
||||||
|
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
|
||||||
|
</properties>
|
||||||
|
|
||||||
|
</project>
|
||||||
@@ -0,0 +1,5 @@
|
|||||||
|
package com.example;
|
||||||
|
|
||||||
|
public class TheClass {
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,5 @@
|
|||||||
|
package com.example;
|
||||||
|
|
||||||
|
public class TheClassTest {
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,43 @@
|
|||||||
|
.gradle
|
||||||
|
build/
|
||||||
|
!gradle/wrapper/gradle-wrapper.jar
|
||||||
|
!**/src/main/**/build/
|
||||||
|
!**/src/test/**/build/
|
||||||
|
|
||||||
|
### IntelliJ IDEA ###
|
||||||
|
.idea/modules.xml
|
||||||
|
.idea/jarRepositories.xml
|
||||||
|
.idea/compiler.xml
|
||||||
|
.idea/libraries/
|
||||||
|
*.iws
|
||||||
|
*.iml
|
||||||
|
*.ipr
|
||||||
|
out/
|
||||||
|
!**/src/main/**/out/
|
||||||
|
!**/src/test/**/out/
|
||||||
|
|
||||||
|
### Eclipse ###
|
||||||
|
.apt_generated
|
||||||
|
.classpath
|
||||||
|
.factorypath
|
||||||
|
.project
|
||||||
|
.settings
|
||||||
|
.springBeans
|
||||||
|
.sts4-cache
|
||||||
|
bin/
|
||||||
|
!**/src/main/**/bin/
|
||||||
|
!**/src/test/**/bin/
|
||||||
|
|
||||||
|
### NetBeans ###
|
||||||
|
/nbproject/private/
|
||||||
|
/nbbuild/
|
||||||
|
/dist/
|
||||||
|
/nbdist/
|
||||||
|
/.nb-gradle/
|
||||||
|
|
||||||
|
### VS Code ###
|
||||||
|
.vscode/
|
||||||
|
|
||||||
|
### Mac OS ###
|
||||||
|
.DS_Store
|
||||||
|
/target/
|
||||||
@@ -0,0 +1,19 @@
|
|||||||
|
plugins {
|
||||||
|
id("java")
|
||||||
|
}
|
||||||
|
|
||||||
|
group = "org.example"
|
||||||
|
version = "1.0.0-SNAPSHOT"
|
||||||
|
|
||||||
|
repositories {
|
||||||
|
mavenCentral()
|
||||||
|
}
|
||||||
|
|
||||||
|
dependencies {
|
||||||
|
testImplementation(platform("org.junit:junit-bom:5.9.1"))
|
||||||
|
testImplementation("org.junit.jupiter:junit-jupiter")
|
||||||
|
}
|
||||||
|
|
||||||
|
tasks.test {
|
||||||
|
useJUnitPlatform()
|
||||||
|
}
|
||||||
Binary file not shown.
@@ -0,0 +1,6 @@
|
|||||||
|
#Fri Mar 15 13:11:41 CET 2024
|
||||||
|
distributionBase=GRADLE_USER_HOME
|
||||||
|
distributionPath=wrapper/dists
|
||||||
|
distributionUrl=https\://services.gradle.org/distributions/gradle-8.4-bin.zip
|
||||||
|
zipStoreBase=GRADLE_USER_HOME
|
||||||
|
zipStorePath=wrapper/dists
|
||||||
@@ -0,0 +1,234 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
|
||||||
|
#
|
||||||
|
# Copyright © 2015-2021 the original 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.
|
||||||
|
#
|
||||||
|
|
||||||
|
##############################################################################
|
||||||
|
#
|
||||||
|
# Gradle start up script for POSIX generated by Gradle.
|
||||||
|
#
|
||||||
|
# Important for running:
|
||||||
|
#
|
||||||
|
# (1) You need a POSIX-compliant shell to run this script. If your /bin/sh is
|
||||||
|
# noncompliant, but you have some other compliant shell such as ksh or
|
||||||
|
# bash, then to run this script, type that shell name before the whole
|
||||||
|
# command line, like:
|
||||||
|
#
|
||||||
|
# ksh Gradle
|
||||||
|
#
|
||||||
|
# Busybox and similar reduced shells will NOT work, because this script
|
||||||
|
# requires all of these POSIX shell features:
|
||||||
|
# * functions;
|
||||||
|
# * expansions «$var», «${var}», «${var:-default}», «${var+SET}»,
|
||||||
|
# «${var#prefix}», «${var%suffix}», and «$( cmd )»;
|
||||||
|
# * compound commands having a testable exit status, especially «case»;
|
||||||
|
# * various built-in commands including «command», «set», and «ulimit».
|
||||||
|
#
|
||||||
|
# Important for patching:
|
||||||
|
#
|
||||||
|
# (2) This script targets any POSIX shell, so it avoids extensions provided
|
||||||
|
# by Bash, Ksh, etc; in particular arrays are avoided.
|
||||||
|
#
|
||||||
|
# The "traditional" practice of packing multiple parameters into a
|
||||||
|
# space-separated string is a well documented source of bugs and security
|
||||||
|
# problems, so this is (mostly) avoided, by progressively accumulating
|
||||||
|
# options in "$@", and eventually passing that to Java.
|
||||||
|
#
|
||||||
|
# Where the inherited environment variables (DEFAULT_JVM_OPTS, JAVA_OPTS,
|
||||||
|
# and GRADLE_OPTS) rely on word-splitting, this is performed explicitly;
|
||||||
|
# see the in-line comments for details.
|
||||||
|
#
|
||||||
|
# There are tweaks for specific operating systems such as AIX, CygWin,
|
||||||
|
# Darwin, MinGW, and NonStop.
|
||||||
|
#
|
||||||
|
# (3) This script is generated from the Groovy template
|
||||||
|
# https://github.com/gradle/gradle/blob/master/subprojects/plugins/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt
|
||||||
|
# within the Gradle project.
|
||||||
|
#
|
||||||
|
# You can find Gradle at https://github.com/gradle/gradle/.
|
||||||
|
#
|
||||||
|
##############################################################################
|
||||||
|
|
||||||
|
# Attempt to set APP_HOME
|
||||||
|
|
||||||
|
# Resolve links: $0 may be a link
|
||||||
|
app_path=$0
|
||||||
|
|
||||||
|
# Need this for daisy-chained symlinks.
|
||||||
|
while
|
||||||
|
APP_HOME=${app_path%"${app_path##*/}"} # leaves a trailing /; empty if no leading path
|
||||||
|
[ -h "$app_path" ]
|
||||||
|
do
|
||||||
|
ls=$( ls -ld "$app_path" )
|
||||||
|
link=${ls#*' -> '}
|
||||||
|
case $link in #(
|
||||||
|
/*) app_path=$link ;; #(
|
||||||
|
*) app_path=$APP_HOME$link ;;
|
||||||
|
esac
|
||||||
|
done
|
||||||
|
|
||||||
|
APP_HOME=$( cd "${APP_HOME:-./}" && pwd -P ) || exit
|
||||||
|
|
||||||
|
APP_NAME="Gradle"
|
||||||
|
APP_BASE_NAME=${0##*/}
|
||||||
|
|
||||||
|
# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
|
||||||
|
DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"'
|
||||||
|
|
||||||
|
# Use the maximum available, or set MAX_FD != -1 to use that value.
|
||||||
|
MAX_FD=maximum
|
||||||
|
|
||||||
|
warn () {
|
||||||
|
echo "$*"
|
||||||
|
} >&2
|
||||||
|
|
||||||
|
die () {
|
||||||
|
echo
|
||||||
|
echo "$*"
|
||||||
|
echo
|
||||||
|
exit 1
|
||||||
|
} >&2
|
||||||
|
|
||||||
|
# OS specific support (must be 'true' or 'false').
|
||||||
|
cygwin=false
|
||||||
|
msys=false
|
||||||
|
darwin=false
|
||||||
|
nonstop=false
|
||||||
|
case "$( uname )" in #(
|
||||||
|
CYGWIN* ) cygwin=true ;; #(
|
||||||
|
Darwin* ) darwin=true ;; #(
|
||||||
|
MSYS* | MINGW* ) msys=true ;; #(
|
||||||
|
NONSTOP* ) nonstop=true ;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
|
||||||
|
|
||||||
|
|
||||||
|
# Determine the Java command to use to start the JVM.
|
||||||
|
if [ -n "$JAVA_HOME" ] ; then
|
||||||
|
if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
|
||||||
|
# IBM's JDK on AIX uses strange locations for the executables
|
||||||
|
JAVACMD=$JAVA_HOME/jre/sh/java
|
||||||
|
else
|
||||||
|
JAVACMD=$JAVA_HOME/bin/java
|
||||||
|
fi
|
||||||
|
if [ ! -x "$JAVACMD" ] ; then
|
||||||
|
die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME
|
||||||
|
|
||||||
|
Please set the JAVA_HOME variable in your environment to match the
|
||||||
|
location of your Java installation."
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
JAVACMD=java
|
||||||
|
which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
|
||||||
|
|
||||||
|
Please set the JAVA_HOME variable in your environment to match the
|
||||||
|
location of your Java installation."
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Increase the maximum file descriptors if we can.
|
||||||
|
if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then
|
||||||
|
case $MAX_FD in #(
|
||||||
|
max*)
|
||||||
|
MAX_FD=$( ulimit -H -n ) ||
|
||||||
|
warn "Could not query maximum file descriptor limit"
|
||||||
|
esac
|
||||||
|
case $MAX_FD in #(
|
||||||
|
'' | soft) :;; #(
|
||||||
|
*)
|
||||||
|
ulimit -n "$MAX_FD" ||
|
||||||
|
warn "Could not set maximum file descriptor limit to $MAX_FD"
|
||||||
|
esac
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Collect all arguments for the java command, stacking in reverse order:
|
||||||
|
# * args from the command line
|
||||||
|
# * the main class name
|
||||||
|
# * -classpath
|
||||||
|
# * -D...appname settings
|
||||||
|
# * --module-path (only if needed)
|
||||||
|
# * DEFAULT_JVM_OPTS, JAVA_OPTS, and GRADLE_OPTS environment variables.
|
||||||
|
|
||||||
|
# For Cygwin or MSYS, switch paths to Windows format before running java
|
||||||
|
if "$cygwin" || "$msys" ; then
|
||||||
|
APP_HOME=$( cygpath --path --mixed "$APP_HOME" )
|
||||||
|
CLASSPATH=$( cygpath --path --mixed "$CLASSPATH" )
|
||||||
|
|
||||||
|
JAVACMD=$( cygpath --unix "$JAVACMD" )
|
||||||
|
|
||||||
|
# Now convert the arguments - kludge to limit ourselves to /bin/sh
|
||||||
|
for arg do
|
||||||
|
if
|
||||||
|
case $arg in #(
|
||||||
|
-*) false ;; # don't mess with options #(
|
||||||
|
/?*) t=${arg#/} t=/${t%%/*} # looks like a POSIX filepath
|
||||||
|
[ -e "$t" ] ;; #(
|
||||||
|
*) false ;;
|
||||||
|
esac
|
||||||
|
then
|
||||||
|
arg=$( cygpath --path --ignore --mixed "$arg" )
|
||||||
|
fi
|
||||||
|
# Roll the args list around exactly as many times as the number of
|
||||||
|
# args, so each arg winds up back in the position where it started, but
|
||||||
|
# possibly modified.
|
||||||
|
#
|
||||||
|
# NB: a `for` loop captures its iteration list before it begins, so
|
||||||
|
# changing the positional parameters here affects neither the number of
|
||||||
|
# iterations, nor the values presented in `arg`.
|
||||||
|
shift # remove old arg
|
||||||
|
set -- "$@" "$arg" # push replacement arg
|
||||||
|
done
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Collect all arguments for the java command;
|
||||||
|
# * $DEFAULT_JVM_OPTS, $JAVA_OPTS, and $GRADLE_OPTS can contain fragments of
|
||||||
|
# shell script including quotes and variable substitutions, so put them in
|
||||||
|
# double quotes to make sure that they get re-expanded; and
|
||||||
|
# * put everything else in single quotes, so that it's not re-expanded.
|
||||||
|
|
||||||
|
set -- \
|
||||||
|
"-Dorg.gradle.appname=$APP_BASE_NAME" \
|
||||||
|
-classpath "$CLASSPATH" \
|
||||||
|
org.gradle.wrapper.GradleWrapperMain \
|
||||||
|
"$@"
|
||||||
|
|
||||||
|
# Use "xargs" to parse quoted args.
|
||||||
|
#
|
||||||
|
# With -n1 it outputs one arg per line, with the quotes and backslashes removed.
|
||||||
|
#
|
||||||
|
# In Bash we could simply go:
|
||||||
|
#
|
||||||
|
# readarray ARGS < <( xargs -n1 <<<"$var" ) &&
|
||||||
|
# set -- "${ARGS[@]}" "$@"
|
||||||
|
#
|
||||||
|
# but POSIX shell has neither arrays nor command substitution, so instead we
|
||||||
|
# post-process each arg (as a line of input to sed) to backslash-escape any
|
||||||
|
# character that might be a shell metacharacter, then use eval to reverse
|
||||||
|
# that process (while maintaining the separation between arguments), and wrap
|
||||||
|
# the whole thing up as a single "set" statement.
|
||||||
|
#
|
||||||
|
# This will of course break if any of these variables contains a newline or
|
||||||
|
# an unmatched quote.
|
||||||
|
#
|
||||||
|
|
||||||
|
eval "set -- $(
|
||||||
|
printf '%s\n' "$DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS" |
|
||||||
|
xargs -n1 |
|
||||||
|
sed ' s~[^-[:alnum:]+,./:=@_]~\\&~g; ' |
|
||||||
|
tr '\n' ' '
|
||||||
|
)" '"$@"'
|
||||||
|
|
||||||
|
exec "$JAVACMD" "$@"
|
||||||
@@ -0,0 +1,89 @@
|
|||||||
|
@rem
|
||||||
|
@rem Copyright 2015 the original author or authors.
|
||||||
|
@rem
|
||||||
|
@rem Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
@rem you may not use this file except in compliance with the License.
|
||||||
|
@rem You may obtain a copy of the License at
|
||||||
|
@rem
|
||||||
|
@rem https://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
@rem
|
||||||
|
@rem Unless required by applicable law or agreed to in writing, software
|
||||||
|
@rem distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
@rem See the License for the specific language governing permissions and
|
||||||
|
@rem limitations under the License.
|
||||||
|
@rem
|
||||||
|
|
||||||
|
@if "%DEBUG%" == "" @echo off
|
||||||
|
@rem ##########################################################################
|
||||||
|
@rem
|
||||||
|
@rem Gradle startup script for Windows
|
||||||
|
@rem
|
||||||
|
@rem ##########################################################################
|
||||||
|
|
||||||
|
@rem Set local scope for the variables with windows NT shell
|
||||||
|
if "%OS%"=="Windows_NT" setlocal
|
||||||
|
|
||||||
|
set DIRNAME=%~dp0
|
||||||
|
if "%DIRNAME%" == "" set DIRNAME=.
|
||||||
|
set APP_BASE_NAME=%~n0
|
||||||
|
set APP_HOME=%DIRNAME%
|
||||||
|
|
||||||
|
@rem Resolve any "." and ".." in APP_HOME to make it shorter.
|
||||||
|
for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi
|
||||||
|
|
||||||
|
@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
|
||||||
|
set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m"
|
||||||
|
|
||||||
|
@rem Find java.exe
|
||||||
|
if defined JAVA_HOME goto findJavaFromJavaHome
|
||||||
|
|
||||||
|
set JAVA_EXE=java.exe
|
||||||
|
%JAVA_EXE% -version >NUL 2>&1
|
||||||
|
if "%ERRORLEVEL%" == "0" goto execute
|
||||||
|
|
||||||
|
echo.
|
||||||
|
echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
|
||||||
|
echo.
|
||||||
|
echo Please set the JAVA_HOME variable in your environment to match the
|
||||||
|
echo location of your Java installation.
|
||||||
|
|
||||||
|
goto fail
|
||||||
|
|
||||||
|
:findJavaFromJavaHome
|
||||||
|
set JAVA_HOME=%JAVA_HOME:"=%
|
||||||
|
set JAVA_EXE=%JAVA_HOME%/bin/java.exe
|
||||||
|
|
||||||
|
if exist "%JAVA_EXE%" goto execute
|
||||||
|
|
||||||
|
echo.
|
||||||
|
echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
|
||||||
|
echo.
|
||||||
|
echo Please set the JAVA_HOME variable in your environment to match the
|
||||||
|
echo location of your Java installation.
|
||||||
|
|
||||||
|
goto fail
|
||||||
|
|
||||||
|
:execute
|
||||||
|
@rem Setup the command line
|
||||||
|
|
||||||
|
set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
|
||||||
|
|
||||||
|
|
||||||
|
@rem Execute Gradle
|
||||||
|
"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %*
|
||||||
|
|
||||||
|
:end
|
||||||
|
@rem End local scope for the variables with windows NT shell
|
||||||
|
if "%ERRORLEVEL%"=="0" goto mainEnd
|
||||||
|
|
||||||
|
:fail
|
||||||
|
rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
|
||||||
|
rem the _cmd.exe /c_ return code!
|
||||||
|
if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1
|
||||||
|
exit /b 1
|
||||||
|
|
||||||
|
:mainEnd
|
||||||
|
if "%OS%"=="Windows_NT" endlocal
|
||||||
|
|
||||||
|
:omega
|
||||||
@@ -0,0 +1,16 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<project xmlns="http://maven.apache.org/POM/4.0.0"
|
||||||
|
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||||
|
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
||||||
|
<modelVersion>4.0.0</modelVersion>
|
||||||
|
<groupId>org.example</groupId>
|
||||||
|
<artifactId>simple-ployglot</artifactId>
|
||||||
|
<version>1.0-SNAPSHOT</version>
|
||||||
|
|
||||||
|
<properties>
|
||||||
|
<maven.compiler.source>17</maven.compiler.source>
|
||||||
|
<maven.compiler.target>17</maven.compiler.target>
|
||||||
|
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
|
||||||
|
</properties>
|
||||||
|
|
||||||
|
</project>
|
||||||
@@ -0,0 +1,2 @@
|
|||||||
|
rootProject.name = "simple-polyglot"
|
||||||
|
|
||||||
@@ -0,0 +1,10 @@
|
|||||||
|
package org.example;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author Fabian Krüger
|
||||||
|
*/
|
||||||
|
public class Main {
|
||||||
|
public static void main(String[] args) {
|
||||||
|
System.out.println("Hello world!");
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,20 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<project xmlns="http://maven.apache.org/POM/4.0.0"
|
||||||
|
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||||
|
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
||||||
|
<modelVersion>4.0.0</modelVersion>
|
||||||
|
<parent>
|
||||||
|
<groupId>org.springframework.rewrite</groupId>
|
||||||
|
<artifactId>spring-rewrite-commons-plugin-invoker</artifactId>
|
||||||
|
<version>0.1.0-SNAPSHOT</version>
|
||||||
|
</parent>
|
||||||
|
|
||||||
|
<artifactId>spring-rewrite-commons-plugin-invoker-shared</artifactId>
|
||||||
|
|
||||||
|
<properties>
|
||||||
|
<maven.compiler.source>17</maven.compiler.source>
|
||||||
|
<maven.compiler.target>17</maven.compiler.target>
|
||||||
|
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
|
||||||
|
</properties>
|
||||||
|
|
||||||
|
</project>
|
||||||
@@ -13,7 +13,7 @@
|
|||||||
* See the License for the specific language governing permissions and
|
* See the License for the specific language governing permissions and
|
||||||
* limitations under the License.
|
* limitations under the License.
|
||||||
*/
|
*/
|
||||||
package org.springframework.rewrite.maven;
|
package org.springframework.rewrite.plugin.shared;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @author Fabian Krüger
|
* @author Fabian Krüger
|
||||||
@@ -46,7 +46,11 @@ public class BuildConfig {
|
|||||||
return new Builder();
|
return new Builder();
|
||||||
}
|
}
|
||||||
|
|
||||||
boolean isSkipTests() {
|
public static BuildConfig fromDefault() {
|
||||||
|
return new BuildConfig(true, MemorySettings.noop());
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean isSkipTests() {
|
||||||
return skipTests;
|
return skipTests;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -54,11 +58,15 @@ public class BuildConfig {
|
|||||||
return memorySettings;
|
return memorySettings;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public boolean hasMemorySettings() {
|
||||||
|
return memorySettings != null && memorySettings.getMin() != null;
|
||||||
|
}
|
||||||
|
|
||||||
public static class Builder {
|
public static class Builder {
|
||||||
|
|
||||||
private boolean skipTests;
|
private boolean skipTests;
|
||||||
|
|
||||||
private MemorySettings memorySettings = MemorySettings.of("31M", "256M");
|
private MemorySettings memorySettings = MemorySettings.of("256M", "1024M");
|
||||||
|
|
||||||
public Builder skipTests(boolean b) {
|
public Builder skipTests(boolean b) {
|
||||||
this.skipTests = b;
|
this.skipTests = b;
|
||||||
@@ -13,24 +13,13 @@
|
|||||||
* See the License for the specific language governing permissions and
|
* See the License for the specific language governing permissions and
|
||||||
* limitations under the License.
|
* limitations under the License.
|
||||||
*/
|
*/
|
||||||
package org.springframework.rewrite.maven;
|
package org.springframework.rewrite.plugin.shared;
|
||||||
|
|
||||||
import org.apache.maven.shared.invoker.*;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @author Fabian Krüger
|
* @author Fabian Krüger
|
||||||
*/
|
*/
|
||||||
public class MavenInvoker {
|
public enum BuildTool {
|
||||||
|
|
||||||
private Invoker invoker = new DefaultInvoker();
|
GRADLE, MAVEN
|
||||||
|
|
||||||
public InvocationResult invoke(InvocationRequest request) {
|
|
||||||
try {
|
|
||||||
return invoker.execute(request);
|
|
||||||
}
|
|
||||||
catch (MavenInvocationException e) {
|
|
||||||
throw new RuntimeException(e);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -13,7 +13,7 @@
|
|||||||
* See the License for the specific language governing permissions and
|
* See the License for the specific language governing permissions and
|
||||||
* limitations under the License.
|
* limitations under the License.
|
||||||
*/
|
*/
|
||||||
package org.springframework.rewrite.maven;
|
package org.springframework.rewrite.plugin.shared;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @author Fabian Krüger
|
* @author Fabian Krüger
|
||||||
@@ -48,7 +48,11 @@ public class DebugConfig {
|
|||||||
return port;
|
return port;
|
||||||
}
|
}
|
||||||
|
|
||||||
public char isSuspend() {
|
public boolean isSuspend() {
|
||||||
|
return suspend;
|
||||||
|
}
|
||||||
|
|
||||||
|
public char isSuspendEnabled() {
|
||||||
return suspend ? 'y' : 'n';
|
return suspend ? 'y' : 'n';
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -13,7 +13,7 @@
|
|||||||
* See the License for the specific language governing permissions and
|
* See the License for the specific language governing permissions and
|
||||||
* limitations under the License.
|
* limitations under the License.
|
||||||
*/
|
*/
|
||||||
package org.springframework.rewrite.maven;
|
package org.springframework.rewrite.plugin.shared;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @author Fabian Krüger
|
* @author Fabian Krüger
|
||||||
@@ -33,6 +33,10 @@ public class MemorySettings {
|
|||||||
return new MemorySettings(min, max);
|
return new MemorySettings(min, max);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static MemorySettings noop() {
|
||||||
|
return new MemorySettings(null, null);
|
||||||
|
}
|
||||||
|
|
||||||
public String getMin() {
|
public String getMin() {
|
||||||
return min;
|
return min;
|
||||||
}
|
}
|
||||||
@@ -13,24 +13,10 @@
|
|||||||
* See the License for the specific language governing permissions and
|
* See the License for the specific language governing permissions and
|
||||||
* limitations under the License.
|
* limitations under the License.
|
||||||
*/
|
*/
|
||||||
package org.springframework.rewrite.maven;
|
package org.springframework.rewrite.plugin.shared;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @author Fabian Krüger
|
* @author Fabian Krüger
|
||||||
*/
|
*/
|
||||||
public enum RewritePluginGoals {
|
public record PluginInvocationResult(boolean success, String capturedOutput) {
|
||||||
|
|
||||||
RUN("run"), RUN_NO_FORK("runNoFork"), DRY_RUN("dryRun"), DRY_RUN_NO_FORK("dryRunNoFork"), DISCOVER("discover"),
|
|
||||||
CYCLONEDX("cyclonedx");
|
|
||||||
|
|
||||||
private final String goalName;
|
|
||||||
|
|
||||||
RewritePluginGoals(String goalName) {
|
|
||||||
this.goalName = goalName;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getGoalName() {
|
|
||||||
return goalName;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -0,0 +1,44 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2021 - 2023 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.rewrite.plugin.shared;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author Fabian Krüger
|
||||||
|
*/
|
||||||
|
public enum RewritePluginGoals {
|
||||||
|
|
||||||
|
RUN("run", "rewriteRun"), RUN_NO_FORK("runNoFork", "rewriteRun"), DRY_RUN("dryRun", "rewriteDryRun"),
|
||||||
|
DRY_RUN_NO_FORK("dryRunNoFork", "rewriteDryRun"), DISCOVER("discover", "rewriteDiscover"),
|
||||||
|
CYCLONEDX("cyclonedx", null);
|
||||||
|
|
||||||
|
private final String maven;
|
||||||
|
|
||||||
|
private final String gradle;
|
||||||
|
|
||||||
|
RewritePluginGoals(String maven, String gradle) {
|
||||||
|
this.maven = maven;
|
||||||
|
this.gradle = gradle;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getMaven() {
|
||||||
|
return maven;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getGradle() {
|
||||||
|
return gradle;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user