From 76b2dc36a008269c4e5af03e10d0587a03c2ba3b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kjetil=20=C3=98rbekk?= Date: Fri, 27 Jan 2012 18:14:59 +0100 Subject: Hack collection. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit – 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. --- .../java/com/orbekk/net/MyJsonRpcHttpClient.java | 75 ++++++++++++++++++++++ 1 file changed, 75 insertions(+) create mode 100644 same/src/main/java/com/orbekk/net/MyJsonRpcHttpClient.java (limited to 'same/src/main/java/com/orbekk/net') 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 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 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()); + } +} -- cgit v1.2.3