X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;f=src%2Fjalview%2Fws2%2Factions%2Fannotation%2FAlignCalcWorkerAdapter.java;h=60d7f159634cd7a048989e011a8aec3889bb2b65;hb=4df015be529a2e1b12c6b82b061798e186cc154b;hp=7e8724a590883c65cda98afc96ad00a7122f75b3;hpb=4ad368a5d0d8ba69afc2048e1f97b60d0f2e075b;p=jalview.git diff --git a/src/jalview/ws2/actions/annotation/AlignCalcWorkerAdapter.java b/src/jalview/ws2/actions/annotation/AlignCalcWorkerAdapter.java index 7e8724a..60d7f15 100644 --- a/src/jalview/ws2/actions/annotation/AlignCalcWorkerAdapter.java +++ b/src/jalview/ws2/actions/annotation/AlignCalcWorkerAdapter.java @@ -3,25 +3,25 @@ package jalview.ws2.actions.annotation; import java.util.ArrayList; import java.util.Collections; import java.util.List; -import java.util.concurrent.CopyOnWriteArrayList; +import jalview.analysis.AlignmentAnnotationUtils; import jalview.api.AlignViewportI; import jalview.api.AlignmentViewPanel; import jalview.api.PollableAlignCalcWorkerI; -import jalview.datamodel.Alignment; import jalview.datamodel.AlignmentAnnotation; import jalview.datamodel.AlignmentI; import jalview.workers.AlignCalcWorker; import jalview.ws.params.ArgumentI; -import jalview.ws2.actions.alignment.AlignmentResult; -import jalview.ws2.actions.api.JobI; import jalview.ws2.actions.api.TaskEventListener; import jalview.ws2.actions.api.TaskI; import jalview.ws2.api.Credentials; -import jalview.ws2.api.JobStatus; public class AlignCalcWorkerAdapter extends AlignCalcWorker implements PollableAlignCalcWorkerI { + private static int calcCount = 0; + + private final int calcNumber = calcCount++; + private final AnnotationAction action; private final List args; @@ -30,21 +30,39 @@ public class AlignCalcWorkerAdapter extends AlignCalcWorker implements PollableA private TaskI currentTask = null; - private TaskEventListener internalTaskListener = new TaskEventListener<>() + private TaskEventListener taskListener = new TaskEventListener<>() { @Override public void taskCompleted(TaskI source, AnnotationResult result) { - updateOurAnnots(result.getAnnotations()); + int graphGroup = alignViewport.getAlignment().getLastGraphGroup(); + List annotations = new ArrayList<>(); + for (AlignmentAnnotation ala : result.getAnnotations()) + { + if (ala.graphGroup > 0) + ala.graphGroup += graphGroup; + var newAnnot = alignViewport.getAlignment() + .updateFromOrCopyAnnotation(ala); + if (newAnnot.sequenceRef != null) + { + newAnnot.sequenceRef.addAlignmentAnnotation(newAnnot); + newAnnot.adjustForAlignment(); + AlignmentAnnotationUtils.replaceAnnotationOnAlignmentWith( + newAnnot, newAnnot.label, newAnnot.getCalcId()); + } + annotations.add(newAnnot); + } + updateOurAnnots(annotations); + listener.workerHasResult( + AlignCalcWorkerAdapter.this, + new AnnotationResult( + annotations, + result.hasFeatures, + result.featureColours, + result.featureFilters)); } }; - // task event listeners managed by this worker, passed to each creates task - private List> taskListeners = new CopyOnWriteArrayList<>(); - { - taskListeners.add(internalTaskListener); - } - public AlignCalcWorkerAdapter(AlignViewportI alignViewport, AlignmentViewPanel alignPanel, AnnotationAction action, List args, Credentials credentials) { @@ -55,6 +73,12 @@ public class AlignCalcWorkerAdapter extends AlignCalcWorker implements PollableA } @Override + public String getCalcName() + { + return action.getWebService().getName(); + } + + @Override public void updateAnnotation() { @@ -69,7 +93,6 @@ public class AlignCalcWorkerAdapter extends AlignCalcWorker implements PollableA alignment.deleteAnnotation(annotation); for (AlignmentAnnotation annotation : newAnnots) alignment.validateAnnotation(annotation); - ap.adjustAnnotationHeight(); ourAnnots = Collections.synchronizedList(newAnnots); } @@ -83,9 +106,9 @@ public class AlignCalcWorkerAdapter extends AlignCalcWorker implements PollableA throw new IllegalStateException("Starting calculation for closed viewport"); } currentTask = action.createTask(alignViewport, args, credentials); - for (var listener : taskListeners) - currentTask.addTaskEventListener(listener); + currentTask.addTaskEventListener(taskListener); currentTask.init(); + listener.workerStarted(this); } @Override @@ -102,8 +125,8 @@ public class AlignCalcWorkerAdapter extends AlignCalcWorker implements PollableA currentTask.cancel(); } finally { - for (var listener : taskListeners) - currentTask.removeTaskEventListener(listener); + currentTask.removeTaskEventListener(taskListener); + listener.workerStopped(this); } } @@ -117,22 +140,47 @@ public class AlignCalcWorkerAdapter extends AlignCalcWorker implements PollableA { } finally { - for (var listener : taskListeners) - currentTask.removeTaskEventListener(listener); + currentTask.removeTaskEventListener(taskListener); + listener.workerStopped(this); } } - public void addTaskEventListener(TaskEventListener listener) + @Override + public boolean isDeletable() { - taskListeners.add(listener); - if (currentTask != null) - currentTask.addTaskEventListener(listener); + return true; } - public void removeTaskEventListener(TaskEventListener listener) + @Override + public String toString() + { + return "AlignCalcWorkerAdapter-" + calcNumber + " for " + getCalcName(); + } + + public interface WorkerListener extends java.util.EventListener + { + default void workerStarted(AlignCalcWorkerAdapter source) + { + }; + + default void workerStopped(AlignCalcWorkerAdapter source) + { + }; + + default void workerHasResult(AlignCalcWorkerAdapter source, AnnotationResult result) + { + }; + + static final WorkerListener NULL_LISTENER = new WorkerListener() + { + }; + } + + private WorkerListener listener = WorkerListener.NULL_LISTENER; + + public void setWorkerListener(WorkerListener listener) { - taskListeners.remove(listener); - if (currentTask != null) - currentTask.removeTaskEventListener(listener); + if (listener == null) listener = WorkerListener.NULL_LISTENER; + this.listener = listener; } }