You can use recursion to smooth this structure for any number of Promises. First create a class:
public static class ChainedWebService { public final Optional<ChainedWebService> next; public final WSRequestHolder wsResponsePromise; private final F.Predicate<JsonNode> predicate; public ChainedWebService(String url, Optional<ChainedWebService> next, F.Predicate<JsonNode> predicate) { this.next = next; this.wsResponsePromise = WS.url(url); this.predicate = predicate; } public F.Promise<Result> processChain() { return wsResponsePromise.get().flatMap(new F.Function<WSResponse, F.Promise<Result>>() { @Override public F.Promise<Result> apply(WSResponse wsResponse) throws Throwable { if (!predicate.test(wsResponse.asJson())) { return F.Promise.pure(badRequest()); } if (!next.isPresent()) { return F.Promise.pure(ok()); } return next.get().processChain(); } }); } }
And then use it:
public static F.Promise<Result> reactiveCombo() { ChainedWebService chainedWebService3 = new ChainedWebService( "url3", Optional.<ChainedWebService>empty(), jsonNode -> jsonNode.get("boolField").asBoolean() ); ChainedWebService chainedWebService2 = new ChainedWebService( "url2", Optional.of(chainedWebService3), jsonNode -> jsonNode.get("someField").asText().equals(jsonNode.get("someField").asText())); ChainedWebService chainedWebService1 = new ChainedWebService( "url1", Optional.of(chainedWebService2), jsonNode -> jsonNode.has("someField") ); return chainedWebService1.processChain(); }
You can implement some basic constructor to make the construction process more reasonable.
Hope this helps!
source share