X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;f=src%2Fjalview%2Fext%2Fensembl%2FEnsemblMap.java;h=e1f5182f6f379b9bce13b74411387b27bfcaaebf;hb=a3f65dbb5ba8bd470a31ba2af72db6d8ddf60546;hp=56657e0578c517e8c02717e1d57060a77a557f70;hpb=fc32753ee08e5f178cf3e5a5f223e21337fe6827;p=jalview.git
diff --git a/src/jalview/ext/ensembl/EnsemblMap.java b/src/jalview/ext/ensembl/EnsemblMap.java
index 56657e0..e1f5182 100644
--- a/src/jalview/ext/ensembl/EnsemblMap.java
+++ b/src/jalview/ext/ensembl/EnsemblMap.java
@@ -1,11 +1,32 @@
+/*
+ * 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.DBRefSource;
import jalview.datamodel.GeneLociI;
+import jalview.datamodel.GeneLocus;
+import jalview.datamodel.Mapping;
import jalview.util.MapList;
-import java.io.BufferedReader;
import java.io.IOException;
import java.net.MalformedURLException;
import java.net.URL;
@@ -13,12 +34,22 @@ import java.util.ArrayList;
import java.util.Collections;
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;
+/**
+ * A client for the Ensembl REST service /map endpoint, to convert from
+ * coordinates of one genome assembly to another.
+ *
+ * Note that species and assembly identifiers passed to this class must be valid
+ * in Ensembl. They are not case sensitive.
+ *
+ * @author gmcarstairs
+ * @see https://rest.ensembl.org/documentation/info/assembly_map
+ * @see https://rest.ensembl.org/info/assembly/human?content-type=text/xml
+ * @see https://rest.ensembl.org/info/species?content-type=text/xml
+ */
public class EnsemblMap extends EnsemblRestClient
{
private static final String MAPPED = "mapped";
@@ -73,8 +104,8 @@ public class EnsemblMap extends EnsemblRestClient
* @return
* @throws MalformedURLException
*/
- protected URL getAssemblyMapUrl(String species, String chromosome, String fromRef,
- String toRef, int startPos, int endPos)
+ protected URL getAssemblyMapUrl(String species, String chromosome,
+ String fromRef, String toRef, int startPos, int endPos)
throws MalformedURLException
{
/*
@@ -98,18 +129,6 @@ public class EnsemblMap extends EnsemblRestClient
}
@Override
- protected String getRequestMimeType(boolean multipleIds)
- {
- return "application/json";
- }
-
- @Override
- protected String getResponseMimeType()
- {
- return "application/json";
- }
-
- @Override
protected URL getUrl(List ids) throws MalformedURLException
{
return null; // not used
@@ -131,30 +150,16 @@ public class EnsemblMap extends EnsemblRestClient
String fromRef, String toRef, int[] queryRange)
{
URL url = null;
- BufferedReader br = null;
-
try
{
- url = getAssemblyMapUrl(species, chromosome, fromRef, toRef, queryRange[0],
- queryRange[1]);
- br = getHttpResponse(url, null);
- return (parseAssemblyMappingResponse(br));
+ url = getAssemblyMapUrl(species, chromosome, fromRef, toRef,
+ queryRange[0], queryRange[1]);
+ return (parseAssemblyMappingResponse(url));
} catch (Throwable t)
{
- System.out.println("Error calling " + url + ": " + t.getMessage());
+ jalview.bin.Console
+ .outPrintln("Error calling " + url + ": " + t.getMessage());
return null;
- } finally
- {
- if (br != null)
- {
- try
- {
- br.close();
- } catch (IOException e)
- {
- // ignore
- }
- }
}
}
@@ -173,22 +178,24 @@ public class EnsemblMap extends EnsemblRestClient
* @param br
* @return
*/
- protected int[] parseAssemblyMappingResponse(BufferedReader br)
+ @SuppressWarnings("unchecked")
+ protected int[] parseAssemblyMappingResponse(URL url)
{
int[] result = null;
- JSONParser jp = new JSONParser();
try
{
- JSONObject parsed = (JSONObject) jp.parse(br);
- JSONArray mappings = (JSONArray) parsed.get(MAPPINGS);
-
- Iterator rvals = mappings.iterator();
+ Iterator rvals = (Iterator) getJSON(url, null, -1,
+ MODE_ITERATOR, MAPPINGS);
+ if (rvals == null)
+ {
+ return null;
+ }
while (rvals.hasNext())
{
// todo check for "mapped"
- JSONObject val = (JSONObject) rvals.next();
- JSONObject mapped = (JSONObject) val.get(MAPPED);
+ Map val = (Map) rvals.next();
+ Map mapped = (Map) val.get(MAPPED);
int start = Integer.parseInt(mapped.get("start").toString());
int end = Integer.parseInt(mapped.get("end").toString());
String strand = mapped.get("strand").toString();
@@ -248,34 +255,20 @@ public class EnsemblMap extends EnsemblRestClient
int end, String cdsOrCdna)
{
URL url = null;
- BufferedReader br = null;
-
try
{
String domain = new EnsemblInfo().getDomain(division);
if (domain != null)
{
url = getIdMapUrl(domain, accession, start, end, cdsOrCdna);
- br = getHttpResponse(url, null);
- return (parseIdMappingResponse(br, accession, domain));
+ return (parseIdMappingResponse(url, accession, domain));
}
return null;
} catch (Throwable t)
{
- System.out.println("Error calling " + url + ": " + t.getMessage());
+ jalview.bin.Console
+ .outPrintln("Error calling " + url + ": " + t.getMessage());
return null;
- } finally
- {
- if (br != null)
- {
- try
- {
- br.close();
- } catch (IOException e)
- {
- // ignore
- }
- }
}
}
@@ -295,9 +288,9 @@ public class EnsemblMap extends EnsemblRestClient
URL getIdMapUrl(String domain, String accession, int start, int end,
String cdsOrCdna) throws MalformedURLException
{
- String url = String
- .format("%s/map/%s/%s/%d..%d?include_original_region=1&content-type=application/json",
- domain, cdsOrCdna, accession, start, end);
+ String url = String.format(
+ "%s/map/%s/%s/%d..%d?include_original_region=1&content-type=application/json",
+ domain, cdsOrCdna, accession, start, end);
return new URL(url);
}
@@ -321,17 +314,18 @@ public class EnsemblMap extends EnsemblRestClient
* @param domain
* @return
*/
- GeneLociI parseIdMappingResponse(BufferedReader br, String accession,
- String domain)
+ @SuppressWarnings("unchecked")
+ GeneLociI parseIdMappingResponse(URL url, String accession, String domain)
{
- JSONParser jp = new JSONParser();
try
{
- JSONObject parsed = (JSONObject) jp.parse(br);
- JSONArray mappings = (JSONArray) parsed.get(MAPPINGS);
-
- Iterator rvals = mappings.iterator();
+ Iterator rvals = (Iterator) getJSON(url, null, -1,
+ MODE_ITERATOR, MAPPINGS);
+ if (rvals == null)
+ {
+ return null;
+ }
String assembly = null;
String chromosome = null;
int fromEnd = 0;
@@ -339,26 +333,27 @@ public class EnsemblMap extends EnsemblRestClient
while (rvals.hasNext())
{
- JSONObject val = (JSONObject) rvals.next();
- JSONObject original = (JSONObject) val.get("original");
+ Map val = (Map) rvals.next();
+ Map original = (Map) val
+ .get("original");
fromEnd = Integer.parseInt(original.get("end").toString());
- JSONObject mapped = (JSONObject) val.get(MAPPED);
+ Map mapped = (Map) val.get(MAPPED);
int start = Integer.parseInt(mapped.get("start").toString());
int end = Integer.parseInt(mapped.get("end").toString());
String ass = mapped.get("assembly_name").toString();
if (assembly != null && !assembly.equals(ass))
{
- System.err
- .println("EnsemblMap found multiple assemblies - can't resolve");
+ jalview.bin.Console.errPrintln(
+ "EnsemblMap found multiple assemblies - can't resolve");
return null;
}
assembly = ass;
String chr = mapped.get("seq_region_name").toString();
if (chromosome != null && !chromosome.equals(chr))
{
- System.err
- .println("EnsemblMap found multiple chromosomes - can't resolve");
+ jalview.bin.Console.errPrintln(
+ "EnsemblMap found multiple chromosomes - can't resolve");
return null;
}
chromosome = chr;
@@ -381,36 +376,12 @@ public class EnsemblMap extends EnsemblRestClient
.getSpecies(accession);
final String as = assembly;
final String chr = chromosome;
- List fromRange = Collections.singletonList(new int[] { 1,
- fromEnd });
- final MapList map = new MapList(fromRange, regions, 1, 1);
- return new GeneLociI()
- {
-
- @Override
- public String getSpeciesId()
- {
- return species == null ? "" : species;
- }
-
- @Override
- public String getAssemblyId()
- {
- return as;
- }
-
- @Override
- public String getChromosomeId()
- {
- return chr;
- }
-
- @Override
- public MapList getMap()
- {
- return map;
- }
- };
+ List fromRange = Collections
+ .singletonList(new int[]
+ { 1, fromEnd });
+ Mapping mapping = new Mapping(new MapList(fromRange, regions, 1, 1));
+ return new GeneLocus(species == null ? "" : species, as, chr,
+ mapping);
} catch (IOException | ParseException | NumberFormatException e)
{
// ignore