Author: rgielen Date: Thu Aug 23 01:57:36 2007 New Revision: 568895 URL: http://svn.apache.org/viewvc?rev=568895&view=rev Log: WW-1989, WW-2052, WW-2053, WW-2101, WW-2105: Backporting portlet servlet wrapping, portlet redirect/redirectAction result and related issues to 2.0.x
Modified: struts/struts2/branches/STRUTS_2_0_X/core/src/main/java/org/apache/struts2/components/URL.java struts/struts2/branches/STRUTS_2_0_X/core/src/main/java/org/apache/struts2/portlet/PortletActionConstants.java struts/struts2/branches/STRUTS_2_0_X/core/src/main/java/org/apache/struts2/portlet/context/PortletActionContext.java struts/struts2/branches/STRUTS_2_0_X/core/src/main/java/org/apache/struts2/portlet/dispatcher/DirectRenderFromEventAction.java struts/struts2/branches/STRUTS_2_0_X/core/src/main/java/org/apache/struts2/portlet/dispatcher/Jsr168Dispatcher.java struts/struts2/branches/STRUTS_2_0_X/core/src/main/java/org/apache/struts2/portlet/result/PortletResult.java struts/struts2/branches/STRUTS_2_0_X/core/src/main/java/org/apache/struts2/portlet/result/PortletVelocityResult.java struts/struts2/branches/STRUTS_2_0_X/core/src/main/java/org/apache/struts2/views/freemarker/PortletFreemarkerResult.java struts/struts2/branches/STRUTS_2_0_X/core/src/main/resources/struts-portlet-default.xml struts/struts2/branches/STRUTS_2_0_X/core/src/test/java/org/apache/struts2/portlet/dispatcher/Jsr168DispatcherTest.java struts/struts2/branches/STRUTS_2_0_X/core/src/test/java/org/apache/struts2/portlet/result/PortletResultTest.java Modified: struts/struts2/branches/STRUTS_2_0_X/core/src/main/java/org/apache/struts2/components/URL.java URL: http://svn.apache.org/viewvc/struts/struts2/branches/STRUTS_2_0_X/core/src/main/java/org/apache/struts2/components/URL.java?rev=568895&r1=568894&r2=568895&view=diff ============================================================================== --- struts/struts2/branches/STRUTS_2_0_X/core/src/main/java/org/apache/struts2/components/URL.java (original) +++ struts/struts2/branches/STRUTS_2_0_X/core/src/main/java/org/apache/struts2/components/URL.java Thu Aug 23 01:57:36 2007 @@ -341,7 +341,7 @@ this.windowState = windowState; } - @StrutsTagAttribute(description="Specifies if this should be a portlet render or action URL") + @StrutsTagAttribute(description="Specifies if this should be a portlet render or action URL. Default is \"render\". To create an action URL, use \"action\".") public void setPortletUrlType(String portletUrlType) { this.portletUrlType = portletUrlType; } Modified: struts/struts2/branches/STRUTS_2_0_X/core/src/main/java/org/apache/struts2/portlet/PortletActionConstants.java URL: http://svn.apache.org/viewvc/struts/struts2/branches/STRUTS_2_0_X/core/src/main/java/org/apache/struts2/portlet/PortletActionConstants.java?rev=568895&r1=568894&r2=568895&view=diff ============================================================================== --- struts/struts2/branches/STRUTS_2_0_X/core/src/main/java/org/apache/struts2/portlet/PortletActionConstants.java (original) +++ struts/struts2/branches/STRUTS_2_0_X/core/src/main/java/org/apache/struts2/portlet/PortletActionConstants.java Thu Aug 23 01:57:36 2007 @@ -103,4 +103,24 @@ * [EMAIL PROTECTED] org.apache.struts2.portlet.context.PortletActionContext}. */ String DEFAULT_ACTION_FOR_MODE = "struts.portlet.defaultActionForMode"; + + /** + * Key for request attribute indicating if the action has been reset. + */ + String ACTION_RESET = "struts.portlet.actionReset"; + + /** + * Key for session attribute indicating the location of the render direct action. + */ + String RENDER_DIRECT_LOCATION = "struts.portlet.renderDirectLocation"; + + /** + * Session key where the value stack from the event phase is stored. + */ + String STACK_FROM_EVENT_PHASE = "struts.portlet.valueStackFromEventPhase"; + + /** + * Default name of dispatcher servlet in web.xml + */ + String DEFAULT_DISPATCHER_SERVLET_NAME = "Struts2PortletDispatcherServlet"; } Modified: struts/struts2/branches/STRUTS_2_0_X/core/src/main/java/org/apache/struts2/portlet/context/PortletActionContext.java URL: http://svn.apache.org/viewvc/struts/struts2/branches/STRUTS_2_0_X/core/src/main/java/org/apache/struts2/portlet/context/PortletActionContext.java?rev=568895&r1=568894&r2=568895&view=diff ============================================================================== --- struts/struts2/branches/STRUTS_2_0_X/core/src/main/java/org/apache/struts2/portlet/context/PortletActionContext.java (original) +++ struts/struts2/branches/STRUTS_2_0_X/core/src/main/java/org/apache/struts2/portlet/context/PortletActionContext.java Thu Aug 23 01:57:36 2007 @@ -22,16 +22,11 @@ import java.util.Map; -import javax.portlet.ActionRequest; -import javax.portlet.ActionResponse; -import javax.portlet.PortletConfig; -import javax.portlet.PortletRequest; -import javax.portlet.PortletResponse; -import javax.portlet.RenderRequest; -import javax.portlet.RenderResponse; +import javax.portlet.*; import org.apache.struts2.dispatcher.mapper.ActionMapping; import org.apache.struts2.portlet.PortletActionConstants; +import org.apache.struts2.StrutsStatics; import com.opensymphony.xwork2.ActionContext; @@ -192,6 +187,14 @@ */ public static Map getModeNamespaceMap() { return (Map)getContext().get(MODE_NAMESPACE_MAP); + } + + /** + * Get the portlet context. + * @return The portlet context. + */ + public static PortletContext getPortletContext() { + return (PortletContext)getContext().get(StrutsStatics.STRUTS_PORTLET_CONTEXT); } } Modified: struts/struts2/branches/STRUTS_2_0_X/core/src/main/java/org/apache/struts2/portlet/dispatcher/DirectRenderFromEventAction.java URL: http://svn.apache.org/viewvc/struts/struts2/branches/STRUTS_2_0_X/core/src/main/java/org/apache/struts2/portlet/dispatcher/DirectRenderFromEventAction.java?rev=568895&r1=568894&r2=568895&view=diff ============================================================================== --- struts/struts2/branches/STRUTS_2_0_X/core/src/main/java/org/apache/struts2/portlet/dispatcher/DirectRenderFromEventAction.java (original) +++ struts/struts2/branches/STRUTS_2_0_X/core/src/main/java/org/apache/struts2/portlet/dispatcher/DirectRenderFromEventAction.java Thu Aug 23 01:57:36 2007 @@ -23,6 +23,10 @@ import com.opensymphony.xwork2.Action; import java.io.Serializable; +import java.util.Map; + +import org.apache.struts2.interceptor.SessionAware; +import org.apache.struts2.portlet.PortletActionConstants; /** * When a portlet is targetted for an <code>event</code>, the portlet will receive two @@ -38,7 +42,7 @@ * specifying this action and the location of the view, which then will be executed in the * following render request. */ -public class DirectRenderFromEventAction implements Action, Serializable { +public class DirectRenderFromEventAction implements SessionAware, PortletActionConstants, Action, Serializable { private static final long serialVersionUID = -1814807772308405785L; @@ -54,20 +58,15 @@ } /** - * Set the location of the view. - * - * @param location The location to set. - */ - public void setLocation(String location) { - this.location = location; - } - - /** * Always return success. * * @return SUCCESS */ public String execute() throws Exception { return SUCCESS; + } + + public void setSession(Map session) { + location = (String)session.get(RENDER_DIRECT_LOCATION); } } Modified: struts/struts2/branches/STRUTS_2_0_X/core/src/main/java/org/apache/struts2/portlet/dispatcher/Jsr168Dispatcher.java URL: http://svn.apache.org/viewvc/struts/struts2/branches/STRUTS_2_0_X/core/src/main/java/org/apache/struts2/portlet/dispatcher/Jsr168Dispatcher.java?rev=568895&r1=568894&r2=568895&view=diff ============================================================================== --- struts/struts2/branches/STRUTS_2_0_X/core/src/main/java/org/apache/struts2/portlet/dispatcher/Jsr168Dispatcher.java (original) +++ struts/struts2/branches/STRUTS_2_0_X/core/src/main/java/org/apache/struts2/portlet/dispatcher/Jsr168Dispatcher.java Thu Aug 23 01:57:36 2007 @@ -20,23 +20,14 @@ */ package org.apache.struts2.portlet.dispatcher; -import java.io.IOException; -import java.util.Enumeration; -import java.util.HashMap; -import java.util.Locale; -import java.util.Map; - -import javax.portlet.ActionRequest; -import javax.portlet.ActionResponse; -import javax.portlet.GenericPortlet; -import javax.portlet.PortletConfig; -import javax.portlet.PortletException; -import javax.portlet.PortletMode; -import javax.portlet.PortletRequest; -import javax.portlet.PortletResponse; -import javax.portlet.RenderRequest; -import javax.portlet.RenderResponse; - +import com.opensymphony.xwork2.ActionContext; +import com.opensymphony.xwork2.ActionProxy; +import com.opensymphony.xwork2.ActionProxyFactory; +import com.opensymphony.xwork2.config.ConfigurationException; +import com.opensymphony.xwork2.inject.Container; +import com.opensymphony.xwork2.util.FileManager; +import com.opensymphony.xwork2.util.LocalizedTextUtil; +import com.opensymphony.xwork2.util.TextUtils; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.apache.struts2.StrutsConstants; @@ -53,19 +44,20 @@ import org.apache.struts2.portlet.PortletRequestMap; import org.apache.struts2.portlet.PortletSessionMap; import org.apache.struts2.portlet.context.PortletActionContext; -import org.apache.struts2.portlet.context.ServletContextHolderListener; -import org.apache.struts2.portlet.util.HttpServletRequestMock; +import org.apache.struts2.portlet.servlet.PortletServletContext; +import org.apache.struts2.portlet.servlet.PortletServletRequest; +import org.apache.struts2.portlet.servlet.PortletServletResponse; import org.apache.struts2.util.AttributeMap; -import com.opensymphony.xwork2.util.FileManager; -import com.opensymphony.xwork2.util.ValueStack; -import com.opensymphony.xwork2.ActionContext; -import com.opensymphony.xwork2.ActionProxy; -import com.opensymphony.xwork2.ActionProxyFactory; -import com.opensymphony.xwork2.config.ConfigurationException; -import com.opensymphony.xwork2.inject.Container; -import com.opensymphony.xwork2.util.LocalizedTextUtil; -import com.opensymphony.xwork2.util.TextUtils; +import javax.portlet.*; +import javax.servlet.ServletContext; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; +import java.util.Enumeration; +import java.util.HashMap; +import java.util.Locale; +import java.util.Map; /** * <!-- START SNIPPET: javadoc --> @@ -76,7 +68,7 @@ * </p> * <!-- END SNIPPET: javadoc --> * - * @author <a href="[EMAIL PROTECTED]">Nils-Helge Garli </a> + * @author Nils-Helge Garli * @author Rainer Hermanns * * <p><b>Init parameters</b></p> @@ -187,9 +179,10 @@ String value = cfg.getInitParameter(name); params.put(name, value); } - + + // TODO: CHECK IF NEEDED (RG Portlet Refactoring Backports) Dispatcher.setPortletSupportActive(true); - dispatcherUtils = new Dispatcher(ServletContextHolderListener.getServletContext(), params); + dispatcherUtils = new Dispatcher(new PortletServletContext(cfg.getPortletContext()), params); dispatcherUtils.init(); // For testability @@ -336,11 +329,22 @@ */ public HashMap createContextMap(Map requestMap, Map parameterMap, Map sessionMap, Map applicationMap, PortletRequest request, - PortletResponse response, PortletConfig portletConfig, Integer phase) { + PortletResponse response, PortletConfig portletConfig, Integer phase) throws IOException { // TODO Must put http request/response objects into map for use with // ServletActionContext + HttpServletResponse dummyResponse = new PortletServletResponse(response); + HttpServletRequest dummyRequest = new PortletServletRequest(request, getPortletContext()); + ServletContext dummyServletContext = new PortletServletContext(getPortletContext()); + if(EVENT_PHASE.equals(phase)) { + dummyRequest = dispatcherUtils.wrapRequest(dummyRequest, dummyServletContext); + } HashMap<String,Object> extraContext = new HashMap<String,Object>(); + // The dummy servlet objects. Eases reuse of existing interceptors that uses the servlet objects. + extraContext.put(StrutsStatics.HTTP_REQUEST, dummyRequest); + extraContext.put(StrutsStatics.HTTP_RESPONSE, dummyResponse); + extraContext.put(StrutsStatics.SERVLET_CONTEXT, dummyServletContext); + // End dummy servlet objects extraContext.put(ActionContext.PARAMETERS, parameterMap); extraContext.put(ActionContext.SESSION, sessionMap); extraContext.put(ActionContext.APPLICATION, applicationMap); @@ -397,13 +401,13 @@ Map sessionMap, Map applicationMap, String portletNamespace, Integer phase) throws PortletException { LOG.debug("serviceAction"); - HashMap extraContext = createContextMap(requestMap, parameterMap, - sessionMap, applicationMap, request, response, - getPortletConfig(), phase); String actionName = mapping.getName(); String namespace = mapping.getNamespace(); Dispatcher.setInstance(dispatcherUtils); try { + HashMap extraContext = createContextMap(requestMap, parameterMap, + sessionMap, applicationMap, request, response, + getPortletConfig(), phase); LOG.debug("Creating action proxy for name = " + actionName + ", namespace = " + namespace); ActionProxy proxy = factory.createActionProxy(namespace, @@ -411,27 +415,7 @@ proxy.setMethod(mapping.getMethod()); request.setAttribute("struts.valueStack", proxy.getInvocation() .getStack()); - if (PortletActionConstants.RENDER_PHASE.equals(phase) - && TextUtils.stringSet(request - .getParameter(EVENT_ACTION))) { - - ActionProxy action = (ActionProxy) request.getPortletSession() - .getAttribute(EVENT_ACTION); - if (action != null) { - ValueStack stack = proxy.getInvocation().getStack(); - Object top = stack.pop(); - stack.push(action.getInvocation().getAction()); - stack.push(top); - } - } proxy.execute(); - if (PortletActionConstants.EVENT_PHASE.equals(phase)) { - // Store the executed action in the session for retrieval in the - // render phase. - ActionResponse actionResp = (ActionResponse) response; - request.getPortletSession().setAttribute(EVENT_ACTION, proxy); - actionResp.setRenderParameter(EVENT_ACTION, "true"); - } } catch (ConfigurationException e) { LOG.error("Could not find action", e); throw new PortletException("Could not find action " + actionName, e); @@ -467,20 +451,18 @@ ActionMapping mapping = null; String actionPath = null; if (resetAction(request)) { - mapping = (ActionMapping) actionMap.get(request.getPortletMode()); + mapping = actionMap.get(request.getPortletMode()); } else { actionPath = request.getParameter(ACTION_PARAM); if (!TextUtils.stringSet(actionPath)) { - mapping = (ActionMapping) actionMap.get(request + mapping = actionMap.get(request .getPortletMode()); } else { // Use the usual action mapper, but it is expecting an action extension // on the uri, so we add the default one, which should be ok as the // portlet is a portlet first, a servlet second - HttpServletRequestMock httpRequest = new HttpServletRequestMock() - .setServletPath(actionPath + ".action") - .setParameterMap(request.getParameterMap()); + PortletServletRequest httpRequest = new PortletServletRequest(request, getPortletContext()); mapping = actionMapper.getMapping(httpRequest, dispatcherUtils.getConfigurationManager()); } } @@ -583,6 +565,12 @@ if (!currentMode.equals(originatingMode)) { reset = true; } + } + if(reset) { + request.setAttribute(ACTION_RESET, Boolean.TRUE); + } + else { + request.setAttribute(ACTION_RESET, Boolean.FALSE); } return reset; } Modified: struts/struts2/branches/STRUTS_2_0_X/core/src/main/java/org/apache/struts2/portlet/result/PortletResult.java URL: http://svn.apache.org/viewvc/struts/struts2/branches/STRUTS_2_0_X/core/src/main/java/org/apache/struts2/portlet/result/PortletResult.java?rev=568895&r1=568894&r2=568895&view=diff ============================================================================== --- struts/struts2/branches/STRUTS_2_0_X/core/src/main/java/org/apache/struts2/portlet/result/PortletResult.java (original) +++ struts/struts2/branches/STRUTS_2_0_X/core/src/main/java/org/apache/struts2/portlet/result/PortletResult.java Thu Aug 23 01:57:36 2007 @@ -20,20 +20,8 @@ */ package org.apache.struts2.portlet.result; -import java.io.IOException; -import java.util.StringTokenizer; - -import javax.portlet.ActionResponse; -import javax.portlet.PortletConfig; -import javax.portlet.PortletException; -import javax.portlet.PortletRequestDispatcher; -import javax.portlet.RenderRequest; -import javax.portlet.RenderResponse; -import javax.servlet.ServletContext; -import javax.servlet.ServletException; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; - +import com.opensymphony.xwork2.ActionInvocation; +import com.opensymphony.xwork2.util.TextUtils; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.apache.struts2.ServletActionContext; @@ -41,14 +29,20 @@ import org.apache.struts2.portlet.PortletActionConstants; import org.apache.struts2.portlet.context.PortletActionContext; -import com.opensymphony.xwork2.ActionInvocation; -import com.opensymphony.xwork2.util.TextUtils; +import javax.portlet.*; +import javax.servlet.ServletContext; +import javax.servlet.ServletException; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; +import java.util.StringTokenizer; +import java.util.Map; /** * Result type that includes a JSP to render. * */ -public class PortletResult extends StrutsResultSupport { +public class PortletResult extends StrutsResultSupport implements PortletActionConstants { private static final long serialVersionUID = 434251393926178567L; @@ -116,28 +110,26 @@ * @param finalLocation * @param invocation */ - protected void executeActionResult(String finalLocation, - ActionInvocation invocation) { + protected void executeActionResult(String finalLocation, ActionInvocation invocation) { LOG.debug("Executing result in Event phase"); ActionResponse res = PortletActionContext.getActionResponse(); + Map sessionMap = invocation.getInvocationContext().getSession(); LOG.debug("Setting event render parameter: " + finalLocation); if (finalLocation.indexOf('?') != -1) { - convertQueryParamsToRenderParams(res, finalLocation - .substring(finalLocation.indexOf('?') + 1)); - finalLocation = finalLocation.substring(0, finalLocation - .indexOf('?')); + convertQueryParamsToRenderParams(res, finalLocation.substring(finalLocation.indexOf('?') + 1)); + finalLocation = finalLocation.substring(0, finalLocation.indexOf('?')); } if (finalLocation.endsWith(".action")) { // View is rendered with a view action...luckily... finalLocation = finalLocation.substring(0, finalLocation .lastIndexOf(".")); - res.setRenderParameter(PortletActionConstants.ACTION_PARAM, finalLocation); + res.setRenderParameter(ACTION_PARAM, finalLocation); } else { // View is rendered outside an action...uh oh... res.setRenderParameter(PortletActionConstants.ACTION_PARAM, "renderDirect"); - res.setRenderParameter("location", finalLocation); + sessionMap.put(RENDER_DIRECT_LOCATION, finalLocation); } - res.setRenderParameter(PortletActionConstants.MODE_PARAM, PortletActionContext + res.setRenderParameter(MODE_PARAM, PortletActionContext .getRequest().getPortletMode().toString()); } @@ -178,20 +170,6 @@ res.setTitle(title); } LOG.debug("Location: " + finalLocation); - PortletRequestDispatcher preparator = cfg.getPortletContext() - .getNamedDispatcher("preparator"); - if(preparator == null) { - throw new PortletException("Cannot look up 'preparator' servlet. Make sure that you" + - "have configured it correctly in the web.xml file."); - } - new IncludeTemplate() { - protected void when(PortletException e) { - LOG.error("PortletException while dispatching to 'preparator' servlet", e); - } - protected void when(IOException e) { - LOG.error("IOException while dispatching to 'preparator' servlet", e); - } - }.include(preparator, req, res); PortletRequestDispatcher dispatcher = cfg.getPortletContext().getRequestDispatcher(finalLocation); if(dispatcher == null) { throw new PortletException("Could not locate dispatcher for '" + finalLocation + "'"); Modified: struts/struts2/branches/STRUTS_2_0_X/core/src/main/java/org/apache/struts2/portlet/result/PortletVelocityResult.java URL: http://svn.apache.org/viewvc/struts/struts2/branches/STRUTS_2_0_X/core/src/main/java/org/apache/struts2/portlet/result/PortletVelocityResult.java?rev=568895&r1=568894&r2=568895&view=diff ============================================================================== --- struts/struts2/branches/STRUTS_2_0_X/core/src/main/java/org/apache/struts2/portlet/result/PortletVelocityResult.java (original) +++ struts/struts2/branches/STRUTS_2_0_X/core/src/main/java/org/apache/struts2/portlet/result/PortletVelocityResult.java Thu Aug 23 01:57:36 2007 @@ -20,20 +20,10 @@ */ package org.apache.struts2.portlet.result; -import java.io.IOException; -import java.io.OutputStreamWriter; -import java.io.Writer; - -import javax.portlet.ActionResponse; -import javax.portlet.PortletException; -import javax.portlet.PortletRequestDispatcher; -import javax.servlet.Servlet; -import javax.servlet.ServletContext; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; -import javax.servlet.jsp.JspFactory; -import javax.servlet.jsp.PageContext; - +import com.opensymphony.xwork2.ActionContext; +import com.opensymphony.xwork2.ActionInvocation; +import com.opensymphony.xwork2.inject.Inject; +import com.opensymphony.xwork2.util.ValueStack; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.apache.struts2.ServletActionContext; @@ -47,10 +37,15 @@ import org.apache.velocity.app.VelocityEngine; import org.apache.velocity.context.Context; -import com.opensymphony.xwork2.ActionContext; -import com.opensymphony.xwork2.ActionInvocation; -import com.opensymphony.xwork2.inject.Inject; -import com.opensymphony.xwork2.util.ValueStack; +import javax.portlet.ActionResponse; +import javax.servlet.Servlet; +import javax.servlet.ServletContext; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import javax.servlet.jsp.JspFactory; +import javax.servlet.jsp.PageContext; +import java.io.OutputStreamWriter; +import java.io.Writer; /** * <!-- START SNIPPET: description --> @@ -160,7 +155,6 @@ */ public void executeRenderResult(String finalLocation, ActionInvocation invocation) throws Exception { - prepareServletActionContext(); ValueStack stack = ActionContext.getContext().getValueStack(); HttpServletRequest request = ServletActionContext.getRequest(); @@ -192,7 +186,7 @@ if (encoding != null) { contentType = contentType + ";charset=" + encoding; } - + response.setContentType(contentType); Template t = getTemplate(stack, velocityManager.getVelocityEngine(), invocation, finalLocation, encoding); @@ -202,8 +196,6 @@ Writer writer = new OutputStreamWriter(response.getOutputStream(), encoding); - response.setContentType(contentType); - t.merge(context, writer); // always flush the writer (we used to only flush it if this was a @@ -294,14 +286,4 @@ return velocityManager.createContext(stack, request, response); } - /** - * Prepares the servlet action context for this request - */ - private void prepareServletActionContext() throws PortletException, - IOException { - PortletRequestDispatcher disp = PortletActionContext.getPortletConfig() - .getPortletContext().getNamedDispatcher("preparator"); - disp.include(PortletActionContext.getRenderRequest(), - PortletActionContext.getRenderResponse()); - } } Modified: struts/struts2/branches/STRUTS_2_0_X/core/src/main/java/org/apache/struts2/views/freemarker/PortletFreemarkerResult.java URL: http://svn.apache.org/viewvc/struts/struts2/branches/STRUTS_2_0_X/core/src/main/java/org/apache/struts2/views/freemarker/PortletFreemarkerResult.java?rev=568895&r1=568894&r2=568895&view=diff ============================================================================== --- struts/struts2/branches/STRUTS_2_0_X/core/src/main/java/org/apache/struts2/views/freemarker/PortletFreemarkerResult.java (original) +++ struts/struts2/branches/STRUTS_2_0_X/core/src/main/java/org/apache/struts2/views/freemarker/PortletFreemarkerResult.java Thu Aug 23 01:57:36 2007 @@ -20,33 +20,24 @@ */ package org.apache.struts2.views.freemarker; -import java.io.IOException; -import java.io.Writer; -import java.util.Locale; - -import javax.portlet.ActionResponse; -import javax.portlet.PortletException; -import javax.portlet.PortletRequestDispatcher; -import javax.servlet.ServletContext; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; - +import com.opensymphony.xwork2.ActionInvocation; +import com.opensymphony.xwork2.inject.Inject; +import com.opensymphony.xwork2.util.ValueStack; +import freemarker.template.*; import org.apache.struts2.ServletActionContext; import org.apache.struts2.dispatcher.StrutsResultSupport; import org.apache.struts2.portlet.PortletActionConstants; import org.apache.struts2.portlet.context.PortletActionContext; import org.apache.struts2.views.util.ResourceUtil; -import com.opensymphony.xwork2.ActionInvocation; -import com.opensymphony.xwork2.inject.Inject; -import com.opensymphony.xwork2.util.ValueStack; - -import freemarker.template.Configuration; -import freemarker.template.ObjectWrapper; -import freemarker.template.Template; -import freemarker.template.TemplateException; -import freemarker.template.TemplateModel; -import freemarker.template.TemplateModelException; +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.io.Writer; +import java.util.Locale; /** */ @@ -136,7 +127,6 @@ private void executeRenderResult(String location, ActionInvocation invocation) throws TemplateException, IOException, TemplateModelException, PortletException { - prepareServletActionContext(); this.location = location; this.invocation = invocation; this.configuration = getConfiguration(); @@ -162,17 +152,6 @@ postTemplateProcess(template, model); } } - } - - /** - * - */ - private void prepareServletActionContext() throws PortletException, - IOException { - PortletRequestDispatcher disp = PortletActionContext.getPortletConfig() - .getPortletContext().getNamedDispatcher("preparator"); - disp.include(PortletActionContext.getRenderRequest(), - PortletActionContext.getRenderResponse()); } /** Modified: struts/struts2/branches/STRUTS_2_0_X/core/src/main/resources/struts-portlet-default.xml URL: http://svn.apache.org/viewvc/struts/struts2/branches/STRUTS_2_0_X/core/src/main/resources/struts-portlet-default.xml?rev=568895&r1=568894&r2=568895&view=diff ============================================================================== --- struts/struts2/branches/STRUTS_2_0_X/core/src/main/resources/struts-portlet-default.xml (original) +++ struts/struts2/branches/STRUTS_2_0_X/core/src/main/resources/struts-portlet-default.xml Thu Aug 23 01:57:36 2007 @@ -22,37 +22,49 @@ */ --> <!DOCTYPE struts PUBLIC - "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" - "http://struts.apache.org/dtds/struts-2.0.dtd"> - + "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" + "http://struts.apache.org/dtds/struts-2.0.dtd"> + <struts> <package name="struts-portlet-default" extends="struts-default"> - <result-types> - <result-type name="dispatcher" class="org.apache.struts2.portlet.result.PortletResult" default="true"/> - <result-type name="freemarker" class="org.apache.struts2.views.freemarker.PortletFreemarkerResult"/> - <result-type name="velocity" class="org.apache.struts2.portlet.result.PortletVelocityResult"/> - </result-types> - - <interceptors> - <interceptor name="portlet-preferences" class="org.apache.struts2.portlet.interceptor.PortletPreferencesInterceptor"/> - <interceptor-stack name="portletDefaultStack"> - <interceptor-ref name="defaultStack"/> - <interceptor-ref name="portlet-preferences" /> - </interceptor-stack> - - </interceptors> - - <default-interceptor-ref name="portletDefaultStack"/> - - <action name="renderDirect" class="org.apache.struts2.portlet.dispatcher.DirectRenderFromEventAction"> - <result name="success">${location}</result> - </action> - <action name="freemarkerDirect" class="org.apache.struts2.portlet.dispatcher.DirectRenderFromEventAction"> - <result type="freemarker" name="success">${location}</result> - </action> - <action name="velocityDirect" class="org.apache.struts2.portlet.dispatcher.DirectRenderFromEventAction"> - <result type="velocity" name="success">${location}</result> - </action> - </package> + <result-types> + <result-type name="dispatcher" class="org.apache.struts2.portlet.result.PortletResult" default="true"/> + <result-type name="redirect" class="org.apache.struts2.portlet.result.PortletResult"/> + <result-type name="redirectAction" class="org.apache.struts2.portlet.result.PortletActionRedirectResult"/> + <result-type name="freemarker" class="org.apache.struts2.views.freemarker.PortletFreemarkerResult"/> + <result-type name="velocity" class="org.apache.struts2.portlet.result.PortletVelocityResult"/> + </result-types> + + <interceptors> + <interceptor name="portletAware" class="org.apache.struts2.portlet.interceptor.PortletAwareInterceptor"/> + <interceptor name="portletState" class="org.apache.struts2.portlet.interceptor.PortletStateInterceptor"/> + <!-- Default stack for operating in portlet environment --> + <interceptor-stack name="portletDefaultStack"> + <interceptor-ref name="portletState"/> + <interceptor-ref name="defaultStack"/> + <interceptor-ref name="portletAware"/> + </interceptor-stack> + <!-- Extension of the default portlet stack which also includes the token interceptor --> + <interceptor-stack name="portletDefaultStackWithToken"> + <interceptor-ref name="portletState"/> + <interceptor-ref name="token"/> + <interceptor-ref name="defaultStack"/> + <interceptor-ref name="portletAware"/> + </interceptor-stack> + + </interceptors> + + <default-interceptor-ref name="portletDefaultStack"/> + + <action name="renderDirect" class="org.apache.struts2.portlet.dispatcher.DirectRenderFromEventAction"> + <result name="success">${location}</result> + </action> + <action name="freemarkerDirect" class="org.apache.struts2.portlet.dispatcher.DirectRenderFromEventAction"> + <result type="freemarker" name="success">${location}</result> + </action> + <action name="velocityDirect" class="org.apache.struts2.portlet.dispatcher.DirectRenderFromEventAction"> + <result type="velocity" name="success">${location}</result> + </action> + </package> </struts> Modified: struts/struts2/branches/STRUTS_2_0_X/core/src/test/java/org/apache/struts2/portlet/dispatcher/Jsr168DispatcherTest.java URL: http://svn.apache.org/viewvc/struts/struts2/branches/STRUTS_2_0_X/core/src/test/java/org/apache/struts2/portlet/dispatcher/Jsr168DispatcherTest.java?rev=568895&r1=568894&r2=568895&view=diff ============================================================================== --- struts/struts2/branches/STRUTS_2_0_X/core/src/test/java/org/apache/struts2/portlet/dispatcher/Jsr168DispatcherTest.java (original) +++ struts/struts2/branches/STRUTS_2_0_X/core/src/test/java/org/apache/struts2/portlet/dispatcher/Jsr168DispatcherTest.java Thu Aug 23 01:57:36 2007 @@ -20,41 +20,21 @@ */ package org.apache.struts2.portlet.dispatcher; -import java.util.Collections; -import java.util.HashMap; -import java.util.Iterator; -import java.util.ListResourceBundle; -import java.util.Locale; -import java.util.Map; - -import javax.portlet.ActionRequest; -import javax.portlet.ActionResponse; -import javax.portlet.PortletConfig; -import javax.portlet.PortletContext; -import javax.portlet.PortletMode; -import javax.portlet.PortletSession; -import javax.portlet.RenderRequest; -import javax.portlet.RenderResponse; -import javax.portlet.WindowState; -import javax.servlet.ServletContext; -import javax.servlet.ServletContextEvent; - +import com.opensymphony.xwork2.Action; +import com.opensymphony.xwork2.ActionInvocation; +import com.opensymphony.xwork2.ActionProxy; +import com.opensymphony.xwork2.ActionProxyFactory; +import com.opensymphony.xwork2.util.ValueStack; +import com.opensymphony.xwork2.util.ValueStackFactory; import junit.textui.TestRunner; - import org.apache.struts2.StrutsConstants; -import org.apache.struts2.dispatcher.mapper.ActionMapper; import org.apache.struts2.portlet.PortletActionConstants; -import org.apache.struts2.portlet.context.ServletContextHolderListener; import org.jmock.Mock; import org.jmock.cglib.MockObjectTestCase; import org.jmock.core.Constraint; -import com.opensymphony.xwork2.Action; -import com.opensymphony.xwork2.ActionInvocation; -import com.opensymphony.xwork2.ActionProxy; -import com.opensymphony.xwork2.ActionProxyFactory; -import com.opensymphony.xwork2.util.ValueStack; -import com.opensymphony.xwork2.util.ValueStackFactory; +import javax.portlet.*; +import java.util.*; /** * Jsr168DispatcherTest. Insert description. @@ -80,6 +60,7 @@ mockConfig = mock(PortletConfig.class); mockCtx = mock(PortletContext.class); mockConfig.stubs().method(ANYTHING); + mockCtx.stubs().method(ANYTHING); setupStub(initParams, mockConfig, "getInitParameter"); mockCtx.stubs().method("getAttributeNames").will(returnValue(Collections.enumeration(attributes.keySet()))); setupStub(attributes, mockCtx, "getAttribute"); @@ -88,7 +69,6 @@ setupStub(initParams, mockCtx, "getInitParameter"); mockConfig.stubs().method("getInitParameterNames").will(returnValue(Collections.enumeration(initParams.keySet()))); setupStub(initParams, mockConfig, "getInitParameter"); - mockConfig.stubs().method("getResourceBundle").will(returnValue(new ListResourceBundle() { protected Object[][] getContents() { return new String[][]{{"javax.portlet.title", "MyTitle"}}; @@ -116,10 +96,7 @@ public void testRender_ok() { final Mock mockResponse = mock(RenderResponse.class); mockResponse.stubs().method(ANYTHING); - final Mock servletContext = mock(ServletContext.class); - servletContext.stubs().method(ANYTHING); - ServletContextEvent event = new ServletContextEvent((ServletContext)servletContext.proxy()); - new ServletContextHolderListener().contextInitialized(event); + PortletMode mode = PortletMode.VIEW; Map requestParams = new HashMap(); @@ -170,16 +147,6 @@ initPortletConfig(initParams, new HashMap()); initRequest(requestParams, new HashMap(), new HashMap(), new HashMap(), PortletMode.VIEW, WindowState.NORMAL, true, null); setupActionFactory("/view", "testAction", "success", ValueStackFactory.getFactory().createValueStack()); - Constraint[] paramConstraints = new Constraint[] { - eq(PortletActionConstants.EVENT_ACTION), same(mockActionProxy.proxy()) }; - - mockSession.expects(once()).method("setAttribute").with( - paramConstraints); - - mockResponse.expects(once()).method("setRenderParameter").with( - new Constraint[] { eq(PortletActionConstants.EVENT_ACTION), - eq("true") }); - //mockSession.expects(once()).method("setAttribute").with(new Constraint[]{eq(PortletActionConstants.LAST_MODE), eq(PortletMode.VIEW)}); try { dispatcher Modified: struts/struts2/branches/STRUTS_2_0_X/core/src/test/java/org/apache/struts2/portlet/result/PortletResultTest.java URL: http://svn.apache.org/viewvc/struts/struts2/branches/STRUTS_2_0_X/core/src/test/java/org/apache/struts2/portlet/result/PortletResultTest.java?rev=568895&r1=568894&r2=568895&view=diff ============================================================================== --- struts/struts2/branches/STRUTS_2_0_X/core/src/test/java/org/apache/struts2/portlet/result/PortletResultTest.java (original) +++ struts/struts2/branches/STRUTS_2_0_X/core/src/test/java/org/apache/struts2/portlet/result/PortletResultTest.java Thu Aug 23 01:57:36 2007 @@ -46,7 +46,7 @@ * PortletResultTest. Insert description. * */ -public class PortletResultTest extends MockObjectTestCase { +public class PortletResultTest extends MockObjectTestCase implements PortletActionConstants { Mock mockInvocation = null; Mock mockConfig = null; @@ -79,7 +79,6 @@ Mock mockRequest = mock(RenderRequest.class); Mock mockResponse = mock(RenderResponse.class); Mock mockRd = mock(PortletRequestDispatcher.class); - Mock mockPrep = mock(PortletRequestDispatcher.class); RenderRequest req = (RenderRequest)mockRequest.proxy(); RenderResponse res = (RenderResponse)mockResponse.proxy(); @@ -90,9 +89,7 @@ Constraint[] params = new Constraint[]{same(req), same(res)}; mockRd.expects(once()).method("include").with(params); - mockPrep.expects(once()).method("include").with(params); mockCtx.expects(once()).method("getRequestDispatcher").with(eq("/WEB-INF/pages/testPage.jsp")).will(returnValue(rd)); - mockCtx.expects(once()).method("getNamedDispatcher").with(eq("preparator")).will(returnValue(mockPrep.proxy())); mockResponse.expects(once()).method("setContentType").with(eq("text/html")); mockConfig.expects(once()).method("getPortletContext").will(returnValue(ctx)); @@ -148,26 +145,27 @@ Constraint[] params = new Constraint[]{eq(PortletActionConstants.ACTION_PARAM), eq("renderDirect")}; mockResponse.expects(once()).method("setRenderParameter").with(params); - params = new Constraint[]{eq("location"), eq("/WEB-INF/pages/testJsp.jsp")}; - mockResponse.expects(once()).method("setRenderParameter").with(params); params = new Constraint[]{eq(PortletActionConstants.MODE_PARAM), eq(PortletMode.VIEW.toString())}; mockResponse.expects(once()).method("setRenderParameter").with(params); mockRequest.stubs().method("getPortletMode").will(returnValue(PortletMode.VIEW)); ActionContext ctx = ActionContext.getContext(); + Map session = new HashMap(); + ctx.put(PortletActionConstants.REQUEST, mockRequest.proxy()); ctx.put(PortletActionConstants.RESPONSE, mockResponse.proxy()); ctx.put(PortletActionConstants.PHASE, PortletActionConstants.EVENT_PHASE); + ctx.put(ActionContext.SESSION, session); PortletResult result = new PortletResult(); try { result.doExecute("/WEB-INF/pages/testJsp.jsp", (ActionInvocation)mockInvocation.proxy()); - } - catch(Exception e) { + } catch(Exception e) { e.printStackTrace(); fail("Error occured!"); } + assertEquals("/WEB-INF/pages/testJsp.jsp", session.get(RENDER_DIRECT_LOCATION)); } public void testDoExecute_event_locationHasQueryParams() { @@ -204,7 +202,6 @@ Mock mockRequest = mock(RenderRequest.class); Mock mockResponse = mock(RenderResponse.class); Mock mockRd = mock(PortletRequestDispatcher.class); - Mock mockPrep = mock(PortletRequestDispatcher.class); RenderRequest req = (RenderRequest)mockRequest.proxy(); RenderResponse res = (RenderResponse)mockResponse.proxy(); @@ -214,9 +211,7 @@ Constraint[] params = new Constraint[]{same(req), same(res)}; mockRd.expects(once()).method("include").with(params); - mockPrep.expects(once()).method("include").with(params); mockCtx.expects(once()).method("getRequestDispatcher").with(eq("/WEB-INF/pages/testPage.jsp")).will(returnValue(rd)); - mockCtx.expects(once()).method("getNamedDispatcher").with(eq("preparator")).will(returnValue(mockPrep.proxy())); mockConfig.expects(once()).method("getPortletContext").will(returnValue(ctx)); mockRequest.stubs().method("getPortletMode").will(returnValue(PortletMode.VIEW));