package org.apache.struts2.views.tiles; import com.opensymphony.xwork2.ActionInvocation; import freemarker.template.TemplateException; import org.apache.struts2.ServletActionContext; import org.apache.struts2.dispatcher.ServletDispatcherResult; import org.apache.struts2.portlet.PortletConstants; import org.apache.struts2.portlet.context.PortletActionContext; import org.apache.tiles.TilesContainer; import org.apache.tiles.TilesException; import org.apache.tiles.access.TilesAccess; import javax.portlet.ActionResponse; import javax.portlet.PortletException; import javax.servlet.ServletContext; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.util.Map; /** * JIRA WW-2749 (STRUTS). */ public class PortletTilesResult extends ServletDispatcherResult { private static final long serialVersionUID = -3806939435493086244L; public PortletTilesResult() { super(); } public PortletTilesResult(String location) { super(location); } // FIXME PATCH du JIRA WW-2749 (STRUTS) public void doExecute(String location, ActionInvocation invocation) throws IOException, TemplateException, PortletException, TilesException { if (PortletActionContext.getPhase().isAction() || PortletActionContext.getPhase().isEvent()) { executeActionResult(location, invocation); } else { executeRenderResult(location); } } /** * @param location * @throws TilesException */ protected void executeRenderResult(String location) throws TilesException { setLocation(location); ServletContext servletContext = ServletActionContext.getServletContext(); TilesContainer container = TilesAccess.getContainer(servletContext); HttpServletRequest request = ServletActionContext.getRequest(); HttpServletResponse response = ServletActionContext.getResponse(); container.render(location, request, response); } /** * @param location * @param invocation */ protected void executeActionResult(String location, ActionInvocation invocation) { ActionResponse res = PortletActionContext.getActionResponse(); res.setRenderParameter(PortletConstants.ACTION_PARAM, "tilesDirect"); Map<String, Object> sessionMap = invocation.getInvocationContext().getSession(); sessionMap.put(PortletConstants.RENDER_DIRECT_LOCATION, location); res.setRenderParameter(PortletConstants.MODE_PARAM, PortletActionContext.getRequest().getPortletMode().toString()); } }