pass OutOfMemory errors upstream from EBI fetch client
[jalview.git] / src / jalview / ws / ebi / EBIFetchClient.java
1 /*\r
2  * Jalview - A Sequence Alignment Editor and Viewer (Version 2.4)\r
3  * Copyright (C) 2008 AM Waterhouse, J Procter, G Barton, M Clamp, S Searle\r
4  * \r
5  * This program is free software; you can redistribute it and/or\r
6  * modify it under the terms of the GNU General Public License\r
7  * as published by the Free Software Foundation; either version 2\r
8  * of the License, or (at your option) any later version.\r
9  * \r
10  * This program is distributed in the hope that it will be useful,\r
11  * but WITHOUT ANY WARRANTY; without even the implied warranty of\r
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r
13  * GNU General Public License for more details.\r
14  * \r
15  * You should have received a copy of the GNU General Public License\r
16  * along with this program; if not, write to the Free Software\r
17  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA\r
18  */\r
19 package jalview.ws.ebi;\r
20 \r
21 import java.io.*;\r
22 import java.util.*;\r
23 import javax.xml.namespace.*;\r
24 import javax.xml.rpc.*;\r
25 \r
26 import org.apache.axis.client.Call;\r
27 import org.apache.axis.client.Service;\r
28 import org.apache.axis.encoding.*;\r
29 \r
30 /**\r
31  * DOCUMENT ME!\r
32  *\r
33  * @author $author$\r
34  * @version $Revision$\r
35  */\r
36 public class EBIFetchClient\r
37 {\r
38   Call call;\r
39   String format = "default";\r
40   String style = "raw";\r
41 \r
42   /**\r
43    * Creates a new EBIFetchClient object.\r
44    */\r
45   public EBIFetchClient()\r
46   {\r
47     try\r
48     {\r
49       call = (Call)new Service().createCall();\r
50       call.setTargetEndpointAddress(new java.net.URL(\r
51           "http://www.ebi.ac.uk/ws/services/Dbfetch"));\r
52     }\r
53     catch (Exception ex)\r
54     {\r
55     }\r
56   }\r
57 \r
58   /**\r
59    * DOCUMENT ME!\r
60    *\r
61    * @return DOCUMENT ME!\r
62    */\r
63   public String[] getSupportedDBs()\r
64   {\r
65     try\r
66     {\r
67       call.setOperationName(new QName("urn:Dbfetch", "getSupportedDBs"));\r
68       call.setReturnType(XMLType.SOAP_ARRAY);\r
69 \r
70       return (String[]) call.invoke(new Object[]\r
71                                     {});\r
72     }\r
73     catch (Exception ex)\r
74     {\r
75       return null;\r
76     }\r
77   }\r
78 \r
79   /**\r
80    * DOCUMENT ME!\r
81    *\r
82    * @return DOCUMENT ME!\r
83    */\r
84   public String[] getSupportedFormats()\r
85   {\r
86     try\r
87     {\r
88       call.setOperationName(new QName("urn:Dbfetch", "getSupportedFormats"));\r
89       call.setReturnType(XMLType.SOAP_ARRAY);\r
90 \r
91       return (String[]) call.invoke(new Object[]\r
92                                     {});\r
93     }\r
94     catch (Exception ex)\r
95     {\r
96       return null;\r
97     }\r
98   }\r
99 \r
100   /**\r
101    * DOCUMENT ME!\r
102    *\r
103    * @return DOCUMENT ME!\r
104    */\r
105   public String[] getSupportedStyles()\r
106   {\r
107     try\r
108     {\r
109       call.setOperationName(new QName("urn:Dbfetch", "getSupportedStyles"));\r
110       call.setReturnType(XMLType.SOAP_ARRAY);\r
111 \r
112       return (String[]) call.invoke(new Object[]\r
113                                     {});\r
114     }\r
115     catch (Exception ex)\r
116     {\r
117       return null;\r
118     }\r
119   }\r
120 \r
121 \r
122   public File fetchDataAsFile(String ids, String f, String s) throws OutOfMemoryError\r
123   {\r
124     String[] data = fetchData(ids, f, s);\r
125     // TODO: after JV 2.4 - test data==null and pass error(s) back up if possible (OutOfMemoryErrors are usual problem)\r
126     File outFile = null;\r
127     try\r
128     {\r
129       outFile = File.createTempFile("jalview", ".xml");\r
130       outFile.deleteOnExit();\r
131       PrintWriter out = new PrintWriter(new FileOutputStream(outFile));\r
132       int index = 0;\r
133       while (index < data.length)\r
134       {\r
135         out.println(data[index]);\r
136         index++;\r
137       }\r
138       out.close();\r
139     }\r
140     catch (Exception ex)\r
141     {}\r
142     return outFile;\r
143   }\r
144 \r
145   /**\r
146    * Single DB multiple record retrieval\r
147    *\r
148    * @param ids db:query1;query2;query3\r
149    * @param f raw/xml\r
150    * @param s ?\r
151    *\r
152    * @return Raw string array result of query set\r
153    */\r
154   public String[] fetchData(String ids, String f, String s) throws OutOfMemoryError\r
155   {\r
156     // Need to split\r
157     // ids of the form uniprot:25KD_SARPE;ADHR_DROPS;\r
158     StringTokenizer queries = new StringTokenizer(ids, ";");\r
159     String db = null;\r
160     StringBuffer querystring = null;\r
161     while (queries.hasMoreTokens())\r
162     {\r
163       String query = queries.nextToken();\r
164       int p;\r
165       if ( (p = query.indexOf(':')) > -1)\r
166       {\r
167         db = query.substring(0, p);\r
168         query = query.substring(p + 1);\r
169       }\r
170       if (querystring == null)\r
171       {\r
172         querystring = new StringBuffer(query);\r
173       }\r
174       else\r
175       {\r
176         querystring.append("," + query);\r
177       }\r
178     }\r
179     if (db == null)\r
180     {\r
181       System.err.println("Invalid Query string : '" + ids +\r
182                          "'\nShould be of form 'dbname:q1;q2;q3;q4'");\r
183     }\r
184     return fetchBatch(querystring.toString(), db, f, s);\r
185   }\r
186 \r
187   public String[] fetchBatch(String ids, String db, String f, String s) throws OutOfMemoryError\r
188   {\r
189     // max 50 ids can be added at one time\r
190     try\r
191     {\r
192       //call.setOperationName(new QName("urn:Dbfetch", "fetchData"));\r
193       call.setOperationName(new QName("urn:Dbfetch", "fetchBatch"));\r
194       call.addParameter("ids", XMLType.XSD_STRING, ParameterMode.IN);\r
195       call.addParameter("db", XMLType.XSD_STRING, ParameterMode.IN);\r
196       call.addParameter("format", XMLType.XSD_STRING, ParameterMode.IN);\r
197       call.addParameter("style", XMLType.XSD_STRING, ParameterMode.IN);\r
198       call.setReturnType(XMLType.SOAP_ARRAY);\r
199 \r
200       if (f != null)\r
201       {\r
202         format = f;\r
203       }\r
204 \r
205       if (s != null)\r
206       {\r
207         style = s;\r
208       }\r
209 \r
210       try\r
211       {\r
212         return (String[]) call.invoke(new Object[]\r
213                                       {ids.toLowerCase(), db.toLowerCase(),\r
214                                       format, style});\r
215       }\r
216       catch (OutOfMemoryError er)\r
217       {\r
218         \r
219         System.out.println("OUT OF MEMORY DOWNLOADING QUERY FROM " + db + ":\n" +\r
220                            ids);\r
221         throw er;\r
222       }\r
223       // return null;\r
224     }\r
225     catch (Exception ex)\r
226     {\r
227       if (ex.getMessage().startsWith(\r
228           "uk.ac.ebi.jdbfetch.exceptions.DbfNoEntryFoundException"))\r
229       {\r
230         return null;\r
231       }\r
232       System.err.println("Unexpected exception when retrieving from " + db +\r
233                          "\nQuery was : '" + ids + "'");\r
234       ex.printStackTrace(System.err);\r
235       return null;\r
236     }\r
237   }\r
238 }\r