
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