JAL-3253/JAL-3257
[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.JSONUtils;
24 import jalview.util.MessageManager;
25 import jalview.ws.HttpClientUtils;
26
27 import java.io.BufferedReader;
28 import java.io.IOException;
29 import java.io.InputStreamReader;
30 import java.io.Reader;
31 import java.io.StringReader;
32 import java.net.URL;
33 import java.util.ArrayList;
34 import java.util.Iterator;
35 import java.util.List;
36 import java.util.Map;
37
38 import org.apache.http.NameValuePair;
39 import org.apache.http.message.BasicNameValuePair;
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<NameValuePair>();
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<Reader>();
147     final BufferedReader postResponse = HttpClientUtils
148             .doHttpUrlPost(twoDtoolsURL, vals, 0, 0);
149     readers.add(postResponse);
150     return readers.iterator();
151
152   }
153
154   /**
155    * @param respons
156    * @return
157    * @throws Exception
158    */
159   public static Iterator<Reader> processJsonResponseFor(Reader respons)
160           throws Exception
161   {
162           // BH 2019 never called?
163     try
164     {
165       @SuppressWarnings("unchecked")
166         final Iterator<Object> rvals = ((List<Object>) JSONUtils.parse(respons)).iterator();
167       return new Iterator<Reader>()
168       {
169         @Override
170         public boolean hasNext()
171         {
172           return rvals.hasNext();
173         }
174
175         @SuppressWarnings("unchecked")
176                 @Override
177         public Reader next()
178         {
179           Map<String, Object> val = (Map<String, Object>) rvals.next();
180
181           Object sval = null;
182           try
183           {
184             sval = val.get("2D");
185           } catch (Exception x)
186           {
187             x.printStackTrace();
188           }
189           ;
190           if (sval == null)
191           {
192             System.err.println(
193                     "DEVELOPER WARNING: Annotate3d didn't return a '2D' tag in its response. Consider checking output of server. Response was :"
194                             + val.toString());
195
196             sval = "";
197           }
198           return new StringReader(sval.toString());
199
200         }
201
202         @Override
203         public void remove()
204         {
205           throw new Error(
206                   MessageManager.getString("error.not_implemented_remove"));
207
208         }
209
210         @Override
211         protected Object clone() throws CloneNotSupportedException
212         {
213           throw new CloneNotSupportedException(
214                   MessageManager.getString("error.not_implemented_clone"));
215         }
216
217         @Override
218         public boolean equals(Object obj)
219         {
220           return super.equals(obj);
221         }
222
223         @Override
224         protected void finalize() throws Throwable
225         {
226           while (rvals.hasNext())
227           {
228             rvals.next();
229           }
230           super.finalize();
231         }
232       };
233     } catch (Exception foo)
234     {
235       throw new Exception(MessageManager.getString(
236               "exception.couldnt_parse_responde_from_annotated3d_server"),
237               foo);
238     }
239
240   }
241
242   public static Iterator<Reader> getRNAMLForPDBId(String pdbid)
243           throws Exception
244   {
245     List<NameValuePair> vals = new ArrayList<NameValuePair>();
246     vals.add(new BasicNameValuePair("tool", "rnaview"));
247     vals.add(new BasicNameValuePair("pdbid", pdbid));
248     vals.add(new BasicNameValuePair("output", "rnaml"));
249     java.net.URL geturl = new URL(twoDtoolsURL + "?tool=rnaview&pdbid="
250             + pdbid + "&output=rnaml");
251     // return processJsonResponseFor(new
252     // InputStreamReader(geturl.openStream()));
253     ArrayList<Reader> readers = new ArrayList<Reader>();
254     readers.add(new InputStreamReader(geturl.openStream()));
255     return readers.iterator();
256   }
257
258 }