Author: ate
Date: Sat Feb 24 12:28:38 2007
New Revision: 511335
URL: http://svn.apache.org/viewvc?view=rev&rev=511335
Log:
Final solution for JS2-605 (and the "real" solution for 3 year old JS2-9 which
we thought was fixed as well)
See: https://issues.apache.org/jira/browse/JS2-605#action_12475649
Modified:
portals/jetspeed-2/trunk/components/portal/src/java/org/apache/jetspeed/engine/servlet/ServletRequestImpl.java
Modified:
portals/jetspeed-2/trunk/components/portal/src/java/org/apache/jetspeed/engine/servlet/ServletRequestImpl.java
URL:
http://svn.apache.org/viewvc/portals/jetspeed-2/trunk/components/portal/src/java/org/apache/jetspeed/engine/servlet/ServletRequestImpl.java?view=diff&rev=511335&r1=511334&r2=511335
==============================================================================
---
portals/jetspeed-2/trunk/components/portal/src/java/org/apache/jetspeed/engine/servlet/ServletRequestImpl.java
(original)
+++
portals/jetspeed-2/trunk/components/portal/src/java/org/apache/jetspeed/engine/servlet/ServletRequestImpl.java
Sat Feb 24 12:28:38 2007
@@ -23,6 +23,7 @@
import java.util.Collections;
import java.util.Enumeration;
import java.util.HashMap;
+import java.util.HashSet;
import java.util.Iterator;
import java.util.Locale;
import java.util.Map;
@@ -48,7 +49,6 @@
import org.apache.jetspeed.request.RequestContext;
import org.apache.jetspeed.aggregator.Worker;
import org.apache.jetspeed.aggregator.CurrentWorkerContext;
-import org.apache.pluto.om.common.ObjectID;
import org.apache.pluto.om.entity.PortletApplicationEntity;
import org.apache.pluto.om.entity.PortletEntity;
import org.apache.pluto.om.portlet.PortletApplicationDefinition;
@@ -73,7 +73,6 @@
private ServletRequest currentRequest = null;
private Map portletParameters;
- private ObjectID webAppId;
private boolean included;
@@ -82,6 +81,8 @@
private boolean portletMergePortalParametersWithPortletParameters;
private boolean portletMergePortalParametersBeforePortletParameters;
+
+ private Map portalParameters;
public ServletRequestImpl( HttpServletRequest servletRequest,
PortletWindow window )
{
@@ -90,6 +91,40 @@
org.apache.pluto.util.NamespaceMapper.class)).getJetspeedNamespaceMapper();
this.portletWindow = window;
+
+ String encoding = (String)
servletRequest.getAttribute(PortalReservedParameters.PREFERED_CHARACTERENCODING_ATTRIBUTE);
+ boolean decode =
servletRequest.getAttribute(PortalReservedParameters.PARAMETER_ALREADY_DECODED_ATTRIBUTE)
== null
+ && encoding != null;
+ if (decode)
+ {
+
servletRequest.setAttribute(PortalReservedParameters.PARAMETER_ALREADY_DECODED_ATTRIBUTE,
+ new Boolean(true));
+ }
+
+ //get portal servlet params
+ portalParameters = new HashMap();
+ for (Enumeration parameters = servletRequest.getParameterNames();
parameters.hasMoreElements();)
+ {
+ String paramName = (String) parameters.nextElement();
+ String[] paramValues = (String[])
servletRequest.getParameterValues(paramName);
+
+ if (decode)
+ {
+ for (int i = 0; i < paramValues.length; i++)
+ {
+ try
+ {
+ paramValues[i] = new
String(paramValues[i].getBytes("ISO-8859-1"), encoding);
+ }
+ catch (UnsupportedEncodingException e)
+ {
+ ;
+ }
+ }
+ }
+ portalParameters.put(paramName, paramValues);
+ }
+
if (mergePortalParametersWithPortletParameters == null )
{
mergePortalParametersWithPortletParameters =
@@ -102,7 +137,6 @@
PortletDefinitionComposite portletDef =
(PortletDefinitionComposite)portletWindow.getPortletEntity().getPortletDefinition();
if(portletDef != null)
{
- webAppId =
portletDef.getPortletApplicationDefinition().getWebApplicationDefinition().getId();
GenericMetadata metaData = portletDef.getMetadata();
portletMergePortalParametersWithPortletParameters =
@@ -120,7 +154,6 @@
else
{
// This happens when an entity is referencing a non-existent
portlet
- webAppId = window.getId();
portletMergePortalParametersWithPortletParameters =
mergePortalParametersWithPortletParameters.booleanValue();
portletMergePortalParametersBeforePortletParameters =
mergePortalParametersBeforePortletParameters.booleanValue();
}
@@ -183,12 +216,40 @@
// this one (the getRequest() object).
// So, when that one has changed since the last time the
parameters have
// been accessed, flush the cache and rebuild the map.
- currentRequest = getRequest();
- portletParameters = new HashMap();
+ currentRequest = getRequest();
boolean actionRequest = false;
- // get portlet params
+ // determine the possible additional query string parameters
provided on the RequestDispatcher include path
+ // per the specs, these are prepended to existing parameters or
altogether new parameters
+ // as we save the original "portal" parameters, we can find those
query string parameters by comparing against those
+ HashMap queryParameters = new HashMap();
+ for ( Iterator iter =
getRequest().getParameterMap().entrySet().iterator(); iter.hasNext(); )
+ {
+ Map.Entry entry = (Map.Entry)iter.next();
+ String[] values = (String[])entry.getValue();
+ String[] original =
(String[])portalParameters.get(entry.getKey());
+ String[] diff = null;
+ if ( original == null )
+ {
+ // a new parameter
+ diff = new String[values.length];
+ System.arraycopy(values,0,diff,0,values.length);
+ }
+ else if ( values.length > original.length )
+ {
+ // we've got some additional query string parameter
value(s)
+ diff = new String[values.length - original.length];
+
System.arraycopy(values,0,diff,0,values.length-original.length);
+ }
+ if ( diff != null )
+ {
+ queryParameters.put(entry.getKey(), diff);
+ }
+ }
+
+ // get portlet navigational params
+ HashMap navParameters = new HashMap();
JetspeedRequestContext context = (JetspeedRequestContext)
getAttribute("org.apache.jetspeed.request.RequestContext");
if (context != null)
{
@@ -199,60 +260,92 @@
{
String name = (String) iter.next();
String[] values =
url.getNavigationalState().getParameterValues(portletWindow, name);
- portletParameters.put(name, values);
-
+ navParameters.put(name, values);
}
}
- if ( actionRequest ||
portletMergePortalParametersWithPortletParameters )
+ // now first merge the keys we have into one unique set
+ HashSet keys = new HashSet();
+ keys.addAll(portalParameters.keySet());
+ keys.addAll(queryParameters.keySet());
+ keys.addAll(navParameters.keySet());
+
+ // now "merge" the parameters
+ // there are three different options:
+ // 1) query parameters + nav parameters:
+ // portletMergePortalParametersWithPortletParameters ==
false && !actionRequest
+ // 2) query parameters + nav parameters + portal parameters
+ // portletMergePortalParametersWithPortletParameters ==
true || actionRequest
+ // && portletMergePortalParametersBeforePortletParameters
== false
+ // 3) query parameters + portal parameters + nav parameters (odd
use-case but provided because this was the "old" pre-2.1 behavior
+ // portletMergePortalParametersWithPortletParameters ==
true || actionRequest
+ // && portletMergePortalParametersBeforePortletParameters
== true
+ portletParameters = new HashMap();
+ for ( Iterator iter = keys.iterator(); iter.hasNext(); )
{
- String encoding = (String)
getRequest().getAttribute(PortalReservedParameters.PREFERED_CHARACTERENCODING_ATTRIBUTE);
- boolean decode =
getRequest().getAttribute(PortalReservedParameters.PARAMETER_ALREADY_DECODED_ATTRIBUTE)
== null
- && encoding != null;
- if (decode)
- {
-
getRequest().setAttribute(PortalReservedParameters.PARAMETER_ALREADY_DECODED_ATTRIBUTE,
- new Boolean(true));
- }
-
- //get servlet params
- for (Enumeration parameters =
getRequest().getParameterNames(); parameters.hasMoreElements();)
- {
- String paramName = (String) parameters.nextElement();
- String[] paramValues = (String[])
getRequest().getParameterValues(paramName);
- String[] values = (String[])
portletParameters.get(paramName);
-
- if (decode)
- {
- for (int i = 0; i < paramValues.length; i++)
- {
- try
- {
- paramValues[i] = new
String(paramValues[i].getBytes("ISO-8859-1"), encoding);
- }
- catch (UnsupportedEncodingException e)
- {
- ;
- }
- }
- }
-
- if (values != null)
- {
- String[] temp = new String[paramValues.length +
values.length];
- if ( actionRequest ||
portletMergePortalParametersBeforePortletParameters )
- {
- System.arraycopy(paramValues, 0, temp, 0,
paramValues.length);
- System.arraycopy(values, 0, temp,
paramValues.length, values.length);
- }
- else
- {
- System.arraycopy(values, 0, temp, 0,
values.length);
- System.arraycopy(paramValues, 0, temp,
values.length, paramValues.length);
- }
- paramValues = temp;
+ String key = (String)iter.next();
+ String[] first = (String[])queryParameters.get(key);
+ String[] next = null, last = null, result = null;
+
+ if ( portletMergePortalParametersWithPortletParameters ==
false && !actionRequest )
+ {
+ next = (String[])navParameters.get(key);
+ }
+ else if ( portletMergePortalParametersBeforePortletParameters )
+ {
+ next = (String[])portalParameters.get(key);
+ last = (String[])navParameters.get(key);
+ }
+ else
+ {
+ next = (String[])navParameters.get(key);
+ last = (String[])portalParameters.get(key);
+ }
+ if ( first == null )
+ {
+ if ( next == null )
+ {
+ first = last;
+ last = null;
+ }
+ else
+ {
+ first = next;
+ next = last;
+ last = null;
}
- portletParameters.put(paramName, paramValues);
+ }
+ else if ( next == null )
+ {
+ next = last;
+ last = null;
+ }
+
+ if ( last == null )
+ {
+ if ( next == null && first != null )
+ {
+ result = new String[first.length];
+ System.arraycopy(first,0,result,0,first.length);
+ }
+ else if (next != null )
+ {
+ result = new String[first.length + next.length];
+ System.arraycopy(first,0,result,0,first.length);
+
System.arraycopy(next,0,result,first.length,next.length);
+ }
+ }
+ else
+ {
+ result = new String[first.length + next.length +
last.length];
+ System.arraycopy(first,0,result,0,first.length);
+ System.arraycopy(next,0,result,first.length,next.length);
+
System.arraycopy(last,0,result,first.length+next.length,last.length);
+
+ }
+ if ( result != null )
+ {
+ portletParameters.put(key, result);
}
}
}
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]