You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@struts.apache.org by ni...@apache.org on 2009/03/27 14:51:52 UTC
svn commit: r759140 - in /struts/struts2/trunk/plugins/portlet/src:
main/java/org/apache/struts2/portlet/dispatcher/Jsr168Dispatcher.java
test/java/org/apache/struts2/portlet/dispatcher/Jsr168DispatcherTest.java
Author: nilsga
Date: Fri Mar 27 13:51:52 2009
New Revision: 759140
URL: http://svn.apache.org/viewvc?rev=759140&view=rev
Log:
WW-2997 MultiPart parameters was not passed to the action mapping lookup.
Modified:
struts/struts2/trunk/plugins/portlet/src/main/java/org/apache/struts2/portlet/dispatcher/Jsr168Dispatcher.java
struts/struts2/trunk/plugins/portlet/src/test/java/org/apache/struts2/portlet/dispatcher/Jsr168DispatcherTest.java
Modified: struts/struts2/trunk/plugins/portlet/src/main/java/org/apache/struts2/portlet/dispatcher/Jsr168Dispatcher.java
URL: http://svn.apache.org/viewvc/struts/struts2/trunk/plugins/portlet/src/main/java/org/apache/struts2/portlet/dispatcher/Jsr168Dispatcher.java?rev=759140&r1=759139&r2=759140&view=diff
==============================================================================
--- struts/struts2/trunk/plugins/portlet/src/main/java/org/apache/struts2/portlet/dispatcher/Jsr168Dispatcher.java (original)
+++ struts/struts2/trunk/plugins/portlet/src/main/java/org/apache/struts2/portlet/dispatcher/Jsr168Dispatcher.java Fri Mar 27 13:51:52 2009
@@ -295,8 +295,7 @@
LOG.debug("Entering processAction");
resetActionContext();
try {
- serviceAction(request, response, getActionMapping(request),
- getRequestMap(request), getParameterMap(request),
+ serviceAction(request, response, getRequestMap(request), getParameterMap(request),
getSessionMap(request), getApplicationMap(),
portletNamespace, EVENT_PHASE);
LOG.debug("Leaving processAction");
@@ -320,8 +319,7 @@
if(!request.getWindowState().equals(WindowState.MINIMIZED)) {
try {
// Check to see if an event set the render to be included directly
- serviceAction(request, response, getActionMapping(request),
- getRequestMap(request), getParameterMap(request),
+ serviceAction(request, response, getRequestMap(request), getParameterMap(request),
getSessionMap(request), getApplicationMap(),
portletNamespace, RENDER_PHASE);
LOG.debug("Leaving render");
@@ -337,7 +335,7 @@
private void resetActionContext() {
ActionContext.setContext(null);
}
-
+
/**
* Merges all application and portlet attributes into a single
* <tt>HashMap</tt> to represent the entire <tt>Action</tt> context.
@@ -355,27 +353,17 @@
*/
public HashMap<String, Object> createContextMap(Map<String, Object> requestMap, Map<String, String[]> parameterMap,
Map<String, Object> sessionMap, Map<String, Object> applicationMap, PortletRequest request,
- PortletResponse response, PortletConfig portletConfig, Integer phase) throws IOException {
+ PortletResponse response, HttpServletRequest servletRequest, HttpServletResponse servletResponse, ServletContext servletContext, PortletConfig portletConfig, Integer phase) throws IOException {
// TODO Must put http request/response objects into map for use with
- HttpServletResponse dummyResponse = new PortletServletResponse(response);
- HttpServletRequest dummyRequest = new PortletServletRequest(request, getPortletContext());
- container.inject(dummyRequest);
- ServletContext dummyServletContext = new PortletServletContext(getPortletContext());
- if(EVENT_PHASE.equals(phase)) {
- dummyRequest = dispatcherUtils.wrapRequest(dummyRequest, dummyServletContext);
- if(dummyRequest instanceof MultiPartRequestWrapper) {
- // Multipart request. Request parameters are encoded in the multipart data,
- // so we need to manually add them to the parameter map.
- parameterMap.putAll(dummyRequest.getParameterMap());
- }
- }
+ container.inject(servletRequest);
+
// ServletActionContext
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);
+ extraContext.put(StrutsStatics.HTTP_REQUEST, servletRequest);
+ extraContext.put(StrutsStatics.HTTP_RESPONSE, servletResponse);
+ extraContext.put(StrutsStatics.SERVLET_CONTEXT, servletContext);
// End dummy servlet objects
extraContext.put(ActionContext.PARAMETERS, parameterMap);
extraContext.put(ActionContext.SESSION, sessionMap);
@@ -419,7 +407,6 @@
*
* @param request the HttpServletRequest object.
* @param response the HttpServletResponse object.
- * @param mapping the action mapping.
* @param requestMap a Map of request attributes.
* @param parameterMap a Map of request parameters.
* @param sessionMap a Map of all session attributes.
@@ -428,18 +415,32 @@
* @param phase The portlet phase (render or action, see
* {@link PortletActionConstants})
*/
- public void serviceAction(PortletRequest request, PortletResponse response,
- ActionMapping mapping, Map<String, Object> requestMap, Map<String, String[]> parameterMap,
+ public void serviceAction(PortletRequest request, PortletResponse response, Map<String, Object> requestMap, Map<String, String[]> parameterMap,
Map<String, Object> sessionMap, Map<String, Object> applicationMap, String portletNamespace,
Integer phase) throws PortletException {
LOG.debug("serviceAction");
- String actionName = mapping.getName();
- String namespace = mapping.getNamespace();
Dispatcher.setInstance(dispatcherUtils);
+ String actionName = null;
+ String namespace = null;
try {
+ ServletContext servletContext = new PortletServletContext(getPortletContext());
+ HttpServletRequest servletRequest = new PortletServletRequest(request, getPortletContext());
+ HttpServletResponse servletResponse = new PortletServletResponse(response);
+ if(EVENT_PHASE.equals(phase)) {
+ servletRequest = dispatcherUtils.wrapRequest(servletRequest, servletContext);
+ if(servletRequest instanceof MultiPartRequestWrapper) {
+ // Multipart request. Request parameters are encoded in the multipart data,
+ // so we need to manually add them to the parameter map.
+ parameterMap.putAll(servletRequest.getParameterMap());
+ }
+ }
+ container.inject(servletRequest);
+ ActionMapping mapping = getActionMapping(request, servletRequest);
+ actionName = mapping.getName();
+ namespace = mapping.getNamespace();
HashMap<String, Object> extraContext = createContextMap(requestMap, parameterMap,
- sessionMap, applicationMap, request, response,
- getPortletConfig(), phase);
+ sessionMap, applicationMap, request, response, servletRequest, servletResponse,
+ servletContext, getPortletConfig(), phase);
extraContext.put(PortletActionConstants.ACTION_MAPPING, mapping);
LOG.debug("Creating action proxy for name = " + actionName
+ ", namespace = " + namespace);
@@ -479,24 +480,22 @@
* @param request the PortletRequest object.
* @return the namespace of the action.
*/
- protected ActionMapping getActionMapping(final PortletRequest request) {
+ protected ActionMapping getActionMapping(final PortletRequest portletRequest, final HttpServletRequest servletRequest) {
ActionMapping mapping = null;
String actionPath = null;
- if (resetAction(request)) {
- mapping = (ActionMapping) actionMap.get(request.getPortletMode());
+ if (resetAction(portletRequest)) {
+ mapping = (ActionMapping) actionMap.get(portletRequest.getPortletMode());
} else {
- actionPath = request.getParameter(ACTION_PARAM);
+ actionPath = servletRequest.getParameter(ACTION_PARAM);
if (StringUtils.isEmpty(actionPath)) {
- mapping = (ActionMapping) actionMap.get(request
+ mapping = (ActionMapping) actionMap.get(portletRequest
.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
- PortletServletRequest httpRequest = new PortletServletRequest(request, getPortletContext());
- container.inject(httpRequest);
- mapping = actionMapper.getMapping(httpRequest, dispatcherUtils.getConfigurationManager());
+ mapping = actionMapper.getMapping(servletRequest, dispatcherUtils.getConfigurationManager());
}
}
Modified: struts/struts2/trunk/plugins/portlet/src/test/java/org/apache/struts2/portlet/dispatcher/Jsr168DispatcherTest.java
URL: http://svn.apache.org/viewvc/struts/struts2/trunk/plugins/portlet/src/test/java/org/apache/struts2/portlet/dispatcher/Jsr168DispatcherTest.java?rev=759140&r1=759139&r2=759140&view=diff
==============================================================================
--- struts/struts2/trunk/plugins/portlet/src/test/java/org/apache/struts2/portlet/dispatcher/Jsr168DispatcherTest.java (original)
+++ struts/struts2/trunk/plugins/portlet/src/test/java/org/apache/struts2/portlet/dispatcher/Jsr168DispatcherTest.java Fri Mar 27 13:51:52 2009
@@ -319,24 +319,4 @@
dispatcher.render((RenderRequest) mockRequest.proxy(), (RenderResponse) mockResponse.proxy());
}
- public void testMultipartRequest_parametersAreCopiedToActionInvocation() throws Exception {
- MockPortletContext ctx = new MockPortletContext();
- ctx.setAttribute("javax.servlet.context.tempdir", new File("target").getAbsoluteFile());
- MockActionRequest request = new MockActionRequest(ctx);
- request.setContent(MULTIPART_REQUEST.getBytes("US-ASCII"));
- request.setContentType("multipart/form-data; boundary=---------------------------4827543632391");
- request.setProperty("Content-Length", "" + MULTIPART_REQUEST.length());
- MockActionResponse response = new MockActionResponse();
- Map<String, Object> requestMap = new HashMap<String, Object>();
- Map<String, String[]> paramMap = new HashMap<String, String[]>();
- Map<String, Object> sessionMap = new HashMap<String, Object>();
- Map<String, Object> applicationMap = new HashMap<String, Object>();
- initPortletConfig(new HashMap<String, String>(), new HashMap<String, Object>());
- MockPortletConfig config = new MockPortletConfig(ctx);
- dispatcher.init(config);
- dispatcher.createContextMap(requestMap, paramMap, sessionMap, applicationMap, request, response, config,
- PortletActionConstants.EVENT_PHASE);
- assertNotNull("Caption was not found in parameter map!", paramMap.get("caption"));
- assertEquals("TestCaption", paramMap.get("caption")[0]);
- }
}