You are viewing a plain text version of this content. The canonical link for it is here.
Posted to cvs@avalon.apache.org by cr...@apache.org on 2002/07/09 15:32:36 UTC
cvs commit: jakarta-avalon-excalibur/fortress/src/java/org/apache/excalibur/fortress/lookup FortressComponentManager.java FortressComponentSelector.java FortressServiceManager.java FortressServiceSelector.java
crafterm 2002/07/09 06:32:36
Modified: fortress/src/java/org/apache/excalibur/fortress
AbstractContainer.java ContainerConstants.java
fortress/src/java/org/apache/excalibur/fortress/handler
AbstractComponentHandler.java
AbstractThreadSafeComponentHandler.java
ComponentFactory.java ComponentHandler.java
FactoryComponentHandler.java
LazyThreadSafeComponentHandler.java
PerThreadComponentHandler.java
PoolableComponentHandler.java
ThreadSafeComponentHandler.java
fortress/src/java/org/apache/excalibur/fortress/lookup
FortressComponentManager.java
FortressComponentSelector.java
FortressServiceManager.java
FortressServiceSelector.java
Added: fortress/src/java/org/apache/excalibur/fortress/lifecycle
AbstractLifecycleExtension.java
AbstractLifecycleExtensionManager.java
LifecycleExtension.java
LifecycleExtensionManager.java package.html
Log:
Initial commit of Lifecycle extensions code.
Revision Changes Path
1.45 +42 -19 jakarta-avalon-excalibur/fortress/src/java/org/apache/excalibur/fortress/AbstractContainer.java
Index: AbstractContainer.java
===================================================================
RCS file: /home/cvs/jakarta-avalon-excalibur/fortress/src/java/org/apache/excalibur/fortress/AbstractContainer.java,v
retrieving revision 1.44
retrieving revision 1.45
diff -u -r1.44 -r1.45
--- AbstractContainer.java 28 Jun 2002 10:03:24 -0000 1.44
+++ AbstractContainer.java 9 Jul 2002 13:32:35 -0000 1.45
@@ -36,6 +36,7 @@
import org.apache.excalibur.event.Queue;
import org.apache.excalibur.event.command.Command;
import org.apache.excalibur.fortress.handler.ComponentHandler;
+import org.apache.excalibur.fortress.lifecycle.LifecycleExtensionManager;
import org.apache.excalibur.fortress.lookup.FortressComponentManager;
import org.apache.excalibur.fortress.lookup.FortressComponentSelector;
import org.apache.excalibur.fortress.lookup.FortressServiceManager;
@@ -45,8 +46,8 @@
/**
* The Container is an interface used to mark the Containers in your system. It
- * exposes a protected getComponentManager() method so that the Container's
- * Manager can expose that to the instantiating class.
+ * exposes a protected getComponentManager()/getServiceManager() method so that the
+ * Container's Manager can expose that to the instantiating class.
*
* @author <a href="mailto:bloritsch@apache.org">Berin Loritsch</a>
* @author <a href="mailto:proyal@apache.org">Peter Royal</a>
@@ -68,6 +69,7 @@
protected BucketMap m_configs = new BucketMap();
protected BucketMap m_mapper = new BucketMap();
protected List m_components = new ArrayList( 10 );
+ protected LifecycleExtensionManager m_extManager;
/**
* Wrap this so that ComponentStateValidator functions properly.
@@ -91,6 +93,22 @@
try
{
+ m_extManager = (LifecycleExtensionManager)m_context.get( Container.EXTENSION_MANAGER );
+ }
+ catch( ContextException ce )
+ {
+ m_extManager = new LifecycleExtensionManager();
+
+ if ( getLogger().isDebugEnabled() )
+ {
+ getLogger().debug( "No Container.EXTENSION_MANAGER is given, installing default lifecycle extension manager with 0 extensions" );
+ }
+ }
+
+ m_extManager.enableLogging( getLogger() );
+
+ try
+ {
m_classLoader = (ClassLoader)m_context.get( Container.CONTEXT_CLASSLOADER );
}
catch( ContextException ce )
@@ -222,7 +240,6 @@
/**
* Add a Component.
- *
*/
protected void addComponent( final Configuration component, Object hint )
{
@@ -252,7 +269,7 @@
{
if( !hintMap.containsKey( "selector" ) )
{
- hintMap.put( "selector", new FortressComponentSelector( this, role ) );
+ hintMap.put( "selector", new FortressComponentSelector( this, role, m_extManager, m_context ) );
}
}
else
@@ -260,6 +277,8 @@
hintMap.put( "default", handler );
}
+ // FIXME(MC) is this always needed ? should only need to be done if
+ // hintMap is not yet in m_mapper ? or is it here due to threading issues ?
m_mapper.put( role, hintMap );
}
}
@@ -285,10 +304,11 @@
configuration,
getComponentManager(),
getServiceManager(),
- m_context
+ m_context,
+ m_extManager
} );
}
- catch( Exception e )
+ catch( final Exception e )
{
if( getLogger().isDebugEnabled() )
{
@@ -325,7 +345,7 @@
public Object get( final String role, final Object hint )
throws ServiceException
{
- BucketMap hintMap = (BucketMap)m_mapper.get( role );
+ final BucketMap hintMap = (BucketMap)m_mapper.get( role );
Object value;
if( null == hintMap )
@@ -368,7 +388,7 @@
*/
public boolean has( final String role, final Object hint )
{
- BucketMap hintMap = (BucketMap)m_mapper.get( role );
+ final BucketMap hintMap = (BucketMap)m_mapper.get( role );
if( null == hintMap )
{
@@ -445,14 +465,17 @@
}
catch( Exception e )
{
- getLogger().warn( "Could not initialize component", e );
+ if ( getLogger().isWarnEnabled() )
+ {
+ getLogger().warn( "Could not initialize component", e );
+ }
buffer.add( e );
}
}
if( buffer.size() > 0 )
{
- StringBuffer message = new StringBuffer();
+ final StringBuffer message = new StringBuffer();
while( !buffer.isEmpty() )
{
@@ -468,7 +491,7 @@
*/
public void dispose()
{
- Iterator i = m_components.iterator();
+ final Iterator i = m_components.iterator();
while( i.hasNext() )
{
@@ -483,7 +506,7 @@
i.remove();
}
- catch( Exception e )
+ catch( final Exception e )
{
if( getLogger().isWarnEnabled() )
{
@@ -507,10 +530,10 @@
protected final ComponentManager getComponentManager()
{
if ( m_componentManager == null && m_serviceManager == null )
- return new FortressComponentManager( this );
+ return new FortressComponentManager( this, m_extManager, m_context );
return m_componentManager == null ?
- new FortressComponentManager( this, m_serviceManager ) :
- new FortressComponentManager( this, m_componentManager );
+ new FortressComponentManager( this, m_serviceManager, m_extManager, m_context ) :
+ new FortressComponentManager( this, m_componentManager, m_extManager, m_context );
}
/**
@@ -522,10 +545,10 @@
protected final ServiceManager getServiceManager()
{
if ( m_componentManager == null && m_serviceManager == null )
- return new FortressServiceManager( this );
+ return new FortressServiceManager( this, m_extManager, m_context );
return m_serviceManager == null ?
- new FortressServiceManager( this, m_componentManager ) :
- new FortressServiceManager( this, m_serviceManager );
+ new FortressServiceManager( this, m_componentManager, m_extManager, m_context ) :
+ new FortressServiceManager( this, m_serviceManager, m_extManager, m_context );
}
/**
1.6 +3 -1 jakarta-avalon-excalibur/fortress/src/java/org/apache/excalibur/fortress/ContainerConstants.java
Index: ContainerConstants.java
===================================================================
RCS file: /home/cvs/jakarta-avalon-excalibur/fortress/src/java/org/apache/excalibur/fortress/ContainerConstants.java,v
retrieving revision 1.5
retrieving revision 1.6
diff -u -r1.5 -r1.6
--- ContainerConstants.java 4 Apr 2002 16:04:28 -0000 1.5
+++ ContainerConstants.java 9 Jul 2002 13:32:36 -0000 1.6
@@ -33,4 +33,6 @@
String THREADS_CPU = "container.threadsPerCPU";
String THREAD_TIMEOUT = "container.threadTimeout";
+
+ String EXTENSION_MANAGER = "container.extensionManager";
}
1.5 +9 -3 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.4
retrieving revision 1.5
diff -u -r1.4 -r1.5
--- AbstractComponentHandler.java 18 Jun 2002 18:45:36 -0000 1.4
+++ AbstractComponentHandler.java 9 Jul 2002 13:32:36 -0000 1.5
@@ -17,6 +17,7 @@
import org.apache.avalon.framework.logger.Logger;
import org.apache.avalon.framework.service.ServiceManager;
import org.apache.excalibur.fortress.Container;
+import org.apache.excalibur.fortress.lifecycle.LifecycleExtensionManager;
import org.apache.excalibur.fortress.util.RoleManager;
/**
@@ -48,6 +49,9 @@
/** Logger Manager */
protected LoggerManager m_logkit;
+ /** Context */
+ protected final Context m_context;
+
/**
* Create a ComponentHandler that takes care of hiding the details of
* whether a Component is ThreadSafe, Poolable, or SingleThreaded.
@@ -57,11 +61,13 @@
final Configuration config,
final ComponentManager manager,
final ServiceManager service,
- final Context context )
+ final Context context,
+ final LifecycleExtensionManager extManager )
throws Exception
{
m_logkit = (LoggerManager)context.get( Container.LOGGER_MANAGER );
- m_factory = new ComponentFactory( componentClass, config, manager, service, context, m_logkit );
+ m_factory = new ComponentFactory( componentClass, config, manager, service, context, m_logkit, extManager );
+ m_context = context;
}
public boolean isInitialized()
1.2 +6 -3 jakarta-avalon-excalibur/fortress/src/java/org/apache/excalibur/fortress/handler/AbstractThreadSafeComponentHandler.java
Index: AbstractThreadSafeComponentHandler.java
===================================================================
RCS file: /home/cvs/jakarta-avalon-excalibur/fortress/src/java/org/apache/excalibur/fortress/handler/AbstractThreadSafeComponentHandler.java,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -r1.1 -r1.2
--- AbstractThreadSafeComponentHandler.java 28 Jun 2002 17:11:20 -0000 1.1
+++ AbstractThreadSafeComponentHandler.java 9 Jul 2002 13:32:36 -0000 1.2
@@ -15,6 +15,7 @@
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.lifecycle.LifecycleExtensionManager;
/**
* The ThreadSafeComponentHandler to make sure components are initialized
@@ -39,10 +40,11 @@
final Configuration config,
final ComponentManager manager,
final ServiceManager service,
- final Context context )
+ final Context context,
+ final LifecycleExtensionManager extManager )
throws Exception
{
- super( componentClass, config, manager, service, context );
+ super( componentClass, config, manager, service, context, extManager );
}
/**
@@ -57,6 +59,7 @@
throws Exception
{
super.get();
+
return getInstance();
}
1.15 +15 -2 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.14
retrieving revision 1.15
diff -u -r1.14 -r1.15
--- ComponentFactory.java 25 Jun 2002 20:44:26 -0000 1.14
+++ ComponentFactory.java 9 Jul 2002 13:32:36 -0000 1.15
@@ -21,6 +21,7 @@
import org.apache.avalon.framework.parameters.Parameters;
import org.apache.avalon.framework.service.ServiceManager;
import org.apache.avalon.framework.thread.ThreadSafe;
+import org.apache.excalibur.fortress.lifecycle.LifecycleExtensionManager;
import org.apache.excalibur.mpool.ObjectFactory;
/**
@@ -66,20 +67,27 @@
*/
private Logger m_logger;
+ /** Lifecycle extensions manager
+ */
+ private final LifecycleExtensionManager m_extManager;
+
/**
* Construct a new component factory for the specified component.
*
* @param componentClass the class to instantiate (must have a default constructor).
* @param configuration the <code>Configuration</code> object to pass to new instances.
* @param componentManager the component manager to pass to <code>Composable</code>s.
+ * @param serviceManager the service manager to pass to <code>Serviceable</code>s.
* @param context the <code>Context</code> to pass to <code>Contexutalizable</code>s.
+ * @param logkit the logkit manager instance.
*/
public ComponentFactory( final Class componentClass,
final Configuration configuration,
final ComponentManager componentManager,
final ServiceManager serviceManager,
final Context context,
- final LoggerManager logkit )
+ final LoggerManager logkit,
+ final LifecycleExtensionManager extManager )
{
m_componentClass = componentClass;
m_configuration = configuration;
@@ -87,6 +95,7 @@
m_serviceManager = serviceManager;
m_context = context;
m_logManager = logkit;
+ m_extManager = extManager;
m_logger = m_logManager.getLoggerForCategory( "system.factory" );
m_newInstance = new CounterInstrument( "Create " + getInstrumentableName() );
@@ -130,6 +139,8 @@
ContainerUtil.parameterize( component, parameters );
}
+ m_extManager.executeCreationExtensions( component, m_context );
+
ContainerUtil.initialize( component );
ContainerUtil.start( component );
@@ -158,6 +169,8 @@
if( getCreatedClass().equals( component.getClass() ) )
{
ContainerUtil.shutdown( component );
+
+ m_extManager.executeDestructionExtensions( component, m_context );
if( m_dispose.isActive() )
{
1.10 +4 -2 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.9
retrieving revision 1.10
diff -u -r1.9 -r1.10
--- ComponentHandler.java 18 Jun 2002 18:45:36 -0000 1.9
+++ ComponentHandler.java 9 Jul 2002 13:32:36 -0000 1.10
@@ -13,6 +13,7 @@
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;
/**
* The ComponentHandler interface marks the ComponentHandler implementations.
@@ -30,7 +31,8 @@
Configuration.class,
ComponentManager.class,
ServiceManager.class,
- Context.class
+ Context.class,
+ LifecycleExtensionManager.class
};
/**
1.18 +8 -7 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.17
retrieving revision 1.18
diff -u -r1.17 -r1.18
--- FactoryComponentHandler.java 18 Jun 2002 18:45:36 -0000 1.17
+++ FactoryComponentHandler.java 9 Jul 2002 13:32:36 -0000 1.18
@@ -12,6 +12,7 @@
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;
/**
* The FactoryComponentHandler to make sure components are initialized
@@ -34,10 +35,11 @@
final Configuration config,
final ComponentManager manager,
final ServiceManager service,
- final Context context )
+ final Context context,
+ final LifecycleExtensionManager extManager )
throws Exception
{
- super( componentClass, config, manager, service, context );
+ super( componentClass, config, manager, service, context, extManager );
m_logger = m_logkit.getLoggerForCategory( "system.handler.factory" );
m_name = "FactoryComponentHandler";
}
@@ -81,12 +83,11 @@
{
m_factory.dispose( component );
}
- catch( final Exception e )
+ catch ( Exception e )
{
- if( m_logger.isWarnEnabled() )
+ if ( m_logger.isWarnEnabled() )
{
- m_logger.warn( "Error decommissioning component: " +
- m_factory.getCreatedClass().getName(), e );
+ m_logger.warn( "Error disposing component", e );
}
}
}
1.2 +5 -3 jakarta-avalon-excalibur/fortress/src/java/org/apache/excalibur/fortress/handler/LazyThreadSafeComponentHandler.java
Index: LazyThreadSafeComponentHandler.java
===================================================================
RCS file: /home/cvs/jakarta-avalon-excalibur/fortress/src/java/org/apache/excalibur/fortress/handler/LazyThreadSafeComponentHandler.java,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -r1.1 -r1.2
--- LazyThreadSafeComponentHandler.java 28 Jun 2002 17:11:20 -0000 1.1
+++ LazyThreadSafeComponentHandler.java 9 Jul 2002 13:32:36 -0000 1.2
@@ -11,6 +11,7 @@
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;
/**
* LazyThreadSafeComponentHandler. This class manages thread safe
@@ -33,10 +34,11 @@
final Configuration config,
final ComponentManager manager,
final ServiceManager service,
- final Context context )
+ final Context context,
+ final LifecycleExtensionManager extManager )
throws Exception
{
- super( componentClass, config, manager, service, context );
+ super( componentClass, config, manager, service, context, extManager );
m_logger = m_logkit.getLoggerForCategory( "system.handler.threadsafe.lazy" );
m_name = "LazyThreadSafeComponentHandler";
}
1.19 +6 -4 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.18
retrieving revision 1.19
diff -u -r1.18 -r1.19
--- PerThreadComponentHandler.java 18 Jun 2002 18:45:36 -0000 1.18
+++ PerThreadComponentHandler.java 9 Jul 2002 13:32:36 -0000 1.19
@@ -12,6 +12,7 @@
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;
/**
* The ThreadSafeComponentHandler to make sure components are initialized
@@ -36,10 +37,11 @@
final Configuration config,
final ComponentManager manager,
final ServiceManager service,
- final Context context )
+ final Context context,
+ final LifecycleExtensionManager extManager )
throws Exception
{
- super( componentClass, config, manager, service, context );
+ super( componentClass, config, manager, service, context, extManager );
m_instance = new ThreadLocalComponent( m_factory );
m_logger = m_logkit.getLoggerForCategory( "system.handler.perthread" );
m_name = "PerThreadComponentHandler";
@@ -79,7 +81,7 @@
{
super.get();
- return m_instance.get();
+ return m_instance.get();
}
/**
1.22 +6 -5 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.21
retrieving revision 1.22
diff -u -r1.21 -r1.22
--- PoolableComponentHandler.java 18 Jun 2002 18:45:36 -0000 1.21
+++ PoolableComponentHandler.java 9 Jul 2002 13:32:36 -0000 1.22
@@ -13,6 +13,7 @@
import org.apache.avalon.framework.context.Context;
import org.apache.avalon.framework.service.ServiceManager;
import org.apache.excalibur.fortress.Container;
+import org.apache.excalibur.fortress.lifecycle.LifecycleExtensionManager;
import org.apache.excalibur.mpool.Pool;
import org.apache.excalibur.mpool.PoolManager;
@@ -46,10 +47,11 @@
final Configuration config,
final ComponentManager manager,
final ServiceManager service,
- final Context context )
+ final Context context,
+ final LifecycleExtensionManager extManager )
throws Exception
{
- super( componentClass, config, manager, service, context );
+ super( componentClass, config, manager, service, context, extManager );
m_poolMin = config.getAttributeAsInteger( "pool-min", 10 );
m_logger = m_logkit.getLoggerForCategory( "system.handler.poolable" );
m_poolManager = (PoolManager)context.get( Container.POOL_MANAGER );
@@ -85,7 +87,7 @@
{
super.get();
- return m_pool.acquire();
+ return m_pool.acquire();
}
/**
@@ -94,7 +96,6 @@
public void put( final Object component )
{
super.put( component );
-
m_pool.release( component );
}
1.18 +5 -3 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.17
retrieving revision 1.18
diff -u -r1.17 -r1.18
--- ThreadSafeComponentHandler.java 28 Jun 2002 17:11:20 -0000 1.17
+++ ThreadSafeComponentHandler.java 9 Jul 2002 13:32:36 -0000 1.18
@@ -11,6 +11,7 @@
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;
/**
* The ThreadSafeComponentHandler to make sure components are initialized
@@ -33,10 +34,11 @@
final Configuration config,
final ComponentManager manager,
final ServiceManager service,
- final Context context )
+ final Context context,
+ final LifecycleExtensionManager extManager )
throws Exception
{
- super( componentClass, config, manager, service, context );
+ super( componentClass, config, manager, service, context, extManager );
m_logger = m_logkit.getLoggerForCategory( "system.handler.threadsafe" );
m_name = "ThreadSafeComponentHandler";
}
1.1 jakarta-avalon-excalibur/fortress/src/java/org/apache/excalibur/fortress/lifecycle/AbstractLifecycleExtension.java
Index: AbstractLifecycleExtension.java
===================================================================
/*
* 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.txt file.
*/
package org.apache.excalibur.fortress.lifecycle;
import org.apache.avalon.framework.context.Context;
import org.apache.avalon.framework.logger.AbstractLogEnabled;
/**
* Abstract lifecycle extension helper class, including empty default
* methods for available extension callbacks.
*
* @author <a href="mailto:crafterm@apache.org">Marcus Crafter</a>
* @version CVS $Revision: 1.1 $ $Date: 2002/07/09 13:32:36 $
*/
public abstract class AbstractLifecycleExtension
extends AbstractLogEnabled
implements LifecycleExtension
{
/**
* Create, called when the given component is being
* instantiated.
*
* @param component a <code>Component</code> instance
* @param context a <code>Context</code> instance
* @exception Exception if an error occurs
*/
public void create( Object component, Context context )
throws Exception {}
/**
* Destroy, called when the given component is being
* decomissioned.
*
* @param component a <code>Component</code> instance
* @param context a <code>Context</code> instance
* @exception Exception if an error occurs
*/
public void destroy( Object component, Context context )
throws Exception {}
/**
* Access, called when the given component is being
* accessed (ie. via lookup() or select()).
*
* @param component a <code>Component</code> instance
* @param context a <code>Context</code> instance
* @exception Exception if an error occurs
*/
public void access( Object component, Context context )
throws Exception {}
/**
* Release, called when the given component is being
* released (ie. by a CM or CS).
*
* @param component a <code>Component</code> instance
* @param context a <code>Context</code> instance
* @exception Exception if an error occurs
*/
public void release( Object component, Context context )
throws Exception {}
}
1.1 jakarta-avalon-excalibur/fortress/src/java/org/apache/excalibur/fortress/lifecycle/AbstractLifecycleExtensionManager.java
Index: AbstractLifecycleExtensionManager.java
===================================================================
/*
* 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.txt file.
*/
package org.apache.excalibur.fortress.lifecycle;
import java.lang.reflect.Method;
import org.apache.avalon.framework.component.Component;
import org.apache.avalon.framework.context.Context;
import org.apache.avalon.framework.logger.AbstractLogEnabled;
/**
* <code>AbstractLifecycleExtensionManager</code> class.
*
* @author <a href="mailto:crafterm@apache.org">Marcus Crafter</a>
* @version CVS $Revision: 1.1 $ $Date: 2002/07/09 13:32:36 $
*/
public abstract class AbstractLifecycleExtensionManager extends AbstractLogEnabled
{
// Lifecycle method constants, these are passed to executeExtensions()
protected final Method ACCESS;
protected final Method RELEASE;
protected final Method CREATION;
protected final Method DESTRUCTION;
/**
* Constructor, creates a lifecycle manager, and caches all lifecycle
* <code>Method</code> objects for later use.
*/
public AbstractLifecycleExtensionManager()
{
final Class[] params = {Object.class, Context.class};
final Class clazz = LifecycleExtension.class;
try
{
ACCESS = clazz.getDeclaredMethod( "access", params );
RELEASE = clazz.getDeclaredMethod( "release", params );
CREATION = clazz.getDeclaredMethod( "create", params );
DESTRUCTION = clazz.getDeclaredMethod( "destroy", params );
}
catch ( NoSuchMethodException e )
{
throw new IllegalStateException(
"Bad environment, cannot reference LifecycleExtension class: " +
e.getMessage()
);
}
}
/**
* <code>executeExtensions</code> method, executes a given array of lifecycle interfaces
* on a given component.
*
* @param component a <code>Component</code> instance
* @param context a <code>Context</code> instance
* @param type a <code>Method</code> instance, referencing which phase the
* extensions array adheres to.
* @exception Exception if an error occurs
*/
protected void executeExtensions(
Object[] extensions, Object component, Context context, Method type
)
throws Exception
{
final Object[] params = { component, context };
for ( int i = 0; i < extensions.length; ++i )
{
if ( getLogger().isDebugEnabled() )
{
getLogger().debug(
"Executing extension " + extensions[i] +
" on component " + component +
" (" + type.getName() + " phase)"
);
}
type.invoke( ( LifecycleExtension ) extensions[i], params );
}
}
}
1.1 jakarta-avalon-excalibur/fortress/src/java/org/apache/excalibur/fortress/lifecycle/LifecycleExtension.java
Index: LifecycleExtension.java
===================================================================
/*
* 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.txt file.
*/
package org.apache.excalibur.fortress.lifecycle;
import org.apache.avalon.framework.context.Context;
/**
* <code>LifecycleExtension</code> interface. This interface defines the methods that
* a <code>LifecycleExtensionManager</code> can call on a particular concrete
* <code>LifecycleExtensionMarker</code> class.
*
* @author <a href="mailto:crafterm@apache.org">Marcus Crafter</a>
* @version CVS $Revision: 1.1 $ $Date: 2002/07/09 13:32:36 $
*/
public interface LifecycleExtension
{
/**
* Create, called when the given component is being
* instantiated.
*
* @param component a <code>Component</code> instance
* @param context a <code>Context</code> instance
* @exception Exception if an error occurs
*/
void create( Object component, Context context )
throws Exception;
/**
* Destroy, called when the given component is being
* decomissioned.
*
* @param component a <code>Component</code> instance
* @param context a <code>Context</code> instance
* @exception Exception if an error occurs
*/
void destroy( Object component, Context context )
throws Exception;
/**
* Access, called when the given component is being
* accessed (ie. via lookup() or select()).
*
* @param component a <code>Component</code> instance
* @param context a <code>Context</code> instance
* @exception Exception if an error occurs
*/
void access( Object component, Context context )
throws Exception;
/**
* Release, called when the given component is being
* released (ie. by a CM or CS).
*
* @param component a <code>Component</code> instance
* @param context a <code>Context</code> instance
* @exception Exception if an error occurs
*/
void release( Object component, Context context )
throws Exception;
}
1.1 jakarta-avalon-excalibur/fortress/src/java/org/apache/excalibur/fortress/lifecycle/LifecycleExtensionManager.java
Index: LifecycleExtensionManager.java
===================================================================
/*
* 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.txt file.
*/
package org.apache.excalibur.fortress.lifecycle;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.List;
import org.apache.avalon.framework.component.Component;
import org.apache.avalon.framework.context.Context;
/**
* <code>LifecycleExtensionManager</code> class. This class manages lists
* of extensions objects that are executed on components during the various
* stages of their lifecycles.
*
* <p>
* It provides 4 methods for adding extension objects to the system,
* and 4 methods for executing them on a particular component object. The
* current context is also passed in to the extension objects to facilitate
* the communication of any global values.
* </p>
*
* @author <a href="mailto:crafterm@apache.org">Marcus Crafter</a>
* @version CVS $Revision: 1.1 $ $Date: 2002/07/09 13:32:36 $
*/
public class LifecycleExtensionManager
extends AbstractLifecycleExtensionManager
{
// extensions objects
private final List m_accessExtensions = new ArrayList();
private final List m_releaseExtensions = new ArrayList();
private final List m_creationExtensions = new ArrayList();
private final List m_destructionExtensions = new ArrayList();
/**
* <code>executeAccessExtensions</code> method, executes all <i>access</i>
* level extensions on the given component.
*
* @param component a <code>Component</code> instance
* @param context a <code>Context</code> instance
* @exception Exception if an error occurs
*/
public void executeAccessExtensions( Object component, Context context )
throws Exception
{
executeExtensions( m_accessExtensions.toArray(), component, context, ACCESS );
}
/**
* <code>executeReleaseExtensions</code> method, executes all <i>release</i>
* level extensions on the given component.
*
* @param component a <code>Component</code> instance
* @param context a <code>Context</code> instance
* @exception Exception if an error occurs
*/
public void executeReleaseExtensions( Object component, Context context )
throws Exception
{
executeExtensions( m_releaseExtensions.toArray(), component, context, RELEASE );
}
/**
* <code>executeCreationExtensions</code> method, executes all <i>creation</i>
* level extensions on the given component.
*
* @param component a <code>Component</code> instance
* @param context a <code>Context</code> instance
* @exception Exception if an error occurs
*/
public void executeCreationExtensions( Object component, Context context )
throws Exception
{
executeExtensions( m_creationExtensions.toArray(), component, context, CREATION );
}
/**
* <code>executeDestructionExtensions</code> method, executes all <i>destruction</i>
* level extensions on the given component.
*
* @param component a <code>Component</code> instance
* @param context a <code>Context</code> instance
* @exception Exception if an error occurs
*/
public void executeDestructionExtensions( Object component, Context context )
throws Exception
{
executeExtensions( m_destructionExtensions.toArray(), component, context, DESTRUCTION );
}
// REVISIT: The methods below breaks encapsulation, but I think most of List's
// operations are useful, any better ways to do this ?
/**
* Obtains the access level lifecycle extension this manager manages.
*
* @return a <code>List</code> of extensions
*/
public List getAccessLifecycleExtensions()
{
return m_accessExtensions;
}
/**
* Obtains the release level lifecycle extensions this manager manages.
*
* @return a <code>List</code> of extensions
*/
public List getReleaseLifecycleExtensions()
{
return m_releaseExtensions;
}
/**
* Obtains the creation level lifecycle extensions this manager manages.
*
* @return a <code>List</code> of extensions
*/
public List getCreationLifecycleExtensions()
{
return m_creationExtensions;
}
/**
* Obtains the destruction level lifecycle extensions this manager manages.
*
* @return a <code>List</code> of extensions
*/
public List getDestructionLifecycleExtensions()
{
return m_destructionExtensions;
}
}
1.1 jakarta-avalon-excalibur/fortress/src/java/org/apache/excalibur/fortress/lifecycle/package.html
Index: package.html
===================================================================
<body>
Interfaces and classes supporting the addition of lifecycle extensions to
a container.
</body>
1.5 +9 -7 jakarta-avalon-excalibur/fortress/src/java/org/apache/excalibur/fortress/lookup/FortressComponentManager.java
Index: FortressComponentManager.java
===================================================================
RCS file: /home/cvs/jakarta-avalon-excalibur/fortress/src/java/org/apache/excalibur/fortress/lookup/FortressComponentManager.java,v
retrieving revision 1.4
retrieving revision 1.5
diff -u -r1.4 -r1.5
--- FortressComponentManager.java 9 Jul 2002 10:40:26 -0000 1.4
+++ FortressComponentManager.java 9 Jul 2002 13:32:36 -0000 1.5
@@ -12,10 +12,12 @@
import org.apache.avalon.framework.component.ComponentException;
import org.apache.avalon.framework.component.ComponentManager;
import org.apache.avalon.framework.component.ComponentSelector;
+import org.apache.avalon.framework.context.Context;
import org.apache.avalon.framework.service.ServiceException;
import org.apache.avalon.framework.service.ServiceManager;
import org.apache.excalibur.fortress.Container;
import org.apache.excalibur.fortress.handler.ComponentHandler;
+import org.apache.excalibur.fortress.lifecycle.LifecycleExtensionManager;
import org.apache.excalibur.fortress.lookup.FortressServiceManager;
/**
@@ -35,25 +37,25 @@
* This constructor is for a ContainerComponentManager with no parent
* ComponentLocator
*/
- public FortressComponentManager( final Container container )
+ public FortressComponentManager( final Container container, final LifecycleExtensionManager extManager, final Context context )
{
- this( container,(ComponentManager)null );
+ this( container,(ComponentManager)null, extManager, context );
}
/**
*/
- public FortressComponentManager( final Container container, final ServiceManager parent )
+ public FortressComponentManager( final Container container, final ServiceManager parent, final LifecycleExtensionManager extManager, final Context context )
{
- this( container, new ServiceComponentManager(parent));
+ this( container, new ServiceComponentManager(parent), extManager, context);
}
/**
* This constructor is for a ContainerComponentManager with a parent
* ComponentLocator
*/
- public FortressComponentManager( final Container container, final ComponentManager parent )
+ public FortressComponentManager( final Container container, final ComponentManager parent, final LifecycleExtensionManager extManager, final Context context )
{
- m_proxy = new FortressServiceManager( container, parent );
+ m_proxy = new FortressServiceManager( container, parent, extManager, context );
}
public Component lookup( String role )
1.4 +5 -3 jakarta-avalon-excalibur/fortress/src/java/org/apache/excalibur/fortress/lookup/FortressComponentSelector.java
Index: FortressComponentSelector.java
===================================================================
RCS file: /home/cvs/jakarta-avalon-excalibur/fortress/src/java/org/apache/excalibur/fortress/lookup/FortressComponentSelector.java,v
retrieving revision 1.3
retrieving revision 1.4
diff -u -r1.3 -r1.4
--- FortressComponentSelector.java 9 Jul 2002 10:40:26 -0000 1.3
+++ FortressComponentSelector.java 9 Jul 2002 13:32:36 -0000 1.4
@@ -11,10 +11,12 @@
import org.apache.avalon.framework.component.Component;
import org.apache.avalon.framework.component.ComponentException;
import org.apache.avalon.framework.component.ComponentSelector;
+import org.apache.avalon.framework.context.Context;
import org.apache.avalon.framework.service.ServiceException;
import org.apache.avalon.framework.service.ServiceSelector;
import org.apache.excalibur.fortress.Container;
import org.apache.excalibur.fortress.handler.ComponentHandler;
+import org.apache.excalibur.fortress.lifecycle.LifecycleExtensionManager;
import org.apache.excalibur.fortress.lookup.FortressServiceSelector;
/**
@@ -31,9 +33,9 @@
private final ServiceSelector m_proxy;
private final String m_role;
- public FortressComponentSelector( final Container container, final String role )
+ public FortressComponentSelector( final Container container, final String role, final LifecycleExtensionManager extManager, final Context context )
{
- m_proxy = new FortressServiceSelector( container, role );
+ m_proxy = new FortressServiceSelector( container, role, extManager, context );
m_role = role;
}
1.4 +23 -6 jakarta-avalon-excalibur/fortress/src/java/org/apache/excalibur/fortress/lookup/FortressServiceManager.java
Index: FortressServiceManager.java
===================================================================
RCS file: /home/cvs/jakarta-avalon-excalibur/fortress/src/java/org/apache/excalibur/fortress/lookup/FortressServiceManager.java,v
retrieving revision 1.3
retrieving revision 1.4
diff -u -r1.3 -r1.4
--- FortressServiceManager.java 9 Jul 2002 10:40:26 -0000 1.3
+++ FortressServiceManager.java 9 Jul 2002 13:32:36 -0000 1.4
@@ -10,11 +10,13 @@
import org.apache.avalon.excalibur.collections.BucketMap;
import org.apache.avalon.framework.component.ComponentManager;
import org.apache.avalon.framework.component.ComponentSelector;
+import org.apache.avalon.framework.context.Context;
import org.apache.avalon.framework.service.ServiceException;
import org.apache.avalon.framework.service.ServiceManager;
import org.apache.avalon.framework.service.ServiceSelector;
import org.apache.excalibur.fortress.Container;
import org.apache.excalibur.fortress.handler.ComponentHandler;
+import org.apache.excalibur.fortress.lifecycle.LifecycleExtensionManager;
/**
* This is the Default ServiceManager for the Container. It provides
@@ -29,33 +31,37 @@
private final Container m_components;
private final BucketMap m_used;
private final ServiceManager m_parent;
+ private final Context m_context;
+ private final LifecycleExtensionManager m_extManager;
/**
* This constructor is for a ContainerComponentManager with no parent
* ComponentLocator
*/
- public FortressServiceManager( final Container container )
+ public FortressServiceManager( final Container container, final LifecycleExtensionManager extManager, final Context context )
{
- this( container, (ServiceManager)null );
+ this( container, (ServiceManager)null, extManager, context );
}
/**
* This constructor is for a ContainerComponentManager with no parent
* ComponentLocator
*/
- public FortressServiceManager( final Container container, final ComponentManager parent )
+ public FortressServiceManager( final Container container, final ComponentManager parent, final LifecycleExtensionManager extManager, final Context context )
{
- this( container, (parent != null) ? new ComponentServiceManager( parent ) : null );
+ this( container, (parent != null) ? new ComponentServiceManager( parent ) : null, extManager, context );
}
/**
* This constructor is for a ContainerComponentManager with a parent
* ComponentLocator
*/
- public FortressServiceManager( final Container container, final ServiceManager parent )
+ public FortressServiceManager( final Container container, final ServiceManager parent, final LifecycleExtensionManager extManager, final Context context )
{
m_parent = parent;
m_components = container;
+ m_context = context;
+ m_extManager = extManager;
m_used = new BucketMap();
}
@@ -112,6 +118,8 @@
}
component = handler.get();
+
+ m_extManager.executeAccessExtensions( component, m_context );
}
catch( ServiceException ce )
{
@@ -142,6 +150,15 @@
public void release( Object component )
{
final ComponentHandler handler;
+
+ try
+ {
+ m_extManager.executeReleaseExtensions( component, m_context );
+ }
+ catch ( Exception e )
+ {
+ // REVISIT(MC): need to log this somewhere ?
+ }
handler = (ComponentHandler)m_used.remove( component );
1.3 +19 -2 jakarta-avalon-excalibur/fortress/src/java/org/apache/excalibur/fortress/lookup/FortressServiceSelector.java
Index: FortressServiceSelector.java
===================================================================
RCS file: /home/cvs/jakarta-avalon-excalibur/fortress/src/java/org/apache/excalibur/fortress/lookup/FortressServiceSelector.java,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -r1.2 -r1.3
--- FortressServiceSelector.java 8 Jul 2002 11:58:58 -0000 1.2
+++ FortressServiceSelector.java 9 Jul 2002 13:32:36 -0000 1.3
@@ -8,10 +8,12 @@
package org.apache.excalibur.fortress.lookup;
import org.apache.avalon.excalibur.collections.BucketMap;
+import org.apache.avalon.framework.context.Context;
import org.apache.avalon.framework.service.ServiceException;
import org.apache.avalon.framework.service.ServiceSelector;
import org.apache.excalibur.fortress.Container;
import org.apache.excalibur.fortress.handler.ComponentHandler;
+import org.apache.excalibur.fortress.lifecycle.LifecycleExtensionManager;
/**
* This is the Default ServiceSelector for the Container. It provides
@@ -26,11 +28,15 @@
private final String m_role;
private final Container m_components;
private final BucketMap m_used;
+ private final Context m_context;
+ private final LifecycleExtensionManager m_extManager;
- public FortressServiceSelector( final Container container, final String role )
+ public FortressServiceSelector( final Container container, final String role, final LifecycleExtensionManager extManager, final Context context )
{
m_role = role;
m_components = container;
+ m_context = context;
+ m_extManager = extManager;
m_used = new BucketMap();
}
@@ -59,6 +65,8 @@
}
component = handler.get();
+
+ m_extManager.executeAccessExtensions( component, m_context );
}
catch( ServiceException ce )
{
@@ -82,6 +90,15 @@
public void release( Object component )
{
final ComponentHandler handler;
+
+ try
+ {
+ m_extManager.executeReleaseExtensions( component, m_context );
+ }
+ catch ( Exception e )
+ {
+ // REVISIT(MC): we need to log this somewhere
+ }
handler = (ComponentHandler)m_used.remove( component );
--
To unsubscribe, e-mail: <ma...@jakarta.apache.org>
For additional commands, e-mail: <ma...@jakarta.apache.org>