/** * Unwrap a ServletResponse. * * @see javax.servlet.ServletResponseWrapper * @see javax.servlet.http.HttpServletResponseWrapper * @param response * @return The core ServletHttpResponse which must be the underlying response object */ public static ServletHttpResponse unwrap(ServletResponse response) { while (!(response instanceof ServletHttpResponse)) { if (response instanceof ServletResponseWrapper) { ServletResponseWrapper wrapper = (ServletResponseWrapper) response; response = wrapper.getResponse(); } else throw new IllegalArgumentException("Does not wrap ServletHttpResponse"); } return (ServletHttpResponse) response; }
/** * Creates a wrapper that implements either {@code ServletResponse} or {@code * HttpServletResponse}, depending on the type of {@code pImplementation.getResponse()}. * * @param pImplementation the servlet response to create a wrapper for * @return a {@code ServletResponse} or {@code HttpServletResponse}, depending on the type of * {@code pImplementation.getResponse()} */ public static ServletResponse createWrapper(final ServletResponseWrapper pImplementation) { // TODO: Get all interfaces from implementation if (pImplementation.getResponse() instanceof HttpServletResponse) { return (HttpServletResponse) Proxy.newProxyInstance( pImplementation.getClass().getClassLoader(), new Class[] {HttpServletResponse.class, ServletResponse.class}, new HttpServletResponseHandler(pImplementation)); } return pImplementation; }
public Object invoke(final Object pProxy, final Method pMethod, final Object[] pArgs) throws Throwable { try { // TODO: Allow partial implementing? if (pMethod.getDeclaringClass().isInstance(response)) { return pMethod.invoke(response, pArgs); } // Method is not implemented in wrapper return pMethod.invoke(response.getResponse(), pArgs); } catch (InvocationTargetException e) { // Unwrap, to avoid UndeclaredThrowableException... throw e.getTargetException(); } }