[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