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);
}
}
}