diff --git a/proposal/myrmidon/build.xml b/proposal/myrmidon/build.xml
index f90cffa37..3c929c279 100644
--- a/proposal/myrmidon/build.xml
+++ b/proposal/myrmidon/build.xml
@@ -156,11 +156,13 @@ Legal:
optimize="${optimize}"
deprecation="${deprecation}" />
+
-
+
+
+
+
+
+
+
+
+
@@ -200,7 +218,7 @@ Legal:
Creates the distribution
===================================================================
-->
-
+
diff --git a/proposal/myrmidon/lib/avalonapi.jar b/proposal/myrmidon/lib/avalonapi.jar
index 1238e40f0..fdf0857cf 100644
Binary files a/proposal/myrmidon/lib/avalonapi.jar and b/proposal/myrmidon/lib/avalonapi.jar differ
diff --git a/proposal/myrmidon/src/java/org/apache/ant/Main.java b/proposal/myrmidon/src/java/org/apache/ant/Main.java
index f474e65d6..4f28ab4a6 100644
--- a/proposal/myrmidon/src/java/org/apache/ant/Main.java
+++ b/proposal/myrmidon/src/java/org/apache/ant/Main.java
@@ -18,13 +18,15 @@ import java.net.URL;
import java.net.URLClassLoader;
import java.util.ArrayList;
import java.util.HashMap;
-import java.util.List;
import java.util.Iterator;
+import java.util.List;
+import org.apache.ant.launcher.AntLoader;
import org.apache.ant.project.DefaultProjectEngine;
import org.apache.ant.project.Project;
import org.apache.ant.project.ProjectBuilder;
import org.apache.ant.project.ProjectEngine;
import org.apache.ant.project.ProjectListener;
+import org.apache.ant.project.ProjectToListenerAdapter;
import org.apache.ant.tasklet.JavaVersion;
import org.apache.ant.tasklet.TaskletContext;
import org.apache.avalon.Disposable;
@@ -57,10 +59,14 @@ public class Main
public final static String VERSION =
"Ant " + BUILD_VERSION + " compiled on " + BUILD_DATE;
- protected final static String DEFAULT_LOGLEVEL = "INFO";
- protected final static String DEFAULT_LIB_DIRECTORY = ".." + File.separator + "lib";
+ protected final static String DEFAULT_LOGLEVEL = "WARN";
+ protected final static String DEFAULT_LIB_DIRECTORY = "lib";
protected final static String DEFAULT_TASKLIB_DIRECTORY = DEFAULT_LIB_DIRECTORY;
protected final static String DEFAULT_FILENAME = "build.xmk";
+
+ protected final static String DEFAULT_ENGINE =
+ "org.apache.ant.project.DefaultProjectEngine";
+
protected final static String DEFAULT_LISTENER =
"org.apache.ant.project.DefaultProjectListener";
@@ -82,7 +88,7 @@ public class Main
private static final int HOME_DIR_OPT = 7;
//incompatable options for info options
- private static final int INFO_OPT_INCOMPAT[] = new int[]
+ private static final int[] INFO_OPT_INCOMPAT = new int[]
{
HELP_OPT, QUIET_OPT, VERBOSE_OPT, FILE_OPT,
LOG_LEVEL_OPT, VERSION_OPT, LISTENER_OPT,
@@ -91,13 +97,14 @@ public class Main
};
//incompatable options for other logging options
- private static final int LOG_OPT_INCOMPAT[] = new int[]
+ private static final int[] LOG_OPT_INCOMPAT = new int[]
{
QUIET_OPT, VERBOSE_OPT, LOG_LEVEL_OPT
};
protected Logger m_logger;
+ protected ProjectListener m_listener;
protected File m_binDir;
protected File m_homeDir;
protected File m_libDir;
@@ -105,7 +112,7 @@ public class Main
protected File m_buildFile;
protected File m_userDir;
- public static void main( final String args[] )
+ public static void main( final String[] args )
{
final Main main = new Main();
@@ -128,7 +135,7 @@ public class Main
protected CLOptionDescriptor[] createCLOptions()
{
//TODO: localise
- final CLOptionDescriptor options[] = new CLOptionDescriptor[ 13 ];
+ final CLOptionDescriptor[] options = new CLOptionDescriptor[ 13 ];
options[0] =
new CLOptionDescriptor( "help",
@@ -291,9 +298,9 @@ public class Main
m_taskLibDir = getTaskLibDir( m_homeDir, taskLibDir );
m_buildFile = getFile( filename );
- m_logger.info( "Ant Base Directory: " + m_homeDir );
+ m_logger.warn( "Ant Build File: " + m_buildFile );
+ m_logger.info( "Ant Home Directory: " + m_homeDir );
m_logger.info( "Ant Bin Directory: " + m_binDir );
- m_logger.info( "Ant Build File: " + m_buildFile );
m_logger.debug( "Ant Lib Directory: " + m_libDir );
m_logger.debug( "Ant Task Lib Directory: " + m_taskLibDir );
@@ -310,6 +317,8 @@ public class Main
((Initializable)engine).init();
}
+ engine.addProjectListener( m_listener );
+
deployDefaultTaskLibs( engine, m_taskLibDir );
BufferedReader reader = null;
@@ -343,10 +352,9 @@ public class Main
final File taskLibDirectory )
{
- final ExtensionFileFilter filter =
- new ExtensionFileFilter( new String[] { ".tsk" } );
+ final ExtensionFileFilter filter = new ExtensionFileFilter( ".tsk" );
- final File files[] = taskLibDirectory.listFiles( filter );
+ final File[] files = taskLibDirectory.listFiles( filter );
final Deployer deployer = engine.getDeployer();
for( int i = 0; i < files.length; i++ )
@@ -401,36 +409,35 @@ public class Main
protected void setupListener( final String listenerName )
{
- final ProjectListener listener = createListener( listenerName );
- m_logger.addLogTarget( listener );
+ m_listener = createListener( listenerName );
+ m_logger.addLogTarget( new ProjectToListenerAdapter( m_listener ) );
}
protected void setupContextClassLoader( final File libDir )
{
- final ClassLoader classLoader = createClassLoader( libDir );
- Thread.currentThread().setContextClassLoader( classLoader );
+ setupClassLoader( libDir );
+ Thread.currentThread().setContextClassLoader( AntLoader.getLoader() );
}
- protected ClassLoader createClassLoader( final File libDir )
+ protected void setupClassLoader( final File libDir )
{
final ExtensionFileFilter filter =
new ExtensionFileFilter( new String[] { ".jar", ".zip" } );
- final ArrayList urlList = new ArrayList();
- toURLS( urlList, libDir.listFiles( filter ) );
-
- final URL urls[] = (URL[])urlList.toArray( new URL[0] );
+ final File[] files = libDir.listFiles( filter );
- return new URLClassLoader( urls, ClassLoader.getSystemClassLoader() );
- }
+ final AntLoader classLoader = AntLoader.getLoader();
- protected void toURLS( final ArrayList urls, final File files[] )
- {
for( int i = 0; i < files.length; i++ )
{
- try { urls.add( files[ i ].toURL() ); }
- catch( final MalformedURLException mue ) {}
- }
+ if( !files[ i ].getName().equals( "ant.jar" ) &&
+ !files[ i ].getName().equals( "myrmidon.jar" ) &&
+ !files[ i ].getName().equals( "avalonapi.jar" ) )
+ {
+ try { classLoader.addURL( files[ i ].toURL() ); }
+ catch( final MalformedURLException mue ) {}
+ }
+ }
}
protected Project getProject( final String builderName, final File file )
@@ -497,7 +504,7 @@ public class Main
protected ProjectEngine createProjectEngine()
{
- return new DefaultProjectEngine();
+ return (ProjectEngine)createObject( DEFAULT_ENGINE, "project-engine" );
}
protected File getHomeDir( final String homeDir )
@@ -760,11 +767,11 @@ public class Main
{
try
{
- final Class clazz = Class.forName( objectName );
+ final Class clazz = Class.forName( objectName );
return clazz.newInstance();
}
catch( final IllegalAccessException iae )
- {
+ {
throw new AntException( "Non-public constructor for " + type + " " + objectName,
iae );
}
diff --git a/proposal/myrmidon/src/java/org/apache/ant/convert/DefaultConverterLoader.java b/proposal/myrmidon/src/java/org/apache/ant/convert/DefaultConverterLoader.java
index f4c37f183..225fb8b19 100644
--- a/proposal/myrmidon/src/java/org/apache/ant/convert/DefaultConverterLoader.java
+++ b/proposal/myrmidon/src/java/org/apache/ant/convert/DefaultConverterLoader.java
@@ -22,13 +22,14 @@ public class DefaultConverterLoader
{
public DefaultConverterLoader()
{
- super( new URLClassLoader( new URL[0],
+ super( new URLClassLoader( new URL[0],
Thread.currentThread().getContextClassLoader() ) );
}
public DefaultConverterLoader( final URL location )
{
- super( new URLClassLoader( new URL[] { location } ) );
+ super( new URLClassLoader( new URL[] { location },
+ Thread.currentThread().getContextClassLoader() ) );
}
public Converter loadConverter( final String converter )
diff --git a/proposal/myrmidon/src/java/org/apache/ant/launcher/AntLoader.java b/proposal/myrmidon/src/java/org/apache/ant/launcher/AntLoader.java
new file mode 100644
index 000000000..b61ac79bd
--- /dev/null
+++ b/proposal/myrmidon/src/java/org/apache/ant/launcher/AntLoader.java
@@ -0,0 +1,64 @@
+/*
+ * Copyright (C) The Apache Software Foundation. All rights reserved.
+ *
+ * This software is published under the terms of the Apache Software License
+ * version 1.1, a copy of which has been included with this distribution in
+ * the LICENSE file.
+ */
+package org.apache.ant.launcher;
+
+import java.lang.reflect.Method;
+import java.net.URL;
+import java.net.URLClassLoader;
+
+/**
+ * AvalonLoader is the class that bootstraps and installs the security manager.
+ *
+ * @author Peter Donald
+ */
+public final class AntLoader
+ extends URLClassLoader
+{
+ protected static AntLoader c_classLoader;
+
+ public static AntLoader getLoader()
+ {
+ if( null == c_classLoader )
+ {
+ c_classLoader = new AntLoader( new URL[ 0 ] );
+ }
+
+ return c_classLoader;
+ }
+
+ public final static void main( final String args[] )
+ throws Exception
+ {
+ final URL archive = new URL( "file:lib/myrmidon.jar" );
+ c_classLoader = new AntLoader( new URL[] { archive } );
+
+ try
+ {
+ //load class and retrieve appropriate main method.
+ final Class clazz = c_classLoader.loadClass( "org.apache.ant.Main" );
+ final Method method = clazz.getMethod( "main", new Class[] { args.getClass() } );
+
+ //kick the tires and light the fires....
+ method.invoke( null, new Object[] { args } );
+ }
+ catch( final Throwable throwable )
+ {
+ throwable.printStackTrace();
+ }
+ }
+
+ public AntLoader( final URL[] urls )
+ {
+ super( urls );
+ }
+
+ public void addURL( final URL url )
+ {
+ super.addURL( url );
+ }
+}
diff --git a/proposal/myrmidon/src/java/org/apache/ant/project/DefaultProjectEngine.java b/proposal/myrmidon/src/java/org/apache/ant/project/DefaultProjectEngine.java
index a9c2463d1..a2780c6ec 100644
--- a/proposal/myrmidon/src/java/org/apache/ant/project/DefaultProjectEngine.java
+++ b/proposal/myrmidon/src/java/org/apache/ant/project/DefaultProjectEngine.java
@@ -32,39 +32,52 @@ import org.apache.log.Logger;
public class DefaultProjectEngine
implements ProjectEngine, Initializable, Disposable
{
- protected Deployer m_deployer;
- protected TaskletRegistry m_taskletRegistry;
- protected ConverterRegistry m_converterRegistry;
- protected TaskletEngine m_taskletEngine;
- protected Logger m_logger;
-
+ protected Deployer m_deployer;
+ protected TaskletRegistry m_taskletRegistry;
+ protected ConverterRegistry m_converterRegistry;
+ protected TaskletEngine m_taskletEngine;
+ protected Logger m_logger;
+ protected ProjectListenerSupport m_listenerSupport;
+ protected DefaultComponentManager m_componentManager;
+
public void setLogger( final Logger logger )
{
m_logger = logger;
}
+ public void addProjectListener( final ProjectListener listener )
+ {
+ m_listenerSupport.addProjectListener( listener );
+ }
+
+ public void removeProjectListener( final ProjectListener listener )
+ {
+ m_listenerSupport.removeProjectListener( listener );
+ }
+
public void init()
throws Exception
{
+ m_listenerSupport = new ProjectListenerSupport();
+
m_taskletEngine = createTaskletEngine();
+ m_taskletEngine.setLogger( m_logger );
m_taskletRegistry = createTaskletRegistry();
m_converterRegistry = createConverterRegistry();
m_deployer = createDeployer();
- //final DefaultTaskletContext context = new DefaultTaskletContext();
- //m_taskletEngine.contextualize( context );
-
- final DefaultComponentManager componentManager = new DefaultComponentManager();
- componentManager.put( "org.apache.ant.tasklet.engine.TaskletRegistry",
- m_taskletRegistry );
+ m_componentManager = new DefaultComponentManager();
+ m_componentManager.put( "org.apache.ant.project.ProjectEngine", this );
+ m_componentManager.put( "org.apache.ant.tasklet.engine.TaskletRegistry",
+ m_taskletRegistry );
- componentManager.put( "org.apache.ant.convert.ConverterRegistry",
- m_converterRegistry );
+ m_componentManager.put( "org.apache.ant.convert.ConverterRegistry",
+ m_converterRegistry );
- componentManager.put( "org.apache.avalon.camelot.Deployer", m_deployer );
+ m_componentManager.put( "org.apache.avalon.camelot.Deployer", m_deployer );
- m_taskletEngine.compose( componentManager );
+ m_taskletEngine.compose( m_componentManager );
if( m_taskletEngine instanceof Initializable )
{
@@ -112,15 +125,36 @@ public class DefaultProjectEngine
public void execute( final Project project, final String target )
throws AntException
{
- m_taskletEngine.contextualize( project.getContext() );
- executeTarget( "", project.getImplicitTarget() );
+ m_componentManager.put( "org.apache.ant.project.Project", project );
+
+ final TaskletContext context = project.getContext();
+
+ final String projectName = (String)context.getProperty( Project.PROJECT );
+
+ m_listenerSupport.projectStarted( projectName );
+
+ executeTargetWork( "", project.getImplicitTarget(), context );
+
+ //context = new DefaultTaskletContext( context );
+
+ //placing logger lower (at targetlevel or at task level)
+ //is possible if you want more fine grained control
+ context.setProperty( TaskletContext.LOGGER, m_logger );
- final ArrayList done = new ArrayList();
- execute( project, target, done );
+ execute( project, target, context );
+
+ m_listenerSupport.projectFinished();
+ }
+
+ public void execute( Project project, String target, TaskletContext context )
+ throws AntException
+ {
+ execute( project, target, context, new ArrayList() );
}
protected void execute( final Project project,
final String targetName,
+ final TaskletContext context,
final ArrayList done )
throws AntException
{
@@ -139,45 +173,67 @@ public class DefaultProjectEngine
final String dependency = (String)dependencies.next();
if( !done.contains( dependency ) )
{
- execute( project, dependency, done );
+ execute( project, dependency, context, done );
}
}
- final TaskletContext context = getContextFor( project, targetName );
- m_taskletEngine.contextualize( context );
- executeTarget( targetName, target );
+ executeTarget( targetName, target, context );
}
- protected TaskletContext getContextFor( final Project project, final String targetName )
+ protected void executeTarget( final String targetName,
+ final Target target,
+ final TaskletContext context )
+ throws AntException
{
- final DefaultTaskletContext context =
- new DefaultTaskletContext( project.getContext() );
+ m_componentManager.put( "org.apache.ant.project.Target", target );
- context.setProperty( Project.TARGET, targetName );
- context.put( TaskletContext.LOGGER, m_logger );
+ final TaskletContext targetContext = new DefaultTaskletContext( context );
+ targetContext.setProperty( Project.TARGET, targetName );
+
+ m_listenerSupport.targetStarted( targetName );
- return context;
+ executeTargetWork( targetName, target, targetContext );
+
+ m_listenerSupport.targetFinished();
}
- protected void executeTarget( final String targetName, final Target target )
- throws AntException
+ protected void executeTargetWork( final String name,
+ final Target target,
+ final TaskletContext context )
{
- m_logger.debug( "Executing target " + targetName );
-
+ m_logger.debug( "Executing target " + name );
+
final Iterator tasks = target.getTasks();
while( tasks.hasNext() )
{
final Configuration task = (Configuration)tasks.next();
- executeTask( task );
+ executeTask( task, context );
}
}
- protected void executeTask( final Configuration configuration )
+ protected void executeTask( final Configuration configuration,
+ final TaskletContext context )
throws AntException
{
final String name = configuration.getName();
m_logger.debug( "Executing task " + name );
+ //Set up context for task...
+ final TaskletContext taskletContext = context;
+
+ //is Only necessary if we are multi-threaded
+ //final TaskletContext targetContext = new DefaultTaskletContext( context );
+ taskletContext.setProperty( TaskletContext.NAME, name );
+
+ m_taskletEngine.contextualize( taskletContext );
+
+ //notify listeners
+ m_listenerSupport.taskletStarted( name );
+
+ //run task
m_taskletEngine.execute( configuration );
+
+ //notify listeners task has ended
+ m_listenerSupport.taskletFinished();
}
}
diff --git a/proposal/myrmidon/src/java/org/apache/ant/project/DefaultProjectListener.java b/proposal/myrmidon/src/java/org/apache/ant/project/DefaultProjectListener.java
index 51f9e203d..d3a772eab 100644
--- a/proposal/myrmidon/src/java/org/apache/ant/project/DefaultProjectListener.java
+++ b/proposal/myrmidon/src/java/org/apache/ant/project/DefaultProjectListener.java
@@ -7,25 +7,13 @@
*/
package org.apache.ant.project;
-import org.apache.log.format.PatternFormatter;
-import org.apache.log.output.DefaultOutputLogTarget;
+import org.apache.avalon.util.StringUtil;
public class DefaultProjectListener
- extends DefaultOutputLogTarget
implements ProjectListener
{
protected String m_prefix;
- /**
- * Initialize the default pattern.
- */
- protected void initPattern()
- {
- final PatternFormatter formatrer = new PatternFormatter();
- formatrer.setFormat( "%{message}\\n%{throwable}" );
- m_formatter = formatrer;
- }
-
public void projectStarted( final String projectName )
{
output( "Starting project " + projectName + "\n" );
@@ -54,9 +42,19 @@ public class DefaultProjectListener
m_prefix = null;
}
+ public void log( String message )
+ {
+ output( message );
+ }
+
+ public void log( String message, Throwable throwable )
+ {
+ output( message + "\n" + StringUtil.printStackTrace( throwable, 5, true ) );
+ }
+
protected void output( final String data )
{
- if( null != m_prefix ) super.output( "[" + m_prefix + "] " + data );
- else super.output( data );
+ if( null != m_prefix ) System.out.println( "\t[" + m_prefix + "] " + data );
+ else System.out.println( data );
}
}
diff --git a/proposal/myrmidon/src/java/org/apache/ant/project/Project.java b/proposal/myrmidon/src/java/org/apache/ant/project/Project.java
index 88bf83eff..af9b87c13 100644
--- a/proposal/myrmidon/src/java/org/apache/ant/project/Project.java
+++ b/proposal/myrmidon/src/java/org/apache/ant/project/Project.java
@@ -10,8 +10,10 @@ package org.apache.ant.project;
import java.util.Iterator;
import org.apache.ant.AntException;
import org.apache.ant.tasklet.TaskletContext;
+import org.apache.avalon.Component;
public interface Project
+ extends Component
{
// the name of currently executing project
String PROJECT = "ant.project.name";
diff --git a/proposal/myrmidon/src/java/org/apache/ant/project/ProjectEngine.java b/proposal/myrmidon/src/java/org/apache/ant/project/ProjectEngine.java
index 04d8b5a5a..46cf41886 100644
--- a/proposal/myrmidon/src/java/org/apache/ant/project/ProjectEngine.java
+++ b/proposal/myrmidon/src/java/org/apache/ant/project/ProjectEngine.java
@@ -8,14 +8,21 @@
package org.apache.ant.project;
import org.apache.ant.AntException;
+import org.apache.ant.tasklet.TaskletContext;
+import org.apache.avalon.Component;
import org.apache.avalon.camelot.Deployer;
import org.apache.avalon.camelot.Registry;
import org.apache.log.Logger;
public interface ProjectEngine
+ extends Component
{
Deployer getDeployer();
+ void addProjectListener( ProjectListener listener );
+ void removeProjectListener( ProjectListener listener );
void setLogger( Logger logger );
void execute( Project project, String target )
throws AntException;
+ void execute( Project project, String target, TaskletContext context )
+ throws AntException;
}
diff --git a/proposal/myrmidon/src/java/org/apache/ant/project/ProjectListener.java b/proposal/myrmidon/src/java/org/apache/ant/project/ProjectListener.java
index b3b92dea9..844534f2e 100644
--- a/proposal/myrmidon/src/java/org/apache/ant/project/ProjectListener.java
+++ b/proposal/myrmidon/src/java/org/apache/ant/project/ProjectListener.java
@@ -7,10 +7,7 @@
*/
package org.apache.ant.project;
-import org.apache.log.LogTarget;
-
public interface ProjectListener
- extends LogTarget
{
void projectStarted( String projectName );
void projectFinished();
@@ -20,4 +17,7 @@ public interface ProjectListener
void taskletStarted( String taskletName );
void taskletFinished();
+
+ void log( String message );
+ void log( String message, Throwable throwable );
}
diff --git a/proposal/myrmidon/src/java/org/apache/ant/project/ProjectListenerSupport.java b/proposal/myrmidon/src/java/org/apache/ant/project/ProjectListenerSupport.java
new file mode 100644
index 000000000..f0aba8570
--- /dev/null
+++ b/proposal/myrmidon/src/java/org/apache/ant/project/ProjectListenerSupport.java
@@ -0,0 +1,110 @@
+/*
+ * Copyright (C) The Apache Software Foundation. All rights reserved.
+ *
+ * This software is published under the terms of the Apache Software License
+ * version 1.1, a copy of which has been included with this distribution in
+ * the LICENSE file.
+ */
+package org.apache.ant.project;
+
+public class ProjectListenerSupport
+ implements ProjectListener
+{
+ protected ProjectListener[] m_listeners = new ProjectListener[ 0 ];
+
+ public void addProjectListener( final ProjectListener listener )
+ {
+ final ProjectListener[] listeners = new ProjectListener[ m_listeners.length + 1 ];
+ System.arraycopy( m_listeners, 0, listeners, 0, m_listeners.length );
+ listeners[ m_listeners.length ] = listener;
+ m_listeners = listeners;
+ }
+
+ public void removeProjectListener( final ProjectListener listener )
+ {
+ int found = -1;
+
+ for( int i = 0; i < m_listeners.length; i++ )
+ {
+ if( listener == m_listeners[ i ] )
+ {
+ found = i;
+ break;
+ }
+ }
+
+ if( -1 == found ) return;
+
+ final ProjectListener[] listeners = new ProjectListener[ m_listeners.length - 1 ];
+ System.arraycopy( m_listeners, 0, listeners, 0, found );
+
+ final int count = m_listeners.length - found - 1;
+ System.arraycopy( m_listeners, found, listeners, found + 1, count );
+
+ m_listeners = listeners;
+ }
+
+ public void projectStarted( final String projectName )
+ {
+ for( int i = 0; i < m_listeners.length; i++ )
+ {
+ m_listeners[ i ].projectStarted( projectName );
+ }
+ }
+
+ public void projectFinished()
+ {
+ for( int i = 0; i < m_listeners.length; i++ )
+ {
+ m_listeners[ i ].projectFinished();
+ }
+ }
+
+ public void targetStarted( String targetName )
+ {
+ for( int i = 0; i < m_listeners.length; i++ )
+ {
+ m_listeners[ i ].targetStarted( targetName );
+ }
+ }
+
+ public void targetFinished()
+ {
+ for( int i = 0; i < m_listeners.length; i++ )
+ {
+ m_listeners[ i ].targetFinished();
+ }
+ }
+
+ public void taskletStarted( String taskletName )
+ {
+ for( int i = 0; i < m_listeners.length; i++ )
+ {
+ m_listeners[ i ].taskletStarted( taskletName );
+ }
+ }
+
+ public void taskletFinished()
+ {
+ for( int i = 0; i < m_listeners.length; i++ )
+ {
+ m_listeners[ i ].taskletFinished();
+ }
+ }
+
+ public void log( String message )
+ {
+ for( int i = 0; i < m_listeners.length; i++ )
+ {
+ m_listeners[ i ].log( message );
+ }
+ }
+
+ public void log( String message, Throwable throwable )
+ {
+ for( int i = 0; i < m_listeners.length; i++ )
+ {
+ m_listeners[ i ].log( message, throwable );
+ }
+ }
+}
diff --git a/proposal/myrmidon/src/java/org/apache/ant/project/ProjectToListenerAdapter.java b/proposal/myrmidon/src/java/org/apache/ant/project/ProjectToListenerAdapter.java
new file mode 100644
index 000000000..d9d1a8206
--- /dev/null
+++ b/proposal/myrmidon/src/java/org/apache/ant/project/ProjectToListenerAdapter.java
@@ -0,0 +1,40 @@
+/*
+ * Copyright (C) The Apache Software Foundation. All rights reserved.
+ *
+ * This software is published under the terms of the Apache Software License
+ * version 1.1, a copy of which has been included with this distribution in
+ * the LICENSE file.
+ */
+package org.apache.ant.project;
+
+import org.apache.log.LogEntry;
+import org.apache.log.LogTarget;
+
+public class ProjectToListenerAdapter
+ implements LogTarget
+{
+
+ protected final ProjectListener m_listener;
+
+ public ProjectToListenerAdapter( final ProjectListener listener )
+ {
+ m_listener = listener;
+ }
+
+ /**
+ * Process a log entry.
+ *
+ * @param entry the entry
+ */
+ public void processEntry( final LogEntry entry )
+ {
+ if( null == entry.getThrowable() )
+ {
+ m_listener.log( entry.getMessage() );
+ }
+ else
+ {
+ m_listener.log( entry.getMessage(), entry.getThrowable() );
+ }
+ }
+}
diff --git a/proposal/myrmidon/src/java/org/apache/ant/project/Target.java b/proposal/myrmidon/src/java/org/apache/ant/project/Target.java
index f86c5e901..1697f98c9 100644
--- a/proposal/myrmidon/src/java/org/apache/ant/project/Target.java
+++ b/proposal/myrmidon/src/java/org/apache/ant/project/Target.java
@@ -8,8 +8,10 @@
package org.apache.ant.project;
import java.util.Iterator;
+import org.apache.avalon.Component;
public interface Target
+ extends Component
{
Iterator getDependencies();
Iterator getTasks();
diff --git a/proposal/myrmidon/src/java/org/apache/ant/tasklet/engine/DefaultTaskletEngine.java b/proposal/myrmidon/src/java/org/apache/ant/tasklet/engine/DefaultTaskletEngine.java
index 9dc964946..2e095b6ed 100644
--- a/proposal/myrmidon/src/java/org/apache/ant/tasklet/engine/DefaultTaskletEngine.java
+++ b/proposal/myrmidon/src/java/org/apache/ant/tasklet/engine/DefaultTaskletEngine.java
@@ -40,10 +40,14 @@ public class DefaultTaskletEngine
protected TaskletConfigurer m_configurer;
protected Logger m_logger;
+ public void setLogger( final Logger logger )
+ {
+ m_logger = logger;
+ }
+
public void contextualize( final Context context )
{
m_context = (TaskletContext)context;
- m_logger = m_context.getLogger();
}
public void compose( final ComponentManager componentManager )
diff --git a/proposal/myrmidon/src/java/org/apache/ant/tasklet/engine/TaskletEngine.java b/proposal/myrmidon/src/java/org/apache/ant/tasklet/engine/TaskletEngine.java
index cf2d576ce..139a88776 100644
--- a/proposal/myrmidon/src/java/org/apache/ant/tasklet/engine/TaskletEngine.java
+++ b/proposal/myrmidon/src/java/org/apache/ant/tasklet/engine/TaskletEngine.java
@@ -11,10 +11,12 @@ import org.apache.ant.AntException;
import org.apache.ant.configuration.Configuration;
import org.apache.avalon.Composer;
import org.apache.avalon.Contextualizable;
+import org.apache.log.Logger;
public interface TaskletEngine
extends Contextualizable, Composer
{
+ void setLogger( Logger logger );
void execute( final Configuration task )
throws AntException;
}
diff --git a/proposal/myrmidon/src/java/org/apache/ant/tasklet/engine/TskDeployer.java b/proposal/myrmidon/src/java/org/apache/ant/tasklet/engine/TskDeployer.java
index ed76ccb23..d93973279 100644
--- a/proposal/myrmidon/src/java/org/apache/ant/tasklet/engine/TskDeployer.java
+++ b/proposal/myrmidon/src/java/org/apache/ant/tasklet/engine/TskDeployer.java
@@ -138,6 +138,9 @@ public class TskDeployer
key + " due to " + re,
re );
}
+
+ m_logger.debug( "Registered converter " + key + " that converts from " +
+ source + " to " + destination );
}
}
@@ -158,6 +161,8 @@ public class TskDeployer
throw new DeploymentException( "Error registering " + key + " due to " + re,
re );
}
+
+ m_logger.debug( "Registered tasklet " + key + " as " + value );
}
}
diff --git a/proposal/myrmidon/src/java/org/apache/ant/tasks/core/AntCall.java b/proposal/myrmidon/src/java/org/apache/ant/tasks/core/AntCall.java
new file mode 100644
index 000000000..b0c019bac
--- /dev/null
+++ b/proposal/myrmidon/src/java/org/apache/ant/tasks/core/AntCall.java
@@ -0,0 +1,77 @@
+/*
+ * Copyright (C) The Apache Software Foundation. All rights reserved.
+ *
+ * This software is published under the terms of the Apache Software License
+ * version 1.1, a copy of which has been included with this distribution in
+ * the LICENSE file.
+ */
+package org.apache.ant.tasks.core;
+
+import java.util.ArrayList;
+import org.apache.ant.AntException;
+import org.apache.ant.project.ProjectEngine;
+import org.apache.ant.project.Project;
+import org.apache.ant.tasklet.AbstractTasklet;
+import org.apache.ant.tasklet.DefaultTaskletContext;
+import org.apache.ant.tasklet.TaskletContext;
+import org.apache.avalon.ComponentManager;
+import org.apache.avalon.ComponentNotAccessibleException;
+import org.apache.avalon.ComponentNotFoundException;
+import org.apache.avalon.Composer;
+
+/**
+ * This is abstract base class for tasklets.
+ *
+ * @author Peter Donald
+ */
+public class AntCall
+ extends AbstractTasklet
+ implements Composer
+{
+ protected ProjectEngine m_projectEngine;
+ protected Project m_project;
+ protected String m_target;
+ protected ArrayList m_properties = new ArrayList();
+
+ public void compose( final ComponentManager componentManager )
+ throws ComponentNotFoundException, ComponentNotAccessibleException
+ {
+ m_projectEngine = (ProjectEngine)componentManager.
+ lookup( "org.apache.ant.project.ProjectEngine" );
+ m_project = (Project)componentManager.lookup( "org.apache.ant.project.Project" );
+ }
+
+ public void setTarget( final String target )
+ {
+ m_target = target;
+ }
+
+ public Property createParam()
+ {
+ final Property property = new Property();
+ m_properties.add( property );
+ return property;
+ }
+
+ public void run()
+ throws AntException
+ {
+ if( null == m_target )
+ {
+ throw new AntException( "Target attribute must be specified" );
+ }
+
+ final TaskletContext context = new DefaultTaskletContext( getContext() );
+
+ final int size = m_properties.size();
+ for( int i = 0; i < size; i++ )
+ {
+ final Property property = (Property)m_properties.get( i );
+ property.contextualize( context );
+ property.run();
+ }
+
+ getLogger().info( "Calling target " + m_target );
+ m_projectEngine.execute( m_project, m_target, context );
+ }
+}
diff --git a/proposal/myrmidon/src/java/org/apache/ant/tasks/core/ConfigurationTest.java b/proposal/myrmidon/src/java/org/apache/ant/tasks/core/ConfigurationTest.java
index 5d18585ef..6b5c30545 100644
--- a/proposal/myrmidon/src/java/org/apache/ant/tasks/core/ConfigurationTest.java
+++ b/proposal/myrmidon/src/java/org/apache/ant/tasks/core/ConfigurationTest.java
@@ -42,6 +42,6 @@ public class ConfigurationTest
public void run()
throws AntException
{
- getLogger().info( m_message );
+ getLogger().warn( m_message );
}
}
diff --git a/proposal/myrmidon/src/java/org/apache/ant/tasks/core/ContentTest.java b/proposal/myrmidon/src/java/org/apache/ant/tasks/core/ContentTest.java
index 08faf803a..4d2b21cc6 100644
--- a/proposal/myrmidon/src/java/org/apache/ant/tasks/core/ContentTest.java
+++ b/proposal/myrmidon/src/java/org/apache/ant/tasks/core/ContentTest.java
@@ -20,7 +20,7 @@ public class ContentTest
{
public void addContent( final Integer value )
{
- getLogger().info( "Integer content: " + value );
+ getLogger().warn( "Integer content: " + value );
}
/*
diff --git a/proposal/myrmidon/src/java/org/apache/ant/tasks/core/Echo.java b/proposal/myrmidon/src/java/org/apache/ant/tasks/core/Echo.java
index 0d5d918e0..193fd6c55 100644
--- a/proposal/myrmidon/src/java/org/apache/ant/tasks/core/Echo.java
+++ b/proposal/myrmidon/src/java/org/apache/ant/tasks/core/Echo.java
@@ -28,6 +28,6 @@ public class Echo
public void run()
throws AntException
{
- getLogger().info( m_message );
+ getLogger().warn( m_message );
}
}
diff --git a/proposal/myrmidon/src/java/org/apache/ant/tasks/core/PrimitiveTypesTest.java b/proposal/myrmidon/src/java/org/apache/ant/tasks/core/PrimitiveTypesTest.java
index 121e0f3ff..08509c177 100644
--- a/proposal/myrmidon/src/java/org/apache/ant/tasks/core/PrimitiveTypesTest.java
+++ b/proposal/myrmidon/src/java/org/apache/ant/tasks/core/PrimitiveTypesTest.java
@@ -20,67 +20,67 @@ public class PrimitiveTypesTest
{
public void setInteger( final Integer value )
{
- getLogger().info( "setInteger( " + value + " );" );
+ getLogger().warn( "setInteger( " + value + " );" );
}
public void setInteger2( final int value )
{
- getLogger().info( "setInteger2( " + value + " );" );
+ getLogger().warn( "setInteger2( " + value + " );" );
}
public void setShort( final Short value )
{
- getLogger().info( "setShort( " + value + " );" );
+ getLogger().warn( "setShort( " + value + " );" );
}
public void setShort2( final short value )
{
- getLogger().info( "setShort2( " + value + " );" );
+ getLogger().warn( "setShort2( " + value + " );" );
}
public void setByte( final Byte value )
{
- getLogger().info( "setByte( " + value + " );" );
+ getLogger().warn( "setByte( " + value + " );" );
}
public void setByte2( final byte value )
{
- getLogger().info( "setByte2( " + value + " );" );
+ getLogger().warn( "setByte2( " + value + " );" );
}
public void setLong( final Long value )
{
- getLogger().info( "setLong( " + value + " );" );
+ getLogger().warn( "setLong( " + value + " );" );
}
public void setLong2( final long value )
{
- getLogger().info( "setLong2( " + value + " );" );
+ getLogger().warn( "setLong2( " + value + " );" );
}
public void setFloat( final Float value )
{
- getLogger().info( "setFloat( " + value + " );" );
+ getLogger().warn( "setFloat( " + value + " );" );
}
public void setFloat2( final float value )
{
- getLogger().info( "setFloat2( " + value + " );" );
+ getLogger().warn( "setFloat2( " + value + " );" );
}
public void setDouble( final Double value )
{
- getLogger().info( "setDouble( " + value + " );" );
+ getLogger().warn( "setDouble( " + value + " );" );
}
public void setDouble2( final double value )
{
- getLogger().info( "setDouble2( " + value + " );" );
+ getLogger().warn( "setDouble2( " + value + " );" );
}
public void setString( final String value )
{
- getLogger().info( "setString( " + value + " );" );
+ getLogger().warn( "setString( " + value + " );" );
}
public void run()
diff --git a/proposal/myrmidon/src/java/org/apache/ant/tasks/core/RegisterTasklet.java b/proposal/myrmidon/src/java/org/apache/ant/tasks/core/RegisterTasklet.java
new file mode 100644
index 000000000..99595e65e
--- /dev/null
+++ b/proposal/myrmidon/src/java/org/apache/ant/tasks/core/RegisterTasklet.java
@@ -0,0 +1,102 @@
+/*
+ * Copyright (C) The Apache Software Foundation. All rights reserved.
+ *
+ * This software is published under the terms of the Apache Software License
+ * version 1.1, a copy of which has been included with this distribution in
+ * the LICENSE file.
+ */
+package org.apache.ant.tasks.core;
+
+import java.io.File;
+import java.net.MalformedURLException;
+import java.net.URL;
+import org.apache.ant.AntException;
+import org.apache.ant.tasklet.AbstractTasklet;
+import org.apache.ant.tasklet.engine.DefaultTaskletInfo;
+import org.apache.ant.tasklet.engine.TaskletRegistry;
+import org.apache.avalon.ComponentManager;
+import org.apache.avalon.ComponentNotAccessibleException;
+import org.apache.avalon.ComponentNotFoundException;
+import org.apache.avalon.Composer;
+import org.apache.avalon.camelot.RegistryException;
+
+/**
+ * Method to register a single tasklet.
+ *
+ * @author Peter Donald
+ */
+public class RegisterTasklet
+ extends AbstractTasklet
+ implements Composer
+{
+ protected TaskletRegistry m_taskletRegistry;
+ protected String m_tasklib;
+ protected String m_taskName;
+ protected String m_classname;
+
+ public void compose( final ComponentManager componentManager )
+ throws ComponentNotFoundException, ComponentNotAccessibleException
+ {
+ m_taskletRegistry = (TaskletRegistry)componentManager.
+ lookup( "org.apache.ant.tasklet.engine.TaskletRegistry" );
+ }
+
+ public void setTaskLib( final String tasklib )
+ {
+ m_tasklib = tasklib;
+ }
+
+ public void setTaskName( final String taskName )
+ {
+ m_taskName = taskName;
+ }
+
+ public void setClassname( final String classname )
+ {
+ m_classname = classname;
+ }
+
+ public void run()
+ throws AntException
+ {
+ if( null == m_tasklib )
+ {
+ throw new AntException( "Must specify tasklib parameter" );
+ }
+
+ if( null == m_taskName )
+ {
+ throw new AntException( "Must specify taskname parameter" );
+ }
+
+ if( null == m_classname )
+ {
+ m_classname = getDefaultClassName();
+ }
+
+ try
+ {
+ final File tasklib = new File( getContext().resolveFilename( m_tasklib ) );
+ final URL url = tasklib.toURL();
+
+ final DefaultTaskletInfo info = new DefaultTaskletInfo( m_classname, url );
+
+ m_taskletRegistry.register( m_taskName, info );
+ }
+ catch( final MalformedURLException mue )
+ {
+ throw new AntException( "Malformed task-lib parameter " + m_tasklib, mue );
+ }
+ catch( final RegistryException re )
+ {
+ throw new AntException( "Error registering " + m_taskName + " due to " + re, re );
+ }
+ }
+
+ protected String getDefaultClassName()
+ throws AntException
+ {
+ //TODO:
+ throw new AntException( "Not yet capable of automagically finding classname" );
+ }
+}
diff --git a/proposal/myrmidon/src/java/org/apache/ant/tasks/core/taskdefs.properties b/proposal/myrmidon/src/java/org/apache/ant/tasks/core/taskdefs.properties
index f3476cfb9..73f28858e 100644
--- a/proposal/myrmidon/src/java/org/apache/ant/tasks/core/taskdefs.properties
+++ b/proposal/myrmidon/src/java/org/apache/ant/tasks/core/taskdefs.properties
@@ -4,4 +4,6 @@ prim-test=org.apache.ant.tasks.core.PrimitiveTypesTest
sub-elements-test=org.apache.ant.tasks.core.SubElementTest
conf-test=org.apache.ant.tasks.core.ConfigurationTest
content-test=org.apache.ant.tasks.core.ContentTest
-property=org.apache.ant.tasks.core.Property
\ No newline at end of file
+property=org.apache.ant.tasks.core.Property
+register-tasklet=org.apache.ant.tasks.core.RegisterTasklet
+ant-call=org.apache.ant.tasks.core.AntCall
\ No newline at end of file
diff --git a/proposal/myrmidon/src/make/sample.xmk b/proposal/myrmidon/src/make/sample.xmk
index db04135d8..79467fdf2 100644
--- a/proposal/myrmidon/src/make/sample.xmk
+++ b/proposal/myrmidon/src/make/sample.xmk
@@ -58,7 +58,17 @@ Legal:
+
+
+
+
+
+
+
+
diff --git a/proposal/myrmidon/src/manifest/ant-manifest.mf b/proposal/myrmidon/src/manifest/ant-manifest.mf
new file mode 100644
index 000000000..13658dff5
--- /dev/null
+++ b/proposal/myrmidon/src/manifest/ant-manifest.mf
@@ -0,0 +1,3 @@
+Manifest-Version: 1.0
+Main-Class: org.apache.ant.launcher.AntLoader
+Created-By: Apache Ant Project
\ No newline at end of file
diff --git a/proposal/myrmidon/src/manifest/myrmidon-manifest.mf b/proposal/myrmidon/src/manifest/myrmidon-manifest.mf
new file mode 100644
index 000000000..54d5fd052
--- /dev/null
+++ b/proposal/myrmidon/src/manifest/myrmidon-manifest.mf
@@ -0,0 +1,4 @@
+Manifest-Version: 1.0
+Main-Class: org.apache.ant.Main
+Class-Path: avalonapi.jar
+Created-By: Apache Ant Project
\ No newline at end of file
diff --git a/proposal/myrmidon/src/script/ant b/proposal/myrmidon/src/script/ant
index 9667d7de9..d215b85a8 100644
--- a/proposal/myrmidon/src/script/ant
+++ b/proposal/myrmidon/src/script/ant
@@ -6,7 +6,6 @@ fi
# Cygwin support.
if [ "$OSTYPE" == "cygwin32" ] || [ "$OSTYPE" = "cygwin" ]; then
-
if [ ! "$JAVA_HOME" = "" ]; then
JAVA_HOME=`cygpath --path --unix $JAVA_HOME`
fi
@@ -28,31 +27,19 @@ done
ANT_HOME=`dirname "$PRG"`/..
-# Allow .antrc to specifiy flags to java cmd
-if [ "$JAVACMD" = "" ] ; then
- JAVACMD=java
-fi
-
-LOCALCLASSPATH=`echo $ANT_HOME/lib/*.jar | tr ' ' ':'`
+if [ "$JAVA_HOME" == "" ] ; then
-if [ "$CLASSPATH" != "" ] ; then
- LOCALCLASSPATH=$CLASSPATH:$LOCALCLASSPATH
-fi
-
-if [ "$JAVA_HOME" != "" ] ; then
- if test -f $JAVA_HOME/lib/tools.jar ; then
- LOCALCLASSPATH=$LOCALCLASSPATH:$JAVA_HOME/lib/tools.jar
- fi
-else
echo "Warning: JAVA_HOME environment variable is not set."
echo " If build fails because sun.* classes could not be found"
echo " you will need to set the JAVA_HOME environment variable"
echo " to the installation directory of java."
+ if [ "$JAVACMD" = "" ] ; then
+ JAVACMD=java
+ fi
+else
+ if [ "$JAVACMD" = "" ] ; then
+ JAVACMD=$JAVA_HOME/bin/java
+ fi
fi
-# More Cygwin support
-if [ "$OSTYPE" == "cygwin32" ] || [ "$OSTYPE" = "cygwin" ] ; then
- LOCALCLASSPATH=`cygpath --path --windows "$LOCALCLASSPATH"`
-fi
-
-$JAVACMD -classpath $LOCALCLASSPATH $ANT_OPTS org.apache.ant.Main --ant-home=${ANT_HOME} $@
\ No newline at end of file
+$JAVACMD $ANT_OPTS -jar ant.jar --ant-home=${ANT_HOME} $@
\ No newline at end of file
diff --git a/proposal/myrmidon/src/script/ant.bat b/proposal/myrmidon/src/script/ant.bat
index af3a91dc9..41a315a9d 100644
--- a/proposal/myrmidon/src/script/ant.bat
+++ b/proposal/myrmidon/src/script/ant.bat
@@ -1,8 +1,8 @@
@echo off
-:checkJava
-if "%JAVACMD%" == "" set JAVACMD=%JAVA_HOME%\bin\java
-if not "%JAVA_HOME%" == "" goto setupClasspath
+if exist "%HOME%\antrc_pre.bat" call "%HOME%\antrc_pre.bat"
+
+if not "%JAVA_HOME%" == "" goto javaCmdSetup
echo.
echo Warning: JAVA_HOME environment variable is not set.
@@ -12,11 +12,17 @@ echo to the installation directory of java.
echo.
goto end
-:setupClasspath
-set LOCALCLASSPATH=lib\xerces.jar;lib\ant.jar;lib\avalonapi.jar;%JAVA_HOME%\lib\tools.jar
+rem hope that there is java command in path
+if "%JAVACMD%" == "" set JAVACMD=java
+goto argSetup
-set THIS_FILE=%0
+rem if JAVA_HOME is set then make sure we use that java exe
+:javaCmdSetup
+if "%JAVACMD%" == "" set JAVACMD=%JAVA_HOME%\bin\java
+
+:argSetup
+set THIS_FILE=%0
set ANT_CMD_LINE_ARGS=
rem Slurp all args...
@@ -29,7 +35,9 @@ goto setupArgs
:doneArgs
rem Mmmmmm tasty - finished slurping args
-%JAVACMD% -classpath "%LOCALCLASSPATH%" %ANT_OPTS% org.apache.ant.Main "--bin-dir=%THIS_FILE%" %ANT_CMD_LINE_ARGS%
+%JAVACMD% %ANT_OPTS% -jar lib\ant.jar "--bin-dir=%THIS_FILE%" %ANT_CMD_LINE_ARGS%
:end
-set LOCALCLASSPATH=
\ No newline at end of file
+if exist "%HOME%\antrc_post.bat" call "%HOME%\antrc_post.bat"
+set THIS_FILE=
+set ANT_CMD_LINE_ARGS=
\ No newline at end of file