Merge branch 'develop' into update_212_Dec_merge_with_21125_chamges
[jalview.git] / src / jalview / ws / jws1 / Discoverer.java
index 4a8f512..a5b73da 100644 (file)
  */
 package jalview.ws.jws1;
 
-import jalview.bin.Cache;
-import jalview.bin.Console;
-import jalview.gui.JvOptionPane;
-import jalview.util.MessageManager;
 
 import java.net.URL;
 import java.util.Hashtable;
@@ -35,9 +31,24 @@ import ext.vamsas.IRegistryServiceLocator;
 import ext.vamsas.RegistryServiceSoapBindingStub;
 import ext.vamsas.ServiceHandle;
 import ext.vamsas.ServiceHandles;
+import jalview.bin.Cache;
+import jalview.bin.Console;
+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(
@@ -112,20 +123,24 @@ public class Discoverer implements Runnable
     return server;
   }
 
-  static private java.net.URL RootServiceURL = null;
+  private java.net.URL RootServiceURL = null;
 
-  static public Vector<URL> ServiceURLList = null;
+  private Vector<URL> ServiceURLList = null;
 
-  static private boolean reallyDiscoverServices = true;
+  public Vector<URL> getServiceURLList() {
+    return ServiceURLList;
+  }
+  
+  private boolean reallyDiscoverServices = true;
 
-  public static java.util.Hashtable<String, Vector<ServiceHandle>> services = null;
+  private java.util.Hashtable<String, Vector<ServiceHandle>> services = null;
   // stored by
   // abstractServiceType
   // string
 
-  public static java.util.Vector<ServiceHandle> serviceList = null;
+  public java.util.Vector<ServiceHandle> serviceList = null;
 
-  static private Vector<URL> getDiscoveryURLS()
+  private Vector<URL> getDiscoveryURLS()
   {
     Vector<URL> urls = new Vector<>();
     String RootServiceURLs = Cache.getDefault("DISCOVERY_URLS",
@@ -151,7 +166,7 @@ public class Discoverer implements Runnable
         } catch (Exception ex)
         {
           Console.warn("Problem whilst trying to make a URL from '"
-                          + ((url != null) ? url : "<null>") + "'");
+                  + ((url != null) ? url : "<null>") + "'");
           Console.warn(
                   "This was probably due to a malformed comma separated list"
                           + " in the DISCOVERY_URLS entry of $(HOME)/.jalview_properties)");
@@ -176,9 +191,16 @@ public class Discoverer implements Runnable
    */
   static public void doDiscovery()
   {
-    Console.debug("(Re)-Initialising the discovery URL list.");
+    getInstance().discovery();
+  }
+
+  private void discovery()
+  {
+    Console
+            .debug("(Re)-Initialising the discovery URL list.");
     try
     {
+      Discoverer d = getInstance();
       reallyDiscoverServices = Cache
               .getDefault("DISCOVERY_START", false);
       if (reallyDiscoverServices)
@@ -245,9 +267,9 @@ 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)
         {
-          JvOptionPane.showMessageDialog(jalview.gui.Desktop.desktop,
+          JvOptionPane.showMessageDialog(jalview.gui.Desktop.getDesktopPane(),
                   MessageManager.getString("label.set_proxy_settings"),
                   MessageManager
                           .getString("label.proxy_authorization_failed"),
@@ -283,7 +305,7 @@ public class Discoverer implements Runnable
    *          Hashtable
    * @return boolean
    */
-  static private boolean buildServiceLists(ServiceHandle[] sh,
+  private boolean buildServiceLists(ServiceHandle[] sh,
           Vector<ServiceHandle> cat,
           Hashtable<String, Vector<ServiceHandle>> sscat)
   {
@@ -292,9 +314,9 @@ public class Discoverer implements Runnable
     {
       if (!cat.contains(sh[i]))
       {
-        Console.debug("A " + sh[i].getAbstractName()
-                + " service called " + sh[i].getName() + " exists at "
-                + sh[i].getEndpointURL() + "\n");
+        Console.debug("A " + sh[i].getAbstractName() + " service called "
+                + sh[i].getName() + " exists at " + sh[i].getEndpointURL()
+                + "\n");
         if (!sscat.containsKey(sh[i].getAbstractName()))
         {
           sscat.put(sh[i].getAbstractName(), cat = new Vector<>());
@@ -322,7 +344,7 @@ public class Discoverer implements Runnable
             } catch (Exception e)
             {
               Console.debug("Ignoring bad discovery service URL "
-                              + sh[i].getEndpointURL(), e);
+                      + sh[i].getEndpointURL(), e);
             }
           }
         }
@@ -352,8 +374,7 @@ public class Discoverer implements Runnable
       }
       else
       {
-        Console.warn("No services at "
-                + (ServiceURLList.get(s_url))
+        Console.warn("No services at " + (ServiceURLList.get(s_url))
                 + " - check DISCOVERY_URLS property in .jalview_properties");
       }
       s_url++;
@@ -376,26 +397,40 @@ public class Discoverer implements Runnable
   @Override
   public void run()
   {
-    final Discoverer discoverer = this;
-    Thread discoverThread = new Thread()
-    {
-      @Override
-      public void run()
-      {
-        Discoverer.doDiscovery();
-        discoverer.discoverServices();
-      }
-    };
-    discoverThread.start();
+    Console.info("Discovering jws1 services");
+    Discoverer.doDiscovery();
+    discoverServices();
   }
 
   /**
    * binding service abstract name to handler class
    */
-  private static Hashtable<String, WS1Client> serviceClientBindings;
+  private Hashtable<String, WS1Client> serviceClientBindings;
 
   public static WS1Client getServiceClient(ServiceHandle sh)
   {
+    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
+   * wsclient discovery 1. need a classpath property with list of additional
+   * plugin directories 2. optional config to cite specific bindings between
+   * class name and Abstract service name. 3. precedence for automatic discovery
+   * by using getAbstractName for WSClient - user added plugins override default
+   * plugins ? notes on wsclient gui code for gui attachment now moved to
+   * wsclient implementation. Needs more abstraction but approach seems to work.
+   * is it possible to 'generalise' the data retrieval calls further ? current
+   * methods are very specific (gatherForMSA or gatherForSeqOrMsaSecStrPred),
+   * new methods for conservation (group or alignment), treecalc (aligned
+   * profile), seqannot (sequences selected from dataset, annotation back to
+   * dataset).
+   * 
+   */
+
+  private WS1Client getClient(ServiceHandle sh)
+  {
     if (serviceClientBindings == null)
     {
       // get a list from Config or create below
@@ -418,20 +453,8 @@ public class Discoverer implements Runnable
     }
     return instance;
   }
-  /**
-   * 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
-   * wsclient discovery 1. need a classpath property with list of additional
-   * plugin directories 2. optional config to cite specific bindings between
-   * class name and Abstract service name. 3. precedence for automatic discovery
-   * by using getAbstractName for WSClient - user added plugins override default
-   * plugins ? notes on wsclient gui code for gui attachment now moved to
-   * wsclient implementation. Needs more abstraction but approach seems to work.
-   * is it possible to 'generalise' the data retrieval calls further ? current
-   * methods are very specific (gatherForMSA or gatherForSeqOrMsaSecStrPred),
-   * new methods for conservation (group or alignment), treecalc (aligned
-   * profile), seqannot (sequences selected from dataset, annotation back to
-   * dataset).
-   * 
-   */
+  public static Hashtable<String, Vector<ServiceHandle>> getServices()
+  {
+    return getInstance().services;
+  }
 }