initial implementation of Rest client framework (JAL-715)
[jalview.git] / src / jalview / ws / rest / HttpResultSet.java
1 package jalview.ws.rest;
2
3 import java.io.BufferedInputStream;
4 import java.io.BufferedReader;
5 import java.io.IOException;
6 import java.io.InputStreamReader;
7 import java.io.UnsupportedEncodingException;
8
9 import org.apache.http.HttpEntity;
10 import org.apache.http.HttpResponse;
11 import org.apache.http.client.methods.HttpRequestBase;
12 import org.apache.http.entity.mime.MultipartEntity;
13 import org.apache.james.mime4j.MimeException;
14 import org.apache.james.mime4j.parser.ContentHandler;
15 import org.apache.james.mime4j.parser.MimeStreamParser;
16
17 import jalview.bin.Cache;
18 import jalview.io.FileParse;
19 import jalview.io.mime.JalviewMimeContentHandler;
20
21 /**
22  * data source instantiated from the response of an httpclient request.
23  * 
24  * @author JimP
25  * 
26  */
27
28 public class HttpResultSet extends FileParse
29 {
30
31   private HttpRequestBase cachedRequest;
32
33   /**
34    * when set, indicates that en can be recreated by repeating the HttpRequest
35    * in cachedRequest
36    */
37   boolean repeatable = false;
38
39   /**
40    * response that is to be parsed as jalview input data
41    */
42   private HttpEntity en = null;
43
44   /**
45    * (sub)job that produced this result set.
46    */
47   private RestJob restJob;
48
49   public HttpResultSet(RestJob rj, HttpResponse con, HttpRequestBase req)
50           throws IOException
51   {
52     super();
53     setDataName(rj.getJobId() + " Part " + rj.getJobnum());
54     restJob = rj;
55     cachedRequest = req;
56     initDataSource(con);
57   }
58
59   private void initDataSource(HttpResponse con) throws IOException
60   {
61     en = con.getEntity();
62     repeatable = en.isRepeatable();
63
64     if (en instanceof MultipartEntity)
65     {
66       MultipartEntity mpe = (MultipartEntity) en;
67       // multipart
68       jalview.io.packed.JalviewDataset ds = restJob.newJalviewDataset();
69       ContentHandler handler = new JalviewMimeContentHandler(ds);
70       MimeStreamParser parser = new MimeStreamParser();
71       parser.setContentHandler(handler);
72       try
73       {
74         parser.parse(mpe.getContent());
75       } catch (MimeException me)
76       {
77         error = true;
78         errormessage = "Couldn't parse message from web service.";
79         Cache.log.warn("Failed to parse MIME multipart content", me);
80         en.consumeContent();
81       }
82     }
83     else
84     {
85       // assume content is simple text stream that can be read from
86       String enc = (en.getContentEncoding()==null) ? null : en.getContentEncoding().getValue();
87       if (en.getContentType()!=null) {
88         Cache.log.info("Result Type: " + en.getContentType().toString());
89       } else {
90         Cache.log.info("No Result Type Specified.");
91       }
92       if (enc == null || enc.length() < 1)
93       {
94         Cache.log.debug("Assuming 'Default' Result Encoding.");
95       }
96       else
97       {
98         Cache.log.debug("Result Encoded as : "+enc);
99       }
100       // attempt to identify file and construct an appropriate DataSource
101       // identifier for it.
102       // try to parse
103       // Mime-Multipart or single content type will be expected.
104       // if (enc.equals(org.apache.http.client.utils.)))
105       InputStreamReader br = null;
106       try
107       {
108         br = (enc != null) ? new InputStreamReader(en.getContent(), enc)
109                 : new InputStreamReader(en.getContent());
110       } catch (UnsupportedEncodingException e)
111       {
112         Cache.log.error("Can't handle encoding '" + enc
113                 + "' for response from webservice.", e);
114         en.consumeContent();
115         error = true;
116         errormessage = "Can't handle encoding for response from webservice";
117         return;
118       }
119       if (br != null)
120       {
121         dataIn = new BufferedReader(br);
122         error=false;
123       }
124     }
125   }
126
127   @Override
128   protected void finalize() throws Throwable
129   {
130     dataIn = null;
131     cachedRequest = null;
132     try
133     {
134       if (en != null)
135       {
136         en.consumeContent();
137       }
138     } catch (Exception e)
139     {
140     } catch (Error ex)
141     {
142     }
143     super.finalize();
144   }
145
146 }