Browse Source

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
master
Peter Donald 24 years ago
parent
commit
6b4ce7ff56
10 changed files with 93 additions and 65 deletions
  1. +7
    -6
      proposal/myrmidon/src/java/org/apache/ant/modules/basic/Property.java
  2. +14
    -9
      proposal/myrmidon/src/java/org/apache/ant/modules/core/RegisterDataType.java
  3. +18
    -12
      proposal/myrmidon/src/java/org/apache/ant/modules/core/RegisterTasklet.java
  4. +3
    -0
      proposal/myrmidon/src/java/org/apache/myrmidon/api/Task.java
  5. +12
    -13
      proposal/myrmidon/src/java/org/apache/myrmidon/components/deployer/DefaultTskDeployer.java
  6. +6
    -6
      proposal/myrmidon/src/java/org/apache/myrmidon/components/embeddor/MyrmidonEmbeddor.java
  7. +19
    -11
      proposal/myrmidon/src/java/org/apache/myrmidon/components/executor/DefaultExecutor.java
  8. +1
    -1
      proposal/myrmidon/src/java/org/apache/myrmidon/components/type/DefaultComponentFactory.java
  9. +12
    -6
      proposal/myrmidon/src/java/org/apache/myrmidon/components/type/DefaultTypeManager.java
  10. +1
    -1
      proposal/myrmidon/src/java/org/apache/myrmidon/components/type/TypedComponentSelector.java

+ 7
- 6
proposal/myrmidon/src/java/org/apache/ant/modules/basic/Property.java View File

@@ -11,9 +11,9 @@ import java.util.Iterator;
import org.apache.myrmidon.api.TaskException; import org.apache.myrmidon.api.TaskException;
import org.apache.ant.convert.Converter; import org.apache.ant.convert.Converter;
import org.apache.ant.tasklet.DataType; 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.ComponentException;
import org.apache.avalon.framework.component.ComponentManager; 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.Composable;
import org.apache.avalon.framework.configuration.Configurable; import org.apache.avalon.framework.configuration.Configurable;
import org.apache.avalon.framework.configuration.Configuration; 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.AbstractTask;
import org.apache.myrmidon.api.TaskContext; import org.apache.myrmidon.api.TaskContext;
import org.apache.myrmidon.components.configurer.Configurer; 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. * 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 String m_name;
protected Object m_value; protected Object m_value;
protected boolean m_localScope = true; protected boolean m_localScope = true;
protected DataTypeEngine m_engine;
protected ComponentSelector m_selector;
protected Converter m_converter; protected Converter m_converter;
protected Configurer m_configurer; protected Configurer m_configurer;


@@ -43,9 +44,9 @@ public class Property
throws ComponentException throws ComponentException
{ {
m_configurer = (Configurer)componentManager.lookup( Configurer.ROLE ); 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" ); m_converter = (Converter)componentManager.lookup( "org.apache.ant.convert.Converter" );
} }
@@ -122,7 +123,7 @@ public class Property


try try
{ {
final DataType value = m_engine.createDataType( child.getName() );
final DataType value = (DataType)m_selector.select( child.getName() );
setValue( value ); setValue( value );
m_configurer.configure( value, child, getContext() ); m_configurer.configure( value, child, getContext() );
} }


+ 14
- 9
proposal/myrmidon/src/java/org/apache/ant/modules/core/RegisterDataType.java View File

@@ -8,10 +8,9 @@
package org.apache.ant.modules.core; package org.apache.ant.modules.core;


import java.net.URL; import java.net.URL;
import org.apache.avalon.framework.camelot.DefaultLocator;
import org.apache.avalon.framework.camelot.DeploymentException; import org.apache.avalon.framework.camelot.DeploymentException;
import org.apache.avalon.framework.camelot.RegistryException;
import org.apache.myrmidon.api.TaskException; import org.apache.myrmidon.api.TaskException;
import org.apache.myrmidon.components.type.DefaultComponentFactory;


/** /**
* Method to register a single datatype. * 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> * @author <a href="mailto:donaldp@apache.org">Peter Donald</a>
*/ */
public class RegisterDataType public class RegisterDataType
extends AbstractResourceRegisterer
extends AbstractTypeDefinition
{ {
protected void registerResource( final String name, protected void registerResource( final String name,
final String classname,
final String className,
final URL url ) 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 ) catch( final DeploymentException de )
{ {
throw new TaskException( "Failed deploying " + name + " from " + url, de ); throw new TaskException( "Failed deploying " + name + " from " + url, de );
@@ -36,8 +35,14 @@ public class RegisterDataType
} }
else 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 );
}
} }
} }
} }

+ 18
- 12
proposal/myrmidon/src/java/org/apache/ant/modules/core/RegisterTasklet.java View File

@@ -8,27 +8,27 @@
package org.apache.ant.modules.core; package org.apache.ant.modules.core;


import java.net.URL; 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.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. * Method to register a single tasklet.
* *
* @author <a href="mailto:donaldp@apache.org">Peter Donald</a> * @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 ) 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 ) catch( final DeploymentException de )
{ {
throw new TaskException( "Failed deploying " + name + " from " + url, de ); throw new TaskException( "Failed deploying " + name + " from " + url, de );
@@ -36,8 +36,14 @@ public class RegisterTasklet
} }
else 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 );
}
} }
} }
} }

+ 3
- 0
proposal/myrmidon/src/java/org/apache/myrmidon/api/Task.java View File

@@ -7,6 +7,8 @@
*/ */
package org.apache.myrmidon.api; 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. * 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> * @author <a href="mailto:donaldp@apache.org">Peter Donald</a>
*/ */
public interface Task public interface Task
extends Component
{ {
String ROLE = "org.apache.myrmidon.api.Task"; String ROLE = "org.apache.myrmidon.api.Task";




+ 12
- 13
proposal/myrmidon/src/java/org/apache/myrmidon/components/deployer/DefaultTskDeployer.java View File

@@ -52,8 +52,8 @@ public class DefaultTskDeployer
{ {
private final static String TSKDEF_FILE = "TASK-LIB/taskdefs.xml"; 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 Registry m_converterRegistry;
private ConverterRegistry m_converterInfoRegistry; private ConverterRegistry m_converterInfoRegistry;
private TypeManager m_typeManager; private TypeManager m_typeManager;
@@ -77,8 +77,8 @@ public class DefaultTskDeployer
throws ComponentException throws ComponentException
{ {
//UGLY HACK alert !!! //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. final ConverterEngine converterEngine = (ConverterEngine)componentManager.
lookup( "org.apache.ant.convert.engine.ConverterEngine" ); lookup( "org.apache.ant.convert.engine.ConverterEngine" );
@@ -86,10 +86,9 @@ public class DefaultTskDeployer
m_converterInfoRegistry = converterEngine.getInfoRegistry(); m_converterInfoRegistry = converterEngine.getInfoRegistry();
m_converterRegistry = converterEngine.getRegistry(); 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 ); m_typeManager = (TypeManager)componentManager.lookup( TypeManager.ROLE );
} }
@@ -277,7 +276,7 @@ public class DefaultTskDeployer
{ {
final String name = task.getAttribute( "name" ); final String name = task.getAttribute( "name" );
final String className = task.getAttribute( "classname" ); final String className = task.getAttribute( "classname" );
/*
final DefaultLocator info = new DefaultLocator( className, url ); final DefaultLocator info = new DefaultLocator( className, url );


try { m_taskRegistry.register( name, info ); } try { m_taskRegistry.register( name, info ); }
@@ -286,7 +285,7 @@ public class DefaultTskDeployer
throw new DeploymentException( "Error registering " + name + " due to " + re, throw new DeploymentException( "Error registering " + name + " due to " + re,
re ); re );
} }
*/
factory.addNameClassMapping( name, className ); factory.addNameClassMapping( name, className );
try { m_typeManager.registerType( Task.ROLE, name, factory ); } try { m_typeManager.registerType( Task.ROLE, name, factory ); }
@@ -305,7 +304,7 @@ public class DefaultTskDeployer
{ {
final String name = datatype.getAttribute( "name" ); final String name = datatype.getAttribute( "name" );
final String className = datatype.getAttribute( "classname" ); final String className = datatype.getAttribute( "classname" );
/*
final DefaultLocator info = new DefaultLocator( className, url ); final DefaultLocator info = new DefaultLocator( className, url );


try { m_dataTypeRegistry.register( name, info ); } try { m_dataTypeRegistry.register( name, info ); }
@@ -314,9 +313,9 @@ public class DefaultTskDeployer
throw new DeploymentException( "Error registering " + name + " due to " + re, throw new DeploymentException( "Error registering " + name + " due to " + re,
re ); re );
} }
*/
factory.addNameClassMapping( name, className ); 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 ) catch( final Exception e )
{ {
throw new DeploymentException( "Error registering " + name + " due to " + e, e ); throw new DeploymentException( "Error registering " + name + " due to " + e, e );


+ 6
- 6
proposal/myrmidon/src/java/org/apache/myrmidon/components/embeddor/MyrmidonEmbeddor.java View File

@@ -236,12 +236,18 @@ public class MyrmidonEmbeddor
component = getParameter( "org.apache.ant.convert.engine.ConverterEngine" ); component = getParameter( "org.apache.ant.convert.engine.ConverterEngine" );
m_converterEngine = (ConverterEngine)createComponent( component, ConverterEngine.class ); 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" ); component = getParameter( "org.apache.ant.tasklet.engine.DataTypeEngine" );
m_dataTypeEngine = (DataTypeEngine)createComponent( component, DataTypeEngine.class ); m_dataTypeEngine = (DataTypeEngine)createComponent( component, DataTypeEngine.class );


component = getParameter( TypeManager.ROLE ); component = getParameter( TypeManager.ROLE );
m_typeManager = (TypeManager)createComponent( component, TypeManager.class ); m_typeManager = (TypeManager)createComponent( component, TypeManager.class );


component = getParameter( TskDeployer.ROLE );
m_deployer = (TskDeployer)createComponent( component, TskDeployer.class );

component = getParameter( Executor.ROLE ); component = getParameter( Executor.ROLE );
m_executor = (Executor)createComponent( component, Executor.class ); m_executor = (Executor)createComponent( component, Executor.class );


@@ -250,12 +256,6 @@ public class MyrmidonEmbeddor


component = getParameter( ProjectBuilder.ROLE ); component = getParameter( ProjectBuilder.ROLE );
m_builder =(ProjectBuilder)createComponent( component, ProjectBuilder.class ); 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 );
} }


/** /**


+ 19
- 11
proposal/myrmidon/src/java/org/apache/myrmidon/components/executor/DefaultExecutor.java View File

@@ -20,6 +20,7 @@ import org.apache.avalon.framework.camelot.RegistryException;
import org.apache.avalon.framework.component.Component; import org.apache.avalon.framework.component.Component;
import org.apache.avalon.framework.component.ComponentException; import org.apache.avalon.framework.component.ComponentException;
import org.apache.avalon.framework.component.ComponentManager; 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.Composable;
import org.apache.avalon.framework.component.DefaultComponentManager; import org.apache.avalon.framework.component.DefaultComponentManager;
import org.apache.avalon.framework.configuration.Configurable; 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.api.TaskException; import org.apache.myrmidon.api.TaskException;
import org.apache.myrmidon.components.configurer.Configurer; import org.apache.myrmidon.components.configurer.Configurer;
import org.apache.myrmidon.components.type.TypeManager;


public class DefaultExecutor public class DefaultExecutor
extends AbstractLoggable extends AbstractLoggable
implements Executor, Composable 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 Configurer m_configurer;
private ComponentSelector m_selector;


private ComponentManager m_componentManager; private ComponentManager m_componentManager;


public Registry getRegistry() 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 //cache CM so it can be used while executing tasks
m_componentManager = componentManager; 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 ); 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 ) public void execute( final Configuration taskData, final TaskContext context )
@@ -99,17 +104,20 @@ public class DefaultExecutor
{ {
try 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, private void doConfigure( final Task task,


+ 1
- 1
proposal/myrmidon/src/java/org/apache/myrmidon/components/type/DefaultComponentFactory.java View File

@@ -36,7 +36,7 @@ public class DefaultComponentFactory


public DefaultComponentFactory( final URL[] urls ) public DefaultComponentFactory( final URL[] urls )
{ {
this( urls, null );
this( urls, Thread.currentThread().getContextClassLoader() );
} }


public DefaultComponentFactory( final URL[] urls, final ClassLoader parent ) public DefaultComponentFactory( final URL[] urls, final ClassLoader parent )


+ 12
- 6
proposal/myrmidon/src/java/org/apache/myrmidon/components/type/DefaultTypeManager.java View File

@@ -39,10 +39,9 @@ public class DefaultTypeManager
public Component lookup( final String role ) public Component lookup( final String role )
throws ComponentException throws ComponentException
{ {
final ComponentSelector selector = (ComponentSelector)m_roleMap.get( role );
if( null != selector )
if( role.endsWith( "Selector" ) )
{ {
return selector;
return createSelector( role );
} }
else else
{ {
@@ -60,7 +59,7 @@ public class DefaultTypeManager
final ComponentFactory factory ) final ComponentFactory factory )
throws Exception throws Exception
{ {
final TypedComponentSelector selector = createSelector( role );
final TypedComponentSelector selector = createSelector( role + "Selector" );
selector.register( shorthandName, factory ); selector.register( shorthandName, factory );
} }


@@ -77,7 +76,10 @@ public class DefaultTypeManager
throws ComponentException throws ComponentException
{ {
TypedComponentSelector selector = (TypedComponentSelector)m_roleMap.get( role ); TypedComponentSelector selector = (TypedComponentSelector)m_roleMap.get( role );
if( null != selector ) return selector;
if( null != selector )
{
return selector;
}


if( null != m_parent ) if( null != m_parent )
{ {
@@ -92,10 +94,14 @@ public class DefaultTypeManager
///If we haven't goa selector try to create a new one ///If we haven't goa selector try to create a new one
if( null == selector ) if( null == selector )
{ {
//Precondition that role.endsWith( "Selector" )
final int length = role.length() - 8;
final String workInterface = role.substring( 0, length );

try try
{ {
//TODO: Should we use ContextClassLoader here ??? Or perhaps try that on failure?? //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 ); selector = new TypedComponentSelector( clazz );
} }
catch( final Exception e ) catch( final Exception e )


+ 1
- 1
proposal/myrmidon/src/java/org/apache/myrmidon/components/type/TypedComponentSelector.java View File

@@ -64,7 +64,7 @@ public class TypedComponentSelector


if( null != component ) if( null != component )
{ {
if( m_type.isInstance( component ) )
if( !m_type.isInstance( component ) )
{ {
throw new ComponentException( "Implementation of " + name + " is not of " + throw new ComponentException( "Implementation of " + name + " is not of " +
"correct type (" + m_type.getClass().getName() + ")" ); "correct type (" + m_type.getClass().getName() + ")" );


Loading…
Cancel
Save