All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.openrewrite.maven.AbstractRewriteMojo Maven / Gradle / Ivy

/*
 * Copyright 2020 the original author or authors.
 * 

* Licensed under the Moderne Source Available License (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at *

* https://docs.moderne.io/licensing/moderne-source-available-license *

* 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.openrewrite.maven; import org.apache.maven.plugin.MojoExecutionException; import org.apache.maven.plugins.annotations.Parameter; import org.apache.maven.project.MavenProject; import org.apache.maven.rtinfo.RuntimeInformation; import org.apache.maven.settings.crypto.SettingsDecrypter; import org.eclipse.aether.RepositorySystem; import org.eclipse.aether.artifact.Artifact; import org.jspecify.annotations.Nullable; import org.openrewrite.ExecutionContext; import org.openrewrite.InMemoryExecutionContext; import org.openrewrite.config.ClasspathScanningLoader; import org.openrewrite.config.Environment; import org.openrewrite.config.YamlResourceLoader; import org.openrewrite.ipc.http.HttpSender; import org.openrewrite.ipc.http.HttpUrlConnectionSender; import javax.inject.Inject; import java.io.File; import java.io.IOException; import java.io.InputStream; import java.net.*; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; import java.util.*; @SuppressWarnings("NotNullFieldNotInitialized") public abstract class AbstractRewriteMojo extends ConfigurableRewriteMojo { @Parameter(defaultValue = "${project}", readonly = true, required = true) protected MavenProject project; @Parameter(property = "rewrite.resolvePropertiesInYaml", defaultValue = "true") protected boolean resolvePropertiesInYaml; @Inject protected RuntimeInformation runtime; @Inject protected SettingsDecrypter settingsDecrypter; @Inject protected RepositorySystem repositorySystem; protected Environment environment() throws MojoExecutionException { return environment(getRecipeArtifactCoordinatesClassloader()); } static class Config { final InputStream inputStream; final URI uri; Config(InputStream inputStream, URI uri) { this.inputStream = inputStream; this.uri = uri; } } @Nullable Config getConfig() throws IOException { try { URI uri = new URI(configLocation); if (uri.getScheme() != null && uri.getScheme().startsWith("http")) { HttpSender httpSender = new HttpUrlConnectionSender(); //noinspection resource return new Config(httpSender.get(configLocation).send().getBody(), uri); } } catch (URISyntaxException e) { // Try to load as a path } Path absoluteConfigLocation = Paths.get(configLocation); if (!absoluteConfigLocation.isAbsolute()) { absoluteConfigLocation = project.getBasedir().toPath().resolve(configLocation); } File rewriteConfig = absoluteConfigLocation.toFile(); if (rewriteConfig.exists()) { return new Config(Files.newInputStream(rewriteConfig.toPath()), rewriteConfig.toURI()); } else { getLog().debug("No rewrite configuration found at " + absoluteConfigLocation); } return null; } protected Environment environment(@Nullable ClassLoader recipeClassLoader) throws MojoExecutionException { Properties propertiesToResolve = resolvePropertiesInYaml ? project.getProperties() : new Properties(); Environment.Builder env = Environment.builder(propertiesToResolve); if (recipeClassLoader == null) { env.scanRuntimeClasspath() .scanUserHome(); } else { env.load(new ClasspathScanningLoader(propertiesToResolve, recipeClassLoader)); } try { Config rewriteConfig = getConfig(); if (rewriteConfig != null) { try (InputStream is = rewriteConfig.inputStream) { env.load(new YamlResourceLoader(is, rewriteConfig.uri, propertiesToResolve)); } } } catch (IOException e) { throw new MojoExecutionException("Unable to load rewrite configuration", e); } return env.build(); } protected ExecutionContext executionContext() { return new InMemoryExecutionContext(t -> getLog().debug(t)); } protected Path getBuildRoot() { Path localRepositoryFolder = Paths.get(mavenSession.getLocalRepository().getBasedir()).normalize(); Set baseFolders = new HashSet<>(); for (MavenProject project : mavenSession.getAllProjects()) { collectBasePaths(project, baseFolders, localRepositoryFolder); } if (!baseFolders.isEmpty()) { List sortedPaths = new ArrayList<>(baseFolders); Collections.sort(sortedPaths); return sortedPaths.get(0); } else { return Paths.get(mavenSession.getExecutionRootDirectory()); } } private void collectBasePaths(MavenProject project, Set paths, Path localRepository) { Path baseDir = project.getBasedir() == null ? null : project.getBasedir().toPath().normalize(); if (baseDir == null || baseDir.startsWith(localRepository) || paths.contains(baseDir)) { return; } paths.add(baseDir); MavenProject parent = project.getParent(); while (parent != null && parent.getBasedir() != null) { collectBasePaths(parent, paths, localRepository); parent = parent.getParent(); } } protected @Nullable URLClassLoader getRecipeArtifactCoordinatesClassloader() throws MojoExecutionException { if (getRecipeArtifactCoordinates().isEmpty()) { return null; } ArtifactResolver resolver = new ArtifactResolver(repositorySystem, mavenSession); Set artifacts = new HashSet<>(); for (String coordinate : getRecipeArtifactCoordinates()) { artifacts.add(resolver.createArtifact(coordinate)); } Set resolvedArtifacts = resolver.resolveArtifactsAndDependencies(artifacts); URL[] urls = resolvedArtifacts.stream() .map(Artifact::getFile) .map(File::toURI) .map(uri -> { try { return uri.toURL(); } catch (MalformedURLException e) { throw new RuntimeException("Failed to resolve artifacts from rewrite.recipeArtifactCoordinates", e); } }) .toArray(URL[]::new); return new URLClassLoader( urls, AbstractRewriteMojo.class.getClassLoader() ); } }





© 2015 - 2025 Weber Informatics LLC | Privacy Policy