c7f6bb884c8b9feb12060e20981d05427efe5b9c
[jalview.git] / src / jalview / ws / ebi / EBIFetchClient.java
1 /*
2  * Jalview - A Sequence Alignment Editor and Viewer (Version 2.8)
3  * Copyright (C) 2012 J Procter, AM Waterhouse, LM Lui, J Engelhardt, G Barton, M Clamp, S Searle
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 of the License, or (at your option) any later version.
10  *  
11  * Jalview is distributed in the hope that it will be useful, but 
12  * WITHOUT ANY WARRANTY; without even the implied warranty 
13  * of MERCHANTABILITY or FITNESS FOR A PARTICULAR 
14  * PURPOSE.  See the GNU General Public License for more details.
15  * 
16  * You should have received a copy of the GNU General Public License along with Jalview.  If not, see <http://www.gnu.org/licenses/>.
17  */
18 package jalview.ws.ebi;\r
19 \r
20 import java.io.BufferedInputStream;\r
21 import java.io.BufferedReader;\r
22 import java.io.File;\r
23 import java.io.FileOutputStream;\r
24 import java.io.InputStreamReader;\r
25 import java.net.URL;\r
26 import java.util.ArrayList;\r
27 import java.util.StringTokenizer;\r
28 \r
29 /**\r
30  * DOCUMENT ME!\r
31  * \r
32  * @author $author$\r
33  * @version $Revision$\r
34  */\r
35 public class EBIFetchClient\r
36 {\r
37   String format = "default";\r
38 \r
39   String style = "raw";\r
40 \r
41   /**\r
42    * Creates a new EBIFetchClient object.\r
43    */\r
44   public EBIFetchClient()\r
45   {\r
46   }\r
47 \r
48   /**\r
49    * DOCUMENT ME!\r
50    * \r
51    * @return DOCUMENT ME!\r
52    */\r
53   public String[] getSupportedDBs()\r
54   {\r
55     // TODO - implement rest call for dbfetch getSupportedDBs\r
56     throw new Error("Not yet implemented");\r
57   }\r
58 \r
59   /**\r
60    * DOCUMENT ME!\r
61    * \r
62    * @return DOCUMENT ME!\r
63    */\r
64   public String[] getSupportedFormats()\r
65   {\r
66     // TODO - implement rest call for dbfetch getSupportedFormats\r
67     throw new Error("Not yet implemented");\r
68   }\r
69 \r
70   /**\r
71    * DOCUMENT ME!\r
72    * \r
73    * @return DOCUMENT ME!\r
74    */\r
75   public String[] getSupportedStyles()\r
76   {\r
77     // TODO - implement rest call for dbfetch getSupportedStyles\r
78     throw new Error("Not yet implemented");\r
79   }\r
80 \r
81   public File fetchDataAsFile(String ids, String f, String s)\r
82           throws OutOfMemoryError\r
83   {\r
84     File outFile = null;\r
85     try\r
86     {\r
87       outFile = File.createTempFile("jalview", ".xml");\r
88       outFile.deleteOnExit();\r
89       fetchData(ids, f, s, outFile);\r
90       if (outFile.length() == 0)\r
91       {\r
92         outFile.delete();\r
93         return null;\r
94       }\r
95     } catch (Exception ex)\r
96     {\r
97     }\r
98     return outFile;\r
99   }\r
100 \r
101   /**\r
102    * Single DB multiple record retrieval\r
103    * \r
104    * @param ids\r
105    *          db:query1;query2;query3\r
106    * @param f\r
107    *          raw/xml\r
108    * @param s\r
109    *          ?\r
110    * \r
111    * @return Raw string array result of query set\r
112    */\r
113   public String[] fetchData(String ids, String f, String s)\r
114           throws OutOfMemoryError\r
115   {\r
116     return fetchData(ids, f, s, null);\r
117   }\r
118 \r
119   public String[] fetchData(String ids, String f, String s, File outFile)\r
120           throws OutOfMemoryError\r
121   {\r
122     // Need to split\r
123     // ids of the form uniprot:25KD_SARPE;ADHR_DROPS;\r
124     String[] rslts = new String[0];\r
125     StringTokenizer queries = new StringTokenizer(ids, ";");\r
126     String db = null;\r
127     StringBuffer querystring = null;\r
128     int nq = 0;\r
129     while (queries.hasMoreTokens())\r
130     {\r
131       String query = queries.nextToken();\r
132       int p;\r
133       if ((p = query.indexOf(':')) > -1)\r
134       {\r
135         db = query.substring(0, p);\r
136         query = query.substring(p + 1);\r
137       }\r
138       if (querystring == null)\r
139       {\r
140         querystring = new StringBuffer(query);\r
141         nq++;\r
142       }\r
143       else\r
144       {\r
145         querystring.append("," + query);\r
146         nq++;\r
147       }\r
148     }\r
149     if (db == null)\r
150     {\r
151       System.err.println("Invalid Query string : '" + ids\r
152               + "'\nShould be of form 'dbname:q1;q2;q3;q4'");\r
153       return null;\r
154     }\r
155     String[] rslt = fetchBatch(querystring.toString(), db, f, s, outFile);\r
156     if (rslt != null)\r
157     {\r
158       String[] nrslts = new String[rslt.length + rslts.length];\r
159       System.arraycopy(rslts, 0, nrslts, 0, rslts.length);\r
160       System.arraycopy(rslt, 0, nrslts, rslts.length, rslt.length);\r
161       rslts = nrslts;\r
162     }\r
163 \r
164     return (rslts.length == 0 ? null : rslts);\r
165   }\r
166 \r
167   public String[] fetchBatch(String ids, String db, String f, String s,\r
168           File outFile) throws OutOfMemoryError\r
169   {\r
170     long time = System.currentTimeMillis();\r
171     // max 200 ids can be added at one time\r
172     try\r
173     {\r
174       URL rcall = new URL("http://www.ebi.ac.uk/Tools/dbfetch/dbfetch/"\r
175               + db.toLowerCase() + "/" + ids.toLowerCase()\r
176               + (f != null ? "/" + f : ""));\r
177 \r
178       BufferedInputStream is = new BufferedInputStream(rcall.openStream());\r
179       if (outFile != null)\r
180       {\r
181         FileOutputStream fio = new FileOutputStream(outFile);\r
182         byte[] bb = new byte[32 * 1024];\r
183         int l;\r
184         while ((l = is.read(bb)) > 0)\r
185         {\r
186           fio.write(bb, 0, l);\r
187         }\r
188         fio.close();\r
189         is.close();\r
190       }\r
191       else\r
192       {\r
193         BufferedReader br = new BufferedReader(new InputStreamReader(is));\r
194         String rtn;\r
195         ArrayList<String> arl = new ArrayList<String>();\r
196         while ((rtn = br.readLine()) != null)\r
197         {\r
198           arl.add(rtn);\r
199         }\r
200         return arl.toArray(new String[arl.size()]);\r
201       }\r
202     } catch (OutOfMemoryError er)\r
203     {\r
204 \r
205       System.out.println("OUT OF MEMORY DOWNLOADING QUERY FROM " + db\r
206               + ":\n" + ids);\r
207       throw er;\r
208     } catch (Exception ex)\r
209     {\r
210       if (ex.getMessage().startsWith(\r
211               "uk.ac.ebi.jdbfetch.exceptions.DbfNoEntryFoundException"))\r
212       {\r
213         return null;\r
214       }\r
215       System.err.println("Unexpected exception when retrieving from " + db\r
216               + "\nQuery was : '" + ids + "'");\r
217       ex.printStackTrace(System.err);\r
218       return null;\r
219     } finally\r
220     {\r
221       //System.err.println("Took " + (System.currentTimeMillis() - time)\r
222       //        / 1000 + " secs for one call.");\r
223     }\r
224     return null;\r
225   }\r
226 }\r
227