b8ba8475ff1d9eff05d5ba8958e622c95cd18dc8
[jalview.git] / src / jalview / ext / paradise / Annotate3D.java
1 /*
2  * Jalview - A Sequence Alignment Editor and Viewer ($$Version-Rel$$)
3  * Copyright (C) $$Year-Rel$$ The Jalview Authors
4  * 
5  * This file is part of Jalview.
6  * 
7  * Jalview is free software: you can redistribute it and/or
8  * modify it under the terms of the GNU General Public License 
9  * as published by the Free Software Foundation, either version 3
10  * of the License, or (at your option) any later version.
11  *  
12  * Jalview is distributed in the hope that it will be useful, but 
13  * WITHOUT ANY WARRANTY; without even the implied warranty 
14  * of MERCHANTABILITY or FITNESS FOR A PARTICULAR 
15  * PURPOSE.  See the GNU General Public License for more details.
16  * 
17  * You should have received a copy of the GNU General Public License
18  * along with Jalview.  If not, see <http://www.gnu.org/licenses/>.
19  * The Jalview Authors are detailed in the 'AUTHORS' file.
20  */
21 package jalview.ext.paradise;
22
23 import jalview.util.MessageManager;
24 import jalview.ws.HttpClientUtils;
25
26 import java.io.BufferedReader;
27 import java.io.IOException;
28 import java.io.InputStreamReader;
29 import java.io.Reader;
30 import java.io.StringReader;
31 import java.net.URL;
32 import java.util.ArrayList;
33 import java.util.Iterator;
34 import java.util.List;
35
36 import org.apache.http.NameValuePair;
37 import org.apache.http.message.BasicNameValuePair;
38 import org.json.simple.JSONArray;
39 import org.json.simple.JSONObject;
40 import org.json.simple.parser.ContentHandler;
41 import org.json.simple.parser.ParseException;
42
43 /**
44  * simple methods for calling the various paradise RNA tools
45  * 
46  * @author jimp
47  * 
48  * @version v1.0 revised from original due to refactoring of
49  *          paradise-ubmc.u-strasbg.fr/webservices/annotate3d to
50  *          http://arn-ibmc.in2p3.fr/api/compute/2d?tool=rnaview <br/>
51  *          See also testing URL from fjossinet:<br/>
52  *          http://charn2-ibmc.u-strasbg.fr:8080/api/compute/2d <br/>
53  *          If in doubt, check against the REST client at:
54  *          https://github.com/fjossinet/RNA-Science
55  *          -Toolbox/blob/master/pyrna/restclient.py
56  */
57 public class Annotate3D
58 {
59   // also test with
60   // "http://charn2-ibmc.u-strasbg.fr:8080/api/compute/2d";
61   private static String twoDtoolsURL = "http://arn-ibmc.in2p3.fr/api/compute/2d?tool=rnaview";
62
63   private static ContentHandler createContentHandler()
64   {
65     ContentHandler ch = new ContentHandler()
66     {
67
68       @Override
69       public void startJSON() throws ParseException, IOException
70       {
71         // TODO Auto-generated method stub
72
73       }
74
75       @Override
76       public void endJSON() throws ParseException, IOException
77       {
78         // TODO Auto-generated method stub
79
80       }
81
82       @Override
83       public boolean startObject() throws ParseException, IOException
84       {
85         // TODO Auto-generated method stub
86         return false;
87       }
88
89       @Override
90       public boolean endObject() throws ParseException, IOException
91       {
92         // TODO Auto-generated method stub
93         return false;
94       }
95
96       @Override
97       public boolean startObjectEntry(String key)
98               throws ParseException, IOException
99       {
100         // TODO Auto-generated method stub
101         return false;
102       }
103
104       @Override
105       public boolean endObjectEntry() throws ParseException, IOException
106       {
107         // TODO Auto-generated method stub
108         return false;
109       }
110
111       @Override
112       public boolean startArray() throws ParseException, IOException
113       {
114         // TODO Auto-generated method stub
115         return false;
116       }
117
118       @Override
119       public boolean endArray() throws ParseException, IOException
120       {
121         // TODO Auto-generated method stub
122         return false;
123       }
124
125       @Override
126       public boolean primitive(Object value)
127               throws ParseException, IOException
128       {
129         // TODO Auto-generated method stub
130         return false;
131       }
132
133     };
134     return ch;
135   }
136
137   public static Iterator<Reader> getRNAMLForPDBFileAsString(String pdbfile)
138           throws Exception
139   {
140     List<NameValuePair> vals = new ArrayList<>();
141     vals.add(new BasicNameValuePair("tool", "rnaview"));
142     vals.add(new BasicNameValuePair("data", pdbfile));
143     vals.add(new BasicNameValuePair("output", "rnaml"));
144     // return processJsonResponseFor(HttpClientUtils.doHttpUrlPost(twoDtoolsURL,
145     // vals));
146     ArrayList<Reader> readers = new ArrayList<>();
147     final BufferedReader postResponse = HttpClientUtils
148             .doHttpUrlPost(twoDtoolsURL, vals, 0, 0);
149     readers.add(postResponse);
150     return readers.iterator();
151
152   }
153
154   public static Iterator<Reader> processJsonResponseFor(Reader respons)
155           throws Exception
156   {
157     org.json.simple.parser.JSONParser jp = new org.json.simple.parser.JSONParser();
158     try
159     {
160       final JSONArray responses = (JSONArray) jp.parse(respons);
161       final RvalsIterator rvals = new RvalsIterator(responses);
162       return rvals;
163     } catch (Exception foo)
164     {
165       throw new Exception(MessageManager.getString(
166               "exception.couldnt_parse_responde_from_annotated3d_server"),
167               foo);
168     }
169
170   }
171
172   public static Iterator<Reader> getRNAMLForPDBId(String pdbid)
173           throws Exception
174   {
175     List<NameValuePair> vals = new ArrayList<>();
176     vals.add(new BasicNameValuePair("tool", "rnaview"));
177     vals.add(new BasicNameValuePair("pdbid", pdbid));
178     vals.add(new BasicNameValuePair("output", "rnaml"));
179     java.net.URL geturl = new URL(twoDtoolsURL + "?tool=rnaview&pdbid="
180             + pdbid + "&output=rnaml");
181     // return processJsonResponseFor(new
182     // InputStreamReader(geturl.openStream()));
183     ArrayList<Reader> readers = new ArrayList<>();
184     readers.add(new InputStreamReader(geturl.openStream()));
185     return readers.iterator();
186   }
187
188 }
189
190 class RvalsIterator implements Iterator, AutoCloseable
191 {
192   private Iterator rvals;
193
194   protected RvalsIterator(JSONArray responses)
195   {
196     this.rvals = responses.iterator();
197   }
198
199   @Override
200   public boolean hasNext()
201   {
202     return rvals.hasNext();
203   }
204
205   @Override
206   public Reader next()
207   {
208     JSONObject val = (JSONObject) rvals.next();
209
210     Object sval = null;
211     try
212     {
213       sval = val.get("2D");
214     } catch (Exception x)
215     {
216       x.printStackTrace();
217     }
218     ;
219     if (sval == null)
220     {
221       System.err.println(
222               "DEVELOPER WARNING: Annotate3d didn't return a '2D' tag in its response. Consider checking output of server. Response was :"
223                       + val.toString());
224
225       sval = "";
226     }
227     return new StringReader(
228             (sval instanceof JSONObject) ? ((JSONObject) sval).toString()
229                     : sval.toString());
230
231   }
232
233   @Override
234   public void remove()
235   {
236     throw new Error(
237             MessageManager.getString("error.not_implemented_remove"));
238
239   }
240
241   @Override
242   protected Object clone() throws CloneNotSupportedException
243   {
244     throw new CloneNotSupportedException(
245             MessageManager.getString("error.not_implemented_clone"));
246   }
247
248   @Override
249   public boolean equals(Object obj)
250   {
251     return super.equals(obj);
252   }
253
254   @Override
255   public void close()
256   {
257     while (rvals.hasNext())
258     {
259       rvals.next();
260     }
261   }
262 }