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

org.codehaus.gmaven.plugin.MojoSupport Maven / Gradle / Ivy

/*
 * Copyright (C) 2006-2007 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
 *
 *     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.codehaus.gmaven.plugin;

import org.apache.maven.artifact.Artifact;
import org.apache.maven.artifact.DependencyResolutionRequiredException;
import org.apache.maven.artifact.factory.ArtifactFactory;
import org.apache.maven.artifact.metadata.ArtifactMetadataSource;
import org.apache.maven.artifact.repository.ArtifactRepository;
import org.apache.maven.artifact.resolver.ArtifactNotFoundException;
import org.apache.maven.artifact.resolver.ArtifactResolutionException;
import org.apache.maven.artifact.resolver.ArtifactResolver;
import org.apache.maven.artifact.versioning.InvalidVersionSpecificationException;
import org.apache.maven.artifact.versioning.VersionRange;
import org.apache.maven.model.Dependency;
import org.apache.maven.plugin.AbstractMojo;
import org.apache.maven.plugin.MojoExecutionException;
import org.apache.maven.plugin.MojoFailureException;
import org.apache.maven.project.MavenProject;
import org.codehaus.gmaven.common.ArtifactItem;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.io.File;
import java.net.URL;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

/**
 * Support for Mojo implementations.
 *
 * @threadSafe
 *
 * @version $Id$
 * @author Jason Dillon
 */
public abstract class MojoSupport
    extends AbstractMojo
{
    protected final Logger log = LoggerFactory.getLogger(getClass());

    /**
     * @parameter expression="${project}"
     * @required
     * @readonly
     *
     * @noinspection UnusedDeclaration
     */
    protected MavenProject project;

    /**
     * Main Mojo execution hook.  Sub-class should use {@link #doExecute} instead.
     */
    public synchronized void execute() throws MojoExecutionException, MojoFailureException {
        try {
            doExecute();
        }
        catch (Exception e) {
            //
            // NOTE: Wrap to avoid truncating the stacktrace
            //

            if (e instanceof MojoExecutionException) {
                throw new MojoExecutionException(e.getMessage(), e);
            }
            else if (e instanceof MojoFailureException) {
                MojoFailureException x = new MojoFailureException(e.getMessage());
                x.initCause(e);
                throw x;
            }
            else {
                throw new MojoExecutionException(e.getMessage(), e);
            }
        }
    }

    protected abstract void doExecute() throws Exception;

    //
    // Classpath Muck
    //

    protected List getProjectClasspathElements() throws DependencyResolutionRequiredException {
        return Collections.EMPTY_LIST;
    }

    protected ArtifactItem[] getUserClassspathElements() {
        return new ArtifactItem[0];
    }

    protected URL[] createClassPath() throws Exception {
        List list = new ArrayList();

        // Add the projects dependencies
        List files = getProjectClasspathElements();
        if (files != null) {
            log.debug("Project Classpath:");

            for (int i = 0; i < files.size(); ++i) {
                URL url = new File((String)files.get(i)).toURI().toURL();
                list.add(url);
                log.debug("    {}", url);
            }
        }

        // Add user dependencies (if there are any)
        ArtifactItem[] items = getUserClassspathElements();

        if (items != null) {
            log.debug("User Classpath:");

            for (int i=0; i < items.length; i++) {
                Artifact artifact = getArtifact(items[i]);
                URL url = artifact.getFile().toURI().toURL();
                list.add(url);
                log.debug("    {}", url);
            }
        }

        return (URL[])list.toArray(new URL[list.size()]);
    }

    //
    // Artifact Muck
    //

    /**
     * @component
     * @readonly
     * @required
     *
     * @noinspection UnusedDeclaration
     */
    protected ArtifactFactory artifactFactory;

    /**
     * @component
     * @readonly
     * @required
     *
     * @noinspection UnusedDeclaration
     */
    protected ArtifactResolver artifactResolver;

    /**
     * @component
     * @readonly
     * @required
     *
     * @noinspection UnusedDeclaration
     */
    protected ArtifactMetadataSource artifactMetadataSource;

    /**
     * @parameter expression="${localRepository}"
     * @readonly
     * @required
     *
     * @noinspection UnusedDeclaration
     */
    protected ArtifactRepository artifactRepository;

    /**
     * @parameter expression="${project.pluginArtifactRepositories}"
     * @required
     * @readonly
     *
     * @noinspection UnusedDeclaration
     */
    protected List remoteRepositories;

    /**
     * Create a new artifact. If no version is specified, it will be retrieved from the dependency
     * list or from the DependencyManagement section of the pom.
     *
     * @param item  The item to create an artifact for
     * @return      An unresolved artifact for the given item.
     *
     * @throws MojoExecutionException   Failed to create artifact
     */
    protected Artifact createArtifact(final ArtifactItem item) throws MojoExecutionException {
        assert item != null;

        if (item.getVersion() == null) {
            fillMissingArtifactVersion(item);

            if (item.getVersion() == null) {
                throw new MojoExecutionException("Unable to find artifact version of " + item.getGroupId()
                    + ":" + item.getArtifactId() + " in either dependency list or in project's dependency management.");
            }
        }

        // Convert the string version to a range
        VersionRange range;
        try {
            range = VersionRange.createFromVersionSpec(item.getVersion());
            log.trace("Using version range: {}", range);
        }
        catch (InvalidVersionSpecificationException e) {
            throw new MojoExecutionException("Could not create range for version: " + item.getVersion(), e);
        }

        return artifactFactory.createDependencyArtifact(
            item.getGroupId(),
            item.getArtifactId(),
            range,
            item.getType(),
            item.getClassifier(),
            Artifact.SCOPE_PROVIDED);
    }

    /**
     * Resolves the Artifact from the remote repository if necessary. If no version is specified, it will
     * be retrieved from the dependency list or from the DependencyManagement section of the pom.
     *
     *
     * @param item  The item to create an artifact for; must not be null
     * @return      The artifact for the given item
     *
     * @throws MojoExecutionException   Failed to create artifact
     */
    protected Artifact getArtifact(final ArtifactItem item) throws MojoExecutionException {
        assert item != null;

        Artifact artifact = createArtifact(item);

        return resolveArtifact(artifact, false);
    }

    /**
     * Resolves the Artifact from the remote repository if necessary. If no version is specified, it will
     * be retrieved from the dependency list or from the DependencyManagement section of the pom.
     *
     * @param artifact      The artifact to be resolved; must not be null
     * @param transitive    True to resolve the artifact transitively
     * @return              The resolved artifact; never null
     *
     * @throws MojoExecutionException   Failed to resolve artifact
     */
    protected Artifact resolveArtifact(final Artifact artifact, final boolean transitive) throws MojoExecutionException {
        assert artifact != null;

        try {
            if (transitive) {
                artifactResolver.resolveTransitively(
                        Collections.singleton(artifact),
                        project.getArtifact(),
                        project.getRemoteArtifactRepositories(),
                        artifactRepository,
                        artifactMetadataSource);
            }
            else {
                artifactResolver.resolve(
                        artifact,
                        project.getRemoteArtifactRepositories(),
                        artifactRepository);
            }
        }
        catch (ArtifactResolutionException e) {
            throw new MojoExecutionException("Unable to resolve artifact", e);
        }
        catch (ArtifactNotFoundException e) {
            throw new MojoExecutionException("Unable to find artifact", e);
        }

        return artifact;
    }

    /**
     * Tries to find missing version from dependency list and dependency management.
     * If found, the artifact is updated with the correct version.
     *
     * @param item  The item to fill in missing version details into
     */
    private void fillMissingArtifactVersion(final ArtifactItem item) {
        log.trace("Attempting to find missing version in {}:{}", item.getGroupId() , item.getArtifactId());

        List list = project.getDependencies();

        for (int i = 0; i < list.size(); ++i) {
            Dependency dependency = (Dependency) list.get(i);

            if (dependency.getGroupId().equals(item.getGroupId())
                && dependency.getArtifactId().equals(item.getArtifactId())
                && dependency.getType().equals(item.getType()))
            {
                log.trace("Found missing version: {} in dependency list", dependency.getVersion());

                item.setVersion(dependency.getVersion());

                return;
            }
        }

        list = project.getDependencyManagement().getDependencies();

        for (int i = 0; i < list.size(); i++) {
            Dependency dependency = (Dependency) list.get(i);

            if (dependency.getGroupId().equals(item.getGroupId())
                && dependency.getArtifactId().equals(item.getArtifactId())
                && dependency.getType().equals(item.getType()))
            {
                log.trace("Found missing version: {} in dependency management list", dependency.getVersion());

                item.setVersion(dependency.getVersion());
            }
        }
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy