Clover icon

Coverage Report

  1. Project Clover database Thu Dec 4 2025 16:11:35 GMT
  2. Package jalview.ws2.gui

File SearchServiceGuiHandler.java

 

Coverage histogram

../../../img/srcFileCovDistChart0.png
60% of files have more coverage

Code metrics

22
107
9
1
234
207
40
0.37
11.89
9
4.44

Classes

Class Line # Actions
SearchServiceGuiHandler 29 107 40
0.00%
 

Contributing tests

No tests hitting this source file were found.

Source view

1    package jalview.ws2.gui;
2   
3    import java.util.List;
4   
5    import javax.swing.SwingUtilities;
6   
7    import jalview.analysis.AlignmentUtils;
8    import jalview.bin.Console;
9    import jalview.datamodel.Alignment;
10    import jalview.datamodel.AlignmentAnnotation;
11    import jalview.datamodel.AlignmentI;
12    import jalview.datamodel.HiddenColumns;
13    import jalview.gui.AlignFrame;
14    import jalview.gui.Desktop;
15    import jalview.gui.JvOptionPane;
16    import jalview.gui.WebserviceInfo;
17    import jalview.util.ArrayUtils;
18    import jalview.util.MessageManager;
19    import jalview.ws2.actions.api.ActionI;
20    import jalview.ws2.actions.api.JobI;
21    import jalview.ws2.actions.api.TaskEventListener;
22    import jalview.ws2.actions.api.TaskI;
23    import jalview.ws2.api.JobStatus;
24    import jalview.ws2.api.WebService;
25    import jalview.ws2.helpers.WSClientTaskWrapper;
26   
27    import static java.lang.String.format;
28   
 
29    class SearchServiceGuiHandler implements TaskEventListener<AlignmentI>
30    {
31    private final AlignFrame parentFrame;
32   
33    private final ActionI<?> action;
34   
35    private final WebService<?> service;
36   
37    private WebserviceInfo infoPanel;
38   
39    private JobI[] jobs = new JobI[0];
40   
41    private int[] tabs = new int[0];
42   
43    private int[] logOffset = new int[0];
44   
45    private int[] errLogOffset = new int[0];
46   
 
47  0 toggle public SearchServiceGuiHandler(ActionI<?> action, AlignFrame parentFrame)
48    {
49  0 this.parentFrame = parentFrame;
50  0 this.action = action;
51  0 this.service = action.getWebService();
52  0 var info = String.format("%s search using service at %s%n%s",
53    service.getName(), service.getUrl(), service.getDescription());
54  0 this.infoPanel = new WebserviceInfo(service.getName(), info, false);
55    }
56   
 
57  0 toggle @Override
58    public void taskStarted(TaskI<AlignmentI> source,
59    List<? extends JobI> subJobs)
60    {
61  0 Console.debug(format("task %s#%x started with %d sub-jobs",
62    service.getName(), source.getUid(), subJobs.size()));
63  0 jobs = subJobs.toArray(new JobI[subJobs.size()]);
64  0 tabs = new int[subJobs.size()];
65  0 logOffset = new int[subJobs.size()];
66  0 errLogOffset = new int[subJobs.size()];
67  0 for (int i = 0; i < subJobs.size(); i++)
68    {
69  0 JobI job = jobs[i];
70  0 int tabIndex = infoPanel.addJobPane();
71  0 tabs[i] = tabIndex;
72  0 infoPanel.setProgressName(format("region %d", i), tabIndex);
73  0 infoPanel.setProgressText(tabIndex, "Job details:\n");
74    // jobs should not have states other than invalid or ready at this point
75  0 if (job.getStatus() == JobStatus.INVALID)
76  0 infoPanel.setStatus(tabIndex, WebserviceInfo.STATE_STOPPED_OK);
77  0 else if (job.getStatus() == JobStatus.READY)
78  0 infoPanel.setStatus(tabIndex, WebserviceInfo.STATE_QUEUING);
79    }
80    }
81   
 
82  0 toggle @Override
83    public void taskStatusChanged(TaskI<AlignmentI> source, JobStatus status)
84    {
85  0 Console.debug(format("task %s#%x status changed to %s",
86    service.getName(), source.getUid(), status));
87  0 switch (status)
88    {
89  0 case INVALID:
90  0 infoPanel.setVisible(false);
91  0 JvOptionPane.showMessageDialog(parentFrame,
92    MessageManager.getString("info.invalid_search_input"),
93    MessageManager.getString("info.invalid_search_input"),
94    JvOptionPane.INFORMATION_MESSAGE);
95  0 break;
96  0 case READY:
97  0 infoPanel.setthisService(new WSClientTaskWrapper(source));
98  0 infoPanel.setVisible(true);
99    // intentional no break
100  0 case SUBMITTED:
101  0 case QUEUED:
102  0 infoPanel.setStatus(WebserviceInfo.STATE_QUEUING);
103  0 break;
104  0 case RUNNING:
105  0 case UNKNOWN: // unsure what to do with unknown
106  0 infoPanel.setStatus(WebserviceInfo.STATE_RUNNING);
107  0 break;
108  0 case COMPLETED:
109  0 infoPanel.setProgressBar(
110    MessageManager.getString("status.collecting_job_results"),
111    jobs[0].getInternalId());
112  0 infoPanel.setStatus(WebserviceInfo.STATE_STOPPED_OK);
113  0 break;
114  0 case FAILED:
115  0 infoPanel.removeProgressBar(jobs[0].getInternalId());
116  0 infoPanel.setStatus(WebserviceInfo.STATE_STOPPED_ERROR);
117  0 break;
118  0 case CANCELLED:
119  0 infoPanel.setStatus(WebserviceInfo.STATE_CANCELLED_OK);
120  0 break;
121  0 case SERVER_ERROR:
122  0 infoPanel.removeProgressBar(jobs[0].getInternalId());
123  0 infoPanel.setStatus(WebserviceInfo.STATE_STOPPED_SERVERERROR);
124  0 break;
125    }
126    }
127   
 
128  0 toggle @Override
129    public void taskCompleted(TaskI<AlignmentI> source, AlignmentI result)
130    {
131  0 Console.debug(format("task %s#%x completed", service.getName(),
132    source.getUid()));
133  0 SwingUtilities.invokeLater(
134    () -> infoPanel.removeProgressBar(jobs[0].getInternalId()));
135  0 if (result == null)
136    {
137  0 SwingUtilities.invokeLater(infoPanel::setFinishedNoResults);
138  0 return;
139    }
140  0 infoPanel.showResultsNewFrame.addActionListener(evt -> {
141    // copy alignment for each frame to have its own instance
142  0 var alnCpy = AlignmentUtils.deepCopyAlignment(result);
143  0 displayResultsNewFrame(alnCpy);
144    });
145  0 SwingUtilities.invokeLater(infoPanel::setResultsReady);
146    }
147   
 
148  0 toggle private void displayResultsNewFrame(AlignmentI aln)
149    {
150  0 AlignFrame frame = new AlignFrame(aln, AlignFrame.DEFAULT_WIDTH,
151    AlignFrame.DEFAULT_HEIGHT);
152  0 frame.getFeatureRenderer().transferSettings(
153    parentFrame.getFeatureRenderer().getSettings());
154  0 var actionName = action.getName() != null ? action.getName() : "Search";
155  0 var title = String.format("%s %s of %s", service.getName(), actionName,
156    parentFrame.getTitle());
157  0 Desktop.addInternalFrame(frame, title, AlignFrame.DEFAULT_WIDTH,
158    AlignFrame.DEFAULT_HEIGHT);
159    }
160   
 
161  0 toggle @Override
162    public void taskException(TaskI<AlignmentI> source, Exception e)
163    {
164  0 Console.error(format("Task %s#%x raised an exception.",
165    service.getName(), source.getUid()), e);
166  0 infoPanel.appendProgressText(e.getMessage());
167    }
168   
 
169  0 toggle @Override
170    public void subJobStatusChanged(TaskI<AlignmentI> source, JobI job,
171    JobStatus status)
172    {
173  0 Console.debug(format("sub-job %x status changed to %s",
174    job.getInternalId(), status));
175  0 int i = ArrayUtils.indexOf(jobs, job);
176  0 assert i >= 0 : "job does not exist";
177  0 if (i < 0)
178    // safeguard that should not happen irl
179  0 return;
180  0 int wsStatus;
181  0 switch (status)
182    {
183  0 case INVALID:
184  0 case COMPLETED:
185  0 wsStatus = WebserviceInfo.STATE_STOPPED_OK;
186  0 break;
187  0 case READY:
188  0 case SUBMITTED:
189  0 case QUEUED:
190  0 wsStatus = WebserviceInfo.STATE_QUEUING;
191  0 break;
192  0 case RUNNING:
193  0 case UNKNOWN:
194  0 wsStatus = WebserviceInfo.STATE_RUNNING;
195  0 break;
196  0 case FAILED:
197  0 wsStatus = WebserviceInfo.STATE_STOPPED_ERROR;
198  0 break;
199  0 case CANCELLED:
200  0 wsStatus = WebserviceInfo.STATE_CANCELLED_OK;
201  0 break;
202  0 case SERVER_ERROR:
203  0 wsStatus = WebserviceInfo.STATE_STOPPED_SERVERERROR;
204  0 break;
205  0 default:
206  0 throw new AssertionError("Non-exhaustive switch statement");
207    }
208  0 infoPanel.setStatus(tabs[i], wsStatus);
209    }
210   
 
211  0 toggle @Override
212    public void subJobLogChanged(TaskI<AlignmentI> source, JobI job,
213    String log)
214    {
215  0 int i = ArrayUtils.indexOf(jobs, job);
216  0 assert i >= 0 : "job does not exist";
217  0 if (i < 0)
218    // safeguard that should never happen
219  0 return;
220  0 infoPanel.appendProgressText(tabs[i], log.substring(logOffset[i]));
221    }
222   
 
223  0 toggle @Override
224    public void subJobErrorLogChanged(TaskI<AlignmentI> source, JobI job,
225    String log)
226    {
227  0 int i = ArrayUtils.indexOf(jobs, job);
228  0 assert i >= 0 : "job does not exist";
229  0 if (i < 0)
230    // safeguard that should never happen
231  0 return;
232  0 infoPanel.appendProgressText(tabs[i], log.substring(errLogOffset[i]));
233    }
234    }