X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;f=src%2Fjalview%2Fext%2Fensembl%2FEnsemblXref.java;h=9b58e58cd341d3154e47959862ce38fc807043ab;hb=7d602d0e4b439e56af3e4551ed71f181a8025534;hp=6a4f369def30e72345fc5fe2a77e86ec7fedfeb0;hpb=a9f0472fe6fd4737b47d7955d198e76923e6aabc;p=jalview.git diff --git a/src/jalview/ext/ensembl/EnsemblXref.java b/src/jalview/ext/ensembl/EnsemblXref.java index 6a4f369..9b58e58 100644 --- a/src/jalview/ext/ensembl/EnsemblXref.java +++ b/src/jalview/ext/ensembl/EnsemblXref.java @@ -1,29 +1,70 @@ +/* + * Jalview - A Sequence Alignment Editor and Viewer ($$Version-Rel$$) + * Copyright (C) $$Year-Rel$$ The Jalview Authors + * + * This file is part of Jalview. + * + * Jalview is free software: you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 + * of the License, or (at your option) any later version. + * + * Jalview is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty + * of MERCHANTABILITY or FITNESS FOR A PARTICULAR + * PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Jalview. If not, see . + * The Jalview Authors are detailed in the 'AUTHORS' file. + */ package jalview.ext.ensembl; -import jalview.datamodel.AlignmentI; -import jalview.datamodel.DBRefEntry; -import jalview.util.DBRefUtils; - -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 java.util.Map; -import org.json.simple.JSONArray; -import org.json.simple.JSONObject; -import org.json.simple.parser.JSONParser; import org.json.simple.parser.ParseException; -public class EnsemblXref extends EnsemblRestClient +import jalview.datamodel.AlignmentI; +import jalview.datamodel.DBRefEntry; +import jalview.util.DBRefUtils; + +/** + * A class to fetch cross-references from Ensembl by calling the /xrefs REST + * service + * + * @author gmcarstairs + * @see http://rest.ensembl.org/documentation/info/xref_id + */ +class EnsemblXref extends EnsemblRestClient { + private static final String GO_GENE_ONTOLOGY = "GO"; + + private String dbName = "ENSEMBL (xref)"; + + /** + * Constructor given the target domain to fetch data from + * + * @param d + */ + public EnsemblXref(String d, String dbSource, String version) + { + super(d); + dbName = dbSource; + xrefVersion = dbSource + ":" + version; + + } + @Override public String getDbName() { - return "ENSEMBL (xref)"; + return dbName; } @Override @@ -35,8 +76,7 @@ public class EnsemblXref extends EnsemblRestClient @Override protected URL getUrl(List ids) throws MalformedURLException { - // TODO Auto-generated method stub - return null; + return getUrl(ids.get(0)); } @Override @@ -45,114 +85,88 @@ public class EnsemblXref extends EnsemblRestClient return true; } - @Override - protected String getRequestMimeType(boolean multipleIds) - { - return "application/json"; - } - - @Override - protected String getResponseMimeType() - { - return "application/json"; - } - /** * Calls the Ensembl xrefs REST endpoint and retrieves any cross-references * ("primary_id") for the given identifier (Ensembl accession id) and database - * name. The "dbname" returned by Ensembl is canonicalised to Jalview's - * standard version, and a DBRefEntry constructed. + * names. The "dbname" returned by Ensembl is canonicalised to Jalview's + * standard version, and a DBRefEntry constructed. Currently takes all + * identifiers apart from GO terms and synonyms. * * @param identifier - * @param database + * an Ensembl stable identifier * @return */ - public List getCrossReferences(String identifier, - String... database) + @SuppressWarnings("unchecked") + public List getCrossReferences(String identifier) { - List result = new ArrayList(); - List ids = new ArrayList(); + List result = new ArrayList<>(); + List ids = new ArrayList<>(); ids.add(identifier); - BufferedReader br = null; try { - for (String db : database) + Iterator rvals = (Iterator) getJSON(getUrl(identifier), ids, -1, MODE_ITERATOR, null); + while (rvals.hasNext()) { - URL url = getUrl(identifier, db); - if (url != null) - { - br = getHttpResponse(url, ids); - } - for (DBRefEntry xref : parseResponse(br)) + Map val = (Map) rvals.next(); + String db = val.get("dbname").toString(); + String id = val.get("primary_id").toString(); + if (db != null && id != null + && !GO_GENE_ONTOLOGY.equals(db)) { - if (!result.contains(xref)) - { - result.add(xref); - } + db = DBRefUtils.getCanonicalName(db); + DBRefEntry dbref = new DBRefEntry(db, getXRefVersion(), id); + result.add(dbref); } - br.close(); } - } catch (IOException e) + } catch (ParseException | IOException e) { // ignore - } finally - { - if (br != null) - { - try - { - br.close(); - } catch (IOException e) - { - // ignore - } - } } - return result; } +// /** +// * Parses "primary_id" and "dbname" values from the JSON response and +// * constructs a DBRefEntry. Returns a list of the DBRefEntry created. Note we +// * don't parse "synonyms" as they appear to be either redirected or obsolete +// * in Uniprot. +// * +// * @param br +// * @return +// * @throws IOException +// */ +// @SuppressWarnings("unchecked") +//protected List parseResponse(BufferedReader br) +// throws IOException +// { +// return result; +// } +// + private String xrefVersion = "ENSEMBL:0"; + /** - * Parses "primary_id" and "dbname" values from the JSON response and returns - * a list of DBRefEntry constructed. + * version string for Xrefs - for 2.10, hardwired for ENSEMBL:0 * - * @param br * @return - * @throws IOException */ - protected List parseResponse(BufferedReader br) - throws IOException + public String getXRefVersion() { - JSONParser jp = new JSONParser(); - List result = new ArrayList(); - try - { - JSONArray responses = (JSONArray) jp.parse(br); - Iterator rvals = responses.iterator(); - while (rvals.hasNext()) - { - JSONObject val = (JSONObject) rvals.next(); - String dbName = val.get("dbname").toString(); - String id = val.get("primary_id").toString(); - if (dbName != null && id != null) - { - dbName = DBRefUtils.getCanonicalName(dbName); - DBRefEntry dbref = new DBRefEntry(dbName, "0", id); - result.add(dbref); - } - } - } catch (ParseException e) - { - // ignore - } - return result; + return xrefVersion; } - protected URL getUrl(String identifier, String db) + /** + * Returns the URL for the REST endpoint to fetch all cross-references for an + * identifier. Note this may return protein cross-references for nucleotide. + * Filter the returned list as required. + * + * @param identifier + * @return + */ + protected URL getUrl(String identifier) { - String url = ENSEMBL_REST + "/xrefs/id/" + identifier - + "?content-type=application/json&external_db=" + db; + String url = getDomain() + "/xrefs/id/" + identifier + + CONTENT_TYPE_JSON + "&all_levels=1"; try { return new URL(url);