You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tuscany.apache.org by bd...@apache.org on 2009/09/16 19:15:42 UTC

svn commit: r815893 - /tuscany/branches/sca-java-1.5.1/modules/core/src/main/java/org/apache/tuscany/sca/core/invocation/CglibProxyFactory.java

Author: bdaniel
Date: Wed Sep 16 17:15:41 2009
New Revision: 815893

URL: http://svn.apache.org/viewvc?rev=815893&view=rev
Log:
TUSCANY-3278 Create a classloader with access to both cglib and application classes for use by the cglib enhancer

Modified:
    tuscany/branches/sca-java-1.5.1/modules/core/src/main/java/org/apache/tuscany/sca/core/invocation/CglibProxyFactory.java

Modified: tuscany/branches/sca-java-1.5.1/modules/core/src/main/java/org/apache/tuscany/sca/core/invocation/CglibProxyFactory.java
URL: http://svn.apache.org/viewvc/tuscany/branches/sca-java-1.5.1/modules/core/src/main/java/org/apache/tuscany/sca/core/invocation/CglibProxyFactory.java?rev=815893&r1=815892&r2=815893&view=diff
==============================================================================
--- tuscany/branches/sca-java-1.5.1/modules/core/src/main/java/org/apache/tuscany/sca/core/invocation/CglibProxyFactory.java (original)
+++ tuscany/branches/sca-java-1.5.1/modules/core/src/main/java/org/apache/tuscany/sca/core/invocation/CglibProxyFactory.java Wed Sep 16 17:15:41 2009
@@ -56,6 +56,25 @@
         return createProxy(serviceReference);
     }
 
+    private class CglibClassLoader extends ClassLoader {
+    	private ClassLoader appLoader;
+    	private ClassLoader bundleLoader;
+    	
+    	@Override
+		public Class<?> loadClass(String className)
+				throws ClassNotFoundException {
+			try { 
+				return appLoader.loadClass(className);
+			} catch (ClassNotFoundException ex ) {
+				return bundleLoader.loadClass(className);
+			}
+		}
+
+		CglibClassLoader(ClassLoader app, ClassLoader bundle) {
+    		this.appLoader = app;
+    		this.bundleLoader = bundle;
+    	}
+    }
     /**
      * create the proxy with cglib. use the same JDKInvocationHandler as
      * JDKProxyService.
@@ -63,6 +82,8 @@
     public <T> T createProxy(CallableReference<T> callableReference) throws ProxyCreationException {
         Enhancer enhancer = new Enhancer();
         Class<T> interfaze = callableReference.getBusinessInterface();
+        ClassLoader cl = new CglibClassLoader(interfaze.getClassLoader(), getClass().getClassLoader());       
+        enhancer.setClassLoader(cl);
         enhancer.setSuperclass(interfaze);
         enhancer.setCallback(new CglibMethodInterceptor<T>(callableReference));
         Object proxy = enhancer.create();