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