From a102f5baacde3a8fd2f991120dc12ef14d53d0bf Mon Sep 17 00:00:00 2001 From: John Date: Wed, 24 Jan 2018 10:52:47 -0600 Subject: [PATCH 1/5] Remove ParsePlugins abstraction to Android, since that is our only target --- Parse/src/main/java/com/parse/Parse.java | 8 +- .../src/main/java/com/parse/ParsePlugins.java | 119 ++++++------------ .../src/main/java/com/parse/PushService.java | 2 +- .../main/java/com/parse/PushServiceApi26.java | 8 +- .../java/com/parse/ParseCorePluginsTest.java | 2 +- .../java/com/parse/ParseInstallationTest.java | 2 +- .../test/java/com/parse/PushServiceTest.java | 12 +- 7 files changed, 50 insertions(+), 103 deletions(-) diff --git a/Parse/src/main/java/com/parse/Parse.java b/Parse/src/main/java/com/parse/Parse.java index 862d1671d..3b6d82ab6 100644 --- a/Parse/src/main/java/com/parse/Parse.java +++ b/Parse/src/main/java/com/parse/Parse.java @@ -369,7 +369,7 @@ public static void initialize(Configuration configuration) { // isLocalDataStoreEnabled() to perform additional behavior. isLocalDatastoreEnabled = configuration.localDataStoreEnabled; - ParsePlugins.Android.initialize(configuration.context, configuration); + ParsePlugins.initialize(configuration.context, configuration); try { ParseRESTCommand.server = new URL(configuration.server); @@ -459,7 +459,7 @@ static boolean isInitialized() { static Context getApplicationContext() { checkContext(); - return ParsePlugins.Android.get().applicationContext(); + return ParsePlugins.get().applicationContext(); } /** @@ -580,7 +580,7 @@ static void checkCacheApplicationId() { * processing any commands already stored in the on-disk queue. */ static ParseEventuallyQueue getEventuallyQueue() { - Context context = ParsePlugins.Android.get().applicationContext(); + Context context = ParsePlugins.get().applicationContext(); return getEventuallyQueue(context); } @@ -621,7 +621,7 @@ static void checkInit() { } static void checkContext() { - if (ParsePlugins.Android.get().applicationContext() == null) { + if (ParsePlugins.get().applicationContext() == null) { throw new RuntimeException("applicationContext is null. " + "You must call Parse.initialize(Context)" + " before using the Parse library."); diff --git a/Parse/src/main/java/com/parse/ParsePlugins.java b/Parse/src/main/java/com/parse/ParsePlugins.java index 9ee0c5cdd..5cf310674 100644 --- a/Parse/src/main/java/com/parse/ParsePlugins.java +++ b/Parse/src/main/java/com/parse/ParsePlugins.java @@ -28,10 +28,8 @@ class ParsePlugins { private static final Object LOCK = new Object(); private static ParsePlugins instance; - // TODO(grantland): Move towards a Config/Builder parameter pattern to allow other configurations - // such as path (disabled for Android), etc. - static void initialize(Parse.Configuration configuration) { - ParsePlugins.set(new ParsePlugins(configuration)); + static void initialize(Context context, Parse.Configuration configuration) { + ParsePlugins.set(new ParsePlugins(context, configuration)); } static void set(ParsePlugins plugins) { @@ -58,6 +56,8 @@ static void reset() { final Object lock = new Object(); private final Parse.Configuration configuration; + private Context applicationContext; + private InstallationId installationId; File parseDir; @@ -67,7 +67,10 @@ static void reset() { ParseHttpClient restClient; ParseHttpClient fileClient; - private ParsePlugins(Parse.Configuration configuration) { + private ParsePlugins(Context context, Parse.Configuration configuration) { + if (context != null) { + applicationContext = context.getApplicationContext(); + } this.configuration = configuration; } @@ -79,6 +82,10 @@ String clientKey() { return configuration.clientKey; } + Context applicationContext() { + return applicationContext; + } + ParseHttpClient fileClient() { synchronized (lock) { if (fileClient == null) { @@ -129,9 +136,20 @@ public Response intercept(Chain chain) throws IOException { } } - // TODO(grantland): Pass through some system values. String userAgent() { - return "Parse Java SDK"; + String packageVersion = "unknown"; + try { + String packageName = applicationContext.getPackageName(); + int versionCode = applicationContext + .getPackageManager() + .getPackageInfo(packageName, 0) + .versionCode; + packageVersion = packageName + "/" + versionCode; + } catch (PackageManager.NameNotFoundException e) { + // Should never happen. + } + return "Parse Android SDK " + ParseObject.VERSION_NAME + " (" + packageVersion + + ") API Level " + Build.VERSION.SDK_INT; } InstallationId installationId() { @@ -146,84 +164,29 @@ InstallationId installationId() { @Deprecated File getParseDir() { - throw new IllegalStateException("Stub"); - } - - File getCacheDir() { - throw new IllegalStateException("Stub"); - } - - File getFilesDir() { - throw new IllegalStateException("Stub"); - } - - static class Android extends ParsePlugins { - - static void initialize(Context context, Parse.Configuration configuration) { - ParsePlugins.set(new Android(context, configuration)); - } - - static ParsePlugins.Android get() { - return (ParsePlugins.Android) ParsePlugins.get(); - } - - private final Context applicationContext; - - private Android(Context context, Parse.Configuration configuration) { - super(configuration); - applicationContext = context.getApplicationContext(); - } - - Context applicationContext() { - return applicationContext; - } - - @Override - String userAgent() { - String packageVersion = "unknown"; - try { - String packageName = applicationContext.getPackageName(); - int versionCode = applicationContext - .getPackageManager() - .getPackageInfo(packageName, 0) - .versionCode; - packageVersion = packageName + "/" + versionCode; - } catch (PackageManager.NameNotFoundException e) { - // Should never happen. - } - return "Parse Android SDK " + ParseObject.VERSION_NAME + " (" + packageVersion + - ") API Level " + Build.VERSION.SDK_INT; - } - - @Override - @SuppressWarnings("deprecation") - File getParseDir() { - synchronized (lock) { - if (parseDir == null) { - parseDir = applicationContext.getDir("Parse", Context.MODE_PRIVATE); - } - return createFileDir(parseDir); + synchronized (lock) { + if (parseDir == null) { + parseDir = applicationContext.getDir("Parse", Context.MODE_PRIVATE); } + return createFileDir(parseDir); } + } - @Override - File getCacheDir() { - synchronized (lock) { - if (cacheDir == null) { - cacheDir = new File(applicationContext.getCacheDir(), "com.parse"); - } - return createFileDir(cacheDir); + File getCacheDir() { + synchronized (lock) { + if (cacheDir == null) { + cacheDir = new File(applicationContext.getCacheDir(), "com.parse"); } + return createFileDir(cacheDir); } + } - @Override - File getFilesDir() { - synchronized (lock) { - if (filesDir == null) { - filesDir = new File(applicationContext.getFilesDir(), "com.parse"); - } - return createFileDir(filesDir); + File getFilesDir() { + synchronized (lock) { + if (filesDir == null) { + filesDir = new File(applicationContext.getFilesDir(), "com.parse"); } + return createFileDir(filesDir); } } diff --git a/Parse/src/main/java/com/parse/PushService.java b/Parse/src/main/java/com/parse/PushService.java index 30f142f1d..f7de87a66 100644 --- a/Parse/src/main/java/com/parse/PushService.java +++ b/Parse/src/main/java/com/parse/PushService.java @@ -211,7 +211,7 @@ static boolean isSupported() { @Override public void onCreate() { super.onCreate(); - if (ParsePlugins.Android.get() == null) { + if (ParsePlugins.get() == null) { PLog.e(TAG, "The Parse push service cannot start because Parse.initialize " + "has not yet been called. If you call Parse.initialize from " + "an Activity's onCreate, that call should instead be in the " diff --git a/Parse/src/main/java/com/parse/PushServiceApi26.java b/Parse/src/main/java/com/parse/PushServiceApi26.java index bc2a834f3..cf4633e65 100644 --- a/Parse/src/main/java/com/parse/PushServiceApi26.java +++ b/Parse/src/main/java/com/parse/PushServiceApi26.java @@ -9,7 +9,6 @@ package com.parse; import android.annotation.TargetApi; -import android.app.Service; import android.app.job.JobInfo; import android.app.job.JobParameters; import android.app.job.JobScheduler; @@ -19,12 +18,7 @@ import android.content.Intent; import android.os.Build; import android.os.Bundle; -import android.os.IBinder; -import android.os.PowerManager; -import android.util.SparseArray; -import java.util.ArrayList; -import java.util.List; import java.util.concurrent.Executor; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; @@ -69,7 +63,7 @@ static boolean isSupported() { @Override public boolean onStartJob(final JobParameters jobParameters) { - if (ParsePlugins.Android.get() == null) { + if (ParsePlugins.get() == null) { PLog.e(TAG, "The Parse push service cannot start because Parse.initialize " + "has not yet been called. If you call Parse.initialize from " + "an Activity's onCreate, that call should instead be in the " diff --git a/Parse/src/test/java/com/parse/ParseCorePluginsTest.java b/Parse/src/test/java/com/parse/ParseCorePluginsTest.java index f23b6b10c..31d8a9aa4 100644 --- a/Parse/src/test/java/com/parse/ParseCorePluginsTest.java +++ b/Parse/src/test/java/com/parse/ParseCorePluginsTest.java @@ -32,7 +32,7 @@ public void setUp() throws Exception { Parse.Configuration configuration = new Parse.Configuration.Builder(null) .applicationId("1234") .build(); - ParsePlugins.initialize(configuration); + ParsePlugins.initialize(null, configuration); } @Test diff --git a/Parse/src/test/java/com/parse/ParseInstallationTest.java b/Parse/src/test/java/com/parse/ParseInstallationTest.java index aa51f978e..a5617f023 100644 --- a/Parse/src/test/java/com/parse/ParseInstallationTest.java +++ b/Parse/src/test/java/com/parse/ParseInstallationTest.java @@ -390,7 +390,7 @@ private static void mocksForUpdateBeforeSave() { ParseCorePlugins.getInstance().registerCurrentInstallationController(controller); // Mock App Name RuntimeEnvironment.application.getApplicationInfo().name = "parseTest"; - ParsePlugins.Android plugins = mock(ParsePlugins.Android.class); + ParsePlugins plugins = mock(ParsePlugins.class); // Mock installationId InstallationId installationId = mock(InstallationId.class); when(installationId.get()).thenReturn("installationId"); diff --git a/Parse/src/test/java/com/parse/PushServiceTest.java b/Parse/src/test/java/com/parse/PushServiceTest.java index 3f3197115..2f2615d71 100644 --- a/Parse/src/test/java/com/parse/PushServiceTest.java +++ b/Parse/src/test/java/com/parse/PushServiceTest.java @@ -1,12 +1,8 @@ package com.parse; -import android.content.Context; import android.content.Intent; -import com.google.protobuf.Service; -import com.ibm.icu.impl.IllegalIcuArgumentException; - import org.junit.After; import org.junit.Before; import org.junit.Test; @@ -15,24 +11,18 @@ import org.mockito.stubbing.Answer; import org.robolectric.Robolectric; import org.robolectric.RobolectricTestRunner; -import org.robolectric.RuntimeEnvironment; import org.robolectric.android.controller.ServiceController; import org.robolectric.annotation.Config; import bolts.Task; import bolts.TaskCompletionSource; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNull; -import static org.junit.Assert.assertTrue; - import static org.mockito.Matchers.any; import static org.mockito.Mockito.doAnswer; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.never; import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; -import static org.mockito.Mockito.when; @RunWith(RobolectricTestRunner.class) @@ -56,7 +46,7 @@ public void setUp() throws Exception { service.setPushHandler(handler); Parse.Configuration.Builder builder = new Parse.Configuration.Builder(service); - ParsePlugins.Android.initialize(service, builder.build()); + ParsePlugins.initialize(service, builder.build()); } @After From 9ce7997521249004647dff2b33a1130bf6a4b302 Mon Sep 17 00:00:00 2001 From: John Date: Wed, 24 Jan 2018 10:58:50 -0600 Subject: [PATCH 2/5] Remove obsolete setting of system properties --- Parse/src/main/java/com/parse/ParseHttpClient.java | 14 -------------- Parse/src/main/java/com/parse/ParseRequest.java | 10 ++++------ 2 files changed, 4 insertions(+), 20 deletions(-) diff --git a/Parse/src/main/java/com/parse/ParseHttpClient.java b/Parse/src/main/java/com/parse/ParseHttpClient.java index 91b675439..b33fda5e6 100644 --- a/Parse/src/main/java/com/parse/ParseHttpClient.java +++ b/Parse/src/main/java/com/parse/ParseHttpClient.java @@ -38,20 +38,6 @@ static ParseHttpClient createClient(@Nullable OkHttpClient.Builder builder) { return new ParseHttpClient(builder); } - private static final String MAX_CONNECTIONS_PROPERTY_NAME = "http.maxConnections"; - private static final String KEEP_ALIVE_PROPERTY_NAME = "http.keepAlive"; - - static void setMaxConnections(int maxConnections) { - if (maxConnections <= 0) { - throw new IllegalArgumentException("Max connections should be large than 0"); - } - System.setProperty(MAX_CONNECTIONS_PROPERTY_NAME, String.valueOf(maxConnections)); - } - - static void setKeepAlive(boolean isKeepAlive) { - System.setProperty(KEEP_ALIVE_PROPERTY_NAME, String.valueOf(isKeepAlive)); - } - private OkHttpClient okHttpClient; private boolean hasExecuted; diff --git a/Parse/src/main/java/com/parse/ParseRequest.java b/Parse/src/main/java/com/parse/ParseRequest.java index 67fabc66d..1c256b373 100644 --- a/Parse/src/main/java/com/parse/ParseRequest.java +++ b/Parse/src/main/java/com/parse/ParseRequest.java @@ -8,7 +8,7 @@ */ package com.parse; -import android.os.Build; +import android.support.annotation.NonNull; import com.parse.http.ParseHttpBody; import com.parse.http.ParseHttpRequest; @@ -31,12 +31,12 @@ * ParseRequest takes an arbitrary HttpUriRequest and retries it a number of times with * exponential backoff. */ -/** package */ abstract class ParseRequest { +abstract class ParseRequest { private static final ThreadFactory sThreadFactory = new ThreadFactory() { private final AtomicInteger mCount = new AtomicInteger(1); - public Thread newThread(Runnable r) { + public Thread newThread(@NonNull Runnable r) { return new Thread(r, "ParseRequest.NETWORK_EXECUTOR-thread-" + mCount.getAndIncrement()); } }; @@ -56,9 +56,7 @@ private static ThreadPoolExecutor newThreadPoolExecutor(int corePoolSize, int ma ThreadFactory threadFactory) { ThreadPoolExecutor executor = new ThreadPoolExecutor(corePoolSize, maxPoolSize, keepAliveTime, timeUnit, workQueue, threadFactory); - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.GINGERBREAD) { - executor.allowCoreThreadTimeOut(true); - } + executor.allowCoreThreadTimeOut(true); return executor; } From 908286a5bf97e012bb80c8df4e7ecc7c89c9bcf5 Mon Sep 17 00:00:00 2001 From: John Date: Wed, 24 Jan 2018 11:26:59 -0600 Subject: [PATCH 3/5] Remove references to enabling/disable retry on command since all are retry enabled --- .../java/com/parse/CacheQueryController.java | 16 +++++++------- .../com/parse/NetworkObjectController.java | 4 ---- .../com/parse/NetworkQueryController.java | 12 ++-------- Parse/src/main/java/com/parse/Parse.java | 22 ++++++++++++++----- .../java/com/parse/ParseConfigController.java | 1 - .../java/com/parse/ParseFileController.java | 2 -- .../src/main/java/com/parse/ParseObject.java | 2 -- .../main/java/com/parse/ParseRESTCommand.java | 5 ----- .../src/main/java/com/parse/ParseRequest.java | 4 ---- .../com/parse/NetworkQueryControllerTest.java | 4 ++-- 10 files changed, 29 insertions(+), 43 deletions(-) diff --git a/Parse/src/main/java/com/parse/CacheQueryController.java b/Parse/src/main/java/com/parse/CacheQueryController.java index 1bcb3f4d7..ff7848574 100644 --- a/Parse/src/main/java/com/parse/CacheQueryController.java +++ b/Parse/src/main/java/com/parse/CacheQueryController.java @@ -33,8 +33,8 @@ public Task> findAsync( final String sessionToken = user != null ? user.getSessionToken() : null; CommandDelegate> callbacks = new CommandDelegate>() { @Override - public Task> runOnNetworkAsync(boolean retry) { - return networkController.findAsync(state, sessionToken, retry, cancellationToken); + public Task> runOnNetworkAsync() { + return networkController.findAsync(state, sessionToken, cancellationToken); } @Override @@ -53,8 +53,8 @@ public Task countAsync( final String sessionToken = user != null ? user.getSessionToken() : null; CommandDelegate callbacks = new CommandDelegate() { @Override - public Task runOnNetworkAsync(boolean retry) { - return networkController.countAsync(state, sessionToken, retry, cancellationToken); + public Task runOnNetworkAsync() { + return networkController.countAsync(state, sessionToken, cancellationToken); } @Override @@ -124,7 +124,7 @@ private Task runCommandWithPolicyAsync(final CommandDelegate< switch (policy) { case IGNORE_CACHE: case NETWORK_ONLY: - return c.runOnNetworkAsync(true); + return c.runOnNetworkAsync(); case CACHE_ONLY: return c.runFromCacheAsync(); case CACHE_ELSE_NETWORK: @@ -133,13 +133,13 @@ private Task runCommandWithPolicyAsync(final CommandDelegate< @Override public Task then(Task task) throws Exception { if (task.getError() instanceof ParseException) { - return c.runOnNetworkAsync(true); + return c.runOnNetworkAsync(); } return task; } }); case NETWORK_ELSE_CACHE: - return c.runOnNetworkAsync(false).continueWithTask(new Continuation>() { + return c.runOnNetworkAsync().continueWithTask(new Continuation>() { @SuppressWarnings("ThrowableResultOfMethodCallIgnored") @Override public Task then(Task task) throws Exception { @@ -167,7 +167,7 @@ public Task then(Task task) throws Exception { */ private interface CommandDelegate { // Fetches data from the network. - Task runOnNetworkAsync(boolean retry); + Task runOnNetworkAsync(); // Fetches data from the cache. Task runFromCacheAsync(); diff --git a/Parse/src/main/java/com/parse/NetworkObjectController.java b/Parse/src/main/java/com/parse/NetworkObjectController.java index d6d814460..6ee241f0a 100644 --- a/Parse/src/main/java/com/parse/NetworkObjectController.java +++ b/Parse/src/main/java/com/parse/NetworkObjectController.java @@ -33,7 +33,6 @@ public Task fetchAsync( state.objectId(), state.className(), sessionToken); - command.enableRetrying(); return command.executeAsync(client).onSuccess(new Continuation() { @Override @@ -64,7 +63,6 @@ public Task saveAsync( state, objectJSON, sessionToken); - command.enableRetrying(); return command.executeAsync(client).onSuccess(new Continuation() { @Override public ParseObject.State then(Task task) throws Exception { @@ -124,7 +122,6 @@ public ParseObject.State then(Task task) throws Exception { public Task deleteAsync(ParseObject.State state, String sessionToken) { ParseRESTObjectCommand command = ParseRESTObjectCommand.deleteObjectCommand( state, sessionToken); - command.enableRetrying(); return command.executeAsync(client).makeVoid(); } @@ -139,7 +136,6 @@ public List> deleteAllAsync( ParseObject.State state = states.get(i); ParseRESTObjectCommand command = ParseRESTObjectCommand.deleteObjectCommand( state, sessionToken); - command.enableRetrying(); commands.add(command); } diff --git a/Parse/src/main/java/com/parse/NetworkQueryController.java b/Parse/src/main/java/com/parse/NetworkQueryController.java index 5e166d9ab..14a71a832 100644 --- a/Parse/src/main/java/com/parse/NetworkQueryController.java +++ b/Parse/src/main/java/com/parse/NetworkQueryController.java @@ -32,14 +32,14 @@ public NetworkQueryController(ParseHttpClient restClient) { public Task> findAsync( ParseQuery.State state, ParseUser user, Task cancellationToken) { String sessionToken = user != null ? user.getSessionToken() : null; - return findAsync(state, sessionToken, true, cancellationToken); + return findAsync(state, sessionToken, cancellationToken); } @Override public Task countAsync( ParseQuery.State state, ParseUser user, Task cancellationToken) { String sessionToken = user != null ? user.getSessionToken() : null; - return countAsync(state, sessionToken, true, cancellationToken); + return countAsync(state, sessionToken, cancellationToken); } /** @@ -50,14 +50,10 @@ public Task countAsync( /* package */ Task> findAsync( final ParseQuery.State state, String sessionToken, - boolean shouldRetry, Task ct) { final long queryStart = System.nanoTime(); final ParseRESTCommand command = ParseRESTQueryCommand.findCommand(state, sessionToken); - if (shouldRetry) { - command.enableRetrying(); - } final long querySent = System.nanoTime(); return command.executeAsync(restClient, ct).onSuccess(new Continuation>() { @@ -94,12 +90,8 @@ public List then(Task task) throws Exception { /* package */ Task countAsync( final ParseQuery.State state, String sessionToken, - boolean shouldRetry, Task ct) { final ParseRESTCommand command = ParseRESTQueryCommand.countCommand(state, sessionToken); - if (shouldRetry) { - command.enableRetrying(); - } return command.executeAsync(restClient, ct).onSuccessTask(new Continuation>() { @Override diff --git a/Parse/src/main/java/com/parse/Parse.java b/Parse/src/main/java/com/parse/Parse.java index 3b6d82ab6..b4cddb576 100644 --- a/Parse/src/main/java/com/parse/Parse.java +++ b/Parse/src/main/java/com/parse/Parse.java @@ -36,6 +36,8 @@ public class Parse { private static final String TAG = "com.parse.Parse"; + private static final int DEFAULT_MAX_RETRIES = 4; + /** * Represents an opaque configuration for the {@code Parse} SDK configuration. */ @@ -50,6 +52,7 @@ public static final class Builder { private String server; private boolean localDataStoreEnabled; private OkHttpClient.Builder clientBuilder; + private int maxRetries = DEFAULT_MAX_RETRIES; /** * Initialize a bulider with a given context. @@ -179,6 +182,18 @@ public Builder clientBuilder(OkHttpClient.Builder builder) { return this; } + /** + * Set the max number of times to retry Parse operations before deeming them a failure + *

+ * + * @param maxRetries The maximum number of times to retry. <=0 to never retry commands + * @return The same builder, for easy chaining. + */ + public Builder maxRetries(int maxRetries) { + this.maxRetries = maxRetries; + return this; + } + /** * Construct this builder into a concrete {@code Configuration} instance. * @@ -195,6 +210,7 @@ public Configuration build() { final String server; final boolean localDataStoreEnabled; final OkHttpClient.Builder clientBuilder; + final int maxRetries; private Configuration(Builder builder) { @@ -204,6 +220,7 @@ private Configuration(Builder builder) { this.server = builder.server; this.localDataStoreEnabled = builder.localDataStoreEnabled; this.clientBuilder = builder.clientBuilder; + this.maxRetries = builder.maxRetries; } } @@ -377,11 +394,6 @@ public static void initialize(Configuration configuration) { throw new RuntimeException(ex); } - Context applicationContext = configuration.context.getApplicationContext(); - - ParseHttpClient.setKeepAlive(true); - ParseHttpClient.setMaxConnections(20); - ParseObject.registerParseSubclasses(); if (configuration.localDataStoreEnabled) { diff --git a/Parse/src/main/java/com/parse/ParseConfigController.java b/Parse/src/main/java/com/parse/ParseConfigController.java index 628abb6c4..d52f7b18d 100644 --- a/Parse/src/main/java/com/parse/ParseConfigController.java +++ b/Parse/src/main/java/com/parse/ParseConfigController.java @@ -29,7 +29,6 @@ public ParseConfigController(ParseHttpClient restClient, public Task getAsync(String sessionToken) { final ParseRESTCommand command = ParseRESTConfigCommand.fetchConfigCommand(sessionToken); - command.enableRetrying(); return command.executeAsync(restClient).onSuccessTask(new Continuation>() { @Override public Task then(Task task) throws Exception { diff --git a/Parse/src/main/java/com/parse/ParseFileController.java b/Parse/src/main/java/com/parse/ParseFileController.java index 984ca7272..8e9abe7bd 100644 --- a/Parse/src/main/java/com/parse/ParseFileController.java +++ b/Parse/src/main/java/com/parse/ParseFileController.java @@ -98,7 +98,6 @@ public Task saveAsync( .contentType(state.mimeType()) .sessionToken(sessionToken) .build(); - command.enableRetrying(); return command.executeAsync( restClient, @@ -145,7 +144,6 @@ public Task saveAsync( .contentType(state.mimeType()) .sessionToken(sessionToken) .build(); - command.enableRetrying(); return command.executeAsync( restClient, diff --git a/Parse/src/main/java/com/parse/ParseObject.java b/Parse/src/main/java/com/parse/ParseObject.java index 1847956d2..903c210e4 100644 --- a/Parse/src/main/java/com/parse/ParseObject.java +++ b/Parse/src/main/java/com/parse/ParseObject.java @@ -1344,7 +1344,6 @@ private ParseRESTObjectCommand currentSaveEventuallyCommand( state, objectJSON, sessionToken); - command.enableRetrying(); return command; } @@ -1880,7 +1879,6 @@ public final Task deleteEventually() { // See [1] command = ParseRESTObjectCommand.deleteObjectCommand( getState(), sessionToken); - command.enableRetrying(); command.setLocalId(localId); runEventuallyTask = Parse.getEventuallyQueue().enqueueEventuallyAsync(command, ParseObject.this); diff --git a/Parse/src/main/java/com/parse/ParseRESTCommand.java b/Parse/src/main/java/com/parse/ParseRESTCommand.java index 5d3cbf40a..553deef5d 100644 --- a/Parse/src/main/java/com/parse/ParseRESTCommand.java +++ b/Parse/src/main/java/com/parse/ParseRESTCommand.java @@ -186,11 +186,6 @@ public static ParseRESTCommand fromJSONObject(JSONObject jsonObject) { return new ParseRESTCommand(httpPath, httpMethod, jsonParameters, localId, sessionToken); } - // TODO(grantland): But we don't disable retries by default... - /* package */ void enableRetrying() { - setMaxRetries(DEFAULT_MAX_RETRIES); - } - private static String createUrl(String httpPath) { // We send all parameters for GET/HEAD/DELETE requests in a post body, // so no need to worry about query parameters here. diff --git a/Parse/src/main/java/com/parse/ParseRequest.java b/Parse/src/main/java/com/parse/ParseRequest.java index 1c256b373..52ef8dfeb 100644 --- a/Parse/src/main/java/com/parse/ParseRequest.java +++ b/Parse/src/main/java/com/parse/ParseRequest.java @@ -90,10 +90,6 @@ public ParseRequest(ParseHttpRequest.Method method, String url) { this.url = url; } - public void setMaxRetries(int max) { - maxRetries = max; - } - protected ParseHttpBody newBody(ProgressCallback uploadProgressCallback) { // do nothing return null; diff --git a/Parse/src/test/java/com/parse/NetworkQueryControllerTest.java b/Parse/src/test/java/com/parse/NetworkQueryControllerTest.java index 1548aa894..846a65cee 100644 --- a/Parse/src/test/java/com/parse/NetworkQueryControllerTest.java +++ b/Parse/src/test/java/com/parse/NetworkQueryControllerTest.java @@ -73,7 +73,7 @@ public void testFindAsyncWithSessionToken() throws Exception { when(mockState.constraints()).thenReturn(new ParseQuery.QueryConstraints()); NetworkQueryController controller = new NetworkQueryController(restClient); - Task> findTask = controller.findAsync(mockState, "sessionToken", true, null); + Task> findTask = controller.findAsync(mockState, "sessionToken", null); ParseTaskUtils.wait(findTask); List objects = findTask.getResult(); @@ -103,7 +103,7 @@ public void testCountAsyncWithSessionToken() throws Exception { NetworkQueryController controller = new NetworkQueryController(restClient); - Task countTask = controller.countAsync(mockState, "sessionToken", true, null); + Task countTask = controller.countAsync(mockState, "sessionToken", null); ParseTaskUtils.wait(countTask); int count = countTask.getResult(); From 4a2eab1e44d05f6c3b719f698174b57fc534494e Mon Sep 17 00:00:00 2001 From: John Date: Wed, 31 Jan 2018 10:42:38 -0600 Subject: [PATCH 4/5] Use max retries from configuration --- Parse/src/main/java/com/parse/ParsePlugins.java | 4 ++++ Parse/src/main/java/com/parse/ParseRequest.java | 11 +++++++++-- 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/Parse/src/main/java/com/parse/ParsePlugins.java b/Parse/src/main/java/com/parse/ParsePlugins.java index 5cf310674..44134177f 100644 --- a/Parse/src/main/java/com/parse/ParsePlugins.java +++ b/Parse/src/main/java/com/parse/ParsePlugins.java @@ -82,6 +82,10 @@ String clientKey() { return configuration.clientKey; } + Parse.Configuration configuration() { + return configuration; + } + Context applicationContext() { return applicationContext; } diff --git a/Parse/src/main/java/com/parse/ParseRequest.java b/Parse/src/main/java/com/parse/ParseRequest.java index 52ef8dfeb..e50f7ce35 100644 --- a/Parse/src/main/java/com/parse/ParseRequest.java +++ b/Parse/src/main/java/com/parse/ParseRequest.java @@ -76,7 +76,14 @@ public static long getDefaultInitialRetryDelay() { return defaultInitialRetryDelay; } - private int maxRetries = DEFAULT_MAX_RETRIES; + private static int maxRetries() { + //typically happens just within tests + if (ParsePlugins.get() == null) { + return DEFAULT_MAX_RETRIES; + } else { + return ParsePlugins.get().configuration().maxRetries; + } + } /* package */ ParseHttpRequest.Method method; /* package */ String url; @@ -221,7 +228,7 @@ public Task then(Task task) throws Exception { return task; } - if (attemptsMade < maxRetries) { + if (attemptsMade < maxRetries()) { PLog.i("com.parse.ParseRequest", "Request failed. Waiting " + delay + " milliseconds before attempt #" + (attemptsMade + 1)); From 8e85a8a7b0ec44abedd672ce96bfb837442319a3 Mon Sep 17 00:00:00 2001 From: John Date: Wed, 31 Jan 2018 10:52:05 -0600 Subject: [PATCH 5/5] Use the same default max retries as ParseRequest --- Parse/src/main/java/com/parse/Parse.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Parse/src/main/java/com/parse/Parse.java b/Parse/src/main/java/com/parse/Parse.java index b4cddb576..e525ba25b 100644 --- a/Parse/src/main/java/com/parse/Parse.java +++ b/Parse/src/main/java/com/parse/Parse.java @@ -36,7 +36,7 @@ public class Parse { private static final String TAG = "com.parse.Parse"; - private static final int DEFAULT_MAX_RETRIES = 4; + private static final int DEFAULT_MAX_RETRIES = ParseRequest.DEFAULT_MAX_RETRIES; /** * Represents an opaque configuration for the {@code Parse} SDK configuration.