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