From 7e626ea2193d39217fa7321a865bfab014c5ea69 Mon Sep 17 00:00:00 2001 From: 疯狂的狮子Li <15040126243@163.com> Date: 星期日, 22 五月 2022 13:07:36 +0800 Subject: [PATCH] update xxl-job 2.3.0 => 2.3.1 --- ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/core/cron/CronExpression.java | 419 ++++++++++++++++++++++++++++++----------------------------- 1 files changed, 215 insertions(+), 204 deletions(-) diff --git a/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/core/cron/CronExpression.java b/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/core/cron/CronExpression.java index fce2352..2ce373e 100644 --- a/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/core/cron/CronExpression.java +++ b/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/core/cron/CronExpression.java @@ -1,18 +1,18 @@ /* * All content copyright Terracotta, Inc., unless otherwise indicated. All rights reserved. - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not - * use this file except in compliance with the License. You may obtain a copy - * of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not + * use this file except in compliance with the License. You may obtain a copy + * of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations * under the License. - * + * */ package com.xxl.job.admin.core.cron; @@ -31,14 +31,14 @@ import java.util.TreeSet; /** - * Provides a parser and evaluator for unix-like cron expressions. Cron + * Provides a parser and evaluator for unix-like cron expressions. Cron * expressions provide the ability to specify complex time combinations such as - * "At 8:00am every Monday through Friday" or "At 1:30am every - * last Friday of the month". + * "At 8:00am every Monday through Friday" or "At 1:30am every + * last Friday of the month". * <P> * Cron expressions are comprised of 6 required fields and one optional field * separated by white space. The fields respectively are described as follows: - * + * * <table cellspacing="8"> * <tr> * <th align="left">Field Name</th> @@ -98,7 +98,7 @@ * </tr> * </table> * <P> - * The '*' character is used to specify all values. For example, "*" + * The '*' character is used to specify all values. For example, "*" * in the minute field means "every minute". * <P> * The '?' character is allowed for the day-of-month and day-of-week fields. It @@ -113,55 +113,55 @@ * Wednesday, and Friday". * <P> * The '/' character is used to specify increments. For example "0/15" - * in the seconds field means "the seconds 0, 15, 30, and 45". And + * in the seconds field means "the seconds 0, 15, 30, and 45". And * "5/15" in the seconds field means "the seconds 5, 20, 35, and * 50". Specifying '*' before the '/' is equivalent to specifying 0 is * the value to start with. Essentially, for each field in the expression, there - * is a set of numbers that can be turned on or off. For seconds and minutes, + * is a set of numbers that can be turned on or off. For seconds and minutes, * the numbers range from 0 to 59. For hours 0 to 23, for days of the month 0 to * 31, and for months 0 to 11 (JAN to DEC). The "/" character simply helps you turn * on every "nth" value in the given set. Thus "7/6" in the - * month field only turns on month "7", it does NOT mean every 6th - * month, please note that subtlety. + * month field only turns on month "7", it does NOT mean every 6th + * month, please note that subtlety. * <P> * The 'L' character is allowed for the day-of-month and day-of-week fields. - * This character is short-hand for "last", but it has different - * meaning in each of the two fields. For example, the value "L" in - * the day-of-month field means "the last day of the month" - day 31 - * for January, day 28 for February on non-leap years. If used in the - * day-of-week field by itself, it simply means "7" or + * This character is short-hand for "last", but it has different + * meaning in each of the two fields. For example, the value "L" in + * the day-of-month field means "the last day of the month" - day 31 + * for January, day 28 for February on non-leap years. If used in the + * day-of-week field by itself, it simply means "7" or * "SAT". But if used in the day-of-week field after another value, it * means "the last xxx day of the month" - for example "6L" - * means "the last friday of the month". You can also specify an offset - * from the last day of the month, such as "L-3" which would mean the third-to-last - * day of the calendar month. <i>When using the 'L' option, it is important not to + * means "the last friday of the month". You can also specify an offset + * from the last day of the month, such as "L-3" which would mean the third-to-last + * day of the calendar month. <i>When using the 'L' option, it is important not to * specify lists, or ranges of values, as you'll get confusing/unexpected results.</i> * <P> - * The 'W' character is allowed for the day-of-month field. This character - * is used to specify the weekday (Monday-Friday) nearest the given day. As an - * example, if you were to specify "15W" as the value for the + * The 'W' character is allowed for the day-of-month field. This character + * is used to specify the weekday (Monday-Friday) nearest the given day. As an + * example, if you were to specify "15W" as the value for the * day-of-month field, the meaning is: "the nearest weekday to the 15th of - * the month". So if the 15th is a Saturday, the trigger will fire on + * the month". So if the 15th is a Saturday, the trigger will fire on * Friday the 14th. If the 15th is a Sunday, the trigger will fire on Monday the - * 16th. If the 15th is a Tuesday, then it will fire on Tuesday the 15th. + * 16th. If the 15th is a Tuesday, then it will fire on Tuesday the 15th. * However if you specify "1W" as the value for day-of-month, and the - * 1st is a Saturday, the trigger will fire on Monday the 3rd, as it will not - * 'jump' over the boundary of a month's days. The 'W' character can only be + * 1st is a Saturday, the trigger will fire on Monday the 3rd, as it will not + * 'jump' over the boundary of a month's days. The 'W' character can only be * specified when the day-of-month is a single day, not a range or list of days. * <P> - * The 'L' and 'W' characters can also be combined for the day-of-month - * expression to yield 'LW', which translates to "last weekday of the + * The 'L' and 'W' characters can also be combined for the day-of-month + * expression to yield 'LW', which translates to "last weekday of the * month". * <P> * The '#' character is allowed for the day-of-week field. This character is - * used to specify "the nth" XXX day of the month. For example, the - * value of "6#3" in the day-of-week field means the third Friday of - * the month (day 6 = Friday and "#3" = the 3rd one in the month). - * Other examples: "2#1" = the first Monday of the month and + * used to specify "the nth" XXX day of the month. For example, the + * value of "6#3" in the day-of-week field means the third Friday of + * the month (day 6 = Friday and "#3" = the 3rd one in the month). + * Other examples: "2#1" = the first Monday of the month and * "4#5" = the fifth Wednesday of the month. Note that if you specify * "#5" and there is not 5 of the given day-of-week in the month, then * no firing will occur that month. If the '#' character is used, there can - * only be one expression in the day-of-week field ("3#1,6#3" is + * only be one expression in the day-of-week field ("3#1,6#3" is * not valid, since there are two expressions). * <P> * <!--The 'C' character is allowed for the day-of-month and day-of-week fields. @@ -174,35 +174,33 @@ * <P> * The legal characters and the names of months and days of the week are not * case sensitive. - * + * * <p> * <b>NOTES:</b> * <ul> * <li>Support for specifying both a day-of-week and a day-of-month value is * not complete (you'll need to use the '?' character in one of these fields). * </li> - * <li>Overflowing ranges is supported - that is, having a larger number on - * the left hand side than the right. You might do 22-2 to catch 10 o'clock - * at night until 2 o'clock in the morning, or you might have NOV-FEB. It is - * very important to note that overuse of overflowing ranges creates ranges - * that don't make sense and no effort has been made to determine which - * interpretation CronExpression chooses. An example would be + * <li>Overflowing ranges is supported - that is, having a larger number on + * the left hand side than the right. You might do 22-2 to catch 10 o'clock + * at night until 2 o'clock in the morning, or you might have NOV-FEB. It is + * very important to note that overuse of overflowing ranges creates ranges + * that don't make sense and no effort has been made to determine which + * interpretation CronExpression chooses. An example would be * "0 0 14-6 ? * FRI-MON". </li> * </ul> * </p> - * - * + * * @author Sharada Jambula, James House * @author Contributions from Mads Henderson * @author Refactoring from CronTrigger to CronExpression by Aaron Craven - * + * <p> * Borrowed from quartz v2.3.1 - * */ public final class CronExpression implements Serializable, Cloneable { private static final long serialVersionUID = 12423409423L; - + protected static final int SECOND = 0; protected static final int MINUTE = 1; protected static final int HOUR = 2; @@ -214,9 +212,10 @@ protected static final int NO_SPEC_INT = 98; // '?' protected static final Integer ALL_SPEC = ALL_SPEC_INT; protected static final Integer NO_SPEC = NO_SPEC_INT; - + protected static final Map<String, Integer> monthMap = new HashMap<String, Integer>(20); protected static final Map<String, Integer> dayMap = new HashMap<String, Integer>(60); + static { monthMap.put("JAN", 0); monthMap.put("FEB", 1); @@ -256,35 +255,33 @@ protected transient boolean nearestWeekday = false; protected transient int lastdayOffset = 0; protected transient boolean expressionParsed = false; - + public static final int MAX_YEAR = Calendar.getInstance().get(Calendar.YEAR) + 100; /** - * Constructs a new <CODE>CronExpression</CODE> based on the specified + * Constructs a new <CODE>CronExpression</CODE> based on the specified * parameter. - * + * * @param cronExpression String representation of the cron expression the * new object should represent - * @throws java.text.ParseException - * if the string expression cannot be parsed into a valid - * <CODE>CronExpression</CODE> + * @throws ParseException if the string expression cannot be parsed into a valid + * <CODE>CronExpression</CODE> */ public CronExpression(String cronExpression) throws ParseException { if (cronExpression == null) { throw new IllegalArgumentException("cronExpression cannot be null"); } - + this.cronExpression = cronExpression.toUpperCase(Locale.US); - + buildExpression(this.cronExpression); } - + /** * Constructs a new {@code CronExpression} as a copy of an existing * instance. - * - * @param expression - * The existing cron expression to be copied + * + * @param expression The existing cron expression to be copied */ public CronExpression(CronExpression expression) { /* @@ -307,28 +304,28 @@ * Indicates whether the given date satisfies the cron expression. Note that * milliseconds are ignored, so two Dates falling on different milliseconds * of the same second will always have the same result here. - * + * * @param date the date to evaluate * @return a boolean indicating whether the given date satisfies the cron - * expression + * expression */ public boolean isSatisfiedBy(Date date) { Calendar testDateCal = Calendar.getInstance(getTimeZone()); testDateCal.setTime(date); testDateCal.set(Calendar.MILLISECOND, 0); Date originalDate = testDateCal.getTime(); - + testDateCal.add(Calendar.SECOND, -1); - + Date timeAfter = getTimeAfter(testDateCal.getTime()); return ((timeAfter != null) && (timeAfter.equals(originalDate))); } - + /** * Returns the next date/time <I>after</I> the given date/time which * satisfies the cron expression. - * + * * @param date the date/time at which to begin the search for the next valid * date/time * @return the next valid date/time @@ -336,48 +333,48 @@ public Date getNextValidTimeAfter(Date date) { return getTimeAfter(date); } - + /** * Returns the next date/time <I>after</I> the given date/time which does * <I>not</I> satisfy the expression - * - * @param date the date/time at which to begin the search for the next + * + * @param date the date/time at which to begin the search for the next * invalid date/time * @return the next valid date/time */ public Date getNextInvalidTimeAfter(Date date) { long difference = 1000; - + //move back to the nearest second so differences will be accurate Calendar adjustCal = Calendar.getInstance(getTimeZone()); adjustCal.setTime(date); adjustCal.set(Calendar.MILLISECOND, 0); Date lastDate = adjustCal.getTime(); - + Date newDate; - + //FUTURE_TODO: (QUARTZ-481) IMPROVE THIS! The following is a BAD solution to this problem. Performance will be very bad here, depending on the cron expression. It is, however A solution. - + //keep getting the next included time until it's farther than one second // apart. At that point, lastDate is the last valid fire time. We return // the second immediately following it. while (difference == 1000) { newDate = getTimeAfter(lastDate); - if(newDate == null) + if (newDate == null) break; - + difference = newDate.getTime() - lastDate.getTime(); - + if (difference == 1000) { lastDate = newDate; } } - + return new Date(lastDate.getTime() + 1000); } - + /** - * Returns the time zone for which this <code>CronExpression</code> + * Returns the time zone for which this <code>CronExpression</code> * will be resolved. */ public TimeZone getTimeZone() { @@ -389,16 +386,16 @@ } /** - * Sets the time zone for which this <code>CronExpression</code> + * Sets the time zone for which this <code>CronExpression</code> * will be resolved. */ public void setTimeZone(TimeZone timeZone) { this.timeZone = timeZone; } - + /** * Returns the string representation of the <CODE>CronExpression</CODE> - * + * * @return a string representation of the <CODE>CronExpression</CODE> */ @Override @@ -407,30 +404,30 @@ } /** - * Indicates whether the specified cron expression can be parsed into a + * Indicates whether the specified cron expression can be parsed into a * valid cron expression - * + * * @param cronExpression the expression to evaluate * @return a boolean indicating whether the given expression is a valid cron - * expression + * expression */ public static boolean isValidExpression(String cronExpression) { - + try { new CronExpression(cronExpression); } catch (ParseException pe) { return false; } - + return true; } public static void validateExpression(String cronExpression) throws ParseException { - + new CronExpression(cronExpression); } - - + + //////////////////////////////////////////////////////////////////////////// // // Expression Parsing Functions @@ -467,23 +464,23 @@ int exprOn = SECOND; StringTokenizer exprsTok = new StringTokenizer(expression, " \t", - false); + false); while (exprsTok.hasMoreTokens() && exprOn <= YEAR) { String expr = exprsTok.nextToken().trim(); // throw an exception if L is used with other days of the month - if(exprOn == DAY_OF_MONTH && expr.indexOf('L') != -1 && expr.length() > 1 && expr.contains(",")) { + if (exprOn == DAY_OF_MONTH && expr.indexOf('L') != -1 && expr.length() > 1 && expr.contains(",")) { throw new ParseException("Support for specifying 'L' and 'LW' with other days of the month is not implemented", -1); } // throw an exception if L is used with other days of the week - if(exprOn == DAY_OF_WEEK && expr.indexOf('L') != -1 && expr.length() > 1 && expr.contains(",")) { + if (exprOn == DAY_OF_WEEK && expr.indexOf('L') != -1 && expr.length() > 1 && expr.contains(",")) { throw new ParseException("Support for specifying 'L' with other days of the week is not implemented", -1); } - if(exprOn == DAY_OF_WEEK && expr.indexOf('#') != -1 && expr.indexOf('#', expr.indexOf('#') +1) != -1) { + if (exprOn == DAY_OF_WEEK && expr.indexOf('#') != -1 && expr.indexOf('#', expr.indexOf('#') + 1) != -1) { throw new ParseException("Support for specifying multiple \"nth\" days is not implemented.", -1); } - + StringTokenizer vTok = new StringTokenizer(expr, ","); while (vTok.hasMoreTokens()) { String v = vTok.nextToken(); @@ -495,7 +492,7 @@ if (exprOn <= DAY_OF_WEEK) { throw new ParseException("Unexpected end of expression.", - expression.length()); + expression.length()); } if (exprOn <= YEAR) { @@ -512,14 +509,14 @@ if (!dayOfMSpec || dayOfWSpec) { if (!dayOfWSpec || dayOfMSpec) { throw new ParseException( - "Support for specifying both a day-of-week AND a day-of-month parameter is not implemented.", 0); + "Support for specifying both a day-of-week AND a day-of-month parameter is not implemented.", 0); } } } catch (ParseException pe) { throw pe; } catch (Exception e) { throw new ParseException("Illegal cron expression format (" - + e.toString() + ")", 0); + + e.toString() + ")", 0); } } @@ -556,7 +553,7 @@ sval = getDayOfWeekNumber(sub); if (sval < 0) { throw new ParseException("Invalid Day-of-Week value: '" - + sub + "'", i); + + sub + "'", i); } if (s.length() > i + 3) { c = s.charAt(i + 3); @@ -566,8 +563,8 @@ eval = getDayOfWeekNumber(sub); if (eval < 0) { throw new ParseException( - "Invalid Day-of-Week value: '" + sub - + "'", i); + "Invalid Day-of-Week value: '" + sub + + "'", i); } } else if (c == '#') { try { @@ -578,8 +575,8 @@ } } catch (Exception e) { throw new ParseException( - "A numeric value between 1 and 5 must follow the '#' option", - i); + "A numeric value between 1 and 5 must follow the '#' option", + i); } } else if (c == 'L') { lastdayOfWeek = true; @@ -589,8 +586,8 @@ } else { throw new ParseException( - "Illegal characters for this position: '" + sub + "'", - i); + "Illegal characters for this position: '" + sub + "'", + i); } if (eval != -1) { incr = 1; @@ -601,22 +598,22 @@ if (c == '?') { i++; - if ((i + 1) < s.length() - && (s.charAt(i) != ' ' && s.charAt(i + 1) != '\t')) { + if ((i + 1) < s.length() + && (s.charAt(i) != ' ' && s.charAt(i + 1) != '\t')) { throw new ParseException("Illegal character after '?': " - + s.charAt(i), i); + + s.charAt(i), i); } if (type != DAY_OF_WEEK && type != DAY_OF_MONTH) { throw new ParseException( - "'?' can only be specified for Day-of-Month or Day-of-Week.", - i); + "'?' can only be specified for Day-of-Month or Day-of-Week.", + i); } if (type == DAY_OF_WEEK && !lastdayOfMonth) { int val = daysOfMonth.last(); if (val == NO_SPEC_INT) { throw new ParseException( - "'?' can only be specified for Day-of-Month -OR- Day-of-Week.", - i); + "'?' can only be specified for Day-of-Month -OR- Day-of-Week.", + i); } } @@ -629,8 +626,8 @@ addToSet(ALL_SPEC_INT, -1, incr, type); return i + 1; } else if (c == '/' - && ((i + 1) >= s.length() || s.charAt(i + 1) == ' ' || s - .charAt(i + 1) == '\t')) { + && ((i + 1) >= s.length() || s.charAt(i + 1) == ' ' || s + .charAt(i + 1) == '\t')) { throw new ParseException("'/' must be followed by an integer.", i); } else if (c == '*') { i++; @@ -663,18 +660,18 @@ if (type == DAY_OF_WEEK) { addToSet(7, 7, 0, type); } - if(type == DAY_OF_MONTH && s.length() > i) { + if (type == DAY_OF_MONTH && s.length() > i) { c = s.charAt(i); - if(c == '-') { - ValueSet vs = getValue(0, s, i+1); + if (c == '-') { + ValueSet vs = getValue(0, s, i + 1); lastdayOffset = vs.value; - if(lastdayOffset > 30) - throw new ParseException("Offset from last day must be <= 30", i+1); + if (lastdayOffset > 30) + throw new ParseException("Offset from last day must be <= 30", i + 1); i = vs.pos; - } - if(s.length() > i) { + } + if (s.length() > i) { c = s.charAt(i); - if(c == 'W') { + if (c == 'W') { nearestWeekday = true; i++; } @@ -719,7 +716,7 @@ protected int checkNext(int pos, String s, int val, int type) throws ParseException { - + int end = -1; int i = pos; @@ -732,7 +729,7 @@ if (c == 'L') { if (type == DAY_OF_WEEK) { - if(val < 1 || val > 7) + if (val < 1 || val > 7) throw new ParseException("Day-of-Week values must be between 1 and 7", -1); lastdayOfWeek = true; } else { @@ -743,15 +740,15 @@ i++; return i; } - + if (c == 'W') { if (type == DAY_OF_MONTH) { nearestWeekday = true; } else { throw new ParseException("'W' option is not valid here. (pos=" + i + ")", i); } - if(val > 31) - throw new ParseException("The 'W' option does not make sense with values larger than 31 (max number of days in a month)", i); + if (val > 31) + throw new ParseException("The 'W' option does not make sense with values larger than 31 (max number of days in a month)", i); TreeSet<Integer> set = getSet(type); set.add(val); i++; @@ -770,8 +767,8 @@ } } catch (Exception e) { throw new ParseException( - "A numeric value between 1 and 5 must follow the '#' option", - i); + "A numeric value between 1 and 5 must follow the '#' option", + i); } TreeSet<Integer> set = getSet(type); @@ -857,7 +854,7 @@ public String getCronExpression() { return cronExpression; } - + public String getExpressionSummary() { StringBuilder buf = new StringBuilder(); @@ -966,36 +963,36 @@ protected void addToSet(int val, int end, int incr, int type) throws ParseException { - + TreeSet<Integer> set = getSet(type); if (type == SECOND || type == MINUTE) { if ((val < 0 || val > 59 || end > 59) && (val != ALL_SPEC_INT)) { throw new ParseException( - "Minute and Second values must be between 0 and 59", - -1); + "Minute and Second values must be between 0 and 59", + -1); } } else if (type == HOUR) { if ((val < 0 || val > 23 || end > 23) && (val != ALL_SPEC_INT)) { throw new ParseException( - "Hour values must be between 0 and 23", -1); + "Hour values must be between 0 and 23", -1); } } else if (type == DAY_OF_MONTH) { - if ((val < 1 || val > 31 || end > 31) && (val != ALL_SPEC_INT) - && (val != NO_SPEC_INT)) { + if ((val < 1 || val > 31 || end > 31) && (val != ALL_SPEC_INT) + && (val != NO_SPEC_INT)) { throw new ParseException( - "Day of month values must be between 1 and 31", -1); + "Day of month values must be between 1 and 31", -1); } } else if (type == MONTH) { if ((val < 1 || val > 12 || end > 12) && (val != ALL_SPEC_INT)) { throw new ParseException( - "Month values must be between 1 and 12", -1); + "Month values must be between 1 and 12", -1); } } else if (type == DAY_OF_WEEK) { if ((val == 0 || val > 7 || end > 7) && (val != ALL_SPEC_INT) - && (val != NO_SPEC_INT)) { + && (val != NO_SPEC_INT)) { throw new ParseException( - "Day-of-Week values must be between 1 and 7", -1); + "Day-of-Week values must be between 1 and 7", -1); } } @@ -1005,7 +1002,7 @@ } else { set.add(NO_SPEC); } - + return; } @@ -1061,20 +1058,34 @@ } } - // if the end of the range is before the start, then we need to overflow into - // the next day, month etc. This is done by adding the maximum amount for that + // if the end of the range is before the start, then we need to overflow into + // the next day, month etc. This is done by adding the maximum amount for that // type, and using modulus max to determine the value being added. int max = -1; if (stopAt < startAt) { switch (type) { - case SECOND : max = 60; break; - case MINUTE : max = 60; break; - case HOUR : max = 24; break; - case MONTH : max = 12; break; - case DAY_OF_WEEK : max = 7; break; - case DAY_OF_MONTH : max = 31; break; - case YEAR : throw new IllegalArgumentException("Start year must be less than stop year"); - default : throw new IllegalArgumentException("Unexpected type encountered"); + case SECOND: + max = 60; + break; + case MINUTE: + max = 60; + break; + case HOUR: + max = 24; + break; + case MONTH: + max = 12; + break; + case DAY_OF_WEEK: + max = 7; + break; + case DAY_OF_MONTH: + max = 31; + break; + case YEAR: + throw new IllegalArgumentException("Start year must be less than stop year"); + default: + throw new IllegalArgumentException("Unexpected type encountered"); } stopAt += max; } @@ -1088,7 +1099,7 @@ int i2 = i % max; // 1-indexed ranges should not include 0, and should include their max - if (i2 == 0 && (type == MONTH || type == DAY_OF_WEEK || type == DAY_OF_MONTH) ) { + if (i2 == 0 && (type == MONTH || type == DAY_OF_WEEK || type == DAY_OF_MONTH)) { i2 = max; } @@ -1130,7 +1141,7 @@ c = s.charAt(i); } ValueSet val = new ValueSet(); - + val.pos = (i < s.length()) ? i : i + 1; val.value = Integer.parseInt(s1.toString()); return val; @@ -1171,7 +1182,7 @@ public Date getTimeAfter(Date afterTime) { // Computation is based on Gregorian year only. - Calendar cl = new java.util.GregorianCalendar(getTimeZone()); + Calendar cl = new java.util.GregorianCalendar(getTimeZone()); // move ahead one second, since we're computing the time *after* the // given time @@ -1185,7 +1196,7 @@ while (!gotOne) { //if (endTime != null && cl.getTime().after(endTime)) return null; - if(cl.get(Calendar.YEAR) > 2999) { // prevent endless loop... + if (cl.get(Calendar.YEAR) > 2999) { // prevent endless loop... return null; } @@ -1255,20 +1266,20 @@ // 1-based t = -1; int tmon = mon; - + // get day................................................... boolean dayOfMSpec = !daysOfMonth.contains(NO_SPEC); boolean dayOfWSpec = !daysOfWeek.contains(NO_SPEC); if (dayOfMSpec && !dayOfWSpec) { // get day by day of month rule st = daysOfMonth.tailSet(day); if (lastdayOfMonth) { - if(!nearestWeekday) { + if (!nearestWeekday) { t = day; day = getLastDayOfMonth(mon, cl.get(Calendar.YEAR)); day -= lastdayOffset; - if(t > day) { + if (t > day) { mon++; - if(mon > 12) { + if (mon > 12) { mon = 1; tmon = 3333; // ensure test of mon != tmon further below fails cl.add(Calendar.YEAR, 1); @@ -1279,72 +1290,72 @@ t = day; day = getLastDayOfMonth(mon, cl.get(Calendar.YEAR)); day -= lastdayOffset; - - java.util.Calendar tcal = java.util.Calendar.getInstance(getTimeZone()); + + Calendar tcal = Calendar.getInstance(getTimeZone()); tcal.set(Calendar.SECOND, 0); tcal.set(Calendar.MINUTE, 0); tcal.set(Calendar.HOUR_OF_DAY, 0); tcal.set(Calendar.DAY_OF_MONTH, day); tcal.set(Calendar.MONTH, mon - 1); tcal.set(Calendar.YEAR, cl.get(Calendar.YEAR)); - + int ldom = getLastDayOfMonth(mon, cl.get(Calendar.YEAR)); int dow = tcal.get(Calendar.DAY_OF_WEEK); - if(dow == Calendar.SATURDAY && day == 1) { + if (dow == Calendar.SATURDAY && day == 1) { day += 2; - } else if(dow == Calendar.SATURDAY) { + } else if (dow == Calendar.SATURDAY) { day -= 1; - } else if(dow == Calendar.SUNDAY && day == ldom) { + } else if (dow == Calendar.SUNDAY && day == ldom) { day -= 2; - } else if(dow == Calendar.SUNDAY) { + } else if (dow == Calendar.SUNDAY) { day += 1; } - + tcal.set(Calendar.SECOND, sec); tcal.set(Calendar.MINUTE, min); tcal.set(Calendar.HOUR_OF_DAY, hr); tcal.set(Calendar.DAY_OF_MONTH, day); tcal.set(Calendar.MONTH, mon - 1); Date nTime = tcal.getTime(); - if(nTime.before(afterTime)) { + if (nTime.before(afterTime)) { day = 1; mon++; } } - } else if(nearestWeekday) { + } else if (nearestWeekday) { t = day; day = daysOfMonth.first(); - java.util.Calendar tcal = java.util.Calendar.getInstance(getTimeZone()); + Calendar tcal = Calendar.getInstance(getTimeZone()); tcal.set(Calendar.SECOND, 0); tcal.set(Calendar.MINUTE, 0); tcal.set(Calendar.HOUR_OF_DAY, 0); tcal.set(Calendar.DAY_OF_MONTH, day); tcal.set(Calendar.MONTH, mon - 1); tcal.set(Calendar.YEAR, cl.get(Calendar.YEAR)); - + int ldom = getLastDayOfMonth(mon, cl.get(Calendar.YEAR)); int dow = tcal.get(Calendar.DAY_OF_WEEK); - if(dow == Calendar.SATURDAY && day == 1) { + if (dow == Calendar.SATURDAY && day == 1) { day += 2; - } else if(dow == Calendar.SATURDAY) { + } else if (dow == Calendar.SATURDAY) { day -= 1; - } else if(dow == Calendar.SUNDAY && day == ldom) { + } else if (dow == Calendar.SUNDAY && day == ldom) { day -= 2; - } else if(dow == Calendar.SUNDAY) { + } else if (dow == Calendar.SUNDAY) { day += 1; } - - + + tcal.set(Calendar.SECOND, sec); tcal.set(Calendar.MINUTE, min); tcal.set(Calendar.HOUR_OF_DAY, hr); tcal.set(Calendar.DAY_OF_MONTH, day); tcal.set(Calendar.MONTH, mon - 1); Date nTime = tcal.getTime(); - if(nTime.before(afterTime)) { + if (nTime.before(afterTime)) { day = daysOfMonth.first(); mon++; } @@ -1361,7 +1372,7 @@ day = daysOfMonth.first(); mon++; } - + if (day != t || mon != tmon) { cl.set(Calendar.SECOND, 0); cl.set(Calendar.MINUTE, 0); @@ -1442,8 +1453,8 @@ daysToAdd = (nthdayOfWeek - weekOfMonth) * 7; day += daysToAdd; if (daysToAdd < 0 - || day > getLastDayOfMonth(mon, cl - .get(Calendar.YEAR))) { + || day > getLastDayOfMonth(mon, cl + .get(Calendar.YEAR))) { cl.set(Calendar.SECOND, 0); cl.set(Calendar.MINUTE, 0); cl.set(Calendar.HOUR_OF_DAY, 0); @@ -1501,7 +1512,7 @@ } } else { // dayOfWSpec && !dayOfMSpec throw new UnsupportedOperationException( - "Support for specifying both a day-of-week AND a day-of-month parameter is not implemented."); + "Support for specifying both a day-of-week AND a day-of-month parameter is not implemented."); } cl.set(Calendar.DAY_OF_MONTH, day); @@ -1575,35 +1586,35 @@ /** * Advance the calendar to the particular hour paying particular attention * to daylight saving problems. - * - * @param cal the calendar to operate on + * + * @param cal the calendar to operate on * @param hour the hour to set */ protected void setCalendarHour(Calendar cal, int hour) { - cal.set(java.util.Calendar.HOUR_OF_DAY, hour); - if (cal.get(java.util.Calendar.HOUR_OF_DAY) != hour && hour != 24) { - cal.set(java.util.Calendar.HOUR_OF_DAY, hour + 1); + cal.set(Calendar.HOUR_OF_DAY, hour); + if (cal.get(Calendar.HOUR_OF_DAY) != hour && hour != 24) { + cal.set(Calendar.HOUR_OF_DAY, hour + 1); } } /** * NOT YET IMPLEMENTED: Returns the time before the given time * that the <code>CronExpression</code> matches. - */ - public Date getTimeBefore(Date endTime) { + */ + public Date getTimeBefore(Date endTime) { // FUTURE_TODO: implement QUARTZ-423 return null; } /** - * NOT YET IMPLEMENTED: Returns the final time that the + * NOT YET IMPLEMENTED: Returns the final time that the * <code>CronExpression</code> will match. */ public Date getFinalFireTime() { // FUTURE_TODO: implement QUARTZ-423 return null; } - + protected boolean isLeapYear(int year) { return ((year % 4 == 0 && year % 100 != 0) || (year % 400 == 0)); } @@ -1637,21 +1648,21 @@ return 31; default: throw new IllegalArgumentException("Illegal month number: " - + monthNum); + + monthNum); } } - + private void readObject(java.io.ObjectInputStream stream) throws java.io.IOException, ClassNotFoundException { - + stream.defaultReadObject(); try { buildExpression(cronExpression); } catch (Exception ignore) { } // never happens - } - + } + @Override @Deprecated public Object clone() { -- Gitblit v1.9.3