You are viewing a plain text version of this content. The canonical link for it is here.
Posted to jetspeed-dev@portals.apache.org by at...@apache.org on 2009/04/16 11:31:09 UTC
svn commit: r765536 -
/portals/jetspeed-2/portal/trunk/components/jetspeed-portal/src/main/java/org/apache/jetspeed/container/state/impl/JetspeedNavigationalStateCodec.java
Author: ate
Date: Thu Apr 16 09:31:08 2009
New Revision: 765536
URL: http://svn.apache.org/viewvc?rev=765536&view=rev
Log:
Implementation for JS2-968: Enhance NavigationalState encoding to support both zero and empty parameter values
See: http://issues.apache.org/jira/browse/JS2-968
Modified:
portals/jetspeed-2/portal/trunk/components/jetspeed-portal/src/main/java/org/apache/jetspeed/container/state/impl/JetspeedNavigationalStateCodec.java
Modified: portals/jetspeed-2/portal/trunk/components/jetspeed-portal/src/main/java/org/apache/jetspeed/container/state/impl/JetspeedNavigationalStateCodec.java
URL: http://svn.apache.org/viewvc/portals/jetspeed-2/portal/trunk/components/jetspeed-portal/src/main/java/org/apache/jetspeed/container/state/impl/JetspeedNavigationalStateCodec.java?rev=765536&r1=765535&r2=765536&view=diff
==============================================================================
--- portals/jetspeed-2/portal/trunk/components/jetspeed-portal/src/main/java/org/apache/jetspeed/container/state/impl/JetspeedNavigationalStateCodec.java (original)
+++ portals/jetspeed-2/portal/trunk/components/jetspeed-portal/src/main/java/org/apache/jetspeed/container/state/impl/JetspeedNavigationalStateCodec.java Thu Apr 16 09:31:08 2009
@@ -45,6 +45,7 @@
protected static final char PARAMETER_SEPARATOR = '|';
protected static final char PARAMETER_ELEMENT_SEPARATOR = '=';
+ protected static final char PARAMETER_SEPARATOR_ESCAPE = '\\';
protected static final char RENDER_WINDOW_ID_KEY = 'a';
protected static final char ACTION_WINDOW_ID_KEY = 'b';
protected static final char MODE_KEY = 'c';
@@ -105,10 +106,11 @@
// decode arguments and parameters into states
int position = 0;
+ int length = decodedParameters.length();
StringBuffer buffer = new StringBuffer();
PortletWindowRequestNavigationalState currentState = null;
String parameter;
- while ( (position = decodeArgument(position, decodedParameters, buffer, PARAMETER_SEPARATOR )) != -1 )
+ while ( (position = decodeArgument(position, length, decodedParameters, buffer, PARAMETER_SEPARATOR )) != -1 && buffer.length() > 0)
{
parameter = buffer.toString();
currentState = decodeParameter( states, currentState, parameter);
@@ -667,10 +669,11 @@
protected boolean decodeParamsParameter(String parameter, String [] parameterName, String [][] parameterValues)
{
int position = 1;
+ int length = parameter.length();
StringBuffer buffer = new StringBuffer();
int parameterValueCount = -1;
int parameterValueIndex = -1;
- while ( (position = decodeArgument(position, parameter, buffer, PARAMETER_ELEMENT_SEPARATOR)) != -1 )
+ while ( (position = decodeArgument(position, length, parameter, buffer, PARAMETER_ELEMENT_SEPARATOR)) != -1 )
{
if ( parameterName[0] == null )
{
@@ -680,8 +683,20 @@
else if ( parameterValueCount == -1 )
{
parameterValueCount = Integer.parseInt(buffer.toString(), 16);
- parameterValues[0] = new String[parameterValueCount];
- parameterValueIndex = 0;
+ if (parameterValueCount < 0)
+ {
+ return false;
+ }
+ else if (parameterValueCount == 0)
+ {
+ parameterValues[0] = null;
+ return true;
+ }
+ else
+ {
+ parameterValues[0] = new String[parameterValueCount];
+ parameterValueIndex = 0;
+ }
}
else
{
@@ -787,7 +802,7 @@
return value.replace('/','-').replace('=','_');
}
- protected String encodeArgument( String argument, char escape )
+ protected String encodeArgument( String argument, char terminator )
{
int length = argument.length();
StringBuffer buffer = new StringBuffer(length);
@@ -796,8 +811,12 @@
for ( int i = 0; i < length; i++ )
{
c = argument.charAt(i);
+ if (c == terminator)
+ {
+ buffer.append(PARAMETER_SEPARATOR_ESCAPE);
+ }
buffer.append(c);
- if ( c == escape )
+ if ( c == PARAMETER_SEPARATOR_ESCAPE )
{
buffer.append(c);
}
@@ -805,32 +824,39 @@
return buffer.toString();
}
- protected int decodeArgument(int position, String arguments, StringBuffer buffer, char escape)
+ protected int decodeArgument(int position, int maxLength, String arguments, StringBuffer buffer, char terminator)
{
- int maxLength = arguments.length();
buffer.setLength(0);
+ if (position > maxLength)
+ {
+ return -1;
+ }
char c;
for ( ; position < maxLength; position++ )
{
c = arguments.charAt(position);
- if ( c != escape )
+ if (c == terminator)
+ {
+ position++;
+ break;
+ }
+ else if ( c != PARAMETER_SEPARATOR_ESCAPE )
{
buffer.append(c);
}
else
{
- if ( c == escape && position < maxLength-1 && arguments.charAt(position+1) == escape )
+ position++;
+ if ( position < maxLength )
{
- buffer.append(c);
- position++;
+ buffer.append(arguments.charAt(position));
}
else
{
- position++;
break;
}
}
}
- return buffer.length() > 0 ? position : -1;
+ return position;
}
}
---------------------------------------------------------------------
To unsubscribe, e-mail: jetspeed-dev-unsubscribe@portals.apache.org
For additional commands, e-mail: jetspeed-dev-help@portals.apache.org