Merge branch 'JAL-3878_ws-overhaul-3' into mmw/Release_2_12_ws_merge
[jalview.git] / src / jalview / ws2 / helpers / DelegateJobEventListener.java
diff --git a/src/jalview/ws2/helpers/DelegateJobEventListener.java b/src/jalview/ws2/helpers/DelegateJobEventListener.java
new file mode 100644 (file)
index 0000000..45afefc
--- /dev/null
@@ -0,0 +1,73 @@
+package jalview.ws2.helpers;
+
+import java.beans.PropertyChangeEvent;
+import java.beans.PropertyChangeListener;
+
+import jalview.ws2.actions.BaseJob;
+import jalview.ws2.actions.api.JobI;
+import jalview.ws2.api.JobStatus;
+
+/**
+ * A property change listener to be used by web service tasks that delegates all
+ * sub-job related events from {@link BaseJob} subclasses to
+ * {@link TaskEventSupport}. Tasks can create one instance of this class with
+ * their event handler as a delegate and add it as a property change listener to
+ * each sub-job supporting property change listeners. It ensures that an
+ * appropriate {@code fireSubJob*Changed} method of the delegate object will be
+ * called whenever a {@link PropertyChagneEvent} is emitted by the sub-job.
+ * 
+ * @author mmwarowny
+ *
+ * @param <T>
+ *          result type of the task
+ */
+public class DelegateJobEventListener<T> implements PropertyChangeListener
+{
+  private final TaskEventSupport<T> delegate;
+
+  public DelegateJobEventListener(TaskEventSupport<T> delegate)
+  {
+    this.delegate = delegate;
+  }
+
+  @Override
+  public void propertyChange(PropertyChangeEvent evt)
+  {
+    switch (evt.getPropertyName())
+    {
+    case "status":
+      statusChanged(evt);
+      break;
+    case "log":
+      logChanged(evt);
+      break;
+    case "errorLog":
+      errorLogChanged(evt);
+      break;
+    default:
+      throw new AssertionError(String.format(
+          "illegal property name \"%s\"", evt.getPropertyName()));
+    }
+  }
+
+  private void statusChanged(PropertyChangeEvent evt)
+  {
+    JobI job = (JobI) evt.getSource();
+    JobStatus status = (JobStatus) evt.getNewValue();
+    delegate.fireSubJobStatusChanged(job, status);
+  }
+
+  private void logChanged(PropertyChangeEvent evt)
+  {
+    JobI job = (JobI) evt.getSource();
+    String log = (String) evt.getNewValue();
+    delegate.fireSubJobLogChanged(job, log);
+  }
+
+  private void errorLogChanged(PropertyChangeEvent evt)
+  {
+    JobI job = (JobI) evt.getSource();
+    String errorLog = (String) evt.getNewValue();
+    delegate.fireSubJobErrorLogChanged(job, errorLog);
+  }
+}