@@ -8,10 +8,12 @@
package org.apache.myrmidon.frontends;
import java.io.BufferedReader;
import java.io.File;
import java.io.InputStreamReader;
import java.io.File;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.HashMap;
import org.apache.avalon.excalibur.cli.CLArgsParser;
import org.apache.avalon.excalibur.cli.CLOption;
import org.apache.avalon.excalibur.cli.CLOptionDescriptor;
@@ -20,15 +22,9 @@ import org.apache.avalon.excalibur.i18n.ResourceManager;
import org.apache.avalon.excalibur.i18n.Resources;
import org.apache.avalon.framework.CascadingException;
import org.apache.avalon.framework.ExceptionUtil;
import org.apache.avalon.framework.logger.AbstractLogEnabled;
import org.apache.avalon.framework.parameters.Parameters;
import org.apache.myrmidon.Constants;
import org.apache.myrmidon.api.TaskException;
import org.apache.myrmidon.interfaces.embeddor.Embeddor;
import org.apache.myrmidon.interfaces.executor.Executor;
import org.apache.myrmidon.interfaces.model.Project;
import org.apache.myrmidon.interfaces.workspace.Workspace;
import org.apache.myrmidon.listeners.ProjectListener;
/**
* The class to kick the tires and light the fires.
@@ -39,14 +35,10 @@ import org.apache.myrmidon.listeners.ProjectListener;
* @version $Revision$ $Date$
*/
public class CLIMain
extends AbstractLogEnabled
{
private final static Resources REZ =
ResourceManager.getPackageResources( CLIMain.class );
private static final String DEFAULT_EMBEDDOR_CLASS =
"org.apache.myrmidon.components.embeddor.DefaultEmbeddor";
//defines for the Command Line options
private final static int HELP_OPT = 'h';
private final static int QUIET_OPT = 'q';
@@ -84,23 +76,19 @@ public class CLIMain
LISTENER_OPT, NO_PREFIX_OPT
};
///Parameters for run of myrmidon
private Parameters m_parameters = new Parameters();
///List of targets supplied on command line to execute
private ArrayList m_targets = new ArrayList();
///List of user supplied defines
private Parameters m_defines = new Parameters();
///List of user supplied parameters for builder
private Parameters m_builderParameters = new Parameters();
///Determine whether tasks are actually executed
private boolean m_dryRun = false;
///Enables incremental mode
private boolean m_incremental;
///The launcher
private EmbeddedAnt m_embedded = new EmbeddedAnt();
///Log level to use
//private static Priority m_priority = Priority.WARN;
private static int m_priority = BasicLogger.LEVEL_WARN;
/**
@@ -109,12 +97,24 @@ public class CLIMain
* @param args the args
*/
public static void main( final String[] args )
{
final Map properties = new HashMap();
properties.put( "myrmidon.home", new File( "." ) );
main( properties, args );
}
/**
* Main entry point called to run standard Myrmidon.
*
* @param args the args
*/
public static void main( final Map properties, final String[] args )
{
int exitCode = 0;
final CLIMain main = new CLIMain();
try
{
main.execute( args );
main.execute( properties, args );
}
catch( final Throwable throwable )
{
@@ -243,10 +243,10 @@ public class CLIMain
return false;
case HOME_DIR_OPT:
m_parameters.setParameter ( "myrmidon.home", option.getArgument() );
m_embedded.setEmbeddorProperty ( "myrmidon.home", option.getArgument() );
break;
case TASKLIB_DIR_OPT:
m_parameters.setParameter ( "myrmidon.lib.path", option.getArgument() );
m_embedded.setEmbeddorProperty ( "myrmidon.lib.path", option.getArgument() );
break;
case LOG_LEVEL_OPT:
@@ -260,26 +260,26 @@ public class CLIMain
break;
case INCREMENTAL_OPT:
m_parameters.setParameter( "incremental", "true" ) ;
m_incremental = true ;
break;
case FILE_OPT:
m_parameters.setParameter( "filename", option.getArgument() );
m_embedded.setProjectFile( option.getArgument() );
break;
case LISTENER_OPT:
m_parameters.setParameter( "listener", option.getArgument() );
m_embedded.setListener( option.getArgument() );
break;
case NO_PREFIX_OPT:
m_parameters.setParameter( "listener", "noprefix" );
m_embedded.setListener( "noprefix" );
break;
case DEFINE_OPT:
m_defines.setParameter ( option.getArgument( 0 ), option.getArgument( 1 ) );
m_embedded.setWorkspaceProperty ( option.getArgument( 0 ), option.getArgument( 1 ) );
break;
case BUILDER_PARAM_OPT:
m_builderParameters.setParameter ( option.getArgument( 0 ), option.getArgument( 1 ) );
m_embedded.setBuilderProperty ( option.getArgument( 0 ), option.getArgument( 1 ) );
break;
case DRY_RUN_OPT:
@@ -295,61 +295,42 @@ public class CLIMain
return true;
}
private void setupDefaultParameters()
{
//System property set up by launcher
m_parameters.setParameter( "myrmidon.home", System.getProperty( "myrmidon.home", "." ) );
m_parameters.setParameter( "filename", "build.ant" );
m_parameters.setParameter( "log.level", "WARN" );
m_parameters.setParameter( "listener", "default" );
m_parameters.setParameter( "incremental", "false" );
}
private void execute( final String[] args )
private void execute( final Map properties, final String[] args )
throws Exception
{
setupDefaultParameters();
if( !parseCommandLineOptions( args ) )
try
{
return;
}
prepareLogging();
checkHomeDir();
final File buildFile = getBuildFile();
//getLogger().debug( "Ant Bin Directory: " + m_binDir );
//getLogger().debug( "Ant Lib Directory: " + m_libDir );
//getLogger().debug( "Ant Task Lib Directory: " + m_taskLibDir );
// Set system properties set up by launcher
m_embedded.setEmbeddorProperty( "myrmidon.home", properties.get( "myrmidon.home" ) );
if( m_dryRun )
{
m_parameters.setParameter( Executor.ROLE,
"o rg.apach e.myrmidon.componen ts.exec uto r.Pri ntingExecutor" ) ;
}
// Command line
if( !parseCommandLineOptions( args ) )
{
return;
}
final Embeddor embeddor = prepareEmbeddor();
// Setup logging
final BasicLogger logger = new BasicLogger( "[myrmidon] ", m_priority );
m_embedded.setLogger( logger );
try
{
final ProjectListener listener = prepareListener( embeddor );
if( m_dryRun )
{
m_embedded.setEmbeddorProperty( Executor.ROLE,
"org.apache.myrmidon.components.executor.PrintingExecutor" );
}
//create the project
final Project project =
embeddor.createProject( buildFile.toString(), null, m_builderParameters );
// Set the common classloader
final ClassLoader sharedClassLoader = (ClassLoader)properties.get( "myrmidon.shared.classloader" );
m_embedded.setSharedClassLoader( sharedClassLoader );
//loop over build if we are in incremental mode..
final boolean incremental = m_parameters.getParameterAsBoolean( "incremental", false );
if( !incremental )
if( !m_incremental )
{
executeBuild( embeddor, project, listener );
executeBuild();
}
else
{
executeIncrementalBuild( embeddor, project, listener );
executeIncrementalBuild();
}
}
catch( final Exception e )
@@ -359,13 +340,11 @@ public class CLIMain
}
finally
{
shutdownEmbeddor( embeddor );
m_embedded.stop( );
}
}
private void executeIncrementalBuild( final Embeddor embeddor,
final Project project,
final ProjectListener listener )
private void executeIncrementalBuild()
throws Exception
{
BufferedReader reader = null;
@@ -374,7 +353,7 @@ public class CLIMain
{
try
{
executeBuild( embeddor, project, listener );
executeBuild();
}
catch( final TaskException te )
{
@@ -398,6 +377,13 @@ public class CLIMain
}
}
private void executeBuild() throws Exception
{
//actually do the build ...
final String[] targets = (String[])m_targets.toArray( new String[m_targets.size() ] );
m_embedded.executeTargets( targets );
}
/**
* Builds the error message for an exception
*/
@@ -426,131 +412,7 @@ public class CLIMain
}
// Write the message out
if( getLogger() == null )
{
System.err.println( message );
}
else
{
getLogger().error( message );
}
}
private void executeBuild( final Embeddor embeddor,
final Project project,
final ProjectListener listener )
throws Exception
{
//actually do the build ...
final Workspace workspace = embeddor.createWorkspace( m_defines );
workspace.addProjectListener( listener );
doBuild( workspace, project, m_targets );
}
private File getBuildFile() throws Exception
{
final String filename = m_parameters.getParameter( "filename", null );
final File buildFile = ( new File( filename ) ).getCanonicalFile();
if( !buildFile.isFile() )
{
final String message = REZ.getString( "bad-file.error", buildFile );
throw new Exception( message );
}
if( getLogger().isInfoEnabled() )
{
final String message = REZ.getString( "buildfile.notice", buildFile );
getLogger().info( message );
}
return buildFile;
}
private void checkHomeDir() throws Exception
{
final String home = m_parameters.getParameter( "myrmidon.home" );
final File homeDir = ( new File( home ) ).getAbsoluteFile();
if( !homeDir.isDirectory() )
{
final String message = REZ.getString( "home-not-dir.error", homeDir );
throw new Exception( message );
}
if( getLogger().isInfoEnabled() )
{
final String message = REZ.getString( "homedir.notice", homeDir );
getLogger().info( message );
}
}
private void prepareLogging() throws Exception
{
//handle logging...
final BasicLogger logger = new BasicLogger( "[myrmidon] ", m_priority );
enableLogging( logger );
}
private void shutdownEmbeddor( final Embeddor embeddor )
throws Exception
{
embeddor.stop();
embeddor.dispose();
}
private ProjectListener prepareListener( final Embeddor embeddor )
throws Exception
{
//create the listener
final String listenerName = m_parameters.getParameter( "listener", null );
final ProjectListener listener = embeddor.createListener( listenerName );
return listener;
}
private Embeddor prepareEmbeddor()
throws Exception
{
final Embeddor embeddor = createEmbeddor();
setupLogger( embeddor );
embeddor.parameterize( m_parameters );
embeddor.initialize();
embeddor.start();
return embeddor;
}
private Embeddor createEmbeddor()
throws Exception
{
final Class clazz = Class.forName( DEFAULT_EMBEDDOR_CLASS );
return (Embeddor)clazz.newInstance();
}
/**
* Actually do the build.
*
* @param workspace the workspace
* @param project the project
* @param targets the targets to build as passed by CLI
*/
private void doBuild( final Workspace workspace,
final Project project,
final ArrayList targets )
throws TaskException
{
final int targetCount = targets.size();
//if we didn't specify a target on CLI then choose default
if( 0 == targetCount )
{
workspace.executeProject( project, project.getDefaultTargetName() );
}
else
{
for( int i = 0; i < targetCount; i++ )
{
workspace.executeProject( project, (String)targets.get( i ) );
}
}
System.err.println( message );
}
/**