Clover icon

Coverage Report

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

File WsPreferences.java

 

Coverage histogram

../../img/srcFileCovDistChart2.png
54% of files have more coverage

Code metrics

78
212
35
3
703
540
90
0.42
6.06
11.67
2.57

Classes

Class Line # Actions
WsPreferences 49 185 77
0.12512.5%
WsPreferences.JabaWSStatusRenderer 137 19 6
0.1428571514.3%
WsPreferences.WsUrlTableModel 190 8 7
0.37537.5%
 

Contributing tests

No tests hitting this source file were found.

Source view

1    /*
2    * Jalview - A Sequence Alignment Editor and Viewer ($$Version-Rel$$)
3    * Copyright (C) $$Year-Rel$$ The Jalview Authors
4    *
5    * This file is part of Jalview.
6    *
7    * Jalview is free software: you can redistribute it and/or
8    * modify it under the terms of the GNU General Public License
9    * as published by the Free Software Foundation, either version 3
10    * of the License, or (at your option) any later version.
11    *
12    * Jalview is distributed in the hope that it will be useful, but
13    * WITHOUT ANY WARRANTY; without even the implied warranty
14    * of MERCHANTABILITY or FITNESS FOR A PARTICULAR
15    * PURPOSE. See the GNU General Public License for more details.
16    *
17    * You should have received a copy of the GNU General Public License
18    * along with Jalview. If not, see <http://www.gnu.org/licenses/>.
19    * The Jalview Authors are detailed in the 'AUTHORS' file.
20    */
21    package jalview.gui;
22   
23   
24    import java.awt.BorderLayout;
25    import java.awt.Color;
26    import java.awt.Component;
27    import java.awt.Dimension;
28    import java.awt.event.ActionEvent;
29    import java.awt.event.ActionListener;
30    import java.net.URL;
31    import java.util.ArrayList;
32    import java.util.List;
33    import java.util.Vector;
34   
35    import javax.swing.JLabel;
36    import javax.swing.JPanel;
37    import javax.swing.JTable;
38    import javax.swing.JTextField;
39    import javax.swing.SwingUtilities;
40    import javax.swing.table.AbstractTableModel;
41    import javax.swing.table.TableCellRenderer;
42    import jalview.bin.Cache;
43    import jalview.jbgui.GWsPreferences;
44    import jalview.util.MessageManager;
45    import jalview.ws.WSDiscovererI;
46    import jalview.ws.jws2.Jws2Discoverer;
47    import jalview.ws.rest.RestServiceDescription;
48   
 
49    public class WsPreferences extends GWsPreferences
50    {
51   
 
52  11 toggle public WsPreferences()
53    {
54  11 super();
55  11 initFromPreferences();
56    }
57   
58    List<String> wsUrls;
59   
60    Vector<String> oldUrls, rsbsUrls, oldRsbsUrls;
61   
62    private boolean needWsMenuUpdate;
63   
64    private boolean oldJws1, oldJws2, oldIndexByHost, oldIndexByType,
65    oldEnfin, oldWsWarning;
66   
 
67  11 toggle private void initFromPreferences()
68    {
69   
70  11 wsUrls = Jws2Discoverer.getInstance().getServiceUrls();
71  11 if (!wsUrls.isEmpty())
72    {
73  11 oldUrls = new Vector<String>(wsUrls);
74    }
75    else
76    {
77  0 oldUrls = null;
78  0 wsUrls = new Vector<String>();
79    }
80  11 wsList.setDefaultRenderer(Integer.class, new JabaWSStatusRenderer());
81  11 wsList.setAutoResizeMode(JTable.AUTO_RESIZE_ALL_COLUMNS);
82  11 updateList();
83  11 rsbsUrls = jalview.ws.rest.RestClient.getRsbsDescriptions();
84  11 if (rsbsUrls != null)
85    {
86  11 oldRsbsUrls = new Vector<String>(rsbsUrls);
87    }
88    else
89    {
90  0 oldRsbsUrls = null;
91  0 rsbsUrls = new Vector<String>();
92    }
93  11 updateRsbsList();
94  11 enableEnfinServices.setSelected(
95    oldEnfin = Cache.getDefault("SHOW_ENFIN_SERVICES", true));
96  11 enableEnfinServices.addActionListener(updateAction);
97  11 enableJws2Services.setSelected(
98    oldJws2 = Cache.getDefault("SHOW_JWS2_SERVICES", true));
99  11 enableJws2Services.addActionListener(updateAction);
100  11 indexByHost.setSelected(
101    oldIndexByHost = Cache.getDefault("WSMENU_BYHOST", false));
102  11 indexByHost.addActionListener(updateAction);
103  11 indexByType.setSelected(
104    oldIndexByType = Cache.getDefault("WSMENU_BYTYPE", false));
105  11 indexByType.addActionListener(updateAction);
106  11 displayWsWarning.setSelected(oldWsWarning = Cache
107    .getDefault("SHOW_WSDISCOVERY_ERRORS", true));
108    }
109   
110    ActionListener updateAction = new ActionListener()
111    {
112   
 
113  0 toggle @Override
114    public void actionPerformed(ActionEvent e)
115    {
116  0 update++;
117    }
118   
119    };
120   
 
121  11 toggle private void updateList()
122    {
123  11 Object tdat[][] = new Object[wsUrls.size()][2];
124  11 int r = 0;
125  11 for (String url : wsUrls)
126    {
127  11 int status = Jws2Discoverer.getInstance().getServerStatusFor(url);
128  11 tdat[r][1] = Integer.valueOf(status);
129  11 tdat[r++][0] = url;
130    }
131   
132  11 wsList.setModel(new WsUrlTableModel(tdat));
133  11 wsList.getColumn(MessageManager.getString("label.status"))
134    .setMinWidth(10);
135    }
136   
 
137    private class JabaWSStatusRenderer extends JPanel
138    implements TableCellRenderer
139    {
 
140  11 toggle public JabaWSStatusRenderer()
141    {
142  11 setOpaque(true);
143  11 setMinimumSize(new Dimension(10, 10));
144    // setText(" ");
145   
146    }
147   
148    /**
149    * render an Integer reflecting service status as a colour and symbol
150    */
151   
 
152  0 toggle @Override
153    public Component getTableCellRendererComponent(JTable arg0,
154    Object status, boolean isSelected, boolean hasFocus, int row,
155    int column)
156    {
157  0 Color c;
158  0 String t = new String("");
159  0 switch (((Integer) status).intValue())
160    {
161  0 case WSDiscovererI.STATUS_OK:
162    // cb.setSelected(true);
163    // cb.setBackground(
164  0 c = Color.green;
165  0 break;
166  0 case WSDiscovererI.STATUS_NO_SERVICES:
167    // cb.setSelected(true);
168    // cb.setBackground(
169  0 c = Color.lightGray;
170  0 break;
171  0 case WSDiscovererI.STATUS_INVALID:
172    // cb.setSelected(false);
173    // cb.setBackground(
174  0 c = Color.red;
175  0 break;
176  0 case WSDiscovererI.STATUS_UNKNOWN:
177  0 default:
178    // cb.setSelected(false);
179    // cb.setBackground(
180  0 c = Color.orange;
181    }
182  0 setBackground(c);
183    // setText(t);
184  0 return this;
185   
186    }
187   
188    }
189   
 
190    private class WsUrlTableModel extends AbstractTableModel
191    {
192   
193    private Object[][] data;
194   
195    private String[] columnNames = new String[] {
196    MessageManager.getString("label.service_url"),
197    MessageManager.getString("label.status") };
198   
 
199  11 toggle public WsUrlTableModel(Object[][] tdat)
200    {
201  11 this.data = tdat;
202    }
203   
 
204  33 toggle @Override
205    public int getColumnCount()
206    {
207  33 return 2;
208    }
209   
 
210  22 toggle @Override
211    public String getColumnName(int column)
212    {
213  22 return columnNames[column];
214    }
215   
 
216  0 toggle @Override
217    public int getRowCount()
218    {
219  0 if (data == null)
220    {
221  0 return 0;
222    }
223  0 return data.length;
224    }
225   
 
226  0 toggle @Override
227    public java.lang.Class<?> getColumnClass(int columnIndex)
228    {
229  0 return getValueAt(0, columnIndex).getClass();
230    };
231   
 
232  0 toggle @Override
233    public Object getValueAt(int rowIndex, int columnIndex)
234    {
235  0 return data[rowIndex][columnIndex];
236    }
237   
238    }
239   
 
240  11 toggle private void updateRsbsList()
241    {
242  11 sbrsList.setListData(rsbsUrls);
243    }
244   
 
245  0 toggle private void updateServiceList()
246    {
247  0 Jws2Discoverer.getInstance().setServiceUrls(wsUrls);
248    }
249   
 
250  0 toggle private void updateRsbsServiceList()
251    {
252  0 jalview.ws.rest.RestClient.setRsbsServices(rsbsUrls);
253    }
254   
255    /*
256    * (non-Javadoc)
257    *
258    * @see
259    * jalview.jbgui.GWsPreferences#deleteWsUrl_actionPerformed(java.awt.event
260    * .ActionEvent)
261    */
 
262  0 toggle @Override
263    protected void deleteWsUrl_actionPerformed(ActionEvent e)
264    {
265  0 int sel = wsList.getSelectedRow();
266  0 if (sel > -1)
267    {
268  0 wsUrls.remove(sel);
269  0 update++;
270  0 updateList();
271    }
272    }
273   
274    /*
275    * (non-Javadoc)
276    *
277    * @see jalview.jbgui.GWsPreferences#editWsUrl_actionPerformed(java.awt.event.
278    * ActionEvent)
279    */
 
280  0 toggle @Override
281    protected void editWsUrl_actionPerformed(ActionEvent e)
282    {
283  0 int sel = wsList.getSelectedRow();
284  0 if (sel > -1)
285    {
286  0 String url = editUrl(wsUrls.get(sel),
287    MessageManager.getString("label.edit_jabaws_url"));
288  0 if (url != null)
289    {
290  0 int present = wsUrls.indexOf(url);
291  0 if (present == -1)
292    {
293  0 update++;
294  0 wsUrls.set(sel, url);
295  0 updateList();
296    }
297    else
298    {
299  0 if (present != sel)
300    {
301  0 wsUrls.remove(sel);
302  0 updateList();
303    }
304    }
305    }
306    }
307    }
308   
 
309  0 toggle @Override
310    protected void newSbrsUrl_actionPerformed(ActionEvent e)
311    {
312  0 RestServiceEditorPane rse = new RestServiceEditorPane();
313  0 rse.showDialog(MessageManager.getString("label.add_new_sbrs_service"));
314  0 String rservice = rse.getEditedRestService();
315  0 if (rservice != null && !rsbsUrls.contains(rservice))
316    {
317  0 rsbsUrls.add(rservice);
318  0 update++;
319  0 updateRsbsList();
320    }
321    }
322   
 
323  0 toggle @Override
324    protected void editSbrsUrl_actionPerformed(ActionEvent e)
325    {
326  0 int sel = sbrsList.getSelectedIndex();
327  0 if (sel > -1)
328    {
329  0 RestServiceEditorPane rse = new RestServiceEditorPane(
330    new RestServiceDescription(rsbsUrls.elementAt(sel)));
331  0 rse.showDialog(MessageManager.getString("label.edit_sbrs_entry"));
332  0 String rservice = rse.getEditedRestService();
333  0 if (rservice != null)
334    {
335  0 int present = rsbsUrls.indexOf(rservice);
336  0 if (present == -1)
337    {
338  0 update++;
339  0 rsbsUrls.setElementAt(rservice, sel);
340  0 updateRsbsList();
341    }
342    else
343    {
344  0 if (present != sel)
345    {
346  0 rsbsUrls.removeElementAt(sel);
347  0 update++;
348  0 updateRsbsList();
349    }
350    }
351    }
352    }
353    }
354   
 
355  0 toggle void updateWsMenuConfig(boolean old)
356    {
357  0 if (old)
358    {
359  0 if (oldUrls != wsUrls || (wsUrls != null && oldUrls != null
360    && !wsUrls.equals(oldUrls)))
361    {
362  0 update++;
363    }
364  0 wsUrls = (oldUrls == null) ? null : new Vector(oldUrls);
365  0 if (oldRsbsUrls != rsbsUrls || (rsbsUrls != null
366    && oldRsbsUrls != null && !oldRsbsUrls.equals(rsbsUrls)))
367    {
368  0 update++;
369    }
370  0 oldRsbsUrls = (oldRsbsUrls == null) ? null : new Vector(oldRsbsUrls);
371    }
372    else
373    {
374   
375    }
376  0 Cache.setProperty("SHOW_ENFIN_SERVICES",
377    Boolean.valueOf(
378  0 old ? oldEnfin : enableEnfinServices.isSelected())
379    .toString());
380  0 Cache.setProperty("SHOW_JWS2_SERVICES",
381  0 Boolean.valueOf(old ? oldJws2 : enableJws2Services.isSelected())
382    .toString());
383  0 Cache.setProperty("WSMENU_BYHOST",
384  0 Boolean.valueOf(old ? oldIndexByHost : indexByHost.isSelected())
385    .toString());
386  0 Cache.setProperty("WSMENU_BYTYPE",
387  0 Boolean.valueOf(old ? oldIndexByType : indexByType.isSelected())
388    .toString());
389   
390  0 Cache.setProperty("SHOW_WSDISCOVERY_ERRORS",
391    Boolean.valueOf(
392  0 old ? oldWsWarning : displayWsWarning.isSelected())
393    .toString());
394  0 updateServiceList();
395  0 updateRsbsServiceList();
396    }
397   
398    /*
399    * (non-Javadoc)
400    *
401    * @see
402    * jalview.jbgui.GWsPreferences#moveWsUrlDown_actionPerformed(java.awt.event
403    * .ActionEvent)
404    */
 
405  0 toggle @Override
406    protected void moveWsUrlDown_actionPerformed(ActionEvent e)
407    {
408  0 int p = wsList.getSelectedRow();
409  0 if (p > -1 && p < wsUrls.size() - 1)
410    {
411  0 String t = wsUrls.get(p + 1);
412  0 wsUrls.set(p + 1, wsUrls.get(p));
413  0 wsUrls.set(p, t);
414  0 updateList();
415  0 wsList.getSelectionModel().setSelectionInterval(p + 1, p + 1);
416  0 update++;
417    }
418    }
419   
420    /*
421    * (non-Javadoc)
422    *
423    * @see
424    * jalview.jbgui.GWsPreferences#moveWsUrlUp_actionPerformed(java.awt.event
425    * .ActionEvent)
426    */
 
427  0 toggle @Override
428    protected void moveWsUrlUp_actionPerformed(ActionEvent e)
429    {
430  0 int p = wsList.getSelectedRow();
431  0 if (p > 0)
432    {
433  0 String t = wsUrls.get(p - 1);
434  0 wsUrls.set(p - 1, wsUrls.get(p));
435  0 wsUrls.set(p, t);
436  0 updateList();
437  0 wsList.getSelectionModel().setSelectionInterval(p - 1, p - 1);
438  0 update++;
439    }
440    }
441   
 
442  0 toggle private String editUrl(String initUrl, String title)
443    {
444  0 String url = initUrl;
445  0 URL foo = null;
446  0 if (url == null)
447    {
448  0 url = "";
449    }
450  0 JTextField urltf = new JTextField(url, 40);
451  0 JPanel panel = new JPanel(new BorderLayout());
452  0 JPanel pane12 = new JPanel(new BorderLayout());
453  0 pane12.add(new JLabel(MessageManager.getString("label.url:")),
454    BorderLayout.CENTER);
455  0 pane12.add(urltf, BorderLayout.EAST);
456  0 panel.add(pane12, BorderLayout.NORTH);
457  0 boolean valid = false;
458  0 int resp = JvOptionPane.CANCEL_OPTION;
459  0 while (!valid && (resp = JvOptionPane.showInternalConfirmDialog(
460    Desktop.getDesktopPane(), panel, title,
461    JvOptionPane.OK_CANCEL_OPTION)) == JvOptionPane.OK_OPTION)
462    {
463  0 try
464    {
465    // TODO: do a better job of checking that the url is a valid discovery
466    // URL for web services.
467  0 String tx = urltf.getText().trim();
468  0 while (tx.length() > 0 && tx.lastIndexOf('/') == tx.length() - 1)
469    {
470  0 tx = tx.substring(0, tx.length() - 1);
471    }
472  0 foo = new URL(tx);
473  0 valid = true;
474  0 urltf.setText(tx);
475    } catch (Exception e)
476    {
477  0 valid = false;
478  0 JvOptionPane.showInternalMessageDialog(Desktop.getDesktopPane(),
479    MessageManager.getString("label.invalid_url"));
480    }
481    }
482  0 if (valid && resp == JvOptionPane.OK_OPTION)
483    {
484  0 int validate = JvOptionPane.showInternalConfirmDialog(Desktop.getDesktopPane(),
485    MessageManager.getString("info.validate_jabaws_server"),
486    MessageManager.getString("label.test_server"),
487    JvOptionPane.YES_NO_OPTION);
488   
489  0 if (validate == JvOptionPane.OK_OPTION)
490    {
491  0 if (Jws2Discoverer.getInstance().testServiceUrl(foo))
492    {
493  0 return foo.toString();
494    }
495    else
496    {
497  0 int opt = JvOptionPane.showInternalOptionDialog(Desktop.getDesktopPane(),
498    "The Server '" + foo.toString()
499    + "' failed validation,\ndo you want to add it anyway? ",
500    "Server Validation Failed", JvOptionPane.YES_NO_OPTION,
501    JvOptionPane.INFORMATION_MESSAGE, null, null, null);
502  0 if (opt == JvOptionPane.YES_OPTION)
503    {
504  0 return foo.toString();
505    }
506    else
507    {
508  0 JvOptionPane.showInternalMessageDialog(Desktop.getDesktopPane(),
509    MessageManager.getString(
510    "warn.server_didnt_pass_validation"));
511    }
512   
513    }
514    }
515    else
516    {
517    // just return the URL anyway
518  0 return foo.toString();
519    }
520    }
521  0 return initUrl;
522    }
523   
524    /*
525    * (non-Javadoc)
526    *
527    * @see jalview.jbgui.GWsPreferences#newWsUrl_actionPerformed(java.awt.event.
528    * ActionEvent)
529    */
 
530  0 toggle @Override
531    protected void newWsUrl_actionPerformed(ActionEvent e)
532    {
533  0 String url = editUrl(null,
534    MessageManager.getString("label.add_jabaws_url"));
535  0 if (url != null)
536    {
537  0 if (!wsUrls.contains(url))
538    {
539  0 int selind = wsList.getSelectedRow();
540  0 if (selind > -1)
541    {
542  0 wsUrls.add(selind, url);
543    }
544    else
545    {
546  0 wsUrls.add(url);
547    }
548  0 update++;
549  0 updateList();
550    }
551    }
552    }
553   
554    /*
555    * (non-Javadoc)
556    *
557    * @see jalview.jbgui.GWsPreferences#refreshWs_actionPerformed(java.awt.event.
558    * ActionEvent)
559    */
 
560  0 toggle @Override
561    protected void refreshWs_actionPerformed(ActionEvent e)
562    {
563  0 new Thread(new Runnable()
564    {
565   
 
566  0 toggle @Override
567    public void run()
568    {
569    // force a refresh.
570  0 lastrefresh = update - 1;
571  0 updateWsMenuConfig(false);
572  0 refreshWsMenu(true);
573    }
574    }).start();
575   
576    }
577   
578    /**
579    * Refresh the web services menus - but only if there has been a change in the
580    * configuration (indicated by update!=lastrefresh)
581    *
582    * @param showProgress
583    * show progress in dialog or on desktop
584    */
 
585  0 toggle protected void refreshWsMenu(boolean showProgress)
586    {
587  0 if (showProgress)
588    {
589  0 new Thread(new Runnable()
590    {
591   
 
592  0 toggle @Override
593    public void run()
594    {
595  0 SwingUtilities.invokeLater(new Runnable()
596    {
 
597  0 toggle @Override
598    public void run()
599    {
600   
601  0 progressBar.setVisible(true);
602  0 validate();
603  0 progressBar.setIndeterminate(true);
604   
605    }
606    });
607  0 if (lastrefresh != update)
608    {
609  0 lastrefresh = update;
610  0 Desktop.getInstance().startServiceDiscovery(true); // wait around for all
611    // threads to complete
612  0 updateList();
613   
614    }
615  0 SwingUtilities.invokeLater(new Runnable()
616    {
 
617  0 toggle @Override
618    public void run()
619    {
620   
621  0 progressBar.setIndeterminate(false);
622  0 progressBar.setVisible(false);
623  0 validate();
624   
625    }
626    });
627   
628    }
629    }).start();
630    }
631    else
632    {
633  0 new Thread(new Runnable()
634    {
635   
 
636  0 toggle @Override
637    public void run()
638    {
639  0 long ct = System.currentTimeMillis();
640  0 Desktop.getInstance().setProgressBar(MessageManager
641    .getString("status.refreshing_web_service_menus"), ct);
642  0 if (lastrefresh != update)
643    {
644  0 lastrefresh = update;
645  0 Desktop.getInstance().startServiceDiscovery(true);
646  0 updateList();
647    }
648  0 Desktop.getInstance().setProgressBar(null, ct);
649    }
650   
651    }).start();
652    }
653    }
654   
655    /**
656    * state counters for ensuring that updates only happen if config has changed.
657    */
658    private long update = 0, lastrefresh = 0;
659   
660    /*
661    * (non-Javadoc)
662    *
663    * @see
664    * jalview.jbgui.GWsPreferences#resetWs_actionPerformed(java.awt.event.ActionEvent
665    * )
666    */
 
667  0 toggle @Override
668    protected void resetWs_actionPerformed(ActionEvent e)
669    {
670  0 Jws2Discoverer.getInstance().setServiceUrls(null);
671  0 List<String> nwsUrls = Jws2Discoverer.getInstance().getServiceUrls();
672  0 if (!wsUrls.equals(nwsUrls))
673    {
674  0 update++;
675    }
676  0 wsUrls = nwsUrls;
677  0 updateList();
678   
679  0 updateAndRefreshWsMenuConfig(true);
680    }
681   
 
682  0 toggle protected void ok_ActionPerformed(ActionEvent e)
683    {
684    // update everything regardless.
685  0 updateAndRefreshWsMenuConfig(false);
686    }
687   
 
688  0 toggle public void updateAndRefreshWsMenuConfig(
689    final boolean showProgressInDialog)
690    {
691  0 new Thread(new Runnable()
692    {
693   
 
694  0 toggle @Override
695    public void run()
696    {
697  0 updateWsMenuConfig(false);
698  0 refreshWsMenu(showProgressInDialog);
699    }
700    }).start();
701   
702    }
703    }