X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;f=src%2Fjalview%2Fgui%2FSlivkaPreferences.java;h=ed1d5f7ce8e77d1a42d7ebc7a47f2d1c96542a23;hb=5e961ebc9a219d2e19341c0fc954f358699d3e20;hp=0743d5845d6ca5c031e51c3d6c85fc1c091646ad;hpb=2facc0e2aee62c60c28cc59277805194b306f6f9;p=jalview.git diff --git a/src/jalview/gui/SlivkaPreferences.java b/src/jalview/gui/SlivkaPreferences.java index 0743d58..ed1d5f7 100644 --- a/src/jalview/gui/SlivkaPreferences.java +++ b/src/jalview/gui/SlivkaPreferences.java @@ -1,10 +1,5 @@ package jalview.gui; -import jalview.bin.Cache; -import jalview.util.MessageManager; -import jalview.ws.WSDiscovererI; -import jalview.ws.slivkaws.SlivkaWSDiscoverer; - import java.awt.BorderLayout; import java.awt.Color; import java.awt.Component; @@ -18,7 +13,11 @@ import java.awt.event.MouseListener; import java.net.MalformedURLException; import java.net.URL; import java.util.ArrayList; +import java.util.HashMap; +import java.util.Map; import java.util.NoSuchElementException; +import java.util.concurrent.CancellationException; +import java.util.concurrent.CompletableFuture; import javax.swing.BorderFactory; import javax.swing.Box; @@ -34,6 +33,11 @@ import javax.swing.UIManager; import javax.swing.table.AbstractTableModel; import javax.swing.table.DefaultTableCellRenderer; +import jalview.bin.Cache; +import jalview.util.MessageManager; +import jalview.ws2.client.api.WebServiceDiscovererI; +import jalview.ws2.client.slivka.SlivkaWSDiscoverer; + @SuppressWarnings("serial") public class SlivkaPreferences extends JPanel { @@ -42,11 +46,11 @@ public class SlivkaPreferences extends JPanel setPreferredSize(new Dimension(500, 450)); } - WSDiscovererI discoverer; + WebServiceDiscovererI discoverer; - private final ArrayList urls = new ArrayList<>(); + private final ArrayList urls = new ArrayList<>(); - private final ArrayList statuses = new ArrayList<>(); + private final Map statuses = new HashMap<>(); private final AbstractTableModel urlTableModel = new AbstractTableModel() { @@ -64,9 +68,9 @@ public class SlivkaPreferences extends JPanel switch (columnIndex) { case 0: - return urls.get(rowIndex); + return urls.get(rowIndex).toString(); case 1: - return statuses.get(rowIndex); + return statuses.getOrDefault(urls.get(rowIndex), WebServiceDiscovererI.STATUS_UNKNOWN); default: throw new NoSuchElementException(); } @@ -97,16 +101,16 @@ public class SlivkaPreferences extends JPanel hasFocus, row, column); switch ((Integer) value) { - case WSDiscovererI.STATUS_NO_SERVICES: + case WebServiceDiscovererI.STATUS_NO_SERVICES: setForeground(Color.ORANGE); break; - case WSDiscovererI.STATUS_OK: + case WebServiceDiscovererI.STATUS_OK: setForeground(Color.GREEN); break; - case WSDiscovererI.STATUS_INVALID: + case WebServiceDiscovererI.STATUS_INVALID: setForeground(Color.RED); break; - case WSDiscovererI.STATUS_UNKNOWN: + case WebServiceDiscovererI.STATUS_UNKNOWN: default: setForeground(Color.LIGHT_GRAY); } @@ -137,11 +141,11 @@ public class SlivkaPreferences extends JPanel JButton moveUrlDown = new JButton( MessageManager.getString("action.move_down")); - private String showEditUrlDialog(String oldUrl) + private URL showEditUrlDialog(String oldUrl) { String input = (String) JvOptionPane .showInternalInputDialog( - this, + this, MessageManager.getString("label.url:"), UIManager.getString("OptionPane.inputDialogTitle", MessageManager.getLocale()), JOptionPane.QUESTION_MESSAGE, @@ -154,7 +158,7 @@ public class SlivkaPreferences extends JPanel } try { - new URL(input); + return new URL(input); } catch (MalformedURLException ex) { JvOptionPane.showInternalMessageDialog(this, @@ -164,18 +168,17 @@ public class SlivkaPreferences extends JPanel JOptionPane.WARNING_MESSAGE); return null; } - return input; } // Button Action Listeners private ActionListener newUrlAction = (ActionEvent e) -> { - final String input = showEditUrlDialog(""); + final URL input = showEditUrlDialog(""); if (input != null) { urls.add(input); - statuses.add(discoverer.getServerStatusFor(input)); + reloadStatusForUrl(input); urlTableModel.fireTableRowsInserted(urls.size(), urls.size()); - discoverer.setServiceUrls(urls); + discoverer.setUrls(urls); } }; @@ -183,13 +186,14 @@ public class SlivkaPreferences extends JPanel final int i = urlListTable.getSelectedRow(); if (i >= 0) { - final String input = showEditUrlDialog(urls.get(i)); + final URL input = showEditUrlDialog(urls.get(i).toString()); if (input != null) { urls.set(i, input); - statuses.set(i, discoverer.getServerStatusFor(input)); + statuses.remove(input); + reloadStatusForUrl(input); urlTableModel.fireTableRowsUpdated(i, i); - discoverer.setServiceUrls(urls); + discoverer.setUrls(urls); } } }; @@ -201,7 +205,7 @@ public class SlivkaPreferences extends JPanel urls.remove(i); statuses.remove(i); urlTableModel.fireTableRowsDeleted(i, i); - discoverer.setServiceUrls(urls); + discoverer.setUrls(urls); } }; @@ -210,7 +214,7 @@ public class SlivkaPreferences extends JPanel if (i > 0) { moveTableRow(i, i - 1); - discoverer.setServiceUrls(urls); + discoverer.setUrls(urls); } }; @@ -219,7 +223,7 @@ public class SlivkaPreferences extends JPanel if (i >= 0 && i < urls.size() - 1) { moveTableRow(i, i + 1); - discoverer.setServiceUrls(urls); + discoverer.setUrls(urls); } }; @@ -281,12 +285,10 @@ public class SlivkaPreferences extends JPanel private void moveTableRow(int fromIndex, int toIndex) { - String url = urls.get(fromIndex); + URL url = urls.get(fromIndex); int status = statuses.get(fromIndex); urls.set(fromIndex, urls.get(toIndex)); - statuses.set(fromIndex, statuses.get(toIndex)); urls.set(toIndex, url); - statuses.set(toIndex, status); if (urlListTable.getSelectedRow() == fromIndex) { urlListTable.setRowSelectionInterval(toIndex, toIndex); @@ -308,28 +310,32 @@ public class SlivkaPreferences extends JPanel // Discoverer buttons action listeners private ActionListener refreshServicesAction = (ActionEvent e) -> { progressBar.setVisible(true); - new Thread(() -> { - Cache.log.info("Requesting service reload"); - var task = discoverer.startDiscoverer(); - try { - task.get(); + Cache.log.info("Requesting service reload"); + discoverer.startDiscoverer().handle((services, exception) -> { + if (exception == null) + { Cache.log.info("Reloading done"); - } catch (Exception exc) { - Cache.log.error("Reloading failed", exc); - } finally { - SwingUtilities.invokeLater(() -> progressBar.setVisible(false)); } - }).start(); + else if (exception instanceof CancellationException) + { + Cache.log.info("Reloading cancelled"); + } + else { + Cache.log.error("Reloading failed", exception); + } + SwingUtilities.invokeLater(() -> progressBar.setVisible(false)); + return null; + }); }; private ActionListener resetServicesAction = (ActionEvent e) -> { - discoverer.setServiceUrls(null); + discoverer.setUrls(null); urls.clear(); statuses.clear(); - urls.addAll(discoverer.getServiceUrls()); - for (String url : urls) + urls.addAll(discoverer.getUrls()); + for (URL url : urls) { - statuses.add(discoverer.getServerStatusFor(url)); + reloadStatusForUrl(url); } urlTableModel.fireTableDataChanged(); }; @@ -358,10 +364,21 @@ public class SlivkaPreferences extends JPanel { // Initial URLs loading discoverer = SlivkaWSDiscoverer.getInstance(); - urls.addAll(discoverer.getServiceUrls()); - for (String url : urls) + urls.addAll(discoverer.getUrls()); + for (URL url : urls) { - statuses.add(discoverer.getServerStatusFor(url)); + reloadStatusForUrl(url); } } + + private void reloadStatusForUrl(URL url) + { + CompletableFuture.supplyAsync(() -> discoverer.getStatusForUrl(url)) + .thenAccept((status) -> { + statuses.put(url, status); + int row = urls.indexOf(url); + if (row >= 0) + urlTableModel.fireTableCellUpdated(row, 1); + }); + } }