Merge branch 'develop' into trialMerge
[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<>();
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   /**
155    * @param respons
156    * @return
157    * @throws Exception
158    */
159   public static Iterator<Reader> processJsonResponseFor(Reader respons)
160           throws Exception
161   {
162     try
163     {
164       @SuppressWarnings("unchecked")
165         List<Object> responses = (List<Object>) JSONUtils.parse(respons);
166       return new RvalsIterator(responses);
167     } catch (Exception foo)
168     {
169       throw new Exception(MessageManager.getString(
170               "exception.couldnt_parse_responde_from_annotated3d_server"),
171               foo);
172     }
173   }
174
175   public static Iterator<Reader> getRNAMLForPDBId(String pdbid)
176           throws Exception
177   {
178     List<NameValuePair> vals = new ArrayList<>();
179     vals.add(new BasicNameValuePair("tool", "rnaview"));
180     vals.add(new BasicNameValuePair("pdbid", pdbid));
181     vals.add(new BasicNameValuePair("output", "rnaml"));
182     java.net.URL geturl = new URL(twoDtoolsURL + "?tool=rnaview&pdbid="
183             + pdbid + "&output=rnaml");
184     // return processJsonResponseFor(new
185     // InputStreamReader(geturl.openStream()));
186     ArrayList<Reader> readers = new ArrayList<>();
187     readers.add(new InputStreamReader(geturl.openStream()));
188     return readers.iterator();
189   }
190
191 }
192
193 class RvalsIterator implements Iterator<Reader>, AutoCloseable
194 {
195   private Iterator<Object> rvals;
196
197   protected RvalsIterator(List<Object> responses)
198   {
199     this.rvals = responses.iterator();
200   }
201
202   @Override
203   public boolean hasNext()
204   {
205     return rvals.hasNext();
206   }
207
208   @Override
209   public Reader next()
210   {
211     Map<String, Object> val = (Map<String, Object>) rvals.next();
212
213     Object sval = null;
214     try
215     {
216       sval = val.get("2D");
217     } catch (Exception x)
218     {
219       x.printStackTrace();
220     }
221     if (sval == null)
222     {
223       System.err.println(
224               "DEVELOPER WARNING: Annotate3d didn't return a '2D' tag in its response. Consider checking output of server. Response was :"
225                       + val.toString());
226
227       sval = "";
228     }
229     return new StringReader(sval.toString());
230   }
231
232   @Override
233   public void remove()
234   {
235     throw new UnsupportedOperationException();
236   }
237
238   @Override
239   protected Object clone() throws CloneNotSupportedException
240   {
241     throw new UnsupportedOperationException();
242   }
243
244   @Override
245   public void close()
246   {
247     while (rvals.hasNext())
248     {
249       rvals.next();
250     }
251   }
252 }