[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