JAL-3210 Improvements to eclipse detection. New src tree and SwingJS updated from...
[jalview.git] / src / jalview / ext / ensembl / EnsemblInfo.java
index 37dff51..a59a64d 100644 (file)
@@ -1,9 +1,10 @@
 package jalview.ext.ensembl;
 
+import jalview.bin.ApplicationSingletonProvider;
+import jalview.bin.ApplicationSingletonProvider.ApplicationSingletonI;
 import jalview.datamodel.AlignmentI;
 import jalview.datamodel.DBRefSource;
 
-import java.io.BufferedReader;
 import java.io.IOException;
 import java.net.MalformedURLException;
 import java.net.URL;
@@ -13,13 +14,50 @@ import java.util.List;
 import java.util.Map;
 import java.util.Set;
 
-import org.json.simple.JSONArray;
-import org.json.simple.parser.JSONParser;
 import org.json.simple.parser.ParseException;
 
-public class EnsemblInfo extends EnsemblRestClient
+public class EnsemblInfo extends EnsemblRestClient implements ApplicationSingletonI
 {
 
+  /**
+   * On first request only, populate the lookup map by fetching the list of
+   * divisions known to EnsemblGenomes
+   * 
+   */
+  private static EnsemblInfo getInstance()
+  {
+    return (EnsemblInfo) ApplicationSingletonProvider.getInstance(EnsemblInfo.class);
+  }
+
+  private EnsemblInfo()
+  {
+    // use getInstance()
+
+    /*
+     * for convenience, pre-fill ensembl.org as the domain for "ENSEMBL"
+     */
+    divisions.put(DBRefSource.ENSEMBL.toUpperCase(), ensemblDomain);
+    try
+    {
+      @SuppressWarnings("unchecked")
+      Iterator<Object> rvals = (Iterator<Object>) getJSON(
+              getDivisionsUrl(ensemblGenomesDomain), null, -1,
+              MODE_ITERATOR, null);
+      if (rvals == null)
+      {
+        return;
+      }
+      while (rvals.hasNext())
+      {
+        String division = rvals.next().toString();
+        divisions.put(division.toUpperCase(), ensemblGenomesDomain);
+      }
+    } catch (IOException | ParseException | NumberFormatException e)
+    {
+      // ignore
+    }
+  }
+
   /*
    * cached results of REST /info/divisions service, currently
    * <pre>
@@ -35,7 +73,7 @@ public class EnsemblInfo extends EnsemblRestClient
    * The values for EnsemblGenomes are retrieved by a REST call, that for
    * Ensembl is added programmatically for convenience of lookup
    */
-  private static Map<String, String> divisions;
+  private Map<String, String> divisions = new HashMap<>();
 
   @Override
   public String getDbName()
@@ -61,18 +99,6 @@ public class EnsemblInfo extends EnsemblRestClient
     return true;
   }
 
-  @Override
-  protected String getRequestMimeType(boolean multipleIds)
-  {
-    return "application/json";
-  }
-
-  @Override
-  protected String getResponseMimeType()
-  {
-    return "application/json";
-  }
-
   /**
    * Answers the domain (http://rest.ensembl.org or
    * http://rest.ensemblgenomes.org) for the given division, or null if not
@@ -81,79 +107,9 @@ public class EnsemblInfo extends EnsemblRestClient
    * @param division
    * @return
    */
-  public String getDomain(String division)
+  public static String getDomain(String division)
   {
-    if (divisions == null)
-    {
-      fetchDivisions();
-    }
-    return divisions.get(division.toUpperCase());
-  }
-
-  /**
-   * On first request only, populate the lookup map by fetching the list of
-   * divisions known to EnsemblGenomes.
-   */
-  void fetchDivisions()
-  {
-    divisions = new HashMap<>();
-
-    /*
-     * for convenience, pre-fill ensembl.org as the domain for "ENSEMBL"
-     */
-    divisions.put(DBRefSource.ENSEMBL.toUpperCase(), ensemblDomain);
-
-    BufferedReader br = null;
-    try
-    {
-      URL url = getDivisionsUrl(ensemblGenomesDomain);
-      if (url != null)
-      {
-        br = getHttpResponse(url, null);
-      }
-      parseResponse(br, ensemblGenomesDomain);
-    } catch (IOException e)
-    {
-      // ignore
-    } finally
-    {
-      if (br != null)
-      {
-        try
-        {
-          br.close();
-        } catch (IOException e)
-        {
-          // ignore
-        }
-      }
-    }
-  }
-
-  /**
-   * Parses the JSON response to /info/divisions, and add each to the lookup map
-   * 
-   * @param br
-   * @param domain
-   */
-  void parseResponse(BufferedReader br, String domain)
-  {
-    JSONParser jp = new JSONParser();
-
-    try
-    {
-      JSONArray parsed = (JSONArray) jp.parse(br);
-
-      Iterator rvals = parsed.iterator();
-      while (rvals.hasNext())
-      {
-        String division = rvals.next().toString();
-        divisions.put(division.toUpperCase(), domain);
-      }
-    } catch (IOException | ParseException | NumberFormatException e)
-    {
-      // ignore
-    }
+    return getInstance().divisions.get(division.toUpperCase());
   }
 
   /**
@@ -174,12 +130,8 @@ public class EnsemblInfo extends EnsemblRestClient
    * 
    * @return
    */
-  public Set<String> getDivisions() {
-    if (divisions == null)
-    {
-      fetchDivisions();
-    }
-
-    return divisions.keySet();
+  public static Set<String> getDivisions()
+  {
+    return getInstance().divisions.keySet();
   }
 }