package org.rendersnake.ext.spring; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.rendersnake.HtmlCanvas; import org.rendersnake.PageContext; import org.rendersnake.ext.servlet.RequestHeadersMap; import org.rendersnake.ext.servlet.RequestParametersMap; import org.rendersnake.ext.servlet.SessionAttributesMap; import org.springframework.core.MethodParameter; import org.springframework.web.bind.support.WebArgumentResolver; import org.springframework.web.context.request.NativeWebRequest; /** * HtmlCanvasArgumentResolver is a Spring Helper that is used * to prepare html arguments before invoking a Controller method. * <pre> * {@code * <!-- This Resolver exists for renderSnake HtmlCanvas parameter processing --> * <bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter"> * <property name="customArgumentResolver"> * <bean class="org.rendersnake.ext.spring.HtmlCanvasArgumentResolver"> * </bean> * </property> * </bean>} * </pre> * @author e.micklei **/ public class HtmlCanvasArgumentResolver implements WebArgumentResolver { /* (non-Javadoc) * @see org.springframework.web.bind.support.WebArgumentResolver#resolveArgument(org.springframework.core.MethodParameter, org.springframework.web.context.request.NativeWebRequest) */ public Object resolveArgument(MethodParameter methodParameter, NativeWebRequest webRequest) throws Exception { // only accept HtmlCanvas typed parameter if (methodParameter.getParameterType() != HtmlCanvas.class) return UNRESOLVED; HttpServletRequest request = (HttpServletRequest)(webRequest.getNativeRequest()); HttpServletResponse response = (HttpServletResponse)(webRequest.getNativeResponse()); response.setContentType("text/html"); // controllers may override this final HtmlCanvas canvas = HtmlCanvasFactory.createCanvas(request,response,response.getWriter()); setupPageContext(request, canvas.getPageContext()); return canvas; } static void setupPageContext(HttpServletRequest request, PageContext context) { String q = request.getQueryString(); context.withObject(PageContext.REQUEST_PATH, request.getPathTranslated()); context.withObject(PageContext.REQUEST_URIQ, request.getRequestURI() + (q == null ? "" : "?" + q)); context.withObject(PageContext.SESSION, new SessionAttributesMap(request)); context.withObject(PageContext.REQUEST_PARAMETERS, new RequestParametersMap(request)); context.withObject(PageContext.REQUEST_HEADERS, new RequestHeadersMap(request)); } }