Author: rmannibucau
Date: Sat Jul  6 15:47:57 2013
New Revision: 1500299

URL: http://svn.apache.org/r1500299
Log:
TOMEE-992 making ejbdserializer#deserialize class aware

Added:
    
tomee/tomee/trunk/server/openejb-client/src/main/java/org/apache/openejb/client/serializer/SerializationWrapper.java
Modified:
    
tomee/tomee/trunk/server/openejb-client/src/main/java/org/apache/openejb/client/EJBObjectHandler.java
    
tomee/tomee/trunk/server/openejb-client/src/main/java/org/apache/openejb/client/EJBRequest.java
    
tomee/tomee/trunk/server/openejb-client/src/main/java/org/apache/openejb/client/serializer/EJBDSerializer.java
    
tomee/tomee/trunk/server/openejb-ejbd/src/main/java/org/apache/openejb/server/ejbd/EjbDaemon.java
    
tomee/tomee/trunk/server/openejb-ejbd/src/main/java/org/apache/openejb/server/ejbd/EjbRequestHandler.java
    
tomee/tomee/trunk/server/openejb-ejbd/src/test/java/org/apache/openejb/SerializerTest.java

Modified: 
tomee/tomee/trunk/server/openejb-client/src/main/java/org/apache/openejb/client/EJBObjectHandler.java
URL: 
http://svn.apache.org/viewvc/tomee/tomee/trunk/server/openejb-client/src/main/java/org/apache/openejb/client/EJBObjectHandler.java?rev=1500299&r1=1500298&r2=1500299&view=diff
==============================================================================
--- 
tomee/tomee/trunk/server/openejb-client/src/main/java/org/apache/openejb/client/EJBObjectHandler.java
 (original)
+++ 
tomee/tomee/trunk/server/openejb-client/src/main/java/org/apache/openejb/client/EJBObjectHandler.java
 Sat Jul  6 15:47:57 2013
@@ -17,11 +17,11 @@
 package org.apache.openejb.client;
 
 import org.apache.openejb.client.proxy.ProxyManager;
+import org.apache.openejb.client.serializer.SerializationWrapper;
 import org.apache.openejb.client.util.ClassLoaderUtil;
 
 import javax.ejb.EJBException;
 import javax.ejb.EJBObject;
-import java.io.Serializable;
 import java.lang.reflect.Method;
 import java.rmi.RemoteException;
 import java.util.ArrayList;
@@ -355,8 +355,10 @@ public abstract class EJBObjectHandler e
             case ResponseCodes.EJB_APP_EXCEPTION:
                 throw new ApplicationException((ThrowableArtifact) 
res.getResult());
             case ResponseCodes.EJB_OK:
-                if (client.getSerializer() != null) {
-                    return 
client.getSerializer().deserialize(Serializable.class.cast(res.getResult()));
+                final Object result = res.getResult();
+                if (client.getSerializer() != null && 
SerializationWrapper.class.isInstance(result)) {
+                    final SerializationWrapper wrapper = 
SerializationWrapper.class.cast(result);
+                    return 
client.getSerializer().deserialize(wrapper.getData(), 
Thread.currentThread().getContextClassLoader().loadClass(wrapper.getClassname()));
                 }
                 return res.getResult();
             default:

Modified: 
tomee/tomee/trunk/server/openejb-client/src/main/java/org/apache/openejb/client/EJBRequest.java
URL: 
http://svn.apache.org/viewvc/tomee/tomee/trunk/server/openejb-client/src/main/java/org/apache/openejb/client/EJBRequest.java?rev=1500299&r1=1500298&r2=1500299&view=diff
==============================================================================
--- 
tomee/tomee/trunk/server/openejb-client/src/main/java/org/apache/openejb/client/EJBRequest.java
 (original)
+++ 
tomee/tomee/trunk/server/openejb-client/src/main/java/org/apache/openejb/client/EJBRequest.java
 Sat Jul  6 15:47:57 2013
@@ -17,6 +17,7 @@
 package org.apache.openejb.client;
 
 import org.apache.openejb.client.serializer.EJBDSerializer;
+import org.apache.openejb.client.serializer.SerializationWrapper;
 import org.omg.CORBA.ORB;
 
 import javax.naming.Context;
@@ -27,7 +28,6 @@ import javax.rmi.PortableRemoteObject;
 import java.io.IOException;
 import java.io.ObjectInput;
 import java.io.ObjectOutput;
-import java.io.Serializable;
 import java.lang.reflect.Method;
 import java.rmi.Remote;
 import java.util.Arrays;
@@ -93,7 +93,17 @@ public class EJBRequest implements Clust
         final Object[] unserialized = new Object[params.length];
         int i = 0;
         for (final Object o : params) {
-            unserialized[i++] = 
serializer.deserialize(Serializable.class.cast(o));
+            if (SerializationWrapper.class.isInstance(o)) {
+                final SerializationWrapper wrapper = 
SerializationWrapper.class.cast(o);
+                try {
+                    unserialized[i] = 
serializer.deserialize(wrapper.getData(), 
body.getMethodInstance().getDeclaringClass().getClassLoader().loadClass(wrapper.getClassname()));
+                } catch (final ClassNotFoundException e) {
+                    throw new RuntimeException(e);
+                }
+            } else {
+                unserialized[i] = o;
+            }
+            i++;
         }
         return unserialized;
     }
@@ -117,7 +127,12 @@ public class EJBRequest implements Clust
             final Object[] params = new Object[methodParameters.length];
             int i = 0;
             for (final Object o : methodParameters) {
-                params[i++] = serializer.serialize(o);
+                if (o == null) {
+                    params[i] = null;
+                } else {
+                    params[i] = new 
SerializationWrapper(serializer.serialize(o), o.getClass().getName());
+                }
+                i++;
             }
             body.setMethodParameters(params);
         }

Modified: 
tomee/tomee/trunk/server/openejb-client/src/main/java/org/apache/openejb/client/serializer/EJBDSerializer.java
URL: 
http://svn.apache.org/viewvc/tomee/tomee/trunk/server/openejb-client/src/main/java/org/apache/openejb/client/serializer/EJBDSerializer.java?rev=1500299&r1=1500298&r2=1500299&view=diff
==============================================================================
--- 
tomee/tomee/trunk/server/openejb-client/src/main/java/org/apache/openejb/client/serializer/EJBDSerializer.java
 (original)
+++ 
tomee/tomee/trunk/server/openejb-client/src/main/java/org/apache/openejb/client/serializer/EJBDSerializer.java
 Sat Jul  6 15:47:57 2013
@@ -20,5 +20,5 @@ import java.io.Serializable;
 
 public interface EJBDSerializer {
     Serializable serialize(Object o);
-    Object deserialize(Serializable o);
+    Object deserialize(Serializable o, Class<?> clazz);
 }

Added: 
tomee/tomee/trunk/server/openejb-client/src/main/java/org/apache/openejb/client/serializer/SerializationWrapper.java
URL: 
http://svn.apache.org/viewvc/tomee/tomee/trunk/server/openejb-client/src/main/java/org/apache/openejb/client/serializer/SerializationWrapper.java?rev=1500299&view=auto
==============================================================================
--- 
tomee/tomee/trunk/server/openejb-client/src/main/java/org/apache/openejb/client/serializer/SerializationWrapper.java
 (added)
+++ 
tomee/tomee/trunk/server/openejb-client/src/main/java/org/apache/openejb/client/serializer/SerializationWrapper.java
 Sat Jul  6 15:47:57 2013
@@ -0,0 +1,45 @@
+/**
+ * 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.openejb.client.serializer;
+
+import java.io.Serializable;
+
+public class SerializationWrapper implements Serializable {
+    private String classname;
+    private Serializable data;
+
+    public SerializationWrapper(final Serializable serialize, final String 
name) {
+        data = serialize;
+        classname = name;
+    }
+
+    public String getClassname() {
+        return classname;
+    }
+
+    public void setClassname(final String classname) {
+        this.classname = classname;
+    }
+
+    public Serializable getData() {
+        return data;
+    }
+
+    public void setData(final Serializable data) {
+        this.data = data;
+    }
+}

Modified: 
tomee/tomee/trunk/server/openejb-ejbd/src/main/java/org/apache/openejb/server/ejbd/EjbDaemon.java
URL: 
http://svn.apache.org/viewvc/tomee/tomee/trunk/server/openejb-ejbd/src/main/java/org/apache/openejb/server/ejbd/EjbDaemon.java?rev=1500299&r1=1500298&r2=1500299&view=diff
==============================================================================
--- 
tomee/tomee/trunk/server/openejb-ejbd/src/main/java/org/apache/openejb/server/ejbd/EjbDaemon.java
 (original)
+++ 
tomee/tomee/trunk/server/openejb-ejbd/src/main/java/org/apache/openejb/server/ejbd/EjbDaemon.java
 Sat Jul  6 15:47:57 2013
@@ -17,6 +17,7 @@
 package org.apache.openejb.server.ejbd;
 
 import org.apache.openejb.BeanContext;
+import org.apache.openejb.OpenEJBRuntimeException;
 import org.apache.openejb.ProxyInfo;
 import org.apache.openejb.client.EJBRequest;
 import org.apache.openejb.client.EjbObjectInputStream;
@@ -41,6 +42,7 @@ import java.io.InputStream;
 import java.io.ObjectInputStream;
 import java.io.ObjectOutputStream;
 import java.io.OutputStream;
+import java.io.Serializable;
 import java.net.Socket;
 import java.rmi.RemoteException;
 import java.util.Properties;
@@ -89,7 +91,13 @@ public class EjbDaemon implements org.ap
 
         final String serializer = props.getProperty("serializer", null);
         if (serializer != null) {
-            this.serializer = 
EJBDSerializer.class.cast(Thread.currentThread().getContextClassLoader().loadClass(serializer).newInstance());
+            try {
+                this.serializer = 
EJBDSerializer.class.cast(Thread.currentThread().getContextClassLoader().loadClass(serializer).newInstance());
+            } catch (final ClassNotFoundException cnfe) { // let's try later 
with app classloader
+                this.serializer = new ContextualSerializer(serializer);
+            } catch (final NoClassDefFoundError cnfe) { // let's try later 
with app classloader
+                this.serializer = new ContextualSerializer(serializer);
+            }
         } else {
             this.serializer = null;
         }
@@ -336,5 +344,31 @@ public class EjbDaemon implements org.ap
     public EJBDSerializer getSerializer() {
         return serializer;
     }
+
+    private static class ContextualSerializer implements EJBDSerializer {
+        private final String classname;
+
+        public ContextualSerializer(final String serializer) {
+            this.classname = serializer;
+        }
+
+        @Override
+        public Serializable serialize(Object o) {
+            return instance().serialize(o);
+        }
+
+        @Override
+        public Object deserialize(final Serializable o, final Class<?> clazz) {
+            return instance().deserialize(o, clazz);
+        }
+
+        private EJBDSerializer instance() {
+            try {
+                return 
EJBDSerializer.class.cast(Thread.currentThread().getContextClassLoader().loadClass(classname));
+            } catch (final ClassNotFoundException e) {
+                throw new OpenEJBRuntimeException(e);
+            }
+        }
+    }
 }
 

Modified: 
tomee/tomee/trunk/server/openejb-ejbd/src/main/java/org/apache/openejb/server/ejbd/EjbRequestHandler.java
URL: 
http://svn.apache.org/viewvc/tomee/tomee/trunk/server/openejb-ejbd/src/main/java/org/apache/openejb/server/ejbd/EjbRequestHandler.java?rev=1500299&r1=1500298&r2=1500299&view=diff
==============================================================================
--- 
tomee/tomee/trunk/server/openejb-ejbd/src/main/java/org/apache/openejb/server/ejbd/EjbRequestHandler.java
 (original)
+++ 
tomee/tomee/trunk/server/openejb-ejbd/src/main/java/org/apache/openejb/server/ejbd/EjbRequestHandler.java
 Sat Jul  6 15:47:57 2013
@@ -27,6 +27,7 @@ import org.apache.openejb.client.EJBResp
 import org.apache.openejb.client.ResponseCodes;
 import org.apache.openejb.client.ThrowableArtifact;
 import org.apache.openejb.client.serializer.EJBDSerializer;
+import org.apache.openejb.client.serializer.SerializationWrapper;
 import org.apache.openejb.core.ThreadContext;
 import org.apache.openejb.loader.SystemInstance;
 import org.apache.openejb.spi.SecurityService;
@@ -332,8 +333,8 @@ class EjbRequestHandler {
             }
 
             final Object realResult;
-            if (serializer != null) {
-                realResult = serializer.serialize(result);
+            if (serializer != null && result != null) {
+                realResult = new 
SerializationWrapper(serializer.serialize(result), result.getClass().getName());
             } else {
                 realResult = result;
             }

Modified: 
tomee/tomee/trunk/server/openejb-ejbd/src/test/java/org/apache/openejb/SerializerTest.java
URL: 
http://svn.apache.org/viewvc/tomee/tomee/trunk/server/openejb-ejbd/src/test/java/org/apache/openejb/SerializerTest.java?rev=1500299&r1=1500298&r2=1500299&view=diff
==============================================================================
--- 
tomee/tomee/trunk/server/openejb-ejbd/src/test/java/org/apache/openejb/SerializerTest.java
 (original)
+++ 
tomee/tomee/trunk/server/openejb-ejbd/src/test/java/org/apache/openejb/SerializerTest.java
 Sat Jul  6 15:47:57 2013
@@ -135,18 +135,18 @@ public class SerializerTest {
         @Override
         public Serializable serialize(final Object o) {
             if (InputNotSerilizable.class.isInstance(o)) {
-                return "i" + InputNotSerilizable.class.cast(o).rename;
+                return InputNotSerilizable.class.cast(o).rename;
             }
-            return "o" + OutputNotSerializable.class.cast(o).name;
+            return OutputNotSerializable.class.cast(o).name;
         }
 
         @Override
-        public Object deserialize(final Serializable o) {
+        public Object deserialize(final Serializable o, final Class<?> clazz) {
             final String cast = String.class.cast(o);
-            if (cast.startsWith("i")) {
-                return new InputNotSerilizable(cast.substring(1));
+            if (InputNotSerilizable.class.equals(clazz)) {
+                return new InputNotSerilizable(cast);
             }
-            return new OutputNotSerializable(cast.substring(1));
+            return new OutputNotSerializable(cast);
         }
     }
 }


Reply via email to