[jboss-svn-commits] JBL Code SVN: r30588 - in labs/jbossrules/trunk: drools-compiler/src/test/java/org/drools/integrationtests and 4 other directories.
jboss-svn-commits at lists.jboss.org
jboss-svn-commits at lists.jboss.org
Fri Dec 11 02:01:50 EST 2009
Author: mark.proctor at jboss.com
Date: 2009-12-11 02:01:49 -0500 (Fri, 11 Dec 2009)
New Revision: 30588
Modified:
labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/rule/builder/RuleBuilder.java
labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/ExecutionFlowControlTest.java
labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/rule/builder/dialect/java/RuleBuilderTest.java
labs/jbossrules/trunk/drools-core/src/main/java/org/drools/process/instance/timer/TimerManager.java
labs/jbossrules/trunk/drools-core/src/main/java/org/drools/time/impl/CronTimer.java
labs/jbossrules/trunk/drools-core/src/main/java/org/drools/time/impl/CronTrigger.java
labs/jbossrules/trunk/drools-core/src/main/java/org/drools/time/impl/IntervalTimer.java
labs/jbossrules/trunk/drools-core/src/main/java/org/drools/time/impl/IntervalTrigger.java
labs/jbossrules/trunk/drools-core/src/test/java/org/drools/time/impl/CronJobTest.java
Log:
JBRULES-1944 Timer support
-completed sart and end with tests
-added repeat-limit with tests
Modified: labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/rule/builder/RuleBuilder.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/rule/builder/RuleBuilder.java 2009-12-11 05:29:46 UTC (rev 30587)
+++ labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/rule/builder/RuleBuilder.java 2009-12-11 07:01:49 UTC (rev 30588)
@@ -225,42 +225,60 @@
int startPos = timerString.indexOf( "start" );
int endPos = timerString.indexOf( "end" );
+ int repeatPos = timerString.indexOf( "repeat-limit" );
- int optionsPos = timerString.length();
-
Date startDate = null;
Date endDate = null;
+ int repeatLimit = -1;
- if ( startPos != -1 && endPos != -1 ) {
- // support case where someone puts end before start
- if ( startPos < endPos ) {
- // start is first
- optionsPos = startPos;
- int equalsPos = timerString.indexOf( '=', startPos );
- startDate = DateUtils.parseDate( timerString.substring( equalsPos + 2, endPos ).trim() );
- } else {
- // end is first
- optionsPos = endPos;
- int equalsPos = timerString.indexOf( '=', endPos );
- startDate = DateUtils.parseDate( timerString.substring( equalsPos + 2, startPos ).trim() );
+ int optionsPos = timerString.length();
+
+ if ( startPos != -1 ) {
+ optionsPos = startPos;
+ int p = ( endPos != -1 && endPos < repeatPos ) ? endPos : repeatPos;
+
+ if ( p == -1 ) {
+ p = timerString.length();
}
- } else if ( startPos != -1 ) {
- optionsPos = startPos;
+
int equalsPos = timerString.indexOf( '=', startPos );
- startDate = DateUtils.parseDate( timerString.substring( equalsPos + 2 ).trim() );
- } else if ( endPos != -1 ) {
- optionsPos = endPos;
+ startDate = DateUtils.parseDate( timerString.substring( equalsPos + 1, p ).trim() );
+ }
+
+ if ( endPos != -1 ) {
+ if ( optionsPos > endPos ) {
+ optionsPos = endPos;
+ }
+ int p = ( startPos != -1 && startPos < repeatPos ) ? startPos : repeatPos;
+
+ if ( p == -1 ) {
+ p = timerString.length();
+ }
+
int equalsPos = timerString.indexOf( '=', endPos );
- endDate = DateUtils.parseDate( timerString.substring( equalsPos + 2 ).trim() );
+ endDate = DateUtils.parseDate( timerString.substring( equalsPos + 1, p ).trim() );
}
-
+ if ( repeatPos != -1 ) {
+ if ( optionsPos > repeatPos ) {
+ optionsPos = repeatPos;
+ }
+ int p = ( startPos != -1 && startPos < endPos ) ? startPos : endPos;
+
+ if ( p == -1 ) {
+ p = timerString.length();
+ }
+
+ int equalsPos = timerString.indexOf( '=', repeatPos );
+ repeatLimit = Integer.parseInt( timerString.substring( equalsPos + 1, p ).trim() );
+ }
+
String body = timerString.substring( colonPos + 1, optionsPos ).trim();
Timer timer = null;
if ( "cron".equals( protocol ) ) {
try {
- timer = new CronTimer( startDate, endDate, new CronExpression( body ) );
+ timer = new CronTimer( startDate, endDate, repeatLimit, new CronExpression( body ) );
} catch ( ParseException e ) {
context.getErrors().add( "Unable to build set timer '" + timerString + "'");
return;
@@ -280,7 +298,7 @@
context.getErrors().add( "Incorrect number of arguments for interval timer '" + timerString + "'");
return;
}
- timer = new IntervalTimer(startDate, endDate, delay, period);
+ timer = new IntervalTimer(startDate, endDate, repeatLimit, delay, period);
} else {
context.getErrors().add( "Protocol for timer does not exist '" + timerString +"'");
return;
Modified: labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/ExecutionFlowControlTest.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/ExecutionFlowControlTest.java 2009-12-11 05:29:46 UTC (rev 30587)
+++ labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/ExecutionFlowControlTest.java 2009-12-11 07:01:49 UTC (rev 30588)
@@ -1356,7 +1356,259 @@
timeService.advanceTime( 60, TimeUnit.SECONDS );
assertEquals( 4, list.size() );
}
+
+ public void testCalendarsWithIntervalsAndStartAndEnd() throws Exception {
+ String str = "";
+ str += "package org.simple \n";
+ str += "global java.util.List list \n";
+ str += "rule xxx \n";
+ str += " calendars \"cal1\"\n";
+ str += " timer (0d 1d start=3-JAN-2010 end=5-JAN-2010) "; //int: protocol is assumed
+ str += "when \n";
+ str += "then \n";
+ str += " list.add(\"fired\"); \n";
+ str += "end \n";
+ KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
+ kbuilder.add( ResourceFactory.newByteArrayResource( str.getBytes() ),
+ ResourceType.DRL );
+
+ if ( kbuilder.hasErrors() ) {
+ System.out.println( kbuilder.getErrors() );
+ assertTrue( kbuilder.hasErrors() );
+ }
+
+ KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase();
+ kbase.addKnowledgePackages( kbuilder.getKnowledgePackages() );
+
+ KnowledgeSessionConfiguration conf = KnowledgeBaseFactory.newKnowledgeSessionConfiguration();
+ conf.setOption( ClockTypeOption.get( "pseudo" ) );
+
+ List list = new ArrayList();
+ StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession( conf, null );
+ PseudoClockScheduler timeService = ( PseudoClockScheduler ) ksession.getSessionClock();
+ DateFormat df = new SimpleDateFormat( "dd-MMM-yyyy" );
+ Date date = df.parse( "1-JAN-2010" );
+
+ Calendar cal1 = new Calendar() {
+ public boolean isTimeIncluded(long timestamp) {
+ return true;
+ }
+ };
+
+ long oneDay = 60 * 60 * 24;
+ ksession.getCalendars().set( "cal1", cal1 );
+ ksession.setGlobal( "list", list );
+
+ timeService.advanceTime( date.getTime(), TimeUnit.MILLISECONDS );
+ ksession.fireAllRules();
+ assertEquals( 0, list.size() );
+
+ timeService.advanceTime( oneDay, TimeUnit.SECONDS );
+ assertEquals( 0, list.size() );
+
+ timeService.advanceTime( oneDay, TimeUnit.SECONDS ); // day 3
+ assertEquals( 1, list.size() );
+
+ timeService.advanceTime( oneDay, TimeUnit.SECONDS );
+ assertEquals( 2, list.size() );
+
+ timeService.advanceTime( oneDay, TimeUnit.SECONDS ); // day 5
+ assertEquals( 3, list.size() );
+
+ timeService.advanceTime( oneDay, TimeUnit.SECONDS );
+ assertEquals( 3, list.size() );
+ }
+
+ public void testCalendarsWithIntervalsAndStartAndLimit() throws Exception {
+ String str = "";
+ str += "package org.simple \n";
+ str += "global java.util.List list \n";
+ str += "rule xxx \n";
+ str += " calendars \"cal1\"\n";
+ str += " timer (0d 1d start=3-JAN-2010 repeat-limit=4) "; //int: protocol is assumed
+ str += "when \n";
+ str += "then \n";
+ str += " list.add(\"fired\"); \n";
+ str += "end \n";
+
+ KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
+ kbuilder.add( ResourceFactory.newByteArrayResource( str.getBytes() ),
+ ResourceType.DRL );
+
+ if ( kbuilder.hasErrors() ) {
+ System.out.println( kbuilder.getErrors() );
+ assertTrue( kbuilder.hasErrors() );
+ }
+
+ KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase();
+ kbase.addKnowledgePackages( kbuilder.getKnowledgePackages() );
+
+ KnowledgeSessionConfiguration conf = KnowledgeBaseFactory.newKnowledgeSessionConfiguration();
+ conf.setOption( ClockTypeOption.get( "pseudo" ) );
+
+ List list = new ArrayList();
+ StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession( conf, null );
+ PseudoClockScheduler timeService = ( PseudoClockScheduler ) ksession.getSessionClock();
+ DateFormat df = new SimpleDateFormat( "dd-MMM-yyyy" );
+ Date date = df.parse( "1-JAN-2010" );
+
+ Calendar cal1 = new Calendar() {
+ public boolean isTimeIncluded(long timestamp) {
+ return true;
+ }
+ };
+
+ long oneDay = 60 * 60 * 24;
+ ksession.getCalendars().set( "cal1", cal1 );
+ ksession.setGlobal( "list", list );
+
+ timeService.advanceTime( date.getTime(), TimeUnit.MILLISECONDS );
+ ksession.fireAllRules();
+ assertEquals( 0, list.size() );
+
+ timeService.advanceTime( oneDay, TimeUnit.SECONDS );
+ assertEquals( 0, list.size() );
+
+ timeService.advanceTime( oneDay, TimeUnit.SECONDS ); // day 3
+ assertEquals( 1, list.size() );
+
+ timeService.advanceTime( oneDay, TimeUnit.SECONDS );
+ assertEquals( 2, list.size() );
+
+ timeService.advanceTime( oneDay, TimeUnit.SECONDS ); // day 5
+ assertEquals( 3, list.size() );
+
+ timeService.advanceTime( oneDay, TimeUnit.SECONDS );
+ assertEquals( 3, list.size() );
+ }
+
+ public void testCalendarsWithCronAndStartAndEnd() throws Exception {
+ String str = "";
+ str += "package org.simple \n";
+ str += "global java.util.List list \n";
+ str += "rule xxx \n";
+ str += " calendars \"cal1\"\n";
+ str += " timer (cron: 0 0 0 * * ? start=3-JAN-2010 end=5-JAN-2010) ";
+ str += "when \n";
+ str += "then \n";
+ str += " list.add(\"fired\"); \n";
+ str += "end \n";
+
+ KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
+ kbuilder.add( ResourceFactory.newByteArrayResource( str.getBytes() ),
+ ResourceType.DRL );
+
+ if ( kbuilder.hasErrors() ) {
+ System.out.println( kbuilder.getErrors() );
+ assertTrue( kbuilder.hasErrors() );
+ }
+
+ KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase();
+ kbase.addKnowledgePackages( kbuilder.getKnowledgePackages() );
+
+ KnowledgeSessionConfiguration conf = KnowledgeBaseFactory.newKnowledgeSessionConfiguration();
+ conf.setOption( ClockTypeOption.get( "pseudo" ) );
+
+ List list = new ArrayList();
+ StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession( conf, null );
+ PseudoClockScheduler timeService = ( PseudoClockScheduler ) ksession.getSessionClock();
+ DateFormat df = new SimpleDateFormat( "dd-MMM-yyyy" );
+ Date date = df.parse( "1-JAN-2010" );
+
+ Calendar cal1 = new Calendar() {
+ public boolean isTimeIncluded(long timestamp) {
+ return true;
+ }
+ };
+
+ long oneDay = 60 * 60 * 24;
+ ksession.getCalendars().set( "cal1", cal1 );
+ ksession.setGlobal( "list", list );
+
+ timeService.advanceTime( date.getTime(), TimeUnit.MILLISECONDS );
+ ksession.fireAllRules();
+ assertEquals( 0, list.size() );
+
+ timeService.advanceTime( oneDay, TimeUnit.SECONDS );
+ assertEquals( 0, list.size() );
+
+ timeService.advanceTime( oneDay, TimeUnit.SECONDS ); // day 3
+ assertEquals( 1, list.size() );
+
+ timeService.advanceTime( oneDay, TimeUnit.SECONDS );
+ assertEquals( 2, list.size() );
+
+ timeService.advanceTime( oneDay, TimeUnit.SECONDS ); // day 5
+ assertEquals( 3, list.size() );
+
+ timeService.advanceTime( oneDay, TimeUnit.SECONDS );
+ assertEquals( 3, list.size() );
+ }
+
+ public void testCalendarsWithCronAndStartAndLimit() throws Exception {
+ String str = "";
+ str += "package org.simple \n";
+ str += "global java.util.List list \n";
+ str += "rule xxx \n";
+ str += " calendars \"cal1\"\n";
+ str += " timer (cron: 0 0 0 * * ? start=3-JAN-2010 repeat-limit=4) ";
+ str += "when \n";
+ str += "then \n";
+ str += " list.add(\"fired\"); \n";
+ str += "end \n";
+
+ KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
+ kbuilder.add( ResourceFactory.newByteArrayResource( str.getBytes() ),
+ ResourceType.DRL );
+
+ if ( kbuilder.hasErrors() ) {
+ System.out.println( kbuilder.getErrors() );
+ assertTrue( kbuilder.hasErrors() );
+ }
+
+ KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase();
+ kbase.addKnowledgePackages( kbuilder.getKnowledgePackages() );
+
+ KnowledgeSessionConfiguration conf = KnowledgeBaseFactory.newKnowledgeSessionConfiguration();
+ conf.setOption( ClockTypeOption.get( "pseudo" ) );
+
+ List list = new ArrayList();
+ StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession( conf, null );
+ PseudoClockScheduler timeService = ( PseudoClockScheduler ) ksession.getSessionClock();
+ DateFormat df = new SimpleDateFormat( "dd-MMM-yyyy" );
+ Date date = df.parse( "1-JAN-2010" );
+
+ Calendar cal1 = new Calendar() {
+ public boolean isTimeIncluded(long timestamp) {
+ return true;
+ }
+ };
+
+ long oneDay = 60 * 60 * 24;
+ ksession.getCalendars().set( "cal1", cal1 );
+ ksession.setGlobal( "list", list );
+
+ timeService.advanceTime( date.getTime(), TimeUnit.MILLISECONDS );
+ ksession.fireAllRules();
+ assertEquals( 0, list.size() );
+
+ timeService.advanceTime( oneDay, TimeUnit.SECONDS );
+ assertEquals( 0, list.size() );
+
+ timeService.advanceTime( oneDay, TimeUnit.SECONDS ); // day 3
+ assertEquals( 1, list.size() );
+
+ timeService.advanceTime( oneDay, TimeUnit.SECONDS );
+ assertEquals( 2, list.size() );
+
+ timeService.advanceTime( oneDay, TimeUnit.SECONDS ); // day 5
+ assertEquals( 3, list.size() );
+
+ timeService.advanceTime( oneDay, TimeUnit.SECONDS );
+ assertEquals( 3, list.size() );
+ }
+
public void testFireRuleAfterDuration() throws Exception {
final PackageBuilder builder = new PackageBuilder();
builder.addPackageFromDrl( new InputStreamReader( getClass().getResourceAsStream( "test_FireRuleAfterDuration.drl" ) ) );
Modified: labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/rule/builder/dialect/java/RuleBuilderTest.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/rule/builder/dialect/java/RuleBuilderTest.java 2009-12-11 05:29:46 UTC (rev 30587)
+++ labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/rule/builder/dialect/java/RuleBuilderTest.java 2009-12-11 07:01:49 UTC (rev 30588)
@@ -206,7 +206,7 @@
oneOf( rule ).setRuleFlowGroup( "mygroup" );
oneOf( rule ).setLockOnActive( true );
oneOf( rule ).setEnabled( EnabledBoolean.ENABLED_FALSE );
- oneOf( rule ).setTimer( new IntervalTimer( null , null, TimeUtils.parseTimeString( "60" ), 0 ) );
+ oneOf( rule ).setTimer( new IntervalTimer( null , null, -1, TimeUtils.parseTimeString( "60" ), 0 ) );
oneOf( rule ).setCalendars( new String[] { "cal1" } );
oneOf( rule ).setDateEffective( effective );
oneOf( rule ).setDateExpires( expires );
@@ -242,7 +242,7 @@
allowing( context ).getRuleDescr(); will( returnValue( ruleDescr ) );
// expected values for the rule object
- oneOf( rule ).setTimer( new IntervalTimer( null , null, TimeUtils.parseTimeString( "1h30m" ), 0 ) );
+ oneOf( rule ).setTimer( new IntervalTimer( null , null, -1, TimeUtils.parseTimeString( "1h30m" ), 0 ) );
oneOf( rule ).setCalendars( new String[] { "cal1", "cal2" } );
}
} );
Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/process/instance/timer/TimerManager.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/process/instance/timer/TimerManager.java 2009-12-11 05:29:46 UTC (rev 30587)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/process/instance/timer/TimerManager.java 2009-12-11 07:01:49 UTC (rev 30588)
@@ -46,6 +46,7 @@
new IntervalTrigger( timerService.getCurrentTime(),
null,
null,
+ -1,
timer.getDelay(),
timer.getPeriod(),
null,
@@ -83,6 +84,7 @@
new IntervalTrigger( timerService.getCurrentTime(),
null,
null,
+ -1,
delay,
timer.getPeriod(),
null,
Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/time/impl/CronTimer.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/time/impl/CronTimer.java 2009-12-11 05:29:46 UTC (rev 30587)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/time/impl/CronTimer.java 2009-12-11 07:01:49 UTC (rev 30588)
@@ -16,6 +16,7 @@
Externalizable {
private Date startTime;
private Date endTime;
+ private int repeatLimit;
private CronExpression cronExpression;
public CronTimer() {
@@ -24,9 +25,11 @@
public CronTimer(Date startTime,
Date endTime,
+ int repeatLimit,
CronExpression cronExpression) {
this.startTime = startTime;
this.endTime = endTime;
+ this.repeatLimit = repeatLimit;
this.cronExpression = cronExpression;
}
@@ -67,6 +70,7 @@
return new CronTrigger( timestamp,
this.startTime,
this.endTime,
+ this.repeatLimit,
this.cronExpression,
calendarNames,
calendars );
Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/time/impl/CronTrigger.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/time/impl/CronTrigger.java 2009-12-11 05:29:46 UTC (rev 30587)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/time/impl/CronTrigger.java 2009-12-11 07:01:49 UTC (rev 30588)
@@ -7,71 +7,93 @@
import org.drools.runtime.Calendars;
import org.drools.time.Trigger;
-public class CronTrigger implements Trigger {
-
+public class CronTrigger
+ implements
+ Trigger {
+
protected static final int YEAR_TO_GIVEUP_SCHEDULING_AT = 2299;
-
- private CronExpression cronEx = null;
- private Date startTime = null;
- private Date endTime = null;
- private Date nextFireTime = null;
- private Date previousFireTime = null;
- private transient TimeZone timeZone = null;
- private String[] calendarNames;
- private Calendars calendars;
-
-
- public CronTrigger(long timestamp, Date startTime, Date endTime, String cronExpression, String[] calendarNames, Calendars calendars) {
- this( timestamp, startTime, endTime, determineCronExpression( cronExpression ), calendarNames, calendars);
+
+ private CronExpression cronEx = null;
+ private Date startTime = null;
+ private Date endTime = null;
+ private int repeatLimit;
+ private int repeatCount;
+ private Date nextFireTime = null;
+ private Date previousFireTime = null;
+ private transient TimeZone timeZone = null;
+ private String[] calendarNames;
+ private Calendars calendars;
+
+ public CronTrigger(long timestamp,
+ Date startTime,
+ Date endTime,
+ int repeatLimit,
+ String cronExpression,
+ String[] calendarNames,
+ Calendars calendars) {
+ this( timestamp,
+ startTime,
+ endTime,
+ repeatLimit,
+ determineCronExpression( cronExpression ),
+ calendarNames,
+ calendars );
}
-
- public CronTrigger(long timestamp, Date startTime, Date endTime, CronExpression cronExpression, String[] calendarNames, Calendars calendars) {
- setCronExpression(cronExpression);
- if (startTime == null) {
- startTime = new Date(timestamp);
- }
- setStartTime(startTime);
+ public CronTrigger(long timestamp,
+ Date startTime,
+ Date endTime,
+ int repeatLimit,
+ CronExpression cronExpression,
+ String[] calendarNames,
+ Calendars calendars) {
+ setCronExpression( cronExpression );
- if (endTime != null) {
- setEndTime(endTime);
+ this.repeatLimit = repeatLimit;
+
+ if ( startTime == null ) {
+ startTime = new Date( timestamp );
}
- setTimeZone(TimeZone.getDefault());
-
+ setStartTime( startTime );
+
+ if ( endTime != null ) {
+ setEndTime( endTime );
+ }
+ setTimeZone( TimeZone.getDefault() );
+
// Set the first FireTime, this is sensitive to StartTime
- this.nextFireTime = new Date(timestamp - 1000l);
+ this.nextFireTime = new Date( timestamp - 1000l );
setFirstFireTimeAfter();
-
+
this.calendarNames = calendarNames;
this.calendars = calendars;
-
-
+
// Update to next include time, if we have calendars
- updateToNextIncludeDate( );
+ updateToNextIncludeDate();
}
-
+
public Date getStartTime() {
return this.startTime;
}
public void setStartTime(Date startTime) {
- if (startTime == null) {
- throw new IllegalArgumentException("Start time cannot be null");
+ if ( startTime == null ) {
+ throw new IllegalArgumentException( "Start time cannot be null" );
}
Date eTime = getEndTime();
- if (eTime != null && startTime != null && eTime.before(startTime)) {
- throw new IllegalArgumentException(
- "End time cannot be before start time");
+ if ( eTime != null && startTime != null && eTime.before( startTime ) ) {
+ throw new IllegalArgumentException( "End time cannot be before start time" );
}
-
+
// round off millisecond...
// Note timeZone is not needed here as parameter for
// Calendar.getInstance(),
// since time zone is implicit when using a Date in the setTime method.
Calendar cl = Calendar.getInstance();
- cl.setTime(startTime);
- cl.set(Calendar.MILLISECOND, 0);
+ cl.setTime( startTime );
+ cl.set( Calendar.MILLISECOND,
+ 0 );
this.startTime = cl.getTime();
}
@@ -90,9 +112,8 @@
public void setEndTime(Date endTime) {
Date sTime = getStartTime();
- if (sTime != null && endTime != null && sTime.after(endTime)) {
- throw new IllegalArgumentException(
- "End time cannot be before start time");
+ if ( sTime != null && endTime != null && sTime.after( endTime ) ) {
+ throw new IllegalArgumentException( "End time cannot be before start time" );
}
this.endTime = endTime;
@@ -158,15 +179,14 @@
* </p>
*/
public TimeZone getTimeZone() {
-
- if(cronEx != null) {
- return cronEx.getTimeZone();
+ if ( this.cronEx != null ) {
+ return this.cronEx.getTimeZone();
}
-
- if (timeZone == null) {
- timeZone = TimeZone.getDefault();
+
+ if ( this.timeZone == null ) {
+ this.timeZone = TimeZone.getDefault();
}
- return timeZone;
+ return this.timeZone;
}
/**
@@ -182,28 +202,29 @@
* String cron expression does not carry a time zone!
*/
public void setTimeZone(TimeZone timeZone) {
- if(cronEx != null) {
- cronEx.setTimeZone(timeZone);
+ if ( this.cronEx != null ) {
+ this.cronEx.setTimeZone( timeZone );
}
this.timeZone = timeZone;
}
-
+
public void setCronExpression(String cronExpression) {
- setCronExpression( determineCronExpression(cronExpression) );
- }
-
+ setCronExpression( determineCronExpression( cronExpression ) );
+ }
+
public void setCronExpression(CronExpression cronExpression) {
TimeZone origTz = getTimeZone();
this.cronEx = cronExpression;
- this.cronEx.setTimeZone(origTz);
- }
-
+ this.cronEx.setTimeZone( origTz );
+ }
+
public static CronExpression determineCronExpression(String cronExpression) {
try {
- return new CronExpression(cronExpression);
+ return new CronExpression( cronExpression );
} catch ( Exception e ) {
- throw new RuntimeException("Unable to parse cron expression '" + cronExpression + "'", e);
- }
+ throw new RuntimeException( "Unable to parse cron expression '" + cronExpression + "'",
+ e );
+ }
}
public Date hasNextFireTime() {
@@ -212,11 +233,16 @@
public Date nextFireTime() {
Date date = this.nextFireTime;
- this.nextFireTime = getTimeAfter(this.nextFireTime);
+ this.nextFireTime = getTimeAfter( this.nextFireTime );
updateToNextIncludeDate();
+ if ( this.endTime != null && this.nextFireTime.after( this.endTime ) ) {
+ this.nextFireTime = null;
+ } else if ( repeatLimit != -1 && repeatCount >= repeatLimit ) {
+ this.nextFireTime = null;
+ }
return date;
}
-
+
/**
* <p>
* Returns the next time at which the <code>CronTrigger</code> will fire,
@@ -230,26 +256,27 @@
* </p>
*/
public void setFirstFireTimeAfter() {
- if (getStartTime().after(this.nextFireTime)) {
- this.nextFireTime = new Date(getStartTime().getTime() - 1000l);
+ if ( getStartTime().after( this.nextFireTime ) ) {
+ this.nextFireTime = new Date( getStartTime().getTime() - 1000l );
}
- if (getEndTime() != null && (this.nextFireTime.compareTo(getEndTime()) >= 0)) {
- this.nextFireTime = null;
+ if ( getEndTime() != null && (this.nextFireTime.compareTo( getEndTime() ) >= 0) ) {
+ this.nextFireTime = null;
}
-
- Date pot = getTimeAfter(this.nextFireTime);
- if (getEndTime() != null && pot != null && pot.after(getEndTime())) {
+
+ Date pot = getTimeAfter( this.nextFireTime );
+ if ( getEndTime() != null && pot != null && pot.after( getEndTime() ) ) {
this.nextFireTime = null;
} else {
this.nextFireTime = pot;
}
}
-
+
protected Date getTimeAfter(Date afterTime) {
- return (cronEx == null) ? null : cronEx.getTimeAfter(afterTime);
- }
-
+ this.repeatCount++;
+ return (this.cronEx == null) ? null : this.cronEx.getTimeAfter( afterTime );
+ }
+
public void updateToNextIncludeDate() {
if ( calendarNames == null || calendarNames.length == 0 ) {
// There are no assigned calendars
@@ -257,7 +284,7 @@
}
// If we have calendars, check we can fire, or get next time until we can fire.
- while ( this.nextFireTime != null ) {
+ while ( this.nextFireTime != null && (this.endTime == null || this.nextFireTime.before( this.endTime )) ) {
// this will loop forever if the trigger repeats forever and
// included calendar position cannot be found
boolean included = true;
@@ -277,6 +304,6 @@
this.nextFireTime = getTimeAfter( this.nextFireTime );
}
}
- }
+ }
}
Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/time/impl/IntervalTimer.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/time/impl/IntervalTimer.java 2009-12-11 05:29:46 UTC (rev 30587)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/time/impl/IntervalTimer.java 2009-12-11 07:01:49 UTC (rev 30588)
@@ -15,6 +15,7 @@
Externalizable {
private Date startTime;
private Date endTime;
+ private int repeatLimit;
private long delay;
private long period;
@@ -24,10 +25,12 @@
public IntervalTimer(Date startTime,
Date endTime,
+ int repeatLimit,
long delay,
long period) {
this.startTime = startTime;
this.endTime = endTime;
+ this.repeatLimit = repeatLimit;
this.delay = delay;
this.period = period;
}
@@ -69,6 +72,7 @@
return new IntervalTrigger( timestamp,
this.startTime,
this.endTime,
+ this.repeatLimit,
this.delay,
this.period,
calendarNames,
Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/time/impl/IntervalTrigger.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/time/impl/IntervalTrigger.java 2009-12-11 05:29:46 UTC (rev 30587)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/time/impl/IntervalTrigger.java 2009-12-11 07:01:49 UTC (rev 30588)
@@ -15,12 +15,14 @@
public class IntervalTrigger
implements
Trigger {
- private Date startTime;
- private Date endTime;
- private Date nextFireTime;
- private long period;
- private String[] calendarNames;
- private Calendars calendars;
+ private Date startTime;
+ private Date endTime;
+ private int repeatLimit;
+ private int repeatCount;
+ private Date nextFireTime;
+ private long period;
+ private String[] calendarNames;
+ private Calendars calendars;
public IntervalTrigger() {
@@ -29,54 +31,57 @@
public IntervalTrigger(long timestamp,
Date startTime,
Date endTime,
+ int repeatLimit,
long delay,
long period,
String[] calendarNames,
Calendars calendars) {
this.period = period;
-
- if (startTime == null) {
- startTime = new Date(timestamp);
+
+ if ( startTime == null ) {
+ startTime = new Date( timestamp );
}
- setStartTime(startTime);
+ setStartTime( startTime );
+
+ if ( endTime != null ) {
+ setEndTime( endTime );
+ }
+
+ this.repeatLimit = repeatLimit;
- if (endTime != null) {
- setEndTime(endTime);
- }
-
this.calendarNames = calendarNames;
this.calendars = calendars;
-
+
this.nextFireTime = new Date( timestamp + delay );
-
+
setFirstFireTime();
-
+
// Update to next include time, if we have calendars
- updateToNextIncludeDate( );
+ updateToNextIncludeDate();
}
-
+
public Date getStartTime() {
return this.startTime;
- }
-
+ }
+
public void setStartTime(Date startTime) {
- if (startTime == null) {
- throw new IllegalArgumentException("Start time cannot be null");
+ if ( startTime == null ) {
+ throw new IllegalArgumentException( "Start time cannot be null" );
}
Date eTime = getEndTime();
- if (eTime != null && startTime != null && eTime.before(startTime)) {
- throw new IllegalArgumentException(
- "End time cannot be before start time");
+ if ( eTime != null && startTime != null && eTime.before( startTime ) ) {
+ throw new IllegalArgumentException( "End time cannot be before start time" );
}
-
+
// round off millisecond...
// Note timeZone is not needed here as parameter for
// Calendar.getInstance(),
// since time zone is implicit when using a Date in the setTime method.
Calendar cl = Calendar.getInstance();
- cl.setTime(startTime);
- cl.set(Calendar.MILLISECOND, 0);
+ cl.setTime( startTime );
+ cl.set( Calendar.MILLISECOND,
+ 0 );
this.startTime = cl.getTime();
}
@@ -95,42 +100,48 @@
public void setEndTime(Date endTime) {
Date sTime = getStartTime();
- if (sTime != null && endTime != null && sTime.after(endTime)) {
- throw new IllegalArgumentException(
- "End time cannot be before start time");
+ if ( sTime != null && endTime != null && sTime.after( endTime ) ) {
+ throw new IllegalArgumentException( "End time cannot be before start time" );
}
this.endTime = endTime;
}
-
+
public void setFirstFireTime() {
- if (getStartTime().after(this.nextFireTime)) {
- this.nextFireTime = new Date(getStartTime().getTime() - 1000l);
+ if ( getStartTime().after( this.nextFireTime ) ) {
+ this.nextFireTime = new Date( getStartTime().getTime() - 1000l );
}
- if (getEndTime() != null && (this.nextFireTime.compareTo(getEndTime()) >= 0)) {
+ if ( getEndTime() != null && (this.nextFireTime.compareTo( getEndTime() ) >= 0) ) {
this.nextFireTime = null;
}
-
+
Date pot = getTimeAfter();
- if (getEndTime() != null && pot != null && pot.after(getEndTime())) {
+ if ( getEndTime() != null && pot != null && pot.after( getEndTime() ) ) {
this.nextFireTime = null;
}
- }
+ }
public Date hasNextFireTime() {
return nextFireTime;
}
public Date nextFireTime() {
- Date date = nextFireTime;
+ Date date = this.nextFireTime;
// FIXME: this is not safe for serialization
this.nextFireTime = getTimeAfter();
updateToNextIncludeDate();
+ if ( this.endTime != null && this.nextFireTime.after( this.endTime ) ) {
+ this.nextFireTime = null;
+ } else if ( repeatLimit != -1 && repeatCount >= repeatLimit ) {
+ this.nextFireTime = null;
+ }
return date;
}
-
+
private Date getTimeAfter() {
+ this.repeatCount++;
+
Date date;
if ( this.period != 0 ) {
// repeated fires for the given period
@@ -151,7 +162,7 @@
out.writeObject( this.nextFireTime );
out.writeLong( this.period );
}
-
+
public void updateToNextIncludeDate() {
if ( calendarNames == null || calendarNames.length == 0 ) {
// There are no assigned calendars
@@ -159,7 +170,7 @@
}
// If we have calendars, check we can fire, or get next time until we can fire.
- while ( this.nextFireTime != null ) {
+ while ( this.nextFireTime != null && (this.endTime == null || this.nextFireTime.before( this.endTime )) ) {
// this will loop forever if the trigger repeats forever and
// included calendar position cannot be found
boolean included = true;
@@ -176,9 +187,8 @@
break;
} else {
// otherwise increase the time and try again
- this.nextFireTime = getTimeAfter( );
+ this.nextFireTime = getTimeAfter();
}
}
- }
-
+ }
}
\ No newline at end of file
Modified: labs/jbossrules/trunk/drools-core/src/test/java/org/drools/time/impl/CronJobTest.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/test/java/org/drools/time/impl/CronJobTest.java 2009-12-11 05:29:46 UTC (rev 30587)
+++ labs/jbossrules/trunk/drools-core/src/test/java/org/drools/time/impl/CronJobTest.java 2009-12-11 07:01:49 UTC (rev 30588)
@@ -23,7 +23,7 @@
timeService.advanceTime( date.getTime(), TimeUnit.MILLISECONDS );
- CronTrigger trigger = new CronTrigger(date.getTime(), null, null, "15 * * * * ?", null, null);
+ CronTrigger trigger = new CronTrigger(date.getTime(), null, null, -1, "15 * * * * ?", null, null);
HelloWorldJobContext ctx = new HelloWorldJobContext( "hello world", timeService);
timeService.scheduleJob( new HelloWorldJob(), ctx, trigger);
More information about the jboss-svn-commits
mailing list