diff --git a/proposal/myrmidon/src/java/org/apache/ant/modules/basic/Property.java b/proposal/myrmidon/src/java/org/apache/ant/modules/basic/Property.java
index 8492c76cf..58016edb2 100644
--- a/proposal/myrmidon/src/java/org/apache/ant/modules/basic/Property.java
+++ b/proposal/myrmidon/src/java/org/apache/ant/modules/basic/Property.java
@@ -11,9 +11,9 @@ import java.util.Iterator;
import org.apache.myrmidon.api.TaskException;
import org.apache.ant.convert.Converter;
import org.apache.ant.tasklet.DataType;
-import org.apache.ant.tasklet.engine.DataTypeEngine;
import org.apache.avalon.framework.component.ComponentException;
import org.apache.avalon.framework.component.ComponentManager;
+import org.apache.avalon.framework.component.ComponentSelector;
import org.apache.avalon.framework.component.Composable;
import org.apache.avalon.framework.configuration.Configurable;
import org.apache.avalon.framework.configuration.Configuration;
@@ -22,6 +22,7 @@ import org.apache.avalon.framework.context.Resolvable;
import org.apache.myrmidon.api.AbstractTask;
import org.apache.myrmidon.api.TaskContext;
import org.apache.myrmidon.components.configurer.Configurer;
+import org.apache.myrmidon.components.type.TypeManager;
/**
* This is the property "task" to declare a binding of a datatype to a name.
@@ -35,7 +36,7 @@ public class Property
protected String m_name;
protected Object m_value;
protected boolean m_localScope = true;
- protected DataTypeEngine m_engine;
+ protected ComponentSelector m_selector;
protected Converter m_converter;
protected Configurer m_configurer;
@@ -43,9 +44,9 @@ public class Property
throws ComponentException
{
m_configurer = (Configurer)componentManager.lookup( Configurer.ROLE );
-
- m_engine = (DataTypeEngine)componentManager.
- lookup( "org.apache.ant.tasklet.engine.DataTypeEngine" );
+ final TypeManager typeManager = (TypeManager)componentManager.lookup( TypeManager.ROLE );
+ m_selector =
+ (ComponentSelector)typeManager.lookup( "org.apache.ant.tasklet.DataTypeSelector" );
m_converter = (Converter)componentManager.lookup( "org.apache.ant.convert.Converter" );
}
@@ -122,7 +123,7 @@ public class Property
try
{
- final DataType value = m_engine.createDataType( child.getName() );
+ final DataType value = (DataType)m_selector.select( child.getName() );
setValue( value );
m_configurer.configure( value, child, getContext() );
}
diff --git a/proposal/myrmidon/src/java/org/apache/ant/modules/core/RegisterDataType.java b/proposal/myrmidon/src/java/org/apache/ant/modules/core/RegisterDataType.java
index 6c31a83f6..871b26a15 100644
--- a/proposal/myrmidon/src/java/org/apache/ant/modules/core/RegisterDataType.java
+++ b/proposal/myrmidon/src/java/org/apache/ant/modules/core/RegisterDataType.java
@@ -8,10 +8,9 @@
package org.apache.ant.modules.core;
import java.net.URL;
-import org.apache.avalon.framework.camelot.DefaultLocator;
import org.apache.avalon.framework.camelot.DeploymentException;
-import org.apache.avalon.framework.camelot.RegistryException;
import org.apache.myrmidon.api.TaskException;
+import org.apache.myrmidon.components.type.DefaultComponentFactory;
/**
* Method to register a single datatype.
@@ -19,16 +18,16 @@ import org.apache.myrmidon.api.TaskException;
* @author Peter Donald
*/
public class RegisterDataType
- extends AbstractResourceRegisterer
+ extends AbstractTypeDefinition
{
protected void registerResource( final String name,
- final String classname,
+ final String className,
final URL url )
- throws TaskException, RegistryException
+ throws TaskException
{
- if( null == classname )
+ if( null == className )
{
- try { m_tskDeployer.deployDataType( name, url.toString(), url ); }
+ try { getDeployer().deployDataType( name, url.toString(), url ); }
catch( final DeploymentException de )
{
throw new TaskException( "Failed deploying " + name + " from " + url, de );
@@ -36,8 +35,14 @@ public class RegisterDataType
}
else
{
- final DefaultLocator locator = new DefaultLocator( classname, url );
- m_dataTypeEngine.getRegistry().register( name, locator );
+ final DefaultComponentFactory factory =
+ new DefaultComponentFactory( new URL[] { url } );
+ factory.addNameClassMapping( name, className );
+ try { getTypeManager().registerType( "org.apache.ant.tasklet.DataType", name, factory ); }
+ catch( final Exception e )
+ {
+ throw new TaskException( "Failed registering " + name + " from " + url, e );
+ }
}
}
}
diff --git a/proposal/myrmidon/src/java/org/apache/ant/modules/core/RegisterTasklet.java b/proposal/myrmidon/src/java/org/apache/ant/modules/core/RegisterTasklet.java
index 7ba59d3f4..f235f9087 100644
--- a/proposal/myrmidon/src/java/org/apache/ant/modules/core/RegisterTasklet.java
+++ b/proposal/myrmidon/src/java/org/apache/ant/modules/core/RegisterTasklet.java
@@ -8,27 +8,27 @@
package org.apache.ant.modules.core;
import java.net.URL;
-import org.apache.myrmidon.api.TaskException;
-import org.apache.avalon.framework.camelot.DefaultLocator;
import org.apache.avalon.framework.camelot.DeploymentException;
-import org.apache.avalon.framework.camelot.RegistryException;
+import org.apache.myrmidon.api.Task;
+import org.apache.myrmidon.api.TaskException;
+import org.apache.myrmidon.components.type.DefaultComponentFactory;
/**
* Method to register a single tasklet.
*
* @author Peter Donald
*/
-public class RegisterTasklet
- extends AbstractResourceRegisterer
+public class RegisterTasklet
+ extends AbstractTypeDefinition
{
- protected void registerResource( final String name,
- final String classname,
+ protected void registerResource( final String name,
+ final String className,
final URL url )
- throws TaskException, RegistryException
+ throws TaskException
{
- if( null == classname )
+ if( null == className )
{
- try { m_tskDeployer.deployTask( name, url.toString(), url ); }
+ try { getDeployer().deployTask( name, url.toString(), url ); }
catch( final DeploymentException de )
{
throw new TaskException( "Failed deploying " + name + " from " + url, de );
@@ -36,8 +36,14 @@ public class RegisterTasklet
}
else
{
- final DefaultLocator locator = new DefaultLocator( classname, url );
- m_engine.getRegistry().register( name, locator );
+ final DefaultComponentFactory factory =
+ new DefaultComponentFactory( new URL[] { url } );
+ factory.addNameClassMapping( name, className );
+ try { getTypeManager().registerType( Task.ROLE, name, factory ); }
+ catch( final Exception e )
+ {
+ throw new TaskException( "Failed registering " + name + " from " + url, e );
+ }
}
}
}
diff --git a/proposal/myrmidon/src/java/org/apache/myrmidon/api/Task.java b/proposal/myrmidon/src/java/org/apache/myrmidon/api/Task.java
index ccc6615c7..e81ac3376 100644
--- a/proposal/myrmidon/src/java/org/apache/myrmidon/api/Task.java
+++ b/proposal/myrmidon/src/java/org/apache/myrmidon/api/Task.java
@@ -7,6 +7,8 @@
*/
package org.apache.myrmidon.api;
+import org.apache.avalon.framework.component.Component;
+
/**
* This is the interface that tasks implement to be executed in Myrmidon runtime.
*
@@ -24,6 +26,7 @@ package org.apache.myrmidon.api;
* @author Peter Donald
*/
public interface Task
+ extends Component
{
String ROLE = "org.apache.myrmidon.api.Task";
diff --git a/proposal/myrmidon/src/java/org/apache/myrmidon/components/deployer/DefaultTskDeployer.java b/proposal/myrmidon/src/java/org/apache/myrmidon/components/deployer/DefaultTskDeployer.java
index 0d477d271..441708b7b 100644
--- a/proposal/myrmidon/src/java/org/apache/myrmidon/components/deployer/DefaultTskDeployer.java
+++ b/proposal/myrmidon/src/java/org/apache/myrmidon/components/deployer/DefaultTskDeployer.java
@@ -52,8 +52,8 @@ public class DefaultTskDeployer
{
private final static String TSKDEF_FILE = "TASK-LIB/taskdefs.xml";
- private Registry m_dataTypeRegistry;
- private Registry m_taskRegistry;
+ //private Registry m_dataTypeRegistry;
+ //private Registry m_taskRegistry;
private Registry m_converterRegistry;
private ConverterRegistry m_converterInfoRegistry;
private TypeManager m_typeManager;
@@ -77,8 +77,8 @@ public class DefaultTskDeployer
throws ComponentException
{
//UGLY HACK alert !!!
- final Executor executor = (Executor)componentManager.lookup( Executor.ROLE );
- m_taskRegistry = executor.getRegistry();
+ //final Executor executor = (Executor)componentManager.lookup( Executor.ROLE );
+ //m_taskRegistry = executor.getRegistry();
final ConverterEngine converterEngine = (ConverterEngine)componentManager.
lookup( "org.apache.ant.convert.engine.ConverterEngine" );
@@ -86,10 +86,9 @@ public class DefaultTskDeployer
m_converterInfoRegistry = converterEngine.getInfoRegistry();
m_converterRegistry = converterEngine.getRegistry();
- final DataTypeEngine dataTypeEngine = (DataTypeEngine)componentManager.
- lookup( "org.apache.ant.tasklet.engine.DataTypeEngine" );
-
- m_dataTypeRegistry = dataTypeEngine.getRegistry();
+ //final DataTypeEngine dataTypeEngine = (DataTypeEngine)componentManager.
+ //lookup( "org.apache.ant.tasklet.engine.DataTypeEngine" );
+ //m_dataTypeRegistry = dataTypeEngine.getRegistry();
m_typeManager = (TypeManager)componentManager.lookup( TypeManager.ROLE );
}
@@ -277,7 +276,7 @@ public class DefaultTskDeployer
{
final String name = task.getAttribute( "name" );
final String className = task.getAttribute( "classname" );
-
+ /*
final DefaultLocator info = new DefaultLocator( className, url );
try { m_taskRegistry.register( name, info ); }
@@ -286,7 +285,7 @@ public class DefaultTskDeployer
throw new DeploymentException( "Error registering " + name + " due to " + re,
re );
}
-
+ */
factory.addNameClassMapping( name, className );
try { m_typeManager.registerType( Task.ROLE, name, factory ); }
@@ -305,7 +304,7 @@ public class DefaultTskDeployer
{
final String name = datatype.getAttribute( "name" );
final String className = datatype.getAttribute( "classname" );
-
+/*
final DefaultLocator info = new DefaultLocator( className, url );
try { m_dataTypeRegistry.register( name, info ); }
@@ -314,9 +313,9 @@ public class DefaultTskDeployer
throw new DeploymentException( "Error registering " + name + " due to " + re,
re );
}
-
+*/
factory.addNameClassMapping( name, className );
- try { m_typeManager.registerType( Task.ROLE, name, factory ); }
+ try { m_typeManager.registerType( "org.apache.ant.tasklet.DataType", name, factory ); }
catch( final Exception e )
{
throw new DeploymentException( "Error registering " + name + " due to " + e, e );
diff --git a/proposal/myrmidon/src/java/org/apache/myrmidon/components/embeddor/MyrmidonEmbeddor.java b/proposal/myrmidon/src/java/org/apache/myrmidon/components/embeddor/MyrmidonEmbeddor.java
index e83897610..65fe6ad73 100644
--- a/proposal/myrmidon/src/java/org/apache/myrmidon/components/embeddor/MyrmidonEmbeddor.java
+++ b/proposal/myrmidon/src/java/org/apache/myrmidon/components/embeddor/MyrmidonEmbeddor.java
@@ -236,12 +236,18 @@ public class MyrmidonEmbeddor
component = getParameter( "org.apache.ant.convert.engine.ConverterEngine" );
m_converterEngine = (ConverterEngine)createComponent( component, ConverterEngine.class );
+ component = getParameter( Configurer.ROLE );
+ m_configurer = (Configurer)createComponent( component, Configurer.class );
+
component = getParameter( "org.apache.ant.tasklet.engine.DataTypeEngine" );
m_dataTypeEngine = (DataTypeEngine)createComponent( component, DataTypeEngine.class );
component = getParameter( TypeManager.ROLE );
m_typeManager = (TypeManager)createComponent( component, TypeManager.class );
+ component = getParameter( TskDeployer.ROLE );
+ m_deployer = (TskDeployer)createComponent( component, TskDeployer.class );
+
component = getParameter( Executor.ROLE );
m_executor = (Executor)createComponent( component, Executor.class );
@@ -250,12 +256,6 @@ public class MyrmidonEmbeddor
component = getParameter( ProjectBuilder.ROLE );
m_builder =(ProjectBuilder)createComponent( component, ProjectBuilder.class );
-
- component = getParameter( TskDeployer.ROLE );
- m_deployer = (TskDeployer)createComponent( component, TskDeployer.class );
-
- component = getParameter( Configurer.ROLE );
- m_configurer = (Configurer)createComponent( component, Configurer.class );
}
/**
diff --git a/proposal/myrmidon/src/java/org/apache/myrmidon/components/executor/DefaultExecutor.java b/proposal/myrmidon/src/java/org/apache/myrmidon/components/executor/DefaultExecutor.java
index 33b3cbc11..ccf3c897a 100644
--- a/proposal/myrmidon/src/java/org/apache/myrmidon/components/executor/DefaultExecutor.java
+++ b/proposal/myrmidon/src/java/org/apache/myrmidon/components/executor/DefaultExecutor.java
@@ -20,6 +20,7 @@ import org.apache.avalon.framework.camelot.RegistryException;
import org.apache.avalon.framework.component.Component;
import org.apache.avalon.framework.component.ComponentException;
import org.apache.avalon.framework.component.ComponentManager;
+import org.apache.avalon.framework.component.ComponentSelector;
import org.apache.avalon.framework.component.Composable;
import org.apache.avalon.framework.component.DefaultComponentManager;
import org.apache.avalon.framework.configuration.Configurable;
@@ -34,20 +35,22 @@ import org.apache.myrmidon.api.TaskContext;
import org.apache.myrmidon.api.TaskException;
import org.apache.myrmidon.api.TaskException;
import org.apache.myrmidon.components.configurer.Configurer;
+import org.apache.myrmidon.components.type.TypeManager;
public class DefaultExecutor
extends AbstractLoggable
implements Executor, Composable
{
- private Factory m_factory;
- private Registry m_registry = new DefaultRegistry( Locator.class );
+ //private Factory m_factory;
+ //private Registry m_registry = new DefaultRegistry( Locator.class );
private Configurer m_configurer;
+ private ComponentSelector m_selector;
private ComponentManager m_componentManager;
public Registry getRegistry()
{
- return m_registry;
+ return null;//m_registry;
}
/**
@@ -61,10 +64,12 @@ public class DefaultExecutor
{
//cache CM so it can be used while executing tasks
m_componentManager = componentManager;
-
- m_factory = (Factory)componentManager.lookup( "org.apache.avalon.framework.camelot.Factory" );
+ //m_factory = (Factory)componentManager.lookup( "org.apache.avalon.framework.camelot.Factory" );
m_configurer = (Configurer)componentManager.lookup( Configurer.ROLE );
+
+ final TypeManager typeManager = (TypeManager)componentManager.lookup( TypeManager.ROLE );
+ m_selector = (ComponentSelector)typeManager.lookup( Task.ROLE + "Selector" );
}
public void execute( final Configuration taskData, final TaskContext context )
@@ -99,17 +104,20 @@ public class DefaultExecutor
{
try
{
- final Locator locator = (Locator)m_registry.getInfo( name, Locator.class );
- return (Task)m_factory.create( locator, Task.class );
+ return (Task)m_selector.select( name );
+ //final Locator locator = (Locator)m_registry.getInfo( name, Locator.class );
+ //return (Task)m_factory.create( locator, Task.class );
}
- catch( final RegistryException re )
+ catch( final ComponentException ce )
{
- throw new TaskException( "Unable to locate task " + name, re );
+ throw new TaskException( "Unable to create task " + name, ce );
}
- catch( final FactoryException fe )
+/* catch( final RegistryException re )
{
- throw new TaskException( "Unable to create task " + name, fe );
+ throw new TaskException( "Unable to locate task " + name, re );
}
+ catch( final FactoryException fe )
+*/
}
private void doConfigure( final Task task,
diff --git a/proposal/myrmidon/src/java/org/apache/myrmidon/components/type/DefaultComponentFactory.java b/proposal/myrmidon/src/java/org/apache/myrmidon/components/type/DefaultComponentFactory.java
index 30a94eaa3..b89c8e424 100644
--- a/proposal/myrmidon/src/java/org/apache/myrmidon/components/type/DefaultComponentFactory.java
+++ b/proposal/myrmidon/src/java/org/apache/myrmidon/components/type/DefaultComponentFactory.java
@@ -36,7 +36,7 @@ public class DefaultComponentFactory
public DefaultComponentFactory( final URL[] urls )
{
- this( urls, null );
+ this( urls, Thread.currentThread().getContextClassLoader() );
}
public DefaultComponentFactory( final URL[] urls, final ClassLoader parent )
diff --git a/proposal/myrmidon/src/java/org/apache/myrmidon/components/type/DefaultTypeManager.java b/proposal/myrmidon/src/java/org/apache/myrmidon/components/type/DefaultTypeManager.java
index bba1724c9..59f4b2bc5 100644
--- a/proposal/myrmidon/src/java/org/apache/myrmidon/components/type/DefaultTypeManager.java
+++ b/proposal/myrmidon/src/java/org/apache/myrmidon/components/type/DefaultTypeManager.java
@@ -39,10 +39,9 @@ public class DefaultTypeManager
public Component lookup( final String role )
throws ComponentException
{
- final ComponentSelector selector = (ComponentSelector)m_roleMap.get( role );
- if( null != selector )
+ if( role.endsWith( "Selector" ) )
{
- return selector;
+ return createSelector( role );
}
else
{
@@ -60,7 +59,7 @@ public class DefaultTypeManager
final ComponentFactory factory )
throws Exception
{
- final TypedComponentSelector selector = createSelector( role );
+ final TypedComponentSelector selector = createSelector( role + "Selector" );
selector.register( shorthandName, factory );
}
@@ -77,7 +76,10 @@ public class DefaultTypeManager
throws ComponentException
{
TypedComponentSelector selector = (TypedComponentSelector)m_roleMap.get( role );
- if( null != selector ) return selector;
+ if( null != selector )
+ {
+ return selector;
+ }
if( null != m_parent )
{
@@ -92,10 +94,14 @@ public class DefaultTypeManager
///If we haven't goa selector try to create a new one
if( null == selector )
{
+ //Precondition that role.endsWith( "Selector" )
+ final int length = role.length() - 8;
+ final String workInterface = role.substring( 0, length );
+
try
{
//TODO: Should we use ContextClassLoader here ??? Or perhaps try that on failure??
- final Class clazz = Class.forName( role );
+ final Class clazz = Class.forName( workInterface );
selector = new TypedComponentSelector( clazz );
}
catch( final Exception e )
diff --git a/proposal/myrmidon/src/java/org/apache/myrmidon/components/type/TypedComponentSelector.java b/proposal/myrmidon/src/java/org/apache/myrmidon/components/type/TypedComponentSelector.java
index 4746273ea..0eeec2181 100644
--- a/proposal/myrmidon/src/java/org/apache/myrmidon/components/type/TypedComponentSelector.java
+++ b/proposal/myrmidon/src/java/org/apache/myrmidon/components/type/TypedComponentSelector.java
@@ -64,7 +64,7 @@ public class TypedComponentSelector
if( null != component )
{
- if( m_type.isInstance( component ) )
+ if( !m_type.isInstance( component ) )
{
throw new ComponentException( "Implementation of " + name + " is not of " +
"correct type (" + m_type.getClass().getName() + ")" );