KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > oddjob > schedules > ScheduleList


1 package org.oddjob.schedules;
2
3 import java.io.Serializable JavaDoc;
4 import java.util.ArrayList JavaDoc;
5 import java.util.Date JavaDoc;
6 import java.util.Iterator JavaDoc;
7 import java.util.List JavaDoc;
8
9 import org.apache.log4j.Logger;
10
11 /**
12  * Provide a schedule based on a list of schedules. All schedules are
13  * evaluated and that schedule which is due to start first is used.
14  *
15  * <p>
16  * Most schedules use this class to support a list of child scheudules
17  * such as this.
18  * <code><pre>
19  * &lt;schedule&gt;
20  * &lt;day-of-week on="mon"/&gt;
21  * &lt;day-of-week on="fri"/&gt;
22  * &lt;/schedule&gt;
23  * </pre></code>
24  *
25  * @author Rob Gordon
26  */

27
28 final public class ScheduleList implements Serializable JavaDoc, RefineableSchedule {
29     private static final long serialVersionUID = 20051125;
30     
31     private static final Logger logger = Logger.getLogger(ScheduleList.class);
32     
33     /** List of Schedules. */
34     private final List JavaDoc schedules = new ArrayList JavaDoc();
35
36     /** Limits */
37     private transient Interval limits;
38
39     /*
40      * (non-Javadoc)
41      * @see org.treesched.Schedule#setLimits(org.treesched.Interval)
42      */

43     public void setLimits(Interval limits) {
44         this.limits = limits;
45     }
46     
47     /**
48      * Get any limits set for this schedule.
49      *
50      * @return The limits, may be null.
51      */

52     public Interval getLimits() {
53         return limits;
54     }
55     
56     /**
57      * The number of subschedules this list contains.
58      *
59      * @return The number of subschedules.
60      */

61     public int size() {
62         return schedules.size();
63     }
64     
65     /**
66      * Add a schedule to the list.
67      *
68      * @param schedule The schedule to add.
69      */

70     public void addValueSchedule(Schedule schedule) {
71         schedules.add(schedule);
72     }
73     
74     /*
75      * (non-Javadoc)
76      * @see org.treesched.Schedule#nextDue(java.util.Date)
77      */

78     public Interval nextDue(ScheduleContext context) {
79         Date JavaDoc now = context.getDate();
80         
81         logger.debug(this + ": in date " + now);
82         Interval candidate = null;
83
84         int i = 1;
85         for (Iterator JavaDoc it = schedules.iterator(); it.hasNext(); ++i) {
86             Schedule schedule = (Schedule)it.next();
87             
88             logger.debug(this + ": evaluating schedule " + i + " (" + schedule + ")");
89             
90             schedule.setLimits(limits);
91             Interval nextDue = schedule.nextDue(context);
92             if (nextDue != null) {
93                 if (limits != null) {
94                     nextDue = nextDue.limit(limits);
95                 }
96                 if (candidate == null || nextDue.isBefore(candidate)) {
97                     candidate = nextDue;
98                 }
99             }
100         }
101         logger.debug(this + ": returning " + candidate);
102         return candidate;
103     }
104
105     /**
106      * Override toString to be more useful.
107      *
108      * @return A description of the schedule.
109      */

110     public String JavaDoc toString() {
111         return "ScheduleList, size=" + schedules.size();
112     }
113 }
114
Popular Tags