diff --git a/proposal/myrmidon/build.sh b/proposal/myrmidon/build.sh index 2eef1eb13..5a791b734 100644 --- a/proposal/myrmidon/build.sh +++ b/proposal/myrmidon/build.sh @@ -10,6 +10,6 @@ chmod u+x $MYRMIDON_HOME/bin/antRun chmod u+x $MYRMIDON_HOME/bin/ant export ANT_HOME= -export CLASSPATH=lib/xerces.jar +export CLASSPATH=lib/crimson.jar:lib/jaxp.jar $MYRMIDON_HOME/bin/ant -logger org.apache.tools.ant.NoBannerLogger -emacs $@ diff --git a/proposal/myrmidon/lib/avalon-excalibur.jar b/proposal/myrmidon/lib/avalon-excalibur.jar index 1465c5e51..063dc1778 100644 Binary files a/proposal/myrmidon/lib/avalon-excalibur.jar and b/proposal/myrmidon/lib/avalon-excalibur.jar differ diff --git a/proposal/myrmidon/lib/avalon-framework.jar b/proposal/myrmidon/lib/avalon-framework.jar index 8d96f32e1..543b18716 100644 Binary files a/proposal/myrmidon/lib/avalon-framework.jar and b/proposal/myrmidon/lib/avalon-framework.jar differ diff --git a/proposal/myrmidon/lib/xerces.jar b/proposal/myrmidon/lib/xerces.jar deleted file mode 100644 index f4708953a..000000000 Binary files a/proposal/myrmidon/lib/xerces.jar and /dev/null differ diff --git a/proposal/myrmidon/src/java/org/apache/myrmidon/api/AbstractTask.java b/proposal/myrmidon/src/java/org/apache/myrmidon/api/AbstractTask.java index 575116ed3..29d37ff5d 100644 --- a/proposal/myrmidon/src/java/org/apache/myrmidon/api/AbstractTask.java +++ b/proposal/myrmidon/src/java/org/apache/myrmidon/api/AbstractTask.java @@ -63,7 +63,6 @@ public abstract class AbstractTask * @exception Exception if an error occurs */ public void dispose() - throws Exception { } diff --git a/proposal/myrmidon/src/java/org/apache/myrmidon/api/DefaultTaskContext.java b/proposal/myrmidon/src/java/org/apache/myrmidon/api/DefaultTaskContext.java index 25f91ef3e..c6f90f1e1 100644 --- a/proposal/myrmidon/src/java/org/apache/myrmidon/api/DefaultTaskContext.java +++ b/proposal/myrmidon/src/java/org/apache/myrmidon/api/DefaultTaskContext.java @@ -165,23 +165,23 @@ public class DefaultTaskContext if( CURRENT == scope ) put( name, value ); else if( PARENT == scope ) { - if( null == m_parent ) + if( null == getParent() ) { throw new TaskException( "Can't set a property with parent scope when context " + " has no parent" ); } else { - ((DefaultTaskContext)m_parent).put( name, value ); + ((DefaultTaskContext)getParent()).put( name, value ); } } else if( TOP_LEVEL == scope ) { DefaultTaskContext context = this; - while( null != context.m_parent ) + while( null != context.getParent() ) { - context = (DefaultTaskContext)context.m_parent; + context = (DefaultTaskContext)context.getParent(); } context.putValue( name, value ); diff --git a/proposal/myrmidon/src/java/org/apache/myrmidon/components/embeddor/DefaultEmbeddor.java b/proposal/myrmidon/src/java/org/apache/myrmidon/components/embeddor/DefaultEmbeddor.java index 336332b70..44120ffcd 100644 --- a/proposal/myrmidon/src/java/org/apache/myrmidon/components/embeddor/DefaultEmbeddor.java +++ b/proposal/myrmidon/src/java/org/apache/myrmidon/components/embeddor/DefaultEmbeddor.java @@ -182,7 +182,8 @@ public class DefaultEmbeddor defaults.setParameter( TypeManager.ROLE, "org.apache.myrmidon.components.type.DefaultTypeManager" ); defaults.setParameter( Executor.ROLE, - "org.apache.myrmidon.components.executor.DefaultExecutor" ); + //"org.apache.myrmidon.components.executor.DefaultExecutor" ); + "org.apache.myrmidon.components.executor.AspectAwareExecutor" ); defaults.setParameter( ProjectManager.ROLE, "org.apache.myrmidon.components.manager.DefaultProjectManager" ); defaults.setParameter( ProjectBuilder.ROLE, diff --git a/proposal/myrmidon/src/java/org/apache/myrmidon/components/executor/AspectAwareExecutor.java b/proposal/myrmidon/src/java/org/apache/myrmidon/components/executor/AspectAwareExecutor.java new file mode 100644 index 000000000..381b1d4b1 --- /dev/null +++ b/proposal/myrmidon/src/java/org/apache/myrmidon/components/executor/AspectAwareExecutor.java @@ -0,0 +1,205 @@ +/* + * Copyright (C) The Apache Software Foundation. All rights reserved. + * + * This software is published under the terms of the Apache Software License + * version 1.1, a copy of which has been included with this distribution in + * the LICENSE file. + */ +package org.apache.myrmidon.components.executor; + +import java.util.HashMap; +import java.util.ArrayList; +import org.apache.avalon.framework.component.ComponentException; +import org.apache.avalon.framework.component.ComponentManager; +import org.apache.avalon.framework.configuration.Configuration; +import org.apache.avalon.framework.parameters.Parameters; +import org.apache.avalon.framework.configuration.DefaultConfiguration; +import org.apache.myrmidon.api.Task; +import org.apache.myrmidon.api.TaskContext; +import org.apache.myrmidon.api.TaskException; +import org.apache.myrmidon.aspects.AspectHandler; +import org.apache.myrmidon.components.aspect.AspectManager; + +public class AspectAwareExecutor + extends DefaultExecutor +{ + private final static Parameters EMPTY_PARAMETERS; + private final static Configuration[] EMPTY_ELEMENTS = new Configuration[ 0 ]; + + static + { + EMPTY_PARAMETERS = new Parameters(); + EMPTY_PARAMETERS.makeReadOnly(); + } + + private AspectManager m_aspectManager; + + public AspectAwareExecutor() + { + } + + /** + * Retrieve relevent services. + * + * @param componentManager the ComponentManager + * @exception ComponentException if an error occurs + */ + public void compose( final ComponentManager componentManager ) + throws ComponentException + { + super.compose( componentManager ); + + m_aspectManager = (AspectManager)componentManager.lookup( AspectManager.ROLE ); + } + + public void execute( final Configuration taskModel, final TaskContext context ) + throws TaskException + { + try + { + executeTask( taskModel, context ); + } + catch( final TaskException te ) + { + if( false == getAspectHandler().error( te ) ) + { + throw te; + } + } + } + + private void executeTask( Configuration taskModel, final TaskContext context ) + throws TaskException + { + getLogger().debug( "Creating" ); + + taskModel = getAspectHandler().preCreate( taskModel ); + + taskModel = prepareAspects( taskModel ); + + final Task task = createTask( taskModel.getName() ); + getAspectHandler().postCreate( task ); + + getAspectHandler().preLoggable( getLogger() ); + setupLogger( task ); + + getLogger().debug( "Contextualizing" ); + doContextualize( task, taskModel, context ); + + getLogger().debug( "Composing" ); + doCompose( task, taskModel ); + + getLogger().debug( "Configuring" ); + getAspectHandler().preConfigure( taskModel ); + doConfigure( task, taskModel, context ); + + getLogger().debug( "Initializing" ); + doInitialize( task, taskModel ); + + getLogger().debug( "Executing" ); + getAspectHandler().preExecute(); + task.execute(); + + getLogger().debug( "Disposing" ); + getAspectHandler().preDestroy(); + doDispose( task, taskModel ); + } + + //TODO: Extract and clean taskModel here. + //Get all parameters from model and provide to appropriate aspect. + //aspect( final Parameters parameters, final Configuration[] elements ) + private Configuration prepareAspects( final Configuration taskModel ) + throws TaskException + { + final DefaultConfiguration newTaskModel = + new DefaultConfiguration( taskModel.getName(), taskModel.getLocation() ); + final HashMap parameterMap = new HashMap(); + final HashMap elementMap = new HashMap(); + + processAttributes( taskModel, newTaskModel, parameterMap ); + processElements( taskModel, newTaskModel, elementMap ); + + return newTaskModel; + } + + private final void processElements( final Configuration taskModel, + final DefaultConfiguration newTaskModel, + final HashMap map ) + { + final Configuration[] elements = taskModel.getChildren(); + for( int i = 0; i < elements.length; i++ ) + { + final String name = elements[ i ].getName(); + final int index = name.indexOf( ':' ); + + if( -1 == index ) + { + newTaskModel.addChild( elements[ i ] ); + } + else + { + final String namespace = name.substring( 0, index ); + final String localName = name.substring( index + 1 ); + final ArrayList elementSet = getElements( namespace, map ); + elementSet.add( elements[ i ] ); + } + } + } + + private final void processAttributes( final Configuration taskModel, + final DefaultConfiguration newTaskModel, + final HashMap map ) + { + final String[] attributes = taskModel.getAttributeNames(); + for( int i = 0; i < attributes.length; i++ ) + { + final String name = attributes[ i ]; + final String value = taskModel.getAttribute( name, null ); + + final int index = name.indexOf( ':' ); + + if( -1 == index ) + { + newTaskModel.setAttribute( name, value ); + } + else + { + final String namespace = name.substring( 0, index ); + final String localName = name.substring( index + 1 ); + final Parameters parameters = getParameters( namespace, map ); + parameters.setParameter( localName, value ); + } + } + } + + private final ArrayList getElements( final String namespace, final HashMap map ) + { + ArrayList elements = (ArrayList)map.get( namespace ); + + if( null == elements ) + { + elements = new ArrayList(); + map.put( namespace, elements ); + } + + return elements; + } + + private final Parameters getParameters( final String namespace, final HashMap map ) + { + Parameters parameters = (Parameters)map.get( namespace ); + + if( null == parameters ) + { + parameters = new Parameters(); + map.put( namespace, parameters ); + } + + return parameters; + } + + protected final AspectHandler getAspectHandler() + { + return m_aspectManager; + } +} diff --git a/proposal/myrmidon/src/java/org/apache/myrmidon/components/executor/DefaultExecutor.java b/proposal/myrmidon/src/java/org/apache/myrmidon/components/executor/DefaultExecutor.java index 78238e8ef..344a5b12f 100644 --- a/proposal/myrmidon/src/java/org/apache/myrmidon/components/executor/DefaultExecutor.java +++ b/proposal/myrmidon/src/java/org/apache/myrmidon/components/executor/DefaultExecutor.java @@ -61,34 +61,34 @@ public class DefaultExecutor } } - public void execute( final Configuration taskData, final TaskContext context ) + public void execute( final Configuration taskModel, final TaskContext context ) throws TaskException { getLogger().debug( "Creating" ); - final Task task = createTask( taskData.getName() ); + final Task task = createTask( taskModel.getName() ); setupLogger( task ); getLogger().debug( "Contextualizing" ); - doContextualize( task, taskData, context ); + doContextualize( task, taskModel, context ); getLogger().debug( "Composing" ); - doCompose( task, taskData ); + doCompose( task, taskModel ); getLogger().debug( "Configuring" ); - doConfigure( task, taskData, context ); + doConfigure( task, taskModel, context ); getLogger().debug( "Initializing" ); - doInitialize( task, taskData ); + doInitialize( task, taskModel ); getLogger().debug( "Running" ); task.execute(); getLogger().debug( "Disposing" ); - doDispose( task, taskData ); + doDispose( task, taskModel ); } - private Task createTask( final String name ) + protected final Task createTask( final String name ) throws TaskException { try @@ -101,21 +101,21 @@ public class DefaultExecutor } } - private void doConfigure( final Task task, - final Configuration taskData, - final TaskContext context ) + protected final void doConfigure( final Task task, + final Configuration taskModel, + final TaskContext context ) throws TaskException { - try { m_configurer.configure( task, taskData, context ); } + try { m_configurer.configure( task, taskModel, context ); } catch( final Throwable throwable ) { - throw new TaskException( "Error configuring task " + taskData.getName() + " at " + - taskData.getLocation() + "(Reason: " + - throwable.getMessage() + ")", throwable ); + throw new TaskException( "Error configuring task " + taskModel.getName() + " at " + + taskModel.getLocation() + "(Reason: " + + throwable.getMessage() + ")" ); } } - private void doCompose( final Task task, final Configuration taskData ) + protected final void doCompose( final Task task, final Configuration taskModel ) throws TaskException { if( task instanceof Composable ) @@ -123,15 +123,15 @@ public class DefaultExecutor try { ((Composable)task).compose( m_componentManager ); } catch( final Throwable throwable ) { - throw new TaskException( "Error composing task " + taskData.getName() + " at " + - taskData.getLocation() + "(Reason: " + + throw new TaskException( "Error composing task " + taskModel.getName() + " at " + + taskModel.getLocation() + "(Reason: " + throwable.getMessage() + ")", throwable ); } } } - private void doContextualize( final Task task, - final Configuration taskData, + protected final void doContextualize( final Task task, + final Configuration taskModel, final TaskContext context ) throws TaskException { @@ -144,13 +144,13 @@ public class DefaultExecutor } catch( final Throwable throwable ) { - throw new TaskException( "Error contextualizing task " + taskData.getName() + " at " + - taskData.getLocation() + "(Reason: " + + throw new TaskException( "Error contextualizing task " + taskModel.getName() + " at " + + taskModel.getLocation() + "(Reason: " + throwable.getMessage() + ")", throwable ); } } - private void doDispose( final Task task, final Configuration taskData ) + protected final void doDispose( final Task task, final Configuration taskModel ) throws TaskException { if( task instanceof Disposable ) @@ -158,14 +158,14 @@ public class DefaultExecutor try { ((Disposable)task).dispose(); } catch( final Throwable throwable ) { - throw new TaskException( "Error disposing task " + taskData.getName() + " at " + - taskData.getLocation() + "(Reason: " + + throw new TaskException( "Error disposing task " + taskModel.getName() + " at " + + taskModel.getLocation() + "(Reason: " + throwable.getMessage() + ")", throwable ); } } } - private void doInitialize( final Task task, final Configuration taskData ) + protected final void doInitialize( final Task task, final Configuration taskModel ) throws TaskException { if( task instanceof Initializable ) @@ -173,8 +173,8 @@ public class DefaultExecutor try { ((Initializable)task).initialize(); } catch( final Throwable throwable ) { - throw new TaskException( "Error initializing task " + taskData.getName() + " at " + - taskData.getLocation() + "(Reason: " + + throw new TaskException( "Error initializing task " + taskModel.getName() + " at " + + taskModel.getLocation() + "(Reason: " + throwable.getMessage() + ")", throwable ); } } diff --git a/proposal/myrmidon/src/make/sample.ant b/proposal/myrmidon/src/make/sample.ant index 231248570..538c25ec4 100644 --- a/proposal/myrmidon/src/make/sample.ant +++ b/proposal/myrmidon/src/make/sample.ant @@ -102,6 +102,8 @@ Legal: + + \ No newline at end of file