struts-commits mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From mr...@apache.org
Subject svn commit: r498097 - in /struts/struts2/trunk/core/src/main/java/org/apache/struts2/portlet: dispatcher/Jsr168Dispatcher.java util/HttpServletRequestMock.java
Date Sat, 20 Jan 2007 10:15:16 GMT
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;
+    }
+    
+    
+
+}



Mime
View raw message