--- /dev/null
+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);
+ }
+}