Author: rmannibucau Date: Wed Sep 4 12:04:04 2013 New Revision: 1519990 URL: http://svn.apache.org/r1519990 Log: correct serializability for TimerData and related expressions
Removed: tomee/tomee/trunk/container/openejb-core/src/test/resources/import-QuartzPersistenceForEJBTimersDBNoTx.sql Modified: tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/core/timer/EJBCronTrigger.java tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/core/timer/TimerData.java tomee/tomee/trunk/container/openejb-core/src/test/java/org/apache/openejb/timer/GetTimerTest.java tomee/tomee/trunk/container/openejb-core/src/test/java/org/apache/openejb/timer/QuartzPersistenceForEJBTimersTest.java Modified: tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/core/timer/EJBCronTrigger.java URL: http://svn.apache.org/viewvc/tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/core/timer/EJBCronTrigger.java?rev=1519990&r1=1519989&r2=1519990&view=diff ============================================================================== --- tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/core/timer/EJBCronTrigger.java (original) +++ tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/core/timer/EJBCronTrigger.java Wed Sep 4 12:04:04 2013 @@ -21,6 +21,7 @@ import org.apache.openejb.util.Logger; import org.quartz.impl.triggers.CronTriggerImpl; import javax.ejb.ScheduleExpression; +import java.io.Serializable; import java.text.DateFormatSymbols; import java.util.ArrayList; import java.util.Calendar; @@ -576,7 +577,7 @@ public class EJBCronTrigger extends Cron } - private abstract static class FieldExpression { + private abstract static class FieldExpression implements Serializable { protected static final Calendar CALENDAR = new GregorianCalendar(Locale.US); // For getting min/max field values @@ -624,14 +625,8 @@ public class EJBCronTrigger extends Cron } protected boolean isValidResult(Calendar calendar, Integer result){ - - if (result!=null && result>=calendar.getActualMinimum(field) && result <=calendar.getActualMaximum(field)){ - return true; - } - - return false; - - } + return result != null && result >= calendar.getActualMinimum(field) && result <= calendar.getActualMaximum(field); + } /** * Returns the next allowed value in this calendar for the given Modified: tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/core/timer/TimerData.java URL: http://svn.apache.org/viewvc/tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/core/timer/TimerData.java?rev=1519990&r1=1519989&r2=1519990&view=diff ============================================================================== --- tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/core/timer/TimerData.java (original) +++ tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/core/timer/TimerData.java Wed Sep 4 12:04:04 2013 @@ -125,6 +125,7 @@ public abstract class TimerData implemen out.writeObject(primaryKey); out.writeObject(timerService); out.writeObject(info); + out.writeObject(trigger); out.writeUTF(timeoutMethod.getName()); } @@ -143,12 +144,14 @@ public abstract class TimerData implemen primaryKey = in.readObject(); timerService = (EjbTimerServiceImpl) in.readObject(); info = in.readObject(); + trigger = AbstractTrigger.class.cast(in.readObject()); } catch (ClassNotFoundException e) { throw new IOException(e); } final String mtd = in.readUTF(); final BeanContext beanContext = SystemInstance.get().getComponent(ContainerSystem.class).getBeanContext(deploymentId); + scheduler = timerService.getScheduler(); for (Iterator<Map.Entry<Method, MethodContext>> it = beanContext.iteratorMethodContext(); it.hasNext(); ) { final MethodContext methodContext = it.next().getValue(); /* this doesn't work in all cases Modified: tomee/tomee/trunk/container/openejb-core/src/test/java/org/apache/openejb/timer/GetTimerTest.java URL: http://svn.apache.org/viewvc/tomee/tomee/trunk/container/openejb-core/src/test/java/org/apache/openejb/timer/GetTimerTest.java?rev=1519990&r1=1519989&r2=1519990&view=diff ============================================================================== --- tomee/tomee/trunk/container/openejb-core/src/test/java/org/apache/openejb/timer/GetTimerTest.java (original) +++ tomee/tomee/trunk/container/openejb-core/src/test/java/org/apache/openejb/timer/GetTimerTest.java Wed Sep 4 12:04:04 2013 @@ -29,13 +29,16 @@ import javax.ejb.EJB; import javax.ejb.Lock; import javax.ejb.LockType; import javax.ejb.Schedule; +import javax.ejb.ScheduleExpression; import javax.ejb.Singleton; import javax.ejb.Startup; import javax.ejb.Timeout; import javax.ejb.Timer; import javax.ejb.TimerConfig; import javax.ejb.TimerService; +import java.util.Calendar; import java.util.Collection; +import java.util.concurrent.Semaphore; import static org.junit.Assert.assertEquals; @@ -54,6 +57,8 @@ public class GetTimerTest { assertEquals(0, bean.timers().size()); bean.newTimer(); assertEquals(1, bean.timers().size()); + bean.awaitTimeout(); + assertEquals(1, bean.timers().size()); } @Singleton @@ -61,17 +66,27 @@ public class GetTimerTest { @Lock(LockType.READ) public static class TimerLister { @Resource - private TimerService ts; + private TimerService timerService; private Timer timer = null; + private Semaphore sema = new Semaphore(0); @Timeout public void timeout(final Timer timer) { - // no-op: not important for that test + System.out.println("@Timeout"); + sema.release(); + } + + public void awaitTimeout() { + try { + sema.acquire(); + } catch (final InterruptedException e) { + // no-op + } } public Collection<Timer> timers() { - return ts.getTimers(); + return timerService.getTimers(); } @PreDestroy @@ -87,7 +102,17 @@ public class GetTimerTest { } public void newTimer() { - timer = ts.createIntervalTimer(3000, 1000, new TimerConfig(System.currentTimeMillis(), false)); + final TimerConfig tc = new TimerConfig("my-timer", true); + final ScheduleExpression se = new ScheduleExpression(); + final Calendar calendar = Calendar.getInstance(); + calendar.add(Calendar.SECOND, 2); + se.second(calendar.get(Calendar.SECOND) + "/3"); + se.minute("*"); + se.hour("*"); + se.dayOfMonth("*"); + se.dayOfWeek("*"); + se.month("*"); + timer = timerService.createCalendarTimer(se, tc); } } } Modified: tomee/tomee/trunk/container/openejb-core/src/test/java/org/apache/openejb/timer/QuartzPersistenceForEJBTimersTest.java URL: http://svn.apache.org/viewvc/tomee/tomee/trunk/container/openejb-core/src/test/java/org/apache/openejb/timer/QuartzPersistenceForEJBTimersTest.java?rev=1519990&r1=1519989&r2=1519990&view=diff ============================================================================== --- tomee/tomee/trunk/container/openejb-core/src/test/java/org/apache/openejb/timer/QuartzPersistenceForEJBTimersTest.java (original) +++ tomee/tomee/trunk/container/openejb-core/src/test/java/org/apache/openejb/timer/QuartzPersistenceForEJBTimersTest.java Wed Sep 4 12:04:04 2013 @@ -34,16 +34,19 @@ import javax.annotation.PreDestroy; import javax.annotation.Resource; import javax.ejb.EJB; import javax.ejb.Schedule; +import javax.ejb.ScheduleExpression; import javax.ejb.Singleton; import javax.ejb.Timeout; import javax.ejb.Timer; import javax.ejb.TimerConfig; import javax.ejb.TimerService; +import java.util.Calendar; import java.util.Collection; import java.util.Properties; +import java.util.concurrent.Semaphore; +import java.util.concurrent.TimeUnit; import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNotNull; @RunWith(ApplicationComposer.class) public class QuartzPersistenceForEJBTimersTest { @@ -52,10 +55,17 @@ public class QuartzPersistenceForEJBTime @Test public void doTest() { - assertNotNull(bean); assertEquals(0, bean.timers().size()); bean.newTimer(); assertEquals(1, bean.timers().size()); + while (!bean.awaitTimeout()) { + try { + Thread.sleep(100); + } catch (InterruptedException e) { + // no-op + } + } + assertEquals(1, bean.timers().size()); } @Module @@ -99,10 +109,10 @@ public class QuartzPersistenceForEJBTime .p("QuartzPersistenceForEJBTimersDB.UserName", "SA") .p("QuartzPersistenceForEJBTimersDB.Password", "") - // see src/test/resources/import-QuartzPersistenceForEJBTimersDBNoTx.sql for the init script + // see src/test/resources/import-QuartzPersistenceForEJBTimersDBNoTx-.sql for the init script .p("QuartzPersistenceForEJBTimersDBNoTx", "new://Resource?type=DataSource") .p("QuartzPersistenceForEJBTimersDBNoTx.JtaManaged", "false") - .p("QuartzPersistenceForEJBTimersDBNoTx.JdbcUrl", "jdbc:hsqldb:mem:QuartzPersistenceForEJBTimersDBNoTx") + .p("QuartzPersistenceForEJBTimersDBNoTx.JdbcUrl", "jdbc:hsqldb:mem:QuartzPersistenceForEJBTimersDB") .p("QuartzPersistenceForEJBTimersDBNoTx.UserName", "SA") .p("QuartzPersistenceForEJBTimersDBNoTx.Password", "") .build(); @@ -111,17 +121,28 @@ public class QuartzPersistenceForEJBTime @Singleton public static class MyTimedEjb { @Resource - private TimerService ts; + private TimerService timerService; private Timer timer = null; + private Semaphore sema = new Semaphore(0); @Timeout public void timeout(final Timer timer) { - // no-op: not important for that test + System.out.println("@Timeout on " + timer.getInfo()); + sema.release(); + } + + public boolean awaitTimeout() { + try { + return sema.tryAcquire(1, TimeUnit.SECONDS); + } catch (final InterruptedException e) { + // no-op + } + return false; } public Collection<Timer> timers() { - return ts.getTimers(); + return timerService.getTimers(); } @PreDestroy @@ -137,7 +158,17 @@ public class QuartzPersistenceForEJBTime } public void newTimer() { - timer = ts.createIntervalTimer(3000, 1000, new TimerConfig(System.currentTimeMillis(), false)); + final TimerConfig tc = new TimerConfig("my-timer", true); + final ScheduleExpression se = new ScheduleExpression(); + final Calendar calendar = Calendar.getInstance(); + calendar.add(Calendar.SECOND, 2); + se.second(calendar.get(Calendar.SECOND) + "/3"); + se.minute("*"); + se.hour("*"); + se.dayOfMonth("*"); + se.dayOfWeek("*"); + se.month("*"); + timer = timerService.createCalendarTimer(se, tc); } } }