JAL-3878 Code reformatting.
[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     executor.schedule(() -> pollJobs(worker), 1, TimeUnit.SECONDS);
35   }
36
37   private void pollJobs(WebServiceWorkerI worker)
38   {
39     try
40     {
41       worker.pollJobs();
42     } catch (Exception e)
43     {
44       Cache.log.error("Failed to poll web service jobs.", e);
45       for (WSJob job : worker.getJobs())
46       {
47         job.setStatus(WSJobStatus.SERVER_ERROR);
48       }
49       wsThreadSupport.pollFailed(worker, e);
50       return;
51     }
52     if (!worker.isDone())
53     {
54       executor.schedule(() -> pollJobs(worker), 1, TimeUnit.SECONDS);
55     }
56     else
57     {
58       worker.done();
59       wsThreadSupport.done(worker);
60     }
61   }
62
63   private WebServiceThreadSupport wsThreadSupport = new WebServiceThreadSupport();
64
65   public void addThreadListener(WebServiceThreadListenerI listener)
66   {
67     wsThreadSupport.addListener(listener);
68   }
69
70   public void removeThreadListener(WebServiceThreadListenerI listener)
71   {
72     wsThreadSupport.removeListener(listener);
73   }
74
75   public void shutdown()
76   {
77     executor.shutdownNow();
78   }
79
80 }
81
82 class WebServiceThreadSupport implements WebServiceThreadListenerI
83 {
84   List<WebServiceThreadListenerI> listeners = new CopyOnWriteArrayList<>();
85
86   @Override
87   public void submitted(WebServiceWorkerI thread)
88   {
89     for (var listener : listeners)
90       listener.submitted(thread);
91   }
92
93   @Override
94   public void submissionFailed(WebServiceWorkerI thread, Exception e)
95   {
96     for (var listener : listeners)
97       listener.submissionFailed(thread, e);
98   }
99
100   @Override
101   public void pollFailed(WebServiceWorkerI thread, Exception e)
102   {
103     for (var listener : listeners)
104       listener.pollFailed(thread, e);
105   }
106
107   @Override
108   public void cancelled(WebServiceWorkerI thread)
109   {
110     for (var listener : listeners)
111       listener.cancelled(thread);
112   }
113
114   @Override
115   public void done(WebServiceWorkerI thread)
116   {
117     for (var listener : listeners)
118       listener.done(thread);
119   }
120
121   public void addListener(WebServiceThreadListenerI listener)
122   {
123     if (!listeners.contains(listener))
124     {
125       listeners.add(listener);
126     }
127   }
128
129   public void removeListener(WebServiceThreadListenerI listener)
130   {
131     listeners.remove(listener);
132   }
133 }