You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@hivemind.apache.org by ah...@apache.org on 2006/10/29 20:51:39 UTC

svn commit: r468964 - /hivemind/branches/branch-2-0-annot/framework/src/java/org/apache/hivemind/impl/ConfigurationPointImpl.java

Author: ahuegen
Date: Sun Oct 29 11:51:38 2006
New Revision: 468964

URL: http://svn.apache.org/viewvc?view=rev&rev=468964
Log:
Implemented caching of configuration proxies. Not final yet

Modified:
    hivemind/branches/branch-2-0-annot/framework/src/java/org/apache/hivemind/impl/ConfigurationPointImpl.java

Modified: hivemind/branches/branch-2-0-annot/framework/src/java/org/apache/hivemind/impl/ConfigurationPointImpl.java
URL: http://svn.apache.org/viewvc/hivemind/branches/branch-2-0-annot/framework/src/java/org/apache/hivemind/impl/ConfigurationPointImpl.java?view=diff&rev=468964&r1=468963&r2=468964
==============================================================================
--- hivemind/branches/branch-2-0-annot/framework/src/java/org/apache/hivemind/impl/ConfigurationPointImpl.java (original)
+++ hivemind/branches/branch-2-0-annot/framework/src/java/org/apache/hivemind/impl/ConfigurationPointImpl.java Sun Oct 29 11:51:38 2006
@@ -16,7 +16,9 @@
 
 import java.lang.reflect.Constructor;
 import java.lang.reflect.Modifier;
+import java.util.HashMap;
 import java.util.List;
+import java.util.Map;
 
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
@@ -291,12 +293,12 @@
             // Create the outer proxy, the one visible to client code (including
             // other services). It is dependent on an inner proxy.
 
-            Class proxyClass = createSingletonProxyClass();
+            Class proxyClass = getSingletonProxyClass();
 
             // Create the inner proxy, whose job is to replace itself
             // when the first service method is invoked.
 
-            Class innerProxyClass = createInnerProxyClass(proxyClass);
+            Class innerProxyClass = getInnerProxyClass(proxyClass);
 
             // Create the outer proxy.
 
@@ -318,6 +320,31 @@
         }
 
     }
+    
+    private final static Map SINGLETON_PROXY_CACHE = new HashMap();
+    private final static Map INNER_PROXY_CACHE = new HashMap();
+    
+    private Class getSingletonProxyClass()
+    {
+        Class configurationInterface = lookupContainerInterface();
+        Class result = (Class) SINGLETON_PROXY_CACHE.get(configurationInterface);
+        if (result == null) {
+          result = createSingletonProxyClass(configurationInterface);
+          SINGLETON_PROXY_CACHE.put(configurationInterface, result);
+        }
+        return result;
+    }
+    
+    private Class getInnerProxyClass(Class deferredProxyClass)
+    {
+        Class result = (Class) INNER_PROXY_CACHE.get(deferredProxyClass);
+        if (result == null) {
+          Class configurationInterface = lookupContainerInterface();
+          result = createInnerProxyClass(configurationInterface, deferredProxyClass);
+          INNER_PROXY_CACHE.put(deferredProxyClass, result);
+        }
+        return result;
+    }
 
     /**
      * Creates a class that implements the service interface. Implements a private synchronized
@@ -325,10 +352,8 @@
      * method re-invoke on _configuration(). Adds a toString() method if the service interface does not
      * define toString().
      */
-    private Class createSingletonProxyClass()
+    private Class createSingletonProxyClass(Class configurationInterface)
     {
-        Class configurationInterface = lookupContainerInterface();
-
         ProxyBuilder proxyBuilder = new ProxyBuilder("LazyConstructionProxy", this, configurationInterface, true);
 
         ClassFab classFab = proxyBuilder.getClassFab();
@@ -371,17 +396,15 @@
         return classFab.createClass();
     }
 
-    private Class createInnerProxyClass(Class deferredProxyClass)
+    private Class createInnerProxyClass(Class configurationInterface, Class deferredProxyClass)
     {
-        Class configurationInterface = lookupContainerInterface();
-        
         ProxyBuilder builder = new ProxyBuilder("InnerProxy", this, configurationInterface, false);
 
         ClassFab classFab = builder.getClassFab();
 
         classFab.addField("_deferredProxy", deferredProxyClass);
         classFab.addField("_configuration", configurationInterface);
-        classFab.addField("_configurationPoint", this.getClass());
+        classFab.addField("_configurationPoint", ConfigurationPointImpl.class);
 
         BodyBuilder body = new BodyBuilder();
 
@@ -398,7 +421,7 @@
         body.end();
 
         classFab.addConstructor(new Class[]
-        { deferredProxyClass, getClass() }, null, body.toString());
+        { deferredProxyClass, ConfigurationPointImpl.class }, null, body.toString());
 
         // Method _configuration() will look up the service implementation,
         // then update the deferred proxy to go directly to the