2a13baab4e69bd6f697372df39a26c61f1027959
[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     if (data==null)\r
128     {\r
129       return null;\r
130     }\r
131     File outFile = null;\r
132     try\r
133     {\r
134       outFile = File.createTempFile("jalview", ".xml");\r
135       outFile.deleteOnExit();\r
136       PrintWriter out = new PrintWriter(new FileOutputStream(outFile));\r
137       int index = 0;\r
138       while (index < data.length)\r
139       {\r
140         out.println(data[index]);\r
141         index++;\r
142       }\r
143       out.close();\r
144     }\r
145     catch (Exception ex)\r
146     {\r
147     }\r
148     return outFile;\r
149   }\r
150 \r
151   /**\r
152    * Single DB multiple record retrieval\r
153    * \r
154    * @param ids\r
155    *                db:query1;query2;query3\r
156    * @param f\r
157    *                raw/xml\r
158    * @param s ?\r
159    * \r
160    * @return Raw string array result of query set\r
161    */\r
162   public String[] fetchData(String ids, String f, String s)\r
163           throws OutOfMemoryError\r
164   {\r
165     // Need to split\r
166     // ids of the form uniprot:25KD_SARPE;ADHR_DROPS;\r
167     StringTokenizer queries = new StringTokenizer(ids, ";");\r
168     String db = null;\r
169     StringBuffer querystring = null;\r
170     while (queries.hasMoreTokens())\r
171     {\r
172       String query = queries.nextToken();\r
173       int p;\r
174       if ((p = query.indexOf(':')) > -1)\r
175       {\r
176         db = query.substring(0, p);\r
177         query = query.substring(p + 1);\r
178       }\r
179       if (querystring == null)\r
180       {\r
181         querystring = new StringBuffer(query);\r
182       }\r
183       else\r
184       {\r
185         querystring.append("," + query);\r
186       }\r
187     }\r
188     if (db == null)\r
189     {\r
190       System.err.println("Invalid Query string : '" + ids\r
191               + "'\nShould be of form 'dbname:q1;q2;q3;q4'");\r
192     }\r
193     return fetchBatch(querystring.toString(), db, f, s);\r
194   }\r
195 \r
196   public String[] fetchBatch(String ids, String db, String f, String s)\r
197           throws OutOfMemoryError\r
198   {\r
199     // max 50 ids can be added at one time\r
200     try\r
201     {\r
202       // call.setOperationName(new QName("urn:Dbfetch", "fetchData"));\r
203       call.setOperationName(new QName("urn:Dbfetch", "fetchBatch"));\r
204       call.addParameter("ids", XMLType.XSD_STRING, ParameterMode.IN);\r
205       call.addParameter("db", XMLType.XSD_STRING, ParameterMode.IN);\r
206       call.addParameter("format", XMLType.XSD_STRING, ParameterMode.IN);\r
207       call.addParameter("style", XMLType.XSD_STRING, ParameterMode.IN);\r
208       call.setReturnType(XMLType.SOAP_ARRAY);\r
209 \r
210       if (f != null)\r
211       {\r
212         format = f;\r
213       }\r
214 \r
215       if (s != null)\r
216       {\r
217         style = s;\r
218       }\r
219 \r
220       try\r
221       {\r
222         return (String[]) call.invoke(new Object[]\r
223         { ids.toLowerCase(), db.toLowerCase(), format, style });\r
224       } catch (OutOfMemoryError er)\r
225       {\r
226 \r
227         System.out.println("OUT OF MEMORY DOWNLOADING QUERY FROM " + db\r
228                 + ":\n" + ids);\r
229         throw er;\r
230       }\r
231       // return null;\r
232     } catch (Exception ex)\r
233     {\r
234       if (ex.getMessage().startsWith(\r
235               "uk.ac.ebi.jdbfetch.exceptions.DbfNoEntryFoundException"))\r
236       {\r
237         return null;\r
238       }\r
239       System.err.println("Unexpected exception when retrieving from " + db\r
240               + "\nQuery was : '" + ids + "'");\r
241       ex.printStackTrace(System.err);\r
242       return null;\r
243     }\r
244   }\r
245 }\r