/*
* Jalview - A Sequence Alignment Editor and Viewer ($$Version-Rel$$)
* Copyright (C) $$Year-Rel$$ The Jalview Authors
*
* This file is part of Jalview.
*
* Jalview is free software: you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation, either version 3
* of the License, or (at your option) any later version.
*
* Jalview is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty
* of MERCHANTABILITY or FITNESS FOR A PARTICULAR
* PURPOSE. See the GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with Jalview. If not, see .
* The Jalview Authors are detailed in the 'AUTHORS' file.
*/
package jalview.gui;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.net.URL;
import java.util.ArrayList;
import java.util.List;
import java.util.Vector;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTable;
import javax.swing.JTextField;
import javax.swing.table.AbstractTableModel;
import javax.swing.table.TableCellRenderer;
import jalview.bin.Cache;
import jalview.jbgui.GWsPreferences;
import jalview.util.MessageManager;
import jalview.ws.WSDiscovererI;
import jalview.ws.jws2.Jws2Discoverer;
import jalview.ws.rest.RestServiceDescription;
public class WsPreferences extends GWsPreferences
{
public WsPreferences()
{
super();
initFromPreferences();
}
List wsUrls;
Vector oldUrls, rsbsUrls, oldRsbsUrls;
private boolean needWsMenuUpdate;
private boolean oldJws1, oldJws2, oldIndexByHost, oldIndexByType,
oldEnfin, oldWsWarning;
private void initFromPreferences()
{
wsUrls = Jws2Discoverer.getInstance().getServiceUrls();
if (!wsUrls.isEmpty())
{
oldUrls = new Vector(wsUrls);
}
else
{
oldUrls = null;
wsUrls = new Vector();
}
wsList.setDefaultRenderer(Integer.class, new JabaWSStatusRenderer());
wsList.setAutoResizeMode(JTable.AUTO_RESIZE_ALL_COLUMNS);
updateList();
rsbsUrls = jalview.ws.rest.RestClient.getRsbsDescriptions();
if (rsbsUrls != null)
{
oldRsbsUrls = new Vector(rsbsUrls);
}
else
{
oldRsbsUrls = null;
rsbsUrls = new Vector();
}
updateRsbsList();
enableEnfinServices.setSelected(
oldEnfin = Cache.getDefault("SHOW_ENFIN_SERVICES", true));
enableEnfinServices.addActionListener(updateAction);
enableJws2Services.setSelected(
oldJws2 = Cache.getDefault("SHOW_JWS2_SERVICES", true));
enableJws2Services.addActionListener(updateAction);
indexByHost.setSelected(
oldIndexByHost = Cache.getDefault("WSMENU_BYHOST", false));
indexByHost.addActionListener(updateAction);
indexByType.setSelected(
oldIndexByType = Cache.getDefault("WSMENU_BYTYPE", false));
indexByType.addActionListener(updateAction);
displayWsWarning.setSelected(oldWsWarning = Cache
.getDefault("SHOW_WSDISCOVERY_ERRORS", true));
}
ActionListener updateAction = new ActionListener()
{
@Override
public void actionPerformed(ActionEvent e)
{
update++;
}
};
private void updateList()
{
Object tdat[][] = new Object[wsUrls.size()][2];
int r = 0;
for (String url : wsUrls)
{
int status = Jws2Discoverer.getInstance().getServerStatusFor(url);
tdat[r][1] = Integer.valueOf(status);
tdat[r++][0] = url;
}
wsList.setModel(new WsUrlTableModel(tdat));
wsList.getColumn(MessageManager.getString("label.status"))
.setMinWidth(10);
}
private class JabaWSStatusRenderer extends JPanel
implements TableCellRenderer
{
public JabaWSStatusRenderer()
{
setOpaque(true);
setMinimumSize(new Dimension(10, 10));
// setText(" ");
}
/**
* render an Integer reflecting service status as a colour and symbol
*/
@Override
public Component getTableCellRendererComponent(JTable arg0,
Object status, boolean isSelected, boolean hasFocus, int row,
int column)
{
Color c;
String t = new String("");
switch (((Integer) status).intValue())
{
case WSDiscovererI.STATUS_OK:
// cb.setSelected(true);
// cb.setBackground(
c = Color.green;
break;
case WSDiscovererI.STATUS_NO_SERVICES:
// cb.setSelected(true);
// cb.setBackground(
c = Color.lightGray;
break;
case WSDiscovererI.STATUS_INVALID:
// cb.setSelected(false);
// cb.setBackground(
c = Color.red;
break;
case WSDiscovererI.STATUS_UNKNOWN:
default:
// cb.setSelected(false);
// cb.setBackground(
c = Color.orange;
}
setBackground(c);
// setText(t);
return this;
}
}
private class WsUrlTableModel extends AbstractTableModel
{
private Object[][] data;
private String[] columnNames = new String[] {
MessageManager.getString("label.service_url"),
MessageManager.getString("label.status") };
public WsUrlTableModel(Object[][] tdat)
{
this.data = tdat;
}
@Override
public int getColumnCount()
{
return 2;
}
@Override
public String getColumnName(int column)
{
return columnNames[column];
}
@Override
public int getRowCount()
{
if (data == null)
{
return 0;
}
return data.length;
}
@Override
public java.lang.Class> getColumnClass(int columnIndex)
{
return getValueAt(0, columnIndex).getClass();
};
@Override
public Object getValueAt(int rowIndex, int columnIndex)
{
return data[rowIndex][columnIndex];
}
}
private void updateRsbsList()
{
sbrsList.setListData(rsbsUrls);
}
private void updateServiceList()
{
Jws2Discoverer.getInstance().setServiceUrls(wsUrls);
}
private void updateRsbsServiceList()
{
jalview.ws.rest.RestClient.setRsbsServices(rsbsUrls);
}
/*
* (non-Javadoc)
*
* @see
* jalview.jbgui.GWsPreferences#deleteWsUrl_actionPerformed(java.awt.event
* .ActionEvent)
*/
@Override
protected void deleteWsUrl_actionPerformed(ActionEvent e)
{
int sel = wsList.getSelectedRow();
if (sel > -1)
{
wsUrls.remove(sel);
update++;
updateList();
}
}
/*
* (non-Javadoc)
*
* @see jalview.jbgui.GWsPreferences#editWsUrl_actionPerformed(java.awt.event.
* ActionEvent)
*/
@Override
protected void editWsUrl_actionPerformed(ActionEvent e)
{
int sel = wsList.getSelectedRow();
if (sel > -1)
{
String url = editUrl(wsUrls.get(sel),
MessageManager.getString("label.edit_jabaws_url"));
if (url != null)
{
int present = wsUrls.indexOf(url);
if (present == -1)
{
update++;
wsUrls.set(sel, url);
updateList();
}
else
{
if (present != sel)
{
wsUrls.remove(sel);
updateList();
}
}
}
}
}
@Override
protected void newSbrsUrl_actionPerformed(ActionEvent e)
{
RestServiceEditorPane rse = new RestServiceEditorPane();
rse.showDialog(MessageManager.getString("label.add_new_sbrs_service"));
String rservice = rse.getEditedRestService();
if (rservice != null && !rsbsUrls.contains(rservice))
{
rsbsUrls.add(rservice);
update++;
updateRsbsList();
}
}
@Override
protected void editSbrsUrl_actionPerformed(ActionEvent e)
{
int sel = sbrsList.getSelectedIndex();
if (sel > -1)
{
RestServiceEditorPane rse = new RestServiceEditorPane(
new RestServiceDescription(rsbsUrls.elementAt(sel)));
rse.showDialog(MessageManager.getString("label.edit_sbrs_entry"));
String rservice = rse.getEditedRestService();
if (rservice != null)
{
int present = rsbsUrls.indexOf(rservice);
if (present == -1)
{
update++;
rsbsUrls.setElementAt(rservice, sel);
updateRsbsList();
}
else
{
if (present != sel)
{
rsbsUrls.removeElementAt(sel);
update++;
updateRsbsList();
}
}
}
}
}
void updateWsMenuConfig(boolean old)
{
if (old)
{
if (oldUrls != wsUrls || (wsUrls != null && oldUrls != null
&& !wsUrls.equals(oldUrls)))
{
update++;
}
wsUrls = (oldUrls == null) ? null : new Vector(oldUrls);
if (oldRsbsUrls != rsbsUrls || (rsbsUrls != null
&& oldRsbsUrls != null && !oldRsbsUrls.equals(rsbsUrls)))
{
update++;
}
oldRsbsUrls = (oldRsbsUrls == null) ? null : new Vector(oldRsbsUrls);
}
else
{
}
Cache.setProperty("SHOW_ENFIN_SERVICES",
Boolean.valueOf(
old ? oldEnfin : enableEnfinServices.isSelected())
.toString());
Cache.setProperty("SHOW_JWS2_SERVICES",
Boolean.valueOf(old ? oldJws2 : enableJws2Services.isSelected())
.toString());
Cache.setProperty("WSMENU_BYHOST",
Boolean.valueOf(old ? oldIndexByHost : indexByHost.isSelected())
.toString());
Cache.setProperty("WSMENU_BYTYPE",
Boolean.valueOf(old ? oldIndexByType : indexByType.isSelected())
.toString());
Cache.setProperty("SHOW_WSDISCOVERY_ERRORS",
Boolean.valueOf(
old ? oldWsWarning : displayWsWarning.isSelected())
.toString());
updateServiceList();
updateRsbsServiceList();
}
/*
* (non-Javadoc)
*
* @see
* jalview.jbgui.GWsPreferences#moveWsUrlDown_actionPerformed(java.awt.event
* .ActionEvent)
*/
@Override
protected void moveWsUrlDown_actionPerformed(ActionEvent e)
{
int p = wsList.getSelectedRow();
if (p > -1 && p < wsUrls.size() - 1)
{
String t = wsUrls.get(p + 1);
wsUrls.set(p + 1, wsUrls.get(p));
wsUrls.set(p, t);
updateList();
wsList.getSelectionModel().setSelectionInterval(p + 1, p + 1);
update++;
}
}
/*
* (non-Javadoc)
*
* @see
* jalview.jbgui.GWsPreferences#moveWsUrlUp_actionPerformed(java.awt.event
* .ActionEvent)
*/
@Override
protected void moveWsUrlUp_actionPerformed(ActionEvent e)
{
int p = wsList.getSelectedRow();
if (p > 0)
{
String t = wsUrls.get(p - 1);
wsUrls.set(p - 1, wsUrls.get(p));
wsUrls.set(p, t);
updateList();
wsList.getSelectionModel().setSelectionInterval(p - 1, p - 1);
update++;
}
}
private String editUrl(String initUrl, String title)
{
String url = initUrl;
URL foo = null;
if (url == null)
{
url = "";
}
JTextField urltf = new JTextField(url, 40);
JPanel panel = new JPanel(new BorderLayout());
JPanel pane12 = new JPanel(new BorderLayout());
pane12.add(new JLabel(MessageManager.getString("label.url:")),
BorderLayout.CENTER);
pane12.add(urltf, BorderLayout.EAST);
panel.add(pane12, BorderLayout.NORTH);
boolean valid = false;
int resp = JvOptionPane.CANCEL_OPTION;
while (!valid && (resp = JvOptionPane.showInternalConfirmDialog(
Desktop.getDesktopPane(), panel, title,
JvOptionPane.OK_CANCEL_OPTION)) == JvOptionPane.OK_OPTION)
{
try
{
// TODO: do a better job of checking that the url is a valid discovery
// URL for web services.
String tx = urltf.getText().trim();
while (tx.length() > 0 && tx.lastIndexOf('/') == tx.length() - 1)
{
tx = tx.substring(0, tx.length() - 1);
}
foo = new URL(tx);
valid = true;
urltf.setText(tx);
} catch (Exception e)
{
valid = false;
JvOptionPane.showInternalMessageDialog(Desktop.getDesktopPane(),
MessageManager.getString("label.invalid_url"));
}
}
if (valid && resp == JvOptionPane.OK_OPTION)
{
int validate = JvOptionPane.showInternalConfirmDialog(Desktop.getDesktopPane(),
MessageManager.getString("info.validate_jabaws_server"),
MessageManager.getString("label.test_server"),
JvOptionPane.YES_NO_OPTION);
if (validate == JvOptionPane.OK_OPTION)
{
if (Jws2Discoverer.getInstance().testServiceUrl(foo))
{
return foo.toString();
}
else
{
int opt = JvOptionPane.showInternalOptionDialog(Desktop.getDesktopPane(),
"The Server '" + foo.toString()
+ "' failed validation,\ndo you want to add it anyway? ",
"Server Validation Failed", JvOptionPane.YES_NO_OPTION,
JvOptionPane.INFORMATION_MESSAGE, null, null, null);
if (opt == JvOptionPane.YES_OPTION)
{
return foo.toString();
}
else
{
JvOptionPane.showInternalMessageDialog(Desktop.getDesktopPane(),
MessageManager.getString(
"warn.server_didnt_pass_validation"));
}
}
}
else
{
// just return the URL anyway
return foo.toString();
}
}
return initUrl;
}
/*
* (non-Javadoc)
*
* @see jalview.jbgui.GWsPreferences#newWsUrl_actionPerformed(java.awt.event.
* ActionEvent)
*/
@Override
protected void newWsUrl_actionPerformed(ActionEvent e)
{
String url = editUrl(null,
MessageManager.getString("label.add_jabaws_url"));
if (url != null)
{
if (!wsUrls.contains(url))
{
int selind = wsList.getSelectedRow();
if (selind > -1)
{
wsUrls.add(selind, url);
}
else
{
wsUrls.add(url);
}
update++;
updateList();
}
}
}
/*
* (non-Javadoc)
*
* @see jalview.jbgui.GWsPreferences#refreshWs_actionPerformed(java.awt.event.
* ActionEvent)
*/
@Override
protected void refreshWs_actionPerformed(ActionEvent e)
{
new Thread(new Runnable()
{
@Override
public void run()
{
// force a refresh.
lastrefresh = update - 1;
updateWsMenuConfig(false);
refreshWsMenu(true);
}
}).start();
}
/**
* Refresh the web services menus - but only if there has been a change in the
* configuration (indicated by update!=lastrefresh)
*
* @param showProgress
* show progress in dialog or on desktop
*/
protected void refreshWsMenu(boolean showProgress)
{
if (showProgress)
{
new Thread(new Runnable()
{
@Override
public void run()
{
progressBar.setVisible(true);
validate();
progressBar.setIndeterminate(true);
if (lastrefresh != update)
{
lastrefresh = update;
Desktop.getInstance().startServiceDiscovery(true); // wait around for all
// threads to complete
updateList();
}
progressBar.setIndeterminate(false);
progressBar.setVisible(false);
validate();
}
}).start();
}
else
{
new Thread(new Runnable()
{
@Override
public void run()
{
long ct = System.currentTimeMillis();
Desktop.getInstance().setProgressBar(MessageManager
.getString("status.refreshing_web_service_menus"), ct);
if (lastrefresh != update)
{
lastrefresh = update;
Desktop.getInstance().startServiceDiscovery(true);
updateList();
}
Desktop.getInstance().setProgressBar(null, ct);
}
}).start();
}
}
/**
* state counters for ensuring that updates only happen if config has changed.
*/
private long update = 0, lastrefresh = 0;
/*
* (non-Javadoc)
*
* @see
* jalview.jbgui.GWsPreferences#resetWs_actionPerformed(java.awt.event.ActionEvent
* )
*/
@Override
protected void resetWs_actionPerformed(ActionEvent e)
{
Jws2Discoverer.getInstance().setServiceUrls(null);
List nwsUrls = Jws2Discoverer.getInstance().getServiceUrls();
if (!wsUrls.equals(nwsUrls))
{
update++;
}
wsUrls = nwsUrls;
updateList();
updateAndRefreshWsMenuConfig(true);
}
protected void ok_ActionPerformed(ActionEvent e)
{
// update everything regardless.
updateAndRefreshWsMenuConfig(false);
}
public void updateAndRefreshWsMenuConfig(
final boolean showProgressInDialog)
{
new Thread(new Runnable()
{
@Override
public void run()
{
updateWsMenuConfig(false);
refreshWsMenu(showProgressInDialog);
}
}).start();
}
}