Author: mrdon
Date: Sat Jan 20 02:15:15 2007
New Revision: 498097
URL: http://svn.apache.org/viewvc?view=rev&rev=498097
Log:
Improved the portlet dispatching to use the configured action mapper. This
means
that the special prefixes like method: will now work for submitted forms among
other
things
WW-1653
Added:
struts/struts2/trunk/core/src/main/java/org/apache/struts2/portlet/util/HttpServletRequestMock.java
Modified:
struts/struts2/trunk/core/src/main/java/org/apache/struts2/portlet/dispatcher/Jsr168Dispatcher.java
Modified:
struts/struts2/trunk/core/src/main/java/org/apache/struts2/portlet/dispatcher/Jsr168Dispatcher.java
URL:
http://svn.apache.org/viewvc/struts/struts2/trunk/core/src/main/java/org/apache/struts2/portlet/dispatcher/Jsr168Dispatcher.java?view=diff&rev=498097&r1=498096&r2=498097
==============================================================================
---
struts/struts2/trunk/core/src/main/java/org/apache/struts2/portlet/dispatcher/Jsr168Dispatcher.java
(original)
+++
struts/struts2/trunk/core/src/main/java/org/apache/struts2/portlet/dispatcher/Jsr168Dispatcher.java
Sat Jan 20 02:15:15 2007
@@ -36,15 +36,18 @@
import javax.portlet.PortletResponse;
import javax.portlet.RenderRequest;
import javax.portlet.RenderResponse;
+import javax.servlet.http.HttpServletRequestWrapper;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.struts2.StrutsConstants;
+import org.apache.struts2.StrutsException;
import org.apache.struts2.StrutsStatics;
import org.apache.struts2.dispatcher.ApplicationMap;
import org.apache.struts2.dispatcher.Dispatcher;
import org.apache.struts2.dispatcher.RequestMap;
import org.apache.struts2.dispatcher.SessionMap;
+import org.apache.struts2.dispatcher.mapper.ActionMapper;
import org.apache.struts2.dispatcher.mapper.ActionMapping;
import org.apache.struts2.portlet.PortletActionConstants;
import org.apache.struts2.portlet.PortletApplicationMap;
@@ -52,6 +55,7 @@
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.util.AttributeMap;
import com.opensymphony.xwork2.util.FileManager;
@@ -168,6 +172,8 @@
private String portletNamespace = null;
private Dispatcher dispatcherUtils;
+
+ private ActionMapper actionMapper;
/**
* Initialize the portlet with the init parameters from
<tt>portlet.xml</tt>
@@ -220,6 +226,8 @@
if ("true".equalsIgnoreCase(container.getInstance(String.class,
StrutsConstants.STRUTS_CONFIGURATION_XML_RELOAD))) {
FileManager.setReloadingConfigs(true);
}
+
+ actionMapper = container.getInstance(ActionMapper.class);
}
/**
@@ -401,6 +409,7 @@
+ ", namespace = " + namespace);
ActionProxy proxy = factory.createActionProxy(namespace,
actionName, extraContext);
+ proxy.setMethod(mapping.getMethod());
request.setAttribute("struts.valueStack", proxy.getInvocation()
.getStack());
if (PortletActionConstants.RENDER_PHASE.equals(phase)
@@ -455,26 +464,31 @@
* @param request the PortletRequest object.
* @return the namespace of the action.
*/
- protected ActionMapping getActionMapping(PortletRequest request) {
- ActionMapping mapping = new ActionMapping();
+ protected ActionMapping getActionMapping(final PortletRequest request) {
+ ActionMapping mapping = null;
+ String actionPath = null;
if (resetAction(request)) {
mapping = (ActionMapping) actionMap.get(request.getPortletMode());
} else {
- String actionPath = request.getParameter(ACTION_PARAM);
+ actionPath = request.getParameter(ACTION_PARAM);
if (!TextUtils.stringSet(actionPath)) {
mapping = (ActionMapping) actionMap.get(request
.getPortletMode());
} else {
- String namespace = "";
- String action = actionPath;
- int idx = actionPath.lastIndexOf('/');
- if (idx >= 0) {
- namespace = actionPath.substring(0, idx);
- action = actionPath.substring(idx + 1);
- }
- mapping.setName(action);
- mapping.setNamespace(namespace);
+
+ // 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());
+ mapping = actionMapper.getMapping(httpRequest,
dispatcherUtils.getConfigurationManager());
}
+ }
+
+ if (mapping == null) {
+ throw new StrutsException("Unable to locate action mapping for
request, probably due to " +
+ "an invalid action path: "+actionPath);
}
return mapping;
}
Added:
struts/struts2/trunk/core/src/main/java/org/apache/struts2/portlet/util/HttpServletRequestMock.java
URL:
http://svn.apache.org/viewvc/struts/struts2/trunk/core/src/main/java/org/apache/struts2/portlet/util/HttpServletRequestMock.java?view=auto&rev=498097
==============================================================================
---
struts/struts2/trunk/core/src/main/java/org/apache/struts2/portlet/util/HttpServletRequestMock.java
(added)
+++
struts/struts2/trunk/core/src/main/java/org/apache/struts2/portlet/util/HttpServletRequestMock.java
Sat Jan 20 02:15:15 2007
@@ -0,0 +1,278 @@
+/*
+ * $Id: RequestUtils.java 471717 2006-11-06 12:50:18Z husted $
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.struts2.portlet.util;
+
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.UnsupportedEncodingException;
+import java.security.Principal;
+import java.util.Enumeration;
+import java.util.Locale;
+import java.util.Map;
+
+import javax.servlet.RequestDispatcher;
+import javax.servlet.ServletInputStream;
+import javax.servlet.http.Cookie;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpSession;
+
+/**
+ * A simple mock class to interact with Struts 2 API's that require a servlet
request
+ */
+public class HttpServletRequestMock implements HttpServletRequest {
+
+ private String servletPath;
+ private Map parameterMap;
+
+ public String getAuthType() {
+ return null;
+ }
+
+ public String getContextPath() {
+ return null;
+ }
+
+ public Cookie[] getCookies() {
+ return null;
+ }
+
+ public long getDateHeader(String arg0) {
+ return 0;
+ }
+
+ public String getHeader(String arg0) {
+ return null;
+ }
+
+ public Enumeration getHeaderNames() {
+ return null;
+ }
+
+ public Enumeration getHeaders(String arg0) {
+ return null;
+ }
+
+ public int getIntHeader(String arg0) {
+ return 0;
+ }
+
+ public String getMethod() {
+ return null;
+ }
+
+ public String getPathInfo() {
+ return null;
+ }
+
+ public String getPathTranslated() {
+ return null;
+ }
+
+ public String getQueryString() {
+ return null;
+ }
+
+ public String getRemoteUser() {
+ return null;
+ }
+
+ public String getRequestURI() {
+ return null;
+ }
+
+ public StringBuffer getRequestURL() {
+ return null;
+ }
+
+ public String getRequestedSessionId() {
+ return null;
+ }
+
+ public String getServletPath() {
+ return servletPath;
+ }
+
+ public HttpSession getSession() {
+ return null;
+ }
+
+ public HttpSession getSession(boolean arg0) {
+ return null;
+ }
+
+ public Principal getUserPrincipal() {
+ return null;
+ }
+
+ public boolean isRequestedSessionIdFromCookie() {
+ return false;
+ }
+
+ public boolean isRequestedSessionIdFromURL() {
+ return false;
+ }
+
+ public boolean isRequestedSessionIdFromUrl() {
+ return false;
+ }
+
+ public boolean isRequestedSessionIdValid() {
+ return false;
+ }
+
+ public boolean isUserInRole(String arg0) {
+ return false;
+ }
+
+ public Object getAttribute(String arg0) {
+ return null;
+ }
+
+ public Enumeration getAttributeNames() {
+ return null;
+ }
+
+ public String getCharacterEncoding() {
+ return null;
+ }
+
+ public int getContentLength() {
+ return 0;
+ }
+
+ public String getContentType() {
+ return null;
+ }
+
+ public ServletInputStream getInputStream() throws IOException {
+ return null;
+ }
+
+ public String getLocalAddr() {
+ return null;
+ }
+
+ public String getLocalName() {
+ return null;
+ }
+
+ public int getLocalPort() {
+ return 0;
+ }
+
+ public Locale getLocale() {
+ return null;
+ }
+
+ public Enumeration getLocales() {
+ return null;
+ }
+
+ public String getParameter(String arg0) {
+ return null;
+ }
+
+ public Map getParameterMap() {
+ return parameterMap;
+ }
+
+ public Enumeration getParameterNames() {
+ return null;
+ }
+
+ public String[] getParameterValues(String arg0) {
+ return null;
+ }
+
+ public String getProtocol() {
+ return null;
+ }
+
+ public BufferedReader getReader() throws IOException {
+ return null;
+ }
+
+ public String getRealPath(String arg0) {
+ return null;
+ }
+
+ public String getRemoteAddr() {
+ return null;
+ }
+
+ public String getRemoteHost() {
+ return null;
+ }
+
+ public int getRemotePort() {
+ return 0;
+ }
+
+ public RequestDispatcher getRequestDispatcher(String arg0) {
+ return null;
+ }
+
+ public String getScheme() {
+ return null;
+ }
+
+ public String getServerName() {
+ return null;
+ }
+
+ public int getServerPort() {
+ return 0;
+ }
+
+ public boolean isSecure() {
+ return false;
+ }
+
+ public void removeAttribute(String arg0) {
+ }
+
+ public void setAttribute(String arg0, Object arg1) {
+ }
+
+ public void setCharacterEncoding(String arg0)
+ throws UnsupportedEncodingException {
+
+ }
+
+ /**
+ * @param parameterMap the parameterMap to set
+ */
+ public HttpServletRequestMock setParameterMap(Map parameterMap) {
+ this.parameterMap = parameterMap;
+ return this;
+ }
+
+ /**
+ * @param servletPath the servletPath to set
+ */
+ public HttpServletRequestMock setServletPath(String servletPath) {
+ this.servletPath = servletPath;
+ return this;
+ }
+
+
+
+}