X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;f=src%2Fjalview%2Fext%2Fensembl%2FEnsemblSymbol.java;h=411a244f4c245a3fd0c2a908f0493a5e0cf5ae48;hb=916c073172d5e374f7375ec718420455472dfcb3;hp=0d7986466334b6c96e067713d8a7f1983e02eed5;hpb=604cbee405a837565ba1a74aa9bddd62aed685ab;p=jalview.git diff --git a/src/jalview/ext/ensembl/EnsemblSymbol.java b/src/jalview/ext/ensembl/EnsemblSymbol.java index 0d79864..411a244 100644 --- a/src/jalview/ext/ensembl/EnsemblSymbol.java +++ b/src/jalview/ext/ensembl/EnsemblSymbol.java @@ -25,6 +25,7 @@ import java.io.IOException; import java.net.MalformedURLException; import java.net.URL; import java.util.ArrayList; +import java.util.Collections; import java.util.Iterator; import java.util.List; @@ -42,6 +43,11 @@ import org.json.simple.parser.ParseException; */ public class EnsemblSymbol extends EnsemblXref { + private static final String COLON = ":"; + private static final String GENE = "gene"; + private static final String TYPE = "type"; + private static final String ID = "id"; + /** * Constructor given the target domain to fetch data from * @@ -62,8 +68,7 @@ public class EnsemblSymbol extends EnsemblXref * @return * @throws IOException */ - protected String parseSymbolResponse(BufferedReader br) - throws IOException + protected String parseSymbolResponse(BufferedReader br) throws IOException { JSONParser jp = new JSONParser(); String result = null; @@ -74,8 +79,9 @@ public class EnsemblSymbol extends EnsemblXref while (rvals.hasNext()) { JSONObject val = (JSONObject) rvals.next(); - String id = val.get("id").toString(); - if (id != null && isGeneIdentifier(id)) + String id = val.get(ID).toString(); + String type = val.get(TYPE).toString(); + if (id != null && GENE.equals(type)) { result = id; break; @@ -88,12 +94,30 @@ public class EnsemblSymbol extends EnsemblXref return result; } - protected URL getUrl(String id, Species species) + /** + * Constructs the URL for the REST symbol endpoint + * + * @param id + * the accession id (Ensembl or external) + * @param species + * a species name recognisable by Ensembl + * @param type + * an optional type to filter the response (gene, transcript, + * translation) + * @return + */ + protected URL getUrl(String id, String species, String... type) { - String url = getDomain() + "/xrefs/symbol/" + species.toString() + "/" - + id + "?content-type=application/json"; + StringBuilder sb = new StringBuilder(); + sb.append(getDomain()).append("/xrefs/symbol/").append(species) + .append("/").append(id).append(CONTENT_TYPE_JSON); + for (String t : type) + { + sb.append("&object_type=").append(t); + } try { + String url = sb.toString(); return new URL(url); } catch (MalformedURLException e) { @@ -102,41 +126,40 @@ public class EnsemblSymbol extends EnsemblXref } /** - * Calls the Ensembl xrefs REST 'symbol' endpoint and retrieves any gene ids - * for the given identifier, for any known model organisms + * Calls the Ensembl xrefs REST 'symbol' endpoint and retrieves gene id(s) for + * the given identifier. If the identifier has the format species:symbol then + * the gene id for the specified species is returned, else any matched gene ids + * for model organisms. If lookup fails, the returned list is empty. * * @param identifier * @return */ - public List getIds(String identifier) + public List getGeneIds(String identifier) { - List result = new ArrayList(); - List ids = new ArrayList(); - ids.add(identifier); + List result = new ArrayList<>(); + List ids = Collections. emptyList(); + List species = getSpecies(identifier); - String[] queries = identifier.split(getAccessionSeparator()); + String symbol = identifier.substring(identifier.indexOf(COLON) + 1); BufferedReader br = null; try { - for (String query : queries) - { - for (Species taxon : Species.values()) + for (String taxon : species) { - if (taxon.isModelOrganism()) + URL url = getUrl(symbol, taxon, GENE); + if (url != null) { - URL url = getUrl(query, taxon); - if (url != null) - { - br = getHttpResponse(url, ids); - } - String geneId = parseSymbolResponse(br); - if (geneId != null) + br = getHttpResponse(url, ids); + if (br != null) { - result.add(geneId); + String geneId = parseSymbolResponse(br); + if (geneId != null && !result.contains(geneId)) + { + result.add(geneId); + } } } } - } } catch (IOException e) { // ignore @@ -156,4 +179,27 @@ public class EnsemblSymbol extends EnsemblXref return result; } + /** + * Answers a list of species names which is + *
    + *
  • the species in the identifier if it is of the form species:symbol
  • + *
  • else a fixed list of 'model organism' species
  • + *
+ * + * @param identifier + * @return + */ + private List getSpecies(String identifier) + { + int pos = identifier.indexOf(COLON); + if (pos > 0) + { + return Collections.singletonList(identifier.substring(0, pos)); + } + else + { + return Species.getModelOrganisms(); + } + } + }