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


Reply via email to