package controllers; import java.util.concurrent.TimeUnit; import play.core.j.FPromiseHelper; import play.libs.F; import play.mvc.HandlerRef; import play.mvc.Result; import play.mvc.SimpleResult; import play.test.FakeRequest; import scala.concurrent.Future; @SuppressWarnings(value = { "unchecked", "rawtypes", "deprecation" }) public class Helpers { private static class P<A> extends F.Promise<A> { public P(Future<A> future) { super(future); } @Override public A get() { return FPromiseHelper.get(this, 5, TimeUnit.MINUTES); } } private static Result invokeHandler(play.api.mvc.Handler handler, FakeRequest fakeRequest) { if(handler instanceof play.core.j.JavaAction) { play.api.mvc.Action action = (play.api.mvc.Action)handler; return wrapScalaResult(action.apply(fakeRequest.getWrappedRequest())); } else { throw new RuntimeException("This is not a JavaAction and can't be invoked this way."); } } private static SimpleResult wrapScalaResult(scala.concurrent.Future<play.api.mvc.SimpleResult> result) { if (result == null) { return null; } else { final play.api.mvc.SimpleResult simpleResult = new P<play.api.mvc.SimpleResult>(result).get(); return new SimpleResult() { public play.api.mvc.SimpleResult getWrappedSimpleResult() { return simpleResult; } }; } } /** * Call an action method while decorating it with the right @With interceptors. */ public static Result callAction(HandlerRef actionReference) { return callAction(actionReference, fakeRequest()); } /** * Call an action method while decorating it with the right @With interceptors. */ public static Result callAction(HandlerRef actionReference, FakeRequest fakeRequest) { play.api.mvc.HandlerRef handlerRef = (play.api.mvc.HandlerRef)actionReference; return invokeHandler(handlerRef.handler(), fakeRequest); } /** * Build a new GET / fake request. */ public static FakeRequest fakeRequest() { return new FakeRequest(); } }