Introduced new AlignCalcWorker/manager interface.
[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    * global record of calculations in progress
16    */
17   private static Hashtable<Class,AlignCalcWorkerI> inProgress=new Hashtable<Class,AlignCalcWorkerI>();
18   /**
19    * record of calculations pending or in progress in the current context
20    */
21   private Map<Class,List<AlignCalcWorkerI>> updating=new Hashtable<Class,List<AlignCalcWorkerI>>();
22   
23   @Override
24   public void notifyStart(AlignCalcWorkerI worker)
25   {
26     List<AlignCalcWorkerI> upd = updating.get(worker.getClass());
27     if (upd==null)
28     {
29       updating.put(worker.getClass(), upd=new ArrayList<AlignCalcWorkerI>());
30     }
31     upd.add(worker);
32   }
33
34   @Override
35   public boolean alreadyDoing(AlignCalcWorkerI worker)
36   {
37     return inProgress.containsKey(worker.getClass());
38   }
39
40   @Override
41   public void notifyWorking(AlignCalcWorkerI worker)
42   {
43     // TODO: decide if we should throw exceptions here if multiple workers start to work
44     if (inProgress.get(worker.getClass())!=null)
45     {
46       System.err.println("Warning: Multiple workers are running of type "+worker.getClass());
47     }
48     inProgress.put(worker.getClass(), worker);
49     
50   }
51
52   @Override
53   public void workerComplete(AlignCalcWorkerI worker)
54   {
55     inProgress.remove(worker);
56   }
57
58   @Override
59   public void workerCannotRun(AlignCalcWorkerI worker)
60   {
61     blackList.add(worker.getClass());
62   }
63   public boolean isBlackListed(Class workerType)
64   {
65     return blackList.contains(workerType);
66   }
67
68   @Override
69   public void startWorker(AlignCalcWorkerI worker)
70   {
71     new Thread(worker).start();
72   }
73 }