donaldp 2002/11/08 23:31:35 Modified: fortress/src/java/org/apache/excalibur/fortress/container AbstractContainer.java fortress/src/java/org/apache/excalibur/fortress/handler AbstractComponentHandler.java ComponentFactory.java ComponentHandler.java FactoryComponentHandler.java PerThreadComponentHandler.java PoolableComponentHandler.java ThreadSafeComponentHandler.java Log: Reworked handler management so that the ctors are more reasonablly defined. Also moved lifecycle extension management out of the AbstractComponentHandler and into a delegating ComponentHandler. Resulted in a chunk of code being cleaned up. Revision Changes Path 1.6 +45 -11 jakarta-avalon-excalibur/fortress/src/java/org/apache/excalibur/fortress/container/AbstractContainer.java Index: AbstractContainer.java =================================================================== RCS file: /home/cvs/jakarta-avalon-excalibur/fortress/src/java/org/apache/excalibur/fortress/container/AbstractContainer.java,v retrieving revision 1.5 retrieving revision 1.6 diff -u -r1.5 -r1.6 --- AbstractContainer.java 9 Nov 2002 03:46:39 -0000 1.5 +++ AbstractContainer.java 9 Nov 2002 07:31:34 -0000 1.6 @@ -74,6 +74,9 @@ import org.apache.excalibur.fortress.ContainerConstants; import org.apache.excalibur.fortress.container.commands.PrepareHandlerCommand; import org.apache.excalibur.fortress.handler.ComponentHandler; +import org.apache.excalibur.fortress.handler.ComponentFactory; +import org.apache.excalibur.fortress.handler.ProxyObjectFactory; +import org.apache.excalibur.fortress.handler.LEAwareComponentHandler; import org.apache.excalibur.fortress.lifecycle.LifecycleExtensionManager; import org.apache.excalibur.fortress.lookup.FortressServiceManager; import org.apache.excalibur.fortress.lookup.FortressServiceSelector; @@ -82,6 +85,7 @@ import org.apache.excalibur.instrument.InstrumentManager; import org.apache.excalibur.instrument.Instrumentable; import org.apache.excalibur.mpool.PoolManager; +import org.apache.excalibur.mpool.ObjectFactory; /** * The Container is an interface used to mark the Containers in your system. @@ -288,21 +292,27 @@ Class klass = m_classLoader.loadClass( className ); Class handlerKlass = m_classLoader.loadClass( handlerClassName ); constructor = handlerKlass.getConstructor( ComponentHandler.HANDLER_CONSTRUCTOR ); - handler = (ComponentHandler)constructor.newInstance( new Object[]{ - klass, - configuration, - getServiceManager(), - m_context, - m_extManager, - new Boolean( isLazy ) - } ); - if( handler instanceof Instrumentable ) + final ObjectFactory factory = + createObjectFactory( klass, configuration ); + + final ComponentHandler targetHandler = + (ComponentHandler)constructor.newInstance( new Object[]{ + factory, + m_context, + new Boolean( isLazy ) + } ); + + ContainerUtil.configure( targetHandler, configuration ); + + if( targetHandler instanceof Instrumentable ) { - Instrumentable instrumentable = (Instrumentable)handler; + Instrumentable instrumentable = (Instrumentable)targetHandler; m_instrumentManager.registerInstrumentable( instrumentable, instrumentable.getInstrumentableName() ); } + handler = + new LEAwareComponentHandler( targetHandler, m_extManager, m_context ); } catch( final Exception e ) { @@ -324,6 +334,30 @@ m_components.add( handler ); return handler; + } + + /** + * Create an objectFactory for specified Object configuration. + * + * @param clazz the class of object + * @param configuration the objests configuration + * @return the ObjectFactory + * @throws Exception if unable to create object factory + */ + protected ObjectFactory createObjectFactory( final Class clazz, + final Configuration configuration ) + throws Exception + { + final LoggerManager loggerManager = + (LoggerManager)m_context.get( ContainerConstants.LOGGER_MANAGER ); + final InstrumentManager instrumentManager = + (InstrumentManager)m_context.get( ContainerConstants.INSTRUMENT_MANAGER ); + final ComponentFactory componentFactory = + new ComponentFactory( clazz, configuration, + getServiceManager(), m_context, + loggerManager, m_extManager, + instrumentManager ); + return new ProxyObjectFactory( componentFactory ); } /** 1.35 +16 -43 jakarta-avalon-excalibur/fortress/src/java/org/apache/excalibur/fortress/handler/AbstractComponentHandler.java Index: AbstractComponentHandler.java =================================================================== RCS file: /home/cvs/jakarta-avalon-excalibur/fortress/src/java/org/apache/excalibur/fortress/handler/AbstractComponentHandler.java,v retrieving revision 1.34 retrieving revision 1.35 diff -u -r1.34 -r1.35 --- AbstractComponentHandler.java 9 Nov 2002 05:49:59 -0000 1.34 +++ AbstractComponentHandler.java 9 Nov 2002 07:31:34 -0000 1.35 @@ -51,15 +51,11 @@ import org.apache.avalon.excalibur.logger.LoggerManager; import org.apache.avalon.framework.activity.Disposable; -import org.apache.avalon.framework.configuration.Configuration; import org.apache.avalon.framework.container.ContainerUtil; import org.apache.avalon.framework.context.Context; import org.apache.avalon.framework.logger.Logger; -import org.apache.avalon.framework.service.ServiceManager; import org.apache.excalibur.fortress.ContainerConstants; -import org.apache.excalibur.fortress.lifecycle.LifecycleExtensionManager; import org.apache.excalibur.instrument.AbstractInstrumentable; -import org.apache.excalibur.instrument.InstrumentManager; import org.apache.excalibur.instrument.Instrumentable; import org.apache.excalibur.mpool.ObjectFactory; @@ -98,56 +94,44 @@ protected Logger m_logger; /** Logger Manager */ - protected LoggerManager m_logkit; - - /** Context */ - protected final Context m_context; + protected LoggerManager m_loggerManager; /** Initialization policy */ private boolean m_isLazy; - private LifecycleExtensionManager m_extManager; /** * Create a ComponentHandler that takes care of hiding the details of * whether a Component is ThreadSafe, Poolable, or SingleThreaded. * It falls back to SingleThreaded if not specified. * - * @param componentClass The class used to instantiate the component - * @param config The configuration to pass into a configurable - * component. - * @param service The Servicemanager to pass into a serviceable - * compoennt. + * @param factory The factory used to create component * @param context The Context to pass into a contextualizable * component. - * @param extManager The lifecycle extension manager that is invoked - * for additional lifecycle stages. * @param isLazy Determines whether this component will be * instantiated on startup or on demand. * * @throws Exception if any of the passed in members are invalid. */ - public AbstractComponentHandler( final Class componentClass, - final Configuration config, - final ServiceManager service, + public AbstractComponentHandler( final ObjectFactory factory, final Context context, - final LifecycleExtensionManager extManager, final Boolean isLazy ) throws Exception { - m_logkit = (LoggerManager)context.get( ContainerConstants.LOGGER_MANAGER ); - InstrumentManager instrumentManager = - (InstrumentManager)context.get( ContainerConstants.INSTRUMENT_MANAGER ); - final ComponentFactory componentFactory = - new ComponentFactory( componentClass, config, service, context, m_logkit, - extManager, instrumentManager ); - m_factory = new ProxyObjectFactory( componentFactory ); - m_extManager = extManager; + m_factory = factory; + m_isLazy = isLazy.booleanValue(); + m_loggerManager = + (LoggerManager)context.get( ContainerConstants.LOGGER_MANAGER ); + if( m_factory instanceof Instrumentable ) { addChildInstrumentable( (Instrumentable)m_factory ); } - m_context = context; - m_isLazy = isLazy.booleanValue(); + + final String classname = getClass().getName(); + final int index = classname.lastIndexOf( '.' ); + final String name = classname.substring( index + 1 ); + System.out.println( "name = " + name ); + setInstrumentableName( name ); } /** @@ -218,9 +202,7 @@ throw new IllegalStateException( message ); } - final Object result = doGet(); - m_extManager.executeAccessExtensions( result, m_context ); - return result; + return doGet(); } /** @@ -243,15 +225,6 @@ final String message = "You cannot put a component in an uninitialized holder"; throw new IllegalStateException( message ); - } - - try - { - m_extManager.executeReleaseExtensions( component, m_context ); - } - catch( Exception e ) - { - // REVISIT(MC): we need to log this somewhere } doPut( component ); 1.28 +5 -3 jakarta-avalon-excalibur/fortress/src/java/org/apache/excalibur/fortress/handler/ComponentFactory.java Index: ComponentFactory.java =================================================================== RCS file: /home/cvs/jakarta-avalon-excalibur/fortress/src/java/org/apache/excalibur/fortress/handler/ComponentFactory.java,v retrieving revision 1.27 retrieving revision 1.28 diff -u -r1.27 -r1.28 --- ComponentFactory.java 7 Nov 2002 23:23:00 -0000 1.27 +++ ComponentFactory.java 9 Nov 2002 07:31:34 -0000 1.28 @@ -200,7 +200,7 @@ if( component instanceof Instrumentable ) { - Instrumentable instrumentable = (Instrumentable)component; + final Instrumentable instrumentable = (Instrumentable)component; instrumentable.setInstrumentableName( m_instrumentableName ); m_instrumentManager.registerInstrumentable( (Instrumentable)component, m_instrumentableName ); @@ -243,7 +243,9 @@ } else { - throw new IllegalArgumentException( "The object given to be disposed does not come from this ObjectFactory" ); + final String message = "The object given to be disposed does " + + "not come from this ObjectFactory"; + throw new IllegalArgumentException( message ); } } 1.18 +5 -6 jakarta-avalon-excalibur/fortress/src/java/org/apache/excalibur/fortress/handler/ComponentHandler.java Index: ComponentHandler.java =================================================================== RCS file: /home/cvs/jakarta-avalon-excalibur/fortress/src/java/org/apache/excalibur/fortress/handler/ComponentHandler.java,v retrieving revision 1.17 retrieving revision 1.18 diff -u -r1.17 -r1.18 --- ComponentHandler.java 9 Nov 2002 03:46:39 -0000 1.17 +++ ComponentHandler.java 9 Nov 2002 07:31:34 -0000 1.18 @@ -53,6 +53,7 @@ import org.apache.avalon.framework.context.Context; import org.apache.avalon.framework.service.ServiceManager; import org.apache.excalibur.fortress.lifecycle.LifecycleExtensionManager; +import org.apache.excalibur.mpool.ObjectFactory; /** * The ComponentHandler interface marks the ComponentHandler implementations. @@ -65,12 +66,10 @@ */ public interface ComponentHandler { - Class[] HANDLER_CONSTRUCTOR = new Class[]{ - Class.class, - Configuration.class, - ServiceManager.class, + Class[] HANDLER_CONSTRUCTOR = new Class[] + { + ObjectFactory.class, Context.class, - LifecycleExtensionManager.class, Boolean.class }; 1.34 +5 -11 jakarta-avalon-excalibur/fortress/src/java/org/apache/excalibur/fortress/handler/FactoryComponentHandler.java Index: FactoryComponentHandler.java =================================================================== RCS file: /home/cvs/jakarta-avalon-excalibur/fortress/src/java/org/apache/excalibur/fortress/handler/FactoryComponentHandler.java,v retrieving revision 1.33 retrieving revision 1.34 diff -u -r1.33 -r1.34 --- FactoryComponentHandler.java 8 Nov 2002 00:33:41 -0000 1.33 +++ FactoryComponentHandler.java 9 Nov 2002 07:31:34 -0000 1.34 @@ -49,10 +49,8 @@ */ package org.apache.excalibur.fortress.handler; -import org.apache.avalon.framework.configuration.Configuration; import org.apache.avalon.framework.context.Context; -import org.apache.avalon.framework.service.ServiceManager; -import org.apache.excalibur.fortress.lifecycle.LifecycleExtensionManager; +import org.apache.excalibur.mpool.ObjectFactory; /** * The FactoryComponentHandler to make sure components are initialized @@ -71,17 +69,13 @@ * whether a Component is ThreadSafe, Poolable, or SingleThreaded. * It falls back to SingleThreaded if not specified. */ - public FactoryComponentHandler( final Class componentClass, - final Configuration config, - final ServiceManager service, + public FactoryComponentHandler( final ObjectFactory factory, final Context context, - final LifecycleExtensionManager extManager, final Boolean isLazy ) throws Exception { - super( componentClass, config, service, context, extManager, isLazy ); - m_logger = m_logkit.getLoggerForCategory( "system.handler.factory" ); - setInstrumentableName( "FactoryComponentHandler" ); + super( factory, context, isLazy ); + m_logger = m_loggerManager.getLoggerForCategory( "system.handler.factory" ); } /** 1.37 +5 -11 jakarta-avalon-excalibur/fortress/src/java/org/apache/excalibur/fortress/handler/PerThreadComponentHandler.java Index: PerThreadComponentHandler.java =================================================================== RCS file: /home/cvs/jakarta-avalon-excalibur/fortress/src/java/org/apache/excalibur/fortress/handler/PerThreadComponentHandler.java,v retrieving revision 1.36 retrieving revision 1.37 diff -u -r1.36 -r1.37 --- PerThreadComponentHandler.java 8 Nov 2002 00:33:41 -0000 1.36 +++ PerThreadComponentHandler.java 9 Nov 2002 07:31:34 -0000 1.37 @@ -48,10 +48,8 @@ */ package org.apache.excalibur.fortress.handler; -import org.apache.avalon.framework.configuration.Configuration; import org.apache.avalon.framework.context.Context; -import org.apache.avalon.framework.service.ServiceManager; -import org.apache.excalibur.fortress.lifecycle.LifecycleExtensionManager; +import org.apache.excalibur.mpool.ObjectFactory; /** * The ThreadSafeComponentHandler to make sure components are initialized @@ -72,18 +70,14 @@ * whether a Component is ThreadSafe, Poolable, or SingleThreaded. * It falls back to SingleThreaded if not specified. */ - public PerThreadComponentHandler( final Class componentClass, - final Configuration config, - final ServiceManager service, + public PerThreadComponentHandler( final ObjectFactory factory, final Context context, - final LifecycleExtensionManager extManager, final Boolean isLazy ) throws Exception { - super( componentClass, config, service, context, extManager, isLazy ); - m_logger = m_logkit.getLoggerForCategory( "system.handler.perthread" ); + super( factory, context, isLazy ); + m_logger = m_loggerManager.getLoggerForCategory( "system.handler.perthread" ); m_instance = new ThreadLocalComponent( this ); - setInstrumentableName( "PerThreadComponentHandler" ); } /** 1.39 +16 -12 jakarta-avalon-excalibur/fortress/src/java/org/apache/excalibur/fortress/handler/PoolableComponentHandler.java Index: PoolableComponentHandler.java =================================================================== RCS file: /home/cvs/jakarta-avalon-excalibur/fortress/src/java/org/apache/excalibur/fortress/handler/PoolableComponentHandler.java,v retrieving revision 1.38 retrieving revision 1.39 diff -u -r1.38 -r1.39 --- PoolableComponentHandler.java 9 Nov 2002 03:46:39 -0000 1.38 +++ PoolableComponentHandler.java 9 Nov 2002 07:31:34 -0000 1.39 @@ -49,11 +49,12 @@ */ package org.apache.excalibur.fortress.handler; -import org.apache.avalon.framework.configuration.Configuration; import org.apache.avalon.framework.context.Context; -import org.apache.avalon.framework.service.ServiceManager; +import org.apache.avalon.framework.configuration.Configurable; +import org.apache.avalon.framework.configuration.Configuration; +import org.apache.avalon.framework.configuration.ConfigurationException; import org.apache.excalibur.fortress.ContainerConstants; -import org.apache.excalibur.fortress.lifecycle.LifecycleExtensionManager; +import org.apache.excalibur.mpool.ObjectFactory; import org.apache.excalibur.mpool.Pool; import org.apache.excalibur.mpool.PoolManager; @@ -68,6 +69,7 @@ */ public final class PoolableComponentHandler extends AbstractComponentHandler + implements Configurable { /** The instance of the PoolManager to create the Pool for the Handler */ private final PoolManager m_poolManager; @@ -76,26 +78,28 @@ private Pool m_pool; /** The Config element for the poolable */ - private final int m_poolMin; + private int m_poolMin; /** * Create a ComponentHandler that takes care of hiding the details of * whether a Component is ThreadSafe, Poolable, or SingleThreaded. * It falls back to SingleThreaded if not specified. */ - public PoolableComponentHandler( final Class componentClass, - final Configuration config, - final ServiceManager service, + public PoolableComponentHandler( final ObjectFactory factory, final Context context, - final LifecycleExtensionManager extManager, final Boolean isLazy ) throws Exception { - super( componentClass, config, service, context, extManager, isLazy ); - m_poolMin = config.getAttributeAsInteger( "pool-min", 10 ); - m_logger = m_logkit.getLoggerForCategory( "system.handler.poolable" ); + super( factory, context, isLazy ); + m_logger = m_loggerManager.getLoggerForCategory( "system.handler.poolable" ); m_poolManager = (PoolManager)context.get( ContainerConstants.POOL_MANAGER ); setInstrumentableName( "PoolableComponentHandler" ); + } + + public void configure( final Configuration configuration ) + throws ConfigurationException + { + m_poolMin = configuration.getAttributeAsInteger( "pool-min", 10 ); } /** 1.37 +5 -11 jakarta-avalon-excalibur/fortress/src/java/org/apache/excalibur/fortress/handler/ThreadSafeComponentHandler.java Index: ThreadSafeComponentHandler.java =================================================================== RCS file: /home/cvs/jakarta-avalon-excalibur/fortress/src/java/org/apache/excalibur/fortress/handler/ThreadSafeComponentHandler.java,v retrieving revision 1.36 retrieving revision 1.37 diff -u -r1.36 -r1.37 --- ThreadSafeComponentHandler.java 9 Nov 2002 03:46:39 -0000 1.36 +++ ThreadSafeComponentHandler.java 9 Nov 2002 07:31:34 -0000 1.37 @@ -49,10 +49,8 @@ */ package org.apache.excalibur.fortress.handler; -import org.apache.avalon.framework.configuration.Configuration; import org.apache.avalon.framework.context.Context; -import org.apache.avalon.framework.service.ServiceManager; -import org.apache.excalibur.fortress.lifecycle.LifecycleExtensionManager; +import org.apache.excalibur.mpool.ObjectFactory; /** * The ThreadSafeComponentHandler to make sure components are initialized @@ -73,17 +71,13 @@ * whether a Component is ThreadSafe, Poolable, or SingleThreaded. * It falls back to SingleThreaded if not specified. */ - public ThreadSafeComponentHandler( final Class componentClass, - final Configuration config, - final ServiceManager service, + public ThreadSafeComponentHandler( final ObjectFactory factory, final Context context, - final LifecycleExtensionManager extManager, final Boolean isLazy ) throws Exception { - super( componentClass, config, service, context, extManager, isLazy ); - m_logger = m_logkit.getLoggerForCategory( "system.handler.threadsafe" ); - setInstrumentableName( "ThreadSafeComponentHandler" ); + super( factory, context, isLazy ); + m_logger = m_loggerManager.getLoggerForCategory( "system.handler.threadsafe" ); } /**
-- To unsubscribe, e-mail: <mailto:avalon-cvs-unsubscribe@;jakarta.apache.org> For additional commands, e-mail: <mailto:avalon-cvs-help@;jakarta.apache.org>