Merge branch 'JAL-3878_web_services_overhaul' into try-to-update-slivka-jar
[jalview.git] / src / jalview / ws2 / PollingTaskExecutor.java
1 package jalview.ws2;
2
3 import java.util.List;
4 import java.util.concurrent.CopyOnWriteArrayList;
5 import java.util.concurrent.Executors;
6 import java.util.concurrent.ScheduledExecutorService;
7 import java.util.concurrent.TimeUnit;
8
9 import jalview.bin.Cache;
10 import jalview.bin.Console;
11
12 public class PollingTaskExecutor
13 {
14   private ScheduledExecutorService executor = Executors
15           .newSingleThreadScheduledExecutor();
16
17   public void submit(final PollableTaskI task)
18   {
19     executor.submit(() -> {
20       try
21       {
22         task.start();
23         wsThreadSupport.submitted(task);
24       } catch (Exception e)
25       {
26         Console.error("Failed to submit web service jobs.", e);
27         wsThreadSupport.submissionFailed(task, e);
28         return;
29       }
30       executor.schedule(() -> poll(task), 1, TimeUnit.SECONDS);
31     });
32   }
33
34   private void poll(PollableTaskI task)
35   {
36     boolean done;
37     try
38     {
39       done = task.poll();
40     } catch (Exception e)
41     {
42       Console.error("Failed to poll task.", e);
43       wsThreadSupport.pollFailed(task, e);
44       return;
45     }
46     if (!done)
47     {
48       executor.schedule(() -> poll(task), 1, TimeUnit.SECONDS);
49     }
50     else
51     {
52       task.done();
53       wsThreadSupport.done(task);
54     }
55   }
56
57   private WebServiceThreadSupport wsThreadSupport = new WebServiceThreadSupport();
58
59   public void addThreadListener(PollableTaskListenerI listener)
60   {
61     wsThreadSupport.addListener(listener);
62   }
63
64   public void removeThreadListener(PollableTaskListenerI listener)
65   {
66     wsThreadSupport.removeListener(listener);
67   }
68
69   public void shutdown()
70   {
71     executor.shutdownNow();
72   }
73
74 }
75
76 class WebServiceThreadSupport implements PollableTaskListenerI
77 {
78   List<PollableTaskListenerI> listeners = new CopyOnWriteArrayList<>();
79
80   @Override
81   public void submitted(PollableTaskI task)
82   {
83     for (var listener : listeners)
84       listener.submitted(task);
85   }
86
87   @Override
88   public void submissionFailed(PollableTaskI task, Exception e)
89   {
90     for (var listener : listeners)
91       listener.submissionFailed(task, e);
92   }
93
94   @Override
95   public void pollFailed(PollableTaskI task, Exception e)
96   {
97     for (var listener : listeners)
98       listener.pollFailed(task, e);
99   }
100
101   @Override
102   public void cancelled(PollableTaskI task)
103   {
104     for (var listener : listeners)
105       listener.cancelled(task);
106   }
107
108   @Override
109   public void done(PollableTaskI task)
110   {
111     for (var listener : listeners)
112       listener.done(task);
113   }
114
115   public void addListener(PollableTaskListenerI listener)
116   {
117     if (!listeners.contains(listener))
118     {
119       listeners.add(listener);
120     }
121   }
122
123   public void removeListener(PollableTaskListenerI listener)
124   {
125     listeners.remove(listener);
126   }
127 }