From 6b4ce7ff5608d4faf76cf400854db8126b946fbb Mon Sep 17 00:00:00 2001 From: Peter Donald Date: Sat, 2 Jun 2001 08:26:54 +0000 Subject: [PATCH] Integrate type so that tasks/datatypes are access via TypeManager rather than through individual Registrys scattered through classes. git-svn-id: https://svn.apache.org/repos/asf/ant/core/trunk@269082 13f79535-47bb-0310-9956-ffa450edef68 --- .../apache/ant/modules/basic/Property.java | 13 ++++---- .../ant/modules/core/RegisterDataType.java | 23 ++++++++------ .../ant/modules/core/RegisterTasklet.java | 30 +++++++++++-------- .../java/org/apache/myrmidon/api/Task.java | 3 ++ .../deployer/DefaultTskDeployer.java | 25 ++++++++-------- .../components/embeddor/MyrmidonEmbeddor.java | 12 ++++---- .../components/executor/DefaultExecutor.java | 30 ++++++++++++------- .../type/DefaultComponentFactory.java | 2 +- .../components/type/DefaultTypeManager.java | 18 +++++++---- .../type/TypedComponentSelector.java | 2 +- 10 files changed, 93 insertions(+), 65 deletions(-) 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() + ")" );