Index: src/main/java/info/magnolia/module/blossom/view/TemplateView.java =================================================================== --- src/main/java/info/magnolia/module/blossom/view/TemplateView.java (revision Local version) +++ src/main/java/info/magnolia/module/blossom/view/TemplateView.java (revision Shelved version) @@ -62,8 +62,13 @@ Locale previousLocale = MgnlContext.getAggregationState().getLocale(); try { MgnlContext.getAggregationState().setLocale(RequestContextUtils.getLocale(request)); + MgnlContext.push(request, response); + try { - viewRenderer.renderTemplate(context.getContent(), context.getTemplate(), context.getOut()); - } finally { + viewRenderer.renderTemplate(context.getContent(), context.getTemplate(), context.getOut()); + } finally { + MgnlContext.pop(); + } + } finally { MgnlContext.getAggregationState().setLocale(previousLocale); } } Index: src/main/java/info/magnolia/module/blossom/support/ForwardRequestWrapper.java =================================================================== --- src/main/java/info/magnolia/module/blossom/support/ForwardRequestWrapper.java (revision Shelved version) +++ src/main/java/info/magnolia/module/blossom/support/ForwardRequestWrapper.java (revision Shelved version) @@ -0,0 +1,68 @@ +package info.magnolia.module.blossom.support; + +import org.apache.commons.lang.StringUtils; +import org.springframework.web.util.WebUtils; + +import javax.servlet.http.HttpServletRequest; + +public class ForwardRequestWrapper extends SpecialAttributeRequestWrapper { + + private final String requestUri; + private final String originalRequestUri; + private final String originalServletPath; + private final String originalContextPath; + private final String originalPathInfo; + + public ForwardRequestWrapper(HttpServletRequest request, String requestUri) { + super(request); + this.requestUri = requestUri; + this.originalRequestUri = request.getRequestURI(); + this.originalServletPath = request.getServletPath(); + this.originalContextPath = request.getContextPath(); + this.originalPathInfo = request.getPathInfo(); + if (request.getAttribute(WebUtils.FORWARD_REQUEST_URI_ATTRIBUTE) == null) { + setSpecialAttribute(WebUtils.FORWARD_REQUEST_URI_ATTRIBUTE, request.getRequestURI()); + setSpecialAttribute(WebUtils.FORWARD_CONTEXT_PATH_ATTRIBUTE, request.getContextPath()); + setSpecialAttribute(WebUtils.FORWARD_SERVLET_PATH_ATTRIBUTE, request.getServletPath()); + setSpecialAttribute(WebUtils.FORWARD_PATH_INFO_ATTRIBUTE, request.getPathInfo()); + setSpecialAttribute(WebUtils.FORWARD_QUERY_STRING_ATTRIBUTE, request.getQueryString()); + } + } + + @Override + public String getRequestURI() { + String currentRequestUri = super.getRequestURI(); + if (StringUtils.equals(currentRequestUri, originalRequestUri)) + return requestUri; + return currentRequestUri; + } + + @Override + public String getServletPath() { + String currentServletPath = super.getServletPath(); + if (StringUtils.equals(currentServletPath, originalServletPath)) + return requestUri; + return currentServletPath; + } + + @Override + public String getContextPath() { + String currentContextPath = super.getContextPath(); + if (StringUtils.equals(currentContextPath, originalContextPath)) + return ""; + return currentContextPath; + } + + @Override + public String getPathInfo() { + String superPathInfo = super.getPathInfo(); + if (StringUtils.equals(superPathInfo, originalPathInfo)) + return null; + return superPathInfo; + } + + @Override + public String getQueryString() { + return super.getQueryString(); + } +} Index: src/main/java/info/magnolia/module/blossom/support/IncludeRequestWrapper.java =================================================================== --- src/main/java/info/magnolia/module/blossom/support/IncludeRequestWrapper.java (revision Shelved version) +++ src/main/java/info/magnolia/module/blossom/support/IncludeRequestWrapper.java (revision Shelved version) @@ -0,0 +1,17 @@ +package info.magnolia.module.blossom.support; + +import org.springframework.web.util.WebUtils; + +import javax.servlet.http.HttpServletRequest; + +public class IncludeRequestWrapper extends SpecialAttributeRequestWrapper { + + public IncludeRequestWrapper(HttpServletRequest request, String requestUri) { + super(request); + setSpecialAttribute(WebUtils.INCLUDE_REQUEST_URI_ATTRIBUTE, requestUri); + setSpecialAttribute(WebUtils.INCLUDE_CONTEXT_PATH_ATTRIBUTE, ""); + setSpecialAttribute(WebUtils.INCLUDE_SERVLET_PATH_ATTRIBUTE, requestUri); + setSpecialAttribute(WebUtils.INCLUDE_PATH_INFO_ATTRIBUTE, null); + setSpecialAttribute(WebUtils.INCLUDE_QUERY_STRING_ATTRIBUTE, request.getQueryString()); + } +} Index: src/main/java/info/magnolia/module/blossom/support/SpecialAttributeRequestWrapper.java =================================================================== --- src/main/java/info/magnolia/module/blossom/support/SpecialAttributeRequestWrapper.java (revision Shelved version) +++ src/main/java/info/magnolia/module/blossom/support/SpecialAttributeRequestWrapper.java (revision Shelved version) @@ -0,0 +1,131 @@ +package info.magnolia.module.blossom.support; + +import org.apache.commons.lang.ObjectUtils; +import org.springframework.web.util.WebUtils; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletRequestWrapper; +import java.util.Enumeration; +import java.util.NoSuchElementException; + +public class SpecialAttributeRequestWrapper extends HttpServletRequestWrapper { + + private static final String[] specialNames = new String[]{ + WebUtils.INCLUDE_REQUEST_URI_ATTRIBUTE, + WebUtils.INCLUDE_CONTEXT_PATH_ATTRIBUTE, + WebUtils.INCLUDE_SERVLET_PATH_ATTRIBUTE, + WebUtils.INCLUDE_PATH_INFO_ATTRIBUTE, + WebUtils.INCLUDE_QUERY_STRING_ATTRIBUTE, + WebUtils.FORWARD_REQUEST_URI_ATTRIBUTE, + WebUtils.FORWARD_CONTEXT_PATH_ATTRIBUTE, + WebUtils.FORWARD_SERVLET_PATH_ATTRIBUTE, + WebUtils.FORWARD_PATH_INFO_ATTRIBUTE, + WebUtils.FORWARD_QUERY_STRING_ATTRIBUTE, + WebUtils.ERROR_STATUS_CODE_ATTRIBUTE, + WebUtils.ERROR_EXCEPTION_TYPE_ATTRIBUTE, + WebUtils.ERROR_MESSAGE_ATTRIBUTE, + WebUtils.ERROR_EXCEPTION_ATTRIBUTE, + WebUtils.ERROR_REQUEST_URI_ATTRIBUTE, + WebUtils.ERROR_SERVLET_NAME_ATTRIBUTE + }; + + private final Object[] localValues = new Object[specialNames.length]; + private final Object[] originalValues = new Object[specialNames.length]; + + public SpecialAttributeRequestWrapper(HttpServletRequest request) { + super(request); + } + + public boolean setSpecialAttribute(String name, Object value) { + for (int i = 0; i < specialNames.length; i++) + if (name.equals(specialNames[i])) { + localValues[i] = value; + originalValues[i] = super.getAttribute(name); + return true; + } + return false; + } + + @Override + public Object getAttribute(String name) { + for (int i = 0; i < specialNames.length; i++) { + if (specialNames[i].equals(name) && localValues[i] != null) { + Object currentValue = super.getAttribute(name); + if (ObjectUtils.equals(currentValue, originalValues[i])) + return localValues[i]; + return currentValue; + } + } + return super.getAttribute(name); + } + + @Override + public Enumeration getAttributeNames() { + + return new Enumeration() { + + private int pos = 0; + private String next = null; + private Enumeration parentEnumeration = getRequest().getAttributeNames(); + + public boolean hasMoreElements() { + while (pos < localValues.length) { + if (localValues[pos] != null) + return true; + pos++; + } + if (next != null) + return true; + next = findNext(); + return next != null; + } + + public Object nextElement() { + while (pos < localValues.length) { + if (localValues[pos] != null) { + String name = specialNames[pos]; + pos++; + return name; + } + pos++; + } + if (next == null) { + next = findNext(); + if (next == null) + throw new NoSuchElementException(); + } + Object result = next; + next = null; + return result; + } + + private String findNext() { + while (parentEnumeration.hasMoreElements()) { + String name = (String) parentEnumeration.nextElement(); + if (!hasLocalValue(name)) + return next; + } + return null; + } + }; + } + + @Override + public void setAttribute(String name, Object o) { + if (!hasLocalValue(name)) + super.setAttribute(name, o); + } + + @Override + public void removeAttribute(String name) { + if (!hasLocalValue(name)) + super.removeAttribute(name); + } + + private boolean hasLocalValue(String name) { + for (int i = 0; i < specialNames.length; i++) + if (name.equals(specialNames[i]) && localValues[i] != null) + return true; + return false; + } +} Index: src/main/java/info/magnolia/module/blossom/view/ParagraphView.java =================================================================== --- src/main/java/info/magnolia/module/blossom/view/ParagraphView.java (revision Local version) +++ src/main/java/info/magnolia/module/blossom/view/ParagraphView.java (revision Shelved version) @@ -62,8 +62,13 @@ Locale previousLocale = MgnlContext.getAggregationState().getLocale(); try { MgnlContext.getAggregationState().setLocale(RequestContextUtils.getLocale(request)); + MgnlContext.push(request, response); + try { - viewRenderer.render(context.getContent(), context.getParagraph(), context.getOut()); - } finally { + viewRenderer.render(context.getContent(), context.getParagraph(), context.getOut()); + } finally { + MgnlContext.pop(); + } + } finally { MgnlContext.getAggregationState().setLocale(previousLocale); } } Index: src/main/java/info/magnolia/module/blossom/render/BlossomDispatcherServlet.java =================================================================== --- src/main/java/info/magnolia/module/blossom/render/BlossomDispatcherServlet.java (revision Local version) +++ src/main/java/info/magnolia/module/blossom/render/BlossomDispatcherServlet.java (revision Shelved version) @@ -40,7 +40,8 @@ import info.magnolia.module.blossom.dispatcher.BlossomDispatcher; import info.magnolia.module.blossom.dispatcher.BlossomDispatcherAwareBeanPostProcessor; import info.magnolia.module.blossom.paragraph.ParagraphExporter; -import info.magnolia.module.blossom.support.ServletPathOverridingRequestWrapper; +import info.magnolia.module.blossom.support.ForwardRequestWrapper; +import info.magnolia.module.blossom.support.IncludeRequestWrapper; import info.magnolia.module.blossom.template.TemplateExporter; import info.magnolia.module.blossom.urimapping.AnnotatedVirtualURIMappingExporter; import info.magnolia.module.blossom.urimapping.VirtualURIMappingExporter; @@ -52,6 +53,7 @@ import org.springframework.web.servlet.DispatcherServlet; import org.springframework.web.servlet.HandlerAdapter; import org.springframework.web.servlet.LocaleResolver; +import org.springframework.web.util.WebUtils; import javax.servlet.ServletException; import javax.servlet.http.HttpServletRequest; @@ -101,12 +103,17 @@ HttpServletRequest request = webContext.getRequest(); HttpServletResponse response = webContext.getResponse(); - // Wrap the request to fool spring into thinking the request is for 'handlerPath' - request = new ServletPathOverridingRequestWrapper(request, handlerPath); + if (WebUtils.isIncludeRequest(request)) { + request = new IncludeRequestWrapper(request, handlerPath); + } else { + request = new ForwardRequestWrapper(request, handlerPath); + } - // Wrap the response to make sure that Spring renders to the writer. - //response = new WriterResponseWrapper(response, out); - + MgnlContext.push(request, response); + try { - super.service(request, response); + super.service(request, response); + } finally { + MgnlContext.pop(); - } -} + } + } +}