1 package jalview.workers;
3 import java.util.ArrayList;
4 import java.util.Collections;
5 import java.util.HashSet;
6 import java.util.Hashtable;
10 import jalview.api.AlignCalcManagerI;
11 import jalview.api.AlignCalcWorkerI;
12 import jalview.datamodel.AlignmentAnnotation;
14 public class AlignCalcManager implements AlignCalcManagerI
16 private volatile List<AlignCalcWorkerI> restartable = Collections
17 .synchronizedList(new ArrayList<AlignCalcWorkerI>());
19 private volatile List<Class> blackList = Collections
20 .synchronizedList(new ArrayList<Class>());
23 * global record of calculations in progress
25 private volatile Map<Class, AlignCalcWorkerI> inProgress = Collections
26 .synchronizedMap(new Hashtable<Class, AlignCalcWorkerI>());
29 * record of calculations pending or in progress in the current context
31 private volatile Map<Class, List<AlignCalcWorkerI>> updating = Collections
32 .synchronizedMap(new Hashtable<Class, List<AlignCalcWorkerI>>());
35 public void notifyStart(AlignCalcWorkerI worker)
37 synchronized (updating)
39 List<AlignCalcWorkerI> upd = updating.get(worker.getClass());
45 .synchronizedList(new ArrayList<AlignCalcWorkerI>()));
55 public boolean alreadyDoing(AlignCalcWorkerI worker)
57 synchronized (inProgress)
59 return inProgress.containsKey(worker.getClass());
66 * @see jalview.api.AlignCalcManagerI#isPending(jalview.api.AlignCalcWorkerI)
69 public boolean isPending(AlignCalcWorkerI workingClass)
71 List<AlignCalcWorkerI> upd;
72 synchronized (updating)
74 upd = updating.get(workingClass.getClass());
90 // TODO make into api method if needed ?
91 public int numberLive(AlignCalcWorkerI worker)
93 synchronized (updating)
95 List<AlignCalcWorkerI> upd = updating.get(worker.getClass());
106 public boolean notifyWorking(AlignCalcWorkerI worker)
108 synchronized (inProgress)
110 // TODO: decide if we should throw exceptions here if multiple workers
112 if (inProgress.get(worker.getClass()) != null)
117 .println("Warning: Multiple workers are running of type "
118 + worker.getClass());
122 inProgress.put(worker.getClass(), worker);
127 private final HashSet<AlignCalcWorkerI> canUpdate = new HashSet<AlignCalcWorkerI>();
130 public void workerComplete(AlignCalcWorkerI worker)
132 synchronized (inProgress)
134 inProgress.remove(worker.getClass());
135 List<AlignCalcWorkerI> upd = updating.get(worker.getClass());
142 canUpdate.add(worker);
148 public void workerCannotRun(AlignCalcWorkerI worker)
150 synchronized (blackList)
152 blackList.add(worker.getClass());
156 public boolean isBlackListed(Class workerType)
158 synchronized (blackList)
160 return blackList.contains(workerType);
165 public void startWorker(AlignCalcWorkerI worker)
167 Thread tw = new Thread(worker);
168 tw.setName(worker.getClass().toString());
173 public boolean isWorking(AlignCalcWorkerI worker)
175 synchronized (inProgress)
176 {// System.err.println("isWorking : worker "+(worker!=null ?
177 // worker.getClass():"null")+ " "+hashCode());
178 return worker != null && inProgress.get(worker.getClass()) == worker;
183 public boolean isWorking()
185 synchronized (inProgress)
187 // System.err.println("isWorking "+hashCode());
188 return inProgress.size() > 0;
193 public void registerWorker(AlignCalcWorkerI worker)
195 synchronized (restartable)
197 if (!restartable.contains(worker))
199 restartable.add(worker);
206 public void restartWorkers()
208 synchronized (restartable)
210 for (AlignCalcWorkerI worker : restartable)
218 public boolean workingInvolvedWith(AlignmentAnnotation alignmentAnnotation)
220 synchronized (inProgress)
222 for (AlignCalcWorkerI worker : inProgress.values())
224 if (worker.involves(alignmentAnnotation))
230 synchronized (updating)
232 for (List<AlignCalcWorkerI> workers : updating.values())
234 for (AlignCalcWorkerI worker : workers)
235 if (worker.involves(alignmentAnnotation))
245 public void updateAnnotationFor(Class workerClass)
248 AlignCalcWorkerI[] workers;
249 synchronized (canUpdate)
251 workers = canUpdate.toArray(new AlignCalcWorkerI[0]);
253 for (AlignCalcWorkerI worker : workers)
255 if (workerClass.equals(worker.getClass()))
257 worker.updateAnnotation();
263 public List<AlignCalcWorkerI> getRegisteredWorkersOfClass(
266 List<AlignCalcWorkerI> workingClass = new ArrayList<AlignCalcWorkerI>();
267 AlignCalcWorkerI[] workers;
268 synchronized (canUpdate)
270 workers = canUpdate.toArray(new AlignCalcWorkerI[0]);
272 for (AlignCalcWorkerI worker : workers)
274 if (workerClass.equals(worker.getClass()))
276 workingClass.add(worker);
279 return (workingClass.size() == 0) ? null : workingClass;
283 public boolean startRegisteredWorkersOfClass(Class workerClass)
285 List<AlignCalcWorkerI> workers = getRegisteredWorkersOfClass(workerClass);
290 for (AlignCalcWorkerI worker : workers)
292 if (!isPending(worker))
298 System.err.println("Pending exists for " + workerClass);
305 public void workerMayRun(AlignCalcWorkerI worker)
307 synchronized (blackList)
309 if (blackList.contains(worker.getClass()))
311 blackList.remove(worker.getClass());