jicarilla-sandbox/platform/container/impl/src/java/org/jicarilla/container DefaultCustomizableResolver.java,1.1,1.2
Leo Simons <[email protected]>
| Newsgroups | gmane.comp.java.jicarilla.cvs |
|---|---|
| Message-ID | <[email protected]> |
Update of /cvsroot/jicarilla/jicarilla-sandbox/platform/container/impl/src/java/org/jicarilla/container
In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv24598/platform/container/impl/src/java/org/jicarilla/container
Modified Files:
DefaultCustomizableResolver.java
Log Message:
its now possible to do stuff like...
builder.addComponent(
SocketServer.class,
new CustomComponent( SocketServerImpl.class )
.redirectCall( 3, "event-pool" )
.redirectCall( 4, "pipeline-pool" )
.redirectCall( 5, "error-handler" )
);
...testing remains a TODO.
Index: DefaultCustomizableResolver.java
===================================================================
RCS file: /cvsroot/jicarilla/jicarilla-sandbox/platform/container/impl/src/java/org/jicarilla/container/DefaultCustomizableResolver.java,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -d -r1.1 -r1.2
--- DefaultCustomizableResolver.java 23 Mar 2004 14:22:35 -0000 1.1
+++ DefaultCustomizableResolver.java 23 Mar 2004 15:59:52 -0000 1.2
@@ -25,39 +25,58 @@
==================================================================== */
package org.jicarilla.container;
-import org.jicarilla.lang.Switch;
+import org.jicarilla.container.adapters.AdapterBasedKeyAwareAdapter;
+import org.jicarilla.container.adapters.ResolverBasedAdapter;
+import org.jicarilla.container.adapters.ResolverBasedKeyAwareAdapter;
+import org.jicarilla.container.adapters.SingletonAdapter;
+import org.jicarilla.container.factories.ManualFactory;
+import org.jicarilla.container.util.PolicyUtil;
import org.jicarilla.lang.Assert;
import org.jicarilla.lang.Selector;
-import org.jicarilla.lang.SelectorSwitch;
-import org.jicarilla.container.util.PolicyUtil;
-import java.util.Map;
import java.util.HashMap;
+import java.util.Map;
/**
- *
+ * <p>A rather complex implementation of the {@link Resolver} interface that
+ * is backed by another {@link Resolver}, and can be used to override some of
+ * the container's autowiring policy.</p>
*
+ * <p>You will normally not want to create instances of this class directly.
+ * Rather, feed {@link org.jicarilla.container.builder.CustomComponent}s to
+ * a {@link org.jicarilla.container.builder.Builder} instance and let the
+ * builder worry about that.</p>
+ *
* @author <a href="lsimons at jicarilla dot org">Leo Simons</a>
* @version $Id$
*/
-public class DefaultCustomizableResolver implements Resolver
+public class DefaultCustomizableResolver
+ implements CustomizableResolver
{
+ // ----------------------------------------------------------------------
+ // Properties
+ // ----------------------------------------------------------------------
protected Resolver m_delegate;
- protected Switch m_overrides;
+ protected Container m_overrides;
protected int m_getCallCount;
protected Map m_getCallOverrides;
+
+ protected Map m_instanceToAdapterMap;
+ // ----------------------------------------------------------------------
+ // Constructors
+ // ----------------------------------------------------------------------
public DefaultCustomizableResolver( Resolver delegate )
{
- this( delegate, new SelectorSwitch() );
+ this( delegate, new DefaultKeyRelayingContainer() );
}
- public DefaultCustomizableResolver( Resolver delegate, Switch overrides )
+ public DefaultCustomizableResolver( Resolver delegate, Container overrides )
{
this( delegate, overrides, new HashMap() );
}
- public DefaultCustomizableResolver( Resolver delegate, Switch overrides,
+ public DefaultCustomizableResolver( Resolver delegate, Container overrides,
Map getCallOverrides )
{
Assert.assertNotNull( "delegate argument may not be null", delegate );
@@ -71,8 +90,13 @@
m_getCallOverrides = getCallOverrides;
m_getCallCount = -1;
+
+ m_instanceToAdapterMap = new HashMap();
}
+ // ----------------------------------------------------------------------
+ // Interface: Resolver
+ // ----------------------------------------------------------------------
public Object get( Object key ) throws ResolutionException,
JicarillaIllegalAccessException,
JicarillaInvocationTargetException,
@@ -80,22 +104,35 @@
InitializationException, JicarillaException
{
m_getCallCount++;
-
final Integer count = new Integer( m_getCallCount );
+ Object instance = null;
+ Object adapter = null;
+
if( m_getCallOverrides.containsKey( count ) )
{
- return m_getCallOverrides.get( count );
+ Adapter a = (Adapter)m_getCallOverrides.get( count );
+ instance = a.getInstance();
+ adapter = new AdapterBasedKeyAwareAdapter( a );
}
- if(m_overrides.containsKey( key ) )
+ else if( m_overrides.getResolver().contains( key ) )
{
- return m_overrides.get( key );
+ instance = m_overrides.getResolver().get( key );
+ adapter = new ResolverBasedKeyAwareAdapter(
+ m_overrides.getResolver()
+ );
}
- if(m_overrides.containsKey( key ) )
+ else
{
- return m_overrides.get( key );
+ instance = m_delegate.get( key );
+ adapter = new ResolverBasedKeyAwareAdapter(
+ m_delegate
+ );
}
- return m_delegate.get( key );
+
+ m_instanceToAdapterMap.put( instance, adapter );
+
+ return instance;
}
public Object[] getAll( Object key )
@@ -104,41 +141,80 @@
JicarillaInstantiationException, JicarillaClassNotFoundException,
InitializationException, JicarillaException
{
- if( m_overrides.containsKey( key ) )
+ if( m_overrides.getResolver().contains( key ) )
{
- return new Object[] { m_overrides.get( key ) };
+ Object instance = m_overrides.getResolver().get( key );
+ KeyAwareAdapter adapter = new ResolverBasedKeyAwareAdapter(
+ m_overrides.getResolver()
+ );
+ m_instanceToAdapterMap.put( instance, adapter );
+
+ return new Object[] { instance };
}
else
{
- return m_delegate.getAll( key );
+ Object[] instances = m_delegate.getAll( key );
+ KeyAwareAdapter adapter = new ResolverBasedKeyAwareAdapter(
+ m_delegate
+ );
+ for( int i = 0; i < instances.length; i++ )
+ {
+ Object instance = instances[i];
+ m_instanceToAdapterMap.put( instance, adapter );
+ }
+
+ return instances;
}
}
public boolean contains( Object key )
{
- return m_overrides.containsKey( key ) ||
+ return m_overrides.getResolver().contains( key ) ||
m_delegate.contains( key );
}
public void releaseInstance( Object instance ) throws Exception
{
- m_delegate.releaseInstance( instance );
+ if( instance == null )
+ return;
+
+ final Object adapter =
+ m_instanceToAdapterMap.remove( instance );
+ if( adapter != null )
+ {
+ final KeyAwareAdapter keyAdapter =
+ (KeyAwareAdapter)adapter;
+ keyAdapter.releaseInstance( instance );
+ }
}
- public DefaultCustomizableResolver override( Object key, Object instance )
+ // ----------------------------------------------------------------------
+ // Interface: Customizable Resolver
+ // ----------------------------------------------------------------------
+ public CustomizableResolver overrideKey(
+ Object key, Object instance )
{
final Selector selector =
PolicyUtil.getSelectorForCriterion( key );
- override( selector, instance );
+ overrideKey( selector, instance );
return this;
}
- public DefaultCustomizableResolver override( Selector selector, Object instance )
+ public CustomizableResolver overrideKey(
+ Selector selector, Object instance )
{
Assert.assertNotNull( "selector argument may not be null", selector );
Assert.assertNotNull( "instance argument may not be null", instance );
- m_overrides.put( selector, instance );
+
+ m_overrides.registerAdapter(
+ selector,
+ new SingletonAdapter(
+ new ManualFactory(
+ instance
+ )
+ )
+ );
return this;
}
@@ -148,10 +224,62 @@
* @param callNumber index starts at 0
* @param instance
*/
- public DefaultCustomizableResolver override( int callNumber, Object instance )
+ public CustomizableResolver overrideCall(
+ int callNumber, Object instance )
{
- m_getCallOverrides.put( new Integer(callNumber), instance );
+ callNumberOverride(
+ callNumber,
+ new SingletonAdapter(
+ new ManualFactory( instance )
+ )
+ );
return this;
}
+
+ public CustomizableResolver redirectKey(
+ Object oldKey, Object newKey )
+ {
+ Assert.assertNotNull( "oldKey argument may not be null", oldKey );
+ Assert.assertNotNull( "newKey argument may not be null", newKey );
+
+ m_overrides.registerAdapter(
+ oldKey,
+ new ResolverBasedAdapter(
+ m_delegate,
+ newKey
+ )
+ );
+
+ return this;
+ }
+
+ public CustomizableResolver redirectCall(
+ int callNumber, Object newKey )
+ {
+ callNumberOverride(
+ 1,
+ new ResolverBasedAdapter(
+ m_delegate,
+ newKey
+ )
+ );
+
+ return this;
+ }
+
+
+ // ----------------------------------------------------------------------
+ // Helper Methods
+ // ----------------------------------------------------------------------
+ protected void callNumberOverride( int callNumber, Adapter adapter )
+ {
+ Assert.assertTrue( "callNumber must be 0 or greater",
+ callNumber >= 0 );
+
+ m_getCallOverrides.put(
+ new Integer(callNumber),
+ adapter
+ );
+ }
}
-------------------------------------------------------
This SF.Net email is sponsored by: IBM Linux Tutorials
Free Linux tutorial presented by Daniel Robbins, President and CEO of
GenToo technologies. Learn everything from fundamentals to system
administration.http://ads.osdn.com/?ad_id=1470&alloc_id=3638&op=click