]> source.dussan.org Git - vaadin-framework.git/commitdiff
#4010 Handle empty strings (and empty/null arrays) correctly in String[] variables...
authorHenri Sara <henri.sara@itmill.com>
Mon, 25 Jan 2010 12:29:33 +0000 (12:29 +0000)
committerHenri Sara <henri.sara@itmill.com>
Mon, 25 Jan 2010 12:29:33 +0000 (12:29 +0000)
svn changeset:10986/svn branch:6.2

src/com/vaadin/terminal/gwt/client/ApplicationConnection.java
src/com/vaadin/terminal/gwt/server/AbstractCommunicationManager.java

index 3b983e1d8659a6998c5a66d6f9fa663a3f8a8a3c..1c3128dbdfe5bea69c9a80c312eceb8094b79fb8 100755 (executable)
@@ -1345,10 +1345,11 @@ public class ApplicationConnection {
         final StringBuffer buf = new StringBuffer();
         if (values != null) {
             for (int i = 0; i < values.length; i++) {
-                if (i > 0) {
-                    buf.append(VAR_ARRAYITEM_SEPARATOR);
-                }
                 buf.append(values[i]);
+                // there will be an extra separator at the end to differentiate
+                // between an empty array and one containing an empty string
+                // only
+                buf.append(VAR_ARRAYITEM_SEPARATOR);
             }
         }
         addVariableToQueue(paintableId, variableName, buf.toString(),
index 117d0bce7e051574e288caf9ddb5200166e59018..de2ea174e06e84137d3392bc1412377db2b33e67 100644 (file)
@@ -33,6 +33,7 @@ import java.util.List;
 import java.util.Locale;
 import java.util.Map;
 import java.util.Set;
+import java.util.StringTokenizer;
 
 import javax.portlet.PortletRequest;
 import javax.portlet.PortletResponse;
@@ -1211,7 +1212,7 @@ public abstract class AbstractCommunicationManager implements
             val = convertMap(strValue);
             break;
         case VTYPE_STRINGARRAY:
-            val = strValue.split(VAR_ARRAYITEM_SEPARATOR);
+            val = convertStringArray(strValue);
             break;
         case VTYPE_STRING:
             val = strValue;
@@ -1253,6 +1254,26 @@ public abstract class AbstractCommunicationManager implements
         return map;
     }
 
+    private String[] convertStringArray(String strValue) {
+        // need to return delimiters and filter them out; otherwise empty
+        // strings are lost
+        // an extra empty delimiter at the end is automatically eliminated
+        StringTokenizer tokenizer = new StringTokenizer(strValue,
+                VAR_ARRAYITEM_SEPARATOR, true);
+        List<String> tokens = new ArrayList<String>();
+        String prevToken = VAR_ARRAYITEM_SEPARATOR;
+        while (tokenizer.hasMoreTokens()) {
+            String token = tokenizer.nextToken();
+            if (!VAR_ARRAYITEM_SEPARATOR.equals(token)) {
+                tokens.add(token);
+            } else if (VAR_ARRAYITEM_SEPARATOR.equals(prevToken)) {
+                tokens.add("");
+            }
+            prevToken = token;
+        }
+        return tokens.toArray(new String[tokens.size()]);
+    }
+
     private Object convertArray(String strValue) {
         String[] val = strValue.split(VAR_ARRAYITEM_SEPARATOR);
         if (val.length == 0 || (val.length == 1 && val[0].length() == 0)) {