package jalview.ext.ensembl; 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.HashMap; import java.util.Iterator; 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 { /* * cached results of REST /info/divisions service, currently *
   * { 
   *  { "ENSEMBLFUNGI", "http://rest.ensemblgenomes.org"},
   *    "ENSEMBLBACTERIA", "http://rest.ensemblgenomes.org"},
   *    "ENSEMBLPROTISTS", "http://rest.ensemblgenomes.org"},
   *    "ENSEMBLMETAZOA", "http://rest.ensemblgenomes.org"},
   *    "ENSEMBLPLANTS",  "http://rest.ensemblgenomes.org"},
   *    "ENSEMBL", "http://rest.ensembl.org" }
   *  }
   * 
* The values for EnsemblGenomes are retrieved by a REST call, that for * Ensembl is added programmatically for convenience of lookup */ private static Map divisions; @Override public String getDbName() { return "ENSEMBL"; } @Override public AlignmentI getSequenceRecords(String queries) throws Exception { return null; } @Override protected URL getUrl(List ids) throws MalformedURLException { return null; } @Override protected boolean useGetRequest() { 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 * recognised by Ensembl. * * @param division * @return */ public 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 } } /** * Constructs the URL for the EnsemblGenomes /info/divisions REST service * @param domain TODO * * @return * @throws MalformedURLException */ URL getDivisionsUrl(String domain) throws MalformedURLException { return new URL(domain + "/info/divisions?content-type=application/json"); } /** * Returns the set of 'divisions' recognised by Ensembl or EnsemblGenomes * * @return */ public Set getDivisions() { if (divisions == null) { fetchDivisions(); } return divisions.keySet(); } }