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;
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>
* 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()
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
* @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());
}
/**
*
* @return
*/
- public Set<String> getDivisions() {
- if (divisions == null)
- {
- fetchDivisions();
- }
-
- return divisions.keySet();
+ public static Set<String> getDivisions()
+ {
+ return getInstance().divisions.keySet();
}
}