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. --- same/pom.xml | 9 ++- .../java/com/orbekk/net/MyJsonRpcHttpClient.java | 75 ++++++++++++++++++++++ .../com/orbekk/same/ConnectionManagerImpl.java | 6 +- .../main/java/com/orbekk/same/StackTraceUtil.java | 14 ++++ 4 files changed, 100 insertions(+), 4 deletions(-) create mode 100644 same/src/main/java/com/orbekk/net/MyJsonRpcHttpClient.java create mode 100644 same/src/main/java/com/orbekk/same/StackTraceUtil.java (limited to 'same') diff --git a/same/pom.xml b/same/pom.xml index 93f611f..60402b3 100644 --- a/same/pom.xml +++ b/same/pom.xml @@ -83,8 +83,15 @@ org.eclipse.jetty jetty-server - 8.0.0.M3 + 8.0.0.M3 + + + org.apache.httpcomponents + httpclient + 4.1.2 + + 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()); + } +} diff --git a/same/src/main/java/com/orbekk/same/ConnectionManagerImpl.java b/same/src/main/java/com/orbekk/same/ConnectionManagerImpl.java index d477834..92b7588 100644 --- a/same/src/main/java/com/orbekk/same/ConnectionManagerImpl.java +++ b/same/src/main/java/com/orbekk/same/ConnectionManagerImpl.java @@ -2,6 +2,7 @@ package com.orbekk.same; import com.googlecode.jsonrpc4j.JsonRpcHttpClient; import com.googlecode.jsonrpc4j.ProxyUtil; +import com.orbekk.net.MyJsonRpcHttpClient; import com.orbekk.paxos.PaxosService; import java.net.MalformedURLException; @@ -32,9 +33,8 @@ public class ConnectionManagerImpl implements ConnectionManager { private T getClassProxy(String url, Class clazz) { T service = null; try { - JsonRpcHttpClient client = new JsonRpcHttpClient(new URL(url)); - client.setConnectionTimeoutMillis(connectionTimeout); - client.setReadTimeoutMillis(readTimeout); + MyJsonRpcHttpClient client = new MyJsonRpcHttpClient(new URL(url), + connectionTimeout, readTimeout); service = ProxyUtil.createProxy( this.getClass().getClassLoader(), clazz, diff --git a/same/src/main/java/com/orbekk/same/StackTraceUtil.java b/same/src/main/java/com/orbekk/same/StackTraceUtil.java new file mode 100644 index 0000000..0c0c3d0 --- /dev/null +++ b/same/src/main/java/com/orbekk/same/StackTraceUtil.java @@ -0,0 +1,14 @@ +package com.orbekk.same; + +import java.io.PrintWriter; +import java.io.StringWriter; +import java.io.Writer; + +public class StackTraceUtil { + public static String throwableToString(Throwable t) { + Writer writer = new StringWriter(); + PrintWriter printWriter = new PrintWriter(writer); + t.printStackTrace(printWriter); + return writer.toString(); + } +} -- cgit v1.2.3