You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tomee.apache.org by ge...@apache.org on 2011/06/11 12:43:56 UTC
svn commit: r1134566 - in /openejb/trunk/openejb3/container/openejb-core/src:
main/java/org/apache/openejb/core/timer/EJBCronTrigger.java
test/java/org/apache/openejb/timer/EJBCronTriggerTest.java
Author: genspring
Date: Sat Jun 11 10:43:56 2011
New Revision: 1134566
URL: http://svn.apache.org/viewvc?rev=1134566&view=rev
Log:
OPENEJB-1542 Implement the Expression Rules defined in ejb3.1 spec 18.2.1.2, additional fix and unit tests.
Modified:
openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/timer/EJBCronTrigger.java
openejb/trunk/openejb3/container/openejb-core/src/test/java/org/apache/openejb/timer/EJBCronTriggerTest.java
Modified: openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/timer/EJBCronTrigger.java
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/timer/EJBCronTrigger.java?rev=1134566&r1=1134565&r2=1134566&view=diff
==============================================================================
--- openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/timer/EJBCronTrigger.java (original)
+++ openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/timer/EJBCronTrigger.java Sat Jun 11 10:43:56 2011
@@ -450,7 +450,9 @@ public class EJBCronTrigger extends Trig
while (currentFieldIndex <= 6 && calendar.before(stopCalendar)) {
+
FieldExpression expr = expressions[currentFieldIndex];
+ int oldValue1 = calendar.get(expr.field);
Integer value = expr.getNextValue(calendar);
/*
@@ -482,21 +484,42 @@ public class EJBCronTrigger extends Trig
}
if (currentFieldIndex >= 1 && value == null) {
- // No suitable value was found, so move back to the previous field
- // and increase the value
- // When current field is HOUR_OF_DAY, its upper field is DAY_OF_MONTH, so we need to -2 due to DAY_OF_WEEK.
- int parentFieldIndex = currentFieldIndex == 4 ? currentFieldIndex - 2 : currentFieldIndex - 1;
- int maxAffectedFieldType = upadteCalendar(calendar, expressions[parentFieldIndex].field, 1);
- currentFieldIndex = CALENDAR_FIELD_TYPE_ORDERED_INDEX_MAP.get(maxAffectedFieldType);
- resetFields(calendar, maxAffectedFieldType, false);
+
+ if (currentFieldIndex == 3 && !(expressions[2] instanceof AsteriskExpression)) {
+ /*
+ *18.2.1.2 Expression Rules, the day has been resolved when dayOfMonth expression
+ *is not AsteriskExpression.
+ */
+ currentFieldIndex++;
+ } else {
+ // No suitable value was found, so move back to the previous field
+ // and increase the value
+ // When current field is HOUR_OF_DAY, its upper field is DAY_OF_MONTH, so we need to -2 due to
+ // DAY_OF_WEEK.
+ int parentFieldIndex = currentFieldIndex == 4 ? currentFieldIndex - 2 : currentFieldIndex - 1;
+ int maxAffectedFieldType = upadteCalendar(calendar, expressions[parentFieldIndex].field, 1);
+ currentFieldIndex = CALENDAR_FIELD_TYPE_ORDERED_INDEX_MAP.get(maxAffectedFieldType);
+ resetFields(calendar, maxAffectedFieldType, false);
+ }
+
} else if (value != null) {
+
int oldValue = calendar.get(expr.field);
if (oldValue != value) {
- // The value has changed, so update the calendar and reset all
- // less significant fields
- calendar.set(expr.field, value);
- resetFields(calendar, expr.field, false);
- currentFieldIndex++;
+
+ if (currentFieldIndex == 3 && !(expressions[2] instanceof AsteriskExpression)) {
+ /*
+ *18.2.1.2 Expression Rules, the day has been resolved when dayOfMonth expression
+ *is not AsteriskExpression.
+ */
+ currentFieldIndex++;
+ } else {
+ // The value has changed, so update the calendar and reset all
+ // less significant fields
+ calendar.set(expr.field, value);
+ resetFields(calendar, expr.field, false);
+ currentFieldIndex++;
+ }
} else {
currentFieldIndex++;
}
Modified: openejb/trunk/openejb3/container/openejb-core/src/test/java/org/apache/openejb/timer/EJBCronTriggerTest.java
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb3/container/openejb-core/src/test/java/org/apache/openejb/timer/EJBCronTriggerTest.java?rev=1134566&r1=1134565&r2=1134566&view=diff
==============================================================================
--- openejb/trunk/openejb3/container/openejb-core/src/test/java/org/apache/openejb/timer/EJBCronTriggerTest.java (original)
+++ openejb/trunk/openejb3/container/openejb-core/src/test/java/org/apache/openejb/timer/EJBCronTriggerTest.java Sat Jun 11 10:43:56 2011
@@ -157,14 +157,34 @@ public class EJBCronTriggerTest {
assertEquals(new GregorianCalendar(2011, 4, 18, 23, 59, 59).getTime(), trigger.getFireTimeAfter(new GregorianCalendar(2011, 4, 18, 23, 59, 58).getTime()));
}
-/* @Test(timeout = 5000000)
+ @Test(timeout = 5000)
public void testBothDayOfMonthAndDayOfWeekE() throws ParseException {
ScheduleExpression expr = new ScheduleExpression().year(2011).dayOfMonth("19").dayOfWeek("3").hour(23).minute(59).second(58).start(new GregorianCalendar(2011, 4, 18, 23, 59, 58).getTime());
EJBCronTrigger trigger = new EJBCronTrigger(expr);
assertEquals(new GregorianCalendar(2011, 4, 19, 23, 59, 58).getTime(), trigger.getFireTimeAfter(new GregorianCalendar(2011, 4, 18, 23, 59, 59).getTime()));
System.out.println(trigger.getNextFireTime());
- } */
+ }
+
+ @Test(timeout = 5000)
+ public void testBothDayOfMonthAndDayOfWeekF() throws ParseException {
+ ScheduleExpression expr = new ScheduleExpression().year(2011).dayOfMonth("19").dayOfWeek("3").hour(20).minute(59).second(59).start(new GregorianCalendar(2011, 4, 18, 20, 59, 58).getTime());
+ EJBCronTrigger trigger = new EJBCronTrigger(expr);
+ assertEquals(new GregorianCalendar(2011, 4, 18, 20, 59, 59).getTime(), trigger.getFireTimeAfter(new GregorianCalendar(2011, 4, 18, 20, 59, 58).getTime()));
+ assertEquals(new GregorianCalendar(2011, 4, 19, 20, 59, 59).getTime(), trigger.getFireTimeAfter(new GregorianCalendar(2011, 4, 18, 20, 59, 59).getTime()));
+
+ System.out.println(trigger.getNextFireTime());
+ }
+
+ @Test(timeout = 5000000)
+ public void testBothDayOfMonthAndDayOfWeekG() throws ParseException {
+ ScheduleExpression expr = new ScheduleExpression().year(2011).dayOfMonth("12").dayOfWeek("6").hour(20).minute(59).second(59).start(new GregorianCalendar(2011, 5, 11, 20, 59, 58).getTime());
+ EJBCronTrigger trigger = new EJBCronTrigger(expr);
+ //assertEquals(new GregorianCalendar(2011, 5, 11, 20, 59, 59).getTime(), trigger.getFireTimeAfter(new GregorianCalendar(2011, 5, 11, 20, 59, 58).getTime()));
+ assertEquals(new GregorianCalendar(2011, 5, 12, 20, 59, 59).getTime(), trigger.getFireTimeAfter(new GregorianCalendar(2011, 5, 11, 20, 59, 59).getTime()));
+
+ System.out.println(trigger.getNextFireTime());
+ }
@Test(timeout = 5000)
public void testLastDayOfMonthA() throws ParseException {