Author: rmannibucau
Date: Mon Aug 6 08:01:24 2012
New Revision: 1369743
URL: http://svn.apache.org/viewvc?rev=1369743&view=rev
Log:
OPENEJB-1882 TOMEE-345 Making TimerData serializable, fixing test about local
bean and constructor
Modified:
openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/core/timer/TimerData.java
openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/core/timer/TimerImpl.java
openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/util/proxy/LocalBeanProxyGeneratorImpl.java
openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/util/reflection/Reflections.java
openejb/trunk/openejb/container/openejb-core/src/test/java/org/apache/openejb/core/singleton/SingletonContainerTest.java
openejb/trunk/openejb/container/openejb-core/src/test/java/org/apache/openejb/core/stateful/StatefulContainerTest.java
openejb/trunk/openejb/container/openejb-core/src/test/java/org/apache/openejb/timer/EjbTimerImplSerializableTest.java
openejb/trunk/openejb/container/openejb-core/src/test/java/org/apache/openejb/util/proxy/LocalBeanProxyGeneratorImplTest.java
Modified:
openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/core/timer/TimerData.java
URL:
http://svn.apache.org/viewvc/openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/core/timer/TimerData.java?rev=1369743&r1=1369742&r2=1369743&view=diff
==============================================================================
---
openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/core/timer/TimerData.java
(original)
+++
openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/core/timer/TimerData.java
Mon Aug 6 08:01:24 2012
@@ -17,6 +17,10 @@
package org.apache.openejb.core.timer;
+import org.apache.openejb.BeanContext;
+import org.apache.openejb.MethodContext;
+import org.apache.openejb.loader.SystemInstance;
+import org.apache.openejb.spi.ContainerSystem;
import org.apache.openejb.util.LogCategory;
import org.apache.openejb.util.Logger;
import org.quartz.Scheduler;
@@ -31,22 +35,28 @@ import javax.ejb.TimerConfig;
import javax.transaction.Status;
import javax.transaction.Synchronization;
import javax.transaction.Transaction;
+import java.io.IOException;
+import java.io.ObjectInputStream;
+import java.io.ObjectOutputStream;
+import java.io.Serializable;
import java.lang.reflect.Method;
import java.util.Date;
+import java.util.Iterator;
+import java.util.Map;
-public abstract class TimerData {
+public abstract class TimerData implements Serializable {
public static final String OPEN_EJB_TIMEOUT_TRIGGER_NAME_PREFIX =
"OPEN_EJB_TIMEOUT_TRIGGER_";
public static final String OPEN_EJB_TIMEOUT_TRIGGER_GROUP_NAME =
"OPEN_EJB_TIMEOUT_TRIGGER_GROUP";
private static final Logger log = Logger.getInstance(LogCategory.TIMER,
"org.apache.openejb.util.resources");
- private final long id;
- final EjbTimerServiceImpl timerService;
- private final String deploymentId;
- private final Object primaryKey;
- private final Method timeoutMethod;
+ private long id;
+ private EjbTimerServiceImpl timerService;
+ private String deploymentId;
+ private Object primaryKey;
+ private Method timeoutMethod;
- private final Object info;
+ private Object info;
private boolean persistent;
protected AbstractTrigger<?> trigger;
@@ -58,7 +68,7 @@ public abstract class TimerData {
}
// EJB Timer object given to user code
- private final Timer timer;
+ private Timer timer;
/**
@@ -98,6 +108,48 @@ public abstract class TimerData {
this.timeoutMethod = timeoutMethod;
}
+ private void writeObject(final ObjectOutputStream out) throws IOException {
+ out.writeLong(id);
+ out.writeUTF(deploymentId);
+ out.writeBoolean(persistent);
+ out.writeObject(timer);
+ out.writeObject(primaryKey);
+ out.writeObject(timerService);
+ out.writeObject(info);
+ out.writeUTF(timeoutMethod.getName());
+ }
+
+ private void readObject(final ObjectInputStream in) throws IOException {
+ id = in.readLong();
+ deploymentId = in.readUTF();
+ persistent = in.readBoolean();
+
+ try {
+ timer = (Timer) in.readObject();
+ primaryKey = in.readObject();
+ timerService = (EjbTimerServiceImpl) in.readObject();
+ info = in.readObject();
+ } catch (ClassNotFoundException e) {
+ throw new IOException(e);
+ }
+
+ final String mtd = in.readUTF();
+ final BeanContext beanContext =
SystemInstance.get().getComponent(ContainerSystem.class).getBeanContext(deploymentId);
+ for (Iterator<Map.Entry<Method, MethodContext>> it =
beanContext.iteratorMethodContext(); it.hasNext(); ) {
+ final MethodContext methodContext = it.next().getValue();
+ if (methodContext.getSchedules().isEmpty()) {
+ continue;
+ }
+
+ final Method method = methodContext.getBeanMethod();
+ if (method.getName().equals(mtd)) {
+ timeoutMethod = method;
+ break;
+ }
+
+ }
+ }
+
public void stop() {
if (trigger != null) {
try {
Modified:
openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/core/timer/TimerImpl.java
URL:
http://svn.apache.org/viewvc/openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/core/timer/TimerImpl.java?rev=1369743&r1=1369742&r2=1369743&view=diff
==============================================================================
---
openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/core/timer/TimerImpl.java
(original)
+++
openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/core/timer/TimerImpl.java
Mon Aug 6 08:01:24 2012
@@ -31,7 +31,7 @@ import org.apache.openejb.BeanContext;
import org.apache.openejb.core.BaseContext;
import org.apache.openejb.core.ThreadContext;
-public class TimerImpl implements Timer {
+public class TimerImpl implements Timer, Serializable {
private final TimerData timerData;
public TimerImpl(TimerData timerData) {
Modified:
openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/util/proxy/LocalBeanProxyGeneratorImpl.java
URL:
http://svn.apache.org/viewvc/openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/util/proxy/LocalBeanProxyGeneratorImpl.java?rev=1369743&r1=1369742&r2=1369743&view=diff
==============================================================================
---
openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/util/proxy/LocalBeanProxyGeneratorImpl.java
(original)
+++
openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/util/proxy/LocalBeanProxyGeneratorImpl.java
Mon Aug 6 08:01:24 2012
@@ -33,6 +33,7 @@ import java.util.List;
import java.util.Map;
import org.apache.openejb.loader.IO;
+import org.apache.openejb.util.reflection.Reflections;
import org.apache.xbean.asm.ClassWriter;
import org.apache.xbean.asm.FieldVisitor;
import org.apache.xbean.asm.Label;
Modified:
openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/util/reflection/Reflections.java
URL:
http://svn.apache.org/viewvc/openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/util/reflection/Reflections.java?rev=1369743&r1=1369742&r2=1369743&view=diff
==============================================================================
---
openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/util/reflection/Reflections.java
(original)
+++
openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/util/reflection/Reflections.java
Mon Aug 6 08:01:24 2012
@@ -16,6 +16,7 @@
*/
package org.apache.openejb.util.reflection;
+import java.lang.reflect.Field;
import java.lang.reflect.Method;
public final class Reflections {
@@ -32,4 +33,20 @@ public final class Reflections {
throw new IllegalArgumentException(e);
}
}
+
+ public static void set(final Object instance, final String field, final
Object value) {
+ Field f;
+ try {
+ f = instance.getClass().getDeclaredField(field);
+ boolean acc = f.isAccessible();
+ f.setAccessible(true);
+ try {
+ f.set(instance, value);
+ } finally {
+ f.setAccessible(acc);
+ }
+ } catch (Exception e) {
+ throw new IllegalArgumentException(e);
+ }
+ }
}
Modified:
openejb/trunk/openejb/container/openejb-core/src/test/java/org/apache/openejb/core/singleton/SingletonContainerTest.java
URL:
http://svn.apache.org/viewvc/openejb/trunk/openejb/container/openejb-core/src/test/java/org/apache/openejb/core/singleton/SingletonContainerTest.java?rev=1369743&r1=1369742&r2=1369743&view=diff
==============================================================================
---
openejb/trunk/openejb/container/openejb-core/src/test/java/org/apache/openejb/core/singleton/SingletonContainerTest.java
(original)
+++
openejb/trunk/openejb/container/openejb-core/src/test/java/org/apache/openejb/core/singleton/SingletonContainerTest.java
Mon Aug 6 08:01:24 2012
@@ -75,7 +75,8 @@ public class SingletonContainerTest exte
assertSame("lifecycle", lifecycle, WidgetBean.lifecycle);
// Check the lifecycle of the bean
- assertEquals(Lifecycle.CONSTRUCTOR + "\n" +
Lifecycle.BUSINESS_METHOD + "\n", join("\n", lifecycle));
+ // assertEquals(Lifecycle.CONSTRUCTOR + "\n" +
Lifecycle.BUSINESS_METHOD + "\n", join("\n", lifecycle));
+ assertEquals(Lifecycle.BUSINESS_METHOD + "\n", join("\n",
lifecycle));
}
{
Modified:
openejb/trunk/openejb/container/openejb-core/src/test/java/org/apache/openejb/core/stateful/StatefulContainerTest.java
URL:
http://svn.apache.org/viewvc/openejb/trunk/openejb/container/openejb-core/src/test/java/org/apache/openejb/core/stateful/StatefulContainerTest.java?rev=1369743&r1=1369742&r2=1369743&view=diff
==============================================================================
---
openejb/trunk/openejb/container/openejb-core/src/test/java/org/apache/openejb/core/stateful/StatefulContainerTest.java
(original)
+++
openejb/trunk/openejb/container/openejb-core/src/test/java/org/apache/openejb/core/stateful/StatefulContainerTest.java
Mon Aug 6 08:01:24 2012
@@ -61,8 +61,10 @@ public class StatefulContainerTest exten
public void testBusinessLocalBeanInterface() throws Exception {
List localbeanExpectedLifecycle = new ArrayList();
localbeanExpectedLifecycle.addAll(expectedLifecycle);
- // can't avoid the extra constructor call
- localbeanExpectedLifecycle.add(4, Lifecycle.CONSTRUCTOR);
+
+ // WAS can't avoid the extra constructor call
+ // NOW it was rewritten to avoid it
+ // localbeanExpectedLifecycle.add(4, Lifecycle.CONSTRUCTOR);
testBusinessLocalBeanInterface(localbeanExpectedLifecycle);
}
@@ -161,8 +163,10 @@ public class StatefulContainerTest exten
public void testBusinessLocalBeanInterfaceInTx() throws Exception {
List localbeanExpectedLifecycle = new ArrayList();
localbeanExpectedLifecycle.addAll(inTxExpectedLifecycle);
- // can't avoid the extra constructor call
- localbeanExpectedLifecycle.add(3, Lifecycle.CONSTRUCTOR);
+
+ // WAS can't avoid the extra constructor call
+ // NOW it was rewritten to avoid it
+ // localbeanExpectedLifecycle.add(3, Lifecycle.CONSTRUCTOR);
TransactionManager transactionManager =
SystemInstance.get().getComponent(TransactionManager.class);
transactionManager.begin();
Modified:
openejb/trunk/openejb/container/openejb-core/src/test/java/org/apache/openejb/timer/EjbTimerImplSerializableTest.java
URL:
http://svn.apache.org/viewvc/openejb/trunk/openejb/container/openejb-core/src/test/java/org/apache/openejb/timer/EjbTimerImplSerializableTest.java?rev=1369743&r1=1369742&r2=1369743&view=diff
==============================================================================
---
openejb/trunk/openejb/container/openejb-core/src/test/java/org/apache/openejb/timer/EjbTimerImplSerializableTest.java
(original)
+++
openejb/trunk/openejb/container/openejb-core/src/test/java/org/apache/openejb/timer/EjbTimerImplSerializableTest.java
Mon Aug 6 08:01:24 2012
@@ -17,8 +17,11 @@
package org.apache.openejb.timer;
import org.apache.openejb.BeanContext;
+import org.apache.openejb.MethodContext;
+import org.apache.openejb.core.timer.CalendarTimerData;
import org.apache.openejb.core.timer.EjbTimerService;
import org.apache.openejb.core.timer.EjbTimerServiceImpl;
+import org.apache.openejb.core.timer.ScheduleData;
import org.apache.openejb.jee.Empty;
import org.apache.openejb.jee.StatelessBean;
import org.apache.openejb.junit.ApplicationComposer;
@@ -65,12 +68,44 @@ public class EjbTimerImplSerializableTes
assertEqualsByReflection(timer, timerDeserialized, "retryAttempts");
}
- private void assertEqualsByReflection(final EjbTimerService timer, final
EjbTimerService timerDeserialized, final String name) throws Exception {
- final Field field = EjbTimerServiceImpl.class.getDeclaredField(name);
- field.setAccessible(true);
+ @Test
+ public void serializationOfCalendarData() throws Exception {
+ final BeanContext context =
SystemInstance.get().getComponent(ContainerSystem.class).getBeanContext("EJBWithTimer");
+ final EjbTimerService timer = context.getEjbTimerService();
+ final MethodContext ctx =
context.getMethodContext(EJBWithTimer.class.getMethod("doSthg"));
+ final ScheduleData sd = ctx.getSchedules().iterator().next();
+ final CalendarTimerData data = new CalendarTimerData(1,
(EjbTimerServiceImpl) timer, context.getDeploymentID().toString(), null,
ctx.getBeanMethod(), sd.getConfig(), sd.getExpression());
+
+ final ByteArrayOutputStream baos = new ByteArrayOutputStream();
+ final ObjectOutputStream oos = new ObjectOutputStream(baos);
+ oos.writeObject(data);
+
+ final ByteArrayInputStream bais = new
ByteArrayInputStream(baos.toByteArray());
+ final ObjectInputStream ois = new ObjectInputStream(bais);
+ final CalendarTimerData dataDeserialized = (CalendarTimerData)
ois.readObject();
+ assertThat(dataDeserialized, instanceOf(CalendarTimerData.class));
+
+ assertEqualsByReflection(data, dataDeserialized, "id");
+ assertEqualsByReflection(data, dataDeserialized, "deploymentId");
+ assertEqualsByReflection(data, dataDeserialized, "timeoutMethod");
+ assertEqualsByReflection(data, dataDeserialized, "info");
+ }
+
+ private void assertEqualsByReflection(final Object o1, final Object o2,
final String name) throws Exception {
+ Class<?> clazz = o1.getClass();
+ Field field = null;
+ while (!Object.class.equals(clazz) && clazz.getSuperclass() != null &&
field == null) {
+ try {
+ field = clazz.getDeclaredField(name);
+ field.setAccessible(true);
+ } catch (NoSuchFieldException ignored) {
+ // no-op
+ }
+ clazz = clazz.getSuperclass();
+ }
- final Object v1 = field.get(timer);
- final Object v2 = field.get(timerDeserialized);
+ final Object v1 = field.get(o1);
+ final Object v2 = field.get(o2);
assertEquals(name, v1, v2);
}
Modified:
openejb/trunk/openejb/container/openejb-core/src/test/java/org/apache/openejb/util/proxy/LocalBeanProxyGeneratorImplTest.java
URL:
http://svn.apache.org/viewvc/openejb/trunk/openejb/container/openejb-core/src/test/java/org/apache/openejb/util/proxy/LocalBeanProxyGeneratorImplTest.java?rev=1369743&r1=1369742&r2=1369743&view=diff
==============================================================================
---
openejb/trunk/openejb/container/openejb-core/src/test/java/org/apache/openejb/util/proxy/LocalBeanProxyGeneratorImplTest.java
(original)
+++
openejb/trunk/openejb/container/openejb-core/src/test/java/org/apache/openejb/util/proxy/LocalBeanProxyGeneratorImplTest.java
Mon Aug 6 08:01:24 2012
@@ -881,8 +881,9 @@ public class LocalBeanProxyGeneratorImpl
TestInvocationHandler invocationHandler = new
TestInvocationHandler(new EnumParams());
ClassLoader cl = Thread.currentThread().getContextClassLoader();
- Class cls = new
LocalBeanProxyGeneratorImpl().createProxy(EnumParams.class, cl);
- EnumParams proxy = (EnumParams) cls.getConstructor(new Class[] {
InvocationHandler.class }).newInstance(invocationHandler);
+ LocalBeanProxyGeneratorImpl generator = new
LocalBeanProxyGeneratorImpl();
+ Class cls = generator.createProxy(EnumParams.class, cl);
+ EnumParams proxy = (EnumParams) generator.constructProxy(cls,
invocationHandler);
proxy.someStringMethod(Color.GREEN.name());
proxy.someEnumMethod(Color.RED);