JAL-3878 Initial preparation.
[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 import jalview.ws2.WebServiceWorkerI.WSJob;
14
15 public class WebServiceExecutor
16 {
17   private ScheduledExecutorService executor =
18       Executors.newSingleThreadScheduledExecutor();
19   
20   public void submit(final WebServiceWorkerI worker)
21   {
22     for (var job : worker.getJobs()) {
23       executor.submit(() -> submitJob(worker, job));
24       executor.schedule(() -> pollJob(worker, job), 1, TimeUnit.SECONDS);
25     }
26   }
27   
28   private void submitJob(WebServiceWorkerI worker, WSJob job) {
29     try {
30       job.setJobID(worker.startJob(job).getJobID());
31       job.resetAllowedExceptions();
32       executor.schedule(() -> pollJob(worker, job), 1, TimeUnit.SECONDS);
33     }
34     catch (IOException e) {
35       Cache.log.error("Exception occurred during job submission", e);
36       if (!job.deductAllowedExceptions()) {
37         job.setState(WSJobState.SERVER_ERROR);
38       }
39     }
40     if (!job.getState().isSubmitted()) {
41       executor.schedule(() -> submitJob(worker, job), 5, TimeUnit.SECONDS);
42     }
43   }
44   
45   private void pollJob(WebServiceWorkerI worker, WSJob job) {
46     try {
47       worker.pollJob(job);
48       job.resetAllowedExceptions();
49     }
50     catch (IOException e) {
51       Cache.log.error("Exception occurred duringn job pollign", e);
52       if (!job.deductAllowedExceptions()) {
53         job.setState(WSJobState.SERVER_ERROR);
54       }
55     }
56     if (!job.getState().isDone()) {
57       executor.schedule(() -> pollJob(worker, job), 1, TimeUnit.SECONDS);
58     }
59   }
60   
61   public static interface WebServiceThreadListenerI
62   {
63     public void threadSubmitted(WebServiceWorkerI thread);
64     public void threadStarted(WebServiceWorkerI thread);
65     public void stateChanged(WebServiceWorkerI thread, WSJobState oldState,
66         WSJobState newState);
67     public void logAppended(WebServiceWorkerI thread, String text);
68     public void errorLogAppended(WebServiceWorkerI thread, String text);
69     public void cancelled(WebServiceWorkerI thread);
70   }
71   
72   
73   List<WebServiceThreadListenerI> listeners = new CopyOnWriteArrayList<>();
74   
75   public void addServiceListener(WebServiceThreadListenerI listener)
76   {
77     if (!listeners.contains(listener))
78       listeners.add(listener);
79   }
80   
81   public void removeServiceListener(WebServiceThreadListenerI listener)
82   {
83     listeners.remove(listener);
84   }
85 }