blob: 2e22a30dd6c5e3b27ff4eaeeadf3da415c58d2ce [file] [log] [blame]
/*
* 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 org.apache.avalon.framework.activity.Disposable;
import org.apache.avalon.framework.activity.Initializable;
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.Composable;
import org.apache.avalon.framework.component.DefaultComponentManager;
import org.apache.avalon.framework.configuration.Configurable;
import org.apache.avalon.framework.configuration.Configuration;
import org.apache.avalon.framework.context.Context;
import org.apache.avalon.framework.context.Contextualizable;
import org.apache.avalon.framework.logger.AbstractLoggable;
import org.apache.avalon.framework.logger.Loggable;
import org.apache.log.Logger;
import org.apache.myrmidon.api.Task;
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.TypeException;
import org.apache.myrmidon.components.type.TypeFactory;
import org.apache.myrmidon.components.type.TypeManager;
public class DefaultExecutor
extends AbstractLoggable
implements Executor, Composable
{
private Configurer m_configurer;
/**
* 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_configurer = (Configurer)componentManager.lookup( Configurer.ROLE );
}
public void execute( final Configuration taskModel, final ExecutionFrame frame )
throws TaskException
{
getLogger().debug( "Creating" );
final Task task = createTask( taskModel.getName(), frame );
doLoggable( task, taskModel, frame.getLogger() );
getLogger().debug( "Contextualizing" );
doContextualize( task, taskModel, frame.getContext() );
getLogger().debug( "Composing" );
doCompose( task, taskModel, frame.getComponentManager() );
getLogger().debug( "Configuring" );
doConfigure( task, taskModel, frame.getContext() );
getLogger().debug( "Initializing" );
doInitialize( task, taskModel );
getLogger().debug( "Running" );
task.execute();
getLogger().debug( "Disposing" );
doDispose( task, taskModel );
}
protected final Task createTask( final String name, final ExecutionFrame frame )
throws TaskException
{
try
{
final TypeFactory factory = frame.getTypeManager().getFactory( Task.ROLE );
return (Task)factory.create( name );
}
catch( final TypeException te )
{
throw new TaskException( "Unable to create task " + name, te );
}
}
protected final void doConfigure( final Task task,
final Configuration taskModel,
final TaskContext context )
throws TaskException
{
try { m_configurer.configure( task, taskModel, context ); }
catch( final Throwable throwable )
{
throw new TaskException( "Error configuring task " + taskModel.getName() + " at " +
taskModel.getLocation() + "(Reason: " +
throwable.getMessage() + ")", 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 )
{
throw new TaskException( "Error composing task " + taskModel.getName() + " at " +
taskModel.getLocation() + "(Reason: " +
throwable.getMessage() + ")", throwable );
}
}
}
protected final void doContextualize( final Task task,
final Configuration taskModel,
final TaskContext context )
throws TaskException
{
try
{
if( task instanceof Contextualizable )
{
((Contextualizable)task).contextualize( context );
}
}
catch( final Throwable throwable )
{
throw new TaskException( "Error contextualizing task " + taskModel.getName() + " at " +
taskModel.getLocation() + "(Reason: " +
throwable.getMessage() + ")", throwable );
}
}
protected final void doDispose( final Task task, final Configuration taskModel )
throws TaskException
{
if( task instanceof Disposable )
{
try { ((Disposable)task).dispose(); }
catch( final Throwable throwable )
{
throw new TaskException( "Error disposing task " + taskModel.getName() + " at " +
taskModel.getLocation() + "(Reason: " +
throwable.getMessage() + ")", throwable );
}
}
}
protected final void doLoggable( final Task task,
final Configuration taskModel,
final Logger logger )
throws TaskException
{
if( task instanceof Loggable )
{
try { ((Loggable)task).setLogger( logger ); }
catch( final Throwable throwable )
{
throw new TaskException( "Error setting logger for task " + taskModel.getName() +
" at " + taskModel.getLocation() + "(Reason: " +
throwable.getMessage() + ")", throwable );
}
}
}
protected final void doInitialize( final Task task, final Configuration taskModel )
throws TaskException
{
if( task instanceof Initializable )
{
try { ((Initializable)task).initialize(); }
catch( final Throwable throwable )
{
throw new TaskException( "Error initializing task " + taskModel.getName() + " at " +
taskModel.getLocation() + "(Reason: " +
throwable.getMessage() + ")", throwable );
}
}
}
}