Author: rfeng
Date: Wed Jan 21 15:42:10 2009
New Revision: 736488

URL: http://svn.apache.org/viewvc?rev=736488&view=rev
Log:
Set the TTCL to workaround the issue that stub lookup fail in OSGi

Added:
    
tuscany/java/sca/modules/binding-rmi-runtime/src/main/java/org/apache/tuscany/sca/binding/rmi/provider/RemoteInterfaceGenerator.java
   (with props)
Modified:
    
tuscany/java/sca/modules/binding-rmi-runtime/src/main/java/org/apache/tuscany/sca/binding/rmi/provider/RMIBindingInvoker.java
    
tuscany/java/sca/modules/binding-rmi-runtime/src/main/java/org/apache/tuscany/sca/binding/rmi/provider/RMIServiceBindingProvider.java

Modified: 
tuscany/java/sca/modules/binding-rmi-runtime/src/main/java/org/apache/tuscany/sca/binding/rmi/provider/RMIBindingInvoker.java
URL: 
http://svn.apache.org/viewvc/tuscany/java/sca/modules/binding-rmi-runtime/src/main/java/org/apache/tuscany/sca/binding/rmi/provider/RMIBindingInvoker.java?rev=736488&r1=736487&r2=736488&view=diff
==============================================================================
--- 
tuscany/java/sca/modules/binding-rmi-runtime/src/main/java/org/apache/tuscany/sca/binding/rmi/provider/RMIBindingInvoker.java
 (original)
+++ 
tuscany/java/sca/modules/binding-rmi-runtime/src/main/java/org/apache/tuscany/sca/binding/rmi/provider/RMIBindingInvoker.java
 Wed Jan 21 15:42:10 2009
@@ -21,11 +21,13 @@
 import java.lang.reflect.InvocationTargetException;
 import java.lang.reflect.Method;
 import java.rmi.Remote;
+import java.security.AccessController;
+import java.security.PrivilegedAction;
 
 import org.apache.tuscany.sca.host.rmi.RMIHost;
+import org.apache.tuscany.sca.invocation.DataExchangeSemantics;
 import org.apache.tuscany.sca.invocation.Invoker;
 import org.apache.tuscany.sca.invocation.Message;
-import org.apache.tuscany.sca.invocation.DataExchangeSemantics;
 
 /**
  * Invoker for RMI References.
@@ -51,7 +53,7 @@
             Object[] args = msg.getBody();
             Object resp = invokeTarget(args);
             msg.setBody(resp);
-    
+
         } catch (InvocationTargetException e) {
             msg.setFaultBody(e.getCause());
         } catch (Throwable e) {
@@ -61,9 +63,30 @@
         return msg;
     }
 
-    public Object invokeTarget(final Object payload) throws 
InvocationTargetException, SecurityException, NoSuchMethodException, 
IllegalArgumentException, IllegalAccessException {
+    public Object invokeTarget(final Object payload) throws 
InvocationTargetException, SecurityException,
+        NoSuchMethodException, IllegalArgumentException, 
IllegalAccessException {
         if (proxy == null) {
-            proxy = rmiHost.findService(uri);
+            final Class<?> remote = remoteMethod.getDeclaringClass();
+            final ClassLoader stubClassLoader = remote.getClassLoader();
+            // The generated remote interface is not available for the service 
lookup
+            final ClassLoader tccl = AccessController.doPrivileged(new 
PrivilegedAction<ClassLoader>() {
+                public ClassLoader run() {
+                    ClassLoader tccl = 
Thread.currentThread().getContextClassLoader();
+                    
Thread.currentThread().setContextClassLoader(stubClassLoader);
+                    return tccl;
+                }
+            });
+            try {
+                proxy = rmiHost.findService(uri);
+            } finally {
+                AccessController.doPrivileged(new 
PrivilegedAction<ClassLoader>() {
+                    public ClassLoader run() {
+                        ClassLoader current = 
Thread.currentThread().getContextClassLoader();
+                        Thread.currentThread().setContextClassLoader(tccl);
+                        return current;
+                    }
+                });
+            }
         }
 
         remoteMethod = proxy.getClass().getMethod(remoteMethod.getName(), 
remoteMethod.getParameterTypes());

Modified: 
tuscany/java/sca/modules/binding-rmi-runtime/src/main/java/org/apache/tuscany/sca/binding/rmi/provider/RMIServiceBindingProvider.java
URL: 
http://svn.apache.org/viewvc/tuscany/java/sca/modules/binding-rmi-runtime/src/main/java/org/apache/tuscany/sca/binding/rmi/provider/RMIServiceBindingProvider.java?rev=736488&r1=736487&r2=736488&view=diff
==============================================================================
--- 
tuscany/java/sca/modules/binding-rmi-runtime/src/main/java/org/apache/tuscany/sca/binding/rmi/provider/RMIServiceBindingProvider.java
 (original)
+++ 
tuscany/java/sca/modules/binding-rmi-runtime/src/main/java/org/apache/tuscany/sca/binding/rmi/provider/RMIServiceBindingProvider.java
 Wed Jan 21 15:42:10 2009
@@ -130,13 +130,9 @@
                 }
             }
         });
-        Class targetJavaInterface = getTargetJavaClass(serviceInterface);
-        if (!Remote.class.isAssignableFrom(targetJavaInterface)) {
-            RMIServiceClassLoader classloader = new 
RMIServiceClassLoader(targetJavaInterface.getClassLoader());
-            final byte[] byteCode = 
generateRemoteInterface(targetJavaInterface);
-            targetJavaInterface = 
classloader.defineClass(targetJavaInterface.getName(), byteCode);
-            enhancer.setClassLoader(classloader);
-        }
+        Class<?> targetJavaInterface = getTargetJavaClass(serviceInterface);
+        targetJavaInterface = 
RemoteInterfaceGenerator.generate(targetJavaInterface);
+        enhancer.setClassLoader(targetJavaInterface.getClassLoader());
         enhancer.setInterfaces(new Class[] {targetJavaInterface});
         return (Remote)enhancer.create();
     }
@@ -145,43 +141,6 @@
         return wire.invoke(op, args);
     }
 
-    /**
-     * if the interface of the component whose serviceBindings must be exposed 
as RMI Service, does not
-     * implement java.rmi.Remote, then generate such an interface. This method 
will stop with just 
-     * generating the bytecode. Defining the class from the byte code must be 
the responsibility of the 
-     * caller of this method, since it requires a ClassLoader to be created to 
define and load this interface.
-     */
-    private byte[] generateRemoteInterface(Class serviceInterface) {
-        String interfazeName = serviceInterface.getName();
-        ClassWriter cw = new ClassWriter(ClassWriter.COMPUTE_MAXS);
-
-        String simpleName = serviceInterface.getSimpleName();
-        cw.visit(Constants.V1_5, Constants.ACC_PUBLIC + Constants.ACC_ABSTRACT 
+ Constants.ACC_INTERFACE, interfazeName
-            .replace('.', '/'), null, "java/lang/Object", new String[] 
{"java/rmi/Remote"});
-
-        StringBuffer argsAndReturn = null;
-        Method[] methods = serviceInterface.getMethods();
-        for (Method method : methods) {
-            argsAndReturn = new StringBuffer("(");
-            Class[] paramTypes = method.getParameterTypes();
-            Class returnType = method.getReturnType();
-
-            for (Class paramType : paramTypes) {
-                argsAndReturn.append(Type.getType(paramType));
-            }
-            argsAndReturn.append(")");
-            argsAndReturn.append(Type.getType(returnType));
-
-            cw.visitMethod(Constants.ACC_PUBLIC + Constants.ACC_ABSTRACT,
-                           method.getName(),
-                           argsAndReturn.toString(),
-                           null,
-                           new String[] {"java/rmi/RemoteException"});
-        }
-        cw.visitEnd();
-        return cw.toByteArray();
-    }
-
     private Class<?> getTargetJavaClass(Interface targetInterface) {
         // TODO: right now assume that the target is always a Java
         // Implementation. Need to figure out
@@ -190,16 +149,6 @@
         return ((JavaInterface)targetInterface).getJavaClass();
     }
 
-    protected class RMIServiceClassLoader extends ClassLoader {
-        public RMIServiceClassLoader(ClassLoader parent) {
-            super(parent);
-        }
-
-        public Class defineClass(String name, byte[] byteArray) {
-            return defineClass(name, byteArray, 0, byteArray.length);
-        }
-    }
-
     public InterfaceContract getBindingInterfaceContract() {
         return service.getInterfaceContract();
     }

Added: 
tuscany/java/sca/modules/binding-rmi-runtime/src/main/java/org/apache/tuscany/sca/binding/rmi/provider/RemoteInterfaceGenerator.java
URL: 
http://svn.apache.org/viewvc/tuscany/java/sca/modules/binding-rmi-runtime/src/main/java/org/apache/tuscany/sca/binding/rmi/provider/RemoteInterfaceGenerator.java?rev=736488&view=auto
==============================================================================
--- 
tuscany/java/sca/modules/binding-rmi-runtime/src/main/java/org/apache/tuscany/sca/binding/rmi/provider/RemoteInterfaceGenerator.java
 (added)
+++ 
tuscany/java/sca/modules/binding-rmi-runtime/src/main/java/org/apache/tuscany/sca/binding/rmi/provider/RemoteInterfaceGenerator.java
 Wed Jan 21 15:42:10 2009
@@ -0,0 +1,101 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ * 
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.    
+ */
+
+package org.apache.tuscany.sca.binding.rmi.provider;
+
+import java.lang.reflect.Method;
+import java.rmi.Remote;
+import java.util.Collections;
+import java.util.Map;
+import java.util.WeakHashMap;
+
+import net.sf.cglib.asm.ClassWriter;
+import net.sf.cglib.asm.Type;
+import net.sf.cglib.core.Constants;
+
+/**
+ * 
+ */
+public class RemoteInterfaceGenerator {
+    private final static Map<Class<?>, Class<? extends Remote>> 
remoteInterfaces =
+        Collections.synchronizedMap(new WeakHashMap<Class<?>, Class<? extends 
Remote>>());
+
+    static class RemoteInterfaceClassLoader extends ClassLoader {
+        public RemoteInterfaceClassLoader(ClassLoader parent) {
+            super(parent);
+        }
+
+        public Class<?> defineClass(String name, byte[] byteArray) {
+            return defineClass(name, byteArray, 0, byteArray.length);
+        }
+    }
+
+    /**
+     * if the interface of the component whose serviceBindings must be exposed 
as RMI Service, does not
+     * implement java.rmi.Remote, then generate such an interface. This method 
will stop with just 
+     * generating the bytecode. Defining the class from the byte code must be 
the responsibility of the 
+     * caller of this method, since it requires a ClassLoader to be created to 
define and load this interface.
+     */
+    private static byte[] generateRemoteInterface(Class<?> serviceInterface) {
+        String interfazeName = serviceInterface.getName();
+        ClassWriter cw = new ClassWriter(ClassWriter.COMPUTE_MAXS);
+
+        cw.visit(Constants.V1_5, Constants.ACC_PUBLIC + Constants.ACC_ABSTRACT 
+ Constants.ACC_INTERFACE, interfazeName
+            .replace('.', '/'), null, "java/lang/Object", new String[] 
{"java/rmi/Remote"});
+
+        StringBuffer argsAndReturn = null;
+        Method[] methods = serviceInterface.getMethods();
+        for (Method method : methods) {
+            argsAndReturn = new StringBuffer("(");
+            Class<?>[] paramTypes = method.getParameterTypes();
+            Class<?> returnType = method.getReturnType();
+
+            for (Class<?> paramType : paramTypes) {
+                argsAndReturn.append(Type.getType(paramType));
+            }
+            argsAndReturn.append(")");
+            argsAndReturn.append(Type.getType(returnType));
+
+            cw.visitMethod(Constants.ACC_PUBLIC + Constants.ACC_ABSTRACT,
+                           method.getName(),
+                           argsAndReturn.toString(),
+                           null,
+                           new String[] {"java/rmi/RemoteException"});
+        }
+        cw.visitEnd();
+        return cw.toByteArray();
+    }
+
+    public static Class<? extends Remote> generate(Class<?> javaInterface) {
+        if (!Remote.class.isAssignableFrom(javaInterface)) {
+            Class<? extends Remote> remote = 
remoteInterfaces.get(javaInterface);
+            if (remote == null) {
+                RemoteInterfaceClassLoader classloader = new 
RemoteInterfaceClassLoader(javaInterface.getClassLoader());
+                final byte[] byteCode = generateRemoteInterface(javaInterface);
+                javaInterface = 
classloader.defineClass(javaInterface.getName(), byteCode);
+                remote = (Class<? extends Remote>)javaInterface;
+                remoteInterfaces.put(javaInterface, remote);
+            }
+            return remote;
+        } else {
+            return (Class<? extends Remote>)javaInterface;
+        }
+    }
+
+}

Propchange: 
tuscany/java/sca/modules/binding-rmi-runtime/src/main/java/org/apache/tuscany/sca/binding/rmi/provider/RemoteInterfaceGenerator.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: 
tuscany/java/sca/modules/binding-rmi-runtime/src/main/java/org/apache/tuscany/sca/binding/rmi/provider/RemoteInterfaceGenerator.java
------------------------------------------------------------------------------
    svn:keywords = Rev Date


Reply via email to