diff --git a/proposal/myrmidon/lib/avalonapi.jar b/proposal/myrmidon/lib/avalonapi.jar
index fdf0857cf..acd6ca71e 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 59aa2a7f8..8446af2e7 100644
--- a/proposal/myrmidon/src/java/org/apache/ant/Main.java
+++ b/proposal/myrmidon/src/java/org/apache/ant/Main.java
@@ -30,9 +30,10 @@ 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.ant.tasklet.engine.TaskletEngine;
+import org.apache.ant.tasklet.engine.TskDeployer;
import org.apache.avalon.Disposable;
import org.apache.avalon.Initializable;
-import org.apache.avalon.camelot.Deployer;
import org.apache.avalon.camelot.DeploymentException;
import org.apache.avalon.util.ObjectUtil;
import org.apache.avalon.util.StringUtil;
@@ -241,7 +242,7 @@ public class Main
* @param clOptions the list of command line options
*/
protected void execute( final List clOptions )
- throws Throwable
+ throws Exception
{
final int size = clOptions.size();
final ArrayList targets = new ArrayList();
@@ -384,7 +385,7 @@ public class Main
final ExtensionFileFilter filter = new ExtensionFileFilter( ".tsk" );
final File[] files = taskLibDirectory.listFiles( filter );
- final Deployer deployer = engine.getDeployer();
+ final TskDeployer deployer = engine.getTaskletEngine().getTskDeployer();
for( int i = 0; i < files.length; i++ )
{
diff --git a/proposal/myrmidon/src/java/org/apache/ant/convert/Converter.java b/proposal/myrmidon/src/java/org/apache/ant/convert/Converter.java
index bcbdfcb33..91f2d37c8 100644
--- a/proposal/myrmidon/src/java/org/apache/ant/convert/Converter.java
+++ b/proposal/myrmidon/src/java/org/apache/ant/convert/Converter.java
@@ -25,5 +25,5 @@ public interface Converter
* @exception Exception if an error occurs
*/
Object convert( Class destination, Object original )
- throws Exception;
+ throws ConverterException, Exception;
}
diff --git a/proposal/myrmidon/src/java/org/apache/ant/convert/ConverterEngine.java b/proposal/myrmidon/src/java/org/apache/ant/convert/ConverterEngine.java
new file mode 100644
index 000000000..fc946e132
--- /dev/null
+++ b/proposal/myrmidon/src/java/org/apache/ant/convert/ConverterEngine.java
@@ -0,0 +1,20 @@
+/*
+ * 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.convert;
+
+import org.apache.avalon.Component;
+import org.apache.log.Logger;
+
+public interface ConverterEngine
+ extends Component, Converter
+{
+ void setLogger( Logger logger );
+
+ ConverterRegistry getConverterRegistry();
+ ConverterFactory getConverterFactory();
+}
diff --git a/proposal/myrmidon/src/java/org/apache/ant/convert/ConverterException.java b/proposal/myrmidon/src/java/org/apache/ant/convert/ConverterException.java
new file mode 100644
index 000000000..9ccd7aed7
--- /dev/null
+++ b/proposal/myrmidon/src/java/org/apache/ant/convert/ConverterException.java
@@ -0,0 +1,41 @@
+/*
+ * 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.convert;
+
+import org.apache.ant.AntException;
+
+/**
+ * ConverterException thrown when a problem occurs during convertion etc.
+ *
+ * @author Peter Donald
+ */
+public class ConverterException
+ extends AntException
+{
+ /**
+ * Basic constructor with a message
+ *
+ * @param message the message
+ */
+ public ConverterException( final String message )
+ {
+ this( message, null );
+ }
+
+ /**
+ * Constructor that builds cascade so that other exception information can be retained.
+ *
+ * @param message the message
+ * @param throwable the throwable
+ */
+ public ConverterException( final String message, final Throwable throwable )
+ {
+ super( message, throwable );
+ }
+}
+
diff --git a/proposal/myrmidon/src/java/org/apache/ant/convert/DefaultConverterEngine.java b/proposal/myrmidon/src/java/org/apache/ant/convert/DefaultConverterEngine.java
new file mode 100644
index 000000000..31e650436
--- /dev/null
+++ b/proposal/myrmidon/src/java/org/apache/ant/convert/DefaultConverterEngine.java
@@ -0,0 +1,72 @@
+/*
+ * 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.convert;
+
+import org.apache.ant.AntException;
+import org.apache.avalon.Component;
+import org.apache.avalon.Initializable;
+import org.apache.log.Logger;
+
+public class DefaultConverterEngine
+ implements ConverterEngine, Initializable
+{
+ protected ConverterFactory m_converterFactory;
+ protected ConverterRegistry m_converterRegistry;
+ protected Logger m_logger;
+
+ public void setLogger( final Logger logger )
+ {
+ m_logger = logger;
+ }
+
+ public ConverterRegistry getConverterRegistry()
+ {
+ return m_converterRegistry;
+ }
+
+ public ConverterFactory getConverterFactory()
+ {
+ return m_converterFactory;
+ }
+
+ public void init()
+ throws Exception
+ {
+ m_converterRegistry = createConverterRegistry();
+ m_converterFactory = createConverterFactory();
+ }
+
+ protected ConverterRegistry createConverterRegistry()
+ {
+ return new DefaultConverterRegistry();
+ }
+
+ protected ConverterFactory createConverterFactory()
+ {
+ return new DefaultConverterFactory();
+ }
+
+ public Object convert( Class destination, final Object original )
+ throws Exception
+ {
+ final ConverterInfo info =
+ m_converterRegistry.getConverterInfo( original.getClass().getName(),
+ destination.getName() );
+
+ if( null == info )
+ {
+ throw new ConverterException( "Unable to find converter for " +
+ original.getClass() + " to " + destination +
+ " conversion" );
+ }
+
+ final ConverterEntry entry = m_converterFactory.create( info );
+ final Converter converter = entry.getConverter();
+ return converter.convert( destination, original );
+ }
+}
diff --git a/proposal/myrmidon/src/java/org/apache/ant/convert/core/StringToClassConverter.java b/proposal/myrmidon/src/java/org/apache/ant/convert/core/StringToClassConverter.java
new file mode 100644
index 000000000..99d6b568a
--- /dev/null
+++ b/proposal/myrmidon/src/java/org/apache/ant/convert/core/StringToClassConverter.java
@@ -0,0 +1,31 @@
+/*
+ * 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.convert.core;
+
+import org.apache.ant.convert.AbstractConverter;
+
+/**
+ * String to class converter
+ *
+ * @author Peter Donald
+ */
+public class StringToClassConverter
+ extends AbstractConverter
+{
+ public StringToClassConverter()
+ {
+ super( String.class, Class.class );
+ }
+
+ public Object convert( final Object original )
+ throws Exception
+ {
+ return Class.forName( (String)original );
+ }
+}
+
diff --git a/proposal/myrmidon/src/java/org/apache/ant/convert/core/StringToURLConverter.java b/proposal/myrmidon/src/java/org/apache/ant/convert/core/StringToURLConverter.java
new file mode 100644
index 000000000..ce262e182
--- /dev/null
+++ b/proposal/myrmidon/src/java/org/apache/ant/convert/core/StringToURLConverter.java
@@ -0,0 +1,32 @@
+/*
+ * 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.convert.core;
+
+import java.net.URL;
+import org.apache.ant.convert.AbstractConverter;
+
+/**
+ * String to url converter
+ *
+ * @author Peter Donald
+ */
+public class StringToURLConverter
+ extends AbstractConverter
+{
+ public StringToURLConverter()
+ {
+ super( String.class, URL.class );
+ }
+
+ public Object convert( final Object original )
+ throws Exception
+ {
+ return new URL( (String)original );
+ }
+}
+
diff --git a/proposal/myrmidon/src/java/org/apache/ant/convert/core/converters.properties b/proposal/myrmidon/src/java/org/apache/ant/convert/core/converters.properties
index 52c6bb2a5..f40d2ce4c 100644
--- a/proposal/myrmidon/src/java/org/apache/ant/convert/core/converters.properties
+++ b/proposal/myrmidon/src/java/org/apache/ant/convert/core/converters.properties
@@ -4,3 +4,5 @@ org.apache.ant.convert.core.StringToShortConverter=java.lang.String, java.lang.S
org.apache.ant.convert.core.StringToByteConverter=java.lang.String, java.lang.Byte
org.apache.ant.convert.core.StringToDoubleConverter=java.lang.String, java.lang.Double
org.apache.ant.convert.core.StringToFloatConverter=java.lang.String, java.lang.Float
+org.apache.ant.convert.core.StringToClassConverter=java.lang.String, java.lang.Class
+org.apache.ant.convert.core.StringToURLConverter=java.lang.String, java.net.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 8628a3844..e6374c897 100644
--- a/proposal/myrmidon/src/java/org/apache/ant/project/DefaultProjectEngine.java
+++ b/proposal/myrmidon/src/java/org/apache/ant/project/DefaultProjectEngine.java
@@ -11,31 +11,19 @@ import java.util.ArrayList;
import java.util.Iterator;
import org.apache.ant.AntException;
import org.apache.ant.configuration.Configuration;
-import org.apache.ant.convert.ConverterRegistry;
-import org.apache.ant.convert.DefaultConverterRegistry;
import org.apache.ant.tasklet.DefaultTaskletContext;
import org.apache.ant.tasklet.TaskletContext;
import org.apache.ant.tasklet.engine.DefaultTaskletEngine;
-import org.apache.ant.tasklet.engine.DefaultTaskletInfo;
-import org.apache.ant.tasklet.engine.DefaultTaskletRegistry;
import org.apache.ant.tasklet.engine.TaskletEngine;
-import org.apache.ant.tasklet.engine.TaskletRegistry;
-import org.apache.ant.tasklet.engine.TskDeployer;
import org.apache.avalon.Composer;
import org.apache.avalon.DefaultComponentManager;
import org.apache.avalon.Disposable;
import org.apache.avalon.Initializable;
-import org.apache.avalon.camelot.Deployer;
-import org.apache.avalon.camelot.DeploymentException;
-import org.apache.avalon.camelot.RegistryException;
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 ProjectListenerSupport m_listenerSupport;
@@ -61,15 +49,13 @@ public class DefaultProjectEngine
{
m_listenerSupport = new ProjectListenerSupport();
- m_taskletRegistry = createTaskletRegistry();
- m_converterRegistry = createConverterRegistry();
- m_deployer = createDeployer();
-
setupTaskletEngine();
m_componentManager = new DefaultComponentManager();
m_componentManager.put( "org.apache.ant.project.ProjectEngine", this );
m_componentManager.put( "org.apache.ant.tasklet.engine.TaskletEngine", m_taskletEngine );
+ m_componentManager.put( "org.apache.ant.convert.ConverterEngine",
+ m_taskletEngine.getConverterEngine() );
}
public void dispose()
@@ -81,9 +67,9 @@ public class DefaultProjectEngine
}
}
- public Deployer getDeployer()
+ public TaskletEngine getTaskletEngine()
{
- return m_deployer;
+ return m_taskletEngine;
}
protected void setupTaskletEngine()
@@ -92,17 +78,6 @@ public class DefaultProjectEngine
m_taskletEngine = createTaskletEngine();
m_taskletEngine.setLogger( m_logger );
- if( m_taskletEngine instanceof Composer )
- {
- final DefaultComponentManager componentManager = new DefaultComponentManager();
- componentManager.put( "org.apache.ant.tasklet.engine.TaskletRegistry",
- m_taskletRegistry );
- componentManager.put( "org.apache.ant.convert.ConverterRegistry",
- m_converterRegistry );
-
- ((Composer)m_taskletEngine).compose( componentManager );
- }
-
if( m_taskletEngine instanceof Initializable )
{
((Initializable)m_taskletEngine).init();
@@ -114,24 +89,6 @@ public class DefaultProjectEngine
return new DefaultTaskletEngine();
}
- protected TaskletRegistry createTaskletRegistry()
- {
- return new DefaultTaskletRegistry();
- }
-
- protected ConverterRegistry createConverterRegistry()
- {
- return new DefaultConverterRegistry();
- }
-
- protected Deployer createDeployer()
- {
- final TskDeployer deployer =
- new TskDeployer( m_taskletRegistry, m_converterRegistry );
- deployer.setLogger( m_logger );
- return deployer;
- }
-
public void execute( final Project project, final String target )
throws AntException
{
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 46cf41886..6cba6d91f 100644
--- a/proposal/myrmidon/src/java/org/apache/ant/project/ProjectEngine.java
+++ b/proposal/myrmidon/src/java/org/apache/ant/project/ProjectEngine.java
@@ -9,20 +9,23 @@ package org.apache.ant.project;
import org.apache.ant.AntException;
import org.apache.ant.tasklet.TaskletContext;
+import org.apache.ant.tasklet.engine.TaskletEngine;
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 setLogger( Logger logger );
+
+ TaskletEngine getTaskletEngine();
+
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/tasklet/engine/DefaultTaskletConfigurer.java b/proposal/myrmidon/src/java/org/apache/ant/tasklet/engine/DefaultTaskletConfigurer.java
index d69b38246..4ff181bd2 100644
--- a/proposal/myrmidon/src/java/org/apache/ant/tasklet/engine/DefaultTaskletConfigurer.java
+++ b/proposal/myrmidon/src/java/org/apache/ant/tasklet/engine/DefaultTaskletConfigurer.java
@@ -14,10 +14,7 @@ import java.util.Iterator;
import org.apache.ant.configuration.Configurable;
import org.apache.ant.configuration.Configuration;
import org.apache.ant.convert.Converter;
-import org.apache.ant.convert.ConverterEntry;
-import org.apache.ant.convert.ConverterFactory;
-import org.apache.ant.convert.ConverterInfo;
-import org.apache.ant.convert.ConverterRegistry;
+import org.apache.ant.convert.ConverterException;
import org.apache.ant.tasklet.Tasklet;
import org.apache.avalon.ComponentManager;
import org.apache.avalon.ComponentNotAccessibleException;
@@ -25,7 +22,6 @@ import org.apache.avalon.ComponentNotFoundException;
import org.apache.avalon.Composer;
import org.apache.avalon.ConfigurationException;
import org.apache.avalon.Context;
-import org.apache.avalon.camelot.FactoryException;
import org.apache.avalon.util.PropertyException;
import org.apache.avalon.util.PropertyUtil;
@@ -47,16 +43,12 @@ public class DefaultTaskletConfigurer
"content"
};
- protected ConverterRegistry m_converterRegistry;
- protected ConverterFactory m_converterFactory;
+ protected Converter m_converter;
public void compose( final ComponentManager componentManager )
throws ComponentNotFoundException, ComponentNotAccessibleException
{
- m_converterRegistry = (ConverterRegistry)componentManager.
- lookup( "org.apache.ant.convert.ConverterRegistry" );
- m_converterFactory = (ConverterFactory)componentManager.
- lookup( "org.apache.ant.convert.ConverterFactory" );
+ m_converter = (Converter)componentManager.lookup( "org.apache.ant.convert.Converter" );
}
/**
@@ -240,23 +232,13 @@ public class DefaultTaskletConfigurer
if( !parameterType.isAssignableFrom( sourceClass ) )
{
- final String destination = parameterType.getName();
-
try
{
- final ConverterInfo info = m_converterRegistry.
- getConverterInfo( source, destination );
-
- if( null == info ) return false;
-
- final ConverterEntry entry = m_converterFactory.create( info );
- final Converter converter = entry.getConverter();
- value = converter.convert( parameterType, value );
+ value = m_converter.convert( parameterType, object );
}
- catch( final FactoryException fe )
+ catch( final ConverterException ce )
{
- throw new ConfigurationException( "Badly configured ConverterFactory ",
- fe );
+ return false;
}
catch( final Exception e )
{
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 6a540f125..02d381881 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
@@ -11,14 +11,13 @@ import java.util.HashMap;
import org.apache.ant.AntException;
import org.apache.ant.configuration.Configurable;
import org.apache.ant.configuration.Configuration;
+import org.apache.ant.convert.ConverterEngine;
import org.apache.ant.convert.ConverterFactory;
-import org.apache.ant.convert.ConverterRegistry;
import org.apache.ant.tasklet.Tasklet;
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.Component;
import org.apache.avalon.Composer;
+import org.apache.avalon.ComponentManager;
import org.apache.avalon.Context;
import org.apache.avalon.Contextualizable;
import org.apache.avalon.DefaultComponentManager;
@@ -29,76 +28,102 @@ import org.apache.avalon.camelot.RegistryException;
import org.apache.log.Logger;
public class DefaultTaskletEngine
- implements TaskletEngine, Initializable, Composer
+ implements TaskletEngine, Initializable
{
+ protected TskDeployer m_tskDeployer;
protected TaskletFactory m_taskletFactory;
- protected ConverterFactory m_converterFactory;
protected TaskletRegistry m_taskletRegistry;
- protected ConverterRegistry m_converterRegistry;
protected TaskletConfigurer m_configurer;
protected Logger m_logger;
+ protected ConverterEngine m_converterEngine;
public void setLogger( final Logger logger )
{
m_logger = logger;
}
- public void compose( final ComponentManager componentManager )
- throws ComponentNotFoundException, ComponentNotAccessibleException
+ public TskDeployer getTskDeployer()
{
- m_taskletRegistry = (TaskletRegistry)componentManager.
- lookup( "org.apache.ant.tasklet.engine.TaskletRegistry" );
- m_converterRegistry = (ConverterRegistry)componentManager.
- lookup( "org.apache.ant.convert.ConverterRegistry" );
+ return m_tskDeployer;
}
- public TaskletRegistry getTaskletRegistry()
+ public ConverterEngine getConverterEngine()
{
- return m_taskletRegistry;
+ return m_converterEngine;
}
- public ConverterRegistry getConverterRegistry()
+ public TaskletRegistry getTaskletRegistry()
{
- return m_converterRegistry;
+ return m_taskletRegistry;
}
public void init()
throws Exception
{
+ m_taskletRegistry = createTaskletRegistry();
m_taskletFactory = createTaskletFactory();
- m_converterFactory = createConverterFactory();
+
+ m_converterEngine = createConverterEngine();
+ m_converterEngine.setLogger( m_logger );
+ setupSubComponent( m_converterEngine );
+
m_configurer = createTaskletConfigurer();
+ setupSubComponent( m_configurer );
- if( m_configurer instanceof Composer )
+ m_tskDeployer = createTskDeployer();
+ m_tskDeployer.setLogger( m_logger );
+ setupSubComponent( m_tskDeployer );
+ }
+
+ protected void setupSubComponent( final Component component )
+ throws Exception
+ {
+ if( component instanceof Composer )
{
final DefaultComponentManager componentManager = new DefaultComponentManager();
- componentManager.put( "org.apache.ant.convert.ConverterFactory",
- m_converterFactory );
- componentManager.put( "org.apache.ant.convert.ConverterRegistry",
- m_converterRegistry );
+ componentManager.put( "org.apache.ant.convert.Converter",
+ getConverterEngine() );
+ componentManager.put( "org.apache.ant.convert.ConverterEngine",
+ getConverterEngine() );
+ componentManager.put( "org.apache.ant.tasklet.engine.TaskletEngine",
+ this );
- ((Composer)m_configurer).compose( componentManager );
+ ((Composer)component).compose( componentManager );
}
-
- if( m_configurer instanceof Initializable )
+
+ if( component instanceof Initializable )
{
- ((Initializable)m_configurer).init();
+ ((Initializable)component).init();
}
}
+
+ protected TskDeployer createTskDeployer()
+ {
+ return new DefaultTskDeployer();
+ }
protected TaskletConfigurer createTaskletConfigurer()
{
return new DefaultTaskletConfigurer();
}
-
+
+ protected TaskletRegistry createTaskletRegistry()
+ {
+ return new DefaultTaskletRegistry();
+ }
+
protected TaskletFactory createTaskletFactory()
{
return new DefaultTaskletFactory();
}
-
- protected ConverterFactory createConverterFactory()
+
+ protected ConverterEngine createConverterEngine()
{
- return (ConverterFactory)m_taskletFactory;
+ //this is done so that the loaders are shared
+ //which results in much less overhead
+ final TaskletConverterEngine engine = new TaskletConverterEngine();
+ engine.setConverterFactory( (ConverterFactory)m_taskletFactory );
+ return engine;
}
public void execute( final Configuration task,
diff --git a/proposal/myrmidon/src/java/org/apache/ant/tasklet/engine/DefaultTskDeployer.java b/proposal/myrmidon/src/java/org/apache/ant/tasklet/engine/DefaultTskDeployer.java
new file mode 100644
index 000000000..261add19c
--- /dev/null
+++ b/proposal/myrmidon/src/java/org/apache/ant/tasklet/engine/DefaultTskDeployer.java
@@ -0,0 +1,309 @@
+/*
+ * 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.tasklet.engine;
+
+import java.io.File;
+import java.io.IOException;
+import java.net.MalformedURLException;
+import java.net.URL;
+import java.util.Enumeration;
+import java.util.Properties;
+import java.util.zip.ZipEntry;
+import java.util.zip.ZipException;
+import java.util.zip.ZipFile;
+import org.apache.ant.convert.ConverterEngine;
+import org.apache.ant.convert.ConverterRegistry;
+import org.apache.ant.convert.DefaultConverterInfo;
+import org.apache.ant.tasklet.engine.DefaultTaskletInfo;
+import org.apache.avalon.Component;
+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.AbstractDeployer;
+import org.apache.avalon.camelot.DeploymentException;
+import org.apache.avalon.camelot.RegistryException;
+import org.apache.log.Logger;
+
+/**
+ * This class deploys a .tsk file into a registry.
+ *
+ * @author Peter Donald
+ */
+public class DefaultTskDeployer
+ extends AbstractDeployer
+ implements Composer, TskDeployer
+{
+ protected final static String TASKDEF_FILE = "TASK-LIB/taskdefs.properties";
+ protected final static String CONVERTER_FILE = "TASK-LIB/converters.properties";
+
+ protected TaskletRegistry m_taskletRegistry;
+ protected ConverterRegistry m_converterRegistry;
+
+ /**
+ * Default constructor.
+ */
+ public DefaultTskDeployer()
+ {
+ m_autoUndeploy = true;
+ m_type = "Tasklet";
+ }
+
+ /**
+ * Retrieve relevent services needed to deploy.
+ *
+ * @param componentManager the ComponentManager
+ * @exception ComponentNotFoundException if an error occurs
+ * @exception ComponentNotAccessibleException if an error occurs
+ */
+ public void compose( final ComponentManager componentManager )
+ throws ComponentNotFoundException, ComponentNotAccessibleException
+ {
+ final ConverterEngine converterEngine = (ConverterEngine)componentManager.
+ lookup( "org.apache.ant.convert.ConverterEngine" );
+
+ m_converterRegistry = converterEngine.getConverterRegistry();
+
+ final TaskletEngine taskletEngine = (TaskletEngine)componentManager.
+ lookup( "org.apache.ant.tasklet.engine.TaskletEngine" );
+
+ m_taskletRegistry = taskletEngine.getTaskletRegistry();
+ }
+
+ public void setLogger( final Logger logger )
+ {
+ m_logger = logger;
+ }
+
+ protected boolean isValidLocation( final String location )
+ {
+ //TODO: Make sure it is valid JavaIdentifier
+ //that optionally has '-' embedded in it
+ return true;
+ }
+
+ /**
+ * Deploy Tasklets from a .tsk file.
+ * Eventually this should be cached for performance reasons.
+ *
+ * @param location the location
+ * @param file the file
+ * @exception DeploymentException if an error occurs
+ */
+ protected void deployFromFile( final String location, final File file )
+ throws DeploymentException
+ {
+ m_logger.info( "Deploying .tsk file (" + file + ") as " + location );
+
+ final ZipFile zipFile = getZipFileFor( file );
+
+ try
+ {
+ final Properties taskdefs = loadProperties( zipFile, TASKDEF_FILE );
+ final Properties converters = loadProperties( zipFile, CONVERTER_FILE );
+
+ try { zipFile.close(); }
+ catch( final IOException ioe ) {}
+
+ URL url = null;
+
+ try { url = file.toURL(); }
+ catch( final MalformedURLException mue ) {}
+
+ handleTasklets( taskdefs, url );
+ handleConverters( converters, url );
+ }
+ catch( final DeploymentException de )
+ {
+ try { zipFile.close(); }
+ catch( final IOException ioe ) {}
+
+ throw de;
+ }
+ }
+
+ public void deployConverter( String name, String location, URL url )
+ throws DeploymentException
+ {
+ checkDeployment( location, url );
+ final ZipFile zipFile = getZipFileFor( url );
+ final Properties converters = loadProperties( zipFile, CONVERTER_FILE );
+ final String value = converters.getProperty( name );
+
+ if( null == value )
+ {
+ throw new DeploymentException( "Unable to locate converter named " + name );
+ }
+
+ handleConverter( name, value, url );
+ }
+
+ public void deployTasklet( final String name, final String location, final URL url )
+ throws DeploymentException
+ {
+ checkDeployment( location, url );
+ final ZipFile zipFile = getZipFileFor( url );
+ final Properties tasklets = loadProperties( zipFile, TASKDEF_FILE );
+ final String value = tasklets.getProperty( name );
+
+ if( null == value )
+ {
+ throw new DeploymentException( "Unable to locate tasklet named " + name );
+ }
+
+ handleTasklet( name, value, url );
+ }
+
+ protected ZipFile getZipFileFor( final URL url )
+ throws DeploymentException
+ {
+ final File file = getFileFor( url );
+ return getZipFileFor( file );
+ }
+
+ protected ZipFile getZipFileFor( final File file )
+ throws DeploymentException
+ {
+ try { return new ZipFile( file ); }
+ catch( final IOException ioe )
+ {
+ throw new DeploymentException( "Error opening " + file +
+ " due to " + ioe.getMessage(),
+ ioe );
+ }
+ }
+
+ /**
+ * Create and register Infos for all converters stored in deployment.
+ *
+ * @param properties the properties
+ * @param url the url of deployment
+ * @exception DeploymentException if an error occurs
+ */
+ protected void handleConverters( final Properties properties, final URL url )
+ throws DeploymentException
+ {
+ final Enumeration enum = properties.propertyNames();
+
+ while( enum.hasMoreElements() )
+ {
+ final String key = (String)enum.nextElement();
+ final String value = (String)properties.get( key );
+
+ handleConverter( key, value, url );
+ }
+ }
+
+ protected void handleConverter( final String name, final String param, final URL url )
+ throws DeploymentException
+ {
+ final int index = param.indexOf( ',' );
+
+ if( -1 == index )
+ {
+ throw new DeploymentException( "Malformed converter definition (" + name + ")" );
+ }
+
+ final String source = param.substring( 0, index ).trim();
+ final String destination = param.substring( index + 1 ).trim();
+
+ final DefaultConverterInfo info =
+ new DefaultConverterInfo( source, destination, name, url );
+
+ try { m_converterRegistry.register( name, info ); }
+ catch( final RegistryException re )
+ {
+ throw new DeploymentException( "Error registering converter " +
+ name + " due to " + re,
+ re );
+ }
+
+ m_logger.debug( "Registered converter " + name + " that converts from " +
+ source + " to " + destination );
+ }
+
+ /**
+ * Create and register Infos for all tasklets stored in deployment.
+ *
+ * @param properties the properties
+ * @param url the url of deployment
+ * @exception DeploymentException if an error occurs
+ */
+ protected void handleTasklets( final Properties properties, final URL url )
+ throws DeploymentException
+ {
+ final Enumeration enum = properties.propertyNames();
+
+ while( enum.hasMoreElements() )
+ {
+ final String key = (String)enum.nextElement();
+ final String value = (String)properties.get( key );
+ handleTasklet( key, value, url );
+ }
+ }
+
+ protected void handleTasklet( final String name, final String classname, final URL url )
+ throws DeploymentException
+ {
+ final DefaultTaskletInfo info = new DefaultTaskletInfo( classname, url );
+
+ try { m_taskletRegistry.register( name, info ); }
+ catch( final RegistryException re )
+ {
+ throw new DeploymentException( "Error registering " + name + " due to " + re,
+ re );
+ }
+
+ m_logger.debug( "Registered tasklet " + name + " as " + classname );
+ }
+
+ /**
+ * Utility method to load properties from zip.
+ *
+ * @param zipFile the zip file
+ * @param filename the property filename
+ * @return the Properties
+ * @exception DeploymentException if an error occurs
+ */
+ protected Properties loadProperties( final ZipFile zipFile, final String filename )
+ throws DeploymentException
+ {
+ final ZipEntry entry = zipFile.getEntry( filename );
+ if( null == entry )
+ {
+ throw new DeploymentException( "Unable to locate " + filename +
+ " in " + zipFile.getName() );
+ }
+
+ Properties properties = new Properties();
+
+ try
+ {
+ properties.load( zipFile.getInputStream( entry ) );
+ }
+ catch( final IOException ioe )
+ {
+ throw new DeploymentException( "Error reading " + filename +
+ " from " + zipFile.getName(),
+ ioe );
+ }
+
+ return properties;
+ }
+
+ protected boolean canUndeploy( final Component component )
+ throws DeploymentException
+ {
+ return true;
+ }
+
+ protected void shutdownDeployment( final Component component )
+ throws DeploymentException
+ {
+ }
+}
diff --git a/proposal/myrmidon/src/java/org/apache/ant/tasklet/engine/TaskletConfigurer.java b/proposal/myrmidon/src/java/org/apache/ant/tasklet/engine/TaskletConfigurer.java
index d9621e9b8..725f78473 100644
--- a/proposal/myrmidon/src/java/org/apache/ant/tasklet/engine/TaskletConfigurer.java
+++ b/proposal/myrmidon/src/java/org/apache/ant/tasklet/engine/TaskletConfigurer.java
@@ -9,6 +9,7 @@ package org.apache.ant.tasklet.engine;
import org.apache.ant.configuration.Configuration;
import org.apache.ant.tasklet.Tasklet;
+import org.apache.avalon.Component;
import org.apache.avalon.ConfigurationException;
import org.apache.avalon.Context;
@@ -18,6 +19,7 @@ import org.apache.avalon.Context;
* @author Peter Donald
*/
public interface TaskletConfigurer
+ extends Component
{
/**
* Configure a task based on a configuration in a particular context.
diff --git a/proposal/myrmidon/src/java/org/apache/ant/tasklet/engine/TaskletConverterEngine.java b/proposal/myrmidon/src/java/org/apache/ant/tasklet/engine/TaskletConverterEngine.java
new file mode 100644
index 000000000..c623a2016
--- /dev/null
+++ b/proposal/myrmidon/src/java/org/apache/ant/tasklet/engine/TaskletConverterEngine.java
@@ -0,0 +1,29 @@
+/*
+ * 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.tasklet.engine;
+
+import org.apache.ant.convert.ConverterFactory;
+import org.apache.ant.convert.DefaultConverterEngine;
+
+public class TaskletConverterEngine
+ extends DefaultConverterEngine
+{
+ /**
+ * Set the ConverterFactory.
+ * Package access intended.
+ */
+ void setConverterFactory( final ConverterFactory converterFactory )
+ {
+ m_converterFactory = converterFactory;
+ }
+
+ protected ConverterFactory createConverterFactory()
+ {
+ return m_converterFactory;
+ }
+}
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 1210bd172..516786c22 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
@@ -9,12 +9,10 @@ package org.apache.ant.tasklet.engine;
import org.apache.ant.AntException;
import org.apache.ant.configuration.Configuration;
-import org.apache.ant.convert.ConverterRegistry;
+import org.apache.ant.convert.ConverterEngine;
import org.apache.ant.tasklet.TaskletContext;
import org.apache.avalon.Component;
import org.apache.avalon.ComponentManager;
-import org.apache.avalon.Composer;
-import org.apache.avalon.Contextualizable;
import org.apache.log.Logger;
/**
@@ -26,6 +24,13 @@ public interface TaskletEngine
extends Component
{
void setLogger( Logger logger );
+
+ /**
+ * Retrieve deployer for engine.
+ *
+ * @return the deployer
+ */
+ TskDeployer getTskDeployer();
/**
* Retrieve tasklet registry associated with engine.
@@ -35,11 +40,11 @@ public interface TaskletEngine
TaskletRegistry getTaskletRegistry();
/**
- * Retrieve converter registry associated with engine.
+ * Retrieve converter engine.
*
- * @return the ConverterRegistry
+ * @return the ConverterEngine
*/
- ConverterRegistry getConverterRegistry();
+ ConverterEngine getConverterEngine();
/**
* execute a task.
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 d93973279..b7acad9d6 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
@@ -7,22 +7,9 @@
*/
package org.apache.ant.tasklet.engine;
-import java.io.File;
-import java.io.IOException;
-import java.net.MalformedURLException;
import java.net.URL;
-import java.util.Enumeration;
-import java.util.Properties;
-import java.util.zip.ZipEntry;
-import java.util.zip.ZipException;
-import java.util.zip.ZipFile;
-import org.apache.ant.tasklet.engine.DefaultTaskletInfo;
-import org.apache.ant.convert.ConverterRegistry;
-import org.apache.ant.convert.DefaultConverterInfo;
-import org.apache.avalon.Component;
-import org.apache.avalon.camelot.AbstractDeployer;
+import org.apache.avalon.camelot.Deployer;
import org.apache.avalon.camelot.DeploymentException;
-import org.apache.avalon.camelot.RegistryException;
import org.apache.log.Logger;
/**
@@ -30,176 +17,14 @@ import org.apache.log.Logger;
*
* @author Peter Donald
*/
-public class TskDeployer
- extends AbstractDeployer
+public interface TskDeployer
+ extends Deployer
{
- protected final static String TASKDEF_FILE = "TASK-LIB/taskdefs.properties";
- protected final static String CONVERTER_FILE = "TASK-LIB/converters.properties";
+ void setLogger( Logger logger );
- protected TaskletRegistry m_taskletRegistry;
- protected ConverterRegistry m_converterRegistry;
-
- public TskDeployer( final TaskletRegistry taskletRegistry,
- final ConverterRegistry converterRegistry )
- {
- m_taskletRegistry = taskletRegistry;
- m_converterRegistry = converterRegistry;
- m_autoUndeploy = true;
- m_type = "Tasklet";
- }
-
- public void setLogger( final Logger logger )
- {
- m_logger = logger;
- }
-
- protected boolean isValidLocation( final String location )
- {
- //TODO: Make sure it is valid JavaIdentifier
- //that optionally has '-' embedded in it
- return true;
- }
-
- /**
- * Deploy Tasklets from a .tsk file.
- * Eventually this should be cached for performance reasons.
- *
- * @param location the location
- * @param file the file
- * @exception DeploymentException if an error occurs
- */
- protected void deployFromFile( final String location, final File file )
- throws DeploymentException
- {
- m_logger.info( "Deploying .tsk file (" + file + ") as " + location );
-
- ZipFile zipFile = null;
-
- try { zipFile = new ZipFile( file ); }
- catch( final IOException ioe )
- {
- throw new DeploymentException( "Error opening " + file +
- " due to " + ioe.getMessage(),
- ioe );
- }
-
- try
- {
- final Properties taskdefs = loadProperties( zipFile, TASKDEF_FILE );
- final Properties converters = loadProperties( zipFile, CONVERTER_FILE );
-
- try { zipFile.close(); }
- catch( final IOException ioe ) {}
-
- URL url = null;
-
- try { url = file.toURL(); }
- catch( final MalformedURLException mue ) {}
-
- handleTaskdefs( taskdefs, url );
- handleConverters( converters, url );
- }
- catch( final DeploymentException de )
- {
- try { zipFile.close(); }
- catch( final IOException ioe ) {}
-
- throw de;
- }
- }
-
- protected void handleConverters( final Properties properties, final URL url )
- throws DeploymentException
- {
- final Enumeration enum = properties.propertyNames();
-
- while( enum.hasMoreElements() )
- {
- final String key = (String)enum.nextElement();
- final String value = (String)properties.get( key );
- final int index = value.indexOf( ',' );
-
- if( -1 == index )
- {
- throw new DeploymentException( "Malformed converter definition (" +
- key + ")" );
- }
-
- final String source = value.substring( 0, index ).trim();
- final String destination = value.substring( index + 1 ).trim();
-
- final DefaultConverterInfo info =
- new DefaultConverterInfo( source, destination, key, url );
-
- try { m_converterRegistry.register( key, info ); }
- catch( final RegistryException re )
- {
- throw new DeploymentException( "Error registering converter " +
- key + " due to " + re,
- re );
- }
-
- m_logger.debug( "Registered converter " + key + " that converts from " +
- source + " to " + destination );
- }
- }
-
- protected void handleTaskdefs( final Properties properties, final URL url )
- throws DeploymentException
- {
- final Enumeration enum = properties.propertyNames();
-
- while( enum.hasMoreElements() )
- {
- final String key = (String)enum.nextElement();
- final String value = (String)properties.get( key );
- final DefaultTaskletInfo info = new DefaultTaskletInfo( value, url );
-
- try { m_taskletRegistry.register( key, info ); }
- catch( final RegistryException re )
- {
- throw new DeploymentException( "Error registering " + key + " due to " + re,
- re );
- }
-
- m_logger.debug( "Registered tasklet " + key + " as " + value );
- }
- }
-
- protected Properties loadProperties( final ZipFile zipFile, final String filename )
- throws DeploymentException
- {
- final ZipEntry entry = zipFile.getEntry( filename );
- if( null == entry )
- {
- throw new DeploymentException( "Unable to locate " + filename +
- " in " + zipFile.getName() );
- }
-
- Properties properties = new Properties();
-
- try
- {
- properties.load( zipFile.getInputStream( entry ) );
- }
- catch( final IOException ioe )
- {
- throw new DeploymentException( "Error reading " + filename +
- " from " + zipFile.getName(),
- ioe );
- }
-
- return properties;
- }
-
- protected boolean canUndeploy( final Component component )
- throws DeploymentException
- {
- return true;
- }
+ void deployConverter( String name, String location, URL url )
+ throws DeploymentException;
- protected void shutdownDeployment( final Component component )
- throws DeploymentException
- {
- }
+ void deployTasklet( String name, String location, URL url )
+ throws DeploymentException;
}
diff --git a/proposal/myrmidon/src/java/org/apache/ant/tasks/core/AbstractResourceRegisterer.java b/proposal/myrmidon/src/java/org/apache/ant/tasks/core/AbstractResourceRegisterer.java
new file mode 100644
index 000000000..d695e54f7
--- /dev/null
+++ b/proposal/myrmidon/src/java/org/apache/ant/tasks/core/AbstractResourceRegisterer.java
@@ -0,0 +1,103 @@
+/*
+ * 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.TaskletEngine;
+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 abstract class AbstractResourceRegisterer
+ extends AbstractTasklet
+ implements Composer
+{
+ protected String m_lib;
+ protected String m_name;
+ protected String m_classname;
+ protected TaskletEngine m_engine;
+
+ public void compose( final ComponentManager componentManager )
+ throws ComponentNotFoundException, ComponentNotAccessibleException
+ {
+ m_engine = (TaskletEngine)componentManager.
+ lookup( "org.apache.ant.tasklet.engine.TaskletEngine" );
+ }
+
+ public void setLib( final String lib )
+ {
+ m_lib = lib;
+ }
+
+ public void setName( final String name )
+ {
+ m_name = name;
+ }
+
+ public void setClassname( final String classname )
+ {
+ m_classname = classname;
+ }
+
+ public void run()
+ throws AntException
+ {
+ if( null == m_name )
+ {
+ throw new AntException( "Must specify name parameter" );
+ }
+ else if( null == m_lib && null == m_classname )
+ {
+ throw new AntException( "Must specify classname if you don't specify " +
+ "lib parameter" );
+ }
+
+ final URL url = getURL( m_lib );
+
+ try
+ {
+ registerResource( m_name, m_classname, url );
+ }
+ catch( final RegistryException re )
+ {
+ throw new AntException( "Error registering resource", re );
+ }
+ }
+
+ protected URL getURL( final String libName )
+ {
+ if( null != libName )
+ {
+ final File lib = new File( getContext().resolveFilename( libName ) );
+ try { return lib.toURL(); }
+ catch( final MalformedURLException mue )
+ {
+ throw new AntException( "Malformed task-lib parameter " + m_lib, mue );
+ }
+ }
+ else
+ {
+ return null;
+ }
+ }
+
+ protected abstract void registerResource( String name, String classname, URL url )
+ throws AntException, RegistryException;
+}
diff --git a/proposal/myrmidon/src/java/org/apache/ant/tasks/core/RegisterConverter.java b/proposal/myrmidon/src/java/org/apache/ant/tasks/core/RegisterConverter.java
new file mode 100644
index 000000000..35544fccc
--- /dev/null
+++ b/proposal/myrmidon/src/java/org/apache/ant/tasks/core/RegisterConverter.java
@@ -0,0 +1,139 @@
+/*
+ * 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.URL;
+import java.net.MalformedURLException;
+import org.apache.ant.AntException;
+import org.apache.ant.convert.DefaultConverterInfo;
+import org.apache.ant.convert.ConverterEngine;
+import org.apache.ant.tasklet.AbstractTasklet;
+import org.apache.ant.tasklet.engine.TaskletEngine;
+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.DeploymentException;
+import org.apache.avalon.camelot.RegistryException;
+
+/**
+ * Method to register a single converter.
+ *
+ * @author Peter Donald
+ */
+public class RegisterConverter
+ extends AbstractTasklet
+ implements Composer
+{
+ protected String m_sourceType;
+ protected String m_destinationType;
+ protected String m_lib;
+ protected String m_classname;
+ protected TaskletEngine m_engine;
+
+ public void compose( final ComponentManager componentManager )
+ throws ComponentNotFoundException, ComponentNotAccessibleException
+ {
+ m_engine = (TaskletEngine)componentManager.
+ lookup( "org.apache.ant.tasklet.engine.TaskletEngine" );
+ }
+
+ public void setLib( final String lib )
+ {
+ m_lib = lib;
+ }
+
+ public void setClassname( final String classname )
+ {
+ m_classname = classname;
+ }
+
+ public void setSourceType( final String sourceType )
+ {
+ m_sourceType = sourceType;
+ }
+
+ public void setDestinationType( final String destinationType )
+ {
+ m_destinationType = destinationType;
+ }
+
+ public void run()
+ throws AntException
+ {
+ if( null == m_classname )
+ {
+ throw new AntException( "Must specify classname parameter" );
+ }
+
+ final URL url = getURL( m_lib );
+
+ boolean isFullyDefined = true;
+
+ if( null == m_sourceType && null == m_destinationType )
+ {
+ isFullyDefined = false;
+ }
+ else if( null == m_sourceType || null == m_destinationType )
+ {
+ throw new AntException( "Must specify the source-type and destination-type " +
+ "parameters when supplying a name" );
+ }
+
+ if( !isFullyDefined && null == url )
+ {
+ throw new AntException( "Must supply parameter if not fully specifying converter" );
+ }
+
+ if( !isFullyDefined )
+ {
+ try
+ {
+ m_engine.getTskDeployer().deployConverter( m_classname, url.toString(), url );
+ }
+ catch( final DeploymentException de )
+ {
+ throw new AntException( "Failed deploying " + m_classname +
+ " from " + url, de );
+ }
+ }
+ else
+ {
+ final DefaultConverterInfo info =
+ new DefaultConverterInfo( m_sourceType, m_destinationType, m_classname, url );
+
+ try
+ {
+ m_engine.getConverterEngine().
+ getConverterRegistry().register( m_classname, info );
+ }
+ catch( final RegistryException re )
+ {
+ throw new AntException( "Error registering resource", re );
+ }
+ }
+ }
+
+ protected URL getURL( final String libName )
+ {
+ if( null != libName )
+ {
+ final File lib = new File( getContext().resolveFilename( libName ) );
+ try { return lib.toURL(); }
+ catch( final MalformedURLException mue )
+ {
+ throw new AntException( "Malformed task-lib parameter " + m_lib, mue );
+ }
+ }
+ else
+ {
+ return null;
+ }
+ }
+}
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
index dbee8c3ac..e1f1bb9fb 100644
--- a/proposal/myrmidon/src/java/org/apache/ant/tasks/core/RegisterTasklet.java
+++ b/proposal/myrmidon/src/java/org/apache/ant/tasks/core/RegisterTasklet.java
@@ -7,18 +7,10 @@
*/
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.TaskletEngine;
-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.DeploymentException;
import org.apache.avalon.camelot.RegistryException;
/**
@@ -27,90 +19,25 @@ import org.apache.avalon.camelot.RegistryException;
* @author Peter Donald
*/
public class RegisterTasklet
- extends AbstractTasklet
- implements Composer
+ extends AbstractResourceRegisterer
{
- 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
- {
- final TaskletEngine engine = (TaskletEngine)componentManager.
- lookup( "org.apache.ant.tasklet.engine.TaskletEngine" );
- m_taskletRegistry = engine.getTaskletRegistry();
- }
-
- 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
+ protected void registerResource( final String name,
+ final String classname,
+ final URL url )
+ throws AntException, RegistryException
{
-/*
- if( null == m_tasklib )
- {
- throw new AntException( "Must specify tasklib parameter" );
- }
-*/
- if( null == m_taskName )
+ if( null == classname )
{
- throw new AntException( "Must specify taskname parameter" );
- }
-
- if( null == m_tasklib && null == m_classname )
- {
- throw new AntException( "Must specify classname if don't specify " +
- "tasklib parameter" );
- }
-
- if( null == m_classname )
- {
- m_classname = getDefaultClassName();
- }
-
- try
- {
- URL url = null;
-
- if( null != m_tasklib )
+ try { m_engine.getTskDeployer().deployTasklet( name, url.toString(), url ); }
+ catch( final DeploymentException de )
{
- final File tasklib = new File( getContext().resolveFilename( m_tasklib ) );
- url = tasklib.toURL();
+ throw new AntException( "Failed deploying " + name + " from " + url, de );
}
-
- 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 )
+ else
{
- throw new AntException( "Error registering " + m_taskName + " due to " + re, re );
+ final DefaultTaskletInfo info = new DefaultTaskletInfo( classname, url );
+ m_engine.getTaskletRegistry().register( name, info );
}
}
-
- 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/RegisterTasklib.java b/proposal/myrmidon/src/java/org/apache/ant/tasks/core/RegisterTasklib.java
new file mode 100644
index 000000000..d7f1f748e
--- /dev/null
+++ b/proposal/myrmidon/src/java/org/apache/ant/tasks/core/RegisterTasklib.java
@@ -0,0 +1,72 @@
+/*
+ * 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.TaskletEngine;
+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.DeploymentException;
+
+/**
+ * Method to register a tasklib.
+ *
+ * @author Peter Donald
+ */
+public class RegisterTasklib
+ extends AbstractTasklet
+ implements Composer
+{
+ protected String m_lib;
+ protected TaskletEngine m_engine;
+
+ public void compose( final ComponentManager componentManager )
+ throws ComponentNotFoundException, ComponentNotAccessibleException
+ {
+ m_engine = (TaskletEngine)componentManager.
+ lookup( "org.apache.ant.tasklet.engine.TaskletEngine" );
+ }
+
+ public void setLib( final String lib )
+ {
+ m_lib = lib;
+ }
+
+ public void run()
+ throws AntException
+ {
+ if( null == m_lib )
+ {
+ throw new AntException( "Must specify lib parameter" );
+ }
+
+ URL url = null;
+
+ final File lib = new File( getContext().resolveFilename( m_lib ) );
+ try { url = lib.toURL(); }
+ catch( final MalformedURLException mue )
+ {
+ throw new AntException( "Malformed task-lib parameter " + m_lib, mue );
+ }
+
+ try
+ {
+ m_engine.getTskDeployer().deploy( url.toString(), url );
+ }
+ catch( final DeploymentException de )
+ {
+ throw new AntException( "Error registering resource", de );
+ }
+ }
+}
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 73f28858e..f2a9d2ae0 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
@@ -6,4 +6,6 @@ conf-test=org.apache.ant.tasks.core.ConfigurationTest
content-test=org.apache.ant.tasks.core.ContentTest
property=org.apache.ant.tasks.core.Property
register-tasklet=org.apache.ant.tasks.core.RegisterTasklet
+register-converter=org.apache.ant.tasks.core.RegisterConverter
+register-tasklib=org.apache.ant.tasks.core.RegisterTasklib
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 79467fdf2..67fb3d9e2 100644
--- a/proposal/myrmidon/src/make/sample.xmk
+++ b/proposal/myrmidon/src/make/sample.xmk
@@ -58,10 +58,18 @@ Legal:
-
+
+
@@ -74,6 +82,7 @@ Legal:
+
\ No newline at end of file
diff --git a/proposal/myrmidon/src/script/ant b/proposal/myrmidon/src/script/ant
index d215b85a8..00bbeeff5 100644
--- a/proposal/myrmidon/src/script/ant
+++ b/proposal/myrmidon/src/script/ant
@@ -25,7 +25,7 @@ while [ -h "$PRG" ] ; do
fi
done
-ANT_HOME=`dirname "$PRG"`/..
+MYRMIDON_HOME=`dirname "$PRG"`/..
if [ "$JAVA_HOME" == "" ] ; then
@@ -42,4 +42,4 @@ else
fi
fi
-$JAVACMD $ANT_OPTS -jar ant.jar --ant-home=${ANT_HOME} $@
\ No newline at end of file
+$JAVACMD $ANT_OPTS -jar ant.jar --ant-home=${MYRMIDON_HOME} $@
\ No newline at end of file