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;