2 * Jalview - A Sequence Alignment Editor and Viewer (Version 2.8)
3 * Copyright (C) 2012 J Procter, AM Waterhouse, LM Lui, J Engelhardt, G Barton, M Clamp, S Searle
5 * This file is part of Jalview.
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 of the License, or (at your option) any later version.
11 * Jalview is distributed in the hope that it will be useful, but
12 * WITHOUT ANY WARRANTY; without even the implied warranty
13 * of MERCHANTABILITY or FITNESS FOR A PARTICULAR
14 * PURPOSE. See the GNU General Public License for more details.
16 * You should have received a copy of the GNU General Public License along with Jalview. If not, see <http://www.gnu.org/licenses/>.
20 import jalview.bin.Cache;
21 import jalview.jbgui.GWsPreferences;
22 import jalview.ws.jws2.Jws2Discoverer;
23 import jalview.ws.rest.RestServiceDescription;
25 import java.awt.BorderLayout;
26 import java.awt.Color;
27 import java.awt.Component;
28 import java.awt.Dimension;
29 import java.awt.event.ActionEvent;
30 import java.awt.event.ActionListener;
32 import java.util.Vector;
34 import javax.swing.JLabel;
35 import javax.swing.JOptionPane;
36 import javax.swing.JPanel;
37 import javax.swing.JTable;
38 import javax.swing.JTextField;
39 import javax.swing.table.AbstractTableModel;
40 import javax.swing.table.TableCellRenderer;
42 public class WsPreferences extends GWsPreferences
45 public WsPreferences()
48 initFromPreferences();
51 Vector<String> wsUrls, oldUrls, rsbsUrls, oldRsbsUrls;
53 private boolean needWsMenuUpdate;
55 private boolean oldJws1, oldJws2, oldIndexByHost, oldIndexByType,
56 oldEnfin, oldWsWarning;
58 private void initFromPreferences()
61 wsUrls = jalview.ws.jws2.Jws2Discoverer.getServiceUrls();
64 oldUrls = new Vector<String>(wsUrls);
69 wsUrls = new Vector<String>();
71 wsList.setDefaultRenderer(Integer.class, new JabaWSStatusRenderer());
72 wsList.setAutoResizeMode(JTable.AUTO_RESIZE_ALL_COLUMNS);
74 rsbsUrls = jalview.ws.rest.RestClient.getRsbsDescriptions();
77 oldRsbsUrls = new Vector<String>(rsbsUrls);
82 rsbsUrls = new Vector<String>();
85 enableEnfinServices.setSelected(oldEnfin = Cache.getDefault(
86 "SHOW_ENFIN_SERVICES", true));
87 enableEnfinServices.addActionListener(updateAction);
88 enableJws2Services.setSelected(oldJws2 = Cache.getDefault(
89 "SHOW_JWS2_SERVICES", true));
90 enableJws2Services.addActionListener(updateAction);
91 indexByHost.setSelected(oldIndexByHost = Cache.getDefault(
92 "WSMENU_BYHOST", false));
93 indexByHost.addActionListener(updateAction);
94 indexByType.setSelected(oldIndexByType = Cache.getDefault(
95 "WSMENU_BYTYPE", false));
96 indexByType.addActionListener(updateAction);
97 displayWsWarning.setSelected(oldWsWarning = Cache.getDefault(
98 "SHOW_WSDISCOVERY_ERRORS", true));
101 ActionListener updateAction = new ActionListener()
105 public void actionPerformed(ActionEvent e)
112 private void updateList()
114 Object tdat[][] = new Object[wsUrls.size()][2];
116 for (String url : wsUrls)
118 int status = Jws2Discoverer.getDiscoverer().getServerStatusFor(url);
119 tdat[r][1] = new Integer(status);
123 wsList.setModel(new WsUrlTableModel(tdat));
124 wsList.getColumn("Status").setMinWidth(10);
127 private class JabaWSStatusRenderer extends JPanel implements
130 public JabaWSStatusRenderer()
133 setMinimumSize(new Dimension(10, 10));
139 * render an Integer reflecting service status as a colour and symbol
143 public Component getTableCellRendererComponent(JTable arg0,
144 Object status, boolean isSelected, boolean hasFocus, int row,
148 String t = new String("");
149 switch (((Integer) status).intValue())
152 // cb.setSelected(true);
157 // cb.setSelected(true);
162 // cb.setSelected(false);
167 // cb.setSelected(false);
179 private class WsUrlTableModel extends AbstractTableModel
182 private Object[][] data;
184 public WsUrlTableModel(Object[][] tdat)
190 public int getColumnCount()
196 public String getColumnName(int column)
202 return "Service URL";
206 public int getRowCount()
216 public java.lang.Class<?> getColumnClass(int columnIndex)
218 return getValueAt(0, columnIndex).getClass();
222 public Object getValueAt(int rowIndex, int columnIndex)
224 return data[rowIndex][columnIndex];
229 private void updateRsbsList()
231 sbrsList.setListData(rsbsUrls);
234 private void updateServiceList()
236 jalview.ws.jws2.Jws2Discoverer.setServiceUrls(wsUrls);
239 private void updateRsbsServiceList()
241 jalview.ws.rest.RestClient.setRsbsServices(rsbsUrls);
248 * jalview.jbgui.GWsPreferences#deleteWsUrl_actionPerformed(java.awt.event
252 protected void deleteWsUrl_actionPerformed(ActionEvent e)
254 int sel = wsList.getSelectedRow();
257 wsUrls.removeElementAt(sel);
266 * @see jalview.jbgui.GWsPreferences#editWsUrl_actionPerformed(java.awt.event.
270 protected void editWsUrl_actionPerformed(ActionEvent e)
272 int sel = wsList.getSelectedRow();
275 String url = editUrl(wsUrls.elementAt(sel), "Edit JABAWS URL");
278 int present = wsUrls.indexOf(url);
282 wsUrls.setElementAt(url, sel);
289 wsUrls.removeElementAt(sel);
298 protected void newSbrsUrl_actionPerformed(ActionEvent e)
300 RestServiceEditorPane rse = new RestServiceEditorPane();
301 rse.showDialog("Add a new Simple Bioinformatics Rest Service");
302 String rservice = rse.getEditedRestService();
303 if (rservice != null && !rsbsUrls.contains(rservice))
305 rsbsUrls.add(rservice);
312 protected void editSbrsUrl_actionPerformed(ActionEvent e)
314 int sel = sbrsList.getSelectedIndex();
317 RestServiceEditorPane rse = new RestServiceEditorPane(
318 new RestServiceDescription(rsbsUrls.elementAt(sel)));
319 rse.showDialog("Edit Simple Bioinformatics Rest Service entry");
320 String rservice = rse.getEditedRestService();
321 if (rservice != null)
323 int present = rsbsUrls.indexOf(rservice);
327 rsbsUrls.setElementAt(rservice, sel);
334 rsbsUrls.removeElementAt(sel);
343 void updateWsMenuConfig(boolean old)
347 if (oldUrls != wsUrls
348 || (wsUrls != null && oldUrls != null && !wsUrls
353 wsUrls = (oldUrls == null) ? null : new Vector(oldUrls);
354 if (oldRsbsUrls != rsbsUrls
355 || (rsbsUrls != null && oldRsbsUrls != null && !oldRsbsUrls
360 oldRsbsUrls = (oldRsbsUrls == null) ? null : new Vector(oldRsbsUrls);
367 "SHOW_ENFIN_SERVICES",
369 old ? oldEnfin : enableEnfinServices.isSelected())
372 "SHOW_JWS2_SERVICES",
373 Boolean.valueOf(old ? oldJws2 : enableJws2Services.isSelected())
377 Boolean.valueOf(old ? oldIndexByHost : indexByHost.isSelected())
381 Boolean.valueOf(old ? oldIndexByType : indexByType.isSelected())
385 "SHOW_WSDISCOVERY_ERRORS",
387 old ? oldWsWarning : displayWsWarning.isSelected())
390 updateRsbsServiceList();
397 * jalview.jbgui.GWsPreferences#moveWsUrlDown_actionPerformed(java.awt.event
401 protected void moveWsUrlDown_actionPerformed(ActionEvent e)
403 int p = wsList.getSelectedRow();
404 if (p > -1 && p < wsUrls.size() - 1)
406 String t = wsUrls.get(p + 1);
407 wsUrls.setElementAt(wsUrls.elementAt(p), p + 1);
408 wsUrls.setElementAt(t, p);
410 wsList.getSelectionModel().setSelectionInterval(p + 1, p + 1);
419 * jalview.jbgui.GWsPreferences#moveWsUrlUp_actionPerformed(java.awt.event
423 protected void moveWsUrlUp_actionPerformed(ActionEvent e)
425 int p = wsList.getSelectedRow();
428 String t = wsUrls.get(p - 1);
429 wsUrls.setElementAt(wsUrls.elementAt(p), p - 1);
430 wsUrls.setElementAt(t, p);
432 wsList.getSelectionModel().setSelectionInterval(p - 1, p - 1);
437 private String editUrl(String initUrl, String title)
439 String url = initUrl;
445 JTextField urltf = new JTextField(url, 40);
446 JPanel panel = new JPanel(new BorderLayout());
447 JPanel pane12 = new JPanel(new BorderLayout());
448 pane12.add(new JLabel("URL: "), BorderLayout.CENTER);
449 pane12.add(urltf, BorderLayout.EAST);
450 panel.add(pane12, BorderLayout.NORTH);
451 boolean valid = false;
452 int resp = JOptionPane.CANCEL_OPTION;
454 && (resp = JOptionPane.showInternalConfirmDialog(
455 Desktop.desktop, panel, title,
456 JOptionPane.OK_CANCEL_OPTION)) == JOptionPane.OK_OPTION)
460 // TODO: do a better job of checking that the url is a valid discovery
461 // URL for web services.
462 String tx = urltf.getText().trim();
463 while (tx.length() > 0 && tx.lastIndexOf('/') == tx.length() - 1)
465 tx = tx.substring(0, tx.length() - 1);
470 } catch (Exception e)
473 JOptionPane.showInternalMessageDialog(Desktop.desktop,
477 if (valid && resp == JOptionPane.OK_OPTION)
479 int validate = JOptionPane
480 .showInternalConfirmDialog(
482 "Validate JabaWS Server ?\n(Look in console output for results)",
483 "Test Server?", JOptionPane.YES_NO_OPTION);
484 if (validate == JOptionPane.OK_OPTION)
486 if (jalview.ws.jws2.Jws2Discoverer.testServiceUrl(foo))
488 return foo.toString();
493 .showInternalMessageDialog(
495 "Service did not pass validation.\nCheck the Jalview Console for more details.");
500 // just return the URL anyway
501 return foo.toString();
510 * @see jalview.jbgui.GWsPreferences#newWsUrl_actionPerformed(java.awt.event.
514 protected void newWsUrl_actionPerformed(ActionEvent e)
516 String url = editUrl(null, "Add new JABAWS URL");
519 if (!wsUrls.contains(url))
521 int selind = wsList.getSelectedRow();
524 wsUrls.insertElementAt(url, selind);
528 wsUrls.addElement(url);
539 * @see jalview.jbgui.GWsPreferences#refreshWs_actionPerformed(java.awt.event.
543 protected void refreshWs_actionPerformed(ActionEvent e)
545 new Thread(new Runnable()
551 lastrefresh = update - 1;
552 updateWsMenuConfig(false);
560 * Refresh the web services menus - but only if there has been a change in the
561 * configuration (indicated by update!=lastrefresh)
563 * @param showProgress
564 * show progress in dialog or on desktop
566 protected void refreshWsMenu(boolean showProgress)
570 new Thread(new Runnable()
575 progressBar.setVisible(true);
577 progressBar.setIndeterminate(true);
578 if (lastrefresh != update)
580 lastrefresh = update;
581 Desktop.instance.startServiceDiscovery(true); // wait around for all
582 // threads to complete
586 progressBar.setIndeterminate(false);
587 progressBar.setVisible(false);
595 new Thread(new Runnable()
600 long ct = System.currentTimeMillis();
601 Desktop.instance.setProgressBar("Refreshing Web Service Menus",
603 if (lastrefresh != update)
605 lastrefresh = update;
606 Desktop.instance.startServiceDiscovery(true);
609 Desktop.instance.setProgressBar(null, ct);
617 * state counters for ensuring that updates only happen if config has changed.
619 private long update = 0, lastrefresh = 0;
625 * jalview.jbgui.GWsPreferences#resetWs_actionPerformed(java.awt.event.ActionEvent
629 protected void resetWs_actionPerformed(ActionEvent e)
631 jalview.ws.jws2.Jws2Discoverer.setServiceUrls(null);
632 Vector nwsUrls = jalview.ws.jws2.Jws2Discoverer.getServiceUrls();
633 if (!wsUrls.equals(nwsUrls))
640 updateAndRefreshWsMenuConfig(true);
643 protected void ok_ActionPerformed(ActionEvent e)
645 // update everything regardless.
646 updateAndRefreshWsMenuConfig(false);
649 public void updateAndRefreshWsMenuConfig(
650 final boolean showProgressInDialog)
652 new Thread(new Runnable()
657 updateWsMenuConfig(false);
658 refreshWsMenu(showProgressInDialog);