samer@0: /* samer@0: * Copyright (c) 2000, Samer Abdallah, King's College London. samer@0: * All rights reserved. samer@0: * samer@0: * This software is provided AS iS and WITHOUT ANY WARRANTY; samer@0: * without even the implied warranty of MERCHANTABILITY or samer@0: * FITNESS FOR A PARTICULAR PURPOSE. samer@0: */ samer@0: samer@0: package samer.tools; samer@0: samer@0: /** samer@0: * This is a task that consists of a list of samer@0: * sub tasks. The task is no more than the sum samer@0: * of its subtasks -- ie there can be no extra samer@0: * processing other than that done by the tasks samer@0: * in the list. This is why the Task methods samer@0: * are decalared final. samer@0: */ samer@0: samer@0: public class CompoundTask implements Task samer@0: { samer@0: private TaskLink head=null, tail=null; samer@0: samer@0: public CompoundTask() {} samer@0: public CompoundTask(Task t) { addTask(t); } samer@0: samer@0: public String toString() { return "CompoundTask"; } samer@0: samer@0: // task list implementation samer@0: samer@0: public void addTask(Task t) samer@0: { samer@0: if (head==null) { samer@0: head=new TaskLink(t,null); samer@0: tail=head; samer@0: } else { samer@0: tail.next=new TaskLink(t,null); samer@0: tail=tail.next; samer@0: } samer@0: } samer@0: samer@0: public void addTaskAfter(Task t, Task b) samer@0: { samer@0: if (head==null) addTask(t); samer@0: else if (b==null) head=new TaskLink(t,head); samer@0: else { samer@0: TaskLink q=head; samer@0: while (q!=null && q.task!=b) q=q.next; samer@0: if (q!=null) q.next=new TaskLink(t,q.next); samer@0: else addTask(t); samer@0: } samer@0: } samer@0: samer@0: public void removeTask(Task t) samer@0: { samer@0: TaskLink prev=null; samer@0: samer@0: for (TaskLink l=head; l!=null; prev=l, l=l.next) { samer@0: if (l.task==t) { samer@0: if (prev!=null) prev.next=l.next; samer@0: else head=l.next; samer@0: if (tail==l) tail=prev; samer@0: } samer@0: } samer@0: } samer@0: samer@0: public Iterator iterator() { return new Iterator(); } samer@0: samer@0: // Task implementation samer@0: samer@0: public final void starting() { samer@0: for (TaskLink l=head; l!=null; l=l.next) l.task.starting(); samer@0: } samer@0: public final void stopping() { samer@0: for (TaskLink l=head; l!=null; l=l.next) l.task.stopping(); samer@0: } samer@0: public final void run() throws Exception { samer@0: for (TaskLink l=head; l!=null; l=l.next) l.task.run(); samer@0: } samer@0: public void dispose() { samer@0: for (TaskLink l=head; l!=null; l=l.next) l.task.dispose(); samer@0: } samer@0: samer@0: // using a linked list for speed samer@0: private static class TaskLink { samer@0: Task task; samer@0: TaskLink next; samer@0: samer@0: TaskLink(Task t, TaskLink n) { task=t; next=n; } samer@0: } samer@0: samer@0: // list iterator samer@0: public class Iterator implements java.util.Iterator { samer@0: TaskLink l=head; samer@0: public final boolean more() { return l!=null; } samer@0: public final boolean hasNext() { return l!=null; } samer@0: public final Task next() { Task t=l.task; l=l.next; return t; } samer@0: public final void remove() { l.task=l.next.task; l.next=l.next.next; } samer@0: } samer@0: }