40860d26ca8fd0183772f1a113e75ef568b6984e
[jalview.git] / src / jalview / ext / ensembl / EnsemblSymbol.java
1 /*
2  * Jalview - A Sequence Alignment Editor and Viewer ($$Version-Rel$$)
3  * Copyright (C) $$Year-Rel$$ The Jalview Authors
4  * 
5  * This file is part of Jalview.
6  * 
7  * Jalview is free software: you can redistribute it and/or
8  * modify it under the terms of the GNU General Public License 
9  * as published by the Free Software Foundation, either version 3
10  * of the License, or (at your option) any later version.
11  *  
12  * Jalview is distributed in the hope that it will be useful, but 
13  * WITHOUT ANY WARRANTY; without even the implied warranty 
14  * of MERCHANTABILITY or FITNESS FOR A PARTICULAR 
15  * PURPOSE.  See the GNU General Public License for more details.
16  * 
17  * You should have received a copy of the GNU General Public License
18  * along with Jalview.  If not, see <http://www.gnu.org/licenses/>.
19  * The Jalview Authors are detailed in the 'AUTHORS' file.
20  */
21 package jalview.ext.ensembl;
22
23 import java.io.BufferedReader;
24 import java.io.IOException;
25 import java.net.MalformedURLException;
26 import java.net.URL;
27 import java.util.ArrayList;
28 import java.util.Iterator;
29 import java.util.List;
30
31 import org.json.simple.JSONArray;
32 import org.json.simple.JSONObject;
33 import org.json.simple.parser.JSONParser;
34 import org.json.simple.parser.ParseException;
35
36 /**
37  * A client for the Ensembl xrefs/symbol REST service;
38  * 
39  * @see http://rest.ensembl.org/documentation/info/xref_external
40  * @author gmcarstairs
41  *
42  */
43 public class EnsemblSymbol extends EnsemblXref
44 {
45   private static final String GENE = "gene";
46   private static final String TYPE = "type";
47
48   /**
49    * Constructor given the target domain to fetch data from
50    * 
51    * @param domain
52    * @param dbName
53    * @param dbVersion
54    */
55   public EnsemblSymbol(String dbName, String dbVersion)
56   {
57     super(dbName, dbVersion);
58   }
59
60   /**
61    * Returns the first "id" value in gene identifier format from the JSON
62    * response, or null if none found
63    * 
64    * @param br
65    * @return
66    * @throws IOException
67    */
68   protected String parseSymbolResponse(BufferedReader br) throws IOException
69   {
70     JSONParser jp = new JSONParser();
71     String result = null;
72     try
73     {
74       JSONArray responses = (JSONArray) jp.parse(br);
75       Iterator rvals = responses.iterator();
76       while (rvals.hasNext())
77       {
78         JSONObject val = (JSONObject) rvals.next();
79         String id = val.get(JSON_ID).toString();
80         String type = val.get(TYPE).toString();
81         if (id != null && GENE.equals(type))
82         {
83           result = id;
84           break;
85         }
86       }
87     } catch (ParseException e)
88     {
89       // ignore
90     }
91     return result;
92   }
93
94   /**
95    * Constructs the URL for the REST symbol endpoint
96    * 
97    * @param id
98    *          the accession id (Ensembl or external)
99    * @param species
100    *          a species name recognisable by Ensembl
101    * @param type
102    *          an optional type to filter the response (gene, transcript,
103    *          translation)
104    * @return
105    */
106   protected URL getUrl(String id, Species species, String... type)
107   {
108     StringBuilder sb = new StringBuilder();
109     sb.append(getDomain()).append("/xrefs/symbol/")
110             .append(species.toString()).append("/").append(id)
111             .append(CONTENT_TYPE_JSON);
112     for (String t : type)
113     {
114       sb.append("&object_type=").append(t);
115     }
116     try
117     {
118       String url = sb.toString();
119       return new URL(url);
120     } catch (MalformedURLException e)
121     {
122       return null;
123     }
124   }
125
126   /**
127    * Calls the Ensembl xrefs REST 'symbol' endpoint and retrieves any gene ids
128    * for the given identifier, for any known model organisms
129    * 
130    * @param identifier
131    * @return
132    */
133   public List<String> getGeneIds(String identifier)
134   {
135     List<String> result = new ArrayList<>();
136     List<String> ids = new ArrayList<>();
137     ids.add(identifier);
138
139     String[] queries = identifier.split(getAccessionSeparator());
140     BufferedReader br = null;
141     try
142     {
143       for (String query : queries)
144       {
145         for (Species taxon : Species.getModelOrganisms())
146         {
147           URL url = getUrl(query, taxon, GENE);
148           if (url != null)
149           {
150             br = getHttpResponse(url, ids);
151             if (br != null)
152             {
153               String geneId = parseSymbolResponse(br);
154               if (geneId != null && !result.contains(geneId))
155               {
156                 result.add(geneId);
157               }
158             }
159           }
160         }
161       }
162     } catch (IOException e)
163     {
164       // ignore
165     } finally
166     {
167       if (br != null)
168       {
169         try
170         {
171           br.close();
172         } catch (IOException e)
173         {
174           // ignore
175         }
176       }
177     }
178     return result;
179   }
180
181 }