1 package jalview.ws2.gui;
3 import static java.lang.String.format;
5 import java.util.Objects;
6 import java.util.function.Consumer;
8 import javax.swing.JMenu;
9 import javax.swing.JMenuItem;
11 import jalview.datamodel.Alignment;
12 import jalview.datamodel.AlignmentAnnotation;
13 import jalview.gui.AlignFrame;
14 import jalview.gui.Desktop;
15 import jalview.gui.WebserviceInfo;
16 import jalview.util.MessageManager;
17 import jalview.ws2.WSJob;
18 import jalview.ws2.operations.JPredOperation;
19 import jalview.ws2.operations.JPredWorker;
20 import jalview.ws2.operations.WebServiceWorkerI;
21 import jalview.ws2.operations.WebServiceWorkerListener;
22 import jalview.ws2.operations.JPredWorker.PredictionResult;
24 public class JPredMenuBuilder implements MenuEntryProviderI
26 private JPredOperation operation;
28 public JPredMenuBuilder(JPredOperation operation)
30 this.operation = operation;
33 public void buildMenu(JMenu menu, AlignFrame frame)
35 final JMenuItem mi = new JMenuItem(operation.getName());
36 mi.setToolTipText(operation.getHostName());
37 mi.addActionListener((event) -> {
38 String panelInfo = String.format("%s using service hosted at %s%n%s",
39 operation.getName(), operation.getHostName(),
40 Objects.requireNonNullElse(operation.getDescription(), ""));
41 var wsInfo = new WebserviceInfo(operation.getName(), panelInfo, false);
43 var alignView = frame.gatherSeqOrMsaForSecStrPrediction();
44 var worker = new JPredWorker(operation, alignView,
45 frame.getCurrentView());
47 var jpu = new JPredProgressUpdater(worker, wsInfo, frame);
48 worker.setResultConsumer(jpu);
49 worker.addListener(jpu);
51 frame.getViewport().getWSExecutor().submit(worker);
57 class JPredProgressUpdater
58 implements WebServiceWorkerListener, Consumer<PredictionResult>
60 WebServiceWorkerI worker;
62 WebserviceInfo wsInfo;
66 private final WebServiceInfoUpdater wsInfoUpdater;
68 JPredProgressUpdater(WebServiceWorkerI worker, WebserviceInfo wsInfo,
74 this.wsInfoUpdater = new WebServiceInfoUpdater(worker, wsInfo);
78 public void workerStarted(WebServiceWorkerI source)
80 wsInfo.setVisible(true);
84 public void workerNotStarted(WebServiceWorkerI source)
86 wsInfo.setVisible(true);
87 wsInfo.setStatus(WebserviceInfo.STATE_STOPPED_SERVERERROR);
88 wsInfo.setStatus(0, WebserviceInfo.STATE_STOPPED_SERVERERROR);
89 wsInfo.appendProgressText(0, MessageManager.getString(
90 "info.failed_to_submit_sequences_for_alignment"));
94 public void jobCreated(WebServiceWorkerI source, WSJob job)
97 job.addPropertyChangeListener(wsInfoUpdater);
101 public void pollException(WebServiceWorkerI source, WSJob job, Exception e)
103 wsInfo.appendProgressText(job.getJobNum(),
104 MessageManager.formatMessage("info.server_exception",
105 source.getOperation().getName(), e.getMessage()));
109 public void workerCompleting(WebServiceWorkerI source)
111 wsInfo.setProgressBar(
112 MessageManager.getString("status.collecting_job_results"),
117 public void workerCompleted(WebServiceWorkerI source)
119 wsInfo.removeProgressBar(worker.getUID());
123 public void accept(PredictionResult result)
127 wsInfo.showResultsNewFrame.addActionListener(
128 (evt) -> displayResults(result, true));
129 wsInfo.mergeResults.addActionListener(
130 (evt) -> displayResults(result, false));
131 wsInfo.setResultsReady();
135 wsInfo.setStatus(WebserviceInfo.STATE_STOPPED_ERROR);
136 wsInfo.appendInfoText("No jobs ran.");
137 wsInfo.setFinishedNoResults();
141 private void displayResults(PredictionResult result, boolean newWindow)
145 Alignment alignment = new Alignment(result.getAlignment());
146 alignment.setSeqrep(alignment.getSequenceAt(0));
147 for (var annot : alignment.getSeqrep().getAnnotation())
149 alignment.addAnnotation(annot);
151 AlignFrame frame = new AlignFrame(alignment, result.getHiddenCols(),
152 AlignFrame.DEFAULT_WIDTH, AlignFrame.DEFAULT_HEIGHT);
153 Desktop.addInternalFrame(frame, frame.getTitle(), AlignFrame.DEFAULT_WIDTH,
154 AlignFrame.DEFAULT_HEIGHT);