d522ea8880aea6facf2f4515eba97d28f2c53ede
[jalview.git] / src / jalview / ext / ensembl / EnsemblMap.java
1 package jalview.ext.ensembl;
2
3 import jalview.datamodel.AlignmentI;
4 import jalview.datamodel.DBRefSource;
5
6 import java.io.BufferedReader;
7 import java.io.IOException;
8 import java.net.MalformedURLException;
9 import java.net.URL;
10 import java.util.Iterator;
11 import java.util.List;
12
13 import org.json.simple.JSONArray;
14 import org.json.simple.JSONObject;
15 import org.json.simple.parser.JSONParser;
16 import org.json.simple.parser.ParseException;
17
18 public class EnsemblMap extends EnsemblRestClient
19 {
20
21   /**
22    * Default constructor (to use rest.ensembl.org)
23    */
24   public EnsemblMap()
25   {
26     super();
27   }
28
29   /**
30    * Constructor given the target domain to fetch data from
31    * 
32    * @param
33    */
34   public EnsemblMap(String domain)
35   {
36     super(domain);
37   }
38
39   @Override
40   public String getDbName()
41   {
42     return DBRefSource.ENSEMBL;
43   }
44
45   @Override
46   public AlignmentI getSequenceRecords(String queries) throws Exception
47   {
48     return null; // not used
49   }
50
51   protected URL getUrl(String species, String chromosome, String fromRef,
52           String toRef, int startPos, int endPos)
53           throws MalformedURLException
54   {
55     String url = getDomain() + "/map/" + species + "/" + fromRef + "/"
56             + chromosome + ":" + startPos + ".." + endPos + ":1/" + toRef
57             + "?content-type=application/json";
58     try
59     {
60       return new URL(url);
61     } catch (MalformedURLException e)
62     {
63       return null;
64     }
65   }
66
67   @Override
68   protected boolean useGetRequest()
69   {
70     return true;
71   }
72
73   @Override
74   protected String getRequestMimeType(boolean multipleIds)
75   {
76     return "application/json";
77   }
78
79   @Override
80   protected String getResponseMimeType()
81   {
82     return "application/json";
83   }
84
85   @Override
86   protected URL getUrl(List<String> ids) throws MalformedURLException
87   {
88     return null; // not used
89   }
90
91   public int[] getMapping(String species, String chromosome,
92           String fromRef, String toRef, int[] queryRange)
93   {
94     URL url = null;
95     BufferedReader br = null;
96
97     try
98     {
99       url = getUrl(species, chromosome, fromRef, toRef, queryRange[0],
100               queryRange[1]);
101       br = getHttpResponse(url, null);
102       return (parseResponse(br));
103     } catch (Throwable t)
104     {
105       System.out.println("Error calling " + url + ": " + t.getMessage());
106       return null;
107     }
108   }
109
110   /**
111    * Parses the JSON response from the /map REST service. The format is (with
112    * some fields omitted)
113    * 
114    * <pre>
115    *  {"mappings": 
116    *    [{
117    *       "original": {"end":45109016,"start":45051610},
118    *       "mapped"  : {"end":43186384,"start":43128978} 
119    *  }] }
120    * </pre>
121    * 
122    * @param br
123    * @return
124    */
125   protected int[] parseResponse(BufferedReader br)
126   {
127     int[] result = null;
128     JSONParser jp = new JSONParser();
129
130     try
131     {
132       JSONObject parsed = (JSONObject) jp.parse(br);
133       JSONArray mappings = (JSONArray) parsed.get("mappings");
134
135       Iterator rvals = mappings.iterator();
136       while (rvals.hasNext())
137       {
138         // todo check for "mapped"
139         JSONObject val = (JSONObject) rvals.next();
140         JSONObject mapped = (JSONObject) val.get("mapped");
141         String start = mapped.get("start").toString();
142         String end = mapped.get("end").toString();
143         result = new int[] { Integer.parseInt(start), Integer.parseInt(end) };
144       }
145     } catch (IOException | ParseException | NumberFormatException e)
146     {
147       // ignore
148     }
149     return result;
150   }
151
152 }