Package org.andromda.maven.plugin.cartridge

Source Code of org.andromda.maven.plugin.cartridge.CartridgeArchiverMojo

package org.andromda.maven.plugin.cartridge;

import java.io.File;
import java.util.Collection;
import java.util.Iterator;

import org.apache.commons.lang.StringUtils;
import org.apache.maven.archiver.MavenArchiveConfiguration;
import org.apache.maven.archiver.MavenArchiver;
import org.apache.maven.artifact.Artifact;
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.plexus.archiver.jar.JarArchiver;
import org.codehaus.plexus.util.FileUtils;


/**
* Provides the archiving of AndroMDA cartridges.
*
* @author Chad Brandon
* @goal andromda-cartridge
* @phase package
* @requiresProject
* @description builds an AndroMDA cartridge.
*/
public class CartridgeArchiverMojo
    extends AbstractMojo
{
    /**
     * Directory that resources are copied to during the build.
     *
     * @parameter expression="${project.build.directory}"
     * @required
     */
    private String workDirectory;

    /**
     * The directory for the generated cartridge.
     *
     * @parameter expression="${project.build.outputDirectory}"
     * @required
     */
    private String outputDirectory;

    /**
     * The name of the cartridge file to generate.
     *
     * @parameter alias="modelName" expression="${project.build.finalName}"
     * @required
     * @readonly
     */
    private String finalName;

    /**
     * The maven project.
     *
     * @parameter expression="${project}"
     * @required
     * @readonly
     * @description "the maven project to use"
     */
    private MavenProject project;

    /**
     * The Jar archiver.
     *
     * @parameter expression="${component.org.codehaus.plexus.archiver.Archiver#jar}"
     * @required
     */
    private JarArchiver jarArchiver;

    /**
     * The maven archiver to use.
     *
     * @parameter
     */
    private MavenArchiveConfiguration archive = new MavenArchiveConfiguration();

    /**
     * The libraries to include in the cartridge.
     *
     * @parameter
     */
    private CartridgeArtifact[] artifacts;

    /**
     *  The patterns indicating what will be included in the cartridge.
     */
    private static final String[] OUTPUT_INCLUDES = new String[] {"**/*"};

    /**
     * @see org.apache.maven.plugin.Mojo#execute()
     */
    public void execute()
        throws MojoExecutionException, MojoFailureException
    {
        getLog().debug(" ======= CartridgeArchiverMojo settings =======");
        getLog().debug("workDirectory[" + this.workDirectory + "]");
        getLog().debug("outputDirectory[" + this.outputDirectory + "]");
        getLog().debug("finalName[" + finalName + "]");
        final File buildDirectory = this.getBuildDirectory();
        final File outputDirectory = new File(this.outputDirectory);
        try
        {
            if (artifacts != null)
            {
                for (int ctr = 0; ctr < artifacts.length; ctr++)
                {
                    final CartridgeArtifact cartridgeArtifact = artifacts[ctr];
                    final Artifact artifact = this.resolveArtifact(cartridgeArtifact);
                    if (artifact != null)
                    {
                        final String path = cartridgeArtifact.getPath();
                        if (path == null || path.trim().length() == 0)
                        {
                            throw new MojoFailureException("Please specify the 'path' for the cartridge artifact [" +
                                cartridgeArtifact.getGroupId() + ":" + cartridgeArtifact.getArtifactId() + ":" +
                                cartridgeArtifact.getType() + "]");
                        }

                        final File destinationDirectory = new File(outputDirectory,
                                cartridgeArtifact.getPath());
                        final File artifactFile = artifact.getFile();
                        final String artifactPath =
                            artifactFile != null
                            ? StringUtils.replace(
                                artifact.getFile().toString().replaceAll(
                                    ".*(\\\\|/)",
                                    ""),
                                '-' + artifact.getVersion(),
                                "") : null;
                        if (artifactPath != null)
                        {
                            FileUtils.copyFile(
                                artifactFile,
                                new File(
                                    destinationDirectory,
                                    artifactPath));
                        }
                    }
                }
            }
            final File cartridgeFile = new File(buildDirectory, this.finalName + ".jar");
            final Artifact artifact = this.project.getArtifact();
            final MavenArchiver archiver = new MavenArchiver();
            archiver.setArchiver(this.jarArchiver);
            archiver.setOutputFile(cartridgeFile);
            archiver.getArchiver().addDirectory(
                outputDirectory,
                OUTPUT_INCLUDES,
                null);
            archiver.createArchive(
                this.project,
                this.archive);
            artifact.setFile(cartridgeFile);
        }
        catch (final Throwable throwable)
        {
            throw new MojoExecutionException("An error occured while packaging this cartridge", throwable);
        }
    }

    /**
     * Resolves the actual Maven artifact for the given cartridge artifact.
     * @param cartridgeArtifact the cartridge artifact.
     * @return
     * @throws MojoFailureException
     */
    public Artifact resolveArtifact(final CartridgeArtifact cartridgeArtifact)
        throws MojoFailureException
    {
        Artifact resolvedArtifact = null;
        if (cartridgeArtifact != null)
        {
            final Collection artifacts = this.project.getArtifacts();
            final String groupId = cartridgeArtifact.getGroupId();
            final String artifactId = cartridgeArtifact.getArtifactId();
            final String type = cartridgeArtifact.getType();
            if (groupId == null || artifactId == null)
            {
                throw new MojoFailureException("Could not resolve cartridge artifact [" + groupId + ":" + artifactId +
                    ":" + type + "]");
            }

            for (final Iterator iterator = artifacts.iterator(); iterator.hasNext();)
            {
                final Artifact artifact = (Artifact)iterator.next();
                if (artifact.getGroupId().equals(groupId) && artifact.getArtifactId().equals(artifactId) &&
                    (type == null || artifact.getType().equals(type)))
                {
                    resolvedArtifact = artifact;
                    break;
                }
            }

            if (resolvedArtifact == null)
            {
                // Artifact has not been found
                throw new MojoFailureException("Artifact[" + groupId + ":" + artifactId + ":" + type + "] " +
                    "is not a dependency of the project.");
            }
            return resolvedArtifact;
        }
        return resolvedArtifact;
    }

    /**
     * The build directory.
     */
    private File buildDirectory;

    /**
     * Gets the current build directory as a file instance.
     *
     * @return the build directory as a file.
     */
    protected File getBuildDirectory()
    {
        if (this.buildDirectory == null)
        {
            this.buildDirectory = new File(workDirectory);
        }
        return this.buildDirectory;
    }
}
TOP

Related Classes of org.andromda.maven.plugin.cartridge.CartridgeArchiverMojo

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.