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