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

org.apache.maven.plugins.help.AbstractHelpMojo Maven / Gradle / Ivy

/*
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you 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
 *
 *   http://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.apache.maven.plugins.help;

import java.io.File;
import java.io.IOException;
import java.io.Writer;
import java.nio.file.Files;

import org.apache.maven.artifact.Artifact;
import org.apache.maven.execution.MavenSession;
import org.apache.maven.model.building.ModelBuildingRequest;
import org.apache.maven.plugin.AbstractMojo;
import org.apache.maven.plugin.MojoExecutionException;
import org.apache.maven.plugins.annotations.Component;
import org.apache.maven.plugins.annotations.Parameter;
import org.apache.maven.project.DefaultProjectBuildingRequest;
import org.apache.maven.project.MavenProject;
import org.apache.maven.project.ProjectBuilder;
import org.apache.maven.project.ProjectBuildingRequest;
import org.eclipse.aether.RepositoryException;
import org.eclipse.aether.RepositorySystem;
import org.eclipse.aether.RepositorySystemSession;
import org.eclipse.aether.artifact.DefaultArtifact;
import org.eclipse.aether.resolution.ArtifactDescriptorRequest;
import org.eclipse.aether.resolution.ArtifactDescriptorResult;
import org.eclipse.aether.resolution.ArtifactRequest;

/**
 * Base class with some Help Mojo functionalities.
 *
 * @author Vincent Siveton
 * @since 2.1
 */
public abstract class AbstractHelpMojo extends AbstractMojo {
    /** The maximum length of a display line. */
    protected static final int LINE_LENGTH = 79;

    /** The line separator for the current OS. */
    protected static final String LS = System.getProperty("line.separator");

    /**
     * Maven Project Builder component.
     */
    @Component
    protected ProjectBuilder projectBuilder;

    /**
     * Component used to resolve artifacts and download their files from remote repositories.
     */
    @Component
    protected RepositorySystem repositorySystem;

    /**
     * Current Maven project.
     */
    @Parameter(defaultValue = "${project}", readonly = true, required = true)
    protected MavenProject project;

    /**
     * The current build session instance. This is used for
     * plugin manager API calls.
     */
    @Parameter(defaultValue = "${session}", readonly = true, required = true)
    protected MavenSession session;

    /**
     * Optional parameter to write the output of this help to a given file using UTF-8 encoding,
     * instead of writing to the console.
     * 
* Note: Could be a relative path. */ @Parameter(property = "output") protected File output; /** * Utility method to write a content to a given file. * * @param output is the wanted output file. * @param content contains the content to be written to the file. * @throws IOException if any * @see #writeFile(File, String) */ protected static void writeFile(File output, StringBuilder content) throws IOException { writeFile(output, content.toString()); } /** * Utility method to write a content to a given file. * * @param output is the wanted output file. * @param content contains the content to be written to the file. * @throws IOException if any */ protected static void writeFile(File output, String content) throws IOException { if (output == null) { return; } output.getParentFile().mkdirs(); try (Writer out = Files.newBufferedWriter(output.toPath())) { out.write(content); } } /** * Parses the given String into GAV artifact coordinate information, adding the given type. * * @param artifactString should respect the format groupId:artifactId[:version] * @param type The extension for the artifact, must not be null. * @return the Artifact object for the artifactString parameter. * @throws MojoExecutionException if the artifactString doesn't respect the format. */ protected org.eclipse.aether.artifact.Artifact getAetherArtifact(String artifactString, String type) throws MojoExecutionException { if (artifactString == null || artifactString.isEmpty()) { throw new IllegalArgumentException("artifact parameter could not be empty"); } String groupId; // required String artifactId; // required String version; // optional String[] artifactParts = artifactString.split(":"); switch (artifactParts.length) { case 2: groupId = artifactParts[0]; artifactId = artifactParts[1]; version = Artifact.LATEST_VERSION; break; case 3: groupId = artifactParts[0]; artifactId = artifactParts[1]; version = artifactParts[2]; break; default: throw new MojoExecutionException("The artifact parameter '" + artifactString + "' should be conform to: " + "'groupId:artifactId[:version]'."); } return new DefaultArtifact(groupId, artifactId, type, version); } /** * Retrieves the Maven Project associated with the given artifact String, in the form of * groupId:artifactId[:version]. This resolves the POM artifact at those coordinates and then builds * the Maven project from it. * * @param artifactString Coordinates of the Maven project to get. * @return New Maven project. * @throws MojoExecutionException If there was an error while getting the Maven project. */ protected MavenProject getMavenProject(String artifactString) throws MojoExecutionException { try { ProjectBuildingRequest pbr = new DefaultProjectBuildingRequest(session.getProjectBuildingRequest()); pbr.setRemoteRepositories(project.getRemoteArtifactRepositories()); pbr.setPluginArtifactRepositories(project.getPluginArtifactRepositories()); pbr.setProject(null); pbr.setValidationLevel(ModelBuildingRequest.VALIDATION_LEVEL_MINIMAL); pbr.setResolveDependencies(true); org.eclipse.aether.artifact.Artifact artifact = resolveArtifact(getAetherArtifact(artifactString, "pom")).getArtifact(); return projectBuilder.build(artifact.getFile(), pbr).getProject(); } catch (Exception e) { throw new MojoExecutionException( "Unable to get the POM for the artifact '" + artifactString + "'. Verify the artifact parameter.", e); } } protected org.eclipse.aether.resolution.ArtifactResult resolveArtifact( org.eclipse.aether.artifact.Artifact artifact) throws RepositoryException { RepositorySystemSession repositorySession = session.getRepositorySession(); // use descriptor to respect relocation ArtifactDescriptorResult artifactDescriptor = repositorySystem.readArtifactDescriptor( repositorySession, new ArtifactDescriptorRequest(artifact, project.getRemoteProjectRepositories(), null)); return repositorySystem.resolveArtifact( repositorySession, new ArtifactRequest(artifactDescriptor.getArtifact(), project.getRemoteProjectRepositories(), null)); } }




© 2015 - 2024 Weber Informatics LLC | Privacy Policy