d5ab2e1a3b501cc83d1fd3e5b066c63ea2c18d4b
[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 \r
40   String format = "default";\r
41 \r
42   String style = "raw";\r
43 \r
44   /**\r
45    * Creates a new EBIFetchClient object.\r
46    */\r
47   public EBIFetchClient()\r
48   {\r
49     try\r
50     {\r
51       call = (Call) new Service().createCall();\r
52       call.setTargetEndpointAddress(new java.net.URL(\r
53               "http://www.ebi.ac.uk/ws/services/Dbfetch"));\r
54     } catch (Exception ex)\r
55     {\r
56     }\r
57   }\r
58 \r
59   /**\r
60    * DOCUMENT ME!\r
61    * \r
62    * @return DOCUMENT ME!\r
63    */\r
64   public String[] getSupportedDBs()\r
65   {\r
66     try\r
67     {\r
68       call.setOperationName(new QName("urn:Dbfetch", "getSupportedDBs"));\r
69       call.setReturnType(XMLType.SOAP_ARRAY);\r
70 \r
71       return (String[]) call.invoke(new Object[]\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\r
89               .setOperationName(new QName("urn:Dbfetch",\r
90                       "getSupportedFormats"));\r
91       call.setReturnType(XMLType.SOAP_ARRAY);\r
92 \r
93       return (String[]) call.invoke(new Object[]\r
94       {});\r
95     } catch (Exception ex)\r
96     {\r
97       return null;\r
98     }\r
99   }\r
100 \r
101   /**\r
102    * DOCUMENT ME!\r
103    * \r
104    * @return DOCUMENT ME!\r
105    */\r
106   public String[] getSupportedStyles()\r
107   {\r
108     try\r
109     {\r
110       call.setOperationName(new QName("urn:Dbfetch", "getSupportedStyles"));\r
111       call.setReturnType(XMLType.SOAP_ARRAY);\r
112 \r
113       return (String[]) call.invoke(new Object[]\r
114       {});\r
115     } catch (Exception ex)\r
116     {\r
117       return null;\r
118     }\r
119   }\r
120 \r
121   public File fetchDataAsFile(String ids, String f, String s)\r
122           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\r
126     // possible (OutOfMemoryErrors are usual problem)\r
127     File outFile = null;\r
128     try\r
129     {\r
130       outFile = File.createTempFile("jalview", ".xml");\r
131       outFile.deleteOnExit();\r
132       PrintWriter out = new PrintWriter(new FileOutputStream(outFile));\r
133       int index = 0;\r
134       while (index < data.length)\r
135       {\r
136         out.println(data[index]);\r
137         index++;\r
138       }\r
139       out.close();\r
140     } catch (Exception ex)\r
141     {\r
142     }\r
143     return outFile;\r
144   }\r
145 \r
146   /**\r
147    * Single DB multiple record retrieval\r
148    * \r
149    * @param ids\r
150    *                db:query1;query2;query3\r
151    * @param f\r
152    *                raw/xml\r
153    * @param s ?\r
154    * \r
155    * @return Raw string array result of query set\r
156    */\r
157   public String[] fetchData(String ids, String f, String s)\r
158           throws OutOfMemoryError\r
159   {\r
160     // Need to split\r
161     // ids of the form uniprot:25KD_SARPE;ADHR_DROPS;\r
162     StringTokenizer queries = new StringTokenizer(ids, ";");\r
163     String db = null;\r
164     StringBuffer querystring = null;\r
165     while (queries.hasMoreTokens())\r
166     {\r
167       String query = queries.nextToken();\r
168       int p;\r
169       if ((p = query.indexOf(':')) > -1)\r
170       {\r
171         db = query.substring(0, p);\r
172         query = query.substring(p + 1);\r
173       }\r
174       if (querystring == null)\r
175       {\r
176         querystring = new StringBuffer(query);\r
177       }\r
178       else\r
179       {\r
180         querystring.append("," + query);\r
181       }\r
182     }\r
183     if (db == null)\r
184     {\r
185       System.err.println("Invalid Query string : '" + ids\r
186               + "'\nShould be of form 'dbname:q1;q2;q3;q4'");\r
187     }\r
188     return fetchBatch(querystring.toString(), db, f, s);\r
189   }\r
190 \r
191   public String[] fetchBatch(String ids, String db, String f, String s)\r
192           throws OutOfMemoryError\r
193   {\r
194     // max 50 ids can be added at one time\r
195     try\r
196     {\r
197       // call.setOperationName(new QName("urn:Dbfetch", "fetchData"));\r
198       call.setOperationName(new QName("urn:Dbfetch", "fetchBatch"));\r
199       call.addParameter("ids", XMLType.XSD_STRING, ParameterMode.IN);\r
200       call.addParameter("db", XMLType.XSD_STRING, ParameterMode.IN);\r
201       call.addParameter("format", XMLType.XSD_STRING, ParameterMode.IN);\r
202       call.addParameter("style", XMLType.XSD_STRING, ParameterMode.IN);\r
203       call.setReturnType(XMLType.SOAP_ARRAY);\r
204 \r
205       if (f != null)\r
206       {\r
207         format = f;\r
208       }\r
209 \r
210       if (s != null)\r
211       {\r
212         style = s;\r
213       }\r
214 \r
215       try\r
216       {\r
217         return (String[]) call.invoke(new Object[]\r
218         { ids.toLowerCase(), db.toLowerCase(), format, style });\r
219       } catch (OutOfMemoryError er)\r
220       {\r
221 \r
222         System.out.println("OUT OF MEMORY DOWNLOADING QUERY FROM " + db\r
223                 + ":\n" + ids);\r
224         throw er;\r
225       }\r
226       // return null;\r
227     } catch (Exception ex)\r
228     {\r
229       if (ex.getMessage().startsWith(\r
230               "uk.ac.ebi.jdbfetch.exceptions.DbfNoEntryFoundException"))\r
231       {\r
232         return null;\r
233       }\r
234       System.err.println("Unexpected exception when retrieving from " + db\r
235               + "\nQuery was : '" + ids + "'");\r
236       ex.printStackTrace(System.err);\r
237       return null;\r
238     }\r
239   }\r
240 }\r