private ResponseHandler createResponseHandler(AtomicReference<Boolean> responseReturned, HttpServletRequest httpRequest, HttpServletResponse httpResponse) { return jdiscResponse -> { boolean oldValueWasNull = responseReturned.compareAndSet(null, true); if (!oldValueWasNull) throw new RuntimeException("Can't return response from filter asynchronously"); HttpRequestDispatch requestDispatch = createRequestDispatch(httpRequest, httpResponse); return requestDispatch.handleRequestFilterResponse(jdiscResponse); }; }
@Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { HttpServletRequest httpRequest = (HttpServletRequest)request; HttpServletResponse httpResponse = (HttpServletResponse)response; URI uri = HttpRequestFactory.getUri(httpRequest); AtomicReference<Boolean> responseReturned = new AtomicReference<>(null); HttpServletRequest newRequest = runRequestFilterWithMatchingBinding(responseReturned, uri, httpRequest, httpResponse); assert newRequest != null; responseReturned.compareAndSet(null, false); if (!responseReturned.get()) { runChainAndResponseFilters(uri, newRequest, httpResponse, chain); } }
private HttpServletRequest runRequestFilterWithMatchingBinding(AtomicReference<Boolean> responseReturned, URI uri, HttpServletRequest request, HttpServletResponse response) throws IOException { try { RequestFilter requestFilter = jDiscContext.requestFilters.resolve(uri); if (requestFilter == null) return request; ResponseHandler responseHandler = createResponseHandler(responseReturned, request, response); return filterInvoker.invokeRequestFilterChain(requestFilter, uri, request, responseHandler); } catch (Exception e) { throw new RuntimeException("Failed running request filter chain for uri " + uri, e); } }
FilterHolder jDiscFilterInvokerFilter = new FilterHolder(new JDiscFilterInvokerFilter(jDiscContext, filterInvoker));