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