Author: rombert
Date: Tue Sep 29 13:02:33 2015
New Revision: 1705853

URL: http://svn.apache.org/viewvc?rev=1705853&view=rev
Log:
SLING-4577 - Content sync does not support escaping comma values in
multi-valued properties 

Fix and unit tests

Added:
    
sling/trunk/tooling/ide/impl-vlt-test/src/test/resources/org/apache/sling/ide/impl/vlt/serialization/escaped-comma-in-multi-valued-property.xml
Modified:
    
sling/trunk/tooling/ide/impl-vlt-test/src/test/java/org/apache/sling/ide/impl/vlt/serialization/ContentXmlHandlerTest.java
    
sling/trunk/tooling/ide/impl-vlt/src/org/apache/sling/ide/impl/vlt/serialization/ContentXmlHandler.java

Modified: 
sling/trunk/tooling/ide/impl-vlt-test/src/test/java/org/apache/sling/ide/impl/vlt/serialization/ContentXmlHandlerTest.java
URL: 
http://svn.apache.org/viewvc/sling/trunk/tooling/ide/impl-vlt-test/src/test/java/org/apache/sling/ide/impl/vlt/serialization/ContentXmlHandlerTest.java?rev=1705853&r1=1705852&r2=1705853&view=diff
==============================================================================
--- 
sling/trunk/tooling/ide/impl-vlt-test/src/test/java/org/apache/sling/ide/impl/vlt/serialization/ContentXmlHandlerTest.java
 (original)
+++ 
sling/trunk/tooling/ide/impl-vlt-test/src/test/java/org/apache/sling/ide/impl/vlt/serialization/ContentXmlHandlerTest.java
 Tue Sep 29 13:02:33 2015
@@ -188,6 +188,14 @@ public class ContentXmlHandlerTest {
                         (Object) "{0,date,dd.MM.yyyy HH:mm:ss.SSS} *{4}* [{2}] 
{3} {5}"));
     }
 
+    @Test
+    public void escapedCommaInMultiValuedProperty() throws Exception {
+        
+        ResourceProxy root = 
parseContentXmlFile("escaped-comma-in-multi-valued-property.xml", "/");
+        assertThat("properties[someProp]", (String[]) 
root.getProperties().get("someProp"),
+                Matchers.is(new String[] { "first,first", "second" }));
+    }
+
     private static Matcher<Calendar> millis(long millis) {
 
         return new CalendarTimeInMillisMatcher(millis);

Added: 
sling/trunk/tooling/ide/impl-vlt-test/src/test/resources/org/apache/sling/ide/impl/vlt/serialization/escaped-comma-in-multi-valued-property.xml
URL: 
http://svn.apache.org/viewvc/sling/trunk/tooling/ide/impl-vlt-test/src/test/resources/org/apache/sling/ide/impl/vlt/serialization/escaped-comma-in-multi-valued-property.xml?rev=1705853&view=auto
==============================================================================
--- 
sling/trunk/tooling/ide/impl-vlt-test/src/test/resources/org/apache/sling/ide/impl/vlt/serialization/escaped-comma-in-multi-valued-property.xml
 (added)
+++ 
sling/trunk/tooling/ide/impl-vlt-test/src/test/resources/org/apache/sling/ide/impl/vlt/serialization/escaped-comma-in-multi-valued-property.xml
 Tue Sep 29 13:02:33 2015
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+    Licensed to the Apache Software Foundation (ASF) under one or
+    more contributor license agreements. See the NOTICE file
+    distributed with this work for additional information regarding
+    copyright ownership. The ASF licenses this file to you under the
+    Apache License, Version 2.0 (the "License"); you may not use
+    this file except in compliance with the License. You may obtain
+    a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0 Unless required by
+    applicable law or agreed to in writing, software distributed
+    under the License is distributed on an "AS IS" BASIS, WITHOUT
+    WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions
+    and limitations under the License.
+-->
+<jcr:root xmlns:sling="http://sling.apache.org/jcr/sling/1.0"; 
xmlns:jcr="http://www.jcp.org/jcr/1.0";
+   someProp="[first\,first,second]"/>

Modified: 
sling/trunk/tooling/ide/impl-vlt/src/org/apache/sling/ide/impl/vlt/serialization/ContentXmlHandler.java
URL: 
http://svn.apache.org/viewvc/sling/trunk/tooling/ide/impl-vlt/src/org/apache/sling/ide/impl/vlt/serialization/ContentXmlHandler.java?rev=1705853&r1=1705852&r2=1705853&view=diff
==============================================================================
--- 
sling/trunk/tooling/ide/impl-vlt/src/org/apache/sling/ide/impl/vlt/serialization/ContentXmlHandler.java
 (original)
+++ 
sling/trunk/tooling/ide/impl-vlt/src/org/apache/sling/ide/impl/vlt/serialization/ContentXmlHandler.java
 Tue Sep 29 13:02:33 2015
@@ -17,10 +17,12 @@
 package org.apache.sling.ide.impl.vlt.serialization;
 
 import java.math.BigDecimal;
+import java.util.ArrayList;
 import java.util.Calendar;
 import java.util.Deque;
 import java.util.EnumSet;
 import java.util.LinkedList;
+import java.util.List;
 import java.util.UUID;
 
 import org.apache.jackrabbit.util.ISO8601;
@@ -233,7 +235,7 @@ public class ContentXmlHandler extends D
                 }
 
                 String rawValues = rawValue.substring(1, rawValue.length() - 
1);
-                values = rawValues.split(",");
+                values = splitValues(rawValues);
                 explicitMultiValue = true;
             } else {
                 values = new String[] { rawValue };
@@ -259,6 +261,34 @@ public class ContentXmlHandler extends D
             throw new IllegalArgumentException("Unknown typeHint value '" + 
rawHint + "'");
         }
 
+        private static String[] splitValues(String rawValues) {
+            
+            List<String> values = new ArrayList<String>();
+            String[] firstPass = rawValues.split(",");
+            for ( int i = 0 ; i < firstPass.length; i++) {
+                
+                String val = firstPass[i];
+                
+                boolean trailingSlash = val.endsWith("\\");
+                boolean moreEntries = i < firstPass.length;
+                
+                // special case where the comma is escaped, so this means that
+                // two values should be joined
+                if ( trailingSlash && moreEntries ) {
+                    // re-establish the value, e.g. first\,second becomes a 
single first,second entry
+                    values.add(val.substring(0, val.length() - 1) + "," + 
firstPass[i+1]);
+                    // manually advance the iteration couter since we consumed 
the next entry
+                    i++;
+                    continue;
+                }
+              
+                values.add(val);
+            }
+            
+            return values.toArray(new String[values.size()]);
+            
+        }
+
         private static void unescape(String[] values) {
 
             for (int i = 0; i < values.length; i++) {


Reply via email to