package org.codehaus.mojo.appassembler;
/*
* The MIT License
*
* Copyright 2005-2007 The Codehaus.
*
* 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 org.apache.maven.artifact.repository.ArtifactRepository;
import org.apache.maven.artifact.repository.layout.ArtifactRepositoryLayout;
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.mojo.appassembler.daemon.DaemonGenerationRequest;
import org.codehaus.mojo.appassembler.daemon.DaemonGeneratorException;
import org.codehaus.mojo.appassembler.daemon.DaemonGeneratorService;
import org.codehaus.plexus.util.StringUtils;
import java.io.File;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;
/**
* Generates JSW based daemon wrappers.
*
* @author <a href="mailto:trygvis@inamo.no">Trygve Laugstøl</a>
* @version $Id$
* @goal generate-daemons
* @requiresDependencyResolution runtime
* @phase package
*/
public class GenerateDaemonsMojo
extends AbstractMojo
{
// -----------------------------------------------------------------------
// Parameters
// -----------------------------------------------------------------------
/**
* Set of {@linkplain Daemon}s to generate.
* @parameter
* @required
*/
private Set daemons;
/**
* {@linkplain JvmSettings} describing min/max memory and stack size, system properties and extra arguments.
* @parameter
*/
private JvmSettings defaultJvmSettings;
/**
* The base directory of the project.
* @parameter expression="${basedir}"
* @required
*/
private File basedir;
/**
* Target directory for generated daemons.
* @parameter expression="${project.build.directory}/generated-resources/appassembler"
* @required
*/
private File target;
/**
* The maven project in question.
* @parameter expression="${project}"
* @required
* @readonly
*/
private MavenProject project;
/**
* The layout of the generated Maven repository. Supported types - "default" (Maven2) | "legacy" (Maven1) | "flat"
* (flat <code>lib/</code> style).
*
* @parameter default-value="default"
*/
private String repositoryLayout;
// -----------------------------------------------------------------------
// Read-only parameters
// -----------------------------------------------------------------------
/**
* @readonly
* @parameter expression="${localRepository}"
*/
private ArtifactRepository localRepository;
// -----------------------------------------------------------------------
// Components
// -----------------------------------------------------------------------
/**
* @component
*/
private DaemonGeneratorService daemonGeneratorService;
/**
* @component role="org.apache.maven.artifact.repository.layout.ArtifactRepositoryLayout"
*/
private Map availableRepositoryLayouts;
// -----------------------------------------------------------------------
// AbstractMojo Implementation
// -----------------------------------------------------------------------
public void execute()
throws MojoExecutionException, MojoFailureException
{
for ( Iterator it = daemons.iterator(); it.hasNext(); )
{
Daemon daemon = (Daemon) it.next();
// -----------------------------------------------------------------------
// Load the optional template daemon descriptor
// -----------------------------------------------------------------------
File descriptor = null;
if ( !StringUtils.isEmpty( daemon.getDescriptor() ) )
{
descriptor = new File( basedir, daemon.getDescriptor() );
}
// -----------------------------------------------------------------------
//
// -----------------------------------------------------------------------
org.codehaus.mojo.appassembler.model.JvmSettings modelJvmSettings = null;
if ( defaultJvmSettings != null )
{
modelJvmSettings = convertJvmSettings( defaultJvmSettings );
}
ArtifactRepositoryLayout artifactRepositoryLayout =
(ArtifactRepositoryLayout) availableRepositoryLayouts.get( repositoryLayout );
if ( artifactRepositoryLayout == null )
{
throw new MojoFailureException( "Unknown repository layout '" + repositoryLayout + "'." );
}
// -----------------------------------------------------------------------
// Create a daemon object from the POM configuration
// -----------------------------------------------------------------------
org.codehaus.mojo.appassembler.model.Daemon modelDaemon = convertDaemon( daemon, modelJvmSettings );
// -----------------------------------------------------------------------
//
// -----------------------------------------------------------------------
for ( Iterator i = daemon.getPlatforms().iterator(); i.hasNext(); )
{
String platform = (String) i.next();
File output = new File( target, platform );
DaemonGenerationRequest request = new DaemonGenerationRequest();
// TODO: split platform from generator (platform = operating systems, generator = jsw, booter, standard). Generator is a property of the daemon itself
request.setPlatform( platform );
request.setStubDescriptor( descriptor );
request.setStubDaemon( modelDaemon );
request.setOutputDirectory( output );
request.setMavenProject( project );
request.setLocalRepository( localRepository );
request.setRepositoryLayout( artifactRepositoryLayout );
try
{
daemonGeneratorService.generateDaemon( request );
}
catch ( DaemonGeneratorException e )
{
throw new MojoExecutionException( "Error while generating daemon.", e );
}
}
}
}
// TODO: see if it is possible to just inherit from the model daemon
private org.codehaus.mojo.appassembler.model.Daemon convertDaemon( Daemon daemon,
org.codehaus.mojo.appassembler.model.JvmSettings modelJvmSettings )
{
org.codehaus.mojo.appassembler.model.Daemon modelDaemon;
modelDaemon = new org.codehaus.mojo.appassembler.model.Daemon();
modelDaemon.setId( daemon.getId() );
modelDaemon.setMainClass( daemon.getMainClass() );
modelDaemon.setCommandLineArguments( daemon.getCommandLineArguments() );
modelDaemon.setShowConsoleWindow( daemon.isShowConsoleWindow() );
modelDaemon.setEnvironmentSetupFileName( daemon.getEnvironmentSetupFileName() );
if ( daemon.getJvmSettings() != null )
{
modelDaemon.setJvmSettings( convertJvmSettings( daemon.getJvmSettings() ) );
}
else
{
modelDaemon.setJvmSettings( modelJvmSettings );
}
if ( daemon.getGeneratorConfigurations() != null )
{
modelDaemon.setGeneratorConfigurations(
convertGeneratorConfigurations( daemon.getGeneratorConfigurations() ) );
}
return modelDaemon;
}
private List convertGeneratorConfigurations( List generatorConfigurations )
{
List value = new ArrayList( generatorConfigurations.size() );
for ( Iterator i = generatorConfigurations.iterator(); i.hasNext(); )
{
GeneratorConfiguration config = (GeneratorConfiguration) i.next();
value.add( convertGeneratorConfiguration( config ) );
}
return value;
}
private org.codehaus.mojo.appassembler.model.GeneratorConfiguration convertGeneratorConfiguration(
GeneratorConfiguration config )
{
org.codehaus.mojo.appassembler.model.GeneratorConfiguration value =
new org.codehaus.mojo.appassembler.model.GeneratorConfiguration();
value.setGenerator( config.getGenerator() );
value.setConfiguration( config.getConfiguration() );
value.setIncludes( config.getIncludes() );
return value;
}
// TODO: see if it is possible to just inherit from the model JVM Settings
private org.codehaus.mojo.appassembler.model.JvmSettings convertJvmSettings( JvmSettings jvmSettings )
{
org.codehaus.mojo.appassembler.model.JvmSettings modelJvmSettings =
new org.codehaus.mojo.appassembler.model.JvmSettings();
modelJvmSettings.setInitialMemorySize( jvmSettings.getInitialMemorySize() );
modelJvmSettings.setMaxMemorySize( jvmSettings.getMaxMemorySize() );
modelJvmSettings.setMaxStackSize( jvmSettings.getMaxStackSize() );
if ( jvmSettings.getSystemProperties() == null )
{
modelJvmSettings.setSystemProperties( new ArrayList() );
}
else
{
modelJvmSettings.setSystemProperties( Arrays.asList( jvmSettings.getSystemProperties() ) );
}
if ( jvmSettings.getExtraArguments() == null )
{
modelJvmSettings.setExtraArguments( new ArrayList() );
}
else
{
modelJvmSettings.setExtraArguments( Arrays.asList( jvmSettings.getExtraArguments() ) );
}
return modelJvmSettings;
}
public void setAvailableRepositoryLayouts( Map availableRepositoryLayouts )
{
this.availableRepositoryLayouts = availableRepositoryLayouts;
}
public void setDaemons( Set daemons )
{
this.daemons = daemons;
}
}