diff options
author | Kjetil Ørbekk <kjetil.orbekk@gmail.com> | 2012-01-27 18:14:59 +0100 |
---|---|---|
committer | Kjetil Ørbekk <kjetil.orbekk@gmail.com> | 2012-01-27 18:14:59 +0100 |
commit | 76b2dc36a008269c4e5af03e10d0587a03c2ba3b (patch) | |
tree | 25897017859ca1d89b1b09b3d7446821b7d3908e /same/src/main/java/com/orbekk/net | |
parent | aea82c6c2086c587382aa85cd3b4a862a89f8b55 (diff) |
Hack collection.
– MyJsonRpcHttpClient: A JsonRpcHttpClient that uses Apache
HttpComponents because of a HttpURLConnection bug in Android 2.2.
Receives hack status because of nasty overloading.
– Log4j-android doesn't like printing stack traces – convert them to
string before logging.
Diffstat (limited to 'same/src/main/java/com/orbekk/net')
-rw-r--r-- | same/src/main/java/com/orbekk/net/MyJsonRpcHttpClient.java | 75 |
1 files changed, 75 insertions, 0 deletions
diff --git a/same/src/main/java/com/orbekk/net/MyJsonRpcHttpClient.java b/same/src/main/java/com/orbekk/net/MyJsonRpcHttpClient.java new file mode 100644 index 0000000..98de054 --- /dev/null +++ b/same/src/main/java/com/orbekk/net/MyJsonRpcHttpClient.java @@ -0,0 +1,75 @@ +package com.orbekk.net; + +import java.io.IOException; +import java.io.OutputStream; +import java.lang.reflect.Type; +import java.net.URL; +import java.util.HashMap; +import java.util.Map; + +import org.apache.http.HttpEntity; +import org.apache.http.HttpResponse; +import org.apache.http.client.HttpClient; +import org.apache.http.client.methods.HttpPost; +import org.apache.http.entity.ContentProducer; +import org.apache.http.entity.EntityTemplate; +import org.apache.http.impl.client.DefaultHttpClient; +import org.apache.http.params.HttpConnectionParams; +import org.apache.http.params.HttpParams; +import org.codehaus.jackson.map.ObjectMapper; + +import com.googlecode.jsonrpc4j.JsonRpcClient; +import com.googlecode.jsonrpc4j.JsonRpcHttpClient; + +/** + * This class is horrible. :S + * + * We extend JsonRpcHttpClient but try to override everything it does. + */ +public class MyJsonRpcHttpClient extends JsonRpcHttpClient { + private URL serviceUrl; + private JsonRpcClient rpcClient; + private HttpClient httpClient; + + public MyJsonRpcHttpClient(URL serviceUrl, int connectionTimeout, + int readTimeout) { + super(null); + httpClient = new DefaultHttpClient(); + HttpParams params = httpClient.getParams(); + HttpConnectionParams.setConnectionTimeout(params, connectionTimeout); + HttpConnectionParams.setSoTimeout(params, readTimeout); + rpcClient = new JsonRpcClient(); + this.serviceUrl = serviceUrl; + } + + @Override + public synchronized Object invoke( + final String methodName, final Object[] arguments, Type returnType, + Map<String, String> extraHeaders) + throws Exception { + EntityTemplate entity = new EntityTemplate(new ContentProducer() { + @Override + public void writeTo(OutputStream out) throws IOException { + try { + rpcClient.invoke(methodName, arguments, out); + } catch (Exception e) { + throw new IOException(e); + } + } + }); + entity.setContentType("application/json-rpc"); + + HttpPost post = new HttpPost(serviceUrl.toString()); + + for (Map.Entry<String, String> entry : extraHeaders.entrySet()) { + post.addHeader(entry.getKey(), entry.getValue()); + } + + post.setEntity(entity); + + HttpResponse response = httpClient.execute(post); + HttpEntity responseEntity = response.getEntity(); + + return super.readResponse(returnType, responseEntity.getContent()); + } +} |