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