package jalview.ext.ensembl; import java.io.BufferedReader; import java.io.IOException; import java.net.MalformedURLException; import java.net.URL; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import org.json.simple.JSONArray; import org.json.simple.JSONObject; import org.json.simple.parser.JSONParser; import org.json.simple.parser.ParseException; /** * A client for the Ensembl xrefs/symbol REST service; * * @see http://rest.ensembl.org/documentation/info/xref_external * @author gmcarstairs * */ public class EnsemblSymbol extends EnsemblXref { /** * Constructor given the target domain to fetch data from * * @param d */ public EnsemblSymbol(String d) { super(d); } /** * Returns the first "id" value in gene identifier format from the JSON * response, or null if none found * * @param br * @return * @throws IOException */ protected String parseResponse(BufferedReader br) throws IOException { JSONParser jp = new JSONParser(); String result = null; try { JSONArray responses = (JSONArray) jp.parse(br); Iterator rvals = responses.iterator(); while (rvals.hasNext()) { JSONObject val = (JSONObject) rvals.next(); String id = val.get("id").toString(); if (id != null && isGeneIdentifier(id)) { result = id; break; } } } catch (ParseException e) { // ignore } return result; } protected URL getUrl(String id, Species species) { String url = getDomain() + "/xrefs/symbol/" + species.toString() + "/" + id + "?content-type=application/json"; try { return new URL(url); } catch (MalformedURLException e) { return null; } } /** * Calls the Ensembl xrefs REST 'symbol' endpoint and retrieves any gene ids * for the given identifier, for any known model organisms * * @param identifier * @return */ public List getIds(String identifier) { List result = new ArrayList(); List ids = new ArrayList(); ids.add(identifier); String[] queries = identifier.split(getAccessionSeparator()); BufferedReader br = null; try { for (String query : queries) { for (Species taxon : Species.values()) { if (taxon.isModelOrganism()) { URL url = getUrl(query, taxon); if (url != null) { br = getHttpResponse(url, ids); } String geneId = parseResponse(br); if (geneId != null) { result.add(geneId); } } } } } catch (IOException e) { // ignore } finally { if (br != null) { try { br.close(); } catch (IOException e) { // ignore } } } return result; } }