summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorYurii Chernyshov <ychernyshov@luxoft.com>2014-08-08 17:24:35 +0300
committerYurii Chernyshov <ychernyshov@luxoft.com>2014-08-08 17:24:35 +0300
commit3e43e55efe5d49e1728d9b6443d3da0bbea85d1d (patch)
tree36e47e15626d855f8ac455f7d0f523ef87ee776b
parent0437688f0ec8f6099278211ee8d112295b22abc1 (diff)
downloadsmartdevicelink-3e43e55efe5d49e1728d9b6443d3da0bbea85d1d.tar.gz
APPLINK-8284-Complete with functionality implementation
-rw-r--r--mobile/android/SyncProxyAndroid/androidTest/java/com/ford/syncV4/net/HttpRequestParametersTest.java109
-rw-r--r--mobile/android/SyncProxyAndroid/androidTest/java/com/ford/syncV4/net/parser/RequestJSONDataParserTest.java148
-rw-r--r--mobile/android/SyncProxyAndroid/androidTest/java/com/ford/syncV4/service/PolicyDataServiceProviderImplTest.java31
-rw-r--r--mobile/android/SyncProxyAndroid/src/main/java/com/ford/syncV4/net/HttpRequestParameters.java126
-rw-r--r--mobile/android/SyncProxyAndroid/src/main/java/com/ford/syncV4/net/IDataDownloader.java5
-rw-r--r--mobile/android/SyncProxyAndroid/src/main/java/com/ford/syncV4/net/PolicyDataDownloaderImpl.java54
-rw-r--r--mobile/android/SyncProxyAndroid/src/main/java/com/ford/syncV4/net/parser/RequestAbstractDataParser.java6
-rw-r--r--mobile/android/SyncProxyAndroid/src/main/java/com/ford/syncV4/net/parser/RequestJSONDataParser.java111
-rw-r--r--mobile/android/SyncProxyAndroid/src/main/java/com/ford/syncV4/proxy/systemrequest/OnSystemRequestHandlerImpl.java34
-rw-r--r--mobile/android/SyncProxyAndroid/src/main/java/com/ford/syncV4/service/IDataServiceProvider.java9
-rw-r--r--mobile/android/SyncProxyAndroid/src/main/java/com/ford/syncV4/service/PolicyDataServiceProviderImpl.java37
11 files changed, 629 insertions, 41 deletions
diff --git a/mobile/android/SyncProxyAndroid/androidTest/java/com/ford/syncV4/net/HttpRequestParametersTest.java b/mobile/android/SyncProxyAndroid/androidTest/java/com/ford/syncV4/net/HttpRequestParametersTest.java
index 36797799f..b3f1ecbb0 100644
--- a/mobile/android/SyncProxyAndroid/androidTest/java/com/ford/syncV4/net/HttpRequestParametersTest.java
+++ b/mobile/android/SyncProxyAndroid/androidTest/java/com/ford/syncV4/net/HttpRequestParametersTest.java
@@ -1,11 +1,118 @@
package com.ford.syncV4.net;
+import android.net.Uri;
+
+import junit.framework.TestCase;
+
+import org.json.JSONException;
+import org.json.JSONObject;
+
/**
* Created with Android Studio.
* Author: Chernyshov Yuriy - Mobile Development
* Date: 08.08.14
* Time: 16:37
*/
-public class HttpRequestParametersTest {
+public class HttpRequestParametersTest extends TestCase {
+
+ private HttpRequestParameters mParameters;
+
+ @Override
+ public void setUp() throws Exception {
+ super.setUp();
+
+ mParameters = new HttpRequestParameters();
+ }
+
+ public void testCreateInstanceShouldNotBeNull() {
+ assertNotNull(mParameters);
+ }
+
+ public void testRequestMethodDefault() {
+ assertEquals(HttpRequestParameters.REQUEST_METHOD.POST, mParameters.getRequestMethod());
+ }
+
+ public void testRequestBodyDefaultNotNull() {
+ assertNotNull(mParameters.getRequestBody());
+ }
+
+ public void testRequestBody() throws JSONException {
+ String body = "{'body':'qwertyuiop'}";
+ JSONObject jsonObject = new JSONObject(body);
+
+ mParameters.setRequestBody(jsonObject);
+
+ assertEquals(jsonObject, mParameters.getRequestBody());
+ }
+
+ public void testSetRequestBodyNullThrowsException() {
+ try {
+ mParameters.setRequestBody(null);
+ } catch (NullPointerException e) {
+ /* Expected */
+ }
+ }
+
+ public void testRequestHeadersDefault() {
+ assertNotNull(mParameters.getRequestHeadersKeysSet());
+ }
+
+ public void testNullRequestHeader() {
+ assertNull(mParameters.getHeaderValue(null));
+ }
+
+ public void testRequestHeader() {
+ String headerName = "HeaderName";
+ String headerValue = "HeaderValue";
+ mParameters.setRequestHeader(headerName, headerValue);
+
+ assertTrue(mParameters.getRequestHeadersKeysSet().contains(headerName));
+ assertEquals(headerValue, mParameters.getHeaderValue(headerName));
+ }
+
+ public void testRequestHeaderSetBothNullValue() {
+ try {
+ mParameters.setRequestHeader(null, null);
+ } catch (NullPointerException e) {
+ /* Expected */
+ }
+ }
+
+ public void testRequestHeaderSetNameNull() {
+ String headerName = "HeaderName";
+ try {
+ mParameters.setRequestHeader(headerName, null);
+ } catch (NullPointerException e) {
+ /* Expected */
+ }
+ }
+
+ public void testRequestHeaderSetValueNull() {
+ String headerValue = "HeaderValue";
+ try {
+ mParameters.setRequestHeader(null, headerValue);
+ } catch (NullPointerException e) {
+ /* Expected */
+ }
+ }
+
+ public void testUriDefault() {
+ assertEquals(Uri.EMPTY, mParameters.getUri());
+ }
+
+ public void testUriSetNullThrowException() {
+ try {
+ mParameters.setUri(null);
+ } catch (NullPointerException e) {
+ /* Expected */
+ }
+ }
+
+ public void testUri() {
+ Uri uri = Uri.parse("http://www.google.com");
+
+ mParameters.setUri(uri);
+ assertEquals(uri, mParameters.getUri());
+ }
} \ No newline at end of file
diff --git a/mobile/android/SyncProxyAndroid/androidTest/java/com/ford/syncV4/net/parser/RequestJSONDataParserTest.java b/mobile/android/SyncProxyAndroid/androidTest/java/com/ford/syncV4/net/parser/RequestJSONDataParserTest.java
index ac16cc981..2f5dde07a 100644
--- a/mobile/android/SyncProxyAndroid/androidTest/java/com/ford/syncV4/net/parser/RequestJSONDataParserTest.java
+++ b/mobile/android/SyncProxyAndroid/androidTest/java/com/ford/syncV4/net/parser/RequestJSONDataParserTest.java
@@ -1,11 +1,157 @@
package com.ford.syncV4.net.parser;
+import com.ford.syncV4.net.HttpRequestParameters;
+import com.ford.syncV4.util.logger.Logger;
+
+import junit.framework.TestCase;
+
+import org.hamcrest.CoreMatchers;
+import org.hamcrest.MatcherAssert;
+import org.json.JSONArray;
+import org.json.JSONException;
+import org.json.JSONObject;
+
+import java.nio.charset.Charset;
+import java.util.Iterator;
+import java.util.Set;
+
/**
* Created with Android Studio.
* Author: Chernyshov Yuriy - Mobile Development
* Date: 08.08.14
* Time: 10:36
*/
-public class RequestJSONDataParserTest {
+public class RequestJSONDataParserTest extends TestCase {
+
+ /**
+ * Number of the headers in the valid JSON Object
+ */
+ private static final int HEADERS_COUNT = 10;
+
+ private static final String BODY_KEY = "data";
+ private static final String BODY_VALUE = "HwcZAAAnMERRN1kxNjg2AAAAAQAAAAAAMDEyMzQ1Njc4OTAx" +
+ "MjM0NaUXfMEJcxkCqizvE8/NX6yeBfflBJBWJ+CsODgc6Panl/24vXk1xUDbtj2bAdwTcADrP08n9c7qG1C" +
+ "F9tiOe0UrdF3qW/7ChakvcCvn0IP55jNGhZLvHyDh1Clo35NJU6DGU2aetcOKm9lMAF";
+
+ private static final String BODY_DATA = "{\\\"" + BODY_KEY + "\\\":[\\\"" + BODY_VALUE + "\\\"]}";
+
+ private static final String REQUEST_METHOD = "POST";
+
+ public void testValidRawDataToJSONObjectNotNull() {
+ byte[] rawData = getValidJSONDataAsString().getBytes(Charset.forName("UTF-8"));
+
+ assertNotNull(RequestJSONDataParser.getJSONFromRawData(rawData));
+ }
+
+ public void testValidRawDataToJSONObjectCorrectInstanceOf() {
+ byte[] rawData = getValidJSONDataAsString().getBytes(Charset.forName("UTF-8"));
+
+ MatcherAssert.assertThat(RequestJSONDataParser.getJSONFromRawData(rawData),
+ CoreMatchers.instanceOf(JSONObject.class));
+ }
+
+ public void testInvalidRawDataToJSONObjectNotNull() {
+ byte[] rawData = null;
+
+ assertNotNull(RequestJSONDataParser.getJSONFromRawData(rawData));
+ MatcherAssert.assertThat(RequestJSONDataParser.getJSONFromRawData(rawData),
+ CoreMatchers.instanceOf(JSONObject.class));
+
+ rawData = new byte[0];
+
+ assertNotNull(RequestJSONDataParser.getJSONFromRawData(rawData));
+ MatcherAssert.assertThat(RequestJSONDataParser.getJSONFromRawData(rawData),
+ CoreMatchers.instanceOf(JSONObject.class));
+
+ }
+
+ public void testInvalidRawDataToJSONObjectIsEmpty() {
+ byte[] rawData = null;
+
+ assertNotNull(RequestJSONDataParser.getJSONFromRawData(rawData));
+ MatcherAssert.assertThat(RequestJSONDataParser.getJSONFromRawData(rawData),
+ CoreMatchers.instanceOf(JSONObject.class));
+
+ rawData = new byte[0];
+
+ assertNotNull(RequestJSONDataParser.getJSONFromRawData(rawData));
+ MatcherAssert.assertThat(RequestJSONDataParser.getJSONFromRawData(rawData),
+ CoreMatchers.instanceOf(JSONObject.class));
+
+ JSONObject jsonFromRawData = RequestJSONDataParser.getJSONFromRawData(rawData);
+ Iterator iterator = jsonFromRawData.keys();
+ assertFalse(iterator.hasNext());
+ }
+
+ public void testGetHTTPRequestParametersInvalidInputReturnNotNull() throws JSONException {
+ byte[] rawData = null;
+
+ RequestAbstractDataParser parser = new RequestJSONDataParser();
+ HttpRequestParameters parameters = parser.getHTTPRequestParameters(rawData);
+
+ assertNotNull(parameters);
+ }
+
+ public void testGetHTTPRequestParametersContainsHeaders() throws JSONException {
+ byte[] rawData = getValidJSONDataAsString().getBytes(Charset.forName("UTF-8"));
+
+ RequestAbstractDataParser parser = new RequestJSONDataParser();
+ HttpRequestParameters parameters = parser.getHTTPRequestParameters(rawData);
+
+ Set<String> headers = parameters.getRequestHeadersKeysSet();
+
+ assertNotNull(headers);
+ assertEquals(HEADERS_COUNT, headers.size());
+ assertTrue(headers.contains(RequestAbstractDataParser.KEY_CONTENT_TYPE));
+ assertTrue(headers.contains(RequestAbstractDataParser.KEY_CHARSET));
+ assertTrue(headers.contains(RequestAbstractDataParser.KEY_CONNECT_TIMEOUT));
+ assertTrue(headers.contains(RequestAbstractDataParser.KEY_DO_INPUT));
+ assertTrue(headers.contains(RequestAbstractDataParser.KEY_DO_OUTPUT));
+ assertTrue(headers.contains(RequestAbstractDataParser.KEY_USE_CACHES));
+ assertTrue(headers.contains(RequestAbstractDataParser.KEY_REQUEST_METHOD));
+ assertTrue(headers.contains(RequestAbstractDataParser.KEY_READ_TIMEOUT));
+ assertTrue(headers.contains(RequestAbstractDataParser.KEY_INSTANCE_FOLLOW_REDIRECTS));
+ assertTrue(headers.contains(RequestAbstractDataParser.KEY_CONTENT_LENGTH));
+ }
+
+ public void testGetHTTPRequestParametersContainsBody() throws JSONException {
+ byte[] rawData = getValidJSONDataAsString().getBytes(Charset.forName("UTF-8"));
+
+ RequestAbstractDataParser parser = new RequestJSONDataParser();
+ HttpRequestParameters parameters = parser.getHTTPRequestParameters(rawData);
+
+ JSONObject body = parameters.getRequestBody();
+
+ assertNotNull(body);
+ }
+
+ public void testGetHTTPRequestParametersContainsBodyWithCorrectData() throws JSONException {
+ byte[] rawData = getValidJSONDataAsString().getBytes(Charset.forName("UTF-8"));
+
+ RequestAbstractDataParser parser = new RequestJSONDataParser();
+ HttpRequestParameters parameters = parser.getHTTPRequestParameters(rawData);
+
+ JSONObject body = parameters.getRequestBody();
+
+ assertNotNull(body);
+ assertTrue(body.has(BODY_KEY));
+ assertEquals("[\"" + BODY_VALUE + "\"]", body.getString(BODY_KEY).replace("\\", ""));
+ }
+
+ public void testGetHTTPRequestParametersContainsRequestMethod() throws JSONException {
+ byte[] rawData = getValidJSONDataAsString().getBytes(Charset.forName("UTF-8"));
+
+ RequestAbstractDataParser parser = new RequestJSONDataParser();
+ HttpRequestParameters parameters = parser.getHTTPRequestParameters(rawData);
+
+ assertEquals(REQUEST_METHOD, parameters.getRequestMethod().toString());
+ }
+
+ private static String getValidJSONDataAsString() {
+ return "{\"HTTPRequest\":{\"headers\":{\"ContentType\":\"application/json\"," +
+ "\"ConnectTimeout\":60,\"DoOutput\":true,\"DoInput\":true,\"UseCaches\":false," +
+ "\"RequestMethod\":\"" + REQUEST_METHOD + "\",\"ReadTimeout\":60,\"InstanceFollowRedirects\":false," +
+ "\"charset\":\"utf-8\",\"Content-Length\":13465},\"body\":\"" + BODY_DATA + "\"}}";
+ }
} \ No newline at end of file
diff --git a/mobile/android/SyncProxyAndroid/androidTest/java/com/ford/syncV4/service/PolicyDataServiceProviderImplTest.java b/mobile/android/SyncProxyAndroid/androidTest/java/com/ford/syncV4/service/PolicyDataServiceProviderImplTest.java
index 72699f01f..e97840bd2 100644
--- a/mobile/android/SyncProxyAndroid/androidTest/java/com/ford/syncV4/service/PolicyDataServiceProviderImplTest.java
+++ b/mobile/android/SyncProxyAndroid/androidTest/java/com/ford/syncV4/service/PolicyDataServiceProviderImplTest.java
@@ -1,11 +1,40 @@
package com.ford.syncV4.service;
+import com.ford.syncV4.net.HttpRequestParameters;
+import com.ford.syncV4.net.IDataDownloader;
+import com.ford.syncV4.net.parser.RequestAbstractDataParser;
+import com.ford.syncV4.net.parser.RequestJSONDataParser;
+
+import junit.framework.TestCase;
+
+import org.mockito.ArgumentCaptor;
+import org.mockito.Mockito;
+
+import static org.mockito.Mockito.mock;
+
+import java.nio.charset.Charset;
+
/**
* Created with Android Studio.
* Author: Chernyshov Yuriy - Mobile Development
* Date: 08.08.14
* Time: 17:13
*/
-public class PolicyDataServiceProviderImplTest {
+public class PolicyDataServiceProviderImplTest extends TestCase {
+
+ private static final String TEST_JSON = "{\"HTTPRequest\":{\"headers\":{\"ContentType\":\"application/json\",\"ConnectTimeout\":60,\"DoOutput\":true,\"DoInput\":true,\"UseCaches\":false,\"RequestMethod\":\"POST\",\"ReadTimeout\":60,\"InstanceFollowRedirects\":false,\"charset\":\"utf-8\",\"Content-Length\":13465},\"body\":\"{\\\"data\\\":[\\\"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\\\"]}\"}}";
+
+ public void testGetPolicyTableUpdateDataExecuteRequestWithCorrectParameters() {
+ String url = "http://www.google.com";
+ RequestAbstractDataParser dataParser = new RequestJSONDataParser();
+ IDataDownloader downloader = mock(IDataDownloader.class);
+ IDataServiceProvider serviceProvider = new PolicyDataServiceProviderImpl(dataParser);
+
+ byte[] responseData = serviceProvider.getPolicyTableUpdateData(downloader, url,
+ TEST_JSON.getBytes(Charset.forName("UTF-8")));
+ ArgumentCaptor<HttpRequestParameters> argumentCaptor =
+ ArgumentCaptor.forClass(HttpRequestParameters.class);
+ Mockito.verify(downloader, Mockito.times(1)).downloadDataFromUri(argumentCaptor.capture());
+ }
} \ No newline at end of file
diff --git a/mobile/android/SyncProxyAndroid/src/main/java/com/ford/syncV4/net/HttpRequestParameters.java b/mobile/android/SyncProxyAndroid/src/main/java/com/ford/syncV4/net/HttpRequestParameters.java
index df7c00595..4f5ee1b84 100644
--- a/mobile/android/SyncProxyAndroid/src/main/java/com/ford/syncV4/net/HttpRequestParameters.java
+++ b/mobile/android/SyncProxyAndroid/src/main/java/com/ford/syncV4/net/HttpRequestParameters.java
@@ -6,6 +6,132 @@ package com.ford.syncV4.net;
* Date: 07.08.14
* Time: 17:38
*/
+
+import android.net.Uri;
+
+import org.json.JSONObject;
+
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Set;
+
+/**
+ * This class contain necessary data for the HTTP Request creation, such as headers, request type,
+ * etc ...
+ */
public class HttpRequestParameters {
+ private static final String LOG_TAG = HttpRequestParameters.class.getSimpleName();
+
+ /**
+ * Enumeration of the supported HTTP requests
+ */
+ public static enum REQUEST_METHOD {
+ POST
+ }
+
+ /**
+ * HTTP request method
+ */
+ private REQUEST_METHOD mRequestMethod = REQUEST_METHOD.POST;
+ /**
+ * HTTP Request body
+ */
+ private JSONObject mRequestBody = new JSONObject();
+ /**
+ * HTTP Request headers
+ */
+ private final Map<String, String> mRequestHeaders = new HashMap<String, String>();
+
+ /**
+ * Uri of the network resource
+ */
+ private Uri mUri = Uri.EMPTY;
+
+ /**
+ * @return HTTP Request method, default one is
+ * {@link com.ford.syncV4.net.HttpRequestParameters.REQUEST_METHOD#POST}
+ */
+ public REQUEST_METHOD getRequestMethod() {
+ return mRequestMethod;
+ }
+
+ /**
+ * Set HTTP Request method
+ *
+ * @param value {@link com.ford.syncV4.net.HttpRequestParameters.REQUEST_METHOD}
+ */
+ public void setRequestMethod(REQUEST_METHOD value) {
+ mRequestMethod = value;
+ }
+
+ /**
+ * @return HTTP Request body, or null if the one does not specified
+ */
+ public JSONObject getRequestBody() {
+ return mRequestBody;
+ }
+
+ /**
+ * Set HTTP Request body
+ *
+ * @param value HTTP Request body as {@link org.json.JSONObject}
+ */
+ public void setRequestBody(JSONObject value) {
+ if (value == null) {
+ throw new NullPointerException(LOG_TAG + " set request body -> value is null");
+ }
+ mRequestBody = value;
+ }
+
+ /**
+ * @return HTTP Request headers keys set
+ */
+ public Set<String> getRequestHeadersKeysSet() {
+ return mRequestHeaders.keySet();
+ }
+
+ /**
+ * @param headerName HTTP request header name
+ *
+ * @return a value of the provided HTTP request header name
+ */
+ public String getHeaderValue(String headerName) {
+ return mRequestHeaders.get(headerName);
+ }
+
+ /**
+ * Set HTTP Request headers as key - value pairs
+ *
+ * @param headerName Name of the header
+ * @param headerValue Value of the header
+ */
+ public void setRequestHeader(String headerName, String headerValue) {
+ if (headerName == null) {
+ throw new NullPointerException(LOG_TAG + " set request headers -> headerName is null");
+ }
+ if (headerValue == null) {
+ throw new NullPointerException(LOG_TAG + " set request headers -> headerValue is null");
+ }
+ mRequestHeaders.put(headerName, headerValue);
+ }
+
+ /**
+ * @return {@link android.net.Uri} of the network resource
+ */
+ public Uri getUri() {
+ return mUri;
+ }
+
+ /**
+ * Set {@link android.net.Uri} of the network resource
+ *
+ * @param value {@link android.net.Uri} of the network resource, can not be null
+ */
+ public void setUri(Uri value) {
+ if (value == null) {
+ throw new NullPointerException(LOG_TAG + " set Uri -> value is null");
+ }
+ this.mUri = value;
+ }
} \ No newline at end of file
diff --git a/mobile/android/SyncProxyAndroid/src/main/java/com/ford/syncV4/net/IDataDownloader.java b/mobile/android/SyncProxyAndroid/src/main/java/com/ford/syncV4/net/IDataDownloader.java
index b06602691..cbd0aeab6 100644
--- a/mobile/android/SyncProxyAndroid/src/main/java/com/ford/syncV4/net/IDataDownloader.java
+++ b/mobile/android/SyncProxyAndroid/src/main/java/com/ford/syncV4/net/IDataDownloader.java
@@ -18,11 +18,10 @@ public interface IDataDownloader {
* Method to download data from network resources by specifying Uri and HTTP requests
* body data
*
- * @param uri {@link android.net.Uri} of the network resource
- * @param requestData data of the HTTP requests body
+ * @param httpRequestParameters HTTP request parameters holder
*
* @return response from the network resource as array of the bytes filled by the data if success
* or empty array of the bytes if any fail occur
*/
- public byte[] downloadDataFromUri(Uri uri, byte[] requestData);
+ public byte[] downloadDataFromUri(HttpRequestParameters httpRequestParameters);
} \ No newline at end of file
diff --git a/mobile/android/SyncProxyAndroid/src/main/java/com/ford/syncV4/net/PolicyDataDownloaderImpl.java b/mobile/android/SyncProxyAndroid/src/main/java/com/ford/syncV4/net/PolicyDataDownloaderImpl.java
index 96b08f1c4..3fb4b0a95 100644
--- a/mobile/android/SyncProxyAndroid/src/main/java/com/ford/syncV4/net/PolicyDataDownloaderImpl.java
+++ b/mobile/android/SyncProxyAndroid/src/main/java/com/ford/syncV4/net/PolicyDataDownloaderImpl.java
@@ -1,7 +1,6 @@
package com.ford.syncV4.net;
-import android.net.Uri;
-
+import com.ford.syncV4.net.parser.RequestAbstractDataParser;
import com.ford.syncV4.util.logger.Logger;
import org.apache.http.HttpEntity;
@@ -10,10 +9,11 @@ import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpEntityEnclosingRequestBase;
import org.apache.http.client.methods.HttpPost;
-import org.apache.http.entity.ByteArrayEntity;
+import org.apache.http.entity.InputStreamEntity;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.util.EntityUtils;
+import java.io.ByteArrayInputStream;
import java.io.IOException;
/**
@@ -31,24 +31,42 @@ public class PolicyDataDownloaderImpl implements IDataDownloader {
private static final String LOG_TAG = PolicyDataDownloaderImpl.class.getSimpleName();
- private static final String HEADER_CONTENT_TYPE = "Content-Type";
- private static final String HEADER_CONTENT_LENGTH = "Content-Length";
- private static final String HEADER_CHAR_SET = "charset";
+ @Override
+ public byte[] downloadDataFromUri(HttpRequestParameters httpRequestParameters) {
- private static final String HEADER_CONTENT_TYPE_JSON = "application/json";
- private static final String HEADER_CHAR_SET_UTF_8 = "utf-8";
+ String url = httpRequestParameters.getUri().toString();
+ Logger.d(LOG_TAG + " Request url:" + url);
- @Override
- public byte[] downloadDataFromUri(Uri uri, byte[] requestData) {
- if (uri == null) {
- throw new NullPointerException(LOG_TAG + " downloadDataFromUri -> uri is null");
+ HttpEntityEnclosingRequestBase request = null;
+
+ if (httpRequestParameters.getRequestMethod() == HttpRequestParameters.REQUEST_METHOD.POST) {
+ request = new HttpPost(url);
+ }
+
+ if (request == null) {
+ Logger.w(LOG_TAG + " downloadDataFromUri -> request is null, " +
+ "method:" + httpRequestParameters.getRequestMethod());
+ return new byte[0];
}
- HttpPost request = new HttpPost(uri.toString());
- request.setHeader(HEADER_CONTENT_TYPE, HEADER_CONTENT_TYPE_JSON);
- request.setHeader(HEADER_CONTENT_LENGTH, String.valueOf(requestData.length));
- request.setHeader(HEADER_CHAR_SET, HEADER_CHAR_SET_UTF_8);
- request.setEntity(new ByteArrayEntity(requestData));
+
+ for (String headerName : httpRequestParameters.getRequestHeadersKeysSet()) {
+ // We don't need to set a length of the data as it may be wrong
+ if (headerName.equals(RequestAbstractDataParser.KEY_CONTENT_LENGTH)) {
+ continue;
+ }
+ //Logger.d(LOG_TAG + " Request header " +
+ // "'" + headerName + ":" + httpRequestParameters.getHeaderValue(headerName) + "'");
+ request.setHeader(headerName, httpRequestParameters.getHeaderValue(headerName));
+ }
+
HttpClient httpClient = new DefaultHttpClient();
+ String jsonString = httpRequestParameters.getRequestBody().toString();
+ InputStreamEntity reqEntity =
+ new InputStreamEntity(new ByteArrayInputStream(jsonString.getBytes()),
+ jsonString.length());
+ reqEntity.setContentType("application/json");
+ request.setEntity(reqEntity);
+
try {
HttpResponse httpResponse = httpClient.execute(request);
Logger.d(LOG_TAG + " Response code: " + httpResponse.getStatusLine().getStatusCode());
@@ -64,7 +82,7 @@ public class PolicyDataDownloaderImpl implements IDataDownloader {
}
}
} catch (ClientProtocolException e) {
- Logger.e(LOG_TAG + " ClientProtocolException: " + e.getMessage());
+ Logger.e(LOG_TAG + " ClientProtocolException: " + e);
} catch (IOException e) {
Logger.e(LOG_TAG + " IOException: " + e.getMessage());
}
diff --git a/mobile/android/SyncProxyAndroid/src/main/java/com/ford/syncV4/net/parser/RequestAbstractDataParser.java b/mobile/android/SyncProxyAndroid/src/main/java/com/ford/syncV4/net/parser/RequestAbstractDataParser.java
index cdcb5b0f8..83a0a9f4b 100644
--- a/mobile/android/SyncProxyAndroid/src/main/java/com/ford/syncV4/net/parser/RequestAbstractDataParser.java
+++ b/mobile/android/SyncProxyAndroid/src/main/java/com/ford/syncV4/net/parser/RequestAbstractDataParser.java
@@ -9,6 +9,8 @@ package com.ford.syncV4.net.parser;
import com.ford.syncV4.net.HttpRequestParameters;
+import org.json.JSONException;
+
/**
* This class provides a functionality for the HTTP request data extraction from SDL message
*/
@@ -28,7 +30,7 @@ public abstract class RequestAbstractDataParser {
protected static final String KEY_READ_TIMEOUT = "ReadTimeout";
protected static final String KEY_INSTANCE_FOLLOW_REDIRECTS = "InstanceFollowRedirects";
protected static final String KEY_CHARSET = "charset";
- protected static final String KEY_CONTENT_LENGTH = "Content-Length";
+ public static final String KEY_CONTENT_LENGTH = "Content-Length";
protected static final String KEY_BODY = "body";
/**
@@ -38,5 +40,5 @@ public abstract class RequestAbstractDataParser {
*
* @return instance of the {@link com.ford.syncV4.net.HttpRequestParameters} object
*/
- public abstract HttpRequestParameters getHTTPRequestParameters(byte[] incomingData);
+ public abstract HttpRequestParameters getHTTPRequestParameters(byte[] incomingData) throws JSONException;
} \ No newline at end of file
diff --git a/mobile/android/SyncProxyAndroid/src/main/java/com/ford/syncV4/net/parser/RequestJSONDataParser.java b/mobile/android/SyncProxyAndroid/src/main/java/com/ford/syncV4/net/parser/RequestJSONDataParser.java
index 3c3ea4484..b43ebd72c 100644
--- a/mobile/android/SyncProxyAndroid/src/main/java/com/ford/syncV4/net/parser/RequestJSONDataParser.java
+++ b/mobile/android/SyncProxyAndroid/src/main/java/com/ford/syncV4/net/parser/RequestJSONDataParser.java
@@ -1,11 +1,120 @@
package com.ford.syncV4.net.parser;
+import com.ford.syncV4.net.HttpRequestParameters;
+import com.ford.syncV4.util.StringUtils;
+import com.ford.syncV4.util.logger.Logger;
+
+import org.json.JSONException;
+import org.json.JSONObject;
+
+import java.util.Iterator;
+
/**
* Created with Android Studio.
* Author: Chernyshov Yuriy - Mobile Development
* Date: 08.08.14
* Time: 9:52
*/
-public class RequestJSONDataParser {
+/**
+ * This class is providing functionality to parse incoming from SDL data into
+ * {@link com.ford.syncV4.net.HttpRequestParameters} assuming that data of the request is
+ * providing in the JSON format
+ */
+public class RequestJSONDataParser extends RequestAbstractDataParser {
+
+ @SuppressWarnings("unused")
+ protected static final String LOG_TAG = RequestJSONDataParser.class.getSimpleName();
+
+ @Override
+ public HttpRequestParameters getHTTPRequestParameters(byte[] incomingData) throws JSONException {
+ HttpRequestParameters httpRequestParameters = new HttpRequestParameters();
+ JSONObject jsonObject = getJSONFromRawData(incomingData);
+
+ if (!jsonObject.has(KEY_HTTP_REQUEST)) {
+ Logger.w(LOG_TAG + " getHTTPRequestParameters there is no " + KEY_HTTP_REQUEST + " key");
+ return httpRequestParameters;
+ }
+
+ JSONObject httpRequest = jsonObject.getJSONObject(KEY_HTTP_REQUEST);
+
+ if (!httpRequest.has(KEY_HEADERS)) {
+ Logger.w(LOG_TAG + " getHTTPRequestParameters there is no " + KEY_HEADERS + " key");
+ return httpRequestParameters;
+ }
+
+ parseHeaders(httpRequestParameters, httpRequest.getJSONObject(KEY_HEADERS));
+
+ if (!httpRequest.has(KEY_BODY)) {
+ Logger.w(LOG_TAG + " getHTTPRequestParameters there is no " + KEY_BODY + " key");
+ return httpRequestParameters;
+ }
+
+ httpRequestParameters.setRequestBody(new JSONObject(httpRequest.getString(KEY_BODY)));
+
+ return httpRequestParameters;
+ }
+
+ /**
+ * Convert raw data into {@link org.json.JSONObject}
+ *
+ * @param rawData raw data as bytes array object which is extracted from the SDLs message
+ *
+ * @return a {@link org.json.JSONObject} converted from bytes array
+ */
+ protected static JSONObject getJSONFromRawData(byte[] rawData) {
+ JSONObject jsonObject = new JSONObject();
+ if (rawData == null) {
+ Logger.w(LOG_TAG + " Raw data is null");
+ return jsonObject;
+ }
+
+ if (rawData.length == 0) {
+ Logger.w(LOG_TAG + " Raw data is empty");
+ return jsonObject;
+ }
+
+ try {
+ String string = getStringFromBytesArray(rawData);
+ jsonObject = new JSONObject(string);
+ } catch (JSONException e) {
+ Logger.e(LOG_TAG + " Create JSON error:" + e.getMessage());
+ }
+ return jsonObject;
+ }
+
+ /**
+ * Convert {@link org.json.JSONObject} into {@link org.json.JSONArray}
+ *
+ * @param jsonObject input data as {@link org.json.JSONObject}
+ *
+ * @return a {@link org.json.JSONArray} of the headers
+ */
+ protected void parseHeaders(HttpRequestParameters httpRequestParameters,
+ JSONObject jsonObject) throws JSONException {
+ final Iterator<String> iterator = jsonObject.keys();
+ String headerName;
+ while (iterator.hasNext()) {
+ headerName = iterator.next();
+ if (StringUtils.isEmpty(headerName)) {
+ continue;
+ }
+ httpRequestParameters.setRequestHeader(headerName, jsonObject.getString(headerName));
+ }
+ }
+
+ /**
+ * Convert bytes array into String
+ *
+ * @param bytesArray raw data as bytes array object
+ *
+ * @return a String converted from bytes array, an empty String is the incoming data is in
+ * incorrect format (for example a null) or is the is an error occur
+ */
+ private static String getStringFromBytesArray(byte[] bytesArray) {
+ if (bytesArray == null) {
+ return "";
+ }
+ return new String(bytesArray);
+ }
} \ No newline at end of file
diff --git a/mobile/android/SyncProxyAndroid/src/main/java/com/ford/syncV4/proxy/systemrequest/OnSystemRequestHandlerImpl.java b/mobile/android/SyncProxyAndroid/src/main/java/com/ford/syncV4/proxy/systemrequest/OnSystemRequestHandlerImpl.java
index a1bac7ad8..72e28b5ff 100644
--- a/mobile/android/SyncProxyAndroid/src/main/java/com/ford/syncV4/proxy/systemrequest/OnSystemRequestHandlerImpl.java
+++ b/mobile/android/SyncProxyAndroid/src/main/java/com/ford/syncV4/proxy/systemrequest/OnSystemRequestHandlerImpl.java
@@ -1,12 +1,13 @@
package com.ford.syncV4.proxy.systemrequest;
-import android.net.Uri;
import android.os.Handler;
import android.os.Looper;
import com.ford.syncV4.exception.SyncException;
import com.ford.syncV4.net.IDataDownloader;
import com.ford.syncV4.net.PolicyDataDownloaderImpl;
+import com.ford.syncV4.net.parser.RequestAbstractDataParser;
+import com.ford.syncV4.net.parser.RequestJSONDataParser;
import com.ford.syncV4.proxy.policy.PolicyFilesManager;
import com.ford.syncV4.proxy.rpc.OnSystemRequest;
import com.ford.syncV4.proxy.rpc.enums.FileType;
@@ -122,29 +123,46 @@ public class OnSystemRequestHandlerImpl implements IOnSystemRequestHandler {
final RequestType requestType = onSystemRequest.getRequestType();
if (data == null) {
- mCallback.onError(appId, "Policy Snapshot data is null");
+ mCallback.onError(appId, " Policy Snapshot data is null");
return;
}
+ // TODO : Temporary solution
+ Vector<String> test_urls = new Vector<String>(1);
+ test_urls.add("http://policies.telematicsqa.ford.com/api/policies");
+ onSystemRequest.setUrl(test_urls);
+
Vector<String> urls = onSystemRequest.getUrl();
if (urls == null) {
- mCallback.onError(appId, "Policy Snapshot url is null");
+ mCallback.onError(appId, " Policy Snapshot url is null");
return;
}
if (urls.isEmpty()) {
- mCallback.onError(appId, "Policy Snapshot url is empty");
+ mCallback.onError(appId, " Policy Snapshot url is empty");
return;
}
String url = onSystemRequest.getUrl().get(0);
- mCallback.onSuccess(appId, "Policy Table Snapshot download request");
+ // TEST SECTION - START
+ //url = "http://policies.telematicsqa.ford.com/api/policies";
+ //onSystemRequest.setBulkData(TEST_JSON.getBytes(Charset.forName("UTF-8")));
+ // TEST SECTION - END
+
+ mCallback.onSuccess(appId, "Policy Table Snapshot download request ...");
+ RequestAbstractDataParser dataParser = new RequestJSONDataParser();
IDataDownloader downloader = new PolicyDataDownloaderImpl();
- IDataServiceProvider serviceProvider = new PolicyDataServiceProviderImpl();
- byte[] responseData = serviceProvider.getPolicyTableUpdateData(downloader, Uri.parse(url),
+ IDataServiceProvider serviceProvider = new PolicyDataServiceProviderImpl(dataParser);
+ byte[] responseData = serviceProvider.getPolicyTableUpdateData(downloader, url,
onSystemRequest.getBulkData());
+ if (responseData == null) {
+ mCallback.onSuccess(appId, "Policy Table Snapshot download complete, data null");
+ } else {
+ mCallback.onSuccess(appId, "Policy Table Snapshot download complete, data size:" + responseData.length);
+ }
+
// Test Config:
if (mTestConfig != null) {
if (mTestConfig.isDoOverridePolicyTableUpdateData()) {
@@ -155,4 +173,6 @@ public class OnSystemRequestHandlerImpl implements IOnSystemRequestHandler {
PolicyFilesManager.sendPolicyTableUpdate(appId, proxy, fileType, requestType, responseData,
mCallback);
}
+
+ //private static final String TEST_JSON = "{\"HTTPRequest\":{\"headers\":{\"ContentType\":\"application/json\",\"ConnectTimeout\":60,\"DoOutput\":true,\"DoInput\":true,\"UseCaches\":false,\"RequestMethod\":\"POST\",\"ReadTimeout\":60,\"InstanceFollowRedirects\":false,\"charset\":\"utf-8\",\"Content-Length\":13465},\"body\":\"{\\\"data\\\":[\\\"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\\\"]}\"}}";
} \ No newline at end of file
diff --git a/mobile/android/SyncProxyAndroid/src/main/java/com/ford/syncV4/service/IDataServiceProvider.java b/mobile/android/SyncProxyAndroid/src/main/java/com/ford/syncV4/service/IDataServiceProvider.java
index 309422f0b..b74e886cd 100644
--- a/mobile/android/SyncProxyAndroid/src/main/java/com/ford/syncV4/service/IDataServiceProvider.java
+++ b/mobile/android/SyncProxyAndroid/src/main/java/com/ford/syncV4/service/IDataServiceProvider.java
@@ -2,6 +2,7 @@ package com.ford.syncV4.service;
import android.net.Uri;
+import com.ford.syncV4.net.HttpRequestParameters;
import com.ford.syncV4.net.IDataDownloader;
/**
@@ -24,11 +25,11 @@ public interface IDataServiceProvider {
*
* @param dataDownloader implementation of the {@link com.ford.syncV4.net.IDataDownloader}
* interface
- * @param uri Uri of the network resource
- * @param requestData bytes array of the request body
+ * @param url network resource Url
+ * @param incomingData bytes array of the incoming from SDL message
*
* @return bytes array
*/
- public byte[] getPolicyTableUpdateData(IDataDownloader dataDownloader, Uri uri,
- byte[] requestData);
+ public byte[] getPolicyTableUpdateData(IDataDownloader dataDownloader, String url,
+ byte[] incomingData);
} \ No newline at end of file
diff --git a/mobile/android/SyncProxyAndroid/src/main/java/com/ford/syncV4/service/PolicyDataServiceProviderImpl.java b/mobile/android/SyncProxyAndroid/src/main/java/com/ford/syncV4/service/PolicyDataServiceProviderImpl.java
index b222b3d89..ce9df3e89 100644
--- a/mobile/android/SyncProxyAndroid/src/main/java/com/ford/syncV4/service/PolicyDataServiceProviderImpl.java
+++ b/mobile/android/SyncProxyAndroid/src/main/java/com/ford/syncV4/service/PolicyDataServiceProviderImpl.java
@@ -2,7 +2,13 @@ package com.ford.syncV4.service;
import android.net.Uri;
+import com.ford.syncV4.net.HttpRequestParameters;
import com.ford.syncV4.net.IDataDownloader;
+import com.ford.syncV4.net.parser.RequestAbstractDataParser;
+import com.ford.syncV4.util.StringUtils;
+import com.ford.syncV4.util.logger.Logger;
+
+import org.json.JSONException;
/**
* Created with Android Studio.
@@ -20,13 +26,38 @@ public class PolicyDataServiceProviderImpl implements IDataServiceProvider {
private static final String LOG_TAG = PolicyDataServiceProviderImpl.class.getSimpleName();
+ private RequestAbstractDataParser mDataParser;
+
+ public PolicyDataServiceProviderImpl(RequestAbstractDataParser dataParser) {
+ if (dataParser == null) {
+ throw new NullPointerException(LOG_TAG + " Constructor -> data parser is null");
+ }
+ mDataParser = dataParser;
+ }
+
@Override
- public byte[] getPolicyTableUpdateData(IDataDownloader dataDownloader, Uri uri,
- byte[] requestData) {
+ public byte[] getPolicyTableUpdateData(IDataDownloader dataDownloader, String url,
+ byte[] incomingData) {
if (dataDownloader == null) {
throw new NullPointerException(LOG_TAG + " getPolicyTableUpdateData -> " +
"downloader is null");
}
- return dataDownloader.downloadDataFromUri(uri, requestData);
+
+ HttpRequestParameters parameters;
+ byte[] responseData = new byte[0];
+
+ try {
+ parameters = mDataParser.getHTTPRequestParameters(incomingData);
+ } catch (JSONException e) {
+ Logger.e(LOG_TAG + " getPolicyTableUpdateData:" + e.getMessage());
+
+ return responseData;
+ }
+
+ if (StringUtils.isEmpty(parameters.getUri().toString())) {
+ parameters.setUri(Uri.parse(url));
+ }
+
+ return dataDownloader.downloadDataFromUri(parameters);
}
} \ No newline at end of file