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