2 * Jalview - A Sequence Alignment Editor and Viewer ($$Version-Rel$$)
3 * Copyright (C) $$Year-Rel$$ The Jalview Authors
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
10 * of the License, or (at your option) any later version.
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.
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.
23 import jalview.bin.Cache;
24 import jalview.jbgui.GWsPreferences;
25 import jalview.util.MessageManager;
26 import jalview.ws.jws2.Jws2Discoverer;
27 import jalview.ws.rest.RestClient;
28 import jalview.ws.rest.RestServiceDescription;
30 import java.awt.BorderLayout;
31 import java.awt.Color;
32 import java.awt.Component;
33 import java.awt.Dimension;
34 import java.awt.event.ActionEvent;
35 import java.awt.event.ActionListener;
37 import java.util.List;
38 import java.util.Vector;
40 import javax.swing.JLabel;
41 import javax.swing.JOptionPane;
42 import javax.swing.JPanel;
43 import javax.swing.JTable;
44 import javax.swing.JTextField;
45 import javax.swing.table.AbstractTableModel;
46 import javax.swing.table.TableCellRenderer;
48 public class WsPreferences extends GWsPreferences
51 public WsPreferences()
54 initFromPreferences();
59 Vector<String> oldUrls, rsbsUrls, oldRsbsUrls;
61 private boolean needWsMenuUpdate;
63 private boolean oldJws1, oldJws2, oldIndexByHost, oldIndexByType,
64 oldEnfin, oldWsWarning;
66 private void initFromPreferences()
69 wsUrls = Jws2Discoverer.getDiscoverer().getServiceUrls();
70 if (!wsUrls.isEmpty())
72 oldUrls = new Vector<String>(wsUrls);
77 wsUrls = new Vector<String>();
79 wsList.setDefaultRenderer(Integer.class, new JabaWSStatusRenderer());
80 wsList.setAutoResizeMode(JTable.AUTO_RESIZE_ALL_COLUMNS);
82 rsbsUrls = RestClient.getRsbsDescriptions();
85 oldRsbsUrls = new Vector<String>(rsbsUrls);
90 rsbsUrls = new Vector<String>();
93 enableEnfinServices.setSelected(oldEnfin = Cache.getDefault(
94 "SHOW_ENFIN_SERVICES", true));
95 enableEnfinServices.addActionListener(updateAction);
96 enableJws2Services.setSelected(oldJws2 = Cache.getDefault(
97 "SHOW_JWS2_SERVICES", true));
98 enableJws2Services.addActionListener(updateAction);
99 indexByHost.setSelected(oldIndexByHost = Cache.getDefault(
100 "WSMENU_BYHOST", false));
101 indexByHost.addActionListener(updateAction);
102 indexByType.setSelected(oldIndexByType = Cache.getDefault(
103 "WSMENU_BYTYPE", false));
104 indexByType.addActionListener(updateAction);
105 displayWsWarning.setSelected(oldWsWarning = Cache.getDefault(
106 "SHOW_WSDISCOVERY_ERRORS", true));
109 ActionListener updateAction = new ActionListener()
113 public void actionPerformed(ActionEvent e)
120 private void updateList()
122 Object tdat[][] = new Object[wsUrls.size()][2];
124 for (String url : wsUrls)
126 int status = Jws2Discoverer.getDiscoverer().getServerStatusFor(url);
127 tdat[r][1] = new Integer(status);
131 wsList.setModel(new WsUrlTableModel(tdat));
132 wsList.getColumn(MessageManager.getString("label.status")).setMinWidth(10);
135 private class JabaWSStatusRenderer extends JPanel implements
138 public JabaWSStatusRenderer()
141 setMinimumSize(new Dimension(10, 10));
147 * render an Integer reflecting service status as a colour and symbol
151 public Component getTableCellRendererComponent(JTable arg0,
152 Object status, boolean isSelected, boolean hasFocus, int row,
156 String t = new String("");
157 switch (((Integer) status).intValue())
160 // cb.setSelected(true);
165 // cb.setSelected(true);
170 // cb.setSelected(false);
175 // cb.setSelected(false);
187 private class WsUrlTableModel extends AbstractTableModel
190 private Object[][] data;
191 private String[] columnNames = new String[]
192 { MessageManager.getString("label.service_url"), MessageManager.getString("label.status") };
194 public WsUrlTableModel(Object[][] tdat)
200 public int getColumnCount()
206 public String getColumnName(int column)
208 return columnNames[column];
212 public int getRowCount()
222 public java.lang.Class<?> getColumnClass(int columnIndex)
224 return getValueAt(0, columnIndex).getClass();
228 public Object getValueAt(int rowIndex, int columnIndex)
230 return data[rowIndex][columnIndex];
235 private void updateRsbsList()
237 sbrsList.setListData(rsbsUrls);
240 private void updateServiceList()
242 Jws2Discoverer.getDiscoverer().setServiceUrls(wsUrls);
245 private void updateRsbsServiceList()
247 RestClient.setRsbsServices(rsbsUrls);
254 * jalview.jbgui.GWsPreferences#deleteWsUrl_actionPerformed(java.awt.event
258 protected void deleteWsUrl_actionPerformed(ActionEvent e)
260 int sel = wsList.getSelectedRow();
272 * @see jalview.jbgui.GWsPreferences#editWsUrl_actionPerformed(java.awt.event.
276 protected void editWsUrl_actionPerformed(ActionEvent e)
278 int sel = wsList.getSelectedRow();
281 String url = editUrl(wsUrls.get(sel),
282 MessageManager.getString("label.edit_jabaws_url"));
285 int present = wsUrls.indexOf(url);
289 wsUrls.set(sel, url);
305 protected void newSbrsUrl_actionPerformed(ActionEvent e)
307 RestServiceEditorPane rse = new RestServiceEditorPane();
308 rse.showDialog(MessageManager.getString("label.add_new_sbrs_service"));
309 String rservice = rse.getEditedRestService();
310 if (rservice != null && !rsbsUrls.contains(rservice))
312 rsbsUrls.add(rservice);
319 protected void editSbrsUrl_actionPerformed(ActionEvent e)
321 int sel = sbrsList.getSelectedIndex();
324 RestServiceEditorPane rse = new RestServiceEditorPane(
325 new RestServiceDescription(rsbsUrls.elementAt(sel)));
326 rse.showDialog(MessageManager.getString("label.edit_sbrs_entry"));
327 String rservice = rse.getEditedRestService();
328 if (rservice != null)
330 int present = rsbsUrls.indexOf(rservice);
334 rsbsUrls.setElementAt(rservice, sel);
341 rsbsUrls.removeElementAt(sel);
350 void updateWsMenuConfig(boolean old)
354 if (oldUrls != wsUrls
355 || (wsUrls != null && oldUrls != null && !wsUrls
360 wsUrls = (oldUrls == null) ? null : new Vector(oldUrls);
361 if (oldRsbsUrls != rsbsUrls
362 || (rsbsUrls != null && oldRsbsUrls != null && !oldRsbsUrls
367 oldRsbsUrls = (oldRsbsUrls == null) ? null : new Vector(oldRsbsUrls);
374 "SHOW_ENFIN_SERVICES",
376 old ? oldEnfin : enableEnfinServices.isSelected())
379 "SHOW_JWS2_SERVICES",
380 Boolean.valueOf(old ? oldJws2 : enableJws2Services.isSelected())
384 Boolean.valueOf(old ? oldIndexByHost : indexByHost.isSelected())
388 Boolean.valueOf(old ? oldIndexByType : indexByType.isSelected())
392 "SHOW_WSDISCOVERY_ERRORS",
394 old ? oldWsWarning : displayWsWarning.isSelected())
397 updateRsbsServiceList();
404 * jalview.jbgui.GWsPreferences#moveWsUrlDown_actionPerformed(java.awt.event
408 protected void moveWsUrlDown_actionPerformed(ActionEvent e)
410 int p = wsList.getSelectedRow();
411 if (p > -1 && p < wsUrls.size() - 1)
413 String t = wsUrls.get(p + 1);
414 wsUrls.set(p + 1, wsUrls.get(p));
417 wsList.getSelectionModel().setSelectionInterval(p + 1, p + 1);
426 * jalview.jbgui.GWsPreferences#moveWsUrlUp_actionPerformed(java.awt.event
430 protected void moveWsUrlUp_actionPerformed(ActionEvent e)
432 int p = wsList.getSelectedRow();
435 String t = wsUrls.get(p - 1);
436 wsUrls.set(p - 1, wsUrls.get(p));
439 wsList.getSelectionModel().setSelectionInterval(p - 1, p - 1);
444 private String editUrl(String initUrl, String title)
446 String url = initUrl;
452 JTextField urltf = new JTextField(url, 40);
453 JPanel panel = new JPanel(new BorderLayout());
454 JPanel pane12 = new JPanel(new BorderLayout());
455 pane12.add(new JLabel(MessageManager.getString("label.url")),
456 BorderLayout.CENTER);
457 pane12.add(urltf, BorderLayout.EAST);
458 panel.add(pane12, BorderLayout.NORTH);
459 boolean valid = false;
460 int resp = JOptionPane.CANCEL_OPTION;
462 && (resp = JOptionPane.showInternalConfirmDialog(
463 Desktop.desktop, panel, title,
464 JOptionPane.OK_CANCEL_OPTION)) == JOptionPane.OK_OPTION)
468 // TODO: do a better job of checking that the url is a valid discovery
469 // URL for web services.
470 String tx = urltf.getText().trim();
471 while (tx.length() > 0 && tx.lastIndexOf('/') == tx.length() - 1)
473 tx = tx.substring(0, tx.length() - 1);
478 } catch (Exception e)
481 JOptionPane.showInternalMessageDialog(Desktop.desktop,
482 MessageManager.getString("label.invalid_url"));
485 if (valid && resp == JOptionPane.OK_OPTION)
487 int validate = JOptionPane
488 .showInternalConfirmDialog(
490 MessageManager.getString("info.validate_jabaws_server"),
491 MessageManager.getString("label.test_server"), JOptionPane.YES_NO_OPTION);
493 if (validate == JOptionPane.OK_OPTION)
495 if (Jws2Discoverer.testServiceUrl(foo))
497 return foo.toString();
501 int opt = JOptionPane
502 .showInternalOptionDialog(
506 + "' failed validation,\ndo you want to add it anyway? ",
507 "Server Validation Failed",
508 JOptionPane.YES_NO_OPTION,
509 JOptionPane.INFORMATION_MESSAGE, null, null, null);
510 if (opt == JOptionPane.YES_OPTION)
512 return foo.toString();
517 .showInternalMessageDialog(
520 .getString("warn.server_didnt_pass_validation"));
528 // just return the URL anyway
529 return foo.toString();
538 * @see jalview.jbgui.GWsPreferences#newWsUrl_actionPerformed(java.awt.event.
542 protected void newWsUrl_actionPerformed(ActionEvent e)
544 String url = editUrl(null, MessageManager.getString("label.add_jabaws_url"));
547 if (!wsUrls.contains(url))
549 int selind = wsList.getSelectedRow();
552 wsUrls.add(selind, url);
567 * @see jalview.jbgui.GWsPreferences#refreshWs_actionPerformed(java.awt.event.
571 protected void refreshWs_actionPerformed(ActionEvent e)
573 new Thread(new Runnable()
579 lastrefresh = update - 1;
580 updateWsMenuConfig(false);
588 * Refresh the web services menus - but only if there has been a change in the
589 * configuration (indicated by update!=lastrefresh)
591 * @param showProgress
592 * show progress in dialog or on desktop
594 protected void refreshWsMenu(boolean showProgress)
598 new Thread(new Runnable()
603 progressBar.setVisible(true);
605 progressBar.setIndeterminate(true);
606 if (lastrefresh != update)
608 lastrefresh = update;
609 Desktop.instance.startServiceDiscovery(true); // wait around for all
610 // threads to complete
614 progressBar.setIndeterminate(false);
615 progressBar.setVisible(false);
623 new Thread(new Runnable()
628 long ct = System.currentTimeMillis();
629 Desktop.instance.setProgressBar(MessageManager.getString("status.refreshing_web_service_menus"),
631 if (lastrefresh != update)
633 lastrefresh = update;
634 Desktop.instance.startServiceDiscovery(true);
637 Desktop.instance.setProgressBar(null, ct);
645 * state counters for ensuring that updates only happen if config has changed.
647 private long update = 0, lastrefresh = 0;
653 * jalview.jbgui.GWsPreferences#resetWs_actionPerformed(java.awt.event.ActionEvent
657 protected void resetWs_actionPerformed(ActionEvent e)
659 Jws2Discoverer.getDiscoverer().setServiceUrls(null);
660 List<String> nwsUrls = Jws2Discoverer.getDiscoverer().getServiceUrls();
661 if (!wsUrls.equals(nwsUrls))
668 updateAndRefreshWsMenuConfig(true);
671 protected void ok_ActionPerformed(ActionEvent e)
673 // update everything regardless.
674 updateAndRefreshWsMenuConfig(false);
677 public void updateAndRefreshWsMenuConfig(
678 final boolean showProgressInDialog)
680 new Thread(new Runnable()
685 updateWsMenuConfig(false);
686 refreshWsMenu(showProgressInDialog);