1 package jalview.workers;
3 import java.util.ArrayList;
4 import java.util.Collections;
5 import java.util.HashSet;
6 import java.util.Hashtable;
11 import jalview.api.AlignCalcManagerI;
12 import jalview.api.AlignCalcWorkerI;
13 import jalview.datamodel.AlignmentAnnotation;
15 public class AlignCalcManager implements AlignCalcManagerI
17 private volatile List<AlignCalcWorkerI> restartable = Collections
18 .synchronizedList(new ArrayList<AlignCalcWorkerI>());
20 private volatile List<Class> blackList = Collections
21 .synchronizedList(new ArrayList<Class>());
24 * global record of calculations in progress
26 private volatile Map<Class, AlignCalcWorkerI> inProgress = Collections
27 .synchronizedMap(new Hashtable<Class, AlignCalcWorkerI>());
30 * record of calculations pending or in progress in the current context
32 private volatile Map<Class, List<AlignCalcWorkerI>> updating = Collections
33 .synchronizedMap(new Hashtable<Class, List<AlignCalcWorkerI>>());
36 public void notifyStart(AlignCalcWorkerI worker)
38 synchronized (updating)
40 List<AlignCalcWorkerI> upd = updating.get(worker.getClass());
46 .synchronizedList(new ArrayList<AlignCalcWorkerI>()));
56 public boolean alreadyDoing(AlignCalcWorkerI worker)
58 synchronized (inProgress)
60 return inProgress.containsKey(worker.getClass());
67 * @see jalview.api.AlignCalcManagerI#isPending(jalview.api.AlignCalcWorkerI)
70 public boolean isPending(AlignCalcWorkerI workingClass)
72 List<AlignCalcWorkerI> upd;
73 synchronized (updating)
75 upd = updating.get(workingClass.getClass());
91 // TODO make into api method if needed ?
92 public int numberLive(AlignCalcWorkerI worker)
94 synchronized (updating)
96 List<AlignCalcWorkerI> upd = updating.get(worker.getClass());
107 public boolean notifyWorking(AlignCalcWorkerI worker)
109 synchronized (inProgress)
111 // TODO: decide if we should throw exceptions here if multiple workers
113 if (inProgress.get(worker.getClass()) != null)
118 .println("Warning: Multiple workers are running of type "
119 + worker.getClass());
123 inProgress.put(worker.getClass(), worker);
128 private final HashSet<AlignCalcWorkerI> canUpdate = new HashSet<AlignCalcWorkerI>();
131 public void workerComplete(AlignCalcWorkerI worker)
133 synchronized (inProgress)
135 // System.err.println("Worker "+worker.getClass()+" marked as complete.");
136 inProgress.remove(worker.getClass());
137 List<AlignCalcWorkerI> upd = updating.get(worker.getClass());
144 canUpdate.add(worker);
150 public void workerCannotRun(AlignCalcWorkerI worker)
152 synchronized (blackList)
154 blackList.add(worker.getClass());
158 public boolean isBlackListed(Class workerType)
160 synchronized (blackList)
162 return blackList.contains(workerType);
167 public void startWorker(AlignCalcWorkerI worker)
169 // System.err.println("Starting "+worker.getClass());
170 // new Exception("").printStackTrace();
171 Thread tw = new Thread(worker);
172 tw.setName(worker.getClass().toString());
177 public boolean isWorking(AlignCalcWorkerI worker)
179 synchronized (inProgress)
180 {// System.err.println("isWorking : worker "+(worker!=null ?
181 // worker.getClass():"null")+ " "+hashCode());
182 return worker != null && inProgress.get(worker.getClass()) == worker;
187 public boolean isWorking()
189 synchronized (inProgress)
191 // System.err.println("isWorking "+hashCode());
192 return inProgress.size() > 0;
197 public void registerWorker(AlignCalcWorkerI worker)
199 synchronized (restartable)
201 if (!restartable.contains(worker))
203 restartable.add(worker);
210 public void restartWorkers()
212 synchronized (restartable)
214 for (AlignCalcWorkerI worker : restartable)
222 public boolean workingInvolvedWith(AlignmentAnnotation alignmentAnnotation)
224 synchronized (inProgress)
226 for (AlignCalcWorkerI worker : inProgress.values())
228 if (worker.involves(alignmentAnnotation))
234 synchronized (updating)
236 for (List<AlignCalcWorkerI> workers : updating.values())
238 for (AlignCalcWorkerI worker : workers)
239 if (worker.involves(alignmentAnnotation))
249 public void updateAnnotationFor(Class workerClass)
252 AlignCalcWorkerI[] workers;
253 synchronized (canUpdate)
255 workers = canUpdate.toArray(new AlignCalcWorkerI[0]);
257 for (AlignCalcWorkerI worker : workers)
259 if (workerClass.equals(worker.getClass()))
261 worker.updateAnnotation();
267 public List<AlignCalcWorkerI> getRegisteredWorkersOfClass(
270 List<AlignCalcWorkerI> workingClass = new ArrayList<AlignCalcWorkerI>();
271 AlignCalcWorkerI[] workers;
272 synchronized (canUpdate)
274 workers = canUpdate.toArray(new AlignCalcWorkerI[0]);
276 for (AlignCalcWorkerI worker : workers)
278 if (workerClass.equals(worker.getClass()))
280 workingClass.add(worker);
283 return (workingClass.size() == 0) ? null : workingClass;
287 public boolean startRegisteredWorkersOfClass(Class workerClass)
289 List<AlignCalcWorkerI> workers = getRegisteredWorkersOfClass(workerClass);
294 for (AlignCalcWorkerI worker : workers)
296 if (!isPending(worker))
302 System.err.println("Pending exists for " + workerClass);
309 public void workerMayRun(AlignCalcWorkerI worker)
311 synchronized (blackList)
313 if (blackList.contains(worker.getClass()))
315 blackList.remove(worker.getClass());
321 public void removeRegisteredWorkersOfClass(Class typeToRemove)
323 List<AlignCalcWorkerI> workers = getRegisteredWorkersOfClass(typeToRemove);
324 List<AlignCalcWorkerI> removable = new ArrayList<AlignCalcWorkerI>();
325 Set<AlignCalcWorkerI> toremovannot=new HashSet<AlignCalcWorkerI>();
326 synchronized (restartable)
328 for (AlignCalcWorkerI worker:restartable) {
329 if (typeToRemove.equals(worker.getClass())) {
330 removable.add(worker);
331 toremovannot.add(worker);
334 restartable.removeAll(removable);
336 synchronized (canUpdate)
338 for (AlignCalcWorkerI worker:canUpdate) {
339 if (typeToRemove.equals(worker.getClass())) {
340 removable.add(worker);
341 toremovannot.add(worker);
344 canUpdate.removeAll(removable);
346 // TODO: finish testing this extension
348 /* synchronized (inProgress)
350 // need to kill or mark as dead any running threads...
351 (inProgress.get(typeToRemove));
358 for (AlignCalcWorkerI worker : workers)
361 if (isPending(worker))
363 worker.abortAndDestroy();
368 System.err.println("Pending exists for " + workerClass);