summaryrefslogtreecommitdiff
path: root/java/src/com
diff options
context:
space:
mode:
authorJatin Matani <jatinm@google.com>2014-09-29 17:16:30 -0700
committerJatin Matani <jatinm@google.com>2014-10-09 00:01:32 -0700
commitdb1b73644686b5f2b93be12eb5b4f33e4950119d (patch)
tree33ef38dc9bfa72859ed8631e44fb8443e7f09d77 /java/src/com
parent847735fdfacfda3fda0e3a1370a35896832cb8bb (diff)
Changes related Sync Engine library that communicates to cloud server
This change updates some of the code that the library uses to communicate with the cloud server Specifically : - Update BlockingHttpClient to use template ResponseProcessor - Update HttpUrlConnectionBuilder to setAuthToken for HttpUrlConnection Bug: 17464069 Bug: 17464805 Change-Id: I7d7b58dff594b920162f799d102e8582ff9fe6a4
Diffstat (limited to 'java/src/com')
-rw-r--r--java/src/com/android/inputmethod/latin/network/AuthException.java35
-rw-r--r--java/src/com/android/inputmethod/latin/network/BlockingHttpClient.java34
-rw-r--r--java/src/com/android/inputmethod/latin/network/HttpException.java46
-rw-r--r--java/src/com/android/inputmethod/latin/network/HttpUrlConnectionBuilder.java34
4 files changed, 125 insertions, 24 deletions
diff --git a/java/src/com/android/inputmethod/latin/network/AuthException.java b/java/src/com/android/inputmethod/latin/network/AuthException.java
new file mode 100644
index 000000000..1bce4c156
--- /dev/null
+++ b/java/src/com/android/inputmethod/latin/network/AuthException.java
@@ -0,0 +1,35 @@
+/*
+ * Copyright (C) 2014 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.inputmethod.latin.network;
+
+/**
+ * Authentication exception. When this exception is thrown, the client may
+ * try to refresh the authentication token and try again.
+ */
+public class AuthException extends Exception {
+ public AuthException() {
+ super();
+ }
+
+ public AuthException(Throwable throwable) {
+ super(throwable);
+ }
+
+ public AuthException(String detailMessage) {
+ super(detailMessage);
+ }
+} \ No newline at end of file
diff --git a/java/src/com/android/inputmethod/latin/network/BlockingHttpClient.java b/java/src/com/android/inputmethod/latin/network/BlockingHttpClient.java
index 0d0cbe169..5e86d94cd 100644
--- a/java/src/com/android/inputmethod/latin/network/BlockingHttpClient.java
+++ b/java/src/com/android/inputmethod/latin/network/BlockingHttpClient.java
@@ -16,6 +16,8 @@
package com.android.inputmethod.latin.network;
+import android.util.Log;
+
import com.android.inputmethod.annotations.UsedForTesting;
import java.io.BufferedOutputStream;
@@ -35,20 +37,15 @@ import javax.annotation.Nullable;
*/
@UsedForTesting
public class BlockingHttpClient {
+ private static final boolean DEBUG = false;
+ private static final String TAG = BlockingHttpClient.class.getSimpleName();
+
private final HttpURLConnection mConnection;
/**
* Interface that handles processing the response for a request.
*/
- public interface ResponseProcessor {
- /**
- * Called when the HTTP request fails with an error.
- *
- * @param httpStatusCode The status code of the HTTP response.
- * @param message The HTTP response message, if any, or null.
- */
- void onError(int httpStatusCode, @Nullable String message);
-
+ public interface ResponseProcessor<T> {
/**
* Called when the HTTP request finishes successfully.
* The {@link InputStream} is closed by the client after the method finishes,
@@ -56,7 +53,7 @@ public class BlockingHttpClient {
*
* @param response An input stream that can be used to read the HTTP response.
*/
- void onSuccess(InputStream response);
+ T onSuccess(InputStream response) throws IOException;
}
/**
@@ -73,11 +70,11 @@ public class BlockingHttpClient {
* TODO: Remove @UsedForTesting after this is actually used.
*
* @param request The request payload, if any, or null.
- * @param responeProcessor A processor for the HTTP response.
+ * @param responseProcessor A processor for the HTTP response.
*/
@UsedForTesting
- public void execute(@Nullable byte[] request, @Nonnull ResponseProcessor responseProcessor)
- throws IOException {
+ public <T> T execute(@Nullable byte[] request, @Nonnull ResponseProcessor<T> responseProcessor)
+ throws IOException, AuthException, HttpException {
try {
if (request != null) {
OutputStream out = new BufferedOutputStream(mConnection.getOutputStream());
@@ -88,9 +85,16 @@ public class BlockingHttpClient {
final int responseCode = mConnection.getResponseCode();
if (responseCode != HttpURLConnection.HTTP_OK) {
- responseProcessor.onError(responseCode, mConnection.getResponseMessage());
+ if (DEBUG) {
+ Log.d(TAG, "Response error: " + responseCode + ", Message: "
+ + mConnection.getResponseMessage());
+ }
+ if (responseCode == HttpURLConnection.HTTP_UNAUTHORIZED) {
+ throw new AuthException(mConnection.getResponseMessage());
+ }
+ throw new HttpException(responseCode);
} else {
- responseProcessor.onSuccess(mConnection.getInputStream());
+ return responseProcessor.onSuccess(mConnection.getInputStream());
}
} finally {
mConnection.disconnect();
diff --git a/java/src/com/android/inputmethod/latin/network/HttpException.java b/java/src/com/android/inputmethod/latin/network/HttpException.java
new file mode 100644
index 000000000..b9d8b6372
--- /dev/null
+++ b/java/src/com/android/inputmethod/latin/network/HttpException.java
@@ -0,0 +1,46 @@
+/*
+ * Copyright (C) 2014 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.inputmethod.latin.network;
+
+import com.android.inputmethod.annotations.UsedForTesting;
+
+/**
+ * The HttpException exception represents a XML/HTTP fault with a HTTP status code.
+ */
+public class HttpException extends Exception {
+
+ /**
+ * The HTTP status code.
+ */
+ private final int mStatusCode;
+
+ /**
+ * @param statusCode int HTTP status code.
+ */
+ public HttpException(int statusCode) {
+ super("Response Code: " + statusCode);
+ mStatusCode = statusCode;
+ }
+
+ /**
+ * @return the HTTP status code related to this exception.
+ */
+ @UsedForTesting
+ public int getHttpStatusCode() {
+ return mStatusCode;
+ }
+} \ No newline at end of file
diff --git a/java/src/com/android/inputmethod/latin/network/HttpUrlConnectionBuilder.java b/java/src/com/android/inputmethod/latin/network/HttpUrlConnectionBuilder.java
index 35b65be56..502f72f17 100644
--- a/java/src/com/android/inputmethod/latin/network/HttpUrlConnectionBuilder.java
+++ b/java/src/com/android/inputmethod/latin/network/HttpUrlConnectionBuilder.java
@@ -37,6 +37,11 @@ public class HttpUrlConnectionBuilder {
private static final int DEFAULT_TIMEOUT_MILLIS = 5 * 1000;
/**
+ * Request header key for authentication.
+ */
+ public static final String HTTP_HEADER_AUTHORIZATION = "Authorization";
+
+ /**
* Request header key for cache control.
*/
public static final String KEY_CACHE_CONTROL = "Cache-Control";
@@ -78,7 +83,7 @@ public class HttpUrlConnectionBuilder {
* Sets the URL that'll be used for the request.
* This *must* be set before calling {@link #build()}
*
- * TODO: Remove @UsedForTesting after this is actually used.
+ * TODO: Remove @UsedForTesting after this method is actually used.
*/
@UsedForTesting
public HttpUrlConnectionBuilder setUrl(String url) throws MalformedURLException {
@@ -92,7 +97,7 @@ public class HttpUrlConnectionBuilder {
/**
* Sets the connect timeout. Defaults to {@value #DEFAULT_TIMEOUT} milliseconds.
*
- * TODO: Remove @UsedForTesting after this is actually used.
+ * TODO: Remove @UsedForTesting after this method is actually used.
*/
@UsedForTesting
public HttpUrlConnectionBuilder setConnectTimeout(int timeoutMillis) {
@@ -107,7 +112,7 @@ public class HttpUrlConnectionBuilder {
/**
* Sets the read timeout. Defaults to {@value #DEFAULT_TIMEOUT} milliseconds.
*
- * TODO: Remove @UsedForTesting after this is actually used.
+ * TODO: Remove @UsedForTesting after this method is actually used.
*/
@UsedForTesting
public HttpUrlConnectionBuilder setReadTimeout(int timeoutMillis) {
@@ -122,7 +127,7 @@ public class HttpUrlConnectionBuilder {
/**
* Adds an entry to the request header.
*
- * TODO: Remove @UsedForTesting after this is actually used.
+ * TODO: Remove @UsedForTesting after this method is actually used.
*/
@UsedForTesting
public HttpUrlConnectionBuilder addHeader(String key, String value) {
@@ -131,10 +136,21 @@ public class HttpUrlConnectionBuilder {
}
/**
+ * Sets an authentication token.
+ *
+ * TODO: Remove @UsedForTesting after this method is actually used.
+ */
+ @UsedForTesting
+ public HttpUrlConnectionBuilder setAuthToken(String value) {
+ mHeaderMap.put(HTTP_HEADER_AUTHORIZATION, value);
+ return this;
+ }
+
+ /**
* Sets the request to be executed such that the input is not buffered.
* This may be set when the request size is known beforehand.
*
- * TODO: Remove @UsedForTesting after this is actually used.
+ * TODO: Remove @UsedForTesting after this method is actually used.
*/
@UsedForTesting
public HttpUrlConnectionBuilder setFixedLengthForStreaming(int length) {
@@ -145,7 +161,7 @@ public class HttpUrlConnectionBuilder {
/**
* Indicates if the request can use cached responses or not.
*
- * TODO: Remove @UsedForTesting after this is actually used.
+ * TODO: Remove @UsedForTesting after this method is actually used.
*/
@UsedForTesting
public HttpUrlConnectionBuilder setUseCache(boolean useCache) {
@@ -161,7 +177,7 @@ public class HttpUrlConnectionBuilder {
* @see #MODE_DOWNLOAD_ONLY
* @see #MODE_BI_DIRECTIONAL
*
- * TODO: Remove @UsedForTesting after this is actually used.
+ * TODO: Remove @UsedForTesting after this method is actually used
*/
@UsedForTesting
public HttpUrlConnectionBuilder setMode(int mode) {
@@ -177,7 +193,7 @@ public class HttpUrlConnectionBuilder {
/**
* Builds the {@link HttpURLConnection} instance that can be used to execute the request.
*
- * TODO: Remove @UsedForTesting after this is actually used.
+ * TODO: Remove @UsedForTesting after this method is actually used.
*/
@UsedForTesting
public HttpURLConnection build() throws IOException {
@@ -210,4 +226,4 @@ public class HttpUrlConnectionBuilder {
}
return connection;
}
-}
+} \ No newline at end of file