You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tomee.apache.org by xu...@apache.org on 2011/05/03 08:01:20 UTC

svn commit: r1098931 - 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: xuhaihong
Date: Tue May  3 06:01:20 2011
New Revision: 1098931

URL: http://svn.apache.org/viewvc?rev=1098931&view=rev
Log:
OPENEJB-1538 Miscellaneous improvements to EJBCronTrigger (Patch from Shawn Jiang)

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=1098931&r1=1098930&r2=1098931&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 Tue May  3 06:01:20 2011
@@ -32,6 +32,7 @@ import java.util.Map;
 import java.util.Set;
 import java.util.TimeZone;
 import java.util.Map.Entry;
+import java.util.TreeSet;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
 
@@ -51,7 +52,6 @@ public class EJBCronTrigger extends Trig
 	private static final Pattern LIST = Pattern.compile("(([A-Za-z0-9]+)(-[A-Za-z0-9]+)?)?((1ST|2ND|3RD|4TH|5TH|LAST)([A-za-z]+))?(-([0-7]+))?(LAST)?" +
 			"(?:,(([A-Za-z0-9]+)(-[A-Za-z0-9]+)?)?((1ST|2ND|3RD|4TH|5TH|LAST)([A-za-z]+))?(-([0-7]+))?(LAST)?)*");
 	
-	private static final Pattern RANGE = Pattern.compile("([A-Za-z0-9]+)-([A-Za-z0-9]+)");
 	private static final Pattern WEEKDAY = Pattern.compile("(1ST|2ND|3RD|4TH|5TH|LAST)(SUN|MON|TUE|WED|THU|FRI|SAT)");
 	private static final Pattern DAYS_TO_LAST = Pattern.compile("-([0-7]+)");
 	
@@ -63,14 +63,11 @@ public class EJBCronTrigger extends Trig
 	private static final Pattern VALID_MINUTE = Pattern.compile("([0-5]?[0-9])|\\*");
 	private static final Pattern VALID_SECOND = Pattern.compile("([0-5]?[0-9])|\\*");
 	
+    private static final Pattern RANGE = Pattern.compile("(-?[A-Za-z0-9]+)-(-?[A-Za-z0-9]+)");
 
 
 	private static final String LAST_IDENTIFIER = "LAST";
-	
-	private static final String RANGE_CHAR="-";
-	
-	private static final String INCREMENTS_CHAR="/";
-	
+    
     private static final Map<String, Integer> MONTHS_MAP = new HashMap<String, Integer>();
     private static final Map<String, Integer> WEEKDAYS_MAP = new HashMap<String, Integer>();
 
@@ -101,9 +98,6 @@ public class EJBCronTrigger extends Trig
         CALENDAR_FIELD_TYPE_ORDERED_INDEX_MAP.put(Calendar.MINUTE, 5);
         CALENDAR_FIELD_TYPE_ORDERED_INDEX_MAP.put(Calendar.SECOND, 6);
     }
-    
-    
-    
 
 	private final FieldExpression[] expressions = new FieldExpression[7];
 
@@ -201,7 +195,6 @@ public class EJBCronTrigger extends Trig
 		case Calendar.HOUR_OF_DAY:
 		case Calendar.MINUTE:
 		case Calendar.SECOND:
-		    	    
 			m = INCREMENTS.matcher(expr);
 			if (m.matches()) {
 				return new IncrementExpression(m, field);
@@ -224,11 +217,8 @@ public class EJBCronTrigger extends Trig
 			}
 			break;
 		}
-		
-       
 
 		m = LIST.matcher(expr);
-		
 		if (m.matches()) {
 			return new ListExpression(m, field);
 		}
@@ -239,18 +229,18 @@ public class EJBCronTrigger extends Trig
 	
 	private void validateExpression(int field, String expression) throws ParseException {
 	    
-
-        if (expression.length() > 2 && expression.indexOf(RANGE_CHAR) > 0) {
+	    Matcher rangeMatcher= RANGE.matcher(expression);
+        Matcher incrementsMatcher= INCREMENTS.matcher(expression);
+        
+        if (expression.length() > 2 && rangeMatcher.matches()) {
             
-            for (String sub_expression : expression.split(RANGE_CHAR)) {
-                validateSingleToken(field, sub_expression);
-            }
+                validateSingleToken(field, rangeMatcher.group(1));
+                validateSingleToken(field, rangeMatcher.group(2));
             
-        } else if (expression.length() > 2 && expression.indexOf(INCREMENTS_CHAR) > 0) {
+        } else if (expression.length() > 2 && incrementsMatcher.matches()) {
             
-            for (String sub_expression : expression.split(INCREMENTS_CHAR)) {
-                validateSingleToken(field, sub_expression);
-            }
+            validateSingleToken(field, incrementsMatcher.group(1));
+            validateSingleToken(field, incrementsMatcher.group(2));
             
         } else {
             
@@ -367,7 +357,7 @@ public class EJBCronTrigger extends Trig
 	@Override
 	public Date getFinalFireTime() {
 		Calendar calendar = new GregorianCalendar(timezone);
-		//calendar.setLenient(false);
+        //calendar.setLenient(false);
 		calendar.setFirstDayOfWeek(Calendar.SUNDAY);
 
 		if (endTime == null) {
@@ -426,7 +416,7 @@ public class EJBCronTrigger extends Trig
 	@Override
 	public Date getFireTimeAfter(Date afterTime) {
 		Calendar calendar = new GregorianCalendar(timezone);
-		// calendar.setLenient(false);
+        // calendar.setLenient(false);
 		calendar.setFirstDayOfWeek(Calendar.SUNDAY);
 
 		// Calculate starting time
@@ -601,9 +591,7 @@ public class EJBCronTrigger extends Trig
 
 	public static class ParseException extends Exception {
 
-
-
-        private final Map<Integer, ParseException> children;
+		private final Map<Integer, ParseException> children;
 		private final Integer field;
 		private final String value;
 		private final String error;
@@ -650,11 +638,9 @@ public class EJBCronTrigger extends Trig
 
 		protected static final Calendar CALENDAR = new GregorianCalendar(Locale.US); // For getting min/max field values
 
-	   
+       
 
 		protected static int convertValue(String value, int field) throws ParseException {
-		    
-		    
 			// If the value begins with a digit, parse it as a number
 			if (Character.isDigit(value.charAt(0))) {
 				int numValue;
@@ -730,9 +716,29 @@ public class EJBCronTrigger extends Trig
 
 	private static class RangeExpression extends FieldExpression {
 
-		private final int start;
-		private final int end;
-		private int start2;
+        private int start;
+        private int end;
+        private int start2 = -1;
+
+        private String startWeekDay;
+        private String endWeekDay;
+        
+        
+        private WeekdayExpression startWeekdayExpr = null;
+        private WeekdayExpression endWeekdayExpr = null;
+        
+        private DaysFromLastDayExpression startDaysFromLastDayExpr = null;
+        private DaysFromLastDayExpression endDaysFromLastDayExpr = null;
+        
+        
+        
+        //Indicate if the range expression is for "1st mon - 2nd fri" style range of days of month.
+        private boolean isDynamicRangeExpression = false;
+
+
+        public boolean isDynamicRangeExpression() {
+            return isDynamicRangeExpression;
+        }
 
         public RangeExpression(int field, int start, int end, int start2) {
             super(field);
@@ -742,14 +748,92 @@ public class EJBCronTrigger extends Trig
         }
 
 		public RangeExpression(Matcher m, int field) throws ParseException {
+            
 			super(field);
-			int beginValue = convertValue(m.group(1));
-            if (m.group(2).equals(LAST_IDENTIFIER)) {
+            
+            startWeekDay = m.group(1);
+            endWeekDay = m.group(2);
+            
+            
+            if (field == Calendar.DAY_OF_MONTH) {
+                
+                Matcher startWeekDayMatcher = WEEKDAY.matcher(m.group(1));
+                Matcher endWeekDayMatcher = WEEKDAY.matcher(m.group(2));
+                
+                Matcher startDaysFromLastDayMatcher = DAYS_TO_LAST.matcher(m.group(1));
+                Matcher endDaysFromLastDayMatcher = DAYS_TO_LAST.matcher(m.group(2));
+                
+                if (startWeekDayMatcher.matches()) {
+                    startWeekdayExpr = new WeekdayExpression(startWeekDayMatcher);
+
+                } 
+                
+                if (endWeekDayMatcher.matches()) {
+                    endWeekdayExpr = new WeekdayExpression(endWeekDayMatcher);
+                } 
+                
+                if (startDaysFromLastDayMatcher.matches()) {
+                    startDaysFromLastDayExpr = new DaysFromLastDayExpression(startDaysFromLastDayMatcher);
+                } 
+                
+                if (endDaysFromLastDayMatcher.matches()) {
+                    endDaysFromLastDayExpr = new DaysFromLastDayExpression(endDaysFromLastDayMatcher);
+                } 
+                
+
+                if (startWeekdayExpr != null || endWeekdayExpr != null || startDaysFromLastDayExpr != null
+                        || endDaysFromLastDayExpr != null || startWeekDay.equals(LAST_IDENTIFIER)|| endWeekDay.equals(LAST_IDENTIFIER)) {
+                    
+                    isDynamicRangeExpression = true;
+                    return;
+                }
+                
+            }
+            
+            //not a dynamic range expression, go ahead to init start and end values without a calendar
+            initStartEndValues(null);
+           
+            
+         }
+        
+        private void initStartEndValues(Calendar calendar) throws ParseException{
+            
+            int beginValue;
+            int endValue;
+            
+            if(isDynamicRangeExpression){
+                
+                if (startWeekDay.equals(LAST_IDENTIFIER)) {
+                    beginValue = calendar.getActualMaximum(field);
+                } else if (startWeekdayExpr != null) {
+                    beginValue = startWeekdayExpr.getWeekdayInMonth(calendar);
+                } else if (startDaysFromLastDayExpr != null) {
+                    beginValue = startDaysFromLastDayExpr.getNextValue(calendar);
+                } else {
+                    beginValue = convertValue(startWeekDay);
+                }
+
+                if (endWeekDay.equals(LAST_IDENTIFIER)) {
+                    endValue = calendar.getActualMaximum(field);
+                } else if (endWeekdayExpr != null) {
+                    endValue = endWeekdayExpr.getWeekdayInMonth(calendar);
+                } else if (endDaysFromLastDayExpr != null) {
+                    endValue = endDaysFromLastDayExpr.getNextValue(calendar);
+                } else {
+                    endValue = convertValue(endWeekDay);
+                }
+                
+            } else {
+                beginValue=convertValue(startWeekDay);
+                endValue=convertValue(endWeekDay);
+            }
+            
+            // Try converting a textual value to numeric
+            if (endWeekDay.equals(LAST_IDENTIFIER)) {
                 start = -1;
                 end = -1;
                 start2= beginValue;
             } else {
-                int endValue = convertValue(m.group(2));
                 if (beginValue > endValue) {
                     start = CALENDAR.getMinimum(field);
                     end = endValue;
@@ -757,13 +841,34 @@ public class EJBCronTrigger extends Trig
                 } else {
                     start = beginValue;
                     end = endValue;
-                    start2 = -1;
                 }
             }
 		}
 
+
         @Override
         public Integer getNextValue(Calendar calendar) {
+            
+            if (isDynamicRangeExpression){
+                
+                Integer nextStartWeekday = startWeekdayExpr == null ? start : startWeekdayExpr
+                        .getWeekdayInMonth(calendar);
+                
+                Integer nextendWeekday = endWeekdayExpr == null ? end : endWeekdayExpr.
+                        getWeekdayInMonth(calendar);
+                
+                if (nextStartWeekday == null || nextendWeekday == null) {
+                    return null;
+                }
+                
+                try {
+                    initStartEndValues(calendar);
+                } catch (ParseException e) {
+                    return null;
+                }
+            }
+            
+            
             int currValue = calendar.get(field);
             if (start2 != -1) {
                 if (currValue >= start2) {
@@ -783,6 +888,16 @@ public class EJBCronTrigger extends Trig
 
 		@Override
 		public Integer getPreviousValue(Calendar calendar) {
+            
+            if (isDynamicRangeExpression){
+                try {
+                    initStartEndValues(calendar);
+                } catch (ParseException e) {
+                    return null;
+                }
+             }
+            
+            
 		    int currValue = calendar.get(field);
             if (start2 != -1) {
                 if (currValue >= start2) {
@@ -797,21 +912,50 @@ public class EJBCronTrigger extends Trig
                 return end;
             }
 		}
-	}
 
+       public List<Integer> getAllValuesInRange(Calendar calendar){
+           
+           List<Integer> values=new ArrayList<Integer>();
+           
+           if (isDynamicRangeExpression){
+               try {
+                   initStartEndValues(calendar);
+               } catch (ParseException e) {
+                  return values;
+               }
+            }
+           
+            if (start2==-1) {
+                for (int i = start; i <= end; i++) {
+                    values.add(i);
+                }
+            } else {
+
+                for (int i = start; i <= end; i++) {
+                    values.add(i);
+                }
+                for (int i = start2; i <= CALENDAR.getMaximum(field); i++) {
+                    values.add(i);
+                }
+            }
+            
+            return values;
+       }
+        
+    }
 	/*
 	 * Just find that it is hard to keep those ranges in the list are not overlapped.
 	 * The easy way is to list all the values, also we keep a range expression if user defines a LAST expression, e.g. 12-LAST
 	 */
 	private static class ListExpression extends FieldExpression {
 
-		private List<Integer> values;
+        private final Set<Integer> values = new TreeSet<Integer>();
 
-		private RangeExpression rangeExpression;
+        private final List<RangeExpression> weekDayRangeExpressions = new ArrayList<RangeExpression>();
 		
-		private List<WeekdayExpression> weekDayExpressions = new ArrayList<WeekdayExpression>();
+        private final List<WeekdayExpression> weekDayExpressions = new ArrayList<WeekdayExpression>();
 		
-		private List<DaysFromLastDayExpression> daysFromLastDayExpressions = new ArrayList<DaysFromLastDayExpression>();;
+        private final List<DaysFromLastDayExpression> daysFromLastDayExpressions = new ArrayList<DaysFromLastDayExpression>();;
 
 		public ListExpression(Matcher m, int field) throws ParseException {
 			super(field);
@@ -819,98 +963,52 @@ public class EJBCronTrigger extends Trig
 		}
 
         private void initialize(Matcher m) throws ParseException {
-            Set<Integer> individualValues = new HashSet<Integer>();
+            
             for (String value : m.group().split("[,]")) {
+                
                 Matcher rangeMatcher = RANGE.matcher(value);
                 Matcher weekDayMatcher = WEEKDAY.matcher(value);
                 Matcher daysToLastMatcher = DAYS_TO_LAST.matcher(value);
+                
                 if (value.equals(LAST_IDENTIFIER)) {
                     daysFromLastDayExpressions.add(new DaysFromLastDayExpression());
-                }else if(daysToLastMatcher.matches()){
+                    continue;
+                } else if(daysToLastMatcher.matches()){
                     daysFromLastDayExpressions.add(new DaysFromLastDayExpression(daysToLastMatcher));
+                    continue;
                 } else if (weekDayMatcher.matches()){
                     weekDayExpressions.add(new WeekdayExpression(weekDayMatcher));
                     continue;
                 } else if (rangeMatcher.matches()) {
-                    int rangeBeginIndex = -1;
-                    int beginValue = convertValue(rangeMatcher.group(1));
-                    if (rangeMatcher.group(2).equals(LAST_IDENTIFIER)) {
-                        rangeBeginIndex = beginValue;
-                    } else {
-                        int endValue = convertValue(rangeMatcher.group(2));
-                        if (beginValue <= endValue) {
-                            for (int i = beginValue; i <= endValue; i++) {
-                                individualValues.add(i);
-                            }
-                        } else {
-                            rangeBeginIndex = beginValue;
-                            for (int i = CALENDAR.getMinimum(field); i <= endValue; i++) {
-                                individualValues.add(i);
-                            }
-                        }
-                    }
-                    if(rangeBeginIndex != -1) {
-                        if(rangeExpression == null) {
-                            rangeExpression = new RangeExpression(field, -1,-1, rangeBeginIndex);
-                        } else {
-                            if(rangeBeginIndex < rangeExpression.start2) {
-                                for(int i = rangeExpression.start2; i< rangeBeginIndex; i++) {
-                                    individualValues.add(i);
-                                }
-                                rangeExpression.start2 = rangeBeginIndex;
-                            }
-                        }
+                    
+                    RangeExpression rangeExpression= new RangeExpression(rangeMatcher,field);
+                    
+                    if (rangeExpression.isDynamicRangeExpression()){
+                        weekDayRangeExpressions.add(new RangeExpression(rangeMatcher,field));
+                        continue;
                     }
+                    
+                    values.addAll(rangeExpression.getAllValuesInRange(null));
+                    
                 } else {
                     int individualValue = convertValue(value);
-                    if(rangeExpression == null ||  individualValue < rangeExpression.start2) {
-                        individualValues.add(individualValue);
-                    }
+                    values.add(individualValue);
                 }
             }
-            //Add individualValues in to values list;
-            //Double check whether those individual values are included in the range
-            values = new ArrayList<Integer>(individualValues.size());
-            if (rangeExpression != null) {
-                for (Integer individualValue : individualValues) {
-                    if (individualValue < rangeExpression.start2) {
-                        values.add(individualValue);
-                    }
-                }
-            } else {
-                values.addAll(individualValues);
-            }
-            Collections.sort(values);
+            
         }
         
-        private List<Integer> getNewValuesFromDynamicExpressions(Calendar calendar){
-            
-            List<Integer> newValues = new ArrayList<Integer>(values.size() + weekDayExpressions.size());
+        private TreeSet<Integer> getNewValuesFromDynamicExpressions(Calendar calendar){
             
-            if (rangeExpression != null) {
-                for (Integer value : values) {
-                    if (value < rangeExpression.start2) {
-                        newValues.add(value);
-                    }
-                }
+            TreeSet<Integer> newValues = new TreeSet<Integer>();
+
+                newValues.addAll(values);
                 
-                for (WeekdayExpression weekdayExpression : weekDayExpressions) {
-                    Integer value=weekdayExpression.getNextValue(calendar);
-                    if (value != null && value < rangeExpression.start2) {
-                        newValues.add(value);
-                    }
+                for (RangeExpression weekDayRangeExpression : weekDayRangeExpressions) {
+                    
+                        newValues.addAll(weekDayRangeExpression.getAllValuesInRange(calendar));
                 }
                 
-                for (DaysFromLastDayExpression daysFromLastDayExpression : daysFromLastDayExpressions) {
-                    Integer value=daysFromLastDayExpression.getNextValue(calendar);
-                    if (value != null && value < rangeExpression.start2) {
-                        newValues.add(value);
-                    }
-                }
-
-
-            } else {
-                newValues.addAll(values);
                 for (WeekdayExpression weekdayExpression : weekDayExpressions) {
                     Integer value=weekdayExpression.getNextValue(calendar);
                     if (value != null) {
@@ -925,11 +1023,6 @@ public class EJBCronTrigger extends Trig
                     }
                 }
                 
-            }
-
-            if (newValues.size() > 0) {
-                Collections.sort(newValues);
-            }
 
             return newValues;
             
@@ -938,40 +1031,22 @@ public class EJBCronTrigger extends Trig
 		@Override
 		public Integer getNextValue(Calendar calendar) {
 		    
-		    List<Integer> newValues= getNewValuesFromDynamicExpressions(calendar);
+		    TreeSet<Integer> newValues= getNewValuesFromDynamicExpressions(calendar);
 		    
 			int currValue = calendar.get(field);
-			for (Integer day : newValues) {
-				if (day >= currValue) {
-					return day;
-				}
-			}
-			if(rangeExpression != null) {
-			    return rangeExpression.getNextValue(calendar);
-			}
-			return null;
+			
+			return newValues.ceiling(currValue);
+			
 		}
 
 		@Override
 		public Integer getPreviousValue(Calendar calendar) {
-		    if(rangeExpression != null) {
-		        Integer previousValue = rangeExpression.getPreviousValue(calendar);
-		        if(previousValue != null) {
-		            return previousValue;
-		        }
-		    }
 		    
-		    List<Integer> newValues= getNewValuesFromDynamicExpressions(calendar);
+		    TreeSet<Integer> newValues= getNewValuesFromDynamicExpressions(calendar);
 		    
 			int currValue = calendar.get(field);
-			ListIterator<Integer> iterator = newValues.listIterator(newValues.size());
-			while (iterator.hasPrevious()) {
-				int day = iterator.previous();
-				if (day <= currValue) {
-					return day;
-				}
-			}
-			return null;
+            
+			return newValues.floor(currValue);
 		}
 	}
 
@@ -1013,7 +1088,6 @@ public class EJBCronTrigger extends Trig
 	}
 
 	private static class WeekdayExpression extends FieldExpression {
-
 		private final Integer ordinal; // null means last
 		private final int weekday;
 
@@ -1027,12 +1101,12 @@ public class EJBCronTrigger extends Trig
 		@Override
 		public Integer getNextValue(Calendar calendar) {
 			int currDay = calendar.get(Calendar.DAY_OF_MONTH);
-			Integer nthDay = getPreviousValue(calendar);
+            Integer nthDay = getWeekdayInMonth(calendar);
 			return nthDay != null && nthDay >= currDay ? nthDay : null;
 		}
-
-		@Override
-		public Integer getPreviousValue(Calendar calendar) {
+        
+        public Integer getWeekdayInMonth(Calendar calendar){
+            
 			int currDay = calendar.get(Calendar.DAY_OF_MONTH);
 			int currWeekday = calendar.get(Calendar.DAY_OF_WEEK);
 			int maxDay = calendar.getActualMaximum(Calendar.DAY_OF_MONTH);
@@ -1050,6 +1124,15 @@ public class EJBCronTrigger extends Trig
 
 			// Return the calculated day, or null if the day is out of range
 			return nthDay <= maxDay ? nthDay : null;
+        }
+
+        @Override
+        public Integer getPreviousValue(Calendar calendar) {
+            
+              int currDay = calendar.get(Calendar.DAY_OF_MONTH);
+              Integer nthDay = getWeekdayInMonth(calendar);
+              return nthDay != null && nthDay <= currDay ? nthDay : null;
+        
 		}
 
 	}

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=1098931&r1=1098930&r2=1098931&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 Tue May  3 06:01:20 2011
@@ -33,7 +33,7 @@ import org.junit.Test;
 
 public class EJBCronTriggerTest {
 
-	@Test(timeout = 1000000)
+	@Test(timeout = 1000)
 	public void testSimpleDate() throws ParseException {
 		ScheduleExpression expr = new ScheduleExpression().year(2008).month(12).dayOfMonth(1).start(new Date(0));
 		EJBCronTrigger trigger = new EJBCronTrigger(expr);
@@ -148,11 +148,12 @@ public class EJBCronTriggerTest {
         assertEquals(new GregorianCalendar(2000,1,27,23,1,59).getTime(), trigger.getFireTimeAfter(new GregorianCalendar(2000, 1, 26, 0, 0, 0).getTime()));
     }
 
-	@Test(timeout = 5000000)
+	@Test(timeout = 5000)
     public void testOrdinalNumbersDayOfMonth() throws ParseException {
         ScheduleExpression expr = new ScheduleExpression().dayOfMonth("2nd mon").hour(23).minute(1).second(59).start(new Date(0));
         EJBCronTrigger trigger = new EJBCronTrigger(expr);
-        assertEquals(new GregorianCalendar(2010, 6, 12, 23, 1, 59).getTime(), trigger.getFireTimeAfter(new GregorianCalendar(2010, 6, 1, 0, 0, 0).getTime()));
+        assertEquals(new GregorianCalendar(2011, 4, 9, 23, 1, 59).getTime(), trigger.getFireTimeAfter(new GregorianCalendar(2011, 4, 1, 0, 0, 0).getTime()));
+        assertEquals(new GregorianCalendar(2011, 5, 13, 23, 1, 59).getTime(), trigger.getFireTimeAfter(new GregorianCalendar(2011, 4, 10, 0, 0, 0).getTime()));
     }
 
 
@@ -178,20 +179,21 @@ public class EJBCronTriggerTest {
         assertEquals(new GregorianCalendar(2010, 6, 28, 23, 1, 59).getTime(), trigger.getFireTimeAfter(new GregorianCalendar(2010, 6, 27, 23, 2, 0).getTime()));
     }
 	
-    @Test(timeout = 5000000)
+    @Test(timeout = 500)
     public void testRangeCDayOfMonth() throws ParseException {
-        ScheduleExpression expr = new ScheduleExpression().dayOfMonth("Last Fri - 1st Mon").hour(23).minute(1).second(59).start(new Date(0));
+        //7-27
+        ScheduleExpression expr = new ScheduleExpression().dayOfMonth("1st Sat - 4th FRI").hour(23).minute(1).second(59).start(new Date(0));
         EJBCronTrigger trigger = new EJBCronTrigger(expr);
-        assertEquals(new GregorianCalendar(2010, 6, 1, 23, 1, 59).getTime(), trigger.getFireTimeAfter(new GregorianCalendar(2010, 6, 1, 23, 0, 0).getTime()));
-        assertEquals(new GregorianCalendar(2010, 6, 2, 23, 1, 59).getTime(), trigger.getFireTimeAfter(new GregorianCalendar(2010, 6, 1, 23, 2, 0).getTime()));
-        assertEquals(new GregorianCalendar(2010, 6, 27, 23, 1, 59).getTime(), trigger.getFireTimeAfter(new GregorianCalendar(2010, 6, 26, 23, 0, 0).getTime()));
-        assertEquals(new GregorianCalendar(2010, 6, 27, 23, 1, 59).getTime(), trigger.getFireTimeAfter(new GregorianCalendar(2010, 6, 27, 23, 0, 0).getTime()));
-        assertEquals(new GregorianCalendar(2010, 6, 28, 23, 1, 59).getTime(), trigger.getFireTimeAfter(new GregorianCalendar(2010, 6, 27, 23, 2, 0).getTime()));
+        assertEquals(new GregorianCalendar(2011, 4, 7, 23, 1, 59).getTime(), trigger.getFireTimeAfter(new GregorianCalendar(2011, 4, 1, 23, 0, 0).getTime()));
+        assertEquals(new GregorianCalendar(2011, 4, 9, 23, 1, 59).getTime(), trigger.getFireTimeAfter(new GregorianCalendar(2011, 4, 8, 23, 2, 0).getTime()));
+        assertEquals(new GregorianCalendar(2011, 4, 18, 23, 1, 59).getTime(), trigger.getFireTimeAfter(new GregorianCalendar(2011, 4, 18, 23, 0, 0).getTime()));
+        assertEquals(new GregorianCalendar(2011, 4, 27, 23, 1, 59).getTime(), trigger.getFireTimeAfter(new GregorianCalendar(2011, 4, 26, 23, 3, 0).getTime()));
+        assertEquals(new GregorianCalendar(2011, 5, 4, 23, 1, 59).getTime(), trigger.getFireTimeAfter(new GregorianCalendar(2011, 4, 28, 23, 3, 0).getTime()));
     }	
 	
 	
 
-	@Test(timeout = 5000)
+	@Test(timeout = 500)
     public void testRangeADayOfWeek() throws ParseException {
         ScheduleExpression expr = new ScheduleExpression().dayOfWeek("tue-fri").hour(23).minute(1).second(59).start(new Date(0));
         EJBCronTrigger trigger = new EJBCronTrigger(expr);
@@ -307,23 +309,6 @@ public class EJBCronTriggerTest {
 	}
 	
 	
-	@Test(timeout = 50000000)
-    public void testInvalidSingleInputs1() throws ParseException {
-    
-    // invalid  hour
-    ScheduleExpression expr = new ScheduleExpression().dayOfMonth(6).hour("24/1").minute(1).second(59).start(new Date(0));
-    boolean parseExceptionThrown = false;
-    
-    try {
-        new EJBCronTrigger(expr);
-    } catch (ParseException e){
-        parseExceptionThrown=true;
-    }
-    assertTrue(parseExceptionThrown);
-    
-    
-    }
-	
 	
 	@Test(timeout = 500)
     public void testInvalidSingleInputs() throws ParseException {