You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tuscany.apache.org by rf...@apache.org on 2009/09/18 18:43:41 UTC

svn commit: r816712 - in /tuscany/java/sca/modules: common-java/src/main/java/org/apache/tuscany/sca/common/java/collection/ core/META-INF/ core/src/main/java/org/apache/tuscany/sca/core/invocation/ core/src/main/java/org/apache/tuscany/sca/core/invoca...

Author: rfeng
Date: Fri Sep 18 16:43:41 2009
New Revision: 816712

URL: http://svn.apache.org/viewvc?rev=816712&view=rev
Log:
Remove the need of subclassing Proxy and JXM so that Tuscany can run on Google App Engine

Removed:
    tuscany/java/sca/modules/core/src/main/java/org/apache/tuscany/sca/core/invocation/CachedProxy.java
Modified:
    tuscany/java/sca/modules/common-java/src/main/java/org/apache/tuscany/sca/common/java/collection/LRUCache.java
    tuscany/java/sca/modules/core/META-INF/MANIFEST.MF
    tuscany/java/sca/modules/core/src/main/java/org/apache/tuscany/sca/core/invocation/DefaultProxyFactoryExtensionPoint.java
    tuscany/java/sca/modules/core/src/main/java/org/apache/tuscany/sca/core/invocation/impl/JDKProxyFactory.java
    tuscany/java/sca/modules/node-impl/src/main/java/org/apache/tuscany/sca/node/impl/NodeImpl.java

Modified: tuscany/java/sca/modules/common-java/src/main/java/org/apache/tuscany/sca/common/java/collection/LRUCache.java
URL: http://svn.apache.org/viewvc/tuscany/java/sca/modules/common-java/src/main/java/org/apache/tuscany/sca/common/java/collection/LRUCache.java?rev=816712&r1=816711&r2=816712&view=diff
==============================================================================
--- tuscany/java/sca/modules/common-java/src/main/java/org/apache/tuscany/sca/common/java/collection/LRUCache.java (original)
+++ tuscany/java/sca/modules/common-java/src/main/java/org/apache/tuscany/sca/common/java/collection/LRUCache.java Fri Sep 18 16:43:41 2009
@@ -34,7 +34,7 @@
     protected int maxCacheSize = 4096;
 
     /**
-     * Default constructor for an LRU Cache The default capacity is 10000
+     * Default constructor for an LRU Cache The default capacity is 4096
      */
     public LRUCache() {
         this(0, 4096, 0.75f, true);

Modified: tuscany/java/sca/modules/core/META-INF/MANIFEST.MF
URL: http://svn.apache.org/viewvc/tuscany/java/sca/modules/core/META-INF/MANIFEST.MF?rev=816712&r1=816711&r2=816712&view=diff
==============================================================================
--- tuscany/java/sca/modules/core/META-INF/MANIFEST.MF (original)
+++ tuscany/java/sca/modules/core/META-INF/MANIFEST.MF Fri Sep 18 16:43:41 2009
@@ -52,6 +52,7 @@
  org.apache.tuscany.sca.assembly;version="2.0.0",
  org.apache.tuscany.sca.assembly.builder;version="2.0.0",
  org.apache.tuscany.sca.assembly.impl;version="2.0.0",
+ org.apache.tuscany.sca.common.java.collection;version="2.0.0",
  org.apache.tuscany.sca.context;version="2.0.0",
  org.apache.tuscany.sca.contribution.processor;version="2.0.0",
  org.apache.tuscany.sca.contribution.resolver;version="2.0.0",

Modified: tuscany/java/sca/modules/core/src/main/java/org/apache/tuscany/sca/core/invocation/DefaultProxyFactoryExtensionPoint.java
URL: http://svn.apache.org/viewvc/tuscany/java/sca/modules/core/src/main/java/org/apache/tuscany/sca/core/invocation/DefaultProxyFactoryExtensionPoint.java?rev=816712&r1=816711&r2=816712&view=diff
==============================================================================
--- tuscany/java/sca/modules/core/src/main/java/org/apache/tuscany/sca/core/invocation/DefaultProxyFactoryExtensionPoint.java (original)
+++ tuscany/java/sca/modules/core/src/main/java/org/apache/tuscany/sca/core/invocation/DefaultProxyFactoryExtensionPoint.java Fri Sep 18 16:43:41 2009
@@ -21,6 +21,7 @@
 
 import org.apache.tuscany.sca.core.ExtensionPointRegistry;
 import org.apache.tuscany.sca.core.FactoryExtensionPoint;
+import org.apache.tuscany.sca.core.LifeCycleListener;
 import org.apache.tuscany.sca.core.UtilityExtensionPoint;
 import org.apache.tuscany.sca.core.invocation.impl.JDKProxyFactory;
 import org.apache.tuscany.sca.interfacedef.InterfaceContractMapper;
@@ -31,7 +32,7 @@
  *
  * @version $Rev$ $Date$
  */
-public class DefaultProxyFactoryExtensionPoint implements ProxyFactoryExtensionPoint {
+public class DefaultProxyFactoryExtensionPoint implements ProxyFactoryExtensionPoint, LifeCycleListener {
     private InterfaceContractMapper interfaceContractMapper;
     private MessageFactory messageFactory;
 
@@ -41,10 +42,10 @@
     public DefaultProxyFactoryExtensionPoint(ExtensionPointRegistry extensionPoints) {
         UtilityExtensionPoint utilities = extensionPoints.getExtensionPoint(UtilityExtensionPoint.class);
         this.interfaceContractMapper = utilities.getUtility(InterfaceContractMapper.class);
-        
+
         FactoryExtensionPoint modelFactories = extensionPoints.getExtensionPoint(FactoryExtensionPoint.class);
         this.messageFactory = modelFactories.getFactory(MessageFactory.class);
-        
+
         interfaceFactory = new JDKProxyFactory(messageFactory, interfaceContractMapper);
     }
 
@@ -72,4 +73,23 @@
 
     }
 
+    public void start() {
+        if (interfaceFactory instanceof LifeCycleListener) {
+            ((LifeCycleListener)interfaceFactory).start();
+        }
+        if (classFactory instanceof LifeCycleListener) {
+            ((LifeCycleListener)classFactory).start();
+        }
+    }
+
+    public void stop() {
+        if (interfaceFactory instanceof LifeCycleListener) {
+            ((LifeCycleListener)interfaceFactory).stop();
+        }
+        if (classFactory instanceof LifeCycleListener) {
+            ((LifeCycleListener)classFactory).stop();
+        }
+
+    }
+
 }

Modified: tuscany/java/sca/modules/core/src/main/java/org/apache/tuscany/sca/core/invocation/impl/JDKProxyFactory.java
URL: http://svn.apache.org/viewvc/tuscany/java/sca/modules/core/src/main/java/org/apache/tuscany/sca/core/invocation/impl/JDKProxyFactory.java?rev=816712&r1=816711&r2=816712&view=diff
==============================================================================
--- tuscany/java/sca/modules/core/src/main/java/org/apache/tuscany/sca/core/invocation/impl/JDKProxyFactory.java (original)
+++ tuscany/java/sca/modules/core/src/main/java/org/apache/tuscany/sca/core/invocation/impl/JDKProxyFactory.java Fri Sep 18 16:43:41 2009
@@ -18,15 +18,17 @@
  */
 package org.apache.tuscany.sca.core.invocation.impl;
 
+import java.lang.reflect.Constructor;
 import java.lang.reflect.InvocationHandler;
+import java.lang.reflect.Proxy;
 import java.security.AccessController;
 import java.security.PrivilegedAction;
 import java.util.List;
 
-import org.apache.tuscany.sca.core.context.impl.CallableReferenceImpl;
+import org.apache.tuscany.sca.common.java.collection.LRUCache;
+import org.apache.tuscany.sca.core.LifeCycleListener;
 import org.apache.tuscany.sca.core.context.impl.CallbackServiceReferenceImpl;
 import org.apache.tuscany.sca.core.context.impl.ServiceReferenceImpl;
-import org.apache.tuscany.sca.core.invocation.CachedProxy;
 import org.apache.tuscany.sca.core.invocation.ProxyCreationException;
 import org.apache.tuscany.sca.core.invocation.ProxyFactory;
 import org.apache.tuscany.sca.interfacedef.InterfaceContractMapper;
@@ -34,12 +36,13 @@
 import org.apache.tuscany.sca.runtime.RuntimeWire;
 import org.oasisopen.sca.ServiceReference;
 
+
 /**
  * the default implementation of a wire service that uses JDK dynamic proxies
  * 
  * @version $Rev$ $Date$
  */
-public class JDKProxyFactory implements ProxyFactory {
+public class JDKProxyFactory implements ProxyFactory, LifeCycleListener {
     protected InterfaceContractMapper contractMapper;
     private MessageFactory messageFactory;
 
@@ -67,7 +70,7 @@
                return interfaze.getClassLoader();
             }
         });
-        Object proxy = CachedProxy.newProxyInstance(cl, new Class[] {interfaze}, handler);
+        Object proxy = newProxyInstance(cl, new Class[] {interfaze}, handler);
         ((ServiceReferenceImpl)callableReference).setProxy(proxy);
         return interfaze.cast(proxy);
     }
@@ -82,13 +85,13 @@
         Class<T> interfaze = callbackReference.getBusinessInterface();
         InvocationHandler handler = new JDKCallbackInvocationHandler(messageFactory, callbackReference);
         ClassLoader cl = interfaze.getClassLoader();
-		Object proxy = CachedProxy.newProxyInstance(cl, new Class[] {interfaze}, handler);
-		callbackReference.setProxy(proxy);
+        Object proxy = newProxyInstance(cl, new Class[] {interfaze}, handler);
+        callbackReference.setProxy(proxy);
         return interfaze.cast(proxy);
     }
 
     public <B, R extends ServiceReference<B>> R cast(B target) throws IllegalArgumentException {
-        InvocationHandler handler = CachedProxy.getInvocationHandler(target);
+        InvocationHandler handler = Proxy.getInvocationHandler(target);
         if (handler instanceof JDKInvocationHandler) {
             return (R)((JDKInvocationHandler)handler).getCallableReference();
         } else {
@@ -100,6 +103,47 @@
      * @see org.apache.tuscany.sca.core.invocation.ProxyFactory#isProxyClass(java.lang.Class)
      */
     public boolean isProxyClass(Class<?> clazz) {
-        return CachedProxy.isProxyClass(clazz);
+        return Proxy.isProxyClass(clazz);
+    }
+    
+    // This is a cache containing the proxy class constructor for each business interface.
+    // This improves performance compared to calling Proxy.newProxyInstance()
+    // every time that a proxy is needed.
+    private final LRUCache<Class<?>, Constructor<?>> cache = new LRUCache<Class<?>, Constructor<?>>(512);
+
+    public Object newProxyInstance(ClassLoader classloader,
+                                          Class<?> interfaces[],
+                                          InvocationHandler invocationhandler) throws IllegalArgumentException {
+        if (interfaces.length > 1) {
+            // We only cache the proxy constructors with one single interface which the case in SCA where
+            // one reference can have one interface
+            return Proxy.newProxyInstance(classloader, interfaces, invocationhandler);
+        }
+        try {
+            if (invocationhandler == null)
+                throw new NullPointerException("InvocationHandler is null");
+            // Lookup cached constructor.  aclass[0] is the reference's business interface.
+            Constructor<?> proxyCTOR;
+            synchronized (cache) {
+                proxyCTOR = cache.get(interfaces[0]);
+            }
+            if (proxyCTOR == null) {
+                Class<?> proxyClass = Proxy.getProxyClass(classloader, interfaces);
+                proxyCTOR = proxyClass.getConstructor(InvocationHandler.class);
+                synchronized (cache) {
+                    cache.put(interfaces[0], proxyCTOR);
+                }
+            }
+            return proxyCTOR.newInstance(invocationhandler);
+        } catch (Throwable e) {
+            throw new IllegalArgumentException(e);
+        }
     }
+
+    public void start() {
+    }
+
+    public void stop() {
+       cache.clear(); 
+    }    
 }

Modified: tuscany/java/sca/modules/node-impl/src/main/java/org/apache/tuscany/sca/node/impl/NodeImpl.java
URL: http://svn.apache.org/viewvc/tuscany/java/sca/modules/node-impl/src/main/java/org/apache/tuscany/sca/node/impl/NodeImpl.java?rev=816712&r1=816711&r2=816712&view=diff
==============================================================================
--- tuscany/java/sca/modules/node-impl/src/main/java/org/apache/tuscany/sca/node/impl/NodeImpl.java (original)
+++ tuscany/java/sca/modules/node-impl/src/main/java/org/apache/tuscany/sca/node/impl/NodeImpl.java Fri Sep 18 16:43:41 2009
@@ -119,8 +119,10 @@
 
             NodeFinder.addNode(IOHelper.createURI(configuration.getDomainURI()), this);
 
-            MBeanServer mBeanServer = ManagementFactory.getPlatformMBeanServer();
+            // FIXME: [rfeng] We should turn the management capability into a system utility.
+            // In certain environment such as Google App Engine, the JMX API is not allowed
             try {
+                MBeanServer mBeanServer = ManagementFactory.getPlatformMBeanServer();
                 mbean = new NodeManager(this);
                 mBeanServer.registerMBean(mbean, mbean.getName());
                 /*
@@ -130,7 +132,8 @@
                 JMXConnectorServer connectorServer = JMXConnectorServerFactory.newJMXConnectorServer(url, null, mBeanServer);
                 connectorServer.start();
                 */
-            } catch (Exception e) {
+            } catch (Throwable e) {
+                // Ignore the error for now
                 mbean = null;
                 logger.log(Level.SEVERE, e.getMessage(), e);
             }
@@ -152,10 +155,10 @@
             }
 
             if (mbean != null) {
-                MBeanServer mBeanServer = ManagementFactory.getPlatformMBeanServer();
                 try {
+                    MBeanServer mBeanServer = ManagementFactory.getPlatformMBeanServer();
                     mBeanServer.unregisterMBean(mbean.getName());
-                } catch (Exception e) {
+                } catch (Throwable e) {
                     logger.log(Level.SEVERE, e.getMessage(), e);
                 } finally {
                     mbean = null;