From ad5ee648aecb640efb17ac7285364a86090e9832 Mon Sep 17 00:00:00 2001 From: Shy-Yauer Lin Date: Wed, 7 Oct 2015 14:16:17 -0700 Subject: [PATCH 1/3] [android] Remove ParseRequest defaultClient We do not need defaultClient as a global state in class ParseRequest anymore. --- Parse/src/main/java/com/parse/Parse.java | 1 - .../main/java/com/parse/ParseRESTCommand.java | 4 +++ .../src/main/java/com/parse/ParseRequest.java | 32 ------------------- 3 files changed, 4 insertions(+), 33 deletions(-) diff --git a/Parse/src/main/java/com/parse/Parse.java b/Parse/src/main/java/com/parse/Parse.java index 62fd165d5..c2d5454a0 100644 --- a/Parse/src/main/java/com/parse/Parse.java +++ b/Parse/src/main/java/com/parse/Parse.java @@ -193,7 +193,6 @@ public static void initialize(Context context, String applicationId, String clie ParseHttpClient.setKeepAlive(true); ParseHttpClient.setMaxConnections(20); - ParseRequest.setDefaultClient(ParsePlugins.get().restClient()); // If we have interceptors in list, we have to initialize all http clients and add interceptors if (interceptors != null) { initializeParseHttpClientsWithParseNetworkInterceptors(); diff --git a/Parse/src/main/java/com/parse/ParseRESTCommand.java b/Parse/src/main/java/com/parse/ParseRESTCommand.java index 47ae77d18..8d554536b 100644 --- a/Parse/src/main/java/com/parse/ParseRESTCommand.java +++ b/Parse/src/main/java/com/parse/ParseRESTCommand.java @@ -249,6 +249,10 @@ protected ParseHttpBody newBody(ProgressCallback uploadProgressCallback) { } } + public Task executeAsync() { + return executeAsync(ParsePlugins.get().restClient()); + } + @Override public Task executeAsync( final ParseHttpClient client, diff --git a/Parse/src/main/java/com/parse/ParseRequest.java b/Parse/src/main/java/com/parse/ParseRequest.java index b1fef304b..68bf5e4af 100644 --- a/Parse/src/main/java/com/parse/ParseRequest.java +++ b/Parse/src/main/java/com/parse/ParseRequest.java @@ -70,21 +70,6 @@ private static ThreadPoolExecutor newThreadPoolExecutor(int corePoolSize, int ma private static long defaultInitialRetryDelay = DEFAULT_INITIAL_RETRY_DELAY; - // TODO(grantland): Remove once we're able to inject a http client into all of our controllers - // and we don't need this for mocking anymore. - private static ParseHttpClient defaultClient = null; - @Deprecated - public static void setDefaultClient(ParseHttpClient client) { - defaultClient = client; - } - @Deprecated - public static ParseHttpClient getDefaultClient() { - if (defaultClient == null) { - throw new IllegalStateException("Can't send Parse HTTPS request before Parse.initialize()"); - } - return defaultClient; - } - public static void setDefaultInitialRetryDelay(long delay) { defaultInitialRetryDelay = delay; } @@ -167,23 +152,6 @@ public Task then(Task task) throws Exception { protected abstract Task onResponseAsync(ParseHttpResponse response, ProgressCallback downloadProgressCallback); - @Deprecated - public Task executeAsync() { - return executeAsync(getDefaultClient()); - } - - @Deprecated - public Task executeAsync( - ProgressCallback uploadProgressCallback, - ProgressCallback downloadProgressCallback, - Task cancellationToken) { - return executeAsync( - getDefaultClient(), - uploadProgressCallback, - downloadProgressCallback, - cancellationToken); - } - /* * Starts retrying the block. */ From 62f2257a0fff88251b57000be4e68612fe240b1d Mon Sep 17 00:00:00 2001 From: Shy-Yauer Lin Date: Wed, 7 Oct 2015 16:07:31 -0700 Subject: [PATCH 2/3] Enforce user pass proper httpClient for better testability. --- Parse/src/main/java/com/parse/Parse.java | 6 +++--- Parse/src/main/java/com/parse/ParseCommandCache.java | 6 ++++-- .../src/main/java/com/parse/ParseEventuallyQueue.java | 10 ++++++++++ Parse/src/main/java/com/parse/ParseObject.java | 8 +++++--- .../java/com/parse/ParsePinningEventuallyQueue.java | 7 ++++--- Parse/src/main/java/com/parse/ParseRESTCommand.java | 4 ---- 6 files changed, 26 insertions(+), 15 deletions(-) diff --git a/Parse/src/main/java/com/parse/Parse.java b/Parse/src/main/java/com/parse/Parse.java index c2d5454a0..7a45a28aa 100644 --- a/Parse/src/main/java/com/parse/Parse.java +++ b/Parse/src/main/java/com/parse/Parse.java @@ -414,14 +414,14 @@ static void checkCacheApplicationId() { || (!isLocalDatastoreEnabled && eventuallyQueue instanceof ParsePinningEventuallyQueue)) { checkContext(); eventuallyQueue = isLocalDatastoreEnabled - ? new ParsePinningEventuallyQueue(context) - : new ParseCommandCache(context); + ? new ParsePinningEventuallyQueue(context, ParsePlugins.get().restClient()) + : new ParseCommandCache(context, ParsePlugins.get().restClient()); // We still need to clear out the old command cache even if we're using Pinning in case // anything is left over when the user upgraded. Checking number of pending and then // initializing should be enough. if (isLocalDatastoreEnabled && ParseCommandCache.getPendingCount() > 0) { - new ParseCommandCache(context); + new ParseCommandCache(context, ParsePlugins.get().restClient()); } } return eventuallyQueue; diff --git a/Parse/src/main/java/com/parse/ParseCommandCache.java b/Parse/src/main/java/com/parse/ParseCommandCache.java index 2ca798839..1b166c441 100644 --- a/Parse/src/main/java/com/parse/ParseCommandCache.java +++ b/Parse/src/main/java/com/parse/ParseCommandCache.java @@ -121,8 +121,10 @@ public Void call() throws Exception { } }; - public ParseCommandCache(Context context) { + public ParseCommandCache(Context context, ParseHttpClient client) { setConnected(false); + setHttpClient(client); + shouldStop = false; running = false; @@ -526,7 +528,7 @@ private void maybeRunAllCommandsNow(int retriesRemaining) { } notifyTestHelper(TestHelper.COMMAND_OLD_FORMAT_DISCARDED); } else { - commandTask = command.executeAsync().continueWithTask(new Continuation>() { + commandTask = command.executeAsync(getHttpClient()).continueWithTask(new Continuation>() { @Override public Task then(Task task) throws Exception { String localId = command.getLocalId(); diff --git a/Parse/src/main/java/com/parse/ParseEventuallyQueue.java b/Parse/src/main/java/com/parse/ParseEventuallyQueue.java index 82dd238a6..0c800deda 100644 --- a/Parse/src/main/java/com/parse/ParseEventuallyQueue.java +++ b/Parse/src/main/java/com/parse/ParseEventuallyQueue.java @@ -30,6 +30,16 @@ */ private TestHelper testHelper; + private ParseHttpClient httpClient; + + protected void setHttpClient(ParseHttpClient client) { + httpClient = client; + } + + protected ParseHttpClient getHttpClient() { + return httpClient; + } + public abstract void onDestroy(); public void setConnected(boolean connected) { diff --git a/Parse/src/main/java/com/parse/ParseObject.java b/Parse/src/main/java/com/parse/ParseObject.java index c1a0096e2..e062d0a59 100644 --- a/Parse/src/main/java/com/parse/ParseObject.java +++ b/Parse/src/main/java/com/parse/ParseObject.java @@ -1660,11 +1660,13 @@ public Task then(Task task) throws Exception { // Currently only used by ParsePinningEventuallyQueue for saveEventually due to the limitation in // ParseCommandCache that it can only return JSONObject result. - /* package */ Task saveAsync(final ParseOperationSet operationSet, String sessionToken) - throws ParseException { + /* package */ Task saveAsync( + final ParseOperationSet operationSet, + String sessionToken, + ParseHttpClient client) throws ParseException { final ParseRESTCommand command = currentSaveEventuallyCommand(operationSet, PointerEncoder.get(), sessionToken); - return command.executeAsync(); + return command.executeAsync(client); } /** diff --git a/Parse/src/main/java/com/parse/ParsePinningEventuallyQueue.java b/Parse/src/main/java/com/parse/ParsePinningEventuallyQueue.java index 956f527af..a52b8c442 100644 --- a/Parse/src/main/java/com/parse/ParsePinningEventuallyQueue.java +++ b/Parse/src/main/java/com/parse/ParsePinningEventuallyQueue.java @@ -84,8 +84,9 @@ public void networkConnectivityStatusChanged(Context context, Intent intent) { } }; - public ParsePinningEventuallyQueue(Context context) { + public ParsePinningEventuallyQueue(Context context, ParseHttpClient client) { setConnected(ConnectivityNotifier.isConnected(context)); + setHttpClient(client); notifier = ConnectivityNotifier.getNotifier(context); notifier.addListener(listener); @@ -492,7 +493,7 @@ public Task then(Task task) throws Exception { Task executeTask; if (type == EventuallyPin.TYPE_SAVE) { - executeTask = object.saveAsync(operationSet, sessionToken); + executeTask = object.saveAsync(operationSet, sessionToken, getHttpClient()); } else if (type == EventuallyPin.TYPE_DELETE) { executeTask = object.deleteAsync(sessionToken).cast(); } else { // else if (type == EventuallyPin.TYPE_COMMAND) { @@ -501,7 +502,7 @@ public Task then(Task task) throws Exception { executeTask = Task.forResult(null); notifyTestHelper(TestHelper.COMMAND_OLD_FORMAT_DISCARDED); } else { - executeTask = command.executeAsync(); + executeTask = command.executeAsync(getHttpClient()); } } diff --git a/Parse/src/main/java/com/parse/ParseRESTCommand.java b/Parse/src/main/java/com/parse/ParseRESTCommand.java index 8d554536b..47ae77d18 100644 --- a/Parse/src/main/java/com/parse/ParseRESTCommand.java +++ b/Parse/src/main/java/com/parse/ParseRESTCommand.java @@ -249,10 +249,6 @@ protected ParseHttpBody newBody(ProgressCallback uploadProgressCallback) { } } - public Task executeAsync() { - return executeAsync(ParsePlugins.get().restClient()); - } - @Override public Task executeAsync( final ParseHttpClient client, From 4d257944dc1ac9f6011005f7c9d1cb5ab259fb01 Mon Sep 17 00:00:00 2001 From: Shy-Yauer Lin Date: Wed, 7 Oct 2015 17:23:25 -0700 Subject: [PATCH 3/3] change some nit --- Parse/src/main/java/com/parse/Parse.java | 7 ++++--- Parse/src/main/java/com/parse/ParseCommandCache.java | 6 ++++-- .../src/main/java/com/parse/ParseEventuallyQueue.java | 10 ---------- Parse/src/main/java/com/parse/ParseObject.java | 4 ++-- .../java/com/parse/ParsePinningEventuallyQueue.java | 8 +++++--- 5 files changed, 15 insertions(+), 20 deletions(-) diff --git a/Parse/src/main/java/com/parse/Parse.java b/Parse/src/main/java/com/parse/Parse.java index 7a45a28aa..d8ef78db5 100644 --- a/Parse/src/main/java/com/parse/Parse.java +++ b/Parse/src/main/java/com/parse/Parse.java @@ -413,15 +413,16 @@ static void checkCacheApplicationId() { || (isLocalDatastoreEnabled && eventuallyQueue instanceof ParseCommandCache) || (!isLocalDatastoreEnabled && eventuallyQueue instanceof ParsePinningEventuallyQueue)) { checkContext(); + ParseHttpClient httpClient = ParsePlugins.get().restClient(); eventuallyQueue = isLocalDatastoreEnabled - ? new ParsePinningEventuallyQueue(context, ParsePlugins.get().restClient()) - : new ParseCommandCache(context, ParsePlugins.get().restClient()); + ? new ParsePinningEventuallyQueue(context, httpClient) + : new ParseCommandCache(context, httpClient); // We still need to clear out the old command cache even if we're using Pinning in case // anything is left over when the user upgraded. Checking number of pending and then // initializing should be enough. if (isLocalDatastoreEnabled && ParseCommandCache.getPendingCount() > 0) { - new ParseCommandCache(context, ParsePlugins.get().restClient()); + new ParseCommandCache(context, httpClient); } } return eventuallyQueue; diff --git a/Parse/src/main/java/com/parse/ParseCommandCache.java b/Parse/src/main/java/com/parse/ParseCommandCache.java index 1b166c441..354d43fd8 100644 --- a/Parse/src/main/java/com/parse/ParseCommandCache.java +++ b/Parse/src/main/java/com/parse/ParseCommandCache.java @@ -90,6 +90,8 @@ public static int getPendingCount() { private Logger log; // Why is there a custom logger? To prevent Mockito deadlock! + private final ParseHttpClient httpClient; + ConnectivityNotifier notifier; ConnectivityNotifier.ConnectivityListener listener = new ConnectivityNotifier.ConnectivityListener() { @Override @@ -123,12 +125,12 @@ public Void call() throws Exception { public ParseCommandCache(Context context, ParseHttpClient client) { setConnected(false); - setHttpClient(client); shouldStop = false; running = false; runningLock = new Object(); + httpClient = client; log = Logger.getLogger(TAG); @@ -528,7 +530,7 @@ private void maybeRunAllCommandsNow(int retriesRemaining) { } notifyTestHelper(TestHelper.COMMAND_OLD_FORMAT_DISCARDED); } else { - commandTask = command.executeAsync(getHttpClient()).continueWithTask(new Continuation>() { + commandTask = command.executeAsync(httpClient).continueWithTask(new Continuation>() { @Override public Task then(Task task) throws Exception { String localId = command.getLocalId(); diff --git a/Parse/src/main/java/com/parse/ParseEventuallyQueue.java b/Parse/src/main/java/com/parse/ParseEventuallyQueue.java index 0c800deda..82dd238a6 100644 --- a/Parse/src/main/java/com/parse/ParseEventuallyQueue.java +++ b/Parse/src/main/java/com/parse/ParseEventuallyQueue.java @@ -30,16 +30,6 @@ */ private TestHelper testHelper; - private ParseHttpClient httpClient; - - protected void setHttpClient(ParseHttpClient client) { - httpClient = client; - } - - protected ParseHttpClient getHttpClient() { - return httpClient; - } - public abstract void onDestroy(); public void setConnected(boolean connected) { diff --git a/Parse/src/main/java/com/parse/ParseObject.java b/Parse/src/main/java/com/parse/ParseObject.java index e062d0a59..36193bd6b 100644 --- a/Parse/src/main/java/com/parse/ParseObject.java +++ b/Parse/src/main/java/com/parse/ParseObject.java @@ -1661,9 +1661,9 @@ public Task then(Task task) throws Exception { // Currently only used by ParsePinningEventuallyQueue for saveEventually due to the limitation in // ParseCommandCache that it can only return JSONObject result. /* package */ Task saveAsync( + ParseHttpClient client, final ParseOperationSet operationSet, - String sessionToken, - ParseHttpClient client) throws ParseException { + String sessionToken) throws ParseException { final ParseRESTCommand command = currentSaveEventuallyCommand(operationSet, PointerEncoder.get(), sessionToken); return command.executeAsync(client); diff --git a/Parse/src/main/java/com/parse/ParsePinningEventuallyQueue.java b/Parse/src/main/java/com/parse/ParsePinningEventuallyQueue.java index a52b8c442..d6bc90d74 100644 --- a/Parse/src/main/java/com/parse/ParsePinningEventuallyQueue.java +++ b/Parse/src/main/java/com/parse/ParsePinningEventuallyQueue.java @@ -69,6 +69,7 @@ */ private Task.TaskCompletionSource connectionTaskCompletionSource = Task.create(); private final Object connectionLock = new Object(); + private final ParseHttpClient httpClient; private ConnectivityNotifier notifier; private ConnectivityNotifier.ConnectivityListener listener = new ConnectivityNotifier.ConnectivityListener() { @@ -86,7 +87,8 @@ public void networkConnectivityStatusChanged(Context context, Intent intent) { public ParsePinningEventuallyQueue(Context context, ParseHttpClient client) { setConnected(ConnectivityNotifier.isConnected(context)); - setHttpClient(client); + + httpClient = client; notifier = ConnectivityNotifier.getNotifier(context); notifier.addListener(listener); @@ -493,7 +495,7 @@ public Task then(Task task) throws Exception { Task executeTask; if (type == EventuallyPin.TYPE_SAVE) { - executeTask = object.saveAsync(operationSet, sessionToken, getHttpClient()); + executeTask = object.saveAsync(httpClient, operationSet, sessionToken); } else if (type == EventuallyPin.TYPE_DELETE) { executeTask = object.deleteAsync(sessionToken).cast(); } else { // else if (type == EventuallyPin.TYPE_COMMAND) { @@ -502,7 +504,7 @@ public Task then(Task task) throws Exception { executeTask = Task.forResult(null); notifyTestHelper(TestHelper.COMMAND_OLD_FORMAT_DISCARDED); } else { - executeTask = command.executeAsync(getHttpClient()); + executeTask = command.executeAsync(httpClient); } }