Hi,

This patch adds a getService() method to TaskContext.  This method replaces
Composable, as far as tasks are concerned.  The motivation was to provide a
place where tasks can get at services, and in particular, a
FileSystemManager.

TaskContext.getService() returns an Object.  Do we need to add a Service
interface (which we can later add a ROLE attribute to), or is Object
sufficient?

The change details:

* Changed all tasks that used to implement Composable, to use
TaskContext.getService() instead.

* Axed ExecutionFrame.getComponentManager().  DefaultExecutor no longer
composes tasks.

* DefaultTaskContext uses a ComponentManager to locate services.  Currently,
this is the same ComponentManager that used to be used to compose the tasks.

* Fixed Condition.evaluate() to work if the property is not defined.  It
should now only throw an exception when the condition is badly-formed.
Changed its signature to throw a TaskException, rather than a
ContextException.

* Changed LoadProperties to extend AbstractTask instead of
AbstractContainerTask.


Adam

<<attachment: newfiles.zip>>

Index: proposal/myrmidon/src/java/org/apache/antlib/core/Fail.java
===================================================================
RCS file: 
/home/cvspublic/jakarta-ant/proposal/myrmidon/src/java/org/apache/antlib/core/Fail.java,v
retrieving revision 1.4
diff -u -r1.4 Fail.java
--- proposal/myrmidon/src/java/org/apache/antlib/core/Fail.java 13 Jan 2002 
00:02:11 -0000      1.4
+++ proposal/myrmidon/src/java/org/apache/antlib/core/Fail.java 24 Jan 2002 
11:18:26 -0000
@@ -7,7 +7,6 @@
  */
 package org.apache.antlib.core;
 
-import org.apache.avalon.framework.context.ContextException;
 import org.apache.myrmidon.api.AbstractTask;
 import org.apache.myrmidon.api.TaskException;
 import org.apache.myrmidon.framework.Condition;
@@ -53,30 +52,23 @@
     public void execute()
         throws TaskException
     {
-        try
+        boolean failed = true;
+
+        if( null != m_condition )
         {
-            boolean failed = true;
+            failed = m_condition.evaluate( getContext() );
+        }
 
-            if( null != m_condition )
+        if( failed )
+        {
+            if( null != m_message )
             {
-                failed = m_condition.evaluate( getContext() );
+                throw new TaskException( m_message );
             }
-
-            if( failed )
+            else
             {
-                if( null != m_message )
-                {
-                    throw new TaskException( m_message );
-                }
-                else
-                {
-                    throw new TaskException();
-                }
+                throw new TaskException();
             }
-        }
-        catch( final ContextException ce )
-        {
-            throw new TaskException( ce.toString(), ce );
         }
     }
 
Index: proposal/myrmidon/src/java/org/apache/antlib/core/LoadProperties.java
===================================================================
RCS file: 
/home/cvspublic/jakarta-ant/proposal/myrmidon/src/java/org/apache/antlib/core/LoadProperties.java,v
retrieving revision 1.3
diff -u -r1.3 LoadProperties.java
--- proposal/myrmidon/src/java/org/apache/antlib/core/LoadProperties.java       
20 Jan 2002 17:32:58 -0000      1.3
+++ proposal/myrmidon/src/java/org/apache/antlib/core/LoadProperties.java       
24 Jan 2002 11:18:27 -0000
@@ -14,8 +14,8 @@
 import org.apache.avalon.excalibur.i18n.ResourceManager;
 import org.apache.avalon.excalibur.i18n.Resources;
 import org.apache.avalon.excalibur.io.IOUtil;
+import org.apache.myrmidon.api.AbstractTask;
 import org.apache.myrmidon.api.TaskException;
-import org.apache.myrmidon.framework.AbstractContainerTask;
 
 /**
  * This task loads properties from a property file and places them in the 
context.
@@ -24,7 +24,7 @@
  * @ant:task name="load-properties"
  */
 public class LoadProperties
-    extends AbstractContainerTask
+    extends AbstractTask
 {
     private final static Resources REZ =
         ResourceManager.getPackageResources( LoadProperties.class );
Index: proposal/myrmidon/src/java/org/apache/antlib/core/Property.java
===================================================================
RCS file: 
/home/cvspublic/jakarta-ant/proposal/myrmidon/src/java/org/apache/antlib/core/Property.java,v
retrieving revision 1.6
diff -u -r1.6 Property.java
--- proposal/myrmidon/src/java/org/apache/antlib/core/Property.java     22 Jan 
2002 11:47:14 -0000      1.6
+++ proposal/myrmidon/src/java/org/apache/antlib/core/Property.java     24 Jan 
2002 11:18:27 -0000
@@ -9,8 +9,6 @@
 
 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;
@@ -18,9 +16,7 @@
 import org.apache.myrmidon.api.TaskException;
 import org.apache.myrmidon.framework.AbstractContainerTask;
 import org.apache.myrmidon.framework.DataType;
-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.
@@ -41,24 +37,6 @@
     private String m_name;
     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( "property.bad-factory.error" 
);
-            throw new ComponentException( message, te );
-        }
-    }
 
     public void configure( final Configuration configuration )
         throws ConfigurationException
@@ -76,7 +54,8 @@
         {
             try
             {
-                final DataType value = (DataType)m_factory.create( children[ i 
].getName() );
+                final TypeFactory typeFactory = getTypeFactory( DataType.ROLE 
);
+                final DataType value = (DataType)typeFactory.create( children[ 
i ].getName() );
                 configure( value, children[ i ] );
                 setValue( value );
             }
Index: proposal/myrmidon/src/java/org/apache/antlib/core/Resources.properties
===================================================================
RCS file: 
/home/cvspublic/jakarta-ant/proposal/myrmidon/src/java/org/apache/antlib/core/Resources.properties,v
retrieving revision 1.5
diff -u -r1.5 Resources.properties
--- proposal/myrmidon/src/java/org/apache/antlib/core/Resources.properties      
12 Jan 2002 05:49:07 -0000      1.5
+++ proposal/myrmidon/src/java/org/apache/antlib/core/Resources.properties      
24 Jan 2002 11:18:27 -0000
@@ -1,4 +1,3 @@
-property.bad-factory.error=Unable to retrieve DataType factory from 
TypeManager.
 property.no-set.error=Unable to set datatype.
 property.multi-set.error=Value can not be set multiple times.
 property.no-name.error=Name must be specified.
Index: proposal/myrmidon/src/java/org/apache/antlib/runtime/ConverterDef.java
===================================================================
RCS file: 
/home/cvspublic/jakarta-ant/proposal/myrmidon/src/java/org/apache/antlib/runtime/ConverterDef.java,v
retrieving revision 1.4
diff -u -r1.4 ConverterDef.java
--- proposal/myrmidon/src/java/org/apache/antlib/runtime/ConverterDef.java      
20 Jan 2002 17:32:57 -0000      1.4
+++ proposal/myrmidon/src/java/org/apache/antlib/runtime/ConverterDef.java      
24 Jan 2002 11:18:27 -0000
@@ -11,9 +11,6 @@
 import java.net.URL;
 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.converter.Converter;
@@ -28,7 +25,6 @@
  */
 public class ConverterDef
     extends AbstractTask
-    implements Composable
 {
     private final static Resources REZ =
         ResourceManager.getPackageResources( ConverterDef.class );
@@ -37,15 +33,6 @@
     private String m_destinationType;
     private File m_lib;
     private String m_classname;
-    private ConverterRegistry m_converterRegistry;
-    private TypeManager m_typeManager;
-
-    public void compose( final ComponentManager componentManager )
-        throws ComponentException
-    {
-        m_converterRegistry = (ConverterRegistry)componentManager.lookup( 
ConverterRegistry.ROLE );
-        m_typeManager = (TypeManager)componentManager.lookup( TypeManager.ROLE 
);
-    }
 
     public void setLib( final File lib )
     {
@@ -93,13 +80,15 @@
 
         try
         {
-            m_converterRegistry.registerConverter( m_classname, m_sourceType, 
m_destinationType );
+            final ConverterRegistry converterRegistry = 
(ConverterRegistry)getService( ConverterRegistry.ROLE );
+            converterRegistry.registerConverter( m_classname, m_sourceType, 
m_destinationType );
 
             final URL url = m_lib.toURL();
             final DefaultTypeFactory factory = new DefaultTypeFactory( new 
URL[]{url} );
             factory.addNameClassMapping( m_classname, m_classname );
 
-            m_typeManager.registerType( Converter.ROLE, m_classname, factory );
+            final TypeManager typeManager = (TypeManager)getService( 
TypeManager.ROLE );
+            typeManager.registerType( Converter.ROLE, m_classname, factory );
         }
         catch( final Exception e )
         {
Index: proposal/myrmidon/src/java/org/apache/antlib/runtime/Facility.java
===================================================================
RCS file: 
/home/cvspublic/jakarta-ant/proposal/myrmidon/src/java/org/apache/antlib/runtime/Facility.java,v
retrieving revision 1.4
diff -u -r1.4 Facility.java
--- proposal/myrmidon/src/java/org/apache/antlib/runtime/Facility.java  20 Jan 
2002 17:32:57 -0000      1.4
+++ proposal/myrmidon/src/java/org/apache/antlib/runtime/Facility.java  24 Jan 
2002 11:18:27 -0000
@@ -9,9 +9,6 @@
 
 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.Configurable;
 import org.apache.avalon.framework.configuration.Configuration;
 import org.apache.avalon.framework.configuration.ConfigurationException;
@@ -19,9 +16,7 @@
 import org.apache.myrmidon.aspects.AspectHandler;
 import org.apache.myrmidon.framework.AbstractContainerTask;
 import org.apache.myrmidon.interfaces.aspect.AspectManager;
-import org.apache.myrmidon.interfaces.type.TypeException;
 import org.apache.myrmidon.interfaces.type.TypeFactory;
-import org.apache.myrmidon.interfaces.type.TypeManager;
 
 /**
  * Task that definesMethod to register a single converter.
@@ -30,7 +25,7 @@
  */
 public class Facility
     extends AbstractContainerTask
-    implements Composable, Configurable
+    implements Configurable
 {
     private final static Resources REZ =
         ResourceManager.getPackageResources( Facility.class );
@@ -38,28 +33,6 @@
     private String m_namespace;
     private AspectHandler m_aspectHandler;
 
-    private AspectManager m_aspectManager;
-    private TypeFactory m_factory;
-
-    public void compose( final ComponentManager componentManager )
-        throws ComponentException
-    {
-        super.compose( componentManager );
-
-        m_aspectManager = (AspectManager)componentManager.lookup( 
AspectManager.ROLE );
-
-        final TypeManager typeManager = (TypeManager)componentManager.lookup( 
TypeManager.ROLE );
-        try
-        {
-            m_factory = typeManager.getFactory( AspectHandler.ROLE );
-        }
-        catch( final TypeException te )
-        {
-            final String message = REZ.getString( "facility.no-factory.error" 
);
-            throw new ComponentException( message, te );
-        }
-    }
-
     public void configure( final Configuration configuration )
         throws ConfigurationException
     {
@@ -77,7 +50,8 @@
         {
             try
             {
-                m_aspectHandler = (AspectHandler)m_factory.create( children[ 0 
].getName() );
+                final TypeFactory typeFactory = getTypeFactory( 
AspectHandler.ROLE );
+                m_aspectHandler = (AspectHandler)typeFactory.create( children[ 
0 ].getName() );
             }
             catch( final Exception e )
             {
@@ -109,6 +83,7 @@
             throw new TaskException( message );
         }
 
-        m_aspectManager.addAspectHandler( m_namespace, m_aspectHandler );
+        final AspectManager aspectManager = (AspectManager)getService( 
AspectManager.ROLE );
+        aspectManager.addAspectHandler( m_namespace, m_aspectHandler );
     }
 }
Index: proposal/myrmidon/src/java/org/apache/antlib/runtime/Import.java
===================================================================
RCS file: 
/home/cvspublic/jakarta-ant/proposal/myrmidon/src/java/org/apache/antlib/runtime/Import.java,v
retrieving revision 1.4
diff -u -r1.4 Import.java
--- proposal/myrmidon/src/java/org/apache/antlib/runtime/Import.java    20 Jan 
2002 17:32:57 -0000      1.4
+++ proposal/myrmidon/src/java/org/apache/antlib/runtime/Import.java    24 Jan 
2002 11:18:28 -0000
@@ -10,9 +10,6 @@
 import java.io.File;
 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.deployer.Deployer;
@@ -25,19 +22,11 @@
  */
 public class Import
     extends AbstractTask
-    implements Composable
 {
     private final static Resources REZ =
         ResourceManager.getPackageResources( Import.class );
 
     private File m_lib;
-    private Deployer m_deployer;
-
-    public void compose( final ComponentManager componentManager )
-        throws ComponentException
-    {
-        m_deployer = (Deployer)componentManager.lookup( Deployer.ROLE );
-    }
 
     public void setLib( final File lib )
     {
@@ -55,7 +44,8 @@
 
         try
         {
-            m_deployer.deploy( m_lib );
+            final Deployer deployer = (Deployer)getService( Deployer.ROLE );
+            deployer.deploy( m_lib );
         }
         catch( final DeploymentException de )
         {
Index: proposal/myrmidon/src/java/org/apache/antlib/runtime/Resources.properties
===================================================================
RCS file: 
/home/cvspublic/jakarta-ant/proposal/myrmidon/src/java/org/apache/antlib/runtime/Resources.properties,v
retrieving revision 1.1
diff -u -r1.1 Resources.properties
--- proposal/myrmidon/src/java/org/apache/antlib/runtime/Resources.properties   
17 Dec 2001 08:48:57 -0000      1.1
+++ proposal/myrmidon/src/java/org/apache/antlib/runtime/Resources.properties   
24 Jan 2002 11:18:28 -0000
@@ -4,7 +4,6 @@
 converterdef.no-lib.error=Must specify the lib parameter.
 converterdef.no-register.error=Failed to register converter {0}.
 
-facility.no-factory.error=Unable to retrieve AspectHandler factory from 
TypeManager.
 facility.no-create.error=Failed to create aspect handler of type {0}.
 facility.multi-element.error=Expected one sub-element to configure facility.
 facility.no-namespace.error=Must specify namespace parameter.
Index: proposal/myrmidon/src/java/org/apache/myrmidon/api/AbstractTask.java
===================================================================
RCS file: 
/home/cvspublic/jakarta-ant/proposal/myrmidon/src/java/org/apache/myrmidon/api/AbstractTask.java,v
retrieving revision 1.13
diff -u -r1.13 AbstractTask.java
--- proposal/myrmidon/src/java/org/apache/myrmidon/api/AbstractTask.java        
5 Jan 2002 03:02:41 -0000       1.13
+++ proposal/myrmidon/src/java/org/apache/myrmidon/api/AbstractTask.java        
24 Jan 2002 11:18:28 -0000
@@ -8,10 +8,15 @@
 package org.apache.myrmidon.api;
 
 import java.io.File;
+import org.apache.avalon.excalibur.i18n.ResourceManager;
+import org.apache.avalon.excalibur.i18n.Resources;
 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;
+import org.apache.myrmidon.interfaces.type.TypeException;
+import org.apache.myrmidon.interfaces.type.TypeFactory;
+import org.apache.myrmidon.interfaces.type.TypeManager;
 
 /**
  * This is the class that Task writers should extend to provide custom tasks.
@@ -22,6 +27,9 @@
     extends AbstractLogEnabled
     implements Task, Contextualizable
 {
+    private final static Resources REZ =
+        ResourceManager.getPackageResources( AbstractTask.class );
+
     ///Variable to hold context for use by sub-classes
     private TaskContext m_context;
 
@@ -31,6 +39,7 @@
      * @param context the context
      */
     public void contextualize( final Context context )
+        throws ContextException
     {
         m_context = (TaskContext)context;
     }
@@ -103,6 +112,30 @@
         throws TaskException
     {
         getContext().setProperty( name, value, scope );
+    }
+
+    protected final Object getService ( final String role )
+        throws TaskException
+    {
+        return getContext().getService( role );
+    }
+
+    /**
+     * Locates a type factory.
+     */
+    protected final TypeFactory getTypeFactory( final String role )
+        throws TaskException
+    {
+        final TypeManager typeManager = (TypeManager)getService( 
TypeManager.ROLE );
+        try
+        {
+            return typeManager.getFactory( role );
+        }
+        catch( final TypeException te )
+        {
+            final String message = REZ.getString( 
"abstracttask.no-factory.error", role );
+            throw new TaskException( message, te );
+        }
     }
 
     protected final TaskContext createSubContext( final String name )
Index: proposal/myrmidon/src/java/org/apache/myrmidon/api/TaskContext.java
===================================================================
RCS file: 
/home/cvspublic/jakarta-ant/proposal/myrmidon/src/java/org/apache/myrmidon/api/TaskContext.java,v
retrieving revision 1.13
diff -u -r1.13 TaskContext.java
--- proposal/myrmidon/src/java/org/apache/myrmidon/api/TaskContext.java 5 Jan 
2002 03:02:11 -0000       1.13
+++ proposal/myrmidon/src/java/org/apache/myrmidon/api/TaskContext.java 24 Jan 
2002 11:18:29 -0000
@@ -100,6 +100,14 @@
         throws TaskException;
 
     /**
+     * Locates a service, by role name.
+     *
+     * @param role the service role.
+     */
+    Object getService( String role )
+        throws TaskException;
+
+    /**
      * Create a Child Context.
      * This allows separate hierarchly contexts to be easily constructed.
      *
Index: 
proposal/myrmidon/src/java/org/apache/myrmidon/components/executor/AspectAwareExecutor.java
===================================================================
RCS file: 
/home/cvspublic/jakarta-ant/proposal/myrmidon/src/java/org/apache/myrmidon/components/executor/AspectAwareExecutor.java,v
retrieving revision 1.13
diff -u -r1.13 AspectAwareExecutor.java
--- 
proposal/myrmidon/src/java/org/apache/myrmidon/components/executor/AspectAwareExecutor.java
 20 Jan 2002 17:32:56 -0000      1.13
+++ 
proposal/myrmidon/src/java/org/apache/myrmidon/components/executor/AspectAwareExecutor.java
 24 Jan 2002 11:18:31 -0000
@@ -81,9 +81,6 @@
         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() );
Index: 
proposal/myrmidon/src/java/org/apache/myrmidon/components/executor/DefaultExecutionFrame.java
===================================================================
RCS file: 
/home/cvspublic/jakarta-ant/proposal/myrmidon/src/java/org/apache/myrmidon/components/executor/DefaultExecutionFrame.java,v
retrieving revision 1.9
diff -u -r1.9 DefaultExecutionFrame.java
--- 
proposal/myrmidon/src/java/org/apache/myrmidon/components/executor/DefaultExecutionFrame.java
       23 Dec 2001 06:25:35 -0000      1.9
+++ 
proposal/myrmidon/src/java/org/apache/myrmidon/components/executor/DefaultExecutionFrame.java
       24 Jan 2002 11:18:31 -0000
@@ -12,9 +12,11 @@
 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 @@
  * @author <a href="mailto:[EMAIL PROTECTED]">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.ROLE );
+        }
+        catch( TaskException te )
+        {
+            throw new ContextException(te.getMessage(), te);
+        }
     }
 
     public TypeManager getTypeManager()
@@ -69,10 +63,5 @@
     public TaskContext getContext()
     {
         return m_context;
-    }
-
-    public ComponentManager getComponentManager()
-    {
-        return m_componentManager;
     }
 }
Index: 
proposal/myrmidon/src/java/org/apache/myrmidon/components/executor/DefaultExecutor.java
===================================================================
RCS file: 
/home/cvspublic/jakarta-ant/proposal/myrmidon/src/java/org/apache/myrmidon/components/executor/DefaultExecutor.java,v
retrieving revision 1.18
diff -u -r1.18 DefaultExecutor.java
--- 
proposal/myrmidon/src/java/org/apache/myrmidon/components/executor/DefaultExecutor.java
     20 Jan 2002 17:32:56 -0000      1.18
+++ 
proposal/myrmidon/src/java/org/apache/myrmidon/components/executor/DefaultExecutor.java
     24 Jan 2002 11:18:31 -0000
@@ -59,9 +59,6 @@
         debug( "contextualizing.notice" );
         doContextualize( task, taskModel, frame.getContext() );
 
-        debug( "composing.notice" );
-        doCompose( task, taskModel, frame.getComponentManager() );
-
         debug( "configuring.notice" );
         doConfigure( task, taskModel, frame.getContext() );
 
@@ -110,29 +107,6 @@
                                taskModel.getLocation(),
                                throwable.getMessage() );
             throw new TaskException( message, throwable );
-        }
-    }
-
-    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 );
-            }
         }
     }
 
Index: 
proposal/myrmidon/src/java/org/apache/myrmidon/components/executor/Resources.properties
===================================================================
RCS file: 
/home/cvspublic/jakarta-ant/proposal/myrmidon/src/java/org/apache/myrmidon/components/executor/Resources.properties,v
retrieving revision 1.2
diff -u -r1.2 Resources.properties
--- 
proposal/myrmidon/src/java/org/apache/myrmidon/components/executor/Resources.properties
     19 Nov 2001 12:37:25 -0000      1.2
+++ 
proposal/myrmidon/src/java/org/apache/myrmidon/components/executor/Resources.properties
     24 Jan 2002 11:18:31 -0000
@@ -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 @@
 
 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}).
 context.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}).
Index: 
proposal/myrmidon/src/java/org/apache/myrmidon/components/workspace/DefaultTaskContext.java
===================================================================
RCS file: 
/home/cvspublic/jakarta-ant/proposal/myrmidon/src/java/org/apache/myrmidon/components/workspace/DefaultTaskContext.java,v
retrieving revision 1.8
diff -u -r1.8 DefaultTaskContext.java
--- 
proposal/myrmidon/src/java/org/apache/myrmidon/components/workspace/DefaultTaskContext.java
 20 Jan 2002 17:32:58 -0000      1.8
+++ 
proposal/myrmidon/src/java/org/apache/myrmidon/components/workspace/DefaultTaskContext.java
 24 Jan 2002 11:18:32 -0000
@@ -14,6 +14,9 @@
 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.ComponentException;
+import org.apache.avalon.framework.component.ComponentManager;
+import org.apache.avalon.framework.component.Composable;
 import org.apache.avalon.framework.context.ContextException;
 import org.apache.avalon.framework.context.DefaultContext;
 import org.apache.myrmidon.api.TaskContext;
@@ -26,11 +29,13 @@
  */
 public class DefaultTaskContext
     extends DefaultContext
-    implements TaskContext
+    implements TaskContext, Composable
 {
     private final static Resources REZ =
         ResourceManager.getPackageResources( DefaultTaskContext.class );
 
+    private ComponentManager m_componentManager;
+
     /**
      * Constructor for Context with no parent contexts.
      */
@@ -55,6 +60,11 @@
         super( parent );
     }
 
+    public void compose( ComponentManager manager )
+    {
+        m_componentManager = manager;
+    }
+
     /**
      * Retrieve Name of tasklet.
      *
@@ -180,7 +190,8 @@
 
         if( CURRENT == scope ) {
             put( name, value );
-        } else if( PARENT == scope )
+        }
+        else if( PARENT == scope )
         {
             if( null == getParent() )
             {
@@ -207,6 +218,36 @@
         {
             final String message = REZ.getString( "bad-scope.error", scope );
             throw new IllegalStateException( message );
+        }
+    }
+
+    /**
+     * Locates a service, by role name.
+     *
+     * @param role the service role.
+     */
+    public Object getService( String role )
+        throws TaskException
+    {
+        if( m_componentManager != null )
+        {
+            try
+            {
+                return m_componentManager.lookup( role );
+            }
+            catch( ComponentException e )
+            {
+                final String message = REZ.getString( 
"bad-find-service.error", role );
+                throw new TaskException( message, e );
+            }
+        }
+        else if( getParent() != null )
+        {
+            return ( (TaskContext) getParent() ).getService( role );
+        }
+        else {
+            final String message = REZ.getString( "bad-find-service.error", 
role );
+            throw new TaskException( message );
         }
     }
 
Index: 
proposal/myrmidon/src/java/org/apache/myrmidon/components/workspace/DefaultWorkspace.java
===================================================================
RCS file: 
/home/cvspublic/jakarta-ant/proposal/myrmidon/src/java/org/apache/myrmidon/components/workspace/DefaultWorkspace.java,v
retrieving revision 1.12
diff -u -r1.12 DefaultWorkspace.java
--- 
proposal/myrmidon/src/java/org/apache/myrmidon/components/workspace/DefaultWorkspace.java
   20 Jan 2002 17:32:58 -0000      1.12
+++ 
proposal/myrmidon/src/java/org/apache/myrmidon/components/workspace/DefaultWorkspace.java
   24 Jan 2002 11:18:33 -0000
@@ -19,7 +19,6 @@
 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;
@@ -219,9 +218,6 @@
     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 +263,11 @@
             componentManager.put( Project.ROLE + "/" + name, other );
         }
 
+        // Create and configure the context
+        final DefaultTaskContext context = new DefaultTaskContext( 
m_baseContext );
+        context.setProperty( TaskContext.BASE_DIRECTORY, 
project.getBaseDirectory() );
+        context.compose( componentManager );
+
         final DefaultExecutionFrame frame = new DefaultExecutionFrame();
 
         try
@@ -276,7 +277,6 @@
 
             frame.enableLogging( logger );
             frame.contextualize( context );
-            frame.compose( componentManager );
         }
         catch( final Exception e )
         {
@@ -401,10 +401,10 @@
                     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 );
             }
         }
 
Index: 
proposal/myrmidon/src/java/org/apache/myrmidon/components/workspace/Resources.properties
===================================================================
RCS file: 
/home/cvspublic/jakarta-ant/proposal/myrmidon/src/java/org/apache/myrmidon/components/workspace/Resources.properties,v
retrieving revision 1.4
diff -u -r1.4 Resources.properties
--- 
proposal/myrmidon/src/java/org/apache/myrmidon/components/workspace/Resources.properties
    5 Jan 2002 03:03:55 -0000       1.4
+++ 
proposal/myrmidon/src/java/org/apache/myrmidon/components/workspace/Resources.properties
    24 Jan 2002 11:18:33 -0000
@@ -15,7 +15,9 @@
 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}".
\ No newline at end of file
+bad-resolve.error=Unable to resolve value "{0}".
+bad-find-service.error=Could not find service "{0}".
Index: 
proposal/myrmidon/src/java/org/apache/myrmidon/framework/AbstractContainerTask.java
===================================================================
RCS file: 
/home/cvspublic/jakarta-ant/proposal/myrmidon/src/java/org/apache/myrmidon/framework/AbstractContainerTask.java,v
retrieving revision 1.10
diff -u -r1.10 AbstractContainerTask.java
--- 
proposal/myrmidon/src/java/org/apache/myrmidon/framework/AbstractContainerTask.java
 20 Jan 2002 17:32:56 -0000      1.10
+++ 
proposal/myrmidon/src/java/org/apache/myrmidon/framework/AbstractContainerTask.java
 24 Jan 2002 11:18:33 -0000
@@ -9,15 +9,12 @@
 
 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.converter.Converter;
 import org.apache.myrmidon.converter.ConverterException;
 import org.apache.myrmidon.interfaces.configurer.Configurer;
@@ -31,7 +28,6 @@
  */
 public abstract class AbstractContainerTask
     extends AbstractTask
-    implements Composable
 {
     private final static Resources REZ =
         ResourceManager.getPackageResources( AbstractContainerTask.class );
@@ -45,12 +41,25 @@
     ///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( Context context )
+        throws ContextException
     {
-        m_configurer = (Configurer)componentManager.lookup( Configurer.ROLE );
-        m_converter = (MasterConverter)componentManager.lookup( 
MasterConverter.ROLE );
-        m_executor = (Executor)componentManager.lookup( Executor.ROLE );
+        super.contextualize( context );
+        try
+        {
+            m_configurer = (Configurer)getService( Configurer.ROLE );
+            m_converter = (MasterConverter)getService( MasterConverter.ROLE );
+            m_executor = (Executor)getService( Executor.ROLE );
+        }
+        catch( TaskException te )
+        {
+            throw new ContextException(te.getMessage(), te);
+        }
     }
 
     /**
Index: 
proposal/myrmidon/src/java/org/apache/myrmidon/framework/AbstractTypeDef.java
===================================================================
RCS file: 
/home/cvspublic/jakarta-ant/proposal/myrmidon/src/java/org/apache/myrmidon/framework/AbstractTypeDef.java,v
retrieving revision 1.11
diff -u -r1.11 AbstractTypeDef.java
--- 
proposal/myrmidon/src/java/org/apache/myrmidon/framework/AbstractTypeDef.java   
    20 Jan 2002 17:32:56 -0000      1.11
+++ 
proposal/myrmidon/src/java/org/apache/myrmidon/framework/AbstractTypeDef.java   
    24 Jan 2002 11:18:33 -0000
@@ -12,9 +12,6 @@
 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 @@
  */
 public abstract class AbstractTypeDef
     extends AbstractTask
-    implements Composable
 {
     private final static Resources REZ =
         ResourceManager.getPackageResources( AbstractTypeDef.class );
@@ -39,15 +35,6 @@
     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 @@
         }
 
         final String typeName = getTypeName();
-        final String role = m_roleManager.getRoleForName( typeName );
+        final RoleManager roleManager = (RoleManager)getService( 
RoleManager.ROLE );
+        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.ROLE );
         try
         {
-            m_typeManager.registerType( role, m_name, factory );
+            typeManager.registerType( role, m_name, factory );
         }
         catch( final TypeException te )
         {
@@ -114,11 +103,6 @@
             final String message = REZ.getString( 
"typedef.bad-classloader.error", e );
             throw new TaskException( message, e );
         }
-    }
-
-    protected final TypeManager getTypeManager()
-    {
-        return m_typeManager;
     }
 
     protected abstract String getTypeName();
Index: proposal/myrmidon/src/java/org/apache/myrmidon/framework/Condition.java
===================================================================
RCS file: 
/home/cvspublic/jakarta-ant/proposal/myrmidon/src/java/org/apache/myrmidon/framework/Condition.java,v
retrieving revision 1.9
diff -u -r1.9 Condition.java
--- proposal/myrmidon/src/java/org/apache/myrmidon/framework/Condition.java     
22 Jan 2002 11:46:30 -0000      1.9
+++ proposal/myrmidon/src/java/org/apache/myrmidon/framework/Condition.java     
24 Jan 2002 11:18:34 -0000
@@ -45,7 +45,7 @@
     }
 
     public boolean evaluate( final TaskContext context )
-        throws ContextException
+        throws TaskException
     {
         boolean result = false;
 
@@ -66,8 +66,9 @@
                 }
             }
         }
-        catch( final TaskException te )
+        catch( final ContextException ce )
         {
+            // Unknown property
             result = false;
         }
         /*
Index: proposal/myrmidon/src/java/org/apache/myrmidon/framework/Pattern.java
===================================================================
RCS file: 
/home/cvspublic/jakarta-ant/proposal/myrmidon/src/java/org/apache/myrmidon/framework/Pattern.java,v
retrieving revision 1.12
diff -u -r1.12 Pattern.java
--- proposal/myrmidon/src/java/org/apache/myrmidon/framework/Pattern.java       
23 Jan 2002 10:18:23 -0000      1.12
+++ proposal/myrmidon/src/java/org/apache/myrmidon/framework/Pattern.java       
24 Jan 2002 11:18:34 -0000
@@ -9,10 +9,8 @@
 
 import org.apache.avalon.excalibur.i18n.ResourceManager;
 import org.apache.avalon.excalibur.i18n.Resources;
-import org.apache.avalon.framework.context.ContextException;
-import org.apache.myrmidon.api.TaskException;
 import org.apache.myrmidon.api.TaskContext;
-import org.apache.tools.ant.Project;
+import org.apache.myrmidon.api.TaskException;
 
 /**
  * Basic data type for holding patterns.
@@ -103,7 +101,7 @@
                 return getName();
             }
         }
-        catch( final ContextException ce )
+        catch( final TaskException te )
         {
             //ignore for the moment
         }
Index: 
proposal/myrmidon/src/java/org/apache/myrmidon/framework/Resources.properties
===================================================================
RCS file: 
/home/cvspublic/jakarta-ant/proposal/myrmidon/src/java/org/apache/myrmidon/framework/Resources.properties,v
retrieving revision 1.3
diff -u -r1.3 Resources.properties
--- 
proposal/myrmidon/src/java/org/apache/myrmidon/framework/Resources.properties   
    16 Dec 2001 12:10:29 -0000      1.3
+++ 
proposal/myrmidon/src/java/org/apache/myrmidon/framework/Resources.properties   
    24 Jan 2002 11:18:34 -0000
@@ -11,7 +11,6 @@
 
 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.
 
Index: 
proposal/myrmidon/src/java/org/apache/myrmidon/framework/TypeInstanceTask.java
===================================================================
RCS file: 
/home/cvspublic/jakarta-ant/proposal/myrmidon/src/java/org/apache/myrmidon/framework/TypeInstanceTask.java,v
retrieving revision 1.8
diff -u -r1.8 TypeInstanceTask.java
--- 
proposal/myrmidon/src/java/org/apache/myrmidon/framework/TypeInstanceTask.java  
    20 Jan 2002 17:32:56 -0000      1.8
+++ 
proposal/myrmidon/src/java/org/apache/myrmidon/framework/TypeInstanceTask.java  
    24 Jan 2002 11:18:34 -0000
@@ -9,17 +9,13 @@
 
 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 @@
     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 @@
 
         try
         {
-            m_value = m_factory.create( configuration.getName() );
+            final TypeFactory typeFactory = getTypeFactory( DataType.ROLE );
+            m_value = typeFactory.create( configuration.getName() );
         }
         catch( final Exception e )
         {
Index: 
proposal/myrmidon/src/java/org/apache/myrmidon/interfaces/executor/ExecutionFrame.java
===================================================================
RCS file: 
/home/cvspublic/jakarta-ant/proposal/myrmidon/src/java/org/apache/myrmidon/interfaces/executor/ExecutionFrame.java,v
retrieving revision 1.5
diff -u -r1.5 ExecutionFrame.java
--- 
proposal/myrmidon/src/java/org/apache/myrmidon/interfaces/executor/ExecutionFrame.java
      23 Dec 2001 06:25:36 -0000      1.5
+++ 
proposal/myrmidon/src/java/org/apache/myrmidon/interfaces/executor/ExecutionFrame.java
      24 Jan 2002 11:18:35 -0000
@@ -24,6 +24,4 @@
     Logger getLogger();
 
     TaskContext getContext();
-
-    ComponentManager getComponentManager();
 }
Index: proposal/myrmidon/src/make/sample.ant
===================================================================
RCS file: /home/cvspublic/jakarta-ant/proposal/myrmidon/src/make/sample.ant,v
retrieving revision 1.24
diff -u -r1.24 sample.ant
--- proposal/myrmidon/src/make/sample.ant       19 Jan 2002 07:44:26 -0000      
1.24
+++ proposal/myrmidon/src/make/sample.ant       24 Jan 2002 11:18:37 -0000
@@ -81,10 +81,10 @@
 
   <target name="datatype-test">
     <property name="foo">
-      <pattern value="*.java"/>
+      <pattern name="*.java"/>
     </property>
 
-    <pattern id="foo2" value="*.java" if="..." />
+    <pattern id="foo2" name="*.java" if="..." />
 
     <log message="foo=${foo}" />
     <log message="foo2=${foo2}" />
Index: 
proposal/myrmidon/src/testcases/org/apache/myrmidon/components/configurer/DefaultConfigurerTest.java
===================================================================
RCS file: 
/home/cvspublic/jakarta-ant/proposal/myrmidon/src/testcases/org/apache/myrmidon/components/configurer/DefaultConfigurerTest.java,v
retrieving revision 1.1
diff -u -r1.1 DefaultConfigurerTest.java
--- 
proposal/myrmidon/src/testcases/org/apache/myrmidon/components/configurer/DefaultConfigurerTest.java
        22 Jan 2002 11:16:02 -0000      1.1
+++ 
proposal/myrmidon/src/testcases/org/apache/myrmidon/components/configurer/DefaultConfigurerTest.java
        24 Jan 2002 11:18:38 -0000
@@ -101,13 +101,17 @@
         m_componentManager.put( Configurer.ROLE, component );
         components.add( component );
 
+        // Setup a context
+        m_context = new DefaultTaskContext();
+        components.add( m_context );
+
         // Log enable the components
         for( Iterator iterator = components.iterator(); iterator.hasNext(); )
         {
-            component = (Component)iterator.next();
-            if( component instanceof LogEnabled )
+            Object obj = iterator.next();
+            if( obj instanceof LogEnabled )
             {
-                final LogEnabled logEnabled = (LogEnabled)component;
+                final LogEnabled logEnabled = (LogEnabled)obj;
                 logEnabled.enableLogging( m_logger );
             }
         }
@@ -115,21 +119,21 @@
         // Compose the components
         for( Iterator iterator = components.iterator(); iterator.hasNext(); )
         {
-            component = (Component)iterator.next();
-            if( component instanceof Composable )
+            Object obj = iterator.next();
+            if( obj instanceof Composable )
             {
-                final Composable composable = (Composable)component;
+                final Composable composable = (Composable)obj;
                 composable.compose( m_componentManager );
             }
         }
 
+        // Configure the context
+        final File baseDir = new File( "." ).getAbsoluteFile();
+        m_context.setProperty( TaskContext.BASE_DIRECTORY, baseDir );
+
         // Find the configurer
         m_configurer = (Configurer)m_componentManager.lookup( Configurer.ROLE 
);
 
-        // Setup a context
-        m_context = new DefaultTaskContext();
-        final File baseDir = new File( "." ).getAbsoluteFile();
-        m_context.setProperty( TaskContext.BASE_DIRECTORY, baseDir );
     }
 
     /**

--
To unsubscribe, e-mail:   <mailto:[EMAIL PROTECTED]>
For additional commands, e-mail: <mailto:[EMAIL PROTECTED]>

Reply via email to