001: package org.apache.turbine.services.schedule;
002:
003: /*
004: * Licensed to the Apache Software Foundation (ASF) under one
005: * or more contributor license agreements. See the NOTICE file
006: * distributed with this work for additional information
007: * regarding copyright ownership. The ASF licenses this file
008: * to you under the Apache License, Version 2.0 (the
009: * "License"); you may not use this file except in compliance
010: * with the License. You may obtain a copy of the License at
011: *
012: * http://www.apache.org/licenses/LICENSE-2.0
013: *
014: * Unless required by applicable law or agreed to in writing,
015: * software distributed under the License is distributed on an
016: * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
017: * KIND, either express or implied. See the License for the
018: * specific language governing permissions and limitations
019: * under the License.
020: */
021:
022: import java.util.Collections;
023: import java.util.Comparator;
024: import java.util.List;
025: import java.util.Vector;
026:
027: import org.apache.turbine.util.TurbineException;
028:
029: /**
030: * Queue for the scheduler.
031: *
032: * @author <a href="mailto:mbryson@mont.mindspring.com">Dave Bryson</a>
033: * @author <a href="mailto:quintonm@bellsouth.net">Quinton McCombs</a>
034: * @version $Id: JobQueue.java 534527 2007-05-02 16:10:59Z tv $
035: */
036: public class JobQueue {
037: /**
038: * The queue of <code>JobEntry</code> objects.
039: */
040: private Vector queue = null;
041:
042: /**
043: * Creates a new instance.
044: */
045: public JobQueue() {
046: queue = new Vector(10);
047: }
048:
049: /**
050: * Return the next job off the top of the queue, or <code>null</code> if
051: * there are no jobs in the queue.
052: *
053: * @return The next job in the queue.
054: */
055: public JobEntry getNext() {
056: if (queue.size() > 0) {
057: return (JobEntry) queue.elementAt(0);
058: } else {
059: return null;
060: }
061: }
062:
063: /**
064: * Return a specific job.
065: *
066: * @param je The JobEntry we are looking for.
067: * @return A JobEntry.
068: */
069: public JobEntry getJob(JobEntry je) {
070: int index = -1;
071:
072: if (je != null) {
073: index = queue.indexOf(je);
074: }
075:
076: if (index < 0) {
077: return null;
078: } else {
079: return (JobEntry) queue.elementAt(index);
080: }
081: }
082:
083: /**
084: * List jobs in the queue. This is used by the scheduler UI.
085: *
086: * @return A Vector of <code>JobEntry</code> objects.
087: */
088: public Vector list() {
089: if (queue != null && queue.size() > 0) {
090: return (Vector) queue.clone();
091: } else {
092: return null;
093: }
094: }
095:
096: /**
097: * Add a job to the queue.
098: *
099: * @param je A JobEntry job.
100: */
101: public synchronized void add(JobEntry je) {
102: queue.addElement(je);
103: sortQueue();
104: }
105:
106: /**
107: * Batch load jobs. Retains any already enqueued jobs. Called on
108: * <code>SchedulerService</code> start-up.
109: *
110: * @param jobEntries A list of the <code>JobEntry</code> objects to load.
111: */
112: public synchronized void batchLoad(List jobEntries) {
113: if (jobEntries != null) {
114: queue.addAll(jobEntries);
115: sortQueue();
116: }
117:
118: }
119:
120: /**
121: * Remove a job from the queue.
122: *
123: * @param je A JobEntry with the job to remove.
124: */
125: public synchronized void remove(JobEntry je) {
126: queue.removeElement(je);
127: sortQueue();
128: }
129:
130: /**
131: * Modify a job on the queue.
132: *
133: * @param je A JobEntry with the job to modify
134: */
135: public synchronized void modify(JobEntry je)
136: throws TurbineException {
137: remove(je);
138: je.calcRunTime();
139: this .add(je);
140: sortQueue();
141: }
142:
143: /**
144: * Update the job for its next run time.
145: *
146: * @param je A JobEntry to be updated.
147: * @exception TurbineException a generic exception.
148: */
149: public synchronized void updateQueue(JobEntry je)
150: throws TurbineException {
151: je.calcRunTime();
152: sortQueue();
153: }
154:
155: /**
156: * Re-sort the existing queue. Consumers of this method should be
157: * <code>synchronized</code>.
158: */
159: private void sortQueue() {
160: Comparator aComparator = new Comparator() {
161: public int compare(Object o1, Object o2) {
162: Long time1 = new Long(((JobEntry) o1).getNextRuntime());
163: Long time2 = new Long(((JobEntry) o2).getNextRuntime());
164: return (time1.compareTo(time2));
165: }
166: };
167:
168: Collections.sort(queue, aComparator);
169: }
170: }
|