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 java.awt.BorderLayout;
24 import java.awt.Color;
25 import java.awt.Component;
26 import java.awt.Dimension;
27 import java.awt.event.ActionEvent;
28 import java.awt.event.ActionListener;
30 import java.util.List;
31 import java.util.Vector;
33 import javax.swing.JLabel;
34 import javax.swing.JPanel;
35 import javax.swing.JTable;
36 import javax.swing.JTextField;
37 import javax.swing.table.AbstractTableModel;
38 import javax.swing.table.TableCellRenderer;
40 import jalview.bin.Cache;
41 import jalview.jbgui.GWsPreferences;
42 import jalview.util.IdUtils;
43 import jalview.util.IdUtils.IdType;
44 import jalview.util.MessageManager;
45 import jalview.ws.jws2.Jws2Discoverer;
46 import jalview.ws.rest.RestServiceDescription;
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 = jalview.ws.rest.RestClient.getRsbsDescriptions();
85 oldRsbsUrls = new Vector<String>(rsbsUrls);
90 rsbsUrls = new Vector<String>();
93 enableEnfinServices.setSelected(
94 oldEnfin = Cache.getDefault("SHOW_ENFIN_SERVICES", true));
95 enableEnfinServices.addActionListener(updateAction);
96 enableJws2Services.setSelected(
97 oldJws2 = Cache.getDefault("SHOW_JWS2_SERVICES", true));
98 enableJws2Services.addActionListener(updateAction);
99 indexByHost.setSelected(
100 oldIndexByHost = Cache.getDefault("WSMENU_BYHOST", false));
101 indexByHost.addActionListener(updateAction);
102 indexByType.setSelected(
103 oldIndexByType = Cache.getDefault("WSMENU_BYTYPE", false));
104 indexByType.addActionListener(updateAction);
105 displayWsWarning.setSelected(oldWsWarning = Cache
106 .getDefault("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] = Integer.valueOf(status);
131 wsList.setModel(new WsUrlTableModel(tdat));
132 wsList.getColumn(MessageManager.getString("label.status"))
136 private class JabaWSStatusRenderer extends JPanel
137 implements TableCellRenderer
139 public JabaWSStatusRenderer()
142 setMinimumSize(new Dimension(10, 10));
148 * render an Integer reflecting service status as a colour and symbol
152 public Component getTableCellRendererComponent(JTable arg0,
153 Object status, boolean isSelected, boolean hasFocus, int row,
157 String t = new String("");
158 switch (((Integer) status).intValue())
161 // cb.setSelected(true);
166 // cb.setSelected(true);
171 // cb.setSelected(false);
176 // cb.setSelected(false);
188 private class WsUrlTableModel extends AbstractTableModel
191 private Object[][] data;
193 private String[] columnNames = new String[] {
194 MessageManager.getString("label.service_url"),
195 MessageManager.getString("label.status") };
197 public WsUrlTableModel(Object[][] tdat)
203 public int getColumnCount()
209 public String getColumnName(int column)
211 return columnNames[column];
215 public int getRowCount()
225 public java.lang.Class<?> getColumnClass(int columnIndex)
227 return getValueAt(0, columnIndex).getClass();
231 public Object getValueAt(int rowIndex, int columnIndex)
233 return data[rowIndex][columnIndex];
238 private void updateRsbsList()
240 sbrsList.setListData(rsbsUrls);
243 private void updateServiceList()
245 Jws2Discoverer.getDiscoverer().setServiceUrls(wsUrls);
248 private void updateRsbsServiceList()
250 jalview.ws.rest.RestClient.setRsbsServices(rsbsUrls);
257 * jalview.jbgui.GWsPreferences#deleteWsUrl_actionPerformed(java.awt.event
261 protected void deleteWsUrl_actionPerformed(ActionEvent e)
263 int sel = wsList.getSelectedRow();
275 * @see jalview.jbgui.GWsPreferences#editWsUrl_actionPerformed(java.awt.event.
279 protected void editWsUrl_actionPerformed(ActionEvent e)
281 int sel = wsList.getSelectedRow();
284 String url = editUrl(wsUrls.get(sel),
285 MessageManager.getString("label.edit_jabaws_url"));
288 int present = wsUrls.indexOf(url);
292 wsUrls.set(sel, url);
308 protected void newSbrsUrl_actionPerformed(ActionEvent e)
310 RestServiceEditorPane rse = new RestServiceEditorPane();
311 rse.showDialog(MessageManager.getString("label.add_new_sbrs_service"));
312 String rservice = rse.getEditedRestService();
313 if (rservice != null && !rsbsUrls.contains(rservice))
315 rsbsUrls.add(rservice);
322 protected void editSbrsUrl_actionPerformed(ActionEvent e)
324 int sel = sbrsList.getSelectedIndex();
327 RestServiceEditorPane rse = new RestServiceEditorPane(
328 new RestServiceDescription(rsbsUrls.elementAt(sel)));
329 rse.showDialog(MessageManager.getString("label.edit_sbrs_entry"));
330 String rservice = rse.getEditedRestService();
331 if (rservice != null)
333 int present = rsbsUrls.indexOf(rservice);
337 rsbsUrls.setElementAt(rservice, sel);
344 rsbsUrls.removeElementAt(sel);
353 void updateWsMenuConfig(boolean old)
357 if (oldUrls != wsUrls || (wsUrls != null && oldUrls != null
358 && !wsUrls.equals(oldUrls)))
362 wsUrls = (oldUrls == null) ? null : new Vector(oldUrls);
363 if (oldRsbsUrls != rsbsUrls || (rsbsUrls != null
364 && oldRsbsUrls != null && !oldRsbsUrls.equals(rsbsUrls)))
368 oldRsbsUrls = (oldRsbsUrls == null) ? null : new Vector(oldRsbsUrls);
374 Cache.setProperty("SHOW_ENFIN_SERVICES",
376 old ? oldEnfin : enableEnfinServices.isSelected())
378 Cache.setProperty("SHOW_JWS2_SERVICES",
379 Boolean.valueOf(old ? oldJws2 : enableJws2Services.isSelected())
381 Cache.setProperty("WSMENU_BYHOST",
382 Boolean.valueOf(old ? oldIndexByHost : indexByHost.isSelected())
384 Cache.setProperty("WSMENU_BYTYPE",
385 Boolean.valueOf(old ? oldIndexByType : indexByType.isSelected())
388 Cache.setProperty("SHOW_WSDISCOVERY_ERRORS",
390 old ? oldWsWarning : displayWsWarning.isSelected())
393 updateRsbsServiceList();
400 * jalview.jbgui.GWsPreferences#moveWsUrlDown_actionPerformed(java.awt.event
404 protected void moveWsUrlDown_actionPerformed(ActionEvent e)
406 int p = wsList.getSelectedRow();
407 if (p > -1 && p < wsUrls.size() - 1)
409 String t = wsUrls.get(p + 1);
410 wsUrls.set(p + 1, wsUrls.get(p));
413 wsList.getSelectionModel().setSelectionInterval(p + 1, p + 1);
422 * jalview.jbgui.GWsPreferences#moveWsUrlUp_actionPerformed(java.awt.event
426 protected void moveWsUrlUp_actionPerformed(ActionEvent e)
428 int p = wsList.getSelectedRow();
431 String t = wsUrls.get(p - 1);
432 wsUrls.set(p - 1, wsUrls.get(p));
435 wsList.getSelectionModel().setSelectionInterval(p - 1, p - 1);
440 private String editUrl(String initUrl, String title)
442 String url = initUrl;
448 JTextField urltf = new JTextField(url, 40);
449 JPanel panel = new JPanel(new BorderLayout());
450 JPanel pane12 = new JPanel(new BorderLayout());
451 pane12.add(new JLabel(MessageManager.getString("label.url:")),
452 BorderLayout.CENTER);
453 pane12.add(urltf, BorderLayout.EAST);
454 panel.add(pane12, BorderLayout.NORTH);
455 boolean valid = false;
456 int resp = JvOptionPane.CANCEL_OPTION;
457 while (!valid && (resp = JvOptionPane.showInternalConfirmDialog(
458 Desktop.desktop, panel, title,
459 JvOptionPane.OK_CANCEL_OPTION)) == JvOptionPane.OK_OPTION)
463 // TODO: do a better job of checking that the url is a valid discovery
464 // URL for web services.
465 String tx = urltf.getText().trim();
466 while (tx.length() > 0 && tx.lastIndexOf('/') == tx.length() - 1)
468 tx = tx.substring(0, tx.length() - 1);
473 } catch (Exception e)
476 JvOptionPane.showInternalMessageDialog(Desktop.desktop,
477 MessageManager.getString("label.invalid_url"));
480 if (valid && resp == JvOptionPane.OK_OPTION)
482 int validate = JvOptionPane.showInternalConfirmDialog(Desktop.desktop,
483 MessageManager.getString("info.validate_jabaws_server"),
484 MessageManager.getString("label.test_server"),
485 JvOptionPane.YES_NO_OPTION);
487 if (validate == JvOptionPane.OK_OPTION)
489 if (Jws2Discoverer.testServiceUrl(foo))
491 return foo.toString();
495 int opt = JvOptionPane.showInternalOptionDialog(Desktop.desktop,
496 "The Server '" + foo.toString()
497 + "' failed validation,\ndo you want to add it anyway? ",
498 "Server Validation Failed", JvOptionPane.YES_NO_OPTION,
499 JvOptionPane.INFORMATION_MESSAGE, null, null, null);
500 if (opt == JvOptionPane.YES_OPTION)
502 return foo.toString();
506 JvOptionPane.showInternalMessageDialog(Desktop.desktop,
507 MessageManager.getString(
508 "warn.server_didnt_pass_validation"));
515 // just return the URL anyway
516 return foo.toString();
525 * @see jalview.jbgui.GWsPreferences#newWsUrl_actionPerformed(java.awt.event.
529 protected void newWsUrl_actionPerformed(ActionEvent e)
531 String url = editUrl(null,
532 MessageManager.getString("label.add_jabaws_url"));
535 if (!wsUrls.contains(url))
537 int selind = wsList.getSelectedRow();
540 wsUrls.add(selind, url);
555 * @see jalview.jbgui.GWsPreferences#refreshWs_actionPerformed(java.awt.event.
559 protected void refreshWs_actionPerformed(ActionEvent e)
561 new Thread(new Runnable()
568 lastrefresh = update - 1;
569 updateWsMenuConfig(false);
577 * Refresh the web services menus - but only if there has been a change in the
578 * configuration (indicated by update!=lastrefresh)
580 * @param showProgress
581 * show progress in dialog or on desktop
583 protected void refreshWsMenu(boolean showProgress)
587 new Thread(new Runnable()
593 progressBar.setVisible(true);
595 progressBar.setIndeterminate(true);
596 if (lastrefresh != update)
598 lastrefresh = update;
599 Desktop.instance.startServiceDiscovery(true); // wait around for all
600 // threads to complete
604 progressBar.setIndeterminate(false);
605 progressBar.setVisible(false);
613 new Thread(new Runnable()
619 long ct = IdUtils.newId(IdType.PROGRESS);
620 Desktop.instance.setProgressBar(MessageManager
621 .getString("status.refreshing_web_service_menus"), ct);
622 if (lastrefresh != update)
624 lastrefresh = update;
625 Desktop.instance.startServiceDiscovery(true);
628 Desktop.instance.setProgressBar(null, ct);
636 * state counters for ensuring that updates only happen if config has changed.
638 protected long update = 0;
640 private long lastrefresh = 0;
646 * jalview.jbgui.GWsPreferences#resetWs_actionPerformed(java.awt.event.ActionEvent
650 protected void resetWs_actionPerformed(ActionEvent e)
652 Jws2Discoverer.getDiscoverer().setServiceUrls(null);
653 List<String> nwsUrls = Jws2Discoverer.getDiscoverer().getServiceUrls();
654 if (!wsUrls.equals(nwsUrls))
661 updateAndRefreshWsMenuConfig(true);
664 protected void ok_ActionPerformed(ActionEvent e)
666 // update everything regardless.
667 updateAndRefreshWsMenuConfig(false);
670 public void updateAndRefreshWsMenuConfig(
671 final boolean showProgressInDialog)
673 new Thread(new Runnable()
679 updateWsMenuConfig(false);
680 refreshWsMenu(showProgressInDialog);