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
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.