Search in sources :

Example 36 with Task

use of bolts.Task in project Parse-SDK-Android by ParsePlatform.

the class ParseTaskUtilsTest method testWaitForTaskWrapsAggregateExceptionAsParseException.

/**
   * Verifies {@link bolts.AggregateException} gets wrapped with {@link ParseException} when thrown from
   * {@link com.parse.ParseTaskUtils#wait(bolts.Task)}.
   */
@Test
public void testWaitForTaskWrapsAggregateExceptionAsParseException() {
    final Exception error = new RuntimeException("This task failed.");
    final ArrayList<Task<Void>> tasks = new ArrayList<>();
    for (int i = 0; i < 20; i++) {
        final int number = i;
        Task<Void> task = Task.callInBackground(new Callable<Void>() {

            @Override
            public Void call() throws Exception {
                Thread.sleep((long) (Math.random() * 100));
                if (number == 10 || number == 11) {
                    throw error;
                }
                return null;
            }
        });
        tasks.add(task);
    }
    try {
        ParseTaskUtils.wait(Task.whenAll(tasks));
    } catch (ParseException e) {
        assertTrue(e.getCause() instanceof AggregateException);
    }
}
Also used : Task(bolts.Task) ArrayList(java.util.ArrayList) AggregateException(bolts.AggregateException) AggregateException(bolts.AggregateException) Test(org.junit.Test)

Example 37 with Task

use of bolts.Task in project Bolts-Java by BoltsFramework.

the class TaskTest method testWhenAllTwoErrors.

public void testWhenAllTwoErrors() {
    final Exception error = new RuntimeException("This task failed.");
    runTaskTest(new Callable<Task<?>>() {

        @Override
        public Task<?> call() throws Exception {
            final ArrayList<Task<Void>> tasks = new ArrayList<Task<Void>>();
            for (int i = 0; i < 20; i++) {
                final int number = i;
                Task<Void> task = Task.callInBackground(new Callable<Void>() {

                    @Override
                    public Void call() throws Exception {
                        Thread.sleep((long) (Math.random() * 1000));
                        if (number == 10 || number == 11) {
                            throw error;
                        }
                        return null;
                    }
                });
                tasks.add(task);
            }
            return Task.whenAll(tasks).continueWith(new Continuation<Void, Void>() {

                @Override
                public Void then(Task<Void> task) {
                    assertTrue(task.isCompleted());
                    assertTrue(task.isFaulted());
                    assertFalse(task.isCancelled());
                    assertTrue(task.getError() instanceof AggregateException);
                    assertEquals(2, ((AggregateException) task.getError()).getErrors().size());
                    assertEquals(error, ((AggregateException) task.getError()).getErrors().get(0));
                    assertEquals(error, ((AggregateException) task.getError()).getErrors().get(1));
                    for (Task<Void> t : tasks) {
                        assertTrue(t.isCompleted());
                    }
                    return null;
                }
            });
        }
    });
}
Also used : Task(bolts.Task) Continuation(bolts.Continuation) ArrayList(java.util.ArrayList) AggregateException(bolts.AggregateException) AggregateException(bolts.AggregateException) CancellationException(java.util.concurrent.CancellationException) Callable(java.util.concurrent.Callable)

Example 38 with Task

use of bolts.Task in project Bolts-Java by BoltsFramework.

the class TaskTest method testWhenAllOneError.

public void testWhenAllOneError() {
    final Exception error = new RuntimeException("This task failed.");
    runTaskTest(new Callable<Task<?>>() {

        @Override
        public Task<?> call() throws Exception {
            final ArrayList<Task<Void>> tasks = new ArrayList<Task<Void>>();
            for (int i = 0; i < 20; i++) {
                final int number = i;
                Task<Void> task = Task.callInBackground(new Callable<Void>() {

                    @Override
                    public Void call() throws Exception {
                        Thread.sleep((long) (Math.random() * 1000));
                        if (number == 10) {
                            throw error;
                        }
                        return null;
                    }
                });
                tasks.add(task);
            }
            return Task.whenAll(tasks).continueWith(new Continuation<Void, Void>() {

                @Override
                public Void then(Task<Void> task) {
                    assertTrue(task.isCompleted());
                    assertTrue(task.isFaulted());
                    assertFalse(task.isCancelled());
                    assertFalse(task.getError() instanceof AggregateException);
                    assertEquals(error, task.getError());
                    for (Task<Void> t : tasks) {
                        assertTrue(t.isCompleted());
                    }
                    return null;
                }
            });
        }
    });
}
Also used : Task(bolts.Task) Continuation(bolts.Continuation) ArrayList(java.util.ArrayList) AggregateException(bolts.AggregateException) AggregateException(bolts.AggregateException) CancellationException(java.util.concurrent.CancellationException) Callable(java.util.concurrent.Callable)

Example 39 with Task

use of bolts.Task in project Rocket.Chat.Android by RocketChat.

the class FileUploadingToUrlObserver method onUpdateResults.

@Override
public void onUpdateResults(List<FileUploading> results) {
    if (results.isEmpty()) {
        return;
    }
    List<FileUploading> uploadingList = realmHelper.executeTransactionForReadResults(realm -> realm.where(FileUploading.class).equalTo(FileUploading.SYNC_STATE, SyncState.SYNCING).findAll());
    if (uploadingList.size() >= 3) {
        // do not upload more than 3 files simultaneously
        return;
    }
    FileUploading fileUploading = results.get(0);
    final String roomId = fileUploading.getRoomId();
    final String uplId = fileUploading.getUplId();
    final String filename = fileUploading.getFilename();
    final long filesize = fileUploading.getFilesize();
    final String mimeType = fileUploading.getMimeType();
    final Uri fileUri = Uri.parse(fileUploading.getUri());
    final String storageType = fileUploading.getStorageType();
    realmHelper.executeTransaction(realm -> realm.createOrUpdateObjectFromJson(FileUploading.class, new JSONObject().put(FileUploading.ID, uplId).put(FileUploading.SYNC_STATE, SyncState.SYNCING))).onSuccessTask(_task -> {
        if (FileUploading.STORAGE_TYPE_GOOGLE.equals(storageType)) {
            return methodCall.uploadGoogleRequest(filename, filesize, mimeType, roomId);
        } else {
            return methodCall.uploadS3Request(filename, filesize, mimeType, roomId);
        }
    }).onSuccessTask(task -> {
        final JSONObject info = task.getResult();
        final String uploadUrl = info.getString("upload");
        final String downloadUrl = info.getString("download");
        final JSONArray postDataList = info.getJSONArray("postData");
        MultipartBody.Builder bodyBuilder = new MultipartBody.Builder().setType(MultipartBody.FORM);
        for (int i = 0; i < postDataList.length(); i++) {
            JSONObject postData = postDataList.getJSONObject(i);
            bodyBuilder.addFormDataPart(postData.getString("name"), postData.getString("value"));
        }
        bodyBuilder.addFormDataPart("file", filename, new RequestBody() {

            private long numBytes = 0;

            @Override
            public MediaType contentType() {
                return MediaType.parse(mimeType);
            }

            @Override
            public long contentLength() throws IOException {
                return filesize;
            }

            @Override
            public void writeTo(BufferedSink sink) throws IOException {
                InputStream inputStream = context.getContentResolver().openInputStream(fileUri);
                try (Source source = Okio.source(inputStream)) {
                    long readBytes;
                    while ((readBytes = source.read(sink.buffer(), 8192)) > 0) {
                        numBytes += readBytes;
                        realmHelper.executeTransaction(realm -> realm.createOrUpdateObjectFromJson(FileUploading.class, new JSONObject().put(FileUploading.ID, uplId).put(FileUploading.UPLOADED_SIZE, numBytes))).continueWith(new LogIfError());
                    }
                }
            }
        });
        Request request = new Request.Builder().url(uploadUrl).post(bodyBuilder.build()).build();
        Response response = OkHttpHelper.getClientForUploadFile().newCall(request).execute();
        if (response.isSuccessful()) {
            return Task.forResult(downloadUrl);
        } else {
            return Task.forError(new Exception(response.message()));
        }
    }).onSuccessTask(task -> {
        String downloadUrl = task.getResult();
        String storage = FileUploading.STORAGE_TYPE_GOOGLE.equals(storageType) ? storageType : "s3";
        return methodCall.sendFileMessage(roomId, storage, new JSONObject().put("_id", Uri.parse(downloadUrl).getLastPathSegment()).put("type", mimeType).put("size", filesize).put("name", filename).put("url", downloadUrl));
    }).onSuccessTask(task -> realmHelper.executeTransaction(realm -> realm.createOrUpdateObjectFromJson(FileUploading.class, new JSONObject().put(FileUploading.ID, uplId).put(FileUploading.SYNC_STATE, SyncState.SYNCED).put(FileUploading.ERROR, JSONObject.NULL)))).continueWithTask(task -> {
        if (task.isFaulted()) {
            RCLog.w(task.getError());
            return realmHelper.executeTransaction(realm -> realm.createOrUpdateObjectFromJson(FileUploading.class, new JSONObject().put(FileUploading.ID, uplId).put(FileUploading.SYNC_STATE, SyncState.FAILED).put(FileUploading.ERROR, task.getError().getMessage())));
        } else {
            return Task.forResult(null);
        }
    });
}
Also used : Context(android.content.Context) Okio(okio.Okio) Source(okio.Source) Uri(android.net.Uri) LogIfError(chat.rocket.android.helper.LogIfError) RequestBody(okhttp3.RequestBody) JSONObject(org.json.JSONObject) BufferedSink(okio.BufferedSink) SyncState(chat.rocket.core.SyncState) Response(okhttp3.Response) Task(bolts.Task) MediaType(okhttp3.MediaType) FileUploadingHelper(chat.rocket.android.api.FileUploadingHelper) Realm(io.realm.Realm) Request(okhttp3.Request) RealmResults(io.realm.RealmResults) IOException(java.io.IOException) RCLog(chat.rocket.android.log.RCLog) List(java.util.List) MultipartBody(okhttp3.MultipartBody) RealmHelper(chat.rocket.persistence.realm.RealmHelper) FileUploading(chat.rocket.persistence.realm.models.internal.FileUploading) DDPClientRef(chat.rocket.android.service.DDPClientRef) OkHttpHelper(chat.rocket.android.helper.OkHttpHelper) JSONArray(org.json.JSONArray) InputStream(java.io.InputStream) InputStream(java.io.InputStream) JSONArray(org.json.JSONArray) Request(okhttp3.Request) BufferedSink(okio.BufferedSink) Uri(android.net.Uri) Source(okio.Source) LogIfError(chat.rocket.android.helper.LogIfError) IOException(java.io.IOException) Response(okhttp3.Response) JSONObject(org.json.JSONObject) FileUploading(chat.rocket.persistence.realm.models.internal.FileUploading) RequestBody(okhttp3.RequestBody)

Example 40 with Task

use of bolts.Task in project Rocket.Chat.Android by RocketChat.

the class GetUsersOfRoomsProcedureObserver method onUpdateResults.

@Override
public void onUpdateResults(List<GetUsersOfRoomsProcedure> results) {
    if (results == null || results.isEmpty()) {
        return;
    }
    GetUsersOfRoomsProcedure procedure = results.get(0);
    final String roomId = procedure.getRoomId();
    final boolean showAll = procedure.isShowAll();
    realmHelper.executeTransaction(realm -> realm.createOrUpdateObjectFromJson(GetUsersOfRoomsProcedure.class, new JSONObject().put(GetUsersOfRoomsProcedure.ID, roomId).put(GetUsersOfRoomsProcedure.SYNC_STATE, SyncState.SYNCING))).onSuccessTask(task -> methodCall.getUsersOfRoom(roomId, showAll).onSuccessTask(_task -> {
        JSONObject result = _task.getResult().put("roomId", roomId).put("syncstate", SyncState.SYNCED);
        return realmHelper.executeTransaction(realm -> realm.createOrUpdateObjectFromJson(GetUsersOfRoomsProcedure.class, result));
    })).continueWithTask(task -> {
        if (task.isFaulted()) {
            RCLog.w(task.getError());
            return realmHelper.executeTransaction(realm -> realm.createOrUpdateObjectFromJson(GetUsersOfRoomsProcedure.class, new JSONObject().put(GetUsersOfRoomsProcedure.ID, roomId).put(GetUsersOfRoomsProcedure.SYNC_STATE, SyncState.FAILED)));
        } else {
            return Task.forResult(null);
        }
    });
}
Also used : MethodCallHelper(chat.rocket.android.api.MethodCallHelper) Context(android.content.Context) Realm(io.realm.Realm) List(java.util.List) JSONObject(org.json.JSONObject) RealmResults(io.realm.RealmResults) RealmHelper(chat.rocket.persistence.realm.RealmHelper) SyncState(chat.rocket.core.SyncState) GetUsersOfRoomsProcedure(chat.rocket.persistence.realm.models.internal.GetUsersOfRoomsProcedure) DDPClientRef(chat.rocket.android.service.DDPClientRef) RCLog(chat.rocket.android.log.RCLog) Task(bolts.Task) JSONObject(org.json.JSONObject) GetUsersOfRoomsProcedure(chat.rocket.persistence.realm.models.internal.GetUsersOfRoomsProcedure)

Aggregations

Task (bolts.Task)46 JSONObject (org.json.JSONObject)27 Continuation (bolts.Continuation)23 JSONException (org.json.JSONException)20 ArrayList (java.util.ArrayList)15 JSONArray (org.json.JSONArray)14 RCLog (chat.rocket.android.log.RCLog)11 TaskCompletionSource (bolts.TaskCompletionSource)10 List (java.util.List)8 Context (android.content.Context)7 Uri (android.net.Uri)7 RealmHelper (chat.rocket.persistence.realm.RealmHelper)7 CancellationException (java.util.concurrent.CancellationException)7 TextUtils (android.text.TextUtils)6 SyncState (chat.rocket.core.SyncState)6 IOException (java.io.IOException)6 NonNull (android.support.annotation.NonNull)5 Nullable (android.support.annotation.Nullable)5 AggregateException (bolts.AggregateException)5 AppLink (bolts.AppLink)5