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.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() );
}


+ 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;

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 );
}
}
}
}

+ 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;

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 );
}
}
}
}

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

@@ -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";



+ 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 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 );


+ 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" );
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 );
}

/**


+ 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.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,


+ 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 )
{
this( urls, null );
this( urls, Thread.currentThread().getContextClassLoader() );
}

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 )
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 )


+ 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( m_type.isInstance( component ) )
if( !m_type.isInstance( component ) )
{
throw new ComponentException( "Implementation of " + name + " is not of " +
"correct type (" + m_type.getClass().getName() + ")" );


Loading…
Cancel
Save