JAL-3878 Create abstract base classes for non-interactive tasks
[jalview.git] / src / jalview / ws2 / helpers / DelegateJobEventListener.java
1 package jalview.ws2.helpers;
2
3 import java.beans.PropertyChangeEvent;
4 import java.beans.PropertyChangeListener;
5
6 import jalview.ws2.actions.BaseJob;
7 import jalview.ws2.actions.api.JobI;
8 import jalview.ws2.api.JobStatus;
9
10 /**
11  * A property change listener to be used by web service tasks that delegates all
12  * sub-job related events from {@link BaseJob} subclasses to
13  * {@link TaskEventSupport}. Tasks can create one instance of this class with
14  * their event handler as a delegate and add it as a property change listener to
15  * each sub-job supporting property change listeners. It ensures that an
16  * appropriate {@code fireSubJob*Changed} method of the delegate object will be
17  * called whenever a {@link PropertyChagneEvent} is emitted by the sub-job.
18  * 
19  * @author mmwarowny
20  *
21  * @param <T>
22  *          result type of the task
23  */
24 public class DelegateJobEventListener<T> implements PropertyChangeListener
25 {
26   private final TaskEventSupport<T> delegate;
27
28   public DelegateJobEventListener(TaskEventSupport<T> delegate)
29   {
30     this.delegate = delegate;
31   }
32
33   @Override
34   public void propertyChange(PropertyChangeEvent evt)
35   {
36     switch (evt.getPropertyName())
37     {
38     case "status":
39       statusChanged(evt);
40       break;
41     case "log":
42       logChanged(evt);
43       break;
44     case "errorLog":
45       errorLogChanged(evt);
46       break;
47     default:
48       throw new AssertionError(String.format(
49           "illegal property name \"%s\"", evt.getPropertyName()));
50     }
51   }
52
53   private void statusChanged(PropertyChangeEvent evt)
54   {
55     JobI job = (JobI) evt.getSource();
56     JobStatus status = (JobStatus) evt.getNewValue();
57     delegate.fireSubJobStatusChanged(job, status);
58   }
59
60   private void logChanged(PropertyChangeEvent evt)
61   {
62     JobI job = (JobI) evt.getSource();
63     String log = (String) evt.getNewValue();
64     delegate.fireSubJobLogChanged(job, log);
65   }
66
67   private void errorLogChanged(PropertyChangeEvent evt)
68   {
69     JobI job = (JobI) evt.getSource();
70     String errorLog = (String) evt.getNewValue();
71     delegate.fireSubJobErrorLogChanged(job, errorLog);
72   }
73 }