git-svn-id: https://svn.apache.org/repos/asf/ant/core/trunk@269082 13f79535-47bb-0310-9956-ffa450edef68master
| @@ -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() ); | |||
| } | |||
| @@ -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 <a href="mailto:donaldp@apache.org">Peter Donald</a> | |||
| */ | |||
| 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 ); | |||
| } | |||
| } | |||
| } | |||
| } | |||
| @@ -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 <a href="mailto:donaldp@apache.org">Peter Donald</a> | |||
| */ | |||
| 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 ); | |||
| } | |||
| } | |||
| } | |||
| } | |||
| @@ -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 <a href="mailto:donaldp@apache.org">Peter Donald</a> | |||
| */ | |||
| public interface Task | |||
| extends Component | |||
| { | |||
| String ROLE = "org.apache.myrmidon.api.Task"; | |||
| @@ -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 ); | |||
| @@ -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 ); | |||
| } | |||
| /** | |||
| @@ -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, | |||
| @@ -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 ) | |||
| @@ -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 ) | |||
| @@ -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() + ")" ); | |||