Author: rmannibucau
Date: Fri Jul  5 15:24:31 2013
New Revision: 1500039

URL: http://svn.apache.org/r1500039
Log:
TOMEE-992 adding serializer option for ejbd protocol to be able to use it even 
for not serializable objects (parameters and result)

Added:
    
tomee/tomee/trunk/server/openejb-client/src/main/java/org/apache/openejb/client/serializer/
    
tomee/tomee/trunk/server/openejb-client/src/main/java/org/apache/openejb/client/serializer/EJBDSerializer.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/ClientMetaData.java
    
tomee/tomee/trunk/server/openejb-client/src/main/java/org/apache/openejb/client/EJBHomeHandler.java
    
tomee/tomee/trunk/server/openejb-client/src/main/java/org/apache/openejb/client/EJBMetaDataImpl.java
    
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/EntityEJBHomeHandler.java
    
tomee/tomee/trunk/server/openejb-client/src/main/java/org/apache/openejb/client/EntityEJBObjectHandler.java
    
tomee/tomee/trunk/server/openejb-client/src/main/java/org/apache/openejb/client/JNDIContext.java
    
tomee/tomee/trunk/server/openejb-client/src/main/java/org/apache/openejb/client/StatefulEJBHomeHandler.java
    
tomee/tomee/trunk/server/openejb-client/src/main/java/org/apache/openejb/client/StatefulEJBObjectHandler.java
    
tomee/tomee/trunk/server/openejb-client/src/test/java/org/apache/openejb/client/EJBRequestTest.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/server/ejbd/DeploymentIndexTest.java
    
tomee/tomee/trunk/server/openejb-ejbd/src/test/java/org/apache/openejb/server/ejbd/ZEjbdTest.java

Modified: 
tomee/tomee/trunk/server/openejb-client/src/main/java/org/apache/openejb/client/ClientMetaData.java
URL: 
http://svn.apache.org/viewvc/tomee/tomee/trunk/server/openejb-client/src/main/java/org/apache/openejb/client/ClientMetaData.java?rev=1500039&r1=1500038&r2=1500039&view=diff
==============================================================================
--- 
tomee/tomee/trunk/server/openejb-client/src/main/java/org/apache/openejb/client/ClientMetaData.java
 (original)
+++ 
tomee/tomee/trunk/server/openejb-client/src/main/java/org/apache/openejb/client/ClientMetaData.java
 Fri Jul  5 15:24:31 2013
@@ -16,6 +16,8 @@
  */
 package org.apache.openejb.client;
 
+import org.apache.openejb.client.serializer.EJBDSerializer;
+
 import java.io.Externalizable;
 import java.io.IOException;
 import java.io.ObjectInput;
@@ -24,6 +26,7 @@ import java.io.ObjectOutput;
 public class ClientMetaData implements Externalizable {
 
     transient Object clientIdentity;
+    private transient EJBDSerializer serializer;
 
     public ClientMetaData() {
     }
@@ -40,10 +43,25 @@ public class ClientMetaData implements E
         this.clientIdentity = clientIdentity;
     }
 
+    public EJBDSerializer getSerializer() {
+        return serializer;
+    }
+
+    public void setSerializer(final EJBDSerializer serializer) {
+        this.serializer = serializer;
+    }
+
     public void readExternal(ObjectInput in) throws IOException, 
ClassNotFoundException {
         byte version = in.readByte(); // future use
 
         this.clientIdentity = in.readObject();
+        if (in.readBoolean()) {
+            try {
+                serializer = 
EJBDSerializer.class.cast(Thread.currentThread().getContextClassLoader().loadClass(in.readUTF()).newInstance());
+            } catch (final Exception e) {
+                // no-op
+            }
+        }
     }
 
     public void writeExternal(ObjectOutput out) throws IOException {
@@ -51,5 +69,9 @@ public class ClientMetaData implements E
         out.writeByte(1);
 
         out.writeObject(clientIdentity);
+        out.writeBoolean(serializer != null);
+        if (serializer != null) {
+            out.writeUTF(serializer.getClass().getName());
+        }
     }
 }

Modified: 
tomee/tomee/trunk/server/openejb-client/src/main/java/org/apache/openejb/client/EJBHomeHandler.java
URL: 
http://svn.apache.org/viewvc/tomee/tomee/trunk/server/openejb-client/src/main/java/org/apache/openejb/client/EJBHomeHandler.java?rev=1500039&r1=1500038&r2=1500039&view=diff
==============================================================================
--- 
tomee/tomee/trunk/server/openejb-client/src/main/java/org/apache/openejb/client/EJBHomeHandler.java
 (original)
+++ 
tomee/tomee/trunk/server/openejb-client/src/main/java/org/apache/openejb/client/EJBHomeHandler.java
 Fri Jul  5 15:24:31 2013
@@ -177,7 +177,7 @@ public abstract class EJBHomeHandler ext
     }
 
     public Object homeMethod(final Method method, final Object[] args, final 
Object proxy) throws Throwable {
-        final EJBRequest req = new 
EJBRequest(RequestMethodCode.EJB_HOME_METHOD, ejb, method, args, null);
+        final EJBRequest req = new 
EJBRequest(RequestMethodCode.EJB_HOME_METHOD, ejb, method, args, null, 
client.getSerializer());
 
         final EJBResponse res = request(req);
 
@@ -201,7 +201,7 @@ public abstract class EJBHomeHandler ext
     /*-------------------------------------------------*/
 
     protected Object create(final Method method, final Object[] args, final 
Object proxy) throws Throwable {
-        final EJBRequest req = new 
EJBRequest(RequestMethodCode.EJB_HOME_CREATE, ejb, method, args, null);
+        final EJBRequest req = new 
EJBRequest(RequestMethodCode.EJB_HOME_CREATE, ejb, method, args, null, 
client.getSerializer());
 
         final EJBResponse res = request(req);
 

Modified: 
tomee/tomee/trunk/server/openejb-client/src/main/java/org/apache/openejb/client/EJBMetaDataImpl.java
URL: 
http://svn.apache.org/viewvc/tomee/tomee/trunk/server/openejb-client/src/main/java/org/apache/openejb/client/EJBMetaDataImpl.java?rev=1500039&r1=1500038&r2=1500039&view=diff
==============================================================================
--- 
tomee/tomee/trunk/server/openejb-client/src/main/java/org/apache/openejb/client/EJBMetaDataImpl.java
 (original)
+++ 
tomee/tomee/trunk/server/openejb-client/src/main/java/org/apache/openejb/client/EJBMetaDataImpl.java
 Fri Jul  5 15:24:31 2013
@@ -16,6 +16,7 @@
  */
 package org.apache.openejb.client;
 
+import javax.ejb.EJBHome;
 import java.io.ByteArrayInputStream;
 import java.io.ByteArrayOutputStream;
 import java.io.IOException;
@@ -29,8 +30,6 @@ import java.util.Map;
 import java.util.Properties;
 import java.util.Set;
 
-import javax.ejb.EJBHome;
-
 public class EJBMetaDataImpl implements javax.ejb.EJBMetaData, 
java.io.Externalizable {
        private static final long serialVersionUID = -858340852654709679L;
 

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=1500039&r1=1500038&r2=1500039&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
 Fri Jul  5 15:24:31 2013
@@ -21,6 +21,7 @@ import org.apache.openejb.client.util.Cl
 
 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;
@@ -328,7 +329,7 @@ public abstract class EJBObjectHandler e
     }
 
     private Object _businessMethod(final Method method, final Object[] args, 
final Object proxy, final String requestId) throws Throwable {
-        final EJBRequest req = new 
EJBRequest(RequestMethodCode.EJB_OBJECT_BUSINESS_METHOD, ejb, method, args, 
primaryKey);
+        final EJBRequest req = new 
EJBRequest(RequestMethodCode.EJB_OBJECT_BUSINESS_METHOD, ejb, method, args, 
primaryKey, client.getSerializer());
 
         //Currently, we only set the requestId while the asynchronous 
invocation is called
         req.getBody().setRequestId(requestId);
@@ -337,7 +338,7 @@ public abstract class EJBObjectHandler e
     }
 
     private Object _businessMethod(final Method method, final Object[] args, 
final Object proxy, final String requestId, final EJBResponse response) throws 
Throwable {
-        final EJBRequest req = new 
EJBRequest(RequestMethodCode.EJB_OBJECT_BUSINESS_METHOD, ejb, method, args, 
primaryKey);
+        final EJBRequest req = new 
EJBRequest(RequestMethodCode.EJB_OBJECT_BUSINESS_METHOD, ejb, method, args, 
primaryKey, client.getSerializer());
 
         //Currently, we only set the request while the asynchronous invocation 
is called
         req.getBody().setRequestId(requestId);
@@ -354,6 +355,9 @@ 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()));
+                }
                 return res.getResult();
             default:
                 throw new RemoteException("Received invalid response code from 
server: " + res.getResponseCode());
@@ -445,7 +449,7 @@ public abstract class EJBObjectHandler e
                     if 
(lastMayInterruptIfRunningValue.getAndSet(mayInterruptIfRunning) == 
mayInterruptIfRunning) {
                         return false;
                     }
-                    final EJBRequest req = new 
EJBRequest(RequestMethodCode.FUTURE_CANCEL, ejb, CANCEL, new 
Object[]{Boolean.valueOf(mayInterruptIfRunning)}, primaryKey);
+                    final EJBRequest req = new 
EJBRequest(RequestMethodCode.FUTURE_CANCEL, ejb, CANCEL, new 
Object[]{Boolean.valueOf(mayInterruptIfRunning)}, primaryKey, 
client.getSerializer());
                     req.getBody().setRequestId(requestId);
                     try {
                         final EJBResponse res = request(req);

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=1500039&r1=1500038&r2=1500039&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
 Fri Jul  5 15:24:31 2013
@@ -16,6 +16,7 @@
  */
 package org.apache.openejb.client;
 
+import org.apache.openejb.client.serializer.EJBDSerializer;
 import org.omg.CORBA.ORB;
 
 import javax.naming.Context;
@@ -26,6 +27,7 @@ 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;
@@ -38,6 +40,7 @@ public class EJBRequest implements Clust
     private transient String deploymentId;
     private transient int serverHash;
     private transient Body body;
+    private transient EJBDSerializer serializer;
 
     // Only visible on the client side
     private transient final EJBMetaDataImpl ejbMetaData;
@@ -52,9 +55,10 @@ public class EJBRequest implements Clust
         ejbMetaData = null;
     }
 
-    public EJBRequest(final RequestMethodCode requestMethod, final 
EJBMetaDataImpl ejb, final Method method, final Object[] args, final Object 
primaryKey) {
+    public EJBRequest(final RequestMethodCode requestMethod, final 
EJBMetaDataImpl ejb, final Method method, final Object[] args, final Object 
primaryKey, final EJBDSerializer serializer) {
         body = new Body(ejb);
 
+        this.serializer = serializer;
         this.ejbMetaData = ejb;
         this.requestMethod = requestMethod;
         setDeploymentCode(ejb.deploymentCode);
@@ -81,7 +85,17 @@ public class EJBRequest implements Clust
     }
 
     public Object[] getMethodParameters() {
-        return body.getMethodParameters();
+        final Object[] params = body.getMethodParameters();
+        if (params == null || serializer == null) {
+            return params;
+        }
+
+        final Object[] unserialized = new Object[params.length];
+        int i = 0;
+        for (final Object o : params) {
+            unserialized[i++] = 
serializer.deserialize(Serializable.class.cast(o));
+        }
+        return unserialized;
     }
 
     public Class[] getMethodParamTypes() {
@@ -97,7 +111,16 @@ public class EJBRequest implements Clust
     }
 
     public void setMethodParameters(final Object[] methodParameters) {
-        body.setMethodParameters(methodParameters);
+        if (serializer == null || methodParameters == null) {
+            body.setMethodParameters(methodParameters);
+        } else {
+            final Object[] params = new Object[methodParameters.length];
+            int i = 0;
+            for (final Object o : methodParameters) {
+                params[i++] = serializer.serialize(o);
+            }
+            body.setMethodParameters(params);
+        }
     }
 
     public void setPrimaryKey(final Object primaryKey) {
@@ -116,6 +139,10 @@ public class EJBRequest implements Clust
         return this.body.getVersion();
     }
 
+    public void setSerializer(final EJBDSerializer serializer) {
+        this.serializer = serializer;
+    }
+
     public static class Body implements java.io.Externalizable {
 
         private transient volatile String toString = null;
@@ -583,6 +610,7 @@ public class EJBRequest implements Clust
             }
         }
         serverHash = in.readInt();
+
         if (result != null) {
             throw result;
         }

Modified: 
tomee/tomee/trunk/server/openejb-client/src/main/java/org/apache/openejb/client/EntityEJBHomeHandler.java
URL: 
http://svn.apache.org/viewvc/tomee/tomee/trunk/server/openejb-client/src/main/java/org/apache/openejb/client/EntityEJBHomeHandler.java?rev=1500039&r1=1500038&r2=1500039&view=diff
==============================================================================
--- 
tomee/tomee/trunk/server/openejb-client/src/main/java/org/apache/openejb/client/EntityEJBHomeHandler.java
 (original)
+++ 
tomee/tomee/trunk/server/openejb-client/src/main/java/org/apache/openejb/client/EntityEJBHomeHandler.java
 Fri Jul  5 15:24:31 2013
@@ -32,7 +32,7 @@ public class EntityEJBHomeHandler extend
     }
 
     protected Object findX(Method method, Object[] args, Object proxy) throws 
Throwable {
-        EJBRequest req = new EJBRequest(RequestMethodCode.EJB_HOME_FIND, ejb, 
method, args, null);
+        EJBRequest req = new EJBRequest(RequestMethodCode.EJB_HOME_FIND, ejb, 
method, args, null, client.getSerializer());
 
         EJBResponse res = request(req);
 
@@ -98,7 +98,7 @@ public class EntityEJBHomeHandler extend
 
         if (primKey == null) throw new NullPointerException("The primary key 
is null.");
 
-        EJBRequest req = new 
EJBRequest(RequestMethodCode.EJB_HOME_REMOVE_BY_PKEY, ejb, method, args, 
primKey);
+        EJBRequest req = new 
EJBRequest(RequestMethodCode.EJB_HOME_REMOVE_BY_PKEY, ejb, method, args, 
primKey, client.getSerializer());
 
         EJBResponse res = request(req);
 
@@ -128,7 +128,7 @@ public class EntityEJBHomeHandler extend
         Object primKey = ejbObject.getPrimaryKey();
         if (primKey == null) throw new NullPointerException("The 
handle.getEJBObject().getPrimaryKey() is null.");
 
-        EJBRequest req = new 
EJBRequest(RequestMethodCode.EJB_HOME_REMOVE_BY_HANDLE, ejb, method, args, 
primKey);
+        EJBRequest req = new 
EJBRequest(RequestMethodCode.EJB_HOME_REMOVE_BY_HANDLE, ejb, method, args, 
primKey, client.getSerializer());
 
         EJBResponse res = request(req);
 

Modified: 
tomee/tomee/trunk/server/openejb-client/src/main/java/org/apache/openejb/client/EntityEJBObjectHandler.java
URL: 
http://svn.apache.org/viewvc/tomee/tomee/trunk/server/openejb-client/src/main/java/org/apache/openejb/client/EntityEJBObjectHandler.java?rev=1500039&r1=1500038&r2=1500039&view=diff
==============================================================================
--- 
tomee/tomee/trunk/server/openejb-client/src/main/java/org/apache/openejb/client/EntityEJBObjectHandler.java
 (original)
+++ 
tomee/tomee/trunk/server/openejb-client/src/main/java/org/apache/openejb/client/EntityEJBObjectHandler.java
 Fri Jul  5 15:24:31 2013
@@ -58,7 +58,7 @@ public class EntityEJBObjectHandler exte
 
     protected Object remove(Method method, Object[] args, Object proxy) throws 
Throwable {
 
-        EJBRequest req = new EJBRequest(RequestMethodCode.EJB_OBJECT_REMOVE, 
ejb, method, args, primaryKey);
+        EJBRequest req = new EJBRequest(RequestMethodCode.EJB_OBJECT_REMOVE, 
ejb, method, args, primaryKey, client.getSerializer());
 
         EJBResponse res = request(req);
 

Modified: 
tomee/tomee/trunk/server/openejb-client/src/main/java/org/apache/openejb/client/JNDIContext.java
URL: 
http://svn.apache.org/viewvc/tomee/tomee/trunk/server/openejb-client/src/main/java/org/apache/openejb/client/JNDIContext.java?rev=1500039&r1=1500038&r2=1500039&view=diff
==============================================================================
--- 
tomee/tomee/trunk/server/openejb-client/src/main/java/org/apache/openejb/client/JNDIContext.java
 (original)
+++ 
tomee/tomee/trunk/server/openejb-client/src/main/java/org/apache/openejb/client/JNDIContext.java
 Fri Jul  5 15:24:31 2013
@@ -17,6 +17,7 @@
 package org.apache.openejb.client;
 
 import org.apache.openejb.client.event.RemoteInitialContextCreated;
+import org.apache.openejb.client.serializer.EJBDSerializer;
 import org.omg.CORBA.ORB;
 
 import javax.naming.*;
@@ -41,6 +42,7 @@ import java.util.Properties;
 public class JNDIContext implements InitialContextFactory, Context {
 
     public static final String DEFAULT_PROVIDER_URL = "ejbd://localhost:4201";
+    public static final String SERIALIZER = "openejb.ejbd.serializer";
 
     private String tail = "/";
     private ServerMetaData server;
@@ -90,6 +92,7 @@ public class JNDIContext implements Init
         final String userID = (String) env.get(Context.SECURITY_PRINCIPAL);
         final String psswrd = (String) env.get(Context.SECURITY_CREDENTIALS);
         String providerUrl = (String) env.get(Context.PROVIDER_URL);
+        final String serializer = (String) env.get(SERIALIZER);
         moduleId = (String) env.get("openejb.client.moduleId");
 
         final URI location;
@@ -117,6 +120,14 @@ public class JNDIContext implements Init
             client = new ClientMetaData();
         }
 
+        if (serializer != null) {
+            try {
+                
client.setSerializer(EJBDSerializer.class.cast(Thread.currentThread().getContextClassLoader().loadClass(serializer).newInstance()));
+            } catch (final Exception e) {
+                // no-op
+            }
+        }
+
         return this;
     }
 

Modified: 
tomee/tomee/trunk/server/openejb-client/src/main/java/org/apache/openejb/client/StatefulEJBHomeHandler.java
URL: 
http://svn.apache.org/viewvc/tomee/tomee/trunk/server/openejb-client/src/main/java/org/apache/openejb/client/StatefulEJBHomeHandler.java?rev=1500039&r1=1500038&r2=1500039&view=diff
==============================================================================
--- 
tomee/tomee/trunk/server/openejb-client/src/main/java/org/apache/openejb/client/StatefulEJBHomeHandler.java
 (original)
+++ 
tomee/tomee/trunk/server/openejb-client/src/main/java/org/apache/openejb/client/StatefulEJBHomeHandler.java
 Fri Jul  5 15:24:31 2013
@@ -51,7 +51,7 @@ public class StatefulEJBHomeHandler exte
             throw new SystemException(new IllegalArgumentException("The handle 
is not from the same deployment"));
         }
 
-        EJBRequest req = new 
EJBRequest(RequestMethodCode.EJB_HOME_REMOVE_BY_HANDLE, ejb, method, args, 
primKey);
+        EJBRequest req = new 
EJBRequest(RequestMethodCode.EJB_HOME_REMOVE_BY_HANDLE, ejb, method, args, 
primKey, client.getSerializer());
 
         EJBResponse res = request(req);
 

Modified: 
tomee/tomee/trunk/server/openejb-client/src/main/java/org/apache/openejb/client/StatefulEJBObjectHandler.java
URL: 
http://svn.apache.org/viewvc/tomee/tomee/trunk/server/openejb-client/src/main/java/org/apache/openejb/client/StatefulEJBObjectHandler.java?rev=1500039&r1=1500038&r2=1500039&view=diff
==============================================================================
--- 
tomee/tomee/trunk/server/openejb-client/src/main/java/org/apache/openejb/client/StatefulEJBObjectHandler.java
 (original)
+++ 
tomee/tomee/trunk/server/openejb-client/src/main/java/org/apache/openejb/client/StatefulEJBObjectHandler.java
 Fri Jul  5 15:24:31 2013
@@ -56,7 +56,7 @@ public class StatefulEJBObjectHandler ex
     
     protected Object remove(Method method, Object[] args, Object proxy) throws 
Throwable {
 
-        EJBRequest req = new EJBRequest(RequestMethodCode.EJB_OBJECT_REMOVE, 
ejb, method, args, primaryKey);
+        EJBRequest req = new EJBRequest(RequestMethodCode.EJB_OBJECT_REMOVE, 
ejb, method, args, primaryKey, client.getSerializer());
 
         EJBResponse res = request(req);
 

Added: 
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=1500039&view=auto
==============================================================================
--- 
tomee/tomee/trunk/server/openejb-client/src/main/java/org/apache/openejb/client/serializer/EJBDSerializer.java
 (added)
+++ 
tomee/tomee/trunk/server/openejb-client/src/main/java/org/apache/openejb/client/serializer/EJBDSerializer.java
 Fri Jul  5 15:24:31 2013
@@ -0,0 +1,24 @@
+/**
+ * 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 interface EJBDSerializer {
+    Serializable serialize(Object o);
+    Object deserialize(Serializable o);
+}

Modified: 
tomee/tomee/trunk/server/openejb-client/src/test/java/org/apache/openejb/client/EJBRequestTest.java
URL: 
http://svn.apache.org/viewvc/tomee/tomee/trunk/server/openejb-client/src/test/java/org/apache/openejb/client/EJBRequestTest.java?rev=1500039&r1=1500038&r2=1500039&view=diff
==============================================================================
--- 
tomee/tomee/trunk/server/openejb-client/src/test/java/org/apache/openejb/client/EJBRequestTest.java
 (original)
+++ 
tomee/tomee/trunk/server/openejb-client/src/test/java/org/apache/openejb/client/EJBRequestTest.java
 Fri Jul  5 15:24:31 2013
@@ -138,7 +138,7 @@ public class EJBRequestTest extends Test
     }
 
     private void invoke(RequestMethodCode requestMethod, Method method, 
Object[] args) throws IOException, ClassNotFoundException {
-        EJBRequest expected = new EJBRequest(requestMethod, ejb, method, args, 
null);
+        EJBRequest expected = new EJBRequest(requestMethod, ejb, method, args, 
null, null);
 
         EJBRequest actual = new EJBRequest();
 

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=1500039&r1=1500038&r2=1500039&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
 Fri Jul  5 15:24:31 2013
@@ -24,6 +24,7 @@ import org.apache.openejb.client.Flushab
 import org.apache.openejb.client.ProtocolMetaData;
 import org.apache.openejb.client.RequestType;
 import org.apache.openejb.client.ServerMetaData;
+import org.apache.openejb.client.serializer.EJBDSerializer;
 import org.apache.openejb.loader.SystemInstance;
 import org.apache.openejb.server.DiscoveryAgent;
 import org.apache.openejb.server.context.RequestInfos;
@@ -62,6 +63,7 @@ public class EjbDaemon implements org.ap
 
     private ContainerSystem containerSystem;
     private boolean gzip;
+    private EJBDSerializer serializer = null;
 
     private EjbDaemon() {
     }
@@ -85,6 +87,13 @@ public class EjbDaemon implements org.ap
         clusterHandler = new ClusterRequestHandler(this);
         gzip = "true".equalsIgnoreCase(props.getProperty("gzip", "false"));
 
+        final String serializer = props.getProperty("serializer", null);
+        if (serializer != null) {
+            this.serializer = 
EJBDSerializer.class.cast(Thread.currentThread().getContextClassLoader().loadClass(serializer).newInstance());
+        } else {
+            this.serializer = null;
+        }
+
         final DiscoveryAgent discovery = 
SystemInstance.get().getComponent(DiscoveryAgent.class);
         if (discovery != null) {
             discovery.setDiscoveryListener(clusterHandler);
@@ -323,5 +332,9 @@ public class EjbDaemon implements org.ap
     public boolean isGzip() {
         return gzip;
     }
+
+    public EJBDSerializer getSerializer() {
+        return serializer;
+    }
 }
 

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=1500039&r1=1500038&r2=1500039&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
 Fri Jul  5 15:24:31 2013
@@ -26,6 +26,7 @@ import org.apache.openejb.client.EJBRequ
 import org.apache.openejb.client.EJBResponse;
 import org.apache.openejb.client.ResponseCodes;
 import org.apache.openejb.client.ThrowableArtifact;
+import org.apache.openejb.client.serializer.EJBDSerializer;
 import org.apache.openejb.core.ThreadContext;
 import org.apache.openejb.loader.SystemInstance;
 import org.apache.openejb.spi.SecurityService;
@@ -312,6 +313,11 @@ class EjbRequestHandler {
             //                    req.getPrimaryKey()
             //            );
 
+            final EJBDSerializer serializer = daemon.getSerializer();
+            if (serializer != null) {
+                req.setSerializer(serializer);
+            }
+
             Object result = c.invoke(
                                         req.getDeploymentId(),
                                         InterfaceType.EJB_OBJECT,
@@ -325,7 +331,13 @@ class EjbRequestHandler {
                 result = ((Future) result).get();
             }
 
-            res.setResponse(req.getVersion(), ResponseCodes.EJB_OK, result);
+            final Object realResult;
+            if (serializer != null) {
+                realResult = serializer.serialize(result);
+            } else {
+                realResult = result;
+            }
+            res.setResponse(req.getVersion(), ResponseCodes.EJB_OK, 
realResult);
         } finally {
             if (asynchronous) {
                 ThreadContext.removeAsynchronousCancelled();

Added: 
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=1500039&view=auto
==============================================================================
--- 
tomee/tomee/trunk/server/openejb-ejbd/src/test/java/org/apache/openejb/SerializerTest.java
 (added)
+++ 
tomee/tomee/trunk/server/openejb-ejbd/src/test/java/org/apache/openejb/SerializerTest.java
 Fri Jul  5 15:24:31 2013
@@ -0,0 +1,152 @@
+/**
+ * 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;
+
+import org.apache.openejb.assembler.classic.Assembler;
+import org.apache.openejb.client.JNDIContext;
+import org.apache.openejb.client.RemoteInitialContextFactory;
+import org.apache.openejb.client.serializer.EJBDSerializer;
+import org.apache.openejb.config.ConfigurationFactory;
+import org.apache.openejb.config.DeploymentsResolver;
+import org.apache.openejb.core.ServerFederation;
+import org.apache.openejb.jee.EjbJar;
+import org.apache.openejb.jee.StatelessBean;
+import org.apache.openejb.loader.SystemInstance;
+import org.apache.openejb.server.ServiceDaemon;
+import org.apache.openejb.server.ejbd.EjbServer;
+import org.junit.Test;
+
+import javax.ejb.EJBException;
+import javax.ejb.Remote;
+import javax.ejb.Stateless;
+import javax.naming.Context;
+import javax.naming.InitialContext;
+import java.io.Serializable;
+import java.util.Properties;
+
+import static org.hamcrest.CoreMatchers.instanceOf;
+import static org.hamcrest.core.StringStartsWith.startsWith;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertThat;
+
+public class SerializerTest {
+    @Test
+    public void invoke() throws Exception {
+        invokeRemote(new Properties() {{
+            setProperty("serializer", MySerializer.class.getName());
+        }}, MySerializer.class.getName());
+    }
+
+    @Test
+    public void ensureItFailBecauseNotSerializeByDefault() throws Exception {
+        try {
+            invokeRemote(new Properties(), null);
+        } catch (final EJBException e) {
+            assertThat(e.getCause(), 
instanceOf(IllegalArgumentException.class));
+            assertThat(e.getCause().getMessage(), startsWith("Object is not 
serializable"));
+        }
+    }
+
+    private void invokeRemote(final Properties serverProps, final String 
serializer) throws Exception {
+        final EjbServer ejbServer = new EjbServer();
+
+        final Properties initProps = new Properties();
+        initProps.put(DeploymentsResolver.DEPLOYMENTS_CLASSPATH_PROPERTY, 
"false");
+        OpenEJB.init(initProps, new ServerFederation());
+        ejbServer.init(serverProps);
+
+        final ServiceDaemon serviceDaemon = new ServiceDaemon(ejbServer, 0, 
"localhost");
+        serviceDaemon.start();
+
+        final int port = serviceDaemon.getPort();
+
+        final Assembler assembler = 
SystemInstance.get().getComponent(Assembler.class);
+        final ConfigurationFactory config = new ConfigurationFactory();
+
+        final EjbJar ejbJar = new EjbJar();
+        ejbJar.addEnterpriseBean(new StatelessBean(AnEjbRemote.class));
+        assembler.createApplication(config.configureApplication(ejbJar));
+
+        try {
+
+            final Properties props = new Properties();
+            props.put(Context.INITIAL_CONTEXT_FACTORY, 
RemoteInitialContextFactory.class.getName());
+            props.put(Context.PROVIDER_URL, "ejbd://127.0.0.1:" + port);
+            if (serializer != null) {
+                props.put(JNDIContext.SERIALIZER, serializer);
+            }
+            final Context context = new InitialContext(props);
+            final AnInterfaceRemote client = 
AnInterfaceRemote.class.cast(context.lookup("AnEjbRemoteRemote"));
+            assertNotNull(client);
+
+            final OutputNotSerializable out = client.call(new 
InputNotSerilizable("cloud"));
+            assertEquals("cloud", out.name);
+        } finally {
+            serviceDaemon.stop();
+            OpenEJB.destroy();
+        }
+    }
+
+    @Remote
+    public static interface AnInterfaceRemote {
+        OutputNotSerializable call(InputNotSerilizable input);
+    }
+
+    @Stateless
+    public static class AnEjbRemote implements AnInterfaceRemote {
+        @Override
+        public OutputNotSerializable call(InputNotSerilizable input) {
+            return new OutputNotSerializable(input.rename);
+        }
+    }
+
+    public static class InputNotSerilizable {
+        public String rename;
+
+        public InputNotSerilizable(final String cloud) {
+            rename = cloud;
+        }
+    }
+
+    public static class OutputNotSerializable {
+        public String name;
+
+        public OutputNotSerializable(final String rename) {
+            name = rename;
+        }
+    }
+
+    public static class MySerializer implements EJBDSerializer {
+        @Override
+        public Serializable serialize(final Object o) {
+            if (InputNotSerilizable.class.isInstance(o)) {
+                return "i" + InputNotSerilizable.class.cast(o).rename;
+            }
+            return "o" + OutputNotSerializable.class.cast(o).name;
+        }
+
+        @Override
+        public Object deserialize(final Serializable o) {
+            final String cast = String.class.cast(o);
+            if (cast.startsWith("i")) {
+                return new InputNotSerilizable(cast.substring(1));
+            }
+            return new OutputNotSerializable(cast.substring(1));
+        }
+    }
+}

Modified: 
tomee/tomee/trunk/server/openejb-ejbd/src/test/java/org/apache/openejb/server/ejbd/DeploymentIndexTest.java
URL: 
http://svn.apache.org/viewvc/tomee/tomee/trunk/server/openejb-ejbd/src/test/java/org/apache/openejb/server/ejbd/DeploymentIndexTest.java?rev=1500039&r1=1500038&r2=1500039&view=diff
==============================================================================
--- 
tomee/tomee/trunk/server/openejb-ejbd/src/test/java/org/apache/openejb/server/ejbd/DeploymentIndexTest.java
 (original)
+++ 
tomee/tomee/trunk/server/openejb-ejbd/src/test/java/org/apache/openejb/server/ejbd/DeploymentIndexTest.java
 Fri Jul  5 15:24:31 2013
@@ -47,7 +47,7 @@ public class DeploymentIndexTest {
     @Test
     public void testGetDeploymentEJBRequest() throws RemoteException {
         final EJBMetaDataImpl ejbMetadataWithId = new EJBMetaDataImpl(null, 
null, null, null, null, 1, InterfaceType.BUSINESS_REMOTE, null, null);
-        final EJBRequest request = new EJBRequest(null, ejbMetadataWithId, 
method, null, null);
+        final EJBRequest request = new EJBRequest(null, ejbMetadataWithId, 
method, null, null, null);
         final BeanContext info = deploymentIndex.getDeployment(request);
 
         Assert.assertEquals(beanContext, info);
@@ -58,7 +58,7 @@ public class DeploymentIndexTest {
     public void testGetDeploymentEJBRequestRemoteException() throws 
RemoteException {
         // 0 causes DeploymentIndex to move further
         final EJBMetaDataImpl ejbMetadata = new EJBMetaDataImpl(null, null, 
null, null, null, 0, InterfaceType.BUSINESS_REMOTE, null, null);
-        final EJBRequest request = new EJBRequest(null, ejbMetadata, method, 
null, null);
+        final EJBRequest request = new EJBRequest(null, ejbMetadata, method, 
null, null, null);
         deploymentIndex.getDeployment(request);
     }
 

Modified: 
tomee/tomee/trunk/server/openejb-ejbd/src/test/java/org/apache/openejb/server/ejbd/ZEjbdTest.java
URL: 
http://svn.apache.org/viewvc/tomee/tomee/trunk/server/openejb-ejbd/src/test/java/org/apache/openejb/server/ejbd/ZEjbdTest.java?rev=1500039&r1=1500038&r2=1500039&view=diff
==============================================================================
--- 
tomee/tomee/trunk/server/openejb-ejbd/src/test/java/org/apache/openejb/server/ejbd/ZEjbdTest.java
 (original)
+++ 
tomee/tomee/trunk/server/openejb-ejbd/src/test/java/org/apache/openejb/server/ejbd/ZEjbdTest.java
 Fri Jul  5 15:24:31 2013
@@ -21,10 +21,10 @@ import org.apache.openejb.client.RemoteI
 import org.apache.openejb.jee.EnterpriseBean;
 import org.apache.openejb.jee.SingletonBean;
 import org.apache.openejb.junit.ApplicationComposer;
-import org.apache.openejb.junit.Configuration;
-import org.apache.openejb.junit.EnableServices;
-import org.apache.openejb.junit.Module;
 import org.apache.openejb.loader.SystemInstance;
+import org.apache.openejb.testing.Configuration;
+import org.apache.openejb.testing.EnableServices;
+import org.apache.openejb.testing.Module;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 
@@ -39,7 +39,6 @@ import static org.junit.Assert.assertTru
 @EnableServices("ejbd")
 @RunWith(ApplicationComposer.class)
 public class ZEjbdTest {
-
     @Configuration
     public Properties configuration() {
         final Properties configuration = new Properties();


Reply via email to