(JAL-961) methods for checking calculation status
[jalview.git] / src / jalview / workers / AlignCalcManager.java
1 package jalview.workers;
2
3 import java.util.ArrayList;
4 import java.util.Hashtable;
5 import java.util.List;
6 import java.util.Map;
7
8 import jalview.api.AlignCalcManagerI;
9 import jalview.api.AlignCalcWorkerI;
10
11 public class AlignCalcManager implements AlignCalcManagerI
12 {
13   private List<Class> blackList = new ArrayList<Class>();
14
15   /**
16    * global record of calculations in progress
17    */
18   private static Hashtable<Class, AlignCalcWorkerI> inProgress = new Hashtable<Class, AlignCalcWorkerI>();
19
20   /**
21    * record of calculations pending or in progress in the current context
22    */
23   private Map<Class, List<AlignCalcWorkerI>> updating = new Hashtable<Class, List<AlignCalcWorkerI>>();
24
25   @Override
26   public void notifyStart(AlignCalcWorkerI worker)
27   {
28     List<AlignCalcWorkerI> upd = updating.get(worker.getClass());
29     if (upd == null)
30     {
31       updating.put(worker.getClass(),
32               upd = new ArrayList<AlignCalcWorkerI>());
33     }
34     // upd.add(worker);
35   }
36
37   @Override
38   public  synchronized boolean alreadyDoing(AlignCalcWorkerI worker)
39   {
40     return inProgress.containsKey(worker.getClass());
41   }
42
43   @Override
44   public synchronized boolean notifyWorking(AlignCalcWorkerI worker)
45   {
46     // synchronized (inProgress)
47     {
48       // TODO: decide if we should throw exceptions here if multiple workers
49       // start to work
50       if (inProgress.get(worker.getClass()) != null)
51       {
52         if (false)
53         {
54           System.err
55                   .println("Warning: Multiple workers are running of type "
56                           + worker.getClass());
57         }
58         return false;
59       }
60       inProgress.put(worker.getClass(), worker);
61     }
62     return true;
63   }
64
65   @Override
66   public synchronized void workerComplete(AlignCalcWorkerI worker)
67   {
68     inProgress.remove(worker.getClass());
69     List<AlignCalcWorkerI> upd = updating.get(worker.getClass());
70     if (upd != null)
71     {
72       upd.remove(worker);
73     }
74
75   }
76
77   @Override
78   public void workerCannotRun(AlignCalcWorkerI worker)
79   {
80     blackList.add(worker.getClass());
81   }
82
83   public boolean isBlackListed(Class workerType)
84   {
85     return blackList.contains(workerType);
86   }
87
88   @Override
89   public void startWorker(AlignCalcWorkerI worker)
90   {
91     new Thread(worker).start();
92   }
93
94   @Override
95   public synchronized boolean isWorking(AlignCalcWorkerI worker)
96   {
97 //    System.err.println("isWorking : worker "+(worker!=null ? worker.getClass():"null")+ " "+hashCode());
98     return worker!=null && inProgress.get(worker.getClass()) == worker;
99   }
100   @Override
101   public boolean isWorking()
102   {
103 //    System.err.println("isWorking "+hashCode());
104     return inProgress.size()>0;
105   }
106 }