samer@0
|
1 /*
|
samer@0
|
2 * Copyright (c) 2000, Samer Abdallah, King's College London.
|
samer@0
|
3 * All rights reserved.
|
samer@0
|
4 *
|
samer@0
|
5 * This software is provided AS iS and WITHOUT ANY WARRANTY;
|
samer@0
|
6 * without even the implied warranty of MERCHANTABILITY or
|
samer@0
|
7 * FITNESS FOR A PARTICULAR PURPOSE.
|
samer@0
|
8 */
|
samer@0
|
9
|
samer@0
|
10 package samer.tools;
|
samer@0
|
11
|
samer@0
|
12 /**
|
samer@0
|
13 * This is a task that consists of a list of
|
samer@0
|
14 * sub tasks. The task is no more than the sum
|
samer@0
|
15 * of its subtasks -- ie there can be no extra
|
samer@0
|
16 * processing other than that done by the tasks
|
samer@0
|
17 * in the list. This is why the Task methods
|
samer@0
|
18 * are decalared <code>final</code>.
|
samer@0
|
19 */
|
samer@0
|
20
|
samer@0
|
21 public class CompoundTask implements Task
|
samer@0
|
22 {
|
samer@0
|
23 private TaskLink head=null, tail=null;
|
samer@0
|
24
|
samer@0
|
25 public CompoundTask() {}
|
samer@0
|
26 public CompoundTask(Task t) { addTask(t); }
|
samer@0
|
27
|
samer@0
|
28 public String toString() { return "CompoundTask"; }
|
samer@0
|
29
|
samer@0
|
30 // task list implementation
|
samer@0
|
31
|
samer@0
|
32 public void addTask(Task t)
|
samer@0
|
33 {
|
samer@0
|
34 if (head==null) {
|
samer@0
|
35 head=new TaskLink(t,null);
|
samer@0
|
36 tail=head;
|
samer@0
|
37 } else {
|
samer@0
|
38 tail.next=new TaskLink(t,null);
|
samer@0
|
39 tail=tail.next;
|
samer@0
|
40 }
|
samer@0
|
41 }
|
samer@0
|
42
|
samer@0
|
43 public void addTaskAfter(Task t, Task b)
|
samer@0
|
44 {
|
samer@0
|
45 if (head==null) addTask(t);
|
samer@0
|
46 else if (b==null) head=new TaskLink(t,head);
|
samer@0
|
47 else {
|
samer@0
|
48 TaskLink q=head;
|
samer@0
|
49 while (q!=null && q.task!=b) q=q.next;
|
samer@0
|
50 if (q!=null) q.next=new TaskLink(t,q.next);
|
samer@0
|
51 else addTask(t);
|
samer@0
|
52 }
|
samer@0
|
53 }
|
samer@0
|
54
|
samer@0
|
55 public void removeTask(Task t)
|
samer@0
|
56 {
|
samer@0
|
57 TaskLink prev=null;
|
samer@0
|
58
|
samer@0
|
59 for (TaskLink l=head; l!=null; prev=l, l=l.next) {
|
samer@0
|
60 if (l.task==t) {
|
samer@0
|
61 if (prev!=null) prev.next=l.next;
|
samer@0
|
62 else head=l.next;
|
samer@0
|
63 if (tail==l) tail=prev;
|
samer@0
|
64 }
|
samer@0
|
65 }
|
samer@0
|
66 }
|
samer@0
|
67
|
samer@0
|
68 public Iterator iterator() { return new Iterator(); }
|
samer@0
|
69
|
samer@0
|
70 // Task implementation
|
samer@0
|
71
|
samer@0
|
72 public final void starting() {
|
samer@0
|
73 for (TaskLink l=head; l!=null; l=l.next) l.task.starting();
|
samer@0
|
74 }
|
samer@0
|
75 public final void stopping() {
|
samer@0
|
76 for (TaskLink l=head; l!=null; l=l.next) l.task.stopping();
|
samer@0
|
77 }
|
samer@0
|
78 public final void run() throws Exception {
|
samer@0
|
79 for (TaskLink l=head; l!=null; l=l.next) l.task.run();
|
samer@0
|
80 }
|
samer@0
|
81 public void dispose() {
|
samer@0
|
82 for (TaskLink l=head; l!=null; l=l.next) l.task.dispose();
|
samer@0
|
83 }
|
samer@0
|
84
|
samer@0
|
85 // using a linked list for speed
|
samer@0
|
86 private static class TaskLink {
|
samer@0
|
87 Task task;
|
samer@0
|
88 TaskLink next;
|
samer@0
|
89
|
samer@0
|
90 TaskLink(Task t, TaskLink n) { task=t; next=n; }
|
samer@0
|
91 }
|
samer@0
|
92
|
samer@0
|
93 // list iterator
|
samer@0
|
94 public class Iterator implements java.util.Iterator {
|
samer@0
|
95 TaskLink l=head;
|
samer@0
|
96 public final boolean more() { return l!=null; }
|
samer@0
|
97 public final boolean hasNext() { return l!=null; }
|
samer@0
|
98 public final Task next() { Task t=l.task; l=l.next; return t; }
|
samer@0
|
99 public final void remove() { l.task=l.next.task; l.next=l.next.next; }
|
samer@0
|
100 }
|
samer@0
|
101 }
|