Merge branch 'Jalview-JS/develop' into merge_js_develop
[jalview.git] / src / jalview / ws / jws1 / Discoverer.java
index 4643119..9a6c445 100644 (file)
  */
 package jalview.ws.jws1;
 
-import jalview.util.MessageManager;
-
+import java.net.URL;
 import java.util.Hashtable;
 import java.util.StringTokenizer;
 import java.util.Vector;
 
-import javax.swing.JOptionPane;
-
 import ext.vamsas.IRegistry;
 import ext.vamsas.IRegistryServiceLocator;
 import ext.vamsas.RegistryServiceSoapBindingStub;
 import ext.vamsas.ServiceHandle;
 import ext.vamsas.ServiceHandles;
+import jalview.bin.Cache;
+import jalview.bin.ApplicationSingletonProvider;
+import jalview.bin.ApplicationSingletonProvider.ApplicationSingletonI;
+import jalview.gui.JvOptionPane;
+import jalview.util.MessageManager;
 
-public class Discoverer implements Runnable
+public class Discoverer implements Runnable, ApplicationSingletonI
 {
+
+  public static Discoverer getInstance()
+  {
+    return (Discoverer) ApplicationSingletonProvider.getInstance(Discoverer.class);
+  }
+
+  private Discoverer()
+  {
+    // use getInstance()
+  }
+
   ext.vamsas.IRegistry registry; // the root registry service.
 
   private java.beans.PropertyChangeSupport changeSupport = new java.beans.PropertyChangeSupport(
@@ -98,9 +111,9 @@ public class Discoverer implements Runnable
       // timeout
     } catch (Exception ex)
     {
-      jalview.bin.Cache.log
-              .error("Serious!  Service location failed\nfor URL :" + WsURL
-                      + "\n", ex);
+      jalview.bin.Cache.log.error(
+              "Serious!  Service location failed\nfor URL :" + WsURL + "\n",
+              ex);
 
       return null;
     }
@@ -110,26 +123,28 @@ public class Discoverer implements Runnable
     return server;
   }
 
-  static private java.net.URL RootServiceURL = null;
+  private java.net.URL RootServiceURL = null;
 
-  static public Vector ServiceURLList = null;
+  private Vector<URL> ServiceURLList = null;
 
-  static private boolean reallyDiscoverServices = true;
-
-  public static java.util.Hashtable services = null; // vectors of services
+  public Vector<URL> getServiceURLList() {
+    return ServiceURLList;
+  }
+  
+  private boolean reallyDiscoverServices = true;
 
+  private java.util.Hashtable<String, Vector<ServiceHandle>> services = null;
   // stored by
   // abstractServiceType
   // string
 
-  public static java.util.Vector serviceList = null; // flat list of services
+  public java.util.Vector<ServiceHandle> serviceList = null;
 
-  static private Vector getDiscoveryURLS()
+  private Vector<URL> getDiscoveryURLS()
   {
-    Vector urls = new Vector();
-    String RootServiceURLs = jalview.bin.Cache
-            .getDefault("DISCOVERY_URLS",
-                    "http://www.compbio.dundee.ac.uk/JalviewWS/services/ServiceRegistry");
+    Vector<URL> urls = new Vector<>();
+    String RootServiceURLs = jalview.bin.Cache.getDefault("DISCOVERY_URLS",
+            "http://www.compbio.dundee.ac.uk/JalviewWS/services/ServiceRegistry");
 
     try
     {
@@ -154,17 +169,17 @@ public class Discoverer implements Runnable
           jalview.bin.Cache.log
                   .warn("Problem whilst trying to make a URL from '"
                           + ((url != null) ? url : "<null>") + "'");
-          jalview.bin.Cache.log
-                  .warn("This was probably due to a malformed comma separated list"
+          jalview.bin.Cache.log.warn(
+                  "This was probably due to a malformed comma separated list"
                           + " in the DISCOVERY_URLS entry of $(HOME)/.jalview_properties)");
           jalview.bin.Cache.log.debug("Exception was ", ex);
         }
       }
     } catch (Exception ex)
     {
-      jalview.bin.Cache.log
-              .warn("Error parsing comma separated list of urls in DISCOVERY_URLS.",
-                      ex);
+      jalview.bin.Cache.log.warn(
+              "Error parsing comma separated list of urls in DISCOVERY_URLS.",
+              ex);
     }
     if (urls.size() > 0)
     {
@@ -178,12 +193,18 @@ public class Discoverer implements Runnable
    */
   static public void doDiscovery()
   {
+    getInstance().discovery();
+  }
+
+  private void discovery()
+  {
     jalview.bin.Cache.log
             .debug("(Re)-Initialising the discovery URL list.");
     try
     {
-      reallyDiscoverServices = jalview.bin.Cache.getDefault(
-              "DISCOVERY_START", false);
+      Discoverer d = getInstance();
+      reallyDiscoverServices = jalview.bin.Cache
+              .getDefault("DISCOVERY_START", false);
       if (reallyDiscoverServices)
       {
         ServiceURLList = getDiscoveryURLS();
@@ -191,48 +212,43 @@ public class Discoverer implements Runnable
       else
       {
         jalview.bin.Cache.log.debug("Setting default services");
-        services = new Hashtable();
+        services = new Hashtable<>();
         // Muscle, Clustal and JPred.
-        ServiceHandle[] defServices = {
-            new ServiceHandle(
-                    "MsaWS",
-                    "Edgar, Robert C. (2004), MUSCLE: multiple sequence alignment "
-                            + "with high accuracy and high throughput, Nucleic Acids Research 32(5), 1792-97.",
-                    "http://www.compbio.dundee.ac.uk/JalviewWS/services/MuscleWS",
-                    MessageManager
-                            .getString("label.muscle_multiple_protein_sequence_alignment")),
-            new ServiceHandle(
-                    "MsaWS",
+        ServiceHandle[] defServices = { new ServiceHandle("MsaWS",
+                "Edgar, Robert C. (2004), MUSCLE: multiple sequence alignment "
+                        + "with high accuracy and high throughput, Nucleic Acids Research 32(5), 1792-97.",
+                "http://www.compbio.dundee.ac.uk/JalviewWS/services/MuscleWS",
+                MessageManager.getString(
+                        "label.muscle_multiple_protein_sequence_alignment")),
+            new ServiceHandle("MsaWS",
                     "Katoh, K., K. Kuma, K., Toh, H.,  and Miyata, T. (2005) "
                             + "\"MAFFT version 5: improvement in accuracy of multiple sequence alignment.\""
                             + " Nucleic Acids Research, 33 511-518",
                     "http://www.compbio.dundee.ac.uk/JalviewWS/services/MafftWS",
-                    MessageManager
-                            .getString("label.mafft_multiple_sequence_alignment")),
-            new ServiceHandle(
-                    "MsaWS",
+                    MessageManager.getString(
+                            "label.mafft_multiple_sequence_alignment")),
+            new ServiceHandle("MsaWS",
                     "Thompson, J.D., Higgins, D.G. and Gibson, T.J. (1994) CLUSTAL W: improving the sensitivity of progressive multiple"
                             + " sequence alignment through sequence weighting, position specific gap penalties and weight matrix choice."
                             + " Nucleic Acids Research, 22 4673-4680",
                     "http://www.compbio.dundee.ac.uk/JalviewWS/services/ClustalWS",
-                    MessageManager
-                            .getString("label.clustalw_multiple_sequence_alignment")),
-            new ServiceHandle(
-                    "SecStrPred",
+                    MessageManager.getString(
+                            "label.clustalw_multiple_sequence_alignment")),
+            new ServiceHandle("SecStrPred",
                     "Drozdetskiy A, Cole C, Procter J & Barton GJ. (2015)\nJPred4: a protein secondary structure prediction server"
                             + "\nNucleic Acids Research, Web Server issue (first published 15th April 2015)"
                             + "\ndoi://10.1093/nar/gkv332",
                     "http://www.compbio.dundee.ac.uk/JalviewWS/services/jpred",
-                    "JNet Secondary Structure Prediction") };
-        services = new Hashtable();
-        serviceList = new Vector();
+                    "JPred Secondary Structure Prediction") };
+        services = new Hashtable<>();
+        serviceList = new Vector<>();
         buildServiceLists(defServices, serviceList, services);
       }
 
     } catch (Exception e)
     {
-      System.err
-              .println("jalview.rootRegistry is not a proper url!\nWas set to "
+      System.err.println(
+              "jalview.rootRegistry is not a proper url!\nWas set to "
                       + RootServiceURL + "\n" + e);
     }
 
@@ -253,13 +269,13 @@ public class Discoverer implements Runnable
       // JBPNote - should do this a better way!
       if (f.getFaultReason().indexOf("(407)") > -1)
       {
-        if (jalview.gui.Desktop.desktop != null)
+        if (jalview.gui.Desktop.getDesktopPane() != null)
         {
-          JOptionPane.showMessageDialog(jalview.gui.Desktop.desktop,
+          JvOptionPane.showMessageDialog(jalview.gui.Desktop.getDesktopPane(),
                   MessageManager.getString("label.set_proxy_settings"),
                   MessageManager
                           .getString("label.proxy_authorization_failed"),
-                  JOptionPane.WARNING_MESSAGE);
+                  JvOptionPane.WARNING_MESSAGE);
         }
       }
       else
@@ -291,8 +307,9 @@ public class Discoverer implements Runnable
    *          Hashtable
    * @return boolean
    */
-  static private boolean buildServiceLists(ServiceHandle[] sh, Vector cat,
-          Hashtable sscat)
+  private boolean buildServiceLists(ServiceHandle[] sh,
+          Vector<ServiceHandle> cat,
+          Hashtable<String, Vector<ServiceHandle>> sscat)
   {
     boolean seenNewDiscovery = false;
     for (int i = 0, j = sh.length; i < j; i++)
@@ -304,11 +321,11 @@ public class Discoverer implements Runnable
                 + sh[i].getEndpointURL() + "\n");
         if (!sscat.containsKey(sh[i].getAbstractName()))
         {
-          sscat.put(sh[i].getAbstractName(), cat = new Vector());
+          sscat.put(sh[i].getAbstractName(), cat = new Vector<>());
         }
         else
         {
-          cat = (Vector) sscat.get(sh[i].getAbstractName());
+          cat = sscat.get(sh[i].getAbstractName());
         }
         cat.add(sh[i]);
         if (sh[i].getAbstractName().equals("Registry"))
@@ -321,16 +338,15 @@ public class Discoverer implements Runnable
               disc_serv = new java.net.URL(sh[i].getEndpointURL());
               if (!ServiceURLList.contains(disc_serv))
               {
-                jalview.bin.Cache.log
-                        .debug("Adding new discovery service at "
-                                + disc_serv);
+                jalview.bin.Cache.log.debug(
+                        "Adding new discovery service at " + disc_serv);
                 ServiceURLList.add(disc_serv);
                 seenNewDiscovery = true;
               }
             } catch (Exception e)
             {
-              jalview.bin.Cache.log.debug(
-                      "Ignoring bad discovery service URL "
+              jalview.bin.Cache.log
+                      .debug("Ignoring bad discovery service URL "
                               + sh[i].getEndpointURL(), e);
             }
           }
@@ -342,8 +358,8 @@ public class Discoverer implements Runnable
 
   public void discoverServices()
   {
-    Hashtable sscat = new Hashtable();
-    Vector cat = new Vector();
+    Hashtable<String, Vector<ServiceHandle>> sscat = new Hashtable<>();
+    Vector<ServiceHandle> cat = new Vector<>();
     ServiceHandle sh[] = null;
     int s_url = 0;
     if (ServiceURLList == null)
@@ -354,17 +370,17 @@ public class Discoverer implements Runnable
     }
     while (s_url < ServiceURLList.size())
     {
-      if ((sh = getServices((java.net.URL) ServiceURLList.get(s_url))) != null)
+      if ((sh = getServices(
+              ServiceURLList.get(s_url))) != null)
       {
 
         buildServiceLists(sh, cat, sscat);
       }
       else
       {
-        jalview.bin.Cache.log
-                .warn("No services at "
-                        + (ServiceURLList.get(s_url))
-                        + " - check DISCOVERY_URLS property in .jalview_properties");
+        jalview.bin.Cache.log.warn("No services at "
+                + (ServiceURLList.get(s_url))
+                + " - check DISCOVERY_URLS property in .jalview_properties");
       }
       s_url++;
     }
@@ -373,7 +389,7 @@ public class Discoverer implements Runnable
     // so no need to access original discovery thread.
     // Curent decision is to change properties then notify listeners with old
     // and new values.
-    Hashtable oldServices = services;
+    Hashtable<String, Vector<ServiceHandle>> oldServices = services;
     // Vector oldServicelist = serviceList;
     services = sscat;
     serviceList = cat;
@@ -383,49 +399,24 @@ public class Discoverer implements Runnable
   /**
    * creates a new thread to call discoverServices()
    */
+  @Override
   public void run()
   {
-    final Discoverer discoverer = this;
-    Thread discoverThread = new Thread()
-    {
-      public void run()
-      {
-        discoverer.doDiscovery();
-        discoverer.discoverServices();
-      }
-    };
-    discoverThread.start();
+    Cache.log.info("Discovering jws1 services");
+    Discoverer.doDiscovery();
+    discoverServices();
   }
 
   /**
    * binding service abstract name to handler class
    */
-  private static Hashtable serviceClientBindings;
+  private Hashtable<String, WS1Client> serviceClientBindings;
 
   public static WS1Client getServiceClient(ServiceHandle sh)
   {
-    if (serviceClientBindings == null)
-    {
-      // get a list from Config or create below
-      serviceClientBindings = new Hashtable();
-      serviceClientBindings.put("MsaWS", new MsaWSClient());
-      serviceClientBindings.put("SecStrPred", new JPredClient());
-      serviceClientBindings.put("SeqSearch", new SeqSearchWSClient());
-    }
-    WS1Client instance = (WS1Client) serviceClientBindings.get(sh
-            .getAbstractName());
-    if (instance == null)
-    {
-      System.err
-              .println("WARNING - POSSIBLE IMPLEMENTATION ERROR - cannot find WSClient implementation for "
-                      + sh.getAbstractName());
-    }
-    else
-    {
-      instance.serviceHandle = sh;
-    }
-    return instance;
+    return getInstance().getClient(sh);
   }
+  
   /**
    * notes on discovery service 1. need to allow multiple discovery source urls.
    * 2. user interface to add/control list of urls in preferences notes on
@@ -442,4 +433,34 @@ public class Discoverer implements Runnable
    * dataset).
    * 
    */
+
+  private WS1Client getClient(ServiceHandle sh)
+  {
+    if (serviceClientBindings == null)
+    {
+      // get a list from Config or create below
+      serviceClientBindings = new Hashtable<>();
+      serviceClientBindings.put("MsaWS", new MsaWSClient());
+      serviceClientBindings.put("SecStrPred", new JPredClient());
+      serviceClientBindings.put("SeqSearch", new SeqSearchWSClient());
+    }
+    WS1Client instance = serviceClientBindings
+            .get(sh.getAbstractName());
+    if (instance == null)
+    {
+      System.err.println(
+              "WARNING - POSSIBLE IMPLEMENTATION ERROR - cannot find WSClient implementation for "
+                      + sh.getAbstractName());
+    }
+    else
+    {
+      instance.serviceHandle = sh;
+    }
+    return instance;
+  }
+
+  public static Hashtable<String, Vector<ServiceHandle>> getServices()
+  {
+    return getInstance().services;
+  }
 }