Submitted By: "Adam Murdoch" <adammurdoch_ml@yahoo.com> git-svn-id: https://svn.apache.org/repos/asf/ant/core/trunk@270847 13f79535-47bb-0310-9956-ffa450edef68master
@@ -8,9 +8,7 @@ | |||
package org.apache.myrmidon.api; | |||
import java.io.File; | |||
import org.apache.avalon.framework.context.Context; | |||
import org.apache.avalon.framework.context.ContextException; | |||
import org.apache.avalon.framework.context.Contextualizable; | |||
import org.apache.avalon.framework.logger.AbstractLogEnabled; | |||
/** | |||
@@ -31,6 +29,7 @@ public abstract class AbstractTask | |||
* @param context the context | |||
*/ | |||
public void contextualize( final TaskContext context ) | |||
throws TaskException | |||
{ | |||
m_context = context; | |||
} | |||
@@ -104,6 +103,12 @@ public abstract class AbstractTask | |||
getContext().setProperty( name, value, scope ); | |||
} | |||
protected final Object getService( final Class serviceClass ) | |||
throws TaskException | |||
{ | |||
return getContext().getService( serviceClass ); | |||
} | |||
protected final TaskContext createSubContext( final String name ) | |||
throws TaskException | |||
{ | |||
@@ -29,7 +29,8 @@ public interface Task | |||
* The Task will use the TaskContext to receive information | |||
* about it's environment. | |||
*/ | |||
void contextualize( TaskContext context ); | |||
void contextualize( TaskContext context ) | |||
throws TaskException; | |||
/** | |||
* Execute task. | |||
@@ -81,9 +81,6 @@ public class AspectAwareExecutor | |||
debug( "contextualizing.notice" ); | |||
doContextualize( task, taskModel, frame.getContext() ); | |||
debug( "composing.notice" ); | |||
doCompose( task, taskModel, frame.getComponentManager() ); | |||
debug( "configuring.notice" ); | |||
getAspectManager().preConfigure( taskModel ); | |||
doConfigure( task, taskModel, frame.getContext() ); | |||
@@ -12,9 +12,11 @@ import org.apache.avalon.framework.component.ComponentManager; | |||
import org.apache.avalon.framework.component.Composable; | |||
import org.apache.avalon.framework.context.Context; | |||
import org.apache.avalon.framework.context.Contextualizable; | |||
import org.apache.avalon.framework.context.ContextException; | |||
import org.apache.avalon.framework.logger.LogEnabled; | |||
import org.apache.avalon.framework.logger.Logger; | |||
import org.apache.myrmidon.api.TaskContext; | |||
import org.apache.myrmidon.api.TaskException; | |||
import org.apache.myrmidon.interfaces.executor.ExecutionFrame; | |||
import org.apache.myrmidon.interfaces.type.TypeManager; | |||
@@ -24,36 +26,28 @@ import org.apache.myrmidon.interfaces.type.TypeManager; | |||
* @author <a href="mailto:peter@apache.org">Peter Donald</a> | |||
*/ | |||
public class DefaultExecutionFrame | |||
implements ExecutionFrame, LogEnabled, Contextualizable, Composable | |||
implements ExecutionFrame, LogEnabled, Contextualizable | |||
{ | |||
private TypeManager m_typeManager; | |||
private Logger m_logger; | |||
private TaskContext m_context; | |||
private ComponentManager m_componentManager; | |||
private TypeManager m_typeManager; | |||
public void enableLogging( final Logger logger ) | |||
{ | |||
m_logger = logger; | |||
} | |||
public void contextualize( final Context context ) | |||
public void contextualize( final Context context ) throws ContextException | |||
{ | |||
m_context = (TaskContext)context; | |||
} | |||
/** | |||
* Retrieve relevent services needed to deploy. | |||
* | |||
* @param componentManager the ComponentManager | |||
* @exception ComponentException if an error occurs | |||
*/ | |||
public void compose( final ComponentManager componentManager ) | |||
throws ComponentException | |||
{ | |||
m_componentManager = componentManager; | |||
m_typeManager = (TypeManager)componentManager.lookup( TypeManager.ROLE ); | |||
try | |||
{ | |||
m_typeManager = (TypeManager)m_context.getService( TypeManager.class ); | |||
} | |||
catch( TaskException te ) | |||
{ | |||
throw new ContextException(te.getMessage(), te); | |||
} | |||
} | |||
public TypeManager getTypeManager() | |||
@@ -70,9 +64,4 @@ public class DefaultExecutionFrame | |||
{ | |||
return m_context; | |||
} | |||
public ComponentManager getComponentManager() | |||
{ | |||
return m_componentManager; | |||
} | |||
} |
@@ -61,9 +61,6 @@ public class DefaultExecutor | |||
debug( "contextualizing.notice" ); | |||
doContextualize( task, taskModel, frame.getContext() ); | |||
debug( "composing.notice" ); | |||
doCompose( task, taskModel, frame.getComponentManager() ); | |||
debug( "configuring.notice" ); | |||
doConfigure( task, taskModel, frame.getContext() ); | |||
@@ -115,29 +112,6 @@ public class DefaultExecutor | |||
} | |||
} | |||
protected final void doCompose( final Task task, | |||
final Configuration taskModel, | |||
final ComponentManager componentManager ) | |||
throws TaskException | |||
{ | |||
if( task instanceof Composable ) | |||
{ | |||
try | |||
{ | |||
( (Composable)task ).compose( componentManager ); | |||
} | |||
catch( final Throwable throwable ) | |||
{ | |||
final String message = | |||
REZ.getString( "compose.error", | |||
taskModel.getName(), | |||
taskModel.getLocation(), | |||
throwable.getMessage() ); | |||
throw new TaskException( message, throwable ); | |||
} | |||
} | |||
} | |||
protected final void doContextualize( final Task task, | |||
final Configuration taskModel, | |||
final TaskContext context ) | |||
@@ -1,7 +1,6 @@ | |||
creating.notice=Creating. | |||
logger.notice=Setting Logger. | |||
contextualizing.notice=Contextualizing. | |||
composing.notice=Composing. | |||
configuring.notice=Configuring. | |||
initializing.notice=Initializing. | |||
executing.notice=Executing. | |||
@@ -9,7 +8,6 @@ disposing.notice=Disposing. | |||
no-create.error=Unable to create task {0}. | |||
config.error=Error configuring task {0} at {1} (Reason: {2}). | |||
compose.error=Error composing task {0} at {1} (Reason: {2}). | |||
contextualize.error=Error contextualizing task {0} at {1} (Reason: {2}). | |||
dispose.error=Error disposing task {0} at {1} (Reason: {2}). | |||
init.error=Error initializing task {0} at {1} (Reason: {2}). | |||
@@ -8,12 +8,14 @@ | |||
package org.apache.myrmidon.components.workspace; | |||
import java.io.File; | |||
import java.util.Map; | |||
import org.apache.avalon.excalibur.i18n.ResourceManager; | |||
import org.apache.avalon.excalibur.i18n.Resources; | |||
import org.apache.avalon.excalibur.io.FileUtil; | |||
import org.apache.avalon.excalibur.property.PropertyException; | |||
import org.apache.avalon.excalibur.property.PropertyUtil; | |||
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.context.ContextException; | |||
import org.apache.avalon.framework.context.DefaultContext; | |||
import org.apache.myrmidon.api.TaskContext; | |||
@@ -31,32 +33,44 @@ public class DefaultTaskContext | |||
private final static Resources REZ = | |||
ResourceManager.getPackageResources( DefaultTaskContext.class ); | |||
private ComponentManager m_componentManager; | |||
/** | |||
* Constructor for Context with no parent contexts. | |||
*/ | |||
public DefaultTaskContext( final Map contextData ) | |||
public DefaultTaskContext() | |||
{ | |||
super( contextData ); | |||
this( (TaskContext)null ); | |||
} | |||
/** | |||
* Constructor for Context with no parent contexts. | |||
* Constructor that specified parent context. | |||
*/ | |||
public DefaultTaskContext() | |||
public DefaultTaskContext( final TaskContext parent ) | |||
{ | |||
this( (TaskContext)null ); | |||
this( parent, null ); | |||
} | |||
/** | |||
* Constructor. | |||
* Constructor that specifies the ComponentManager for context. | |||
*/ | |||
public DefaultTaskContext( final TaskContext parent ) | |||
public DefaultTaskContext( final ComponentManager componentManager ) | |||
{ | |||
this( null, componentManager ); | |||
} | |||
/** | |||
* Constructor that takes both parent context and a service directory. | |||
*/ | |||
public DefaultTaskContext( final TaskContext parent, | |||
final ComponentManager componentManager ) | |||
{ | |||
super( parent ); | |||
m_componentManager = componentManager; | |||
} | |||
/** | |||
* Retrieve Name of tasklet. | |||
* Retrieve Name of task. | |||
* | |||
* @return the name | |||
*/ | |||
@@ -104,7 +118,42 @@ public class DefaultTaskContext | |||
public Object getService( final Class serviceClass ) | |||
throws TaskException | |||
{ | |||
throw new TaskException( "No services available atm" ); | |||
// Try this context first | |||
final String name = serviceClass.getName(); | |||
if( m_componentManager.hasComponent( name ) ) | |||
{ | |||
try | |||
{ | |||
final Component service = m_componentManager.lookup( name ); | |||
if( !serviceClass.isInstance( service ) ) | |||
{ | |||
final String message = | |||
REZ.getString( "bad-service-class.error", | |||
name, | |||
service.getClass().getName(), | |||
serviceClass.getName() ); | |||
throw new TaskException( message ); | |||
} | |||
return service; | |||
} | |||
catch( final ComponentException ce ) | |||
{ | |||
final String message = REZ.getString( "bad-find-service.error", name ); | |||
throw new TaskException( message, ce ); | |||
} | |||
} | |||
// Try parent | |||
final TaskContext parent = (TaskContext)getParent(); | |||
if( null != parent ) | |||
{ | |||
return parent.getService( serviceClass ); | |||
} | |||
// Not found | |||
final String message = REZ.getString( "bad-find-service.error", name ); | |||
throw new TaskException( message ); | |||
} | |||
/** | |||
@@ -194,9 +243,11 @@ public class DefaultTaskContext | |||
{ | |||
checkPropertyValid( name, value ); | |||
if( CURRENT == scope ) { | |||
if( CURRENT == scope ) | |||
{ | |||
put( name, value ); | |||
} else if( PARENT == scope ) | |||
} | |||
else if( PARENT == scope ) | |||
{ | |||
if( null == getParent() ) | |||
{ | |||
@@ -19,7 +19,6 @@ import org.apache.avalon.framework.component.ComponentManager; | |||
import org.apache.avalon.framework.component.Composable; | |||
import org.apache.avalon.framework.component.DefaultComponentManager; | |||
import org.apache.avalon.framework.configuration.Configuration; | |||
import org.apache.avalon.framework.context.ContextException; | |||
import org.apache.avalon.framework.logger.AbstractLogEnabled; | |||
import org.apache.avalon.framework.logger.LogKitLogger; | |||
import org.apache.avalon.framework.logger.Logger; | |||
@@ -31,6 +30,7 @@ import org.apache.myrmidon.api.TaskContext; | |||
import org.apache.myrmidon.api.TaskException; | |||
import org.apache.myrmidon.components.deployer.DefaultDeployer; | |||
import org.apache.myrmidon.components.executor.DefaultExecutionFrame; | |||
import org.apache.myrmidon.components.role.DefaultRoleManager; | |||
import org.apache.myrmidon.framework.Condition; | |||
import org.apache.myrmidon.interfaces.deployer.Deployer; | |||
import org.apache.myrmidon.interfaces.deployer.DeploymentException; | |||
@@ -41,6 +41,7 @@ import org.apache.myrmidon.interfaces.model.Target; | |||
import org.apache.myrmidon.interfaces.model.TypeLib; | |||
import org.apache.myrmidon.interfaces.type.TypeManager; | |||
import org.apache.myrmidon.interfaces.workspace.Workspace; | |||
import org.apache.myrmidon.interfaces.role.RoleManager; | |||
import org.apache.myrmidon.listeners.ProjectListener; | |||
/** | |||
@@ -141,7 +142,7 @@ public class DefaultWorkspace | |||
private TaskContext createBaseContext() | |||
throws TaskException | |||
{ | |||
final TaskContext context = new DefaultTaskContext(); | |||
final TaskContext context = new DefaultTaskContext( m_componentManager ); | |||
final String[] names = m_parameters.getNames(); | |||
for( int i = 0; i < names.length; i++ ) | |||
@@ -219,9 +220,6 @@ public class DefaultWorkspace | |||
private ExecutionFrame createExecutionFrame( final Project project ) | |||
throws TaskException | |||
{ | |||
final TaskContext context = new DefaultTaskContext( m_baseContext ); | |||
context.setProperty( TaskContext.BASE_DIRECTORY, project.getBaseDirectory() ); | |||
//Create per frame ComponentManager | |||
final DefaultComponentManager componentManager = | |||
new DefaultComponentManager( m_componentManager ); | |||
@@ -267,6 +265,11 @@ public class DefaultWorkspace | |||
componentManager.put( Project.ROLE + "/" + name, other ); | |||
} | |||
// Create and configure the context | |||
final DefaultTaskContext context = | |||
new DefaultTaskContext( m_baseContext, componentManager ); | |||
context.setProperty( TaskContext.BASE_DIRECTORY, project.getBaseDirectory() ); | |||
final DefaultExecutionFrame frame = new DefaultExecutionFrame(); | |||
try | |||
@@ -276,7 +279,6 @@ public class DefaultWorkspace | |||
frame.enableLogging( logger ); | |||
frame.contextualize( context ); | |||
frame.compose( componentManager ); | |||
} | |||
catch( final Exception e ) | |||
{ | |||
@@ -401,10 +403,10 @@ public class DefaultWorkspace | |||
return; | |||
} | |||
} | |||
catch( final ContextException ce ) | |||
catch( final TaskException te ) | |||
{ | |||
final String message = REZ.getString( "condition-eval.error", name ); | |||
throw new TaskException( message, ce ); | |||
throw new TaskException( message, te ); | |||
} | |||
} | |||
@@ -15,7 +15,10 @@ no-version.error=No JavaVersion in Context. | |||
no-name.error=No Name in Context. | |||
no-dir.error=No Base Directory in Context. | |||
no-parent.error=Can't set a property with parent scope when context has no parent. | |||
bad-find-services.error=Unable to find service "{0}". | |||
bad-scope.error=Unknown property scope! ({0}). | |||
bad-property.error=Property {0} must have a value of type {1}. | |||
null-resolved-value.error=Value "{0}" resolved to null. | |||
bad-resolve.error=Unable to resolve value "{0}". | |||
bad-resolve.error=Unable to resolve value "{0}". | |||
bad-find-service.error=Could not find service "{0}". | |||
bad-service-class.error=Find service "{0}" but it was of type {1} where it was expected to be of type {2}. |
@@ -9,20 +9,21 @@ package org.apache.myrmidon.framework; | |||
import org.apache.avalon.excalibur.i18n.ResourceManager; | |||
import org.apache.avalon.excalibur.i18n.Resources; | |||
import org.apache.avalon.framework.component.ComponentException; | |||
import org.apache.avalon.framework.component.ComponentManager; | |||
import org.apache.avalon.framework.component.Composable; | |||
import org.apache.avalon.framework.configuration.Configuration; | |||
import org.apache.avalon.framework.configuration.ConfigurationException; | |||
import org.apache.avalon.framework.context.Context; | |||
import org.apache.avalon.framework.context.ContextException; | |||
import org.apache.myrmidon.api.AbstractTask; | |||
import org.apache.myrmidon.api.TaskException; | |||
import org.apache.myrmidon.api.TaskContext; | |||
import org.apache.myrmidon.converter.Converter; | |||
import org.apache.myrmidon.converter.ConverterException; | |||
import org.apache.myrmidon.interfaces.configurer.Configurer; | |||
import org.apache.myrmidon.interfaces.converter.MasterConverter; | |||
import org.apache.myrmidon.interfaces.executor.Executor; | |||
import org.apache.myrmidon.interfaces.type.TypeFactory; | |||
import org.apache.myrmidon.interfaces.type.TypeManager; | |||
import org.apache.myrmidon.interfaces.type.TypeException; | |||
/** | |||
* This is the class that Task writers should extend to provide custom tasks. | |||
@@ -31,7 +32,6 @@ import org.apache.myrmidon.interfaces.executor.Executor; | |||
*/ | |||
public abstract class AbstractContainerTask | |||
extends AbstractTask | |||
implements Composable | |||
{ | |||
private final static Resources REZ = | |||
ResourceManager.getPackageResources( AbstractContainerTask.class ); | |||
@@ -45,12 +45,18 @@ public abstract class AbstractContainerTask | |||
///For executing sub-elements as tasks | |||
private Executor m_executor; | |||
public void compose( final ComponentManager componentManager ) | |||
throws ComponentException | |||
/** | |||
* Retrieve context from container. | |||
* | |||
* @param context the context | |||
*/ | |||
public void contextualize( TaskContext context ) | |||
throws TaskException | |||
{ | |||
m_configurer = (Configurer)componentManager.lookup( Configurer.ROLE ); | |||
m_converter = (MasterConverter)componentManager.lookup( MasterConverter.ROLE ); | |||
m_executor = (Executor)componentManager.lookup( Executor.ROLE ); | |||
super.contextualize( context ); | |||
m_configurer = (Configurer)getService( Configurer.class ); | |||
m_converter = (MasterConverter)getService( MasterConverter.class ); | |||
m_executor = (Executor)getService( Executor.class ); | |||
} | |||
/** | |||
@@ -102,6 +108,24 @@ public abstract class AbstractContainerTask | |||
getConfigurer().configure( object, name, value, getContext() ); | |||
} | |||
/** | |||
* Locates a type factory. | |||
*/ | |||
protected final TypeFactory getTypeFactory( final String role ) | |||
throws TaskException | |||
{ | |||
final TypeManager typeManager = (TypeManager)getService( TypeManager.class ); | |||
try | |||
{ | |||
return typeManager.getFactory( role ); | |||
} | |||
catch( final TypeException te ) | |||
{ | |||
final String message = REZ.getString( "container.no-factory.error", role ); | |||
throw new TaskException( message, te ); | |||
} | |||
} | |||
/** | |||
* Convenience method for sub-class to retrieve Configurer. | |||
* | |||
@@ -12,9 +12,6 @@ import java.net.URL; | |||
import java.net.URLClassLoader; | |||
import org.apache.avalon.excalibur.i18n.ResourceManager; | |||
import org.apache.avalon.excalibur.i18n.Resources; | |||
import org.apache.avalon.framework.component.ComponentException; | |||
import org.apache.avalon.framework.component.ComponentManager; | |||
import org.apache.avalon.framework.component.Composable; | |||
import org.apache.myrmidon.api.AbstractTask; | |||
import org.apache.myrmidon.api.TaskException; | |||
import org.apache.myrmidon.interfaces.role.RoleManager; | |||
@@ -31,7 +28,6 @@ import org.apache.myrmidon.interfaces.type.TypeManager; | |||
*/ | |||
public abstract class AbstractTypeDef | |||
extends AbstractTask | |||
implements Composable | |||
{ | |||
private final static Resources REZ = | |||
ResourceManager.getPackageResources( AbstractTypeDef.class ); | |||
@@ -39,15 +35,6 @@ public abstract class AbstractTypeDef | |||
private File m_lib; | |||
private String m_name; | |||
private String m_className; | |||
private TypeManager m_typeManager; | |||
private RoleManager m_roleManager; | |||
public void compose( final ComponentManager componentManager ) | |||
throws ComponentException | |||
{ | |||
m_typeManager = (TypeManager)componentManager.lookup( TypeManager.ROLE ); | |||
m_roleManager = (RoleManager)componentManager.lookup( RoleManager.ROLE ); | |||
} | |||
public void setLib( final File lib ) | |||
{ | |||
@@ -80,15 +67,17 @@ public abstract class AbstractTypeDef | |||
} | |||
final String typeName = getTypeName(); | |||
final String role = m_roleManager.getRoleForName( typeName ); | |||
final RoleManager roleManager = (RoleManager)getService( RoleManager.class ); | |||
final String role = roleManager.getRoleForName( typeName ); | |||
final ClassLoader classLoader = createClassLoader(); | |||
final DefaultTypeFactory factory = new DefaultTypeFactory( classLoader ); | |||
factory.addNameClassMapping( m_name, m_className ); | |||
final TypeManager typeManager = (TypeManager)getService( TypeManager.class ); | |||
try | |||
{ | |||
m_typeManager.registerType( role, m_name, factory ); | |||
typeManager.registerType( role, m_name, factory ); | |||
} | |||
catch( final TypeException te ) | |||
{ | |||
@@ -116,10 +105,5 @@ public abstract class AbstractTypeDef | |||
} | |||
} | |||
protected final TypeManager getTypeManager() | |||
{ | |||
return m_typeManager; | |||
} | |||
protected abstract String getTypeName(); | |||
} |
@@ -1,6 +1,7 @@ | |||
container.null-value.error=Value ({0}) resolved to null. | |||
container.bad-resolve.error=Error resolving value ({0}). | |||
container.bad-config.error=Error converting value. | |||
container.no-factory.error=Could not locate the type factory for type "{0}". | |||
typedef.no-name.error=Must specify name parameter. | |||
typedef.no-classname.error=Must specify classname parameter. | |||
@@ -11,7 +12,6 @@ condition.no-resolve.error=Error resolving {0}. | |||
pattern.ifelse-duplicate.error=Can only set one of if/else for pattern data type. | |||
type.no-factory.error=Unable to retrieve DataType factory from TypeManager. | |||
type.no-create.error=Unable to create datatype. | |||
type.no-id.error=Id must be specified. | |||
@@ -9,17 +9,13 @@ package org.apache.myrmidon.framework; | |||
import org.apache.avalon.excalibur.i18n.ResourceManager; | |||
import org.apache.avalon.excalibur.i18n.Resources; | |||
import org.apache.avalon.framework.component.ComponentException; | |||
import org.apache.avalon.framework.component.ComponentManager; | |||
import org.apache.avalon.framework.configuration.Configurable; | |||
import org.apache.avalon.framework.configuration.Configuration; | |||
import org.apache.avalon.framework.configuration.ConfigurationException; | |||
import org.apache.avalon.framework.configuration.DefaultConfiguration; | |||
import org.apache.myrmidon.api.TaskContext; | |||
import org.apache.myrmidon.api.TaskException; | |||
import org.apache.myrmidon.interfaces.type.TypeException; | |||
import org.apache.myrmidon.interfaces.type.TypeFactory; | |||
import org.apache.myrmidon.interfaces.type.TypeManager; | |||
/** | |||
* This is the property "task" to declare a binding of a datatype to a name. | |||
@@ -36,24 +32,6 @@ public class TypeInstanceTask | |||
private String m_id; | |||
private Object m_value; | |||
private boolean m_localScope = true; | |||
private TypeFactory m_factory; | |||
public void compose( final ComponentManager componentManager ) | |||
throws ComponentException | |||
{ | |||
super.compose( componentManager ); | |||
final TypeManager typeManager = (TypeManager)componentManager.lookup( TypeManager.ROLE ); | |||
try | |||
{ | |||
m_factory = typeManager.getFactory( DataType.ROLE ); | |||
} | |||
catch( final TypeException te ) | |||
{ | |||
final String message = REZ.getString( "type.no-factory.error" ); | |||
throw new ComponentException( message, te ); | |||
} | |||
} | |||
public void configure( final Configuration configuration ) | |||
throws ConfigurationException | |||
@@ -85,7 +63,8 @@ public class TypeInstanceTask | |||
try | |||
{ | |||
m_value = m_factory.create( configuration.getName() ); | |||
final TypeFactory typeFactory = getTypeFactory( DataType.ROLE ); | |||
m_value = typeFactory.create( configuration.getName() ); | |||
} | |||
catch( final Exception e ) | |||
{ | |||
@@ -24,6 +24,4 @@ public interface ExecutionFrame | |||
Logger getLogger(); | |||
TaskContext getContext(); | |||
ComponentManager getComponentManager(); | |||
} |