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