mcconnell 2003/10/16 23:44:50
Modified:
merlin/activation/impl/src/java/org/apache/avalon/activation/appliance/impl
DefaultAppliance.java
merlin/activation/impl/src/java/org/apache/avalon/activation/lifestyle/impl
AbstractLifestyleHandler.java
PooledLifestyleHandler.java
SingletonLifestyleHandler.java
ThreadLifestyleHandler.java
TransientLifestyleHandler.java
merlin/activation/spi/src/java/org/apache/avalon/activation/lifecycle
Factory.java
merlin/kernel/unit/src/java/org/apache/avalon/merlin/unit
AbstractMerlinTestCase.java
merlin/kernel/unit/src/test/org/apache/avalon/merlin/unit
StandardTestCase.java
Log:
Updating lifestyle handles to support collection polices.
Revision Changes Path
1.3 +11 -1
avalon/merlin/activation/impl/src/java/org/apache/avalon/activation/appliance/impl/DefaultAppliance.java
Index: DefaultAppliance.java
===================================================================
RCS file:
/home/cvs/avalon/merlin/activation/impl/src/java/org/apache/avalon/activation/appliance/impl/DefaultAppliance.java,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -r1.2 -r1.3
--- DefaultAppliance.java 17 Oct 2003 03:26:28 -0000 1.2
+++ DefaultAppliance.java 17 Oct 2003 06:44:49 -0000 1.3
@@ -1240,6 +1240,16 @@
private class StandardFactory implements Factory
{
/**
+ * Return the component deployment model.
+ *
+ * @exception LifecycleException
+ */
+ public DeploymentModel getDeploymentModel()
+ {
+ return m_model;
+ }
+
+ /**
* Create a new instance of a component.
*
* @exception LifecycleException
1.3 +72 -3
avalon/merlin/activation/impl/src/java/org/apache/avalon/activation/lifestyle/impl/AbstractLifestyleHandler.java
Index: AbstractLifestyleHandler.java
===================================================================
RCS file:
/home/cvs/avalon/merlin/activation/impl/src/java/org/apache/avalon/activation/lifestyle/impl/AbstractLifestyleHandler.java,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -r1.2 -r1.3
--- AbstractLifestyleHandler.java 17 Oct 2003 03:26:28 -0000 1.2
+++ AbstractLifestyleHandler.java 17 Oct 2003 06:44:49 -0000 1.3
@@ -50,9 +50,16 @@
package org.apache.avalon.activation.lifestyle.impl;
+import java.lang.ref.Reference;
+import java.lang.ref.SoftReference;
+import java.lang.ref.WeakReference;
+import java.lang.ref.ReferenceQueue;
+
+import org.apache.avalon.activation.lifecycle.Factory;
+import org.apache.avalon.activation.lifestyle.LifestyleHandler;
+import org.apache.avalon.meta.info.InfoDescriptor;
import org.apache.avalon.framework.logger.AbstractLogEnabled;
import org.apache.avalon.framework.logger.Logger;
-import org.apache.avalon.activation.lifestyle.LifestyleHandler;
/**
* Abstract implentation class for a lifestyle handler.
@@ -63,14 +70,76 @@
public abstract class AbstractLifestyleHandler extends AbstractLogEnabled
implements LifestyleHandler
{
+ private final Factory m_factory;
+
+ private final InfoDescriptor m_info;
+
+ private final ReferenceQueue m_liberals = new ReferenceQueue();
+
+ private final ReferenceQueue m_democrats = new ReferenceQueue();
/**
* Creation of a new instance.
* @param logger the logging channel
*/
- public AbstractLifestyleHandler( Logger logger )
+ public AbstractLifestyleHandler( Logger logger, Factory factory )
{
enableLogging( logger );
+ m_info = factory.getDeploymentModel().getType().getInfo();
+ m_factory = factory;
+ }
+
+ Factory getFactory()
+ {
+ return m_factory;
+ }
+
+ Reference getReference( Object instance )
+ {
+ if( m_info.isLiberal() )
+ {
+ return new WeakReference( instance, m_liberals );
+ }
+ else if( m_info.isDemocrat() )
+ {
+ return new SoftReference( instance );
+ }
+ else
+ {
+ return new StrongReference( instance );
+ }
}
+ void disposeInstance( Object instance )
+ {
+ if( instance != null )
+ {
+ synchronized( getFactory() )
+ {
+ m_factory.destroy( instance );
+ }
+ }
+ }
+
+ class StrongReference extends WeakReference
+ {
+ private final Object m_instance;
+
+ public StrongReference( Object instance )
+ {
+ super( instance );
+ m_instance = instance;
+ }
+
+ public Object get()
+ {
+ return m_instance;
+ }
+ }
+
+ Object newInstance() throws Exception
+ {
+ return m_factory.newInstance();
+ }
+
}
1.3 +2 -2
avalon/merlin/activation/impl/src/java/org/apache/avalon/activation/lifestyle/impl/PooledLifestyleHandler.java
Index: PooledLifestyleHandler.java
===================================================================
RCS file:
/home/cvs/avalon/merlin/activation/impl/src/java/org/apache/avalon/activation/lifestyle/impl/PooledLifestyleHandler.java,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -r1.2 -r1.3
--- PooledLifestyleHandler.java 17 Oct 2003 03:26:28 -0000 1.2
+++ PooledLifestyleHandler.java 17 Oct 2003 06:44:49 -0000 1.3
@@ -62,7 +62,7 @@
{
public PooledLifestyleHandler( Logger logger, Factory factory )
{
- super( logger );
+ super( logger, factory );
}
/**
1.3 +36 -18
avalon/merlin/activation/impl/src/java/org/apache/avalon/activation/lifestyle/impl/SingletonLifestyleHandler.java
Index: SingletonLifestyleHandler.java
===================================================================
RCS file:
/home/cvs/avalon/merlin/activation/impl/src/java/org/apache/avalon/activation/lifestyle/impl/SingletonLifestyleHandler.java,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -r1.2 -r1.3
--- SingletonLifestyleHandler.java 17 Oct 2003 03:26:28 -0000 1.2
+++ SingletonLifestyleHandler.java 17 Oct 2003 06:44:49 -0000 1.3
@@ -50,6 +50,8 @@
package org.apache.avalon.activation.lifestyle.impl;
+import java.lang.ref.Reference;
+import java.lang.ref.SoftReference;
import java.lang.ref.WeakReference;
import org.apache.avalon.activation.lifecycle.Factory;
@@ -63,15 +65,13 @@
public class SingletonLifestyleHandler extends AbstractLifestyleHandler
implements Disposable
{
- private final Factory m_factory;
- private Object m_instance;
+ private Reference m_reference;
public SingletonLifestyleHandler( Logger logger, Factory factory )
{
- super( logger );
+ super( logger, factory );
if( factory == null ) throw new IllegalStateException( "factory" );
- m_factory = factory;
}
/**
@@ -83,18 +83,23 @@
*/
public Object resolve() throws Exception
{
- //
- // TODO: Add support for ref handling - first off
- // virify classes in ref are assignable from the
- // instance class, and secondly, build a proxy
- // using the ref array.
- //
+ Object instance = null;
- if( m_instance != null ) return m_instance;
- synchronized( m_factory )
+ if( m_reference == null )
{
- m_instance = m_factory.newInstance();
- return m_instance;
+ return refreshReference();
+ }
+ else
+ {
+ instance = m_reference.get();
+ if( instance == null )
+ {
+ return refreshReference();
+ }
+ else
+ {
+ return instance;
+ }
}
}
@@ -105,7 +110,7 @@
*/
public void release( Object instance )
{
- // don't release the singleton
+ // don't release singleton types
}
/**
@@ -113,9 +118,22 @@
*/
public void dispose()
{
- synchronized( m_factory )
+ if( m_reference != null )
{
- if( m_instance != null ) m_factory.destroy( m_instance );
+ disposeInstance( m_reference.get() );
+ m_reference = null;
}
}
+
+ private Object refreshReference() throws Exception
+ {
+ synchronized( getFactory() )
+ {
+ Object instance = getFactory().newInstance();
+ m_reference = getReference( instance );
+ return instance;
+ }
+ }
+
+
}
1.3 +10 -2
avalon/merlin/activation/impl/src/java/org/apache/avalon/activation/lifestyle/impl/ThreadLifestyleHandler.java
Index: ThreadLifestyleHandler.java
===================================================================
RCS file:
/home/cvs/avalon/merlin/activation/impl/src/java/org/apache/avalon/activation/lifestyle/impl/ThreadLifestyleHandler.java,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -r1.2 -r1.3
--- ThreadLifestyleHandler.java 17 Oct 2003 03:26:28 -0000 1.2
+++ ThreadLifestyleHandler.java 17 Oct 2003 06:44:49 -0000 1.3
@@ -72,6 +72,14 @@
m_factory = factory;
}
+ //
+ // TODO: the current implementation is hard coded to CONSERVATIVE
+ // collection policy - we need to update the ThreadLocalHolder so
+ // it regenerates the value relative to DEMOCRAT or LIBERAL policies
+ // (but I just need to check docs on thread local state access
+ // semantics)
+ //
+
protected Object initialValue()
{
try
@@ -96,7 +104,7 @@
public ThreadLifestyleHandler( Logger logger, Factory factory )
{
- super( logger );
+ super( logger, factory );
m_factory = factory;
}
1.3 +11 -22
avalon/merlin/activation/impl/src/java/org/apache/avalon/activation/lifestyle/impl/TransientLifestyleHandler.java
Index: TransientLifestyleHandler.java
===================================================================
RCS file:
/home/cvs/avalon/merlin/activation/impl/src/java/org/apache/avalon/activation/lifestyle/impl/TransientLifestyleHandler.java,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -r1.2 -r1.3
--- TransientLifestyleHandler.java 17 Oct 2003 03:26:28 -0000 1.2
+++ TransientLifestyleHandler.java 17 Oct 2003 06:44:49 -0000 1.3
@@ -50,14 +50,13 @@
package org.apache.avalon.activation.lifestyle.impl;
+import java.lang.ref.Reference;
import java.lang.ref.WeakReference;
-import java.lang.ref.ReferenceQueue;
-
import java.util.ArrayList;
import org.apache.avalon.activation.lifecycle.Factory;
-import org.apache.avalon.framework.logger.Logger;
import org.apache.avalon.framework.activity.Disposable;
+import org.apache.avalon.framework.logger.Logger;
/**
* @author <a href="mailto:[EMAIL PROTECTED]">Avalon Development Team</a>
@@ -65,16 +64,11 @@
*/
public class TransientLifestyleHandler extends AbstractLifestyleHandler implements
Disposable
{
- private final Factory m_factory;
-
- private final ReferenceQueue m_queue = new ReferenceQueue();
-
private ArrayList m_list = new ArrayList();
public TransientLifestyleHandler( Logger logger, Factory factory )
{
- super( logger );
- m_factory = factory;
+ super( logger, factory );
}
/**
@@ -86,12 +80,12 @@
*/
public Object resolve() throws Exception
{
- // TODO: setup a background thread to check m_queue for
+ // TODO: setup a background thread to check queues for
// released references and remove them from our list, otherwise we
// have a memory leak due to accumulation of weak references
- Object instance = m_factory.newInstance();
- WeakReference reference = new WeakReference( instance, m_queue );
+ Object instance = newInstance();
+ Reference reference = getReference( instance );
m_list.add( reference );
return instance;
}
@@ -103,7 +97,7 @@
*/
public void release( Object instance )
{
- m_factory.destroy( instance );
+ disposeInstance( instance );
}
/**
@@ -111,16 +105,11 @@
*/
public synchronized void dispose()
{
- WeakReference[] refs = (WeakReference[]) m_list.toArray( new
WeakReference[0] );
+ Reference[] refs = (Reference[]) m_list.toArray( new Reference[0] );
for( int i=0; i<refs.length; i++ )
{
- WeakReference ref = refs[i];
- Object instance = ref.get();
- if( instance != null )
- {
- m_factory.destroy( instance );
- ref.clear();
- }
+ Reference ref = refs[i];
+ disposeInstance( refs[i].get() );
}
m_list.clear();
}
1.2 +9 -1
avalon/merlin/activation/spi/src/java/org/apache/avalon/activation/lifecycle/Factory.java
Index: Factory.java
===================================================================
RCS file:
/home/cvs/avalon/merlin/activation/spi/src/java/org/apache/avalon/activation/lifecycle/Factory.java,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -r1.1 -r1.2
--- Factory.java 24 Sep 2003 09:31:00 -0000 1.1
+++ Factory.java 17 Oct 2003 06:44:49 -0000 1.2
@@ -51,6 +51,7 @@
package org.apache.avalon.activation.lifecycle;
import org.apache.avalon.activation.lifecycle.LifecycleException;
+import org.apache.avalon.composition.model.DeploymentModel;
/**
* The Factory interface exposes an operation though which a
@@ -61,6 +62,13 @@
*/
public interface Factory
{
+ /**
+ * Return the component deployment model.
+ *
+ * @exception LifecycleException
+ */
+ DeploymentModel getDeploymentModel();
+
/**
* Create a new instance of a component.
*
1.9 +0 -1
avalon/merlin/kernel/unit/src/java/org/apache/avalon/merlin/unit/AbstractMerlinTestCase.java
Index: AbstractMerlinTestCase.java
===================================================================
RCS file:
/home/cvs/avalon/merlin/kernel/unit/src/java/org/apache/avalon/merlin/unit/AbstractMerlinTestCase.java,v
retrieving revision 1.8
retrieving revision 1.9
diff -u -r1.8 -r1.9
--- AbstractMerlinTestCase.java 17 Oct 2003 03:26:29 -0000 1.8
+++ AbstractMerlinTestCase.java 17 Oct 2003 06:44:49 -0000 1.9
@@ -88,7 +88,6 @@
public static final File MERLIN_DEFAULT_CONFIG_FILE =
getProjectFile( "conf/config.xml" );
- private static URL CONF = getProjectPath( "conf/config.xml", false );
//-------------------------------------------------------------------
// state
1.5 +0 -2
avalon/merlin/kernel/unit/src/test/org/apache/avalon/merlin/unit/StandardTestCase.java
Index: StandardTestCase.java
===================================================================
RCS file:
/home/cvs/avalon/merlin/kernel/unit/src/test/org/apache/avalon/merlin/unit/StandardTestCase.java,v
retrieving revision 1.4
retrieving revision 1.5
diff -u -r1.4 -r1.5
--- StandardTestCase.java 16 Oct 2003 03:57:51 -0000 1.4
+++ StandardTestCase.java 17 Oct 2003 06:44:50 -0000 1.5
@@ -61,8 +61,6 @@
public class StandardTestCase extends AbstractMerlinTestCase
{
- private static URL CONF = getProjectPath( "conf/cofig.xml", false );
-
//--------------------------------------------------------
// constructors
//--------------------------------------------------------
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]