@Override public void handle(RestxRequestMatch match, RestxRequest req, RestxResponse resp, RestxContext ctx) throws IOException { ctx.nextHandlerMatch().handle(req, resp, ctx); try { resp.close(); } catch (Exception e) { logger.error("ERROR while closing response: " + e.getMessage(), e); } } }
public RestxContext withListener(final RouteLifecycleListener listener) { return new RestxContext(mode, new RouteLifecycleListener() { @Override public void onRouteMatch(RestxRoute source, RestxRequest req, RestxResponse resp) { lifecycleListener.onRouteMatch(source, req, resp); listener.onRouteMatch(source, req, resp); } @Override public void onBeforeWriteContent(RestxRequest req, RestxResponse resp) { lifecycleListener.onBeforeWriteContent(req, resp); listener.onBeforeWriteContent(req, resp); } @Override public void onAfterWriteContent(RestxRequest req, RestxResponse resp) { lifecycleListener.onAfterWriteContent(req, resp); listener.onAfterWriteContent(req, resp); } @Override public void onEntityInput(RestxRoute route, RestxRequest req, RestxResponse resp, Optional<?> input) { lifecycleListener.onEntityInput(route, req, resp, input); listener.onEntityInput(route, req, resp, input); } @Override public void onEntityOutput(RestxRoute route, RestxRequest req, RestxResponse resp, Optional<?> input, Optional<?> output) { lifecycleListener.onEntityOutput(route, req, resp, input, output); listener.onEntityOutput(route, req, resp, input, output); } }, matches, matchesIterator); }
@Override public void handle(RestxRequestMatch match, RestxRequest req, RestxResponse resp, RestxContext ctx) throws IOException { String relativePath = this.requestRelativePath(req); relativePath = Optional.fromNullable(aliases.get(relativePath)).or(relativePath); try { URL resource = MoreResources.getResource( baseResourcePath + relativePath, RestxContext.Modes.DEV.equals(ctx.getMode()) || RestxContext.Modes.TEST.equals(ctx.getMode()) || RestxContext.Modes.INFINIREST.equals(ctx.getMode()) ); serveCacheableResource(resp, resource, relativePath); } catch (IllegalArgumentException e) { notFound(resp, relativePath); } }
@Override public void handle(RestxRequestMatch match, RestxRequest req, RestxResponse resp, RestxContext ctx) throws IOException { ctx.nextHandlerMatch().handle(req, resp, ctx.withListener(new AbstractRouteLifecycleListener() { @Override @SuppressWarnings("unchecked") public void onEntityOutput(RestxRoute route, RestxRequest req, RestxResponse resp, Optional<?> input, Optional<?> output) { if (output.isPresent()) { provider.provideETagFor((T) output.get()).handleIn(req, resp); } } })); } }
@Override public void handle(RestxRequestMatch match, RestxRequest req, final RestxResponse resp, RestxContext ctx) throws IOException { final RestxSession session = buildContextFromRequest(req); if (RestxContext.Modes.RECORDING.equals(ctx.getMode())) { // we invalidate caches in recording mode so that each request records the cache loading // Note: having this piece of code here is not a very nice isolation of responsibilities // we could put it in a separate filter, but then it's not easy to be sure it's called right after this // filter. Until such a feature is introduced, the easy solution to put it here is used. sessionDefinition.invalidateAllCaches(); } RestxSession.setCurrent(session); try { RouteLifecycleListener lifecycleListener = new AbstractRouteLifecycleListener() { @Override public void onBeforeWriteContent(RestxRequest req, RestxResponse resp) { RestxSession newSession = RestxSession.current(); if (newSession != session) { updateSessionInClient(resp, newSession); } } }; ctx.nextHandlerMatch().handle(req, resp, ctx.withListener(lifecycleListener)); } finally { RestxSession.setCurrent(null); // we don't remove the MDC principal here, we want to keep it until the end of the request } }
RestxContext context = new RestxContext(getMode(), new AbstractRouteLifecycleListener() {}, ImmutableList.copyOf(m.get().getMatches())); RestxHandlerMatch match = context.nextHandlerMatch(); match.handle(restxRequest, restxResponse, context);
@Override public void sendResponse(HttpStatus status, T value, RestxRequest req, RestxResponse resp, RestxContext ctx) throws IOException { resp.setStatus(status); resp.setContentType(contentType); writeHeaders(value, req, resp, ctx); ctx.getLifecycleListener().onBeforeWriteContent(req, resp); write(value, req, resp, ctx); ctx.getLifecycleListener().onAfterWriteContent(req, resp); }
@Override public void handle(RestxRequestMatch match, RestxRequest req, RestxResponse resp, RestxContext ctx) throws IOException { ctx.nextHandlerMatch().handle(req, resp, ctx.withListener(new AbstractRouteLifecycleListener() { @Override public void onBeforeWriteContent(RestxRequest req, RestxResponse resp) { if (!resp.getHeader("Cache-Control").isPresent()) { resp.setHeader("Cache-Control", "no-cache"); } } })); } }));
@Override public void handle(RestxRequestMatch match, RestxRequest req, final RestxResponse resp, RestxContext ctx) throws IOException { final RestxSession session = buildContextFromRequest(req); if (RestxContext.Modes.RECORDING.equals(ctx.getMode())) { // we invalidate caches in recording mode so that each request records the cache loading // Note: having this piece of code here is not a very nice isolation of responsibilities // we could put it in a separate filter, but then it's not easy to be sure it's called right after this // filter. Until such a feature is introduced, the easy solution to put it here is used. sessionDefinition.invalidateAllCaches(); } RestxSession.setCurrent(session); try { RouteLifecycleListener lifecycleListener = new AbstractRouteLifecycleListener() { @Override public void onBeforeWriteContent(RestxRequest req, RestxResponse resp) { RestxSession newSession = RestxSession.current(); if (newSession != session) { updateSessionInClient(resp, newSession); } } }; ctx.nextHandlerMatch().handle(req, resp, ctx.withListener(lifecycleListener)); } finally { RestxSession.setCurrent(null); // we don't remove the MDC principal here, we want to keep it until the end of the request } }
RestxContext context = new RestxContext(getMode(), new AbstractRouteLifecycleListener() {}, ImmutableList.copyOf(m.get().getMatches())); RestxHandlerMatch match = context.nextHandlerMatch(); match.handle(restxRequest, restxResponse, context);
@Override public void sendResponse(HttpStatus status, T value, RestxRequest req, RestxResponse resp, RestxContext ctx) throws IOException { resp.setStatus(status); resp.setContentType(contentType); writeHeaders(value, req, resp, ctx); ctx.getLifecycleListener().onBeforeWriteContent(req, resp); write(value, req, resp, ctx); ctx.getLifecycleListener().onAfterWriteContent(req, resp); }
@Override public void handle(RestxRequestMatch match, RestxRequest req, RestxResponse resp, RestxContext ctx) throws IOException { ctx.nextHandlerMatch().handle(req, resp, ctx); try { resp.close(); } catch (Exception e) { logger.error("ERROR while closing response: " + e.getMessage(), e); } } }
@Override public void handle(RestxRequestMatch match, RestxRequest req, RestxResponse resp, RestxContext ctx) throws IOException { ctx.nextHandlerMatch().handle(req, resp, ctx.withListener(new AbstractRouteLifecycleListener() { @Override @SuppressWarnings("unchecked") public void onEntityOutput(RestxRoute route, RestxRequest req, RestxResponse resp, Optional<?> input, Optional<?> output) { if (output.isPresent()) { provider.provideETagFor((T) output.get()).handleIn(req, resp); } } })); } }
@Override public void handle(RestxRequestMatch match, RestxRequest req, RestxResponse resp, RestxContext ctx) throws IOException { RouteLifecycleListener lifecycleListener = ctx.getLifecycleListener(); resp.setLogLevel(logLevel); lifecycleListener.onRouteMatch(this, req, resp); I input = entityRequestBodyReader.readBody(req, ctx); Optional<I> optionalInput = Optional.fromNullable(input); lifecycleListener.onEntityInput(this, req, resp, optionalInput); Optional<O> result = doRoute(req, resp, match, input); lifecycleListener.onEntityOutput(this, req, resp, optionalInput, result); if (result.isPresent()) { entityResponseWriter.sendResponse(getSuccessStatus(), result.get(), req, resp, ctx); } else { notFound(match, resp); } }
@Override public void handle(RestxRequestMatch match, RestxRequest req, RestxResponse resp, RestxContext ctx) throws IOException { String relativePath = this.requestRelativePath(req); relativePath = Optional.fromNullable(aliases.get(relativePath)).or(relativePath); try { URL resource = MoreResources.getResource( baseResourcePath + relativePath, RestxContext.Modes.DEV.equals(ctx.getMode()) || RestxContext.Modes.TEST.equals(ctx.getMode()) || RestxContext.Modes.INFINIREST.equals(ctx.getMode()) ); serveCacheableResource(resp, resource, relativePath); } catch (IllegalArgumentException e) { notFound(resp, relativePath); } }
public RestxContext withListener(final RouteLifecycleListener listener) { return new RestxContext(mode, new RouteLifecycleListener() { @Override public void onRouteMatch(RestxRoute source, RestxRequest req, RestxResponse resp) { lifecycleListener.onRouteMatch(source, req, resp); listener.onRouteMatch(source, req, resp); } @Override public void onBeforeWriteContent(RestxRequest req, RestxResponse resp) { lifecycleListener.onBeforeWriteContent(req, resp); listener.onBeforeWriteContent(req, resp); } @Override public void onAfterWriteContent(RestxRequest req, RestxResponse resp) { lifecycleListener.onAfterWriteContent(req, resp); listener.onAfterWriteContent(req, resp); } @Override public void onEntityInput(RestxRoute route, RestxRequest req, RestxResponse resp, Optional<?> input) { lifecycleListener.onEntityInput(route, req, resp, input); listener.onEntityInput(route, req, resp, input); } @Override public void onEntityOutput(RestxRoute route, RestxRequest req, RestxResponse resp, Optional<?> input, Optional<?> output) { lifecycleListener.onEntityOutput(route, req, resp, input, output); listener.onEntityOutput(route, req, resp, input, output); } }, matches, matchesIterator); }
@Override public void handle(RestxRequestMatch match, RestxRequest req, RestxResponse resp, RestxContext ctx) throws IOException { Stopwatch stopwatch = Stopwatch.createStarted(); try { ctx.nextHandlerMatch().handle(req, resp, ctx); } finally { collector.notifyRequest(req, resp, stopwatch.stop()); } }
@Override public void handle(RestxRequestMatch match, RestxRequest req, RestxResponse resp, RestxContext ctx) throws IOException { ctx.nextHandlerMatch().handle(req, resp, ctx.withListener(new AbstractRouteLifecycleListener() { @Override public void onBeforeWriteContent(RestxRequest req, RestxResponse resp) { if (!resp.getHeader("Cache-Control").isPresent()) { resp.setHeader("Cache-Control", "no-cache"); } } })); } }));
@Override public void handle(RestxRequestMatch match, RestxRequest req, RestxResponse resp, RestxContext ctx) throws IOException { RouteLifecycleListener lifecycleListener = ctx.getLifecycleListener(); resp.setLogLevel(logLevel); lifecycleListener.onRouteMatch(this, req, resp); I input = entityRequestBodyReader.readBody(req, ctx); Optional<I> optionalInput = Optional.fromNullable(input); lifecycleListener.onEntityInput(this, req, resp, optionalInput); Optional<O> result = doRoute(req, resp, match, input); lifecycleListener.onEntityOutput(this, req, resp, optionalInput, result); if (result.isPresent()) { entityResponseWriter.sendResponse(getSuccessStatus(), result.get(), req, resp, ctx); } else { notFound(match, resp); } }
@Override public void handle(RestxRequestMatch restxRequestMatch, RestxRequest restxRequest, RestxResponse restxResponse, RestxContext restxContext) throws IOException { try { restxContext.nextHandlerMatch().handle(restxRequest, new RestxResponseWrapper(restxResponse) { private GZIPOutputStream gzipOutputStream; @Override public OutputStream getOutputStream() throws IOException { setHeader("Content-Encoding", "gzip"); return gzipOutputStream = new GZIPOutputStream(super.getOutputStream()); } @Override public void close() throws Exception { if (gzipOutputStream != null) { try { gzipOutputStream.close(); } finally { gzipOutputStream = null; } } super.close(); } }, restxContext); } finally { } } }