[jboss-cvs] jboss-seam/src/main/org/jboss/seam/async ...
Michael Yuan
michael.yuan at jboss.com
Wed Jul 25 15:42:05 EDT 2007
User: myuan
Date: 07/07/25 15:42:05
Modified: src/main/org/jboss/seam/async AbstractDispatcher.java
QuartzDispatcher.java
Added: src/main/org/jboss/seam/async NthBusinessDay.java
NthBusinessDaySchedule.java
Log:
Support Nth business day (It excludes weekends and US federal holidays by default)
Revision Changes Path
1.6 +19 -4 jboss-seam/src/main/org/jboss/seam/async/AbstractDispatcher.java
(In the diff below, changes in quantity of whitespace are not shown.)
Index: AbstractDispatcher.java
===================================================================
RCS file: /cvsroot/jboss/jboss-seam/src/main/org/jboss/seam/async/AbstractDispatcher.java,v
retrieving revision 1.5
retrieving revision 1.6
diff -u -b -r1.5 -r1.6
--- AbstractDispatcher.java 25 Jun 2007 22:56:48 -0000 1.5
+++ AbstractDispatcher.java 25 Jul 2007 19:42:05 -0000 1.6
@@ -9,6 +9,7 @@
import org.jboss.seam.annotations.async.FinalExpiration;
import org.jboss.seam.annotations.async.IntervalCron;
import org.jboss.seam.annotations.async.IntervalDuration;
+import org.jboss.seam.annotations.async.IntervalBusinessDay;
import org.jboss.seam.contexts.Contexts;
import org.jboss.seam.intercept.InvocationContext;
import org.jboss.seam.transaction.Transaction;
@@ -43,9 +44,6 @@
Transaction.instance().registerSynchronization( new TransactionCompletionEvent(type, parameters) );
}
- // TODO: Throw exception when there are multiple interval params
- // Make use of finalExpiration
- // Make use of NthBusinessDay
protected Schedule createSchedule(InvocationContext invocation)
{
Long duration = null;
@@ -54,7 +52,9 @@
Long intervalDuration = null;
String cron = null;
- // NthBusinessDay intervalBusinessDay = null;
+ NthBusinessDay intervalBusinessDay = null;
+
+ int intervalParamCount = 0;
Annotation[][] parameterAnnotations = invocation.getMethod().getParameterAnnotations();
for ( int i=0; i<parameterAnnotations.length; i++ )
@@ -69,6 +69,7 @@
else if ( annotation.annotationType().equals(IntervalDuration.class) )
{
intervalDuration = (Long) invocation.getParameters()[i];
+ intervalParamCount++;
}
else if ( annotation.annotationType().equals(Expiration.class) )
{
@@ -81,14 +82,28 @@
else if ( annotation.annotationType().equals(IntervalCron.class) )
{
cron = (String) invocation.getParameters()[i];
+ intervalParamCount++;
+ }
+ else if ( annotation.annotationType().equals(IntervalBusinessDay.class) )
+ {
+ intervalBusinessDay = (NthBusinessDay) invocation.getParameters()[i];
+ intervalParamCount++;
}
}
}
+ if (intervalParamCount > 1) {
+ throw new RuntimeException ("Cannot have more than one @Interval arguments in asynchrnous method");
+ }
+
if ( cron!=null )
{
return new CronSchedule(duration, expiration, cron, finalExpiration);
}
+ else if (intervalBusinessDay != null)
+ {
+ return new NthBusinessDaySchedule(duration, expiration, intervalBusinessDay, finalExpiration);
+ }
else
{
return new TimerSchedule(duration, expiration, intervalDuration, finalExpiration);
1.6 +47 -0 jboss-seam/src/main/org/jboss/seam/async/QuartzDispatcher.java
(In the diff below, changes in quantity of whitespace are not shown.)
Index: QuartzDispatcher.java
===================================================================
RCS file: /cvsroot/jboss/jboss-seam/src/main/org/jboss/seam/async/QuartzDispatcher.java,v
retrieving revision 1.5
retrieving revision 1.6
diff -u -b -r1.5 -r1.6
--- QuartzDispatcher.java 23 Jun 2007 08:04:15 -0000 1.5
+++ QuartzDispatcher.java 25 Jul 2007 19:42:05 -0000 1.6
@@ -26,6 +26,7 @@
import org.quartz.SchedulerException;
import org.quartz.SchedulerFactory;
import org.quartz.SimpleTrigger;
+import org.quartz.NthIncludedDayTrigger;
/**
* Dispatcher implementation that uses the Quartz library.
@@ -162,6 +163,52 @@
return null;
}
}
+ else if (schedule instanceof NthBusinessDaySchedule)
+ {
+ NthBusinessDaySchedule nthBusinessDaySchedule = (NthBusinessDaySchedule) schedule;
+ try
+ {
+ String calendarName = nextUniqueName();
+ scheduler.addCalendar(calendarName, nthBusinessDaySchedule.getNthBusinessDay().getHolidayCalendar(), false, false);
+
+ NthIncludedDayTrigger trigger = new NthIncludedDayTrigger (triggerName, null);
+ trigger.setN(nthBusinessDaySchedule.getNthBusinessDay().getN());
+ trigger.setFireAtTime(nthBusinessDaySchedule.getNthBusinessDay().getFireAtTime());
+ trigger.setEndTime(nthBusinessDaySchedule.getFinalExpiration());
+ trigger.setCalendarName(calendarName);
+
+
+ switch(nthBusinessDaySchedule.getNthBusinessDay().getInterval()) {
+ case WEEKLY:
+ trigger.setIntervalType(NthIncludedDayTrigger.INTERVAL_TYPE_WEEKLY);
+ break;
+ case MONTHLY:
+ trigger.setIntervalType(NthIncludedDayTrigger.INTERVAL_TYPE_MONTHLY);
+ break;
+ case YEARLY:
+ trigger.setIntervalType(NthIncludedDayTrigger.INTERVAL_TYPE_YEARLY);
+ break;
+ }
+
+ if ( nthBusinessDaySchedule.getExpiration()!=null )
+ {
+ trigger.setStartTime (nthBusinessDaySchedule.getExpiration());
+ }
+ else if ( nthBusinessDaySchedule.getDuration()!=null )
+ {
+ trigger.setStartTime (calculateDelayedDate(nthBusinessDaySchedule.getDuration()));
+ }
+
+ scheduler.scheduleJob( jobDetail, trigger );
+
+ }
+ catch (Exception e)
+ {
+ log.error ("Cannot submit nth business day job");
+ e.printStackTrace ();
+ return null;
+ }
+ }
else if (schedule instanceof TimerSchedule && ((TimerSchedule) schedule).getIntervalDuration() != null)
{
TimerSchedule timerSchedule = (TimerSchedule) schedule;
1.1 date: 2007/07/25 19:42:05; author: myuan; state: Exp;jboss-seam/src/main/org/jboss/seam/async/NthBusinessDay.java
Index: NthBusinessDay.java
===================================================================
package org.jboss.seam.async;
import java.util.List;
import java.util.ArrayList;
import java.util.Date;
import org.quartz.impl.calendar.WeeklyCalendar;
import org.quartz.impl.calendar.HolidayCalendar;
/**
* The NthBusinessDay conf data -- used with @IntervalBusinessDay
* on @Asynchronous methods.
*
* @author Michael Yuan
*
*/
public class NthBusinessDay
{
int n;
String fireAtTime;
List <Date> additionalHolidays;
BusinessDayIntervalType interval;
boolean excludeWeekends;
boolean excludeUsFederalHolidays;
public enum BusinessDayIntervalType { WEEKLY, MONTHLY, YEARLY }
public NthBusinessDay ()
{
n = 1;
fireAtTime = "12:00";
additionalHolidays = new ArrayList <Date> ();
interval = BusinessDayIntervalType.WEEKLY;
excludeWeekends = true;
excludeUsFederalHolidays = true;
}
public NthBusinessDay (int n, String fireAtTime, BusinessDayIntervalType interval)
{
this.n = n;
this.fireAtTime = fireAtTime;
this.additionalHolidays = new ArrayList <Date> ();
this.interval = interval;
this.excludeWeekends = true;
this.excludeUsFederalHolidays = true;
}
public NthBusinessDay (int n, String fireAtTime, List <Date> additionalHolidays, BusinessDayIntervalType interval, boolean excludeWeekends, boolean excludeUsFederalHolidays)
{
this.n = n;
this.fireAtTime = fireAtTime;
this.additionalHolidays = additionalHolidays;
this.interval = interval;
this.excludeWeekends = excludeWeekends;
this.excludeUsFederalHolidays = excludeUsFederalHolidays;
}
public int getN ()
{
return n;
}
public void setN (int n)
{
this.n = n;
}
public String getFireAtTime ()
{
return fireAtTime;
}
public void setFireAtTime (String fireAtTime)
{
this.fireAtTime = fireAtTime;
}
public List <Date> getAdditionalHolidays ()
{
return additionalHolidays;
}
public void setAdditionalHolidays (List <Date> additionalHolidays)
{
this.additionalHolidays = additionalHolidays;
}
public BusinessDayIntervalType getInterval ()
{
return interval;
}
public void setInterval (BusinessDayIntervalType interval)
{
this.interval = interval;
}
public boolean getExcludeWeekends ()
{
return excludeWeekends;
}
public void setExcludeWeekends (boolean excludeWeekends)
{
this.excludeWeekends = excludeWeekends;
}
public boolean getExcludeUsFederalHolidays ()
{
return excludeUsFederalHolidays;
}
public void setExcludeUsFederalHolidays (boolean excludeUsFederalHolidays)
{
this.excludeUsFederalHolidays = excludeUsFederalHolidays;
}
public HolidayCalendar getHolidayCalendar ()
{
HolidayCalendar holidays;
if (excludeWeekends) {
WeeklyCalendar wCal = new WeeklyCalendar ();
holidays = new HolidayCalendar (wCal);
} else {
holidays = new HolidayCalendar ();
}
for (Date d : additionalHolidays) {
holidays.addExcludedDate( d );
}
// US Federal Holiday based on http://www.opm.gov/fedhol/
if (excludeUsFederalHolidays) {
java.util.Calendar hCal = java.util.Calendar.getInstance();
// Year 2007
hCal.set(2007, java.util.Calendar.JANUARY, 1); // New Year
holidays.addExcludedDate(hCal.getTime());
hCal.set(2007, java.util.Calendar.JANUARY, 15); // MLK
holidays.addExcludedDate(hCal.getTime());
hCal.set(2007, java.util.Calendar.FEBRUARY, 19); // Washington
holidays.addExcludedDate(hCal.getTime());
hCal.set(2007, java.util.Calendar.MAY, 28); // Memorial
holidays.addExcludedDate(hCal.getTime());
hCal.set(2007, java.util.Calendar.JULY, 4); // Independence
holidays.addExcludedDate(hCal.getTime());
hCal.set(2007, java.util.Calendar.SEPTEMBER, 3); // Labor
holidays.addExcludedDate(hCal.getTime());
hCal.set(2007, java.util.Calendar.OCTOBER, 8); // Columbus
holidays.addExcludedDate(hCal.getTime());
hCal.set(2007, java.util.Calendar.NOVEMBER, 12); // Veterans
holidays.addExcludedDate(hCal.getTime());
hCal.set(2007, java.util.Calendar.NOVEMBER, 22); // Thanksgiving
holidays.addExcludedDate(hCal.getTime());
hCal.set(2007, java.util.Calendar.DECEMBER, 25); // Christmas
holidays.addExcludedDate(hCal.getTime());
// Year 2008
hCal.set(2008, java.util.Calendar.JANUARY, 1); // New Year
holidays.addExcludedDate(hCal.getTime());
hCal.set(2008, java.util.Calendar.JANUARY, 21); // MLK
holidays.addExcludedDate(hCal.getTime());
hCal.set(2008, java.util.Calendar.FEBRUARY, 18); // Washington
holidays.addExcludedDate(hCal.getTime());
hCal.set(2008, java.util.Calendar.MAY, 26); // Memorial
holidays.addExcludedDate(hCal.getTime());
hCal.set(2008, java.util.Calendar.JULY, 4); // Independence
holidays.addExcludedDate(hCal.getTime());
hCal.set(2008, java.util.Calendar.SEPTEMBER, 1); // Labor
holidays.addExcludedDate(hCal.getTime());
hCal.set(2008, java.util.Calendar.OCTOBER, 13); // Columbus
holidays.addExcludedDate(hCal.getTime());
hCal.set(2008, java.util.Calendar.NOVEMBER, 11); // Veterans
holidays.addExcludedDate(hCal.getTime());
hCal.set(2008, java.util.Calendar.NOVEMBER, 27); // Thanksgiving
holidays.addExcludedDate(hCal.getTime());
hCal.set(2008, java.util.Calendar.DECEMBER, 25); // Christmas
holidays.addExcludedDate(hCal.getTime());
// Year 2009
hCal.set(2009, java.util.Calendar.JANUARY, 1); // New Year
holidays.addExcludedDate(hCal.getTime());
hCal.set(2009, java.util.Calendar.JANUARY, 19); // MLK
holidays.addExcludedDate(hCal.getTime());
hCal.set(2009, java.util.Calendar.FEBRUARY, 16); // Washington
holidays.addExcludedDate(hCal.getTime());
hCal.set(2009, java.util.Calendar.MAY, 25); // Memorial
holidays.addExcludedDate(hCal.getTime());
hCal.set(2009, java.util.Calendar.JULY, 3); // Independence
holidays.addExcludedDate(hCal.getTime());
hCal.set(2009, java.util.Calendar.SEPTEMBER, 7); // Labor
holidays.addExcludedDate(hCal.getTime());
hCal.set(2009, java.util.Calendar.OCTOBER, 12); // Columbus
holidays.addExcludedDate(hCal.getTime());
hCal.set(2009, java.util.Calendar.NOVEMBER, 11); // Veterans
holidays.addExcludedDate(hCal.getTime());
hCal.set(2009, java.util.Calendar.NOVEMBER, 26); // Thanksgiving
holidays.addExcludedDate(hCal.getTime());
hCal.set(2009, java.util.Calendar.DECEMBER, 25); // Christmas
holidays.addExcludedDate(hCal.getTime());
// Year 2010
hCal.set(2010, java.util.Calendar.JANUARY, 1); // New Year
holidays.addExcludedDate(hCal.getTime());
hCal.set(2010, java.util.Calendar.JANUARY, 18); // MLK
holidays.addExcludedDate(hCal.getTime());
hCal.set(2010, java.util.Calendar.FEBRUARY, 15); // Washington
holidays.addExcludedDate(hCal.getTime());
hCal.set(2010, java.util.Calendar.MAY, 31); // Memorial
holidays.addExcludedDate(hCal.getTime());
hCal.set(2010, java.util.Calendar.JULY, 5); // Independence
holidays.addExcludedDate(hCal.getTime());
hCal.set(2010, java.util.Calendar.SEPTEMBER, 6); // Labor
holidays.addExcludedDate(hCal.getTime());
hCal.set(2010, java.util.Calendar.OCTOBER, 11); // Columbus
holidays.addExcludedDate(hCal.getTime());
hCal.set(2010, java.util.Calendar.NOVEMBER, 11); // Veterans
holidays.addExcludedDate(hCal.getTime());
hCal.set(2010, java.util.Calendar.NOVEMBER, 25); // Thanksgiving
holidays.addExcludedDate(hCal.getTime());
hCal.set(2010, java.util.Calendar.DECEMBER, 24); // Christmas
holidays.addExcludedDate(hCal.getTime());
}
return holidays;
}
}
1.1 date: 2007/07/25 19:42:05; author: myuan; state: Exp;jboss-seam/src/main/org/jboss/seam/async/NthBusinessDaySchedule.java
Index: NthBusinessDaySchedule.java
===================================================================
package org.jboss.seam.async;
import java.util.Date;
/**
* A "nth business day schedule" for a timed event executed by
* the Quartz NthIncludedDayTrigger.
*
* @author Michael Yuan
*
*/
public class NthBusinessDaySchedule extends Schedule
{
private NthBusinessDay nthBusinessDay;
public NthBusinessDay getNthBusinessDay()
{
return nthBusinessDay;
}
public void setNthBusinessDay(NthBusinessDay nthBusinessDay)
{
this.nthBusinessDay = nthBusinessDay;
}
/**
* @param duration the delay before the first event occurs
* @param nthBusinessDay controls how the events are repeated on specified times on the Nth business day of the given interval (e.g., weekly, monthly, yearly)
*/
public NthBusinessDaySchedule(Long duration, NthBusinessDay nthBusinessDay)
{
super(duration);
this.nthBusinessDay = nthBusinessDay;
}
/**
* @param expiration the datetime at which the first event occurs
* @param nthBusinessDay controls how the events are repeated on specified times on the Nth business day of the given interval (e.g., weekly, monthly, yearly)
*/
public NthBusinessDaySchedule(Date expiration, NthBusinessDay nthBusinessDay)
{
super(expiration);
this.nthBusinessDay = nthBusinessDay;
}
public NthBusinessDaySchedule(Long duration, Date expiration, NthBusinessDay nthBusinessDay, Date finalExpiration)
{
super(duration, expiration, finalExpiration);
this.nthBusinessDay = nthBusinessDay;
}
NthBusinessDaySchedule() {}
}
More information about the jboss-cvs-commits
mailing list