JAL-1645 Version-Rel Version 2.9 Year-Rel 2015 Licensing glob
[jalview.git] / src / jalview / ws / jws2 / Jws2Discoverer.java
index 144a860..60fa85b 100644 (file)
@@ -1,6 +1,6 @@
 /*
- * Jalview - A Sequence Alignment Editor and Viewer (Version 2.8.2)
- * Copyright (C) 2014 The Jalview Authors
+ * Jalview - A Sequence Alignment Editor and Viewer (Version 2.9)
+ * Copyright (C) 2015 The Jalview Authors
  * 
  * This file is part of Jalview.
  * 
@@ -24,6 +24,7 @@ import jalview.bin.Cache;
 import jalview.gui.AlignFrame;
 import jalview.gui.Desktop;
 import jalview.gui.JvSwingUtils;
+import jalview.util.MessageManager;
 import jalview.ws.WSMenuEntryProviderI;
 import jalview.ws.jws2.jabaws2.Jws2Instance;
 import jalview.ws.params.ParamDatastoreI;
@@ -33,6 +34,8 @@ import java.awt.event.ActionEvent;
 import java.awt.event.ActionListener;
 import java.beans.PropertyChangeEvent;
 import java.beans.PropertyChangeListener;
+import java.beans.PropertyChangeSupport;
+import java.net.MalformedURLException;
 import java.net.URL;
 import java.util.ArrayList;
 import java.util.Arrays;
@@ -59,9 +62,48 @@ import compbio.ws.client.Services;
  */
 public class Jws2Discoverer implements Runnable, WSMenuEntryProviderI
 {
-  private java.beans.PropertyChangeSupport changeSupport = new java.beans.PropertyChangeSupport(
+  public static final String COMPBIO_JABAWS = "http://www.compbio.dundee.ac.uk/jabaws";
+
+  /*
+   * the .jalview_properties entry for JWS2 URLS
+   */
+  final static String JWS2HOSTURLS = "JWS2HOSTURLS";
+
+  /*
+   * Singleton instance
+   */
+  private static Jws2Discoverer discoverer;
+
+  /*
+   * Override for testing only
+   */
+  private static List<String> testUrls = null;
+
+  // preferred url has precedence over others
+  private String preferredUrl;
+
+  private PropertyChangeSupport changeSupport = new PropertyChangeSupport(
           this);
 
+  Vector<String> invalidServiceUrls = null, urlsWithoutServices = null,
+          validServiceUrls = null;
+
+  boolean running = false, aborted = false;
+
+  Thread oldthread = null;
+
+  /**
+   * holds list of services.
+   */
+  protected Vector<Jws2Instance> services;
+
+  /**
+   * Private constructor enforces use of singleton via getDiscoverer()
+   */
+  private Jws2Discoverer()
+  {
+  }
+
   /**
    * change listeners are notified of "services" property changes
    * 
@@ -86,8 +128,6 @@ public class Jws2Discoverer implements Runnable, WSMenuEntryProviderI
     changeSupport.removePropertyChangeListener(listener);
   }
 
-  boolean running = false, aborted = false;
-
   /**
    * @return the aborted
    */
@@ -103,9 +143,8 @@ public class Jws2Discoverer implements Runnable, WSMenuEntryProviderI
   public void setAborted(boolean aborted)
   {
     this.aborted = aborted;
-  }
 
-  Thread oldthread = null;
+  }
 
   public void run()
   {
@@ -134,9 +173,8 @@ public class Jws2Discoverer implements Runnable, WSMenuEntryProviderI
 
     // first set up exclusion list if needed
     final Set<String> ignoredServices = new HashSet<String>();
-    for (String ignored : jalview.bin.Cache.getDefault(
-            "IGNORED_JABAWS_SERVICETYPES", "")
-            .split("\\|"))
+    for (String ignored : Cache.getDefault("IGNORED_JABAWS_SERVICETYPES",
+            "").split("\\|"))
     {
       ignoredServices.add(ignored);
     }
@@ -175,9 +213,9 @@ public class Jws2Discoverer implements Runnable, WSMenuEntryProviderI
     ArrayList<String> svctypes = new ArrayList<String>();
 
     List<JabaWsServerQuery> qrys = new ArrayList<JabaWsServerQuery>();
-    for (final String jwsservers : getServiceUrls())
+    for (final String jwsserver : getServiceUrls())
     {
-      JabaWsServerQuery squery = new JabaWsServerQuery(this, jwsservers);
+      JabaWsServerQuery squery = new JabaWsServerQuery(this, jwsserver);
       if (svctypes.size() == 0)
       {
         // TODO: remove this ugly hack to get Canonical JABA service ordering
@@ -232,7 +270,7 @@ public class Jws2Discoverer implements Runnable, WSMenuEntryProviderI
         Jws2Instance[] svcs = new Jws2Instance[services.size()];
         int[] spos = new int[services.size()];
         int ipos = 0;
-        Vector svcUrls = getServiceUrls();
+        List<String> svcUrls = getServiceUrls();
         for (Jws2Instance svc : services)
         {
           svcs[ipos] = svc;
@@ -289,11 +327,6 @@ public class Jws2Discoverer implements Runnable, WSMenuEntryProviderI
   }
 
   /**
-   * holds list of services.
-   */
-  protected Vector<Jws2Instance> services;
-
-  /**
    * attach all available web services to the appropriate submenu in the given
    * JMenu
    */
@@ -386,15 +419,16 @@ public class Jws2Discoverer implements Runnable, WSMenuEntryProviderI
           Desktop.showUrl(service.getHost());
         }
       });
-      hitm.setToolTipText(JvSwingUtils
-              .wrapTooltip("Opens the JABAWS server's homepage in web browser"));
+      hitm.setToolTipText(JvSwingUtils.wrapTooltip(false,
+              MessageManager.getString("label.open_jabaws_web_page")));
 
       service.attachWSMenuEntry(atpoint, alignFrame);
       if (alternates.containsKey(service.serviceType))
       {
-        atpoint.add(hitm = new JMenu("Switch server"));
-        hitm.setToolTipText(JvSwingUtils
-                .wrapTooltip("Choose a server for running this service"));
+        atpoint.add(hitm = new JMenu(MessageManager
+                .getString("label.switch_server")));
+        hitm.setToolTipText(JvSwingUtils.wrapTooltip(false,
+                MessageManager.getString("label.choose_jabaws_server")));
         for (final Jws2Instance sv : alternates.get(service.serviceType))
         {
           JMenuItem itm;
@@ -483,7 +517,8 @@ public class Jws2Discoverer implements Runnable, WSMenuEntryProviderI
           atpoint = JvSwingUtils.findOrCreateMenu(atpoint, host);
           if (atpoint.getToolTipText() == null)
           {
-            atpoint.setToolTipText("Services at " + host);
+            atpoint.setToolTipText(MessageManager.formatMessage(
+                    "label.services_at", new String[] { host }));
           }
         }
         if (bytype)
@@ -527,8 +562,8 @@ public class Jws2Discoverer implements Runnable, WSMenuEntryProviderI
                 Desktop.showUrl(service.getHost());
               }
             });
-            hitm.setToolTipText(JvSwingUtils
-                    .wrapTooltip("Opens the JABAWS server's homepage in web browser"));
+            hitm.setToolTipText(JvSwingUtils.wrapTooltip(true,
+                    MessageManager.getString("label.open_jabaws_web_page")));
             lasthostFor.put(service.action, host);
           }
           hostLabels.add(host + service.serviceType
@@ -544,7 +579,7 @@ public class Jws2Discoverer implements Runnable, WSMenuEntryProviderI
   {
     if (args.length > 0)
     {
-      testUrls = new Vector<String>();
+      testUrls = new ArrayList<String>();
       for (String url : args)
       {
         testUrls.add(url);
@@ -591,8 +626,11 @@ public class Jws2Discoverer implements Runnable, WSMenuEntryProviderI
     }
   }
 
-  private static Jws2Discoverer discoverer;
-
+  /**
+   * Returns the singleton instance of this class.
+   * 
+   * @return
+   */
   public static Jws2Discoverer getDiscoverer()
   {
     if (discoverer == null)
@@ -604,7 +642,6 @@ public class Jws2Discoverer implements Runnable, WSMenuEntryProviderI
 
   public boolean hasServices()
   {
-    // TODO Auto-generated method stub
     return !running && services != null && services.size() > 0;
   }
 
@@ -613,24 +650,19 @@ public class Jws2Discoverer implements Runnable, WSMenuEntryProviderI
     return running;
   }
 
-  /**
-   * the jalview .properties entry for JWS2 URLS
-   */
-  final static String JWS2HOSTURLS = "JWS2HOSTURLS";
-
-  public static void setServiceUrls(Vector<String> urls)
+  public void setServiceUrls(List<String> wsUrls)
   {
-    if (urls != null)
+    if (wsUrls != null && !wsUrls.isEmpty())
     {
-      StringBuffer urlbuffer = new StringBuffer();
+      StringBuilder urls = new StringBuilder(128);
       String sep = "";
-      for (String url : urls)
+      for (String url : wsUrls)
       {
-        urlbuffer.append(sep);
-        urlbuffer.append(url);
+        urls.append(sep);
+        urls.append(url);
         sep = ",";
       }
-      Cache.setProperty(JWS2HOSTURLS, urlbuffer.toString());
+      Cache.setProperty(JWS2HOSTURLS, urls.toString());
     }
     else
     {
@@ -638,18 +670,27 @@ public class Jws2Discoverer implements Runnable, WSMenuEntryProviderI
     }
   }
 
-  private static Vector<String> testUrls = null;
-
-  public static Vector<String> getServiceUrls()
+  /**
+   * Returns web service URLs, in the order in which they should be tried (or an
+   * empty list).
+   * 
+   * @return
+   */
+  public List<String> getServiceUrls()
   {
     if (testUrls != null)
     {
       // return test urls, if there are any, instead of touching cache
       return testUrls;
     }
-    String surls = Cache.getDefault(JWS2HOSTURLS,
-            "http://www.compbio.dundee.ac.uk/jabaws");
-    Vector<String> urls = new Vector<String>();
+    List<String> urls = new ArrayList<String>();
+
+    if (this.preferredUrl != null)
+    {
+      urls.add(preferredUrl);
+    }
+
+    String surls = Cache.getDefault(JWS2HOSTURLS, COMPBIO_JABAWS);
     try
     {
       StringTokenizer st = new StringTokenizer(surls, ",");
@@ -658,40 +699,35 @@ public class Jws2Discoverer implements Runnable, WSMenuEntryProviderI
         String url = null;
         try
         {
-          java.net.URL u = new java.net.URL(url = st.nextToken());
+          url = st.nextToken();
+          new URL(url);
           if (!urls.contains(url))
           {
             urls.add(url);
           }
           else
           {
-            jalview.bin.Cache.log.info("Ignoring duplicate url in "
+            Cache.log.warn("Ignoring duplicate url " + url + " in "
                     + JWS2HOSTURLS + " list");
           }
-        } catch (Exception ex)
+        } catch (MalformedURLException ex)
         {
-          jalview.bin.Cache.log
-                  .warn("Problem whilst trying to make a URL from '"
-                          + ((url != null) ? url : "<null>") + "'");
-          jalview.bin.Cache.log
+          Cache.log.warn("Problem whilst trying to make a URL from '"
+                  + ((url != null) ? url : "<null>") + "'");
+          Cache.log
                   .warn("This was probably due to a malformed comma separated list"
                           + " in the "
                           + JWS2HOSTURLS
                           + " entry of $(HOME)/.jalview_properties)");
-          jalview.bin.Cache.log.debug("Exception was ", ex);
+          Cache.log.debug("Exception was ", ex);
         }
       }
     } catch (Exception ex)
     {
-      jalview.bin.Cache.log.warn(
-              "Error parsing comma separated list of urls in "
-                      + JWS2HOSTURLS + " preference.", ex);
+      Cache.log.warn("Error parsing comma separated list of urls in "
+              + JWS2HOSTURLS + " preference.", ex);
     }
-    if (urls.size() >= 0)
-    {
-      return urls;
-    }
-    return null;
+    return urls;
   }
 
   public Vector<Jws2Instance> getServices()
@@ -710,8 +746,8 @@ public class Jws2Discoverer implements Runnable, WSMenuEntryProviderI
   {
     try
     {
-      compbio.ws.client.WSTester.main(new String[]
-      { "-h=" + foo.toString() });
+      compbio.ws.client.WSTester
+              .main(new String[] { "-h=" + foo.toString() });
     } catch (Exception e)
     {
       e.printStackTrace();
@@ -749,9 +785,6 @@ public class Jws2Discoverer implements Runnable, WSMenuEntryProviderI
     return thr;
   }
 
-  Vector<String> invalidServiceUrls = null, urlsWithoutServices = null,
-          validServiceUrls = null;
-
   /**
    * @return the invalidServiceUrls
    */
@@ -820,7 +853,8 @@ public class Jws2Discoverer implements Runnable, WSMenuEntryProviderI
       if (getInvalidServiceUrls() != null
               && getInvalidServiceUrls().size() > 0)
       {
-        ermsg.append("URLs that could not be contacted: \n");
+        ermsg.append(MessageManager.getString("warn.urls_not_contacted")
+                + ": \n");
         for (String svcurl : getInvalidServiceUrls())
         {
           if (list)
@@ -836,7 +870,7 @@ public class Jws2Discoverer implements Runnable, WSMenuEntryProviderI
       if (getUrlsWithoutServices() != null
               && getUrlsWithoutServices().size() > 0)
       {
-        ermsg.append("URLs without any JABA Services : \n");
+        ermsg.append(MessageManager.getString("warn.urls_no_jaba") + ": \n");
         for (String svcurl : getUrlsWithoutServices())
         {
           if (list)
@@ -864,7 +898,9 @@ public class Jws2Discoverer implements Runnable, WSMenuEntryProviderI
       return 1;
     }
     if (urlsWithoutServices != null && urlsWithoutServices.contains(url))
+    {
       return 0;
+    }
     if (invalidServiceUrls != null && invalidServiceUrls.contains(url))
     {
       return -1;
@@ -978,4 +1014,21 @@ public class Jws2Discoverer implements Runnable, WSMenuEntryProviderI
   {
     setPreferredServiceFor(null, serviceType, serviceAction, selectedServer);
   }
+
+  /**
+   * Set a URL to try before any others. For use with command-line parameter to
+   * configure a local Jabaws installation without the need to add to property
+   * files.
+   * 
+   * @param value
+   * @throws MalformedURLException
+   */
+  public void setPreferredUrl(String value) throws MalformedURLException
+  {
+    if (value != null && value.trim().length() > 0)
+    {
+      new URL(value);
+      preferredUrl = value;
+    }
+  }
 }