JAL-3878 Add javadocs to created classes and reformat code.
[jalview.git] / src / jalview / ws2 / WebServiceWorkerListenersList.java
1 package jalview.ws2;
2
3 import java.util.List;
4 import java.util.concurrent.CopyOnWriteArrayList;
5 import java.util.function.Consumer;
6
7 /**
8  * Utility class that manages a list of {@link WebServiceWorkerListener} and
9  * dispatches signals to them. An instance of this class can be used as a member
10  * field of the {@link WebServiceWorkerI} object to easily store listeners and
11  * delegate signals to them. Firing any signal with this object will invoke a
12  * corresponding method on all registered listeners in order they were
13  * registered.
14  * 
15  * @author mmwarowny
16  *
17  */
18 public class WebServiceWorkerListenersList
19 {
20   private WebServiceWorkerI owner;
21
22   private List<WebServiceWorkerListener> listeners = new CopyOnWriteArrayList<>();
23
24   /**
25    * Constructs a listeners list object with the worker which will be given
26    * to the listeners as the source of the signals.
27    * 
28    * @param worker the worker to be given as the source for signals
29    */
30   public WebServiceWorkerListenersList(WebServiceWorkerI worker)
31   {
32     this.owner = worker;
33   }
34
35   /**
36    * Add listener to the listeners list. The listener will be notified of
37    * any signals triggered with this object.
38    * 
39    * @param listener listener to add
40    */
41   public void addListener(WebServiceWorkerListener listener)
42   {
43     listeners.add(listener);
44   }
45
46   /**
47    * Remove listener from the lsiteners list. The listener will no longer be
48    * notified of the emitted signals.
49    * 
50    * @param listener listener to remove
51    */
52   public void removeListener(WebServiceWorkerListener listener)
53   {
54     listeners.remove(listener);
55   }
56
57   /**
58    * Emit "worker started" signal to all listeners.
59    */
60   public void fireWorkerStarted()
61   {
62     for (var listener : listeners)
63       listener.workerStarted(owner);
64   }
65
66   /**
67    * Emit "worker not started" signal to all listeners.
68    */
69   public void fireWorkerNotStarted()
70   {
71     for (var listener : listeners)
72       listener.workerNotStarted(owner);
73   }
74
75   /**
76    * Emit "job created" signal to all listeners passing the job that has been
77    * created to them.
78    * 
79    * @param job newly created job
80    */
81   public void fireJobCreated(WSJob job)
82   {
83     for (var listener : listeners)
84       listener.jobCreated(owner, job);
85   }
86
87   /**
88    * Emit "poll exception" signal to all listener when an exception occurred
89    * during job polling. The job which caused an exception as well as the exception
90    * are passed to all listeners.
91    * 
92    * @param job polled job
93    * @param e exception that occurred
94    */
95   public void firePollException(WSJob job, Exception e)
96   {
97     for (var listener : listeners)
98       listener.pollException(owner, job, e);
99   }
100
101   /**
102    * Emit "worker completing" signal to all listeners when the worker starts
103    * collecting and parsing the results.
104    */
105   public void fireWorkerCompleting()
106   {
107     for (var listener : listeners)
108       listener.workerCompleting(owner);
109   }
110
111   /**
112    * Emit "worker completed" signal to all listeners indicating that the worker
113    * finished processing data and finalized the jobs. 
114    */
115   public void fireWorkerCompleted()
116   {
117     for (var listener : listeners)
118       listener.workerCompleted(owner);
119   }
120   
121   /**
122    * Get the list of registered listeners. The returned list should not be
123    * modified externally and its content may change when workers are added
124    * or removed from the list.
125    * @return
126    */
127   public List<WebServiceWorkerListener> getListeners()
128   {
129     return listeners;
130   }
131
132   /**
133    * Execute an operation for each listener in the listeners list.
134    * 
135    * @param consumer listener object consumer 
136    */
137   public void forEach(Consumer<WebServiceWorkerListener> consumer)
138   {
139     for (var listener : listeners)
140       consumer.accept(listener);
141   }
142 }