package samplest.core; import com.google.common.base.Optional; import restx.RestxContext; import restx.RestxHandler; import restx.RestxHandlerMatch; import restx.RestxRequest; import restx.RestxRequestMatch; import restx.RestxResponse; import restx.RestxRoute; import restx.RestxRouteFilter; import restx.StdRestxRequestMatch; import restx.StdRestxRequestMatcher; import restx.StdRoute; import restx.factory.Module; import restx.factory.Provides; import java.io.IOException; /** * Date: 22/5/14 * Time: 19:30 */ @Module public class RouteFilterModule { public static class ExampleRoute extends StdRoute { public ExampleRoute() { super("ExampleRoute", new StdRestxRequestMatcher("GET", "/route/filter")); } @Override public void handle(RestxRequestMatch match, RestxRequest req, RestxResponse resp, RestxContext ctx) throws IOException { resp.getWriter().write("route filter"); } } @Provides public RestxRoute exampleRoute() { return new ExampleRoute(); } @Provides(priority = 12000) // we set a priority higher than ResponseCloseFilter, so that response is not closed after the handle public RestxRouteFilter routeFilterExample() { return new RestxRouteFilter() { @Override public Optional<RestxHandlerMatch> match(RestxRoute route) { // here we decide to apply the filter or not based on the route class. // but we could decide on any route property, for instance relying on the fact that routes generated // by @{GET,POST,PUT,DELETE} are always StdEntityRoute instances and their matcher always StdRouteMatcher if (route instanceof ExampleRoute) { return Optional.of(new RestxHandlerMatch(new StdRestxRequestMatch("/route/filter"), new RestxHandler() { @Override public void handle(RestxRequestMatch match, RestxRequest req, RestxResponse resp, RestxContext ctx) throws IOException { resp.getWriter().write(">>"); ctx.nextHandlerMatch().handle(req, resp, ctx); resp.getWriter().write("<<"); } })); } else { return Optional.absent(); } } }; } }