Browse Source

Continued developing myrmidon

* simplified logging interface to be independent of org.apache.log
* made it so that you no longer need to build a classpath and hand it to ant!!!
* added ant-call task


git-svn-id: https://svn.apache.org/repos/asf/ant/core/trunk@268306 13f79535-47bb-0310-9956-ffa450edef68
master
Peter Donald 24 years ago
parent
commit
1d3dc3765d
28 changed files with 647 additions and 138 deletions
  1. +21
    -3
      proposal/myrmidon/build.xml
  2. BIN
      proposal/myrmidon/lib/avalonapi.jar
  3. +38
    -31
      proposal/myrmidon/src/java/org/apache/ant/Main.java
  4. +3
    -2
      proposal/myrmidon/src/java/org/apache/ant/convert/DefaultConverterLoader.java
  5. +64
    -0
      proposal/myrmidon/src/java/org/apache/ant/launcher/AntLoader.java
  6. +92
    -36
      proposal/myrmidon/src/java/org/apache/ant/project/DefaultProjectEngine.java
  7. +13
    -15
      proposal/myrmidon/src/java/org/apache/ant/project/DefaultProjectListener.java
  8. +2
    -0
      proposal/myrmidon/src/java/org/apache/ant/project/Project.java
  9. +7
    -0
      proposal/myrmidon/src/java/org/apache/ant/project/ProjectEngine.java
  10. +3
    -3
      proposal/myrmidon/src/java/org/apache/ant/project/ProjectListener.java
  11. +110
    -0
      proposal/myrmidon/src/java/org/apache/ant/project/ProjectListenerSupport.java
  12. +40
    -0
      proposal/myrmidon/src/java/org/apache/ant/project/ProjectToListenerAdapter.java
  13. +2
    -0
      proposal/myrmidon/src/java/org/apache/ant/project/Target.java
  14. +5
    -1
      proposal/myrmidon/src/java/org/apache/ant/tasklet/engine/DefaultTaskletEngine.java
  15. +2
    -0
      proposal/myrmidon/src/java/org/apache/ant/tasklet/engine/TaskletEngine.java
  16. +5
    -0
      proposal/myrmidon/src/java/org/apache/ant/tasklet/engine/TskDeployer.java
  17. +77
    -0
      proposal/myrmidon/src/java/org/apache/ant/tasks/core/AntCall.java
  18. +1
    -1
      proposal/myrmidon/src/java/org/apache/ant/tasks/core/ConfigurationTest.java
  19. +1
    -1
      proposal/myrmidon/src/java/org/apache/ant/tasks/core/ContentTest.java
  20. +1
    -1
      proposal/myrmidon/src/java/org/apache/ant/tasks/core/Echo.java
  21. +13
    -13
      proposal/myrmidon/src/java/org/apache/ant/tasks/core/PrimitiveTypesTest.java
  22. +102
    -0
      proposal/myrmidon/src/java/org/apache/ant/tasks/core/RegisterTasklet.java
  23. +3
    -1
      proposal/myrmidon/src/java/org/apache/ant/tasks/core/taskdefs.properties
  24. +10
    -0
      proposal/myrmidon/src/make/sample.xmk
  25. +3
    -0
      proposal/myrmidon/src/manifest/ant-manifest.mf
  26. +4
    -0
      proposal/myrmidon/src/manifest/myrmidon-manifest.mf
  27. +9
    -22
      proposal/myrmidon/src/script/ant
  28. +16
    -8
      proposal/myrmidon/src/script/ant.bat

+ 21
- 3
proposal/myrmidon/build.xml View File

@@ -156,11 +156,13 @@ Legal:
optimize="${optimize}"
deprecation="${deprecation}" />

<!--
<copy todir="${build.classes}">
<fileset dir="${build.src}">
<exclude name="**/*.properties"/>
<include name="**/*.properties"/>
</fileset>
</copy>
-->

<mkdir dir="${build.classes}/TASK-LIB"/>
<copy file="${build.src}/org/apache/ant/tasks/core/taskdefs.properties"
@@ -175,8 +177,24 @@ Legal:
===================================================================
-->
<target name="jar-ant" depends="compile">
<jar jarfile="${build.lib}/ant.jar" basedir="${build.classes}">
<jar jarfile="${build.lib}/ant.jar"
basedir="${build.classes}"
manifest="${manifest.dir}/ant-manifest.mf">
<include name="org/apache/ant/launcher/*" />
</jar>
</target>

<!--
===================================================================
Creates the myrmidon.jar file
===================================================================
-->
<target name="jar-myrmidon" depends="compile">
<jar jarfile="${build.lib}/myrmidon.jar"
basedir="${build.classes}"
manifest="${manifest.dir}/myrmidon-manifest.mf">
<include name="org/apache/ant/**" />
<exclude name="org/apache/ant/launcher/*" />
<exclude name="org/apache/ant/tasks/**" />
<exclude name="org/apache/ant/convert/core/**" />
</jar>
@@ -200,7 +218,7 @@ Legal:
Creates the distribution
===================================================================
-->
<target name="dist" depends="jar-ant,jar-core">
<target name="dist" depends="jar-ant,jar-core,jar-myrmidon">
<mkdir dir="${dist.dir}"/>
<mkdir dir="${dist.bin}"/>
<mkdir dir="${dist.lib}"/>


BIN
proposal/myrmidon/lib/avalonapi.jar View File


+ 38
- 31
proposal/myrmidon/src/java/org/apache/ant/Main.java View File

@@ -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 );
}


+ 3
- 2
proposal/myrmidon/src/java/org/apache/ant/convert/DefaultConverterLoader.java View File

@@ -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 )


+ 64
- 0
proposal/myrmidon/src/java/org/apache/ant/launcher/AntLoader.java View File

@@ -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 <a href="mailto:donaldp@apache.org">Peter Donald</a>
*/
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 );
}
}

+ 92
- 36
proposal/myrmidon/src/java/org/apache/ant/project/DefaultProjectEngine.java View File

@@ -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( "<init>", 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( "<init>", 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();
}
}

+ 13
- 15
proposal/myrmidon/src/java/org/apache/ant/project/DefaultProjectListener.java View File

@@ -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 );
}
}

+ 2
- 0
proposal/myrmidon/src/java/org/apache/ant/project/Project.java View File

@@ -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";


+ 7
- 0
proposal/myrmidon/src/java/org/apache/ant/project/ProjectEngine.java View File

@@ -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;
}

+ 3
- 3
proposal/myrmidon/src/java/org/apache/ant/project/ProjectListener.java View File

@@ -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 );
}

+ 110
- 0
proposal/myrmidon/src/java/org/apache/ant/project/ProjectListenerSupport.java View File

@@ -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 );
}
}
}

+ 40
- 0
proposal/myrmidon/src/java/org/apache/ant/project/ProjectToListenerAdapter.java View File

@@ -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() );
}
}
}

+ 2
- 0
proposal/myrmidon/src/java/org/apache/ant/project/Target.java View File

@@ -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();


+ 5
- 1
proposal/myrmidon/src/java/org/apache/ant/tasklet/engine/DefaultTaskletEngine.java View File

@@ -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 )


+ 2
- 0
proposal/myrmidon/src/java/org/apache/ant/tasklet/engine/TaskletEngine.java View File

@@ -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;
}

+ 5
- 0
proposal/myrmidon/src/java/org/apache/ant/tasklet/engine/TskDeployer.java View File

@@ -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 );
}
}



+ 77
- 0
proposal/myrmidon/src/java/org/apache/ant/tasks/core/AntCall.java View File

@@ -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 <a href="mailto:donaldp@apache.org">Peter Donald</a>
*/
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 );
}
}

+ 1
- 1
proposal/myrmidon/src/java/org/apache/ant/tasks/core/ConfigurationTest.java View File

@@ -42,6 +42,6 @@ public class ConfigurationTest
public void run()
throws AntException
{
getLogger().info( m_message );
getLogger().warn( m_message );
}
}

+ 1
- 1
proposal/myrmidon/src/java/org/apache/ant/tasks/core/ContentTest.java View File

@@ -20,7 +20,7 @@ public class ContentTest
{
public void addContent( final Integer value )
{
getLogger().info( "Integer content: " + value );
getLogger().warn( "Integer content: " + value );
}

/*


+ 1
- 1
proposal/myrmidon/src/java/org/apache/ant/tasks/core/Echo.java View File

@@ -28,6 +28,6 @@ public class Echo
public void run()
throws AntException
{
getLogger().info( m_message );
getLogger().warn( m_message );
}
}

+ 13
- 13
proposal/myrmidon/src/java/org/apache/ant/tasks/core/PrimitiveTypesTest.java View File

@@ -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()


+ 102
- 0
proposal/myrmidon/src/java/org/apache/ant/tasks/core/RegisterTasklet.java View File

@@ -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 <a href="mailto:donaldp@apache.org">Peter Donald</a>
*/
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" );
}
}

+ 3
- 1
proposal/myrmidon/src/java/org/apache/ant/tasks/core/taskdefs.properties View File

@@ -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
property=org.apache.ant.tasks.core.Property
register-tasklet=org.apache.ant.tasks.core.RegisterTasklet
ant-call=org.apache.ant.tasks.core.AntCall

+ 10
- 0
proposal/myrmidon/src/make/sample.xmk View File

@@ -58,7 +58,17 @@ Legal:
<property name="blah" value="fred" />
<property name="${blah}" value="barney" />

<register-tasklet task-lib="../../dist/lib/core.tsk"
task-name="echo2"
classname="org.apache.ant.tasks.core.Echo" />

<echo message="Doing the funky Echo with ${blah} ${fred} Year=${year}!"/>
<echo2 message="Luke to Echo base. Can you hear me?"/>

<ant-call target="property-test2">
<param name="blah" value="blah-value" />
</ant-call>

</target>

<target name="property-test2">


+ 3
- 0
proposal/myrmidon/src/manifest/ant-manifest.mf View File

@@ -0,0 +1,3 @@
Manifest-Version: 1.0
Main-Class: org.apache.ant.launcher.AntLoader
Created-By: Apache Ant Project

+ 4
- 0
proposal/myrmidon/src/manifest/myrmidon-manifest.mf View File

@@ -0,0 +1,4 @@
Manifest-Version: 1.0
Main-Class: org.apache.ant.Main
Class-Path: avalonapi.jar
Created-By: Apache Ant Project

+ 9
- 22
proposal/myrmidon/src/script/ant View File

@@ -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} $@
$JAVACMD $ANT_OPTS -jar ant.jar --ant-home=${ANT_HOME} $@

+ 16
- 8
proposal/myrmidon/src/script/ant.bat View File

@@ -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=
if exist "%HOME%\antrc_post.bat" call "%HOME%\antrc_post.bat"
set THIS_FILE=
set ANT_CMD_LINE_ARGS=

Loading…
Cancel
Save