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

org.codehaus.plexus.builder.application.DefaultApplicationBuilder Maven / Gradle / Ivy

The newest version!
package org.codehaus.plexus.builder.application;

/*
 * Copyright (c) 2004, Codehaus.org
 *
 * Permission is hereby granted, free of charge, to any person obtaining a copy of
 * this software and associated documentation files (the "Software"), to deal in
 * the Software without restriction, including without limitation the rights to
 * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
 * of the Software, and to permit persons to whom the Software is furnished to do
 * so, subject to the following conditions:
 *
 * The above copyright notice and this permission notice shall be included in all
 * copies or substantial portions of the Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
 * SOFTWARE.
 */

import java.io.File;
import java.io.FileInputStream;
import java.io.FileWriter;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Properties;
import java.util.Set;

import org.apache.maven.artifact.Artifact;
import org.apache.maven.artifact.repository.ArtifactRepository;
import org.apache.maven.artifact.resolver.ArtifactResolutionException;
import org.apache.maven.artifact.resolver.filter.ArtifactFilter;

import org.codehaus.plexus.application.PlexusApplicationConstants;
import org.codehaus.plexus.archiver.Archiver;
import org.codehaus.plexus.archiver.jar.JarArchiver;
import org.codehaus.plexus.builder.AbstractBuilder;
import org.codehaus.plexus.util.DirectoryScanner;
import org.codehaus.plexus.util.xml.PrettyPrintXMLWriter;
import org.codehaus.plexus.util.xml.XMLWriter;

/**
 * @author Jason van Zyl
 * @author Trygve Laugstøl
 * @version $Id: DefaultApplicationBuilder.java 2068 2005-06-03 13:46:41Z trygvis $
 */
public class DefaultApplicationBuilder
    extends AbstractBuilder
    implements ApplicationBuilder
{
    // ----------------------------------------------------------------------
    // ApplicationBuilder Implementation
    // ----------------------------------------------------------------------

    public void assemble( String applicationName,
                          File workingDirectory,
                          List remoteRepositories,
                          ArtifactRepository localRepository,
                          Set projectArtifacts,
                          Set serviceArtifacts,
                          File applicationConfiguration,
                          File configurationsDirectory,
                          File configurationPropertiesFile )
        throws ApplicationBuilderException
    {
        // ----------------------------------------------------------------------
        // Check the parameters
        // ----------------------------------------------------------------------

        if ( applicationName == null || applicationName.trim().length() == 0 )
        {
            throw new ApplicationBuilderException( "The application name must be set." );
        }

        if ( configurationPropertiesFile != null && !configurationPropertiesFile.isFile() )
        {
            throw new ApplicationBuilderException( "The configuration properties file isn't a file: '" + configurationPropertiesFile.getAbsolutePath() + "'." );
        }

        if ( configurationsDirectory != null && !configurationsDirectory.isDirectory() )
        {
            throw new ApplicationBuilderException( "The configurations directory isn't a directory: '" + configurationsDirectory.getAbsolutePath() + "." );
        }

        if ( !applicationConfiguration.exists() )
        {
            throw new ApplicationBuilderException( "The application configuration file doesn't exist: '" + applicationConfiguration.getAbsolutePath() + "'." );
        }

        File libDir;

        try
        {
            // ----------------------------------------------------------------------
            // Create directory structure
            // ----------------------------------------------------------------------

            File confDir = mkdirs( new File( workingDirectory, PlexusApplicationConstants.CONF_DIRECTORY ) );

            libDir = mkdirs( new File( workingDirectory, PlexusApplicationConstants.LIB_DIRECTORY ) );

            File logsDir = mkdirs( new File( workingDirectory, "logs" ) );

            mkdirs( new File( workingDirectory, "META-INF/plexus" ) );

            // ----------------------------------------------------------------------
            //
            // ----------------------------------------------------------------------

            new FileWriter( new File( logsDir, "foo" ) ).close();

            processConfigurations( confDir,
                                   applicationConfiguration,
                                   configurationPropertiesFile,
                                   configurationsDirectory );
        }
        catch ( IOException e )
        {
            throw new ApplicationBuilderException( "Error while processing the configurations.", e );
        }

        // ----------------------------------------------------------------------
        // Find and filter the artifacts
        // ----------------------------------------------------------------------

        Set artifacts;

        try
        {
            Set excludedArtifacts = new HashSet();

            excludedArtifacts.addAll( getBootArtifacts( projectArtifacts, remoteRepositories, localRepository, true ) );

            excludedArtifacts.addAll( getCoreArtifacts( projectArtifacts, remoteRepositories, localRepository, true ) );

            serviceArtifacts = findArtifacts( remoteRepositories, localRepository, serviceArtifacts, true, null );

            excludedArtifacts.addAll( serviceArtifacts );

            excludedArtifacts.addAll( getExcludedArtifacts( projectArtifacts, remoteRepositories, localRepository ) );

            ArtifactFilter filter = new AndArtifactFilter(
                new ScopeExcludeArtifactFilter( Artifact.SCOPE_TEST ),
                new GroupArtifactTypeArtifactFilter( excludedArtifacts ) );

            artifacts = findArtifacts( remoteRepositories, localRepository, projectArtifacts, true, filter );
        }
        catch ( ArtifactResolutionException e )
        {
            throw new ApplicationBuilderException( "Error while finding dependencies.", e );
        }

        // ----------------------------------------------------------------------
        // Copy the dependencies
        // ----------------------------------------------------------------------

        try
        {
            copyArtifacts( workingDirectory, libDir, artifacts );
        }
        catch ( IOException e )
        {
            throw new ApplicationBuilderException( "Error while copying dependencies.", e );
        }

        // ----------------------------------------------------------------------
        // Make the generated plexus descriptor
        // ----------------------------------------------------------------------

        try
        {
            File descriptor = new File( workingDirectory, PlexusApplicationConstants.METADATA_FILE );

            FileWriter writer = new FileWriter( descriptor );

            XMLWriter xmlWriter = new PrettyPrintXMLWriter( writer );

            writer.write( System.getProperty( "line.separator" ) );

            xmlWriter.startElement( "plexus-application" );

            xmlWriter.startElement( "name" );

            xmlWriter.writeText( applicationName );

            xmlWriter.endElement(); // name

            // TODO: Add a list of all artifacts

            xmlWriter.endElement(); // plexus-application

            writer.write( System.getProperty( "line.separator" ) );

            writer.close();
        }
        catch ( IOException e )
        {
            throw new ApplicationBuilderException( "Error while writing the application descriptor.", e );
        }
    }

    public void bundle( File outputFile, File workingDirectory )
        throws ApplicationBuilderException
    {
        Archiver archiver = new JarArchiver();

        try
        {
            archiver.addDirectory( workingDirectory );

            archiver.setDestFile( outputFile );

            archiver.createArchive();
        }
        catch ( Exception e )
        {
            throw new ApplicationBuilderException( "Error while creating the application archive.", e );
        }
    }

    // ----------------------------------------------------------------------
    //
    // ----------------------------------------------------------------------

    private void processConfigurations( File confDir,
                                        File applicationConfiguration,
                                        File configurationPropertiesFile,
                                        File configurationsDirectory )
        throws IOException, ApplicationBuilderException
    {
        // ----------------------------------------------------------------------
        // Load the configuration properties.
        // ----------------------------------------------------------------------

        Properties configurationProperties = new Properties();

        if ( configurationPropertiesFile != null )
        {
            configurationProperties.load( new FileInputStream( configurationPropertiesFile ) );
        }

        // ----------------------------------------------------------------------
        // Process the configurations
        // ----------------------------------------------------------------------

        if ( configurationsDirectory != null )
        {
            DirectoryScanner scanner = new DirectoryScanner();

            scanner.setBasedir( configurationsDirectory );

            List excludes = new ArrayList();

            // TODO: centralize this list
            excludes.add( "**/CVS/**" );

            excludes.add( "**/.svn/**" );

            if ( configurationPropertiesFile != null )
            {
                excludes.add( configurationPropertiesFile.getAbsolutePath() );
            }

            scanner.setExcludes( (String[]) excludes.toArray( new String[ excludes.size() ] ) );

            scanner.scan();

            String[] files = scanner.getIncludedFiles();

            for ( int i = 0; i < files.length; i++ )
            {
                String file = files[i];

                File in = new File( configurationsDirectory, file );

                File out = new File( confDir, file );

                File parent = out.getParentFile();

                if ( !parent.isDirectory() && !parent.mkdirs() )
                {
                    throw new ApplicationBuilderException( "Could not make parent directories for " +
                                                           "'" + out.getAbsolutePath() + "'." );
                }

                filterCopy( in, out, configurationProperties );
            }
        }

        // ----------------------------------------------------------------------
        // Copy the main application.xml
        // ----------------------------------------------------------------------

        filterCopy( applicationConfiguration,
                    new File( confDir, PlexusApplicationConstants.CONFIGURATION_FILE ),
                    configurationProperties );
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy