[jboss-svn-commits] JBoss Portal SVN: r5363 - in trunk: core/src/main/org/jboss/portal/core/model/portal portlet portlet/src/main/org/jboss/portal/portlet portlet/src/main/org/jboss/portal/portlet/tck portlet/src/main/org/jboss/portal/portlet/test portlet/src/main/org/jboss/portal/test/portlet server/src/main/org/jboss/portal/server server/src/main/org/jboss/portal/server/impl server/src/main/org/jboss/portal/server/request server/src/main/org/jboss/portal/server/servlet server/src/main/org/jboss/portal/test/server/parameters theme/src/main/org/jboss/portal/theme/servlet

jboss-svn-commits at lists.jboss.org jboss-svn-commits at lists.jboss.org
Sun Oct 8 19:31:39 EDT 2006


Author: julien at jboss.com
Date: 2006-10-08 19:31:19 -0400 (Sun, 08 Oct 2006)
New Revision: 5363

Removed:
   trunk/server/src/main/org/jboss/portal/server/request/RequestParameter.java
Modified:
   trunk/core/src/main/org/jboss/portal/core/model/portal/PortalObjectCommandFactory.java
   trunk/portlet/build.xml
   trunk/portlet/src/main/org/jboss/portal/portlet/PortletRequestDecoder.java
   trunk/portlet/src/main/org/jboss/portal/portlet/tck/TCKPortletController.java
   trunk/portlet/src/main/org/jboss/portal/portlet/test/PortletController.java
   trunk/portlet/src/main/org/jboss/portal/test/portlet/PortletRequestDecoderTestCase.java
   trunk/server/src/main/org/jboss/portal/server/ServerInvocationContext.java
   trunk/server/src/main/org/jboss/portal/server/impl/ServerInvocationContextImpl.java
   trunk/server/src/main/org/jboss/portal/server/servlet/PortalServlet.java
   trunk/server/src/main/org/jboss/portal/test/server/parameters/GetTest.java
   trunk/server/src/main/org/jboss/portal/test/server/parameters/PostApplicationXWWWFormURLEncodedTest.java
   trunk/server/src/main/org/jboss/portal/test/server/parameters/PostMultipartFormDataTest.java
   trunk/theme/src/main/org/jboss/portal/theme/servlet/DynaAjaxServlet.java
Log:
simplified (my a little bit over engineered) server request parameter handling by having 2 maps (one for query parameters and one for body parameters when content type is x-www-formurlencoded) instead of one single map having special stuff to distinguish query values from body values.

Modified: trunk/core/src/main/org/jboss/portal/core/model/portal/PortalObjectCommandFactory.java
===================================================================
--- trunk/core/src/main/org/jboss/portal/core/model/portal/PortalObjectCommandFactory.java	2006-10-08 17:02:14 UTC (rev 5362)
+++ trunk/core/src/main/org/jboss/portal/core/model/portal/PortalObjectCommandFactory.java	2006-10-08 23:31:19 UTC (rev 5363)
@@ -109,7 +109,7 @@
 
          //
          PortletRequestDecoder decoder = new PortletRequestDecoder();
-         decoder.decode(invocation.getServerContext().getParameterMap());
+         decoder.decode(invocation.getServerContext().getQueryParameterMap(), invocation.getServerContext().getBodyParameterMap());
 
          // Get the window navigational state
          WindowNavigationalState windowNavState = (WindowNavigationalState)invocation.getAttribute(ServerInvocation.NAVIGATIONAL_STATE_SCOPE, window.getId() + "_window");

Modified: trunk/portlet/build.xml
===================================================================
--- trunk/portlet/build.xml	2006-10-08 17:02:14 UTC (rev 5362)
+++ trunk/portlet/build.xml	2006-10-08 23:31:19 UTC (rev 5363)
@@ -514,7 +514,7 @@
    <target name="test-framework" depends="init">
       <execute-tests>
          <x-test>
-            <!--<test todir="${test.reports}" name="org.jboss.portal.test.portlet.deployment.UnmarshallerTestCase"/>-->
+            <test todir="${test.reports}" name="org.jboss.portal.test.portlet.deployment.UnmarshallerTestCase"/>
             <test todir="${test.reports}" name="org.jboss.portal.test.portlet.state.LocalStoreProducerStatefulPortletInvokerTestCase"/>
             <test todir="${test.reports}" name="org.jboss.portal.test.portlet.state.RemoteStoreProducerStatefulPortletInvokerTestCase"/>
             <test todir="${test.reports}" name="org.jboss.portal.test.portlet.state.LocalStoreConsumerStatefulPortletInvokerTestCase"/>

Modified: trunk/portlet/src/main/org/jboss/portal/portlet/PortletRequestDecoder.java
===================================================================
--- trunk/portlet/src/main/org/jboss/portal/portlet/PortletRequestDecoder.java	2006-10-08 17:02:14 UTC (rev 5362)
+++ trunk/portlet/src/main/org/jboss/portal/portlet/PortletRequestDecoder.java	2006-10-08 23:31:19 UTC (rev 5363)
@@ -21,7 +21,6 @@
 */
 package org.jboss.portal.portlet;
 
-import org.jboss.portal.server.request.RequestParameter;
 import org.jboss.portal.WindowState;
 import org.jboss.portal.Mode;
 
@@ -95,16 +94,16 @@
    /** . */
    private int type;
 
-   public void decode(Map params) throws IllegalArgumentException
+   public void decode(Map queryParams, Map bodyParams) throws IllegalArgumentException
    {
       // The meta info from the URL
       int meta = 0;
-      RequestParameter metaParam = (RequestParameter)params.get(META_PARAMETER);
-      if (metaParam != null && metaParam.isFromQuery())
+      String[] metaParam = (String[])queryParams.get(META_PARAMETER);
+      if (metaParam != null)
       {
          try
          {
-            meta = Integer.parseInt(metaParam.getValue(), 16);
+            meta = Integer.parseInt(metaParam[0], 16);
          }
          catch (NumberFormatException ignore)
          {
@@ -134,12 +133,12 @@
          // Get the mode from the parameters if it exists
          if ((meta & MODE_MASK) != 0)
          {
-            RequestParameter modeParam = (RequestParameter)params.get(MODE_PARAMETER);
-            if (modeParam == null || !modeParam.isFromQuery())
+            String[] modeParam = (String[])queryParams.get(MODE_PARAMETER);
+            if (modeParam == null)
             {
                throw new IllegalArgumentException();
             }
-            mode = Mode.create(modeParam.getValue());
+            mode = Mode.create(modeParam[0]);
          }
          else
          {
@@ -149,12 +148,12 @@
          // Get the window state from the parameters if it exists
          if ((meta & WINDOW_STATE_MASK) != 0)
          {
-            RequestParameter windowStateParam = (RequestParameter)params.get(WINDOW_STATE_PARAMETER);
-            if (windowStateParam == null || !windowStateParam.isFromQuery())
+            String[] windowStateParam = (String[])queryParams.get(WINDOW_STATE_PARAMETER);
+            if (windowStateParam == null)
             {
                throw new IllegalArgumentException();
             }
-            windowState = WindowState.create(windowStateParam.getValue());
+            windowState = WindowState.create(windowStateParam[0]);
          }
          else
          {
@@ -166,13 +165,15 @@
          if (!opaque)
          {
             // Compute the parameters skipping the portlet navigational state that may be encoded as well
-            Parameters form = new Parameters();
             ParametersStateString query = new ParametersStateString();
-            for (Iterator i = params.values().iterator(); i.hasNext();)
+            for (Iterator i = queryParams.entrySet().iterator(); i.hasNext();)
             {
-               RequestParameter param = (RequestParameter)i.next();
+               Map.Entry entry = (Map.Entry)i.next();
                int index = 0;
-               String name = param.getName();
+               String name = (String)entry.getKey();
+               String[] queryValues = (String[])entry.getValue();
+
+               //
                if (META_PARAMETER.equals(name))
                {
                   index = 1;
@@ -187,23 +188,19 @@
                }
 
                // We have interaction param(s) in the query string
-               if (index < param.getThreshold())
+               if (index < queryValues.length)
                {
-                  String[] values = (String[])param.subList(index, param.getThreshold()).toArray(new String[0]);
+                  String[] values = new String[queryValues.length - index];
+                  System.arraycopy(queryValues, index, values, 0, values.length);
                   query.setValues(name, values);
-                  index = param.getThreshold();
                }
+            }
 
-               // We have form param(s) in the body
-               if (index < param.size())
-               {
-                  String[] values = (String[])param.subList(index, param.size()).toArray(new String[0]);
-                  if (form == null)
-                  {
-                     form = new Parameters();
-                  }
-                  form.setValues(name, values);
-               }
+            // Julien :
+            Parameters form = new Parameters();
+            if (bodyParams != null)
+            {
+               form.putAll(bodyParams);
             }
 
             //
@@ -223,10 +220,10 @@
          else
          {
             // Decode the navigational state
-            RequestParameter ns = (RequestParameter)params.get(NAVIGATIONAL_STATE_PARAMETER);
-            if (ns != null && ns.isFromQuery())
+            String[] ns = (String[])queryParams.get(NAVIGATIONAL_STATE_PARAMETER);
+            if (ns != null)
             {
-               navigationalstate = new OpaqueStateString(ns.getValue());
+               navigationalstate = new OpaqueStateString(ns[0]);
             }
             else
             {
@@ -237,10 +234,10 @@
             if (type == ACTION_TYPE)
             {
                // Decode the interaction state
-               RequestParameter is = (RequestParameter)params.get(INTERACTION_STATE_PARAMETER);
-               if (is != null && is.isFromQuery())
+               String[] is = (String[])queryParams.get(INTERACTION_STATE_PARAMETER);
+               if (is != null)
                {
-                  interactionState = new OpaqueStateString(is.getValue());
+                  interactionState = new OpaqueStateString(is[0]);
                }
                else
                {
@@ -249,16 +246,9 @@
 
                //
                form = new Parameters();
-               for (Iterator i = params.values().iterator(); i.hasNext();)
+               if (bodyParams != null)
                {
-                  RequestParameter param = (RequestParameter)i.next();
-
-                  // Do We have form param(s) in the body
-                  if (param.getThreshold() < param.size())
-                  {
-                     String[] values = (String[])param.subList(param.getThreshold(), param.size()).toArray(new String[0]);
-                     form.setValues(param.getName(), values);
-                  }
+                  form.putAll(bodyParams);
                }
             }
             else
@@ -274,10 +264,10 @@
          type = NAV_TYPE;
 
          // Get the mode from the parameters if it exists
-         RequestParameter modeParam = (RequestParameter)params.get(MODE_PARAMETER);
-         if (modeParam != null && modeParam.isFromQuery())
+         String[] modeParam = (String[])queryParams.get(MODE_PARAMETER);
+         if (modeParam != null)
          {
-            mode = Mode.create(modeParam.getValue());
+            mode = Mode.create(modeParam[0]);
          }
          else
          {
@@ -285,10 +275,10 @@
          }
 
          // Get the window state from the parameters if it exists
-         RequestParameter windowStateParam = (RequestParameter)params.get(WINDOW_STATE_PARAMETER);
-         if (windowStateParam != null && windowStateParam.isFromQuery())
+         String[] windowStateParam = (String[])queryParams.get(WINDOW_STATE_PARAMETER);
+         if (windowStateParam != null)
          {
-            windowState = WindowState.create(windowStateParam.getValue());
+            windowState = WindowState.create(windowStateParam[0]);
          }
          else
          {

Modified: trunk/portlet/src/main/org/jboss/portal/portlet/tck/TCKPortletController.java
===================================================================
--- trunk/portlet/src/main/org/jboss/portal/portlet/tck/TCKPortletController.java	2006-10-08 17:02:14 UTC (rev 5362)
+++ trunk/portlet/src/main/org/jboss/portal/portlet/tck/TCKPortletController.java	2006-10-08 23:31:19 UTC (rev 5363)
@@ -26,7 +26,6 @@
 import org.jboss.portal.portlet.PortletContext;
 import org.jboss.portal.portlet.test.PortletController;
 import org.jboss.portal.server.ServerInvocation;
-import org.jboss.portal.server.request.RequestParameter;
 
 import javax.servlet.http.HttpSession;
 import java.util.ArrayList;
@@ -42,16 +41,15 @@
 {
    protected Collection getRenderList(ServerInvocation invocation) throws PortletInvokerException
    {
-      RequestParameter param = (RequestParameter)invocation.getServerContext().getParameterMap().get("portletName");
       HttpSession session = invocation.getServerContext().getClientRequest().getSession();
       List portletIds = null;
-      if (param == null)
+      String[] values = (String[])invocation.getServerContext().getQueryParameterMap().get("portletName");
+      if (values == null)
       {
          portletIds = (List)session.getAttribute("portlets");
       }
       else
       {
-         String[] values = param.getValues();
          portletIds = new ArrayList();
          for (int i = 0; i < values.length; i++)
          {

Modified: trunk/portlet/src/main/org/jboss/portal/portlet/test/PortletController.java
===================================================================
--- trunk/portlet/src/main/org/jboss/portal/portlet/test/PortletController.java	2006-10-08 17:02:14 UTC (rev 5362)
+++ trunk/portlet/src/main/org/jboss/portal/portlet/test/PortletController.java	2006-10-08 23:31:19 UTC (rev 5363)
@@ -27,6 +27,7 @@
 import org.jboss.portal.jems.as.system.AbstractJBossService;
 import org.jboss.portal.common.util.Tools;
 import org.jboss.portal.common.util.URLTools;
+import org.jboss.portal.common.NotYetImplemented;
 import org.jboss.portal.portlet.ActionURL;
 import org.jboss.portal.portlet.Parameters;
 import org.jboss.portal.portlet.ParametersStateString;
@@ -67,7 +68,6 @@
 import org.jboss.portal.server.RequestController;
 import org.jboss.portal.server.ServerException;
 import org.jboss.portal.server.ServerInvocation;
-import org.jboss.portal.server.request.RequestParameter;
 import org.jboss.portal.server.request.URLContext;
 import org.jboss.portal.server.request.URLFormat;
 import org.jboss.portal.server.util.HTTPStreamInfo;
@@ -137,7 +137,7 @@
             Portlet portlet = portletInvoker.getPortlet(new PortletContext(portletId));
 
             PortletRequestDecoder decoder = new PortletRequestDecoder();
-            decoder.decode(invocation.getServerContext().getParameterMap());
+            decoder.decode(invocation.getServerContext().getQueryParameterMap(), invocation.getServerContext().getBodyParameterMap());
 
             if (decoder.getType() == PortletRequestDecoder.ACTION_TYPE)
             {
@@ -317,30 +317,31 @@
             }
             else if (result instanceof InsufficientPrivilegesResult)
             {
-               // Redirect to authed servlet
-
-               // Compute the new url context
-               URLContext uctx = invocation.getServerContext().getURLContext();
-               uctx = URLContext.newInstance(uctx.getSecure(), true);
-
-               //
-               AbstractServerURL url = new AbstractServerURL();
-               url.setPortalRequestPath("/index.html");
-
-               //
-               for (Iterator j = invocation.getServerContext().getParameterMap().values().iterator(); j.hasNext();)
-               {
-                  RequestParameter param = (RequestParameter)j.next();
-                  url.setParameterValues(param.getName(), param.getValues());
-               }
-
-               //
-               String s = invocation.getResponse().encodeURL(url, uctx);
-
-               //
-               HttpServletResponse resp = invocation.getServerContext().getClientResponse();
-               resp.sendRedirect(s);
-               return;
+               throw new NotYetImplemented();
+//               // Redirect to authed servlet
+//
+//               // Compute the new url context
+//               URLContext uctx = invocation.getServerContext().getURLContext();
+//               uctx = URLContext.newInstance(uctx.getSecure(), true);
+//
+//               //
+//               AbstractServerURL url = new AbstractServerURL();
+//               url.setPortalRequestPath("/index.html");
+//
+//               //
+//               for (Iterator j = invocation.getServerContext().getParameterMap().values().iterator(); j.hasNext();)
+//               {
+//                  RequestParameter param = (RequestParameter)j.next();
+//                  url.setParameterValues(param.getName(), param.getValues());
+//               }
+//
+//               //
+//               String s = invocation.getResponse().encodeURL(url, uctx);
+//
+//               //
+//               HttpServletResponse resp = invocation.getServerContext().getClientResponse();
+//               resp.sendRedirect(s);
+//               return;
             }
             else
             {

Modified: trunk/portlet/src/main/org/jboss/portal/test/portlet/PortletRequestDecoderTestCase.java
===================================================================
--- trunk/portlet/src/main/org/jboss/portal/test/portlet/PortletRequestDecoderTestCase.java	2006-10-08 17:02:14 UTC (rev 5362)
+++ trunk/portlet/src/main/org/jboss/portal/test/portlet/PortletRequestDecoderTestCase.java	2006-10-08 23:31:19 UTC (rev 5363)
@@ -25,7 +25,6 @@
 import org.jboss.portal.portlet.PortletRequestDecoder;
 import org.jboss.portal.portlet.ParametersStateString;
 import org.jboss.portal.portlet.OpaqueStateString;
-import org.jboss.portal.server.request.RequestParameter;
 import org.jboss.portal.portlet.Parameters;
 import org.jboss.portal.Mode;
 import org.jboss.portal.WindowState;
@@ -45,249 +44,264 @@
       super(name);
    }
 
+   private String[] asStringArray(String s)
+   {
+      return new String[]{s};
+   }
+
    public void testCorruped()
    {
-      Map params = new HashMap();
+      Map queryParams = new HashMap();
+      Map bodyParams = new HashMap();
       PortletRequestDecoder o = new PortletRequestDecoder();
 
       // Action + Render
       try
       {
-         params.put(PortletRequestDecoder.META_PARAMETER, RequestParameter.createQuery(PortletRequestDecoder.META_PARAMETER, Integer.toHexString(PortletRequestDecoder.RENDER_MASK | PortletRequestDecoder.ACTION_MASK)));
-         o.decode(params);
+         queryParams.put(PortletRequestDecoder.META_PARAMETER, asStringArray(Integer.toHexString(PortletRequestDecoder.RENDER_MASK | PortletRequestDecoder.ACTION_MASK)));
+         o.decode(queryParams, null);
          fail();
       }
       catch (IllegalArgumentException expected)
       {
-         params.clear();
+         queryParams.clear();
       }
 
       // Action + Mode
       try
       {
-         params.put(PortletRequestDecoder.META_PARAMETER, RequestParameter.createQuery(PortletRequestDecoder.META_PARAMETER, Integer.toHexString(PortletRequestDecoder.MODE_MASK | PortletRequestDecoder.ACTION_MASK)));
-         o.decode(params);
+         queryParams.put(PortletRequestDecoder.META_PARAMETER, asStringArray(Integer.toHexString(PortletRequestDecoder.MODE_MASK | PortletRequestDecoder.ACTION_MASK)));
+         o.decode(queryParams, null);
          fail();
       }
       catch (IllegalArgumentException expected)
       {
-         params.clear();
+         queryParams.clear();
       }
       try
       {
-         params.put(PortletRequestDecoder.META_PARAMETER, RequestParameter.createQuery(PortletRequestDecoder.META_PARAMETER, Integer.toHexString(PortletRequestDecoder.MODE_MASK | PortletRequestDecoder.ACTION_MASK)));
-         params.put(PortletRequestDecoder.MODE_PARAMETER, RequestParameter.createBody(PortletRequestDecoder.MODE_PARAMETER, Mode.VIEW.toString()));
-         o.decode(params);
+         queryParams.put(PortletRequestDecoder.META_PARAMETER, asStringArray(Integer.toHexString(PortletRequestDecoder.MODE_MASK | PortletRequestDecoder.ACTION_MASK)));
+         bodyParams.put(PortletRequestDecoder.MODE_PARAMETER, asStringArray(Mode.VIEW.toString()));
+         o.decode(queryParams, bodyParams);
          fail();
       }
       catch (IllegalArgumentException expected)
       {
-         params.clear();
+         queryParams.clear();
+         bodyParams.clear();
       }
 
       // Action + WindowState
       try
       {
-         params.put(PortletRequestDecoder.META_PARAMETER, RequestParameter.createQuery(PortletRequestDecoder.META_PARAMETER, Integer.toHexString(PortletRequestDecoder.WINDOW_STATE_MASK | PortletRequestDecoder.ACTION_MASK)));
-         o.decode(params);
+         queryParams.put(PortletRequestDecoder.META_PARAMETER, asStringArray(Integer.toHexString(PortletRequestDecoder.WINDOW_STATE_MASK | PortletRequestDecoder.ACTION_MASK)));
+         o.decode(queryParams, null);
          fail();
       }
       catch (IllegalArgumentException expected)
       {
-         params.clear();
+         queryParams.clear();
       }
       try
       {
-         params.put(PortletRequestDecoder.META_PARAMETER, RequestParameter.createQuery(PortletRequestDecoder.META_PARAMETER, Integer.toHexString(PortletRequestDecoder.WINDOW_STATE_MASK | PortletRequestDecoder.ACTION_MASK)));
-         params.put(PortletRequestDecoder.WINDOW_STATE_PARAMETER, RequestParameter.createBody(PortletRequestDecoder.WINDOW_STATE_PARAMETER, WindowState.NORMAL.toString()));
-         o.decode(params);
+         queryParams.put(PortletRequestDecoder.META_PARAMETER, asStringArray(Integer.toHexString(PortletRequestDecoder.WINDOW_STATE_MASK | PortletRequestDecoder.ACTION_MASK)));
+         bodyParams.put(PortletRequestDecoder.WINDOW_STATE_PARAMETER, asStringArray(WindowState.NORMAL.toString()));
+         o.decode(queryParams, bodyParams);
          fail();
       }
       catch (IllegalArgumentException expected)
       {
-         params.clear();
+         queryParams.clear();
+         bodyParams.clear();
       }
 
       // Render + Mode
       try
       {
-         params.put(PortletRequestDecoder.META_PARAMETER, RequestParameter.createQuery(PortletRequestDecoder.META_PARAMETER, Integer.toHexString(PortletRequestDecoder.MODE_MASK | PortletRequestDecoder.RENDER_MASK)));
-         o.decode(params);
+         queryParams.put(PortletRequestDecoder.META_PARAMETER, asStringArray(Integer.toHexString(PortletRequestDecoder.MODE_MASK | PortletRequestDecoder.RENDER_MASK)));
+         o.decode(queryParams, null);
          fail();
       }
       catch (IllegalArgumentException expected)
       {
-         params.clear();
+         queryParams.clear();
       }
       try
       {
-         params.put(PortletRequestDecoder.META_PARAMETER, RequestParameter.createQuery(PortletRequestDecoder.META_PARAMETER, Integer.toHexString(PortletRequestDecoder.MODE_MASK | PortletRequestDecoder.ACTION_MASK)));
-         params.put(PortletRequestDecoder.MODE_PARAMETER, RequestParameter.createBody(PortletRequestDecoder.MODE_PARAMETER, Mode.VIEW.toString()));
-         o.decode(params);
+         queryParams.put(PortletRequestDecoder.META_PARAMETER, asStringArray(Integer.toHexString(PortletRequestDecoder.MODE_MASK | PortletRequestDecoder.ACTION_MASK)));
+         bodyParams.put(PortletRequestDecoder.MODE_PARAMETER,asStringArray(Mode.VIEW.toString()));
+         o.decode(queryParams, bodyParams);
          fail();
       }
       catch (IllegalArgumentException expected)
       {
-         params.clear();
+         queryParams.clear();
+         bodyParams.clear();
       }
 
       // Render + WindowState
       try
       {
-         params.put(PortletRequestDecoder.META_PARAMETER, RequestParameter.createQuery(PortletRequestDecoder.META_PARAMETER, Integer.toHexString(PortletRequestDecoder.WINDOW_STATE_MASK | PortletRequestDecoder.RENDER_MASK)));
-         o.decode(params);
+         queryParams.put(PortletRequestDecoder.META_PARAMETER, asStringArray(Integer.toHexString(PortletRequestDecoder.WINDOW_STATE_MASK | PortletRequestDecoder.RENDER_MASK)));
+         o.decode(queryParams, bodyParams);
          fail();
       }
       catch (IllegalArgumentException expected)
       {
-         params.clear();
+         queryParams.clear();
       }
       try
       {
-         params.put(PortletRequestDecoder.META_PARAMETER, RequestParameter.createQuery(PortletRequestDecoder.META_PARAMETER, Integer.toHexString(PortletRequestDecoder.WINDOW_STATE_MASK | PortletRequestDecoder.ACTION_MASK)));
-         params.put(PortletRequestDecoder.WINDOW_STATE_PARAMETER, RequestParameter.createBody(PortletRequestDecoder.WINDOW_STATE_PARAMETER, WindowState.NORMAL.toString()));
-         o.decode(params);
+         queryParams.put(PortletRequestDecoder.META_PARAMETER, asStringArray(Integer.toHexString(PortletRequestDecoder.WINDOW_STATE_MASK | PortletRequestDecoder.ACTION_MASK)));
+         bodyParams.put(PortletRequestDecoder.WINDOW_STATE_PARAMETER, asStringArray(WindowState.NORMAL.toString()));
+         o.decode(queryParams, bodyParams);
          fail();
       }
       catch (IllegalArgumentException expected)
       {
-         params.clear();
+         queryParams.clear();
+         bodyParams.clear();
       }
    }
 
    public void testNav()
    {
-      Map params = new HashMap();
+      Map queryParams = new HashMap();
+      Map bodyParams = new HashMap();
       PortletRequestDecoder o = new PortletRequestDecoder();
 
       // Empty
-      o.decode(params);
+      o.decode(queryParams, null);
       assertNull(o.getForm());
       assertNull(o.getInteractionState());
       assertNull(o.getNavigationalstate());
       assertEquals(PortletRequestDecoder.NAV_TYPE, o.getType());
       assertNull(o.getMode());
       assertNull(o.getWindowState());
-      params.clear();
+      queryParams.clear();
 
       // Query mode
-      params.put(PortletRequestDecoder.MODE_PARAMETER, RequestParameter.createQuery(PortletRequestDecoder.MODE_PARAMETER, Mode.VIEW.toString()));
-      o.decode(params);
+      queryParams.put(PortletRequestDecoder.MODE_PARAMETER, asStringArray(Mode.VIEW.toString()));
+      o.decode(queryParams, null);
       assertNull(o.getForm());
       assertNull(o.getInteractionState());
       assertNull(o.getNavigationalstate());
       assertEquals(PortletRequestDecoder.NAV_TYPE, o.getType());
       assertEquals(Mode.VIEW, o.getMode());
       assertNull(o.getWindowState());
-      params.clear();
+      queryParams.clear();
 
       // Query mode two values
-      params.put(PortletRequestDecoder.MODE_PARAMETER, RequestParameter.createQuery(PortletRequestDecoder.MODE_PARAMETER, new String[]{Mode.VIEW.toString(),Mode.EDIT.toString()}));
-      o.decode(params);
+      queryParams.put(PortletRequestDecoder.MODE_PARAMETER, new String[]{Mode.VIEW.toString(),Mode.EDIT.toString()});
+      o.decode(queryParams, null);
       assertNull(o.getForm());
       assertNull(o.getInteractionState());
       assertNull(o.getNavigationalstate());
       assertEquals(PortletRequestDecoder.NAV_TYPE, o.getType());
       assertEquals(Mode.VIEW, o.getMode());
       assertNull(o.getWindowState());
-      params.clear();
+      queryParams.clear();
 
       // Body mode
-      params.put(PortletRequestDecoder.MODE_PARAMETER, RequestParameter.createBody(PortletRequestDecoder.MODE_PARAMETER, Mode.VIEW.toString()));
-      o.decode(params);
+      bodyParams.put(PortletRequestDecoder.MODE_PARAMETER, asStringArray(Mode.VIEW.toString()));
+      o.decode(queryParams, bodyParams);
       assertNull(o.getForm());
       assertNull(o.getInteractionState());
       assertNull(o.getNavigationalstate());
       assertEquals(PortletRequestDecoder.NAV_TYPE, o.getType());
       assertNull(o.getMode());
       assertNull(o.getWindowState());
-      params.clear();
+      bodyParams.clear();
 
       // Query mode + Body mode
-      params.put(PortletRequestDecoder.MODE_PARAMETER, RequestParameter.create(PortletRequestDecoder.MODE_PARAMETER, new String[]{Mode.VIEW.toString()}, new String[]{Mode.EDIT.toString()}));
-      o.decode(params);
+      queryParams.put(PortletRequestDecoder.MODE_PARAMETER, new String[]{Mode.VIEW.toString()});
+      bodyParams.put(PortletRequestDecoder.MODE_PARAMETER, new String[]{Mode.EDIT.toString()});
+      o.decode(queryParams, bodyParams);
       assertNull(o.getForm());
       assertNull(o.getInteractionState());
       assertNull(o.getNavigationalstate());
       assertEquals(PortletRequestDecoder.NAV_TYPE, o.getType());
       assertEquals(Mode.VIEW, o.getMode());
       assertNull(o.getWindowState());
-      params.clear();
+      queryParams.clear();
+      bodyParams.clear();
 
       // Query window state
-      params.put(PortletRequestDecoder.WINDOW_STATE_PARAMETER, RequestParameter.createQuery(PortletRequestDecoder.WINDOW_STATE_PARAMETER, WindowState.NORMAL.toString()));
-      o.decode(params);
+      queryParams.put(PortletRequestDecoder.WINDOW_STATE_PARAMETER, asStringArray(WindowState.NORMAL.toString()));
+      o.decode(queryParams, null);
       assertNull(o.getForm());
       assertNull(o.getInteractionState());
       assertNull(o.getNavigationalstate());
       assertEquals(PortletRequestDecoder.NAV_TYPE, o.getType());
       assertNull(o.getMode());
       assertEquals(WindowState.NORMAL, o.getWindowState());
-      params.clear();
+      queryParams.clear();
 
       // Body window state
-      params.put(PortletRequestDecoder.WINDOW_STATE_PARAMETER, RequestParameter.createBody(PortletRequestDecoder.WINDOW_STATE_PARAMETER, WindowState.NORMAL.toString()));
-      o.decode(params);
+      bodyParams.put(PortletRequestDecoder.WINDOW_STATE_PARAMETER,asStringArray(WindowState.NORMAL.toString()));
+      o.decode(queryParams, bodyParams);
       assertNull(o.getForm());
       assertNull(o.getInteractionState());
       assertNull(o.getNavigationalstate());
       assertEquals(PortletRequestDecoder.NAV_TYPE, o.getType());
       assertNull(o.getMode());
       assertNull(o.getWindowState());
+      bodyParams.clear();
    }
 
    public void testRender()
    {
-      Map params = new HashMap();
+      Map queryParams = new HashMap();
       PortletRequestDecoder o = new PortletRequestDecoder();
 
       // Empty
-      params.put(PortletRequestDecoder.META_PARAMETER, RequestParameter.createQuery(PortletRequestDecoder.META_PARAMETER, Integer.toHexString(PortletRequestDecoder.RENDER_MASK)));
-      o.decode(params);
+      queryParams.put(PortletRequestDecoder.META_PARAMETER, asStringArray(Integer.toHexString(PortletRequestDecoder.RENDER_MASK)));
+      o.decode(queryParams, null);
       assertNull(o.getForm());
       assertNull(o.getInteractionState());
       assertEquals(new ParametersStateString(), o.getNavigationalstate());
       assertEquals(PortletRequestDecoder.RENDER_TYPE, o.getType());
       assertNull(o.getMode());
       assertNull(o.getWindowState());
-      params.clear();
+      queryParams.clear();
 
       // Query mode
-      params.put(PortletRequestDecoder.META_PARAMETER, RequestParameter.createQuery(PortletRequestDecoder.META_PARAMETER, Integer.toHexString(PortletRequestDecoder.RENDER_MASK | PortletRequestDecoder.MODE_MASK)));
-      params.put(PortletRequestDecoder.MODE_PARAMETER, RequestParameter.createQuery(PortletRequestDecoder.MODE_PARAMETER, Mode.VIEW.toString()));
-      o.decode(params);
+      queryParams.put(PortletRequestDecoder.META_PARAMETER, asStringArray(Integer.toHexString(PortletRequestDecoder.RENDER_MASK | PortletRequestDecoder.MODE_MASK)));
+      queryParams.put(PortletRequestDecoder.MODE_PARAMETER, asStringArray(Mode.VIEW.toString()));
+      o.decode(queryParams, null);
       assertNull(o.getForm());
       assertNull(o.getInteractionState());
       assertEquals(new ParametersStateString(), o.getNavigationalstate());
       assertEquals(PortletRequestDecoder.RENDER_TYPE, o.getType());
       assertEquals(Mode.VIEW, o.getMode());
       assertNull(o.getWindowState());
-      params.clear();
+      queryParams.clear();
 
 
       // Query window state
-      params.put(PortletRequestDecoder.META_PARAMETER, RequestParameter.createQuery(PortletRequestDecoder.META_PARAMETER, Integer.toHexString(PortletRequestDecoder.RENDER_MASK | PortletRequestDecoder.WINDOW_STATE_MASK)));
-      params.put(PortletRequestDecoder.WINDOW_STATE_PARAMETER, RequestParameter.createQuery(PortletRequestDecoder.WINDOW_STATE_PARAMETER, WindowState.NORMAL.toString()));
-      o.decode(params);
+      queryParams.put(PortletRequestDecoder.META_PARAMETER, asStringArray(Integer.toHexString(PortletRequestDecoder.RENDER_MASK | PortletRequestDecoder.WINDOW_STATE_MASK)));
+      queryParams.put(PortletRequestDecoder.WINDOW_STATE_PARAMETER, asStringArray(WindowState.NORMAL.toString()));
+      o.decode(queryParams, null);
       assertNull(o.getForm());
       assertNull(o.getInteractionState());
       assertEquals(new ParametersStateString(), o.getNavigationalstate());
       assertEquals(PortletRequestDecoder.RENDER_TYPE, o.getType());
       assertNull(o.getMode());
       assertEquals(WindowState.NORMAL, o.getWindowState());
-      params.clear();
+      queryParams.clear();
    }
 
    public void testRenderNonOpaque()
    {
-      Map params = new HashMap();
+      Map queryParams = new HashMap();
+      Map bodyParams = new HashMap();
       PortletRequestDecoder o = new PortletRequestDecoder();
       ParametersStateString navState = new ParametersStateString();
 
       // Query parameter
-      params.put(PortletRequestDecoder.META_PARAMETER, RequestParameter.createQuery(PortletRequestDecoder.META_PARAMETER, Integer.toHexString(PortletRequestDecoder.RENDER_MASK)));
-      params.put("foo", RequestParameter.createQuery("foo", "bar"));
-      o.decode(params);
+      queryParams.put(PortletRequestDecoder.META_PARAMETER, asStringArray(Integer.toHexString(PortletRequestDecoder.RENDER_MASK)));
+      queryParams.put("foo", asStringArray("bar"));
+      o.decode(queryParams, null);
       assertNull(o.getForm());
       assertNull(o.getInteractionState());
       navState.setValue("foo", "bar");
@@ -296,11 +310,11 @@
       assertNull(o.getMode());
       assertNull(o.getWindowState());
       navState.clear();
-      params.clear();
+      queryParams.clear();
 
       // Query meta parameter
-      params.put(PortletRequestDecoder.META_PARAMETER, RequestParameter.createQuery(PortletRequestDecoder.META_PARAMETER, new String[]{Integer.toHexString(PortletRequestDecoder.RENDER_MASK),"bar"}));
-      o.decode(params);
+      queryParams.put(PortletRequestDecoder.META_PARAMETER, new String[]{Integer.toHexString(PortletRequestDecoder.RENDER_MASK),"bar"});
+      o.decode(queryParams, null);
       assertNull(o.getForm());
       assertNull(o.getInteractionState());
       navState.setValue(PortletRequestDecoder.META_PARAMETER, "bar");
@@ -309,12 +323,12 @@
       assertNull(o.getMode());
       assertNull(o.getWindowState());
       navState.clear();
-      params.clear();
+      queryParams.clear();
 
       // Query window state parameter + window state meta parameter
-      params.put(PortletRequestDecoder.META_PARAMETER, RequestParameter.createQuery(PortletRequestDecoder.META_PARAMETER, new String[]{Integer.toHexString(PortletRequestDecoder.RENDER_MASK|PortletRequestDecoder.WINDOW_STATE_MASK)}));
-      params.put(PortletRequestDecoder.WINDOW_STATE_PARAMETER, RequestParameter.createQuery(PortletRequestDecoder.WINDOW_STATE_PARAMETER, new String[]{WindowState.NORMAL.toString(),"bar"}));
-      o.decode(params);
+      queryParams.put(PortletRequestDecoder.META_PARAMETER, new String[]{Integer.toHexString(PortletRequestDecoder.RENDER_MASK|PortletRequestDecoder.WINDOW_STATE_MASK)});
+      queryParams.put(PortletRequestDecoder.WINDOW_STATE_PARAMETER, new String[]{WindowState.NORMAL.toString(),"bar"});
+      o.decode(queryParams, null);
       assertNull(o.getForm());
       assertNull(o.getInteractionState());
       navState.setValue(PortletRequestDecoder.WINDOW_STATE_PARAMETER, "bar");
@@ -323,12 +337,12 @@
       assertNull(o.getMode());
       assertEquals(WindowState.NORMAL, o.getWindowState());
       navState.clear();
-      params.clear();
+      queryParams.clear();
 
       // Query window state parameter
-      params.put(PortletRequestDecoder.META_PARAMETER, RequestParameter.createQuery(PortletRequestDecoder.META_PARAMETER, new String[]{Integer.toHexString(PortletRequestDecoder.RENDER_MASK)}));
-      params.put(PortletRequestDecoder.WINDOW_STATE_PARAMETER, RequestParameter.createQuery(PortletRequestDecoder.WINDOW_STATE_PARAMETER, new String[]{"bar"}));
-      o.decode(params);
+      queryParams.put(PortletRequestDecoder.META_PARAMETER, new String[]{Integer.toHexString(PortletRequestDecoder.RENDER_MASK)});
+      queryParams.put(PortletRequestDecoder.WINDOW_STATE_PARAMETER, new String[]{"bar"});
+      o.decode(queryParams, null);
       assertNull(o.getForm());
       assertNull(o.getInteractionState());
       navState.setValue(PortletRequestDecoder.WINDOW_STATE_PARAMETER, "bar");
@@ -337,12 +351,12 @@
       assertNull(o.getMode());
       assertNull(o.getWindowState());
       navState.clear();
-      params.clear();
+      queryParams.clear();
 
       // Query mode parameter + mode meta parameter
-      params.put(PortletRequestDecoder.META_PARAMETER, RequestParameter.createQuery(PortletRequestDecoder.META_PARAMETER, new String[]{Integer.toHexString(PortletRequestDecoder.RENDER_MASK|PortletRequestDecoder.MODE_MASK)}));
-      params.put(PortletRequestDecoder.MODE_PARAMETER, RequestParameter.createQuery(PortletRequestDecoder.MODE_PARAMETER, new String[]{Mode.VIEW.toString(),"bar"}));
-      o.decode(params);
+      queryParams.put(PortletRequestDecoder.META_PARAMETER, new String[]{Integer.toHexString(PortletRequestDecoder.RENDER_MASK|PortletRequestDecoder.MODE_MASK)});
+      queryParams.put(PortletRequestDecoder.MODE_PARAMETER, new String[]{Mode.VIEW.toString(),"bar"});
+      o.decode(queryParams, null);
       assertNull(o.getForm());
       assertNull(o.getInteractionState());
       navState.setValue(PortletRequestDecoder.MODE_PARAMETER, "bar");
@@ -351,12 +365,12 @@
       assertEquals(Mode.VIEW, o.getMode());
       assertNull(o.getWindowState());
       navState.clear();
-      params.clear();
+      queryParams.clear();
 
       // Query mode parameter
-      params.put(PortletRequestDecoder.META_PARAMETER, RequestParameter.createQuery(PortletRequestDecoder.META_PARAMETER, new String[]{Integer.toHexString(PortletRequestDecoder.RENDER_MASK)}));
-      params.put(PortletRequestDecoder.MODE_PARAMETER, RequestParameter.createQuery(PortletRequestDecoder.MODE_PARAMETER, new String[]{"bar"}));
-      o.decode(params);
+      queryParams.put(PortletRequestDecoder.META_PARAMETER, new String[]{Integer.toHexString(PortletRequestDecoder.RENDER_MASK)});
+      queryParams.put(PortletRequestDecoder.MODE_PARAMETER, new String[]{"bar"});
+      o.decode(queryParams, null);
       assertNull(o.getForm());
       assertNull(o.getInteractionState());
       navState.setValue(PortletRequestDecoder.MODE_PARAMETER, "bar");
@@ -365,12 +379,12 @@
       assertNull(o.getMode());
       assertNull(o.getWindowState());
       navState.clear();
-      params.clear();
+      queryParams.clear();
 
       // Body parameter
-      params.put(PortletRequestDecoder.META_PARAMETER, RequestParameter.createQuery(PortletRequestDecoder.META_PARAMETER, Integer.toHexString(PortletRequestDecoder.RENDER_MASK)));
-      params.put("foo", RequestParameter.createBody("foo", "bar2"));
-      o.decode(params);
+      queryParams.put(PortletRequestDecoder.META_PARAMETER, asStringArray(Integer.toHexString(PortletRequestDecoder.RENDER_MASK)));
+      bodyParams.put("foo", asStringArray("bar2"));
+      o.decode(queryParams, bodyParams);
       assertNull(o.getForm());
       assertNull(o.getInteractionState());
       assertEquals(navState, o.getNavigationalstate());
@@ -378,12 +392,13 @@
       assertNull(o.getMode());
       assertNull(o.getWindowState());
       navState.clear();
-      params.clear();
+      queryParams.clear();
+      bodyParams.clear();
 
       // Query multivalued parameter
-      params.put(PortletRequestDecoder.META_PARAMETER, RequestParameter.createQuery(PortletRequestDecoder.META_PARAMETER, Integer.toHexString(PortletRequestDecoder.RENDER_MASK)));
-      params.put("foo", RequestParameter.createQuery("foo", new String[]{"bar1","bar2"}));
-      o.decode(params);
+      queryParams.put(PortletRequestDecoder.META_PARAMETER,asStringArray(Integer.toHexString(PortletRequestDecoder.RENDER_MASK)));
+      queryParams.put("foo", new String[]{"bar1","bar2"});
+      o.decode(queryParams, null);
       assertNull(o.getForm());
       assertNull(o.getInteractionState());
       navState.setValues("foo", new String[]{"bar1","bar2"});
@@ -392,12 +407,13 @@
       assertNull(o.getMode());
       assertNull(o.getWindowState());
       navState.clear();
-      params.clear();
+      queryParams.clear();
 
       // Query + Body parameter
-      params.put(PortletRequestDecoder.META_PARAMETER, RequestParameter.createQuery(PortletRequestDecoder.META_PARAMETER, Integer.toHexString(PortletRequestDecoder.RENDER_MASK)));
-      params.put("foo", RequestParameter.create("foo", new String[]{"bar1"}, new String[]{"bar2"}));
-      o.decode(params);
+      queryParams.put(PortletRequestDecoder.META_PARAMETER, asStringArray(Integer.toHexString(PortletRequestDecoder.RENDER_MASK)));
+      queryParams.put("foo", new String[]{"bar1"});
+      bodyParams.put("foo", new String[]{"bar2"});
+      o.decode(queryParams, bodyParams);
       assertNull(o.getForm());
       assertNull(o.getInteractionState());
       navState.setValue("foo", "bar1");
@@ -406,127 +422,132 @@
       assertNull(o.getMode());
       assertNull(o.getWindowState());
       navState.clear();
-      params.clear();
+      queryParams.clear();
+      bodyParams.clear();
    }
 
    public void testRenderOpaque()
    {
-      Map params = new HashMap();
+      Map queryParams = new HashMap();
+      Map bodyParams = new HashMap();
       PortletRequestDecoder o = new PortletRequestDecoder();
 
       // Empty
-      params.put(PortletRequestDecoder.META_PARAMETER, RequestParameter.createQuery(PortletRequestDecoder.META_PARAMETER, Integer.toHexString(PortletRequestDecoder.RENDER_MASK | PortletRequestDecoder.OPAQUE_MASK)));
-      o.decode(params);
+      queryParams.put(PortletRequestDecoder.META_PARAMETER, asStringArray(Integer.toHexString(PortletRequestDecoder.RENDER_MASK | PortletRequestDecoder.OPAQUE_MASK)));
+      o.decode(queryParams, null);
       assertNull(o.getForm());
       assertNull(o.getInteractionState());
       assertNull(o.getNavigationalstate());
       assertEquals(PortletRequestDecoder.RENDER_TYPE, o.getType());
       assertNull(o.getMode());
       assertNull(o.getWindowState());
-      params.clear();
+      queryParams.clear();
 
       // Query nav state
-      params.put(PortletRequestDecoder.META_PARAMETER, RequestParameter.createQuery(PortletRequestDecoder.META_PARAMETER, Integer.toHexString(PortletRequestDecoder.RENDER_MASK | PortletRequestDecoder.OPAQUE_MASK)));
-      params.put(PortletRequestDecoder.NAVIGATIONAL_STATE_PARAMETER, RequestParameter.createQuery(PortletRequestDecoder.NAVIGATIONAL_STATE_PARAMETER, "navstatevalue"));
-      o.decode(params);
+      queryParams.put(PortletRequestDecoder.META_PARAMETER, asStringArray(Integer.toHexString(PortletRequestDecoder.RENDER_MASK | PortletRequestDecoder.OPAQUE_MASK)));
+      queryParams.put(PortletRequestDecoder.NAVIGATIONAL_STATE_PARAMETER, asStringArray("navstatevalue"));
+      o.decode(queryParams, bodyParams);
       assertNull(o.getForm());
       assertNull(o.getInteractionState());
       assertEquals(new OpaqueStateString("navstatevalue"), o.getNavigationalstate());
       assertEquals(PortletRequestDecoder.RENDER_TYPE, o.getType());
       assertNull(o.getMode());
       assertNull(o.getWindowState());
-      params.clear();
+      queryParams.clear();
 
       // Body nav state
-      params.put(PortletRequestDecoder.META_PARAMETER, RequestParameter.createQuery(PortletRequestDecoder.META_PARAMETER, Integer.toHexString(PortletRequestDecoder.RENDER_MASK | PortletRequestDecoder.OPAQUE_MASK)));
-      params.put(PortletRequestDecoder.NAVIGATIONAL_STATE_PARAMETER, RequestParameter.createBody(PortletRequestDecoder.NAVIGATIONAL_STATE_PARAMETER, "navstatevalue"));
-      o.decode(params);
+      queryParams.put(PortletRequestDecoder.META_PARAMETER, asStringArray(Integer.toHexString(PortletRequestDecoder.RENDER_MASK | PortletRequestDecoder.OPAQUE_MASK)));
+      bodyParams.put(PortletRequestDecoder.NAVIGATIONAL_STATE_PARAMETER, asStringArray("navstatevalue"));
+      o.decode(queryParams, bodyParams);
       assertNull(o.getForm());
       assertNull(o.getInteractionState());
       assertNull(o.getNavigationalstate());
       assertEquals(PortletRequestDecoder.RENDER_TYPE, o.getType());
       assertNull(o.getMode());
       assertNull(o.getWindowState());
-      params.clear();
+      queryParams.clear();
+      bodyParams.clear();
 
       // Query int state is ignored
-      params.put(PortletRequestDecoder.META_PARAMETER, RequestParameter.createQuery(PortletRequestDecoder.META_PARAMETER, Integer.toHexString(PortletRequestDecoder.RENDER_MASK | PortletRequestDecoder.OPAQUE_MASK)));
-      params.put(PortletRequestDecoder.INTERACTION_STATE_PARAMETER, RequestParameter.createQuery(PortletRequestDecoder.INTERACTION_STATE_PARAMETER, "intstatevalue"));
-      o.decode(params);
+      queryParams.put(PortletRequestDecoder.META_PARAMETER,asStringArray(Integer.toHexString(PortletRequestDecoder.RENDER_MASK | PortletRequestDecoder.OPAQUE_MASK)));
+      queryParams.put(PortletRequestDecoder.INTERACTION_STATE_PARAMETER, asStringArray("intstatevalue"));
+      o.decode(queryParams, null);
       assertNull(o.getForm());
       assertNull(o.getInteractionState());
       assertNull(o.getNavigationalstate());
       assertEquals(PortletRequestDecoder.RENDER_TYPE, o.getType());
       assertNull(o.getMode());
       assertNull(o.getWindowState());
-      params.clear();
+      queryParams.clear();
 
       // Body int state is ignored
-      params.put(PortletRequestDecoder.META_PARAMETER, RequestParameter.createQuery(PortletRequestDecoder.META_PARAMETER, Integer.toHexString(PortletRequestDecoder.RENDER_MASK | PortletRequestDecoder.OPAQUE_MASK)));
-      params.put(PortletRequestDecoder.INTERACTION_STATE_PARAMETER, RequestParameter.createBody(PortletRequestDecoder.INTERACTION_STATE_PARAMETER, "intstatevalue"));
-      o.decode(params);
+      queryParams.put(PortletRequestDecoder.META_PARAMETER, asStringArray(Integer.toHexString(PortletRequestDecoder.RENDER_MASK | PortletRequestDecoder.OPAQUE_MASK)));
+      bodyParams.put(PortletRequestDecoder.INTERACTION_STATE_PARAMETER, asStringArray("intstatevalue"));
+      o.decode(queryParams, bodyParams);
       assertNull(o.getForm());
       assertNull(o.getInteractionState());
       assertNull(o.getNavigationalstate());
       assertEquals(PortletRequestDecoder.RENDER_TYPE, o.getType());
       assertNull(o.getMode());
       assertNull(o.getWindowState());
-      params.clear();
+      queryParams.clear();
+      bodyParams.clear();
    }
 
    public void testAction()
    {
-      Map params = new HashMap();
+      Map queryParams = new HashMap();
       PortletRequestDecoder o = new PortletRequestDecoder();
 
       // Empty
-      params.put(PortletRequestDecoder.META_PARAMETER, RequestParameter.createQuery(PortletRequestDecoder.META_PARAMETER, Integer.toHexString(PortletRequestDecoder.ACTION_MASK)));
-      o.decode(params);
+      queryParams.put(PortletRequestDecoder.META_PARAMETER, asStringArray(Integer.toHexString(PortletRequestDecoder.ACTION_MASK)));
+      o.decode(queryParams, null);
       assertEquals(new Parameters(), o.getForm());
       assertEquals(new ParametersStateString(), o.getInteractionState());
       assertNull(o.getNavigationalstate());
       assertEquals(PortletRequestDecoder.ACTION_TYPE, o.getType());
       assertNull(o.getMode());
       assertNull(o.getWindowState());
-      params.clear();
+      queryParams.clear();
 
       // Query mode
-      params.put(PortletRequestDecoder.META_PARAMETER, RequestParameter.createQuery(PortletRequestDecoder.META_PARAMETER, Integer.toHexString(PortletRequestDecoder.ACTION_MASK | PortletRequestDecoder.MODE_MASK)));
-      params.put(PortletRequestDecoder.MODE_PARAMETER, RequestParameter.createQuery(PortletRequestDecoder.MODE_PARAMETER, Mode.VIEW.toString()));
-      o.decode(params);
+      queryParams.put(PortletRequestDecoder.META_PARAMETER, asStringArray(Integer.toHexString(PortletRequestDecoder.ACTION_MASK | PortletRequestDecoder.MODE_MASK)));
+      queryParams.put(PortletRequestDecoder.MODE_PARAMETER, asStringArray(Mode.VIEW.toString()));
+      o.decode(queryParams, null);
       assertEquals(new Parameters(), o.getForm());
       assertEquals(new ParametersStateString(), o.getInteractionState());
       assertNull(o.getNavigationalstate());
       assertEquals(PortletRequestDecoder.ACTION_TYPE, o.getType());
       assertEquals(Mode.VIEW, o.getMode());
       assertNull(o.getWindowState());
-      params.clear();
+      queryParams.clear();
 
 
       // Query window state
-      params.put(PortletRequestDecoder.META_PARAMETER, RequestParameter.createQuery(PortletRequestDecoder.META_PARAMETER, Integer.toHexString(PortletRequestDecoder.ACTION_MASK | PortletRequestDecoder.WINDOW_STATE_MASK)));
-      params.put(PortletRequestDecoder.WINDOW_STATE_PARAMETER, RequestParameter.createQuery(PortletRequestDecoder.WINDOW_STATE_PARAMETER, WindowState.NORMAL.toString()));
-      o.decode(params);
+      queryParams.put(PortletRequestDecoder.META_PARAMETER, asStringArray(Integer.toHexString(PortletRequestDecoder.ACTION_MASK | PortletRequestDecoder.WINDOW_STATE_MASK)));
+      queryParams.put(PortletRequestDecoder.WINDOW_STATE_PARAMETER, asStringArray( WindowState.NORMAL.toString()));
+      o.decode(queryParams, null);
       assertEquals(new Parameters(), o.getForm());
       assertEquals(new ParametersStateString(), o.getInteractionState());
       assertNull(o.getNavigationalstate());
       assertEquals(PortletRequestDecoder.ACTION_TYPE, o.getType());
       assertNull(o.getMode());
       assertEquals(WindowState.NORMAL, o.getWindowState());
-      params.clear();
+      queryParams.clear();
    }
 
    public void testActionNonOpaque()
    {
-      Map params = new HashMap();
+      Map queryParams = new HashMap();
+      Map bodyParams = new HashMap();
       PortletRequestDecoder o = new PortletRequestDecoder();
       ParametersStateString intState = new ParametersStateString();
       Parameters form = new Parameters();
 
       // Query parameter
-      params.put(PortletRequestDecoder.META_PARAMETER, RequestParameter.createQuery(PortletRequestDecoder.META_PARAMETER, Integer.toHexString(PortletRequestDecoder.ACTION_MASK)));
-      params.put("foo", RequestParameter.createQuery("foo", "bar"));
-      o.decode(params);
+      queryParams.put(PortletRequestDecoder.META_PARAMETER, asStringArray(Integer.toHexString(PortletRequestDecoder.ACTION_MASK)));
+      queryParams.put("foo", asStringArray("bar"));
+      o.decode(queryParams, null);
       assertEquals(form, o.getForm());
       intState.setValue("foo", "bar");
       assertEquals(intState, o.getInteractionState());
@@ -535,13 +556,13 @@
       assertNull(o.getMode());
       assertNull(o.getWindowState());
       intState.clear();
-      params.clear();
+      queryParams.clear();
       form.clear();
 
       // Query multivalued parameter
-      params.put(PortletRequestDecoder.META_PARAMETER, RequestParameter.createQuery(PortletRequestDecoder.META_PARAMETER, Integer.toHexString(PortletRequestDecoder.ACTION_MASK)));
-      params.put("foo", RequestParameter.createQuery("foo", new String[]{"bar1","bar2"}));
-      o.decode(params);
+      queryParams.put(PortletRequestDecoder.META_PARAMETER, asStringArray(Integer.toHexString(PortletRequestDecoder.ACTION_MASK)));
+      queryParams.put("foo", new String[]{"bar1","bar2"});
+      o.decode(queryParams, null);
       assertEquals(form, o.getForm());
       intState.setValues("foo", new String[]{"bar1","bar2"});
       assertEquals(intState, o.getInteractionState());
@@ -550,13 +571,13 @@
       assertNull(o.getMode());
       assertNull(o.getWindowState());
       intState.clear();
-      params.clear();
+      queryParams.clear();
       form.clear();
 
       // Body parameter
-      params.put(PortletRequestDecoder.META_PARAMETER, RequestParameter.createQuery(PortletRequestDecoder.META_PARAMETER, Integer.toHexString(PortletRequestDecoder.ACTION_MASK)));
-      params.put("foo", RequestParameter.createBody("foo", "bar"));
-      o.decode(params);
+      queryParams.put(PortletRequestDecoder.META_PARAMETER, asStringArray(Integer.toHexString(PortletRequestDecoder.ACTION_MASK)));
+      bodyParams.put("foo", asStringArray("bar"));
+      o.decode(queryParams, bodyParams);
       form.setValue("foo", "bar");
       assertEquals(form, o.getForm());
       assertEquals(intState, o.getInteractionState());
@@ -565,13 +586,14 @@
       assertNull(o.getMode());
       assertNull(o.getWindowState());
       form.clear();
-      params.clear();
+      queryParams.clear();
+      bodyParams.clear();
       form.clear();
 
       // Body multivalued parameter
-      params.put(PortletRequestDecoder.META_PARAMETER, RequestParameter.createQuery(PortletRequestDecoder.META_PARAMETER, Integer.toHexString(PortletRequestDecoder.ACTION_MASK)));
-      params.put("foo", RequestParameter.createBody("foo", new String[]{"bar1","bar2"}));
-      o.decode(params);
+      queryParams.put(PortletRequestDecoder.META_PARAMETER, asStringArray(Integer.toHexString(PortletRequestDecoder.ACTION_MASK)));
+      bodyParams.put("foo", new String[]{"bar1","bar2"});
+      o.decode(queryParams, bodyParams);
       form.setValues("foo", new String[]{"bar1","bar2"});
       assertEquals(form, o.getForm());
       assertEquals(intState, o.getInteractionState());
@@ -580,56 +602,59 @@
       assertNull(o.getMode());
       assertNull(o.getWindowState());
       form.clear();
-      params.clear();
+      queryParams.clear();
+      bodyParams.clear();
       form.clear();
    }
 
    public void testActionOpaque()
    {
-      Map params = new HashMap();
+      Map queryParams = new HashMap();
+      Map bodyParams = new HashMap();
       PortletRequestDecoder o = new PortletRequestDecoder();
 
       // Empty
-      params.put(PortletRequestDecoder.META_PARAMETER, RequestParameter.createQuery(PortletRequestDecoder.META_PARAMETER, Integer.toHexString(PortletRequestDecoder.ACTION_MASK | PortletRequestDecoder.OPAQUE_MASK)));
-      o.decode(params);
+      queryParams.put(PortletRequestDecoder.META_PARAMETER, asStringArray(Integer.toHexString(PortletRequestDecoder.ACTION_MASK | PortletRequestDecoder.OPAQUE_MASK)));
+      o.decode(queryParams, null);
       assertEquals(new Parameters(), o.getForm());
       assertNull(o.getInteractionState());
       assertNull(o.getNavigationalstate());
       assertEquals(PortletRequestDecoder.ACTION_TYPE, o.getType());
       assertNull(o.getMode());
       assertNull(o.getWindowState());
-      params.clear();
+      queryParams.clear();
 
       // Query nav state
-      params.put(PortletRequestDecoder.META_PARAMETER, RequestParameter.createQuery(PortletRequestDecoder.META_PARAMETER, Integer.toHexString(PortletRequestDecoder.ACTION_MASK | PortletRequestDecoder.OPAQUE_MASK)));
-      params.put(PortletRequestDecoder.NAVIGATIONAL_STATE_PARAMETER, RequestParameter.createQuery(PortletRequestDecoder.NAVIGATIONAL_STATE_PARAMETER, "navstatevalue"));
-      o.decode(params);
+      queryParams.put(PortletRequestDecoder.META_PARAMETER, asStringArray(Integer.toHexString(PortletRequestDecoder.ACTION_MASK | PortletRequestDecoder.OPAQUE_MASK)));
+      queryParams.put(PortletRequestDecoder.NAVIGATIONAL_STATE_PARAMETER, asStringArray("navstatevalue"));
+      o.decode(queryParams, null);
       assertEquals(new Parameters(), o.getForm());
       assertNull(o.getInteractionState());
       assertEquals(new OpaqueStateString("navstatevalue"), o.getNavigationalstate());
       assertEquals(PortletRequestDecoder.ACTION_TYPE, o.getType());
       assertNull(o.getMode());
       assertNull(o.getWindowState());
-      params.clear();
+      queryParams.clear();
 
       // Query int state
-      params.put(PortletRequestDecoder.META_PARAMETER, RequestParameter.createQuery(PortletRequestDecoder.META_PARAMETER, Integer.toHexString(PortletRequestDecoder.ACTION_MASK | PortletRequestDecoder.OPAQUE_MASK)));
-      params.put(PortletRequestDecoder.INTERACTION_STATE_PARAMETER, RequestParameter.createQuery(PortletRequestDecoder.INTERACTION_STATE_PARAMETER, "intstatevalue"));
-      o.decode(params);
+      queryParams.put(PortletRequestDecoder.META_PARAMETER, asStringArray(Integer.toHexString(PortletRequestDecoder.ACTION_MASK | PortletRequestDecoder.OPAQUE_MASK)));
+      queryParams.put(PortletRequestDecoder.INTERACTION_STATE_PARAMETER, asStringArray("intstatevalue"));
+      o.decode(queryParams, null);
       assertEquals(new Parameters(), o.getForm());
       assertEquals(new OpaqueStateString("intstatevalue"), o.getInteractionState());
       assertNull(o.getNavigationalstate());
       assertEquals(PortletRequestDecoder.ACTION_TYPE, o.getType());
       assertNull(o.getMode());
       assertNull(o.getWindowState());
-      params.clear();
+      queryParams.clear();
 
       // Body parameters
-      params.put(PortletRequestDecoder.META_PARAMETER, RequestParameter.createQuery(PortletRequestDecoder.META_PARAMETER, Integer.toHexString(PortletRequestDecoder.ACTION_MASK | PortletRequestDecoder.OPAQUE_MASK)));
-      params.put("foo1", RequestParameter.createBody("foo1", "bar1"));
-      params.put("foo2", RequestParameter.createBody("foo2", new String[]{"bar2","bar3"}));
-      params.put("foo3", RequestParameter.create("foo3", new String[]{"bar4"}, new String[]{"bar5"}));
-      o.decode(params);
+      queryParams.put(PortletRequestDecoder.META_PARAMETER, asStringArray(Integer.toHexString(PortletRequestDecoder.ACTION_MASK | PortletRequestDecoder.OPAQUE_MASK)));
+      bodyParams.put("foo1", asStringArray("bar1"));
+      bodyParams.put("foo2", new String[]{"bar2","bar3"});
+      queryParams.put("foo3", new String[]{"bar4"});
+      bodyParams.put("foo3", new String[]{"bar5"});
+      o.decode(queryParams, bodyParams);
       Parameters form = new Parameters();
       form.setValue("foo1", "bar1");
       form.setValues("foo2", new String[]{"bar2","bar3"});
@@ -640,6 +665,7 @@
       assertEquals(PortletRequestDecoder.ACTION_TYPE, o.getType());
       assertNull(o.getMode());
       assertNull(o.getWindowState());
-      params.clear();
+      queryParams.clear();
+      bodyParams.clear();
    }
 }

Modified: trunk/server/src/main/org/jboss/portal/server/ServerInvocationContext.java
===================================================================
--- trunk/server/src/main/org/jboss/portal/server/ServerInvocationContext.java	2006-10-08 17:02:14 UTC (rev 5362)
+++ trunk/server/src/main/org/jboss/portal/server/ServerInvocationContext.java	2006-10-08 23:31:19 UTC (rev 5363)
@@ -48,11 +48,17 @@
    HttpServletResponse getClientResponse();
 
    /**
-    * Return the parameter map.
+    * Return the parameter map decoded form the query string.
     */
-   Map getParameterMap();
+   Map getQueryParameterMap();
 
    /**
+    * Return the parameter map for the body if the request was a POST with the content type x-www-formurlencoded
+    * otherwise return null.
+    */
+   Map getBodyParameterMap();
+
+   /**
     * Return the normalized media type of the request or null if none has been provided by the client.
     */
    String getMediaType();

Modified: trunk/server/src/main/org/jboss/portal/server/impl/ServerInvocationContextImpl.java
===================================================================
--- trunk/server/src/main/org/jboss/portal/server/impl/ServerInvocationContextImpl.java	2006-10-08 17:02:14 UTC (rev 5362)
+++ trunk/server/src/main/org/jboss/portal/server/impl/ServerInvocationContextImpl.java	2006-10-08 23:31:19 UTC (rev 5363)
@@ -56,9 +56,12 @@
    /** . */
    private String mediaType;
 
-   /** The <String,Parameter>Map. */
-   private Map parameterMap;
+   /** The query parameter map. */
+   private Map queryParameterMap;
 
+   /** The body parameter map or null. */
+   private Map bodyParameterMap;
+
    /** The url context. */
    private URLContext urlContext;
 
@@ -67,7 +70,8 @@
       HttpServletResponse resp,
       String portalRequestPath,
       String portalContextPath,
-      Map parameterMap,
+      Map queryParameterMap,
+      Map bodyParameterMap,
       URLContext urlContext,
       String mediaType)
    {
@@ -85,7 +89,8 @@
       this.resp = resp;
       this.portalRequestPath = portalRequestPath;
       this.portalContextPath = portalContextPath;
-      this.parameterMap = parameterMap;
+      this.queryParameterMap = queryParameterMap;
+      this.bodyParameterMap = bodyParameterMap;
       this.urlContext = urlContext;
       this.mediaType = mediaType;
 
@@ -116,11 +121,17 @@
       return urlContext;
    }
 
-   public Map getParameterMap()
+
+   public Map getQueryParameterMap()
    {
-      return parameterMap;
+      return queryParameterMap;
    }
 
+   public Map getBodyParameterMap()
+   {
+      return bodyParameterMap;
+   }
+
    public String getPortalRequestPath()
    {
       return portalRequestPath;

Deleted: trunk/server/src/main/org/jboss/portal/server/request/RequestParameter.java
===================================================================
--- trunk/server/src/main/org/jboss/portal/server/request/RequestParameter.java	2006-10-08 17:02:14 UTC (rev 5362)
+++ trunk/server/src/main/org/jboss/portal/server/request/RequestParameter.java	2006-10-08 23:31:19 UTC (rev 5363)
@@ -1,230 +0,0 @@
-/*
-* JBoss, Home of Professional Open Source
-* Copyright 2005, JBoss Inc., and individual contributors as indicated
-* by the @authors tag. See the copyright.txt in the distribution for a
-* full listing of individual contributors.
-*
-* This is free software; you can redistribute it and/or modify it
-* under the terms of the GNU Lesser General Public License as
-* published by the Free Software Foundation; either version 2.1 of
-* the License, or (at your option) any later version.
-*
-* This software is distributed in the hope that it will be useful,
-* but WITHOUT ANY WARRANTY; without even the implied warranty of
-* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-* Lesser General Public License for more details.
-*
-* You should have received a copy of the GNU Lesser General Public
-* License along with this software; if not, write to the Free
-* Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
-* 02110-1301 USA, or see the FSF site: http://www.fsf.org.
-*/
-package org.jboss.portal.server.request;
-
-import java.util.List;
-import java.util.AbstractList;
-
-/**
- * A request parameter. It implements the list interface to give access to the values of the parameter.
- *
- * @author <a href="mailto:julien at jboss.org">Julien Viet</a>
- * @version $Revision$
- */
-public class RequestParameter extends AbstractList implements List
-{
-
-   /** The parameter name. */
-   private String name;
-
-   /** The parameter values. */
-   private String[] values;
-
-   /** The get threshold. */
-   private int threshold;
-
-   /**
-    * Creates a new parameter.
-    *
-    * @param name the parameter name
-    * @param values the parameter values
-    * @throws IllegalArgumentException when there is a bad argument
-    */
-   private RequestParameter(String name, String[] values, int threshold) throws IllegalArgumentException
-   {
-      if (name == null)
-      {
-         throw new IllegalArgumentException("No null name argument");
-      }
-      if (values == null)
-      {
-         throw new IllegalArgumentException("No null values array argument");
-      }
-      if (values.length < 1)
-      {
-         throw new IllegalArgumentException("No empty values array argument");
-      }
-      for (int i = 0; i < values.length; i++)
-      {
-         if (values[i] == null)
-         {
-            throw new IllegalArgumentException("No null value in the values argument");
-         }
-      }
-      if (threshold < 0 || threshold > values.length)
-      {
-         throw new IllegalArgumentException("Threshold out of bounds " + threshold);
-      }
-      this.name = name;
-      this.values = values;
-      this.threshold = threshold;
-   }
-
-   /**
-    * Return the parameter name.
-    *
-    * @return the parameter name
-    */
-   public String getName()
-   {
-      return name;
-   }
-
-   /**
-    * Return the first value of this parameter.
-    *
-    * @return the first value
-    */
-   public String getValue()
-   {
-      return values[0];
-   }
-
-   /**
-    * Return a value of this parameter
-    *
-    * @param index the value index
-    * @return the value at the specified index
-    * @throws IllegalArgumentException if the index is not valid
-    */
-   public String getValue(int index) throws IllegalArgumentException
-   {
-      if (index < 0 || index >= values.length)
-      {
-         throw new IllegalArgumentException("Bad index value " + index);
-      }
-      return values[index];
-   }
-
-   public boolean isFromQuery()
-   {
-      return threshold > 0;
-   }
-
-   public boolean isFromBody()
-   {
-      return threshold == 0;
-   }
-
-   public boolean isFromQuery(int index) throws IllegalArgumentException
-   {
-      if (index < 0 || index >= values.length)
-      {
-         throw new IllegalArgumentException("Bad index value " + index);
-      }
-      return index < threshold;
-   }
-
-   public boolean isFromBody(int index) throws IllegalArgumentException
-   {
-      if (index < 0 || index >= values.length)
-      {
-         throw new IllegalArgumentException("Bad index value " + index);
-      }
-      return index >= threshold;
-   }
-
-   /**
-    * Return the values of the parameter. The returned array is a clone of the original one
-    * so it can be modified.
-    *
-    * @return the values
-    */
-   public String[] getValues()
-   {
-      return (String[])values.clone();
-   }
-
-   public int getThreshold()
-   {
-      return threshold;
-   }
-
-   public Object get(int index)
-   {
-      return values[index];
-   }
-
-   public int size()
-   {
-      return values.length;
-   }
-
-//   public String toString()
-//   {
-//      StringBuffer buffer = new StringBuffer("Param[");
-//      buffer.append(name);
-//      for (int i = 0; i < values.length; i++)
-//      {
-//         Value value = values[i];
-//         buffer.append(i == 0 ? "=" : ",");
-//         buffer.append("(");
-//         buffer.append(value.get ? "get" : "post");
-//         buffer.append(",");
-//         buffer.append(value.string);
-//         buffer.append(")");
-//      }
-//      buffer.append("]");
-//      return buffer.toString();
-//   }
-
-   public static RequestParameter createQuery(String name, String value) throws IllegalArgumentException
-   {
-      return create(name, new String[]{value}, 1);
-   }
-
-   public static RequestParameter createQuery(String name, String[] values) throws IllegalArgumentException
-   {
-      return create(name, values, values.length);
-   }
-
-   public static RequestParameter createBody(String name, String value) throws IllegalArgumentException
-   {
-      return create(name, new String[]{value}, 0);
-   }
-
-   public static RequestParameter createBody(String name, String[] values) throws IllegalArgumentException
-   {
-      return create(name, values, 0);
-   }
-
-   public static RequestParameter create(String name, String[] queryValues, String[] bodyValues) throws IllegalArgumentException
-   {
-      if (queryValues == null)
-      {
-         throw new IllegalArgumentException("No query values");
-      }
-      if (bodyValues == null)
-      {
-         throw new IllegalArgumentException("No body values");
-      }
-      String[] values = new String[queryValues.length + bodyValues.length];
-      System.arraycopy(queryValues, 0, values, 0, queryValues.length);
-      System.arraycopy(bodyValues, 0, values, queryValues.length, bodyValues.length);
-      return create(name, values, queryValues.length);
-   }
-
-   public static RequestParameter create(String name, String[] values, int threshold) throws IllegalArgumentException
-   {
-      return new RequestParameter(name, values, threshold);
-   }
-}

Modified: trunk/server/src/main/org/jboss/portal/server/servlet/PortalServlet.java
===================================================================
--- trunk/server/src/main/org/jboss/portal/server/servlet/PortalServlet.java	2006-10-08 17:02:14 UTC (rev 5362)
+++ trunk/server/src/main/org/jboss/portal/server/servlet/PortalServlet.java	2006-10-08 23:31:19 UTC (rev 5363)
@@ -37,7 +37,6 @@
 import org.jboss.portal.server.ServerResponse;
 import org.jboss.portal.server.ServerURL;
 import org.jboss.portal.server.impl.ServerInvocationContextImpl;
-import org.jboss.portal.server.request.RequestParameter;
 import org.jboss.portal.server.request.URLContext;
 import org.jboss.portal.server.request.URLFormat;
 
@@ -238,9 +237,64 @@
       //
       URLContext urlContext= parseURLContext(req);
 
+      // ***************
+      // ***************
+      // ***************
+      // ***************
+
+      // Parse the query string to have the get parameters
+      // The resulting map has its parameters decoded from the x-www-form-url encoding
+      Map queryParameterMap = Collections.EMPTY_MAP;
+      String queryString = req.getQueryString();
+      if (queryString != null)
+      {
+         queryParameterMap = parseQueryString(queryString);
+      }
+
       //
-      Map parameterMap = parseParameters(req);
+      Map bodyParameterMap = null;
+      if (isGet == false && PortalConstants.APPLICATION_X_WWW_FORM_URLENCODED.equals(mediaType))
+      {
 
+         //
+         bodyParameterMap = new HashMap();
+         for (Iterator i = req.getParameterMap().entrySet().iterator(); i.hasNext();)
+         {
+            Map.Entry entry = (Map.Entry)i.next();
+
+            // Get param name
+            String paramName = (String)entry.getKey();
+
+            // Values that are aggregated from the query string and the body
+            String[] paramValues = (String[])entry.getValue();
+
+            // Values decoded from the query string
+            String[] queryValues = (String[])queryParameterMap.get(paramName);
+            if (queryValues != null)
+            {
+               int bodyValuesLength = paramValues.length - queryValues.length;
+               if (bodyValuesLength > 0)
+               {
+                  String[] bodyValues = new String[bodyValuesLength];
+                  System.arraycopy(paramValues, queryValues.length, bodyValues, 0, bodyValuesLength);
+                  bodyParameterMap.put(paramName, bodyValues);
+               }
+            }
+            else
+            {
+               bodyParameterMap.put(paramName, paramValues);
+            }
+         }
+
+         // Make the map unmodifiable
+         bodyParameterMap = Collections.unmodifiableMap(bodyParameterMap);
+      }
+
+      // ***************
+      // ***************
+      // ***************
+      // ***************
+
       //
       Server server = getServer();
 
@@ -250,7 +304,8 @@
          resp,
          portalRequestPath,
          portalContextPath,
-         parameterMap,
+         queryParameterMap,
+         bodyParameterMap,
          urlContext,
          mediaType);
 
@@ -460,54 +515,12 @@
       return URLContext.newInstance(req.isSecure(), req.getRemoteUser() != null);
    }
 
-   private Map parseParameters(HttpServletRequest req)
-   {
-      Map parameters = new HashMap(req.getParameterMap());
-
-      // Parse the query string to have the get parameters
-      // The resulting map has its parameters decoded from the x-www-form-url encoding
-      String queryString = req.getQueryString();
-      Map queryMap = Collections.EMPTY_MAP;
-      if (queryString != null)
-      {
-         queryMap = parseQueryString(queryString);
-      }
-
-      //
-      for (Iterator i = parameters.entrySet().iterator(); i.hasNext();)
-      {
-         Map.Entry entry = (Map.Entry)i.next();
-
-         // Get param name
-         String paramName = (String)entry.getKey();
-
-         // Values that are aggregated from the query string and the body
-         String[] paramValues = (String[])entry.getValue();
-
-         // Values decoded from the query string
-         String[] queryValues = (String[])queryMap.get(paramName);
-         if (queryValues == null)
-         {
-            queryValues = new String[0];
-         }
-
-         // Overwrite the values with what we got from the query string
-         System.arraycopy(queryValues, 0, paramValues, 0, queryValues.length);
-
-         // Build the entry
-         RequestParameter param = RequestParameter.create(paramName, paramValues, queryValues.length);
-
-         // And replace it
-         entry.setValue(param);
-      }
-
-      // Make the map unmodifiable
-      return Collections.unmodifiableMap(parameters);
-   }
-
+   /**
+    * Parse the query string and build an unmodifiable parameter map of it.
+    */
    private Map parseQueryString(String queryString)
    {
-      Map result = new HashMap();
+      Map result = Collections.EMPTY_MAP;
       for (StringTokenizer tokenizer = new StringTokenizer(queryString, "&"); tokenizer.hasMoreTokens();)
       {
          String token = tokenizer.nextToken();
@@ -535,6 +548,12 @@
                values = tmp;
             }
             values[values.length - 1] = value;
+
+            // Replace the empty map if necessary with a real hashmap
+            if (result.isEmpty())
+            {
+               result = new HashMap();
+            }
             result.put(name, values);
          }
          else
@@ -544,6 +563,6 @@
             // 0 means we have an empty name
          }
       }
-      return result;
+      return result.isEmpty() ? result : Collections.unmodifiableMap(result);
    }
 }

Modified: trunk/server/src/main/org/jboss/portal/test/server/parameters/GetTest.java
===================================================================
--- trunk/server/src/main/org/jboss/portal/test/server/parameters/GetTest.java	2006-10-08 17:02:14 UTC (rev 5362)
+++ trunk/server/src/main/org/jboss/portal/test/server/parameters/GetTest.java	2006-10-08 23:31:19 UTC (rev 5363)
@@ -24,13 +24,14 @@
 import org.jboss.portal.server.AbstractServerURL;
 import org.jboss.portal.server.ServerInvocation;
 import org.jboss.portal.server.ServerInvocationContext;
-import org.jboss.portal.server.request.RequestParameter;
 import org.jboss.portal.test.framework.container.TestCaseContext;
 import org.jboss.portal.test.framework.container.result.AssertResult;
 import org.jboss.portal.test.framework.container.result.InvokeGetResult;
 import org.jboss.portal.test.framework.container.result.Result;
 import org.jboss.portal.test.server.AbstractTest;
 
+import java.util.Map;
+
 /**
  * @author <a href="mailto:julien at jboss.org">Julien Viet</a>
  * @version $Revision$
@@ -58,39 +59,26 @@
             public void run() throws Exception
             {
                ServerInvocationContext context = invocation.getServerContext();
-               RequestParameter a = (RequestParameter)context.getParameterMap().get("a");
+               Map queryParameterMap = context.getQueryParameterMap();
+               Map bodyParameterMap = context.getBodyParameterMap();
+
+               //
+               assertNotNull(queryParameterMap);
+               assertNull(bodyParameterMap);
+
+               String[] a = (String[])queryParameterMap.get("a");
                assertNotNull(a);
-               assertEquals("a", a.getName());
-               assertEquals(1, a.size());
-               assertEquals("b", a.getValue());
-               assertTrue(a.isFromQuery());
-               assertEquals("b", a.getValue(0));
-               assertTrue(a.isFromQuery(0));
-               assertEquals(1, a.getThreshold());
+               assertEquals(new String[]{"b"}, a);
 
                //
-               RequestParameter c = (RequestParameter)context.getParameterMap().get("c");
+               String[] c = (String[])queryParameterMap.get("c");
                assertNotNull(c);
-               assertEquals("c", c.getName());
-               assertEquals(2, c.size());
-               assertEquals("d", c.getValue());
-               assertTrue(c.isFromQuery());
-               assertEquals("d", c.getValue(0));
-               assertTrue(c.isFromQuery(0));
-               assertEquals("e", c.getValue(1));
-               assertTrue(c.isFromQuery(1));
-               assertEquals(2, c.getThreshold());
+               assertEquals(new String[]{"d","e"}, c);
 
                //
-               RequestParameter f = (RequestParameter)context.getParameterMap().get("encoding");
+               String[] f = (String[])queryParameterMap.get("encoding");
                assertNotNull(f);
-               assertEquals("encoding", f.getName());
-               assertEquals(1, f.size());
-               assertEquals(Utils.RANGE_0_255, f.getValue());
-               assertTrue(f.isFromQuery());
-               assertEquals(Utils.RANGE_0_255, f.getValue(0));
-               assertTrue(f.isFromQuery(0));
-               assertEquals(1, f.getThreshold());
+               assertEquals(new String[]{Utils.RANGE_0_255}, f);
             }
          });
          return assertResult;

Modified: trunk/server/src/main/org/jboss/portal/test/server/parameters/PostApplicationXWWWFormURLEncodedTest.java
===================================================================
--- trunk/server/src/main/org/jboss/portal/test/server/parameters/PostApplicationXWWWFormURLEncodedTest.java	2006-10-08 17:02:14 UTC (rev 5362)
+++ trunk/server/src/main/org/jboss/portal/test/server/parameters/PostApplicationXWWWFormURLEncodedTest.java	2006-10-08 23:31:19 UTC (rev 5363)
@@ -24,13 +24,14 @@
 import org.jboss.portal.server.AbstractServerURL;
 import org.jboss.portal.server.ServerInvocation;
 import org.jboss.portal.server.ServerInvocationContext;
-import org.jboss.portal.server.request.RequestParameter;
 import org.jboss.portal.test.framework.container.TestCaseContext;
 import org.jboss.portal.test.framework.container.result.AssertResult;
 import org.jboss.portal.test.framework.container.result.InvokePostResult;
 import org.jboss.portal.test.framework.container.result.Result;
 import org.jboss.portal.test.server.AbstractTest;
 
+import java.util.Map;
+
 /**
  * @author <a href="mailto:julien at jboss.org">Julien Viet</a>
  * @version $Revision$
@@ -79,106 +80,72 @@
             public void run() throws Exception
             {
                ServerInvocationContext context = invocation.getServerContext();
-               RequestParameter a = (RequestParameter)context.getParameterMap().get("a");
-               assertNotNull(a);
-               assertEquals("a", a.getName());
-               assertEquals(1, a.size());
-               assertEquals("b", a.getValue());
-               assertTrue(a.isFromQuery());
-               assertEquals("b", a.getValue(0));
-               assertTrue(a.isFromQuery(0));
-               assertEquals(1, a.getThreshold());
+               Map queryParameterMap = context.getQueryParameterMap();
+               Map bodyParameterMap = context.getBodyParameterMap();
 
                //
-               RequestParameter c = (RequestParameter)context.getParameterMap().get("c");
-               assertNotNull(c);
-               assertEquals("c", c.getName());
-               assertEquals(2, c.size());
-               assertEquals("d", c.getValue());
-               assertTrue(c.isFromQuery());
-               assertEquals("d", c.getValue(0));
-               assertTrue(c.isFromQuery(0));
-               assertEquals("e", c.getValue(1));
-               assertTrue(c.isFromQuery(1));
-               assertEquals(2, c.getThreshold());
+               assertNotNull(queryParameterMap);
+               assertNotNull(bodyParameterMap);
 
                //
-               RequestParameter f = (RequestParameter)context.getParameterMap().get("f");
-               assertNotNull(f);
-               assertEquals("f", f.getName());
-               assertEquals(2, f.size());
-               assertEquals("g", f.getValue());
-               assertTrue(f.isFromQuery());
-               assertEquals("g", f.getValue(0));
-               assertTrue(f.isFromQuery(0));
-               assertEquals("_g", f.getValue(1));
-               assertFalse(f.isFromQuery(1));
-               assertEquals(1, f.getThreshold());
+               String[] qa = (String[])queryParameterMap.get("a");
+               String[] ba = (String[])bodyParameterMap.get("a");
+               assertNotNull(qa);
+               assertNull(ba);
+               assertEquals(new String[]{"b"}, qa);
 
                //
-               RequestParameter h = (RequestParameter)context.getParameterMap().get("h");
-               assertNotNull(h);
-               assertEquals("h", h.getName());
-               assertEquals(4, h.size());
-               assertEquals("i", h.getValue());
-               assertTrue(h.isFromQuery());
-               assertEquals("i", h.getValue(0));
-               assertTrue(h.isFromQuery(0));
-               assertEquals("j", h.getValue(1));
-               assertTrue(h.isFromQuery(1));
-               assertEquals("_i", h.getValue(2));
-               assertFalse(h.isFromQuery(2));
-               assertEquals("_j", h.getValue(3));
-               assertFalse(h.isFromQuery(3));
-               assertEquals(2, h.getThreshold());
+               String[] qc = (String[])queryParameterMap.get("c");
+               String[] bc = (String[])bodyParameterMap.get("c");
+               assertNotNull(qc);
+               assertNull(bc);
+               assertEquals(new String[]{"d","e"}, qc);
 
                //
-               RequestParameter encoding1 = (RequestParameter)context.getParameterMap().get("encoding_1");
-               assertNotNull(encoding1);
-               assertEquals("encoding_1", encoding1.getName());
-               assertEquals(2, encoding1.size());
-               assertEquals(Utils.RANGE_0_255, encoding1.getValue());
-               assertTrue(encoding1.isFromQuery());
-               assertEquals(Utils.RANGE_0_255, encoding1.getValue(0));
-               assertTrue(encoding1.isFromQuery(0));
-               assertEquals(null, Utils.compareString(Utils.RANGE_0_255, encoding1.getValue(1)));
-               assertTrue(encoding1.isFromBody(1));
+               String[] qf = (String[])queryParameterMap.get("f");
+               String[] bf = (String[])bodyParameterMap.get("f");
+               assertNotNull(qf);
+               assertNotNull(bf);
+               assertEquals(new String[]{"g"}, qf);
+               assertEquals(new String[]{"_g"}, bf);
 
                //
-               RequestParameter encoding2 = (RequestParameter)context.getParameterMap().get("encoding_2");
-               assertNotNull(encoding2);
-               assertEquals("encoding_2", encoding2.getName());
-               assertEquals(2, encoding2.size());
-               assertEquals(Utils.RANGE_256_512, encoding2.getValue());
-               assertTrue(encoding2.isFromQuery());
-               assertEquals(Utils.RANGE_256_512, encoding2.getValue(0));
-               assertTrue(encoding2.isFromQuery(0));
-               assertEquals(Utils.RANGE_256_512, encoding2.getValue(1));
-               assertTrue(encoding2.isFromBody(1));
+               String[] qh = (String[])queryParameterMap.get("h");
+               String[] bh = (String[])bodyParameterMap.get("h");
+               assertNotNull(qh);
+               assertNotNull(bh);
+               assertEquals(new String[]{"i","j"}, qh);
+               assertEquals(new String[]{"_i","_j"}, bh);
 
                //
-               RequestParameter k = (RequestParameter)context.getParameterMap().get("k");
-               assertNotNull(k);
-               assertEquals("k", k.getName());
-               assertEquals(1, k.size());
-               assertEquals("l", k.getValue());
-               assertFalse(k.isFromQuery());
-               assertEquals("l", k.getValue(0));
-               assertFalse(k.isFromQuery(0));
-               assertEquals(0, k.getThreshold());
+               String[] qencoding1 = (String[])queryParameterMap.get("encoding_1");
+               String[] bencoding1 = (String[])bodyParameterMap.get("encoding_1");
+               assertNotNull(qencoding1);
+               assertNotNull(bencoding1);
+               assertEquals(new String[]{Utils.RANGE_0_255}, qencoding1);
+               assertEquals(new String[]{Utils.RANGE_0_255}, bencoding1);
 
                //
-               RequestParameter m = (RequestParameter)context.getParameterMap().get("m");
-               assertNotNull(m);
-               assertEquals("m", m.getName());
-               assertEquals(2, m.size());
-               assertEquals("n", m.getValue());
-               assertFalse(m.isFromQuery());
-               assertEquals("n", m.getValue(0));
-               assertFalse(m.isFromQuery(0));
-               assertEquals("o", m.getValue(1));
-               assertFalse(m.isFromQuery(1));
-               assertEquals(0, m.getThreshold());
+               String[] qencoding2 = (String[])queryParameterMap.get("encoding_2");
+               String[] bencoding2 = (String[])bodyParameterMap.get("encoding_2");
+               assertNotNull(qencoding2);
+               assertNotNull(bencoding2);
+               assertEquals(new String[]{Utils.RANGE_256_512}, qencoding2);
+               assertEquals(new String[]{Utils.RANGE_256_512}, bencoding2);
+
+               //
+               String[] qk = (String[])queryParameterMap.get("k");
+               String[] bk = (String[])bodyParameterMap.get("k");
+               assertNull(qk);
+               assertNotNull(bk);
+               assertEquals(new String[]{"l"}, bk);
+
+               //
+               String[] qm = (String[])queryParameterMap.get("m");
+               String[] bm = (String[])bodyParameterMap.get("m");
+               assertNull(qm);
+               assertNotNull(bm);
+               assertEquals(new String[]{"n","o"}, bm);
             }
          });
          return assertResult;

Modified: trunk/server/src/main/org/jboss/portal/test/server/parameters/PostMultipartFormDataTest.java
===================================================================
--- trunk/server/src/main/org/jboss/portal/test/server/parameters/PostMultipartFormDataTest.java	2006-10-08 17:02:14 UTC (rev 5362)
+++ trunk/server/src/main/org/jboss/portal/test/server/parameters/PostMultipartFormDataTest.java	2006-10-08 23:31:19 UTC (rev 5363)
@@ -24,13 +24,14 @@
 import org.jboss.portal.server.AbstractServerURL;
 import org.jboss.portal.server.ServerInvocation;
 import org.jboss.portal.server.ServerInvocationContext;
-import org.jboss.portal.server.request.RequestParameter;
 import org.jboss.portal.test.framework.container.TestCaseContext;
 import org.jboss.portal.test.framework.container.result.AssertResult;
 import org.jboss.portal.test.framework.container.result.InvokePostResult;
 import org.jboss.portal.test.framework.container.result.Result;
 import org.jboss.portal.test.server.AbstractTest;
 
+import java.util.Map;
+
 /**
  * @author <a href="mailto:julien at jboss.org">Julien Viet</a>
  * @version $Revision$
@@ -70,28 +71,21 @@
             public void run() throws Exception
             {
                ServerInvocationContext context = invocation.getServerContext();
-               RequestParameter a = (RequestParameter)context.getParameterMap().get("a");
+               Map queryParameterMap = context.getQueryParameterMap();
+               Map bodyParameterMap = context.getBodyParameterMap();
+
+               //
+               assertNotNull(queryParameterMap);
+               assertNull(bodyParameterMap);
+
+               String[] a = (String[])queryParameterMap.get("a");
                assertNotNull(a);
-               assertEquals("a", a.getName());
-               assertEquals(1, a.size());
-               assertEquals("b", a.getValue());
-               assertTrue(a.isFromQuery());
-               assertEquals("b", a.getValue(0));
-               assertTrue(a.isFromQuery(0));
-               assertEquals(1, a.getThreshold());
+               assertEquals(new String[]{"b"}, a);
 
                //
-               RequestParameter c = (RequestParameter)context.getParameterMap().get("c");
+               String[] c = (String[])queryParameterMap.get("c");
                assertNotNull(c);
-               assertEquals("c", c.getName());
-               assertEquals(2, c.size());
-               assertEquals("d", c.getValue());
-               assertTrue(c.isFromQuery());
-               assertEquals("d", c.getValue(0));
-               assertTrue(c.isFromQuery(0));
-               assertEquals("e", c.getValue(1));
-               assertTrue(c.isFromQuery(1));
-               assertEquals(2, c.getThreshold());
+               assertEquals(new String[]{"d","e"}, c);
             }
          });
          return assertResult;

Modified: trunk/theme/src/main/org/jboss/portal/theme/servlet/DynaAjaxServlet.java
===================================================================
--- trunk/theme/src/main/org/jboss/portal/theme/servlet/DynaAjaxServlet.java	2006-10-08 17:02:14 UTC (rev 5362)
+++ trunk/theme/src/main/org/jboss/portal/theme/servlet/DynaAjaxServlet.java	2006-10-08 23:31:19 UTC (rev 5363)
@@ -66,7 +66,7 @@
       sendResp(resp, response);
 
 /*
-      if(req.getParameter("action") != null)
+         if(req.getParameter("action") != null)
       {
          if(req.getParameter("action").equals(PERSIST))
          {




More information about the jboss-svn-commits mailing list