diff --git a/proposal/myrmidon/etc/testcases/org/apache/antlib/core/property.ant b/proposal/myrmidon/etc/testcases/org/apache/antlib/core/property.ant
index 69219bc77..8dc4321a1 100644
--- a/proposal/myrmidon/etc/testcases/org/apache/antlib/core/property.ant
+++ b/proposal/myrmidon/etc/testcases/org/apache/antlib/core/property.ant
@@ -41,4 +41,13 @@
+
+
+
+
+
+
+
+
+
diff --git a/proposal/myrmidon/src/java/org/apache/myrmidon/components/executor/AspectAwareExecutor.java b/proposal/myrmidon/src/java/org/apache/myrmidon/components/executor/AspectAwareExecutor.java
index 74ad5a25c..5ba45dffb 100644
--- a/proposal/myrmidon/src/java/org/apache/myrmidon/components/executor/AspectAwareExecutor.java
+++ b/proposal/myrmidon/src/java/org/apache/myrmidon/components/executor/AspectAwareExecutor.java
@@ -75,30 +75,41 @@ public class AspectAwareExecutor
final ExecutionFrame frame )
throws TaskException
{
- Configuration taskModel = getAspectManager().preCreate( model );
- taskModel = prepareAspects( taskModel );
-
- final String taskName = taskModel.getName();
- debug( "creating.notice", taskName );
- final Task task = createTask( taskName, frame );
- getAspectManager().postCreate( task );
-
- debug( "logger.notice", taskName );
- final Logger logger = frame.getLogger();
- getAspectManager().preLogEnabled( logger );
- doLogEnabled( task, taskModel, logger );
-
- debug( "contextualizing.notice", taskName );
- doContextualize( task, taskModel, frame.getContext() );
-
- debug( "configuring.notice", taskName );
- getAspectManager().preConfigure( taskModel );
- doConfigure( task, taskModel, frame.getContext() );
-
- debug( "executing.notice", taskName );
- getAspectManager().preExecute();
- doExecute( taskModel, task );
- getAspectManager().preDestroy();
+ try
+ {
+ Configuration taskModel = getAspectManager().preCreate( model );
+ taskModel = prepareAspects( taskModel );
+
+ final String taskName = taskModel.getName();
+ debug( "creating.notice", taskName );
+ final Task task = doCreateTask( taskName, frame );
+ getAspectManager().postCreate( task );
+
+ debug( "logger.notice", taskName );
+ final Logger logger = frame.getLogger();
+ getAspectManager().preLogEnabled( logger );
+ doLogEnabled( task, taskModel, logger );
+
+ debug( "contextualizing.notice", taskName );
+ doContextualize( task, taskModel, frame.getContext() );
+
+ debug( "configuring.notice", taskName );
+ getAspectManager().preConfigure( taskModel );
+ doConfigure( task, taskModel, frame.getContext() );
+
+ debug( "executing.notice", taskName );
+ getAspectManager().preExecute();
+ doExecute( taskModel, task );
+ getAspectManager().preDestroy();
+ }
+ catch( Exception e )
+ {
+ // Wrap in generic error message
+ final String message = REZ.getString( "execute.error",
+ model.getName(),
+ model.getLocation() );
+ throw new TaskException( message, e );
+ }
}
protected void doExecute( final Configuration taskModel, final Task task )
diff --git a/proposal/myrmidon/src/java/org/apache/myrmidon/components/executor/DefaultExecutor.java b/proposal/myrmidon/src/java/org/apache/myrmidon/components/executor/DefaultExecutor.java
index 16eaa4488..e2f5bcb73 100644
--- a/proposal/myrmidon/src/java/org/apache/myrmidon/components/executor/DefaultExecutor.java
+++ b/proposal/myrmidon/src/java/org/apache/myrmidon/components/executor/DefaultExecutor.java
@@ -10,6 +10,7 @@ package org.apache.myrmidon.components.executor;
import org.apache.avalon.excalibur.i18n.ResourceManager;
import org.apache.avalon.excalibur.i18n.Resources;
import org.apache.avalon.framework.configuration.Configuration;
+import org.apache.avalon.framework.configuration.ConfigurationException;
import org.apache.avalon.framework.logger.AbstractLogEnabled;
import org.apache.avalon.framework.logger.LogEnabled;
import org.apache.avalon.framework.logger.Logger;
@@ -52,24 +53,36 @@ public class DefaultExecutor
m_configurer = (Configurer)serviceManager.lookup( Configurer.ROLE );
}
+ /**
+ * Executes a task.
+ */
public void execute( final Configuration taskModel, final ExecutionFrame frame )
throws TaskException
{
final String taskName = taskModel.getName();
- debug( "creating.notice", taskName );
- final Task task = createTask( taskName, frame );
+ try
+ {
+ debug( "creating.notice", taskName );
+ final Task task = doCreateTask( taskName, frame );
- debug( "logger.notice", taskName );
- doLogEnabled( task, taskModel, frame.getLogger() );
+ debug( "logger.notice", taskName );
+ doLogEnabled( task, taskModel, frame.getLogger() );
- debug( "contextualizing.notice", taskName );
- doContextualize( task, taskModel, frame.getContext() );
+ debug( "contextualizing.notice", taskName );
+ doContextualize( task, taskModel, frame.getContext() );
- debug( "configuring.notice", taskName );
- doConfigure( task, taskModel, frame.getContext() );
+ debug( "configuring.notice", taskName );
+ doConfigure( task, taskModel, frame.getContext() );
- debug( "executing.notice", taskName );
- task.execute();
+ debug( "executing.notice", taskName );
+ task.execute();
+ }
+ catch( Exception e )
+ {
+ // Wrap in generic error message
+ final String message = REZ.getString( "execute.error", taskName, taskModel.getLocation() );
+ throw new TaskException( message, e );
+ }
}
protected final void debug( final String key, final String taskName )
@@ -84,7 +97,7 @@ public class DefaultExecutor
/**
* Creates a task instance.
*/
- protected final Task createTask( final String name, final ExecutionFrame frame )
+ protected final Task doCreateTask( final String name, final ExecutionFrame frame )
throws TaskException
{
try
@@ -94,7 +107,7 @@ public class DefaultExecutor
}
catch( final TypeException te )
{
- final String message = REZ.getString( "no-create.error", name );
+ final String message = REZ.getString( "create.error", name );
throw new TaskException( message, te );
}
}
@@ -105,20 +118,9 @@ public class DefaultExecutor
protected final void doConfigure( final Task task,
final Configuration taskModel,
final TaskContext taskContext )
- throws TaskException
+ throws ConfigurationException
{
- try
- {
- m_configurer.configure( task, taskModel, taskContext );
- }
- catch( final Throwable throwable )
- {
- final String message =
- REZ.getString( "config.error",
- taskModel.getName(),
- taskModel.getLocation() );
- throw new TaskException( message, throwable );
- }
+ m_configurer.configure( task, taskModel, taskContext );
}
/**
@@ -136,9 +138,7 @@ public class DefaultExecutor
catch( final Throwable throwable )
{
final String message =
- REZ.getString( "contextualize.error",
- taskModel.getName(),
- taskModel.getLocation() );
+ REZ.getString( "contextualize.error", taskModel.getName() );
throw new TaskException( message, throwable );
}
}
@@ -160,9 +160,7 @@ public class DefaultExecutor
catch( final Throwable throwable )
{
final String message =
- REZ.getString( "logger.error",
- taskModel.getName(),
- taskModel.getLocation() );
+ REZ.getString( "logger.error", taskModel.getName() );
throw new TaskException( message, throwable );
}
}
diff --git a/proposal/myrmidon/src/java/org/apache/myrmidon/components/executor/Resources.properties b/proposal/myrmidon/src/java/org/apache/myrmidon/components/executor/Resources.properties
index 034ce2200..b038221f6 100644
--- a/proposal/myrmidon/src/java/org/apache/myrmidon/components/executor/Resources.properties
+++ b/proposal/myrmidon/src/java/org/apache/myrmidon/components/executor/Resources.properties
@@ -4,10 +4,10 @@ contextualizing.notice=Contextualizing {0}.
configuring.notice=Configuring {0}.
executing.notice=Executing {0}.
-no-create.error=Could not create task "{0}".
-config.error={1}: Could not configure task "{0}".
-contextualize.error={1}: Could not set the context for task "{0}".
-logger.error={1}: Could not set the logger for task "{0}".
+create.error=Could not create task <{0}>.
+contextualize.error=Could not set the context for task <{0}>.
+logger.error=Could not set the logger for task <{0}>.
+execute.error={1}: Could not execute task <{0}>.
unused-settings.error=Unused aspect settings for namespace {0} (parameterCount={1} elementCount={2}).
dispatch-settings.notice=Dispatching Aspect Settings to namespace {0} (parameterCount={1} elementCount={2}).
diff --git a/proposal/myrmidon/src/java/org/apache/myrmidon/frontends/CLIMain.java b/proposal/myrmidon/src/java/org/apache/myrmidon/frontends/CLIMain.java
index 021102d5a..f7ebd057c 100644
--- a/proposal/myrmidon/src/java/org/apache/myrmidon/frontends/CLIMain.java
+++ b/proposal/myrmidon/src/java/org/apache/myrmidon/frontends/CLIMain.java
@@ -18,6 +18,7 @@ import org.apache.avalon.excalibur.cli.CLOptionDescriptor;
import org.apache.avalon.excalibur.cli.CLUtil;
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.logger.LogKitLogger;
@@ -105,6 +106,9 @@ public class CLIMain
///Determine whether tasks are actually executed
private boolean m_dryRun = false;
+ ///Log level to use
+ private static Priority m_priority = Priority.WARN;
+
/**
* Main entry point called to run standard Myrmidon.
*
@@ -120,9 +124,7 @@ public class CLIMain
}
catch( final Throwable throwable )
{
- final String message =
- REZ.getString( "error-message", ExceptionUtil.printStackTrace( throwable ) );
- System.err.println( message );
+ main.reportError( throwable );
exitCode = -1;
}
finally
@@ -219,6 +221,7 @@ public class CLIMain
}
private boolean parseCommandLineOptions( final String[] args )
+ throws Exception
{
final CLOptionDescriptor[] options = createCLOptions();
final CLArgsParser parser = new CLArgsParser( args, options );
@@ -226,8 +229,7 @@ public class CLIMain
if( null != parser.getErrorString() )
{
final String message = REZ.getString( "error-message", parser.getErrorString() );
- System.err.println( message );
- return false;
+ throw new Exception( message );
}
final List clOptions = parser.getArguments();
@@ -254,13 +256,13 @@ public class CLIMain
break;
case LOG_LEVEL_OPT:
- m_parameters.setParameter( "log.level", option.getArgument() );
+ m_priority = mapLogLevel( option.getArgument() );
break;
case VERBOSE_OPT:
- m_parameters.setParameter( "log.level", "INFO" );
+ m_priority = Priority.INFO;
break;
case QUIET_OPT:
- m_parameters.setParameter( "log.level", "ERROR" );
+ m_priority = Priority.ERROR;
break;
case INCREMENTAL_OPT:
@@ -322,7 +324,7 @@ public class CLIMain
prepareLogging();
- final File homeDir = getHomeDir();
+ checkHomeDir();
final File buildFile = getBuildFile();
//getLogger().debug( "Ant Bin Directory: " + m_binDir );
@@ -336,24 +338,35 @@ public class CLIMain
}
final Embeddor embeddor = prepareEmbeddor();
- final ProjectListener listener = prepareListener( embeddor );
- //create the project
- final Project project =
- embeddor.createProject( buildFile.toString(), null, m_builderParameters );
+ try
+ {
+ final ProjectListener listener = prepareListener( embeddor );
- //loop over build if we are in incremental mode..
- final boolean incremental = m_parameters.getParameterAsBoolean( "incremental", false );
- if( !incremental )
+ //create the project
+ final Project project =
+ embeddor.createProject( buildFile.toString(), null, m_builderParameters );
+
+ //loop over build if we are in incremental mode..
+ final boolean incremental = m_parameters.getParameterAsBoolean( "incremental", false );
+ if( !incremental )
+ {
+ executeBuild( embeddor, project, listener );
+ }
+ else
+ {
+ executeIncrementalBuild( embeddor, project, listener );
+ }
+ }
+ catch( final Exception e )
{
- executeBuild( embeddor, project, listener );
+ final String message = REZ.getString( "build-failed.error" );
+ throw new CascadingException( message, e );
}
- else
+ finally
{
- executeIncrementalBuild( embeddor, project, listener );
+ shutdownEmbeddor( embeddor );
}
-
- shutdownEmbeddor( embeddor );
}
private void executeIncrementalBuild( final Embeddor embeddor,
@@ -365,7 +378,14 @@ public class CLIMain
while( true )
{
- executeBuild( embeddor, project, listener );
+ try
+ {
+ executeBuild( embeddor, project, listener );
+ }
+ catch( final TaskException te )
+ {
+ reportError( te );
+ }
final String message = REZ.getString( "repeat.notice" );
System.out.println( message );
@@ -385,6 +405,44 @@ public class CLIMain
}
}
+ /**
+ * Builds the error message for an exception
+ */
+ private void reportError( final Throwable throwable )
+ {
+ // Build the message
+ final String message;
+ if( m_priority.isLowerOrEqual( Priority.INFO ) )
+ {
+ // Verbose mode - include the stack traces
+ message = ExceptionUtil.printStackTrace( throwable, 5, true, true );
+ }
+ else
+ {
+ // Build the message
+ final StringBuffer buffer = new StringBuffer();
+ buffer.append( throwable.getMessage() );
+ for( Throwable current = ExceptionUtil.getCause( throwable, true );
+ current != null;
+ current = ExceptionUtil.getCause( current, true ) )
+ {
+ final String causeMessage = REZ.getString( "cause.error", current.getMessage() );
+ buffer.append( causeMessage );
+ }
+ message = buffer.toString();
+ }
+
+ // 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 )
@@ -416,9 +474,9 @@ public class CLIMain
return buildFile;
}
- private File getHomeDir() throws Exception
+ private void checkHomeDir() throws Exception
{
- final String home = m_parameters.getParameter( "myrmidon.home", null );
+ final String home = m_parameters.getParameter( "myrmidon.home" );
final File homeDir = ( new File( home ) ).getAbsoluteFile();
if( !homeDir.isDirectory() )
{
@@ -431,15 +489,12 @@ public class CLIMain
final String message = REZ.getString( "homedir.notice", homeDir );
getLogger().info( message );
}
-
- return homeDir;
}
private void prepareLogging() throws Exception
{
//handle logging...
- final String logLevel = m_parameters.getParameter( "log.level", null );
- enableLogging( new LogKitLogger( createLogger( logLevel ) ) );
+ enableLogging( new LogKitLogger( createLogger( m_priority ) ) );
}
private void shutdownEmbeddor( final Embeddor embeddor )
@@ -486,51 +541,49 @@ public class CLIMain
private void doBuild( final Workspace workspace,
final Project project,
final ArrayList targets )
+ throws TaskException
{
- try
- {
- final int targetCount = targets.size();
+ 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 ) );
- }
- }
+ //if we didn't specify a target on CLI then choose default
+ if( 0 == targetCount )
+ {
+ workspace.executeProject( project, project.getDefaultTargetName() );
}
- catch( final TaskException ae )
+ else
{
- final String message =
- REZ.getString( "build-failed.error", ExceptionUtil.printStackTrace( ae, 5, true ) );
- getLogger().error( message );
+ for( int i = 0; i < targetCount; i++ )
+ {
+ workspace.executeProject( project, (String)targets.get( i ) );
+ }
}
}
/**
- * Create Logger of appropriate log-level.
- *
- * @param logLevel the log-level
- * @return the logger
- * @exception Exception if an error occurs
+ * Sets the log level.
*/
- private Logger createLogger( final String logLevel )
- throws Exception
+ private Priority mapLogLevel( final String logLevel ) throws Exception
{
final String logLevelCapitalized = logLevel.toUpperCase();
final Priority priority = Priority.getPriorityForName( logLevelCapitalized );
-
if( !priority.getName().equals( logLevelCapitalized ) )
{
final String message = REZ.getString( "bad-loglevel.error", logLevel );
throw new Exception( message );
}
+ return priority;
+ }
+ /**
+ * Create Logger of appropriate log-level.
+ *
+ * @param priority the log-level
+ * @return the logger
+ * @exception Exception if an error occurs
+ */
+ private Logger createLogger( final Priority priority )
+ throws Exception
+ {
final Logger logger = Hierarchy.getDefaultHierarchy().getLoggerFor( "myrmidon" );
final PatternFormatter formatter = new PatternFormatter( PATTERN );
diff --git a/proposal/myrmidon/src/java/org/apache/myrmidon/frontends/Resources.properties b/proposal/myrmidon/src/java/org/apache/myrmidon/frontends/Resources.properties
index 74313c9cc..eb62e0298 100644
--- a/proposal/myrmidon/src/java/org/apache/myrmidon/frontends/Resources.properties
+++ b/proposal/myrmidon/src/java/org/apache/myrmidon/frontends/Resources.properties
@@ -18,7 +18,8 @@ dry-run.opt=Do not execute tasks - just print them out.
home-not-dir.error=myrmidon-home ({0}) is not a directory.
bad-file.error=File {0} is not a file or doesn't exist.
bad-loglevel.error=Unknown log level - {0}.
-build-failed.error=BUILD FAILED\nReason:\n{0}
+build-failed.error=BUILD FAILED.
+cause.error=\nReason: {0}
repeat.notice=Continue ? (Enter no to stop)
diff --git a/proposal/myrmidon/src/test/org/apache/antlib/core/IfTest.java b/proposal/myrmidon/src/test/org/apache/antlib/core/IfTest.java
index 663d89860..932fc89d9 100644
--- a/proposal/myrmidon/src/test/org/apache/antlib/core/IfTest.java
+++ b/proposal/myrmidon/src/test/org/apache/antlib/core/IfTest.java
@@ -83,11 +83,14 @@ public class IfTest
final File projectFile = getTestResource( "if.ant" );
// Check for missing condition
- String message = REZ.getString( "if.no-condition.error" );
- executeTargetExpectError( projectFile, "no-condition", message );
+ String[] messages = {
+ null,
+ REZ.getString( "if.no-condition.error" )
+ };
+ executeTargetExpectError( projectFile, "no-condition", messages );
// Check for too many conditions
- String[] messages =
+ messages = new String[]
{
null,
null,
diff --git a/proposal/myrmidon/src/test/org/apache/antlib/core/PropertyTest.java b/proposal/myrmidon/src/test/org/apache/antlib/core/PropertyTest.java
index 31dfcc9f5..7158acef7 100644
--- a/proposal/myrmidon/src/test/org/apache/antlib/core/PropertyTest.java
+++ b/proposal/myrmidon/src/test/org/apache/antlib/core/PropertyTest.java
@@ -64,21 +64,31 @@ public class PropertyTest
final File projectFile = getTestResource( "property.ant" );
// Missing name
- String message = REZ.getString( "property.no-name.error" );
- executeTargetExpectError( projectFile, "missing-name", message );
+ String[] messages =
+ {
+ null,
+ REZ.getString( "property.no-name.error" )
+ };
+ executeTargetExpectError( projectFile, "missing-name", messages );
// Missing value
- message = REZ.getString( "property.no-value.error" );
- executeTargetExpectError( projectFile, "missing-value", message );
+ messages = new String[]
+ {
+ null,
+ REZ.getString( "property.no-value.error" )
+ };
+ executeTargetExpectError( projectFile, "missing-value", messages );
// Too many values
- String[] messages = {
+ messages = new String[]
+ {
null,
null,
REZ.getString( "property.multi-set.error" )
};
executeTargetExpectError( projectFile, "too-many-values1", messages );
executeTargetExpectError( projectFile, "too-many-values2", messages );
+ executeTargetExpectError( projectFile, "too-many-values3", messages );
}
}
diff --git a/proposal/myrmidon/src/testcases/org/apache/antlib/core/IfTest.java b/proposal/myrmidon/src/testcases/org/apache/antlib/core/IfTest.java
index 663d89860..932fc89d9 100644
--- a/proposal/myrmidon/src/testcases/org/apache/antlib/core/IfTest.java
+++ b/proposal/myrmidon/src/testcases/org/apache/antlib/core/IfTest.java
@@ -83,11 +83,14 @@ public class IfTest
final File projectFile = getTestResource( "if.ant" );
// Check for missing condition
- String message = REZ.getString( "if.no-condition.error" );
- executeTargetExpectError( projectFile, "no-condition", message );
+ String[] messages = {
+ null,
+ REZ.getString( "if.no-condition.error" )
+ };
+ executeTargetExpectError( projectFile, "no-condition", messages );
// Check for too many conditions
- String[] messages =
+ messages = new String[]
{
null,
null,
diff --git a/proposal/myrmidon/src/testcases/org/apache/antlib/core/PropertyTest.java b/proposal/myrmidon/src/testcases/org/apache/antlib/core/PropertyTest.java
index 31dfcc9f5..7158acef7 100644
--- a/proposal/myrmidon/src/testcases/org/apache/antlib/core/PropertyTest.java
+++ b/proposal/myrmidon/src/testcases/org/apache/antlib/core/PropertyTest.java
@@ -64,21 +64,31 @@ public class PropertyTest
final File projectFile = getTestResource( "property.ant" );
// Missing name
- String message = REZ.getString( "property.no-name.error" );
- executeTargetExpectError( projectFile, "missing-name", message );
+ String[] messages =
+ {
+ null,
+ REZ.getString( "property.no-name.error" )
+ };
+ executeTargetExpectError( projectFile, "missing-name", messages );
// Missing value
- message = REZ.getString( "property.no-value.error" );
- executeTargetExpectError( projectFile, "missing-value", message );
+ messages = new String[]
+ {
+ null,
+ REZ.getString( "property.no-value.error" )
+ };
+ executeTargetExpectError( projectFile, "missing-value", messages );
// Too many values
- String[] messages = {
+ messages = new String[]
+ {
null,
null,
REZ.getString( "property.multi-set.error" )
};
executeTargetExpectError( projectFile, "too-many-values1", messages );
executeTargetExpectError( projectFile, "too-many-values2", messages );
+ executeTargetExpectError( projectFile, "too-many-values3", messages );
}
}