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