1 package jalview.ws2.actions.annotation;
3 import java.util.ArrayList;
4 import java.util.Collections;
7 import jalview.analysis.AlignmentAnnotationUtils;
8 import jalview.api.AlignViewportI;
9 import jalview.api.AlignmentViewPanel;
10 import jalview.api.PollableAlignCalcWorkerI;
11 import jalview.datamodel.AlignmentAnnotation;
12 import jalview.datamodel.AlignmentI;
13 import jalview.workers.AlignCalcWorker;
14 import jalview.ws.params.ArgumentI;
15 import jalview.ws2.actions.api.TaskEventListener;
16 import jalview.ws2.actions.api.TaskI;
17 import jalview.ws2.api.Credentials;
19 public class AlignCalcWorkerAdapter extends AlignCalcWorker implements PollableAlignCalcWorkerI
21 private static int calcCount = 0;
23 private final int calcNumber = calcCount++;
25 private final AnnotationAction action;
27 private final List<ArgumentI> args;
29 private final Credentials credentials;
31 private TaskI<AnnotationResult> currentTask = null;
33 private TaskEventListener<AnnotationResult> taskListener = new TaskEventListener<>()
36 public void taskCompleted(TaskI source, AnnotationResult result)
38 int graphGroup = alignViewport.getAlignment().getLastGraphGroup();
39 List<AlignmentAnnotation> annotations = new ArrayList<>();
40 for (AlignmentAnnotation ala : result.getAnnotations())
42 if (ala.graphGroup > 0)
43 ala.graphGroup += graphGroup;
44 var newAnnot = alignViewport.getAlignment()
45 .updateFromOrCopyAnnotation(ala);
46 if (newAnnot.sequenceRef != null)
48 newAnnot.sequenceRef.addAlignmentAnnotation(newAnnot);
49 newAnnot.adjustForAlignment();
50 AlignmentAnnotationUtils.replaceAnnotationOnAlignmentWith(
51 newAnnot, newAnnot.label, newAnnot.getCalcId());
53 annotations.add(newAnnot);
55 updateOurAnnots(annotations);
56 listener.workerHasResult(
57 AlignCalcWorkerAdapter.this,
61 result.featureColours,
62 result.featureFilters));
66 public AlignCalcWorkerAdapter(AlignViewportI alignViewport, AlignmentViewPanel alignPanel, AnnotationAction action,
67 List<ArgumentI> args, Credentials credentials)
69 super(alignViewport, alignPanel);
72 this.credentials = credentials;
76 public String getCalcName()
78 return action.getWebService().getName();
82 public void updateAnnotation()
87 private void updateOurAnnots(List<AlignmentAnnotation> newAnnots)
89 List<AlignmentAnnotation> oldAnnots = ourAnnots != null ? ourAnnots : List.of();
90 AlignmentI alignment = alignViewport.getAlignment();
91 for (AlignmentAnnotation annotation : oldAnnots)
92 if (!newAnnots.contains(annotation))
93 alignment.deleteAnnotation(annotation);
94 for (AlignmentAnnotation annotation : newAnnots)
95 alignment.validateAnnotation(annotation);
96 ourAnnots = Collections.synchronizedList(newAnnots);
100 public synchronized void startUp() throws Throwable
102 if (alignViewport.isClosed())
104 calcMan.disableWorker(this);
106 throw new IllegalStateException("Starting calculation for closed viewport");
108 currentTask = action.createTask(alignViewport, args, credentials);
109 currentTask.addTaskEventListener(taskListener);
111 listener.workerStarted(this);
115 public boolean poll() throws Throwable
117 return currentTask.poll();
121 public synchronized void cancel()
125 currentTask.cancel();
128 currentTask.removeTaskEventListener(taskListener);
129 listener.workerStopped(this);
134 public synchronized void done()
138 currentTask.complete();
139 } catch (Exception e)
143 currentTask.removeTaskEventListener(taskListener);
144 listener.workerStopped(this);
149 public boolean isDeletable()
155 public String toString()
157 return "AlignCalcWorkerAdapter-" + calcNumber + " for " + getCalcName();
160 public interface WorkerListener extends java.util.EventListener
162 default void workerStarted(AlignCalcWorkerAdapter source)
166 default void workerStopped(AlignCalcWorkerAdapter source)
170 default void workerHasResult(AlignCalcWorkerAdapter source, AnnotationResult result)
174 static final WorkerListener NULL_LISTENER = new WorkerListener()
179 private WorkerListener listener = WorkerListener.NULL_LISTENER;
181 public void setWorkerListener(WorkerListener listener)
183 if (listener == null) listener = WorkerListener.NULL_LISTENER;
184 this.listener = listener;