From 36e11c1b4356353de4367de42f35874b907ac118 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Manuel=20Carrasco=20Mo=C3=B1ino?= Date: Tue, 10 Sep 2013 09:10:25 +0200 Subject: [PATCH] Support for multiple request in RF Promise helper --- .../client/plugins/deferred/PromiseRF.java | 60 +++++++++++++++---- 1 file changed, 49 insertions(+), 11 deletions(-) diff --git a/gwtquery-core/src/main/java/com/google/gwt/query/client/plugins/deferred/PromiseRF.java b/gwtquery-core/src/main/java/com/google/gwt/query/client/plugins/deferred/PromiseRF.java index 0983ab3a..5f573a1d 100644 --- a/gwtquery-core/src/main/java/com/google/gwt/query/client/plugins/deferred/PromiseRF.java +++ b/gwtquery-core/src/main/java/com/google/gwt/query/client/plugins/deferred/PromiseRF.java @@ -13,12 +13,16 @@ */ package com.google.gwt.query.client.plugins.deferred; +import java.util.ArrayList; +import java.util.List; import java.util.Set; import javax.validation.ConstraintViolation; import com.google.gwt.query.client.plugins.deferred.Deferred.DeferredPromiseImpl; import com.google.web.bindery.requestfactory.shared.Receiver; +import com.google.web.bindery.requestfactory.shared.Request; +import com.google.web.bindery.requestfactory.shared.RequestContext; import com.google.web.bindery.requestfactory.shared.ServerFailure; /** @@ -27,7 +31,10 @@ import com.google.web.bindery.requestfactory.shared.ServerFailure; * Request req1 = loginFact.api().login(null, null); * Request req2 = srvFact.api().getCurrentUser(); * + * // We can use `when` to append different requests * Promise requestingAll = Deferred.when(new PromiseRF(req1), new PromiseRF(req2); + * // Or we can use just one promise for multiple RF requests + * Promise requestingAll = new PromiseRF(req1, req2); * * requestingAll.done(new Function() { * public void f() { @@ -43,19 +50,50 @@ import com.google.web.bindery.requestfactory.shared.ServerFailure; * */ public class PromiseRF extends DeferredPromiseImpl { - public PromiseRF(com.google.web.bindery.requestfactory.shared.Request request) { - request.fire(new Receiver() { - public void onConstraintViolation(Set> violations) { - dfd.reject(new ServerFailure("ConstraintViolation"), violations); - } + private int total = 0; + private List responses = new ArrayList(); + private List contexts = new ArrayList(); + + /** + * Fire a RF Request. + */ + public PromiseRF(Request request) { + this(new Request[] {request}); + } - public void onFailure(ServerFailure error) { - dfd.reject(error); + /** + * Fire multiple RF Requests. + * + * Unlike RequestContext.append which only supports compatible requests, + * we can append any kind of requestContexts here. + */ + public PromiseRF(Request[] requests) { + for (Request request : requests) { + total ++; + request.to(new Receiver() { + public void onConstraintViolation(Set> violations) { + dfd.reject(new ServerFailure("ConstraintViolation"), violations); + } + public void onFailure(ServerFailure error) { + dfd.reject(error); + } + public void onSuccess(Object response) { + responses.add(response); + // Resolve only when all requests have been received + if (responses.size() == total) { + dfd.resolve(responses.toArray(new Object[responses.size()])); + } + } + }); + if (!contexts.contains(request.getRequestContext())) { + contexts.add(request.getRequestContext()); } + } - public void onSuccess(T response) { - dfd.resolve(response); - } - }); + // We fire each context instead of appending them so as we can deal + // with different request factories. + for (RequestContext ctx : contexts) { + ctx.fire(); + } } } -- 2.39.5