]> git.evergreen-ils.org Git - OpenSRF.git/blob - src/java/org/opensrf/net/http/GatewayRequest.java
Java Gateway interface improved exception handling
[OpenSRF.git] / src / java / org / opensrf / net / http / GatewayRequest.java
1 package org.opensrf.net.http;
2
3 import org.opensrf.*;
4 import org.opensrf.util.*;
5
6 import java.io.IOException;
7 import java.io.BufferedInputStream;
8 import java.io.OutputStreamWriter;
9 import java.io.InputStream;
10 import java.io.IOException;
11 import java.net.URL;
12 import java.net.URI;
13 import java.net.HttpURLConnection;
14 import java.lang.StringBuffer;
15 import java.util.List;
16 import java.util.Iterator;
17 import java.util.Map;
18 import java.util.HashMap;
19 import java.util.Queue;
20 import java.util.concurrent.ConcurrentLinkedQueue;
21
22 public class GatewayRequest extends HttpRequest {
23
24     private boolean readComplete;
25
26     public GatewayRequest(HttpConnection conn, String service, Method method) {
27         super(conn, service, method);
28         readComplete = false;
29     }
30
31     public GatewayRequest send() throws java.io.IOException {
32         String postData = compilePostData(service, method);
33
34         urlConn = (HttpURLConnection) httpConn.url.openConnection();
35         urlConn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded"); 
36         urlConn.setDoInput(true);
37         urlConn.setDoOutput(true);
38
39         OutputStreamWriter wr = new OutputStreamWriter(urlConn.getOutputStream());
40         wr.write(postData);
41         wr.flush();
42         wr.close();
43
44         return this;
45     }
46
47     public Object recv() throws java.io.IOException {
48
49         if (!readComplete) {
50             readResponses();
51             readComplete = true;
52         }
53
54         Object response = nextResponse();
55         if (response == null) 
56             complete = true;
57
58         return response;
59     }
60
61     /**
62      * Reads responses from network and populdates responseList. 
63      */
64     private void readResponses() throws java.io.IOException {
65
66         InputStream netStream = new BufferedInputStream(urlConn.getInputStream());
67         StringBuffer readBuf = new StringBuffer();
68
69         int bytesRead = 0;
70         byte[] buffer = new byte[1024];
71
72         while ((bytesRead = netStream.read(buffer)) != -1) 
73             readBuf.append(new String(buffer, 0, bytesRead));
74         
75         netStream.close();
76         urlConn = null;
77
78         // parse the JSON response
79         Map<String,?> result = null;
80
81         try {
82             result = (Map<String, ?>) new JSONReader(readBuf.toString()).readObject();
83
84         } catch (org.opensrf.util.JSONException ex) {
85             // if this happens, something is wrong
86             Logger.error("Gateway returned bad data " + ex.getStackTrace());
87             return;
88         }
89
90         // extract the gateway status value
91         String status = result.get("status").toString(); 
92
93         if (!"200".equals(status)) {
94             return;
95             // throw some new exception
96         }
97
98         // gateway always returns a wrapper array with the full results set
99         responseList = (List) result.get("payload"); 
100     }
101
102     private String compilePostData(String service, Method method) {
103         URI uri = null;
104         StringBuffer postData = new StringBuffer();
105
106         postData.append("service=");
107         postData.append(service);
108         postData.append("&method=");
109         postData.append(method.getName());
110
111         List params = method.getParams();
112         Iterator itr = params.iterator();
113
114         while (itr.hasNext()) {
115             postData.append("&param=");
116             postData.append(new JSONWriter(itr.next()).write());
117         }
118
119         try {
120
121             // not using URLEncoder because it replaces ' ' with '+'.
122             uri = new URI("http", "", null, postData.toString(), null);
123
124         } catch (java.net.URISyntaxException ex) {
125
126             // if this happens, something is wrong
127             Logger.error("Error compiling POST data " + ex.getStackTrace());
128             return null;
129         }
130
131         return uri.getRawQuery();
132     }
133 }
134
135