You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@jackrabbit.apache.org by tr...@apache.org on 2013/08/31 00:49:36 UTC
svn commit: r1519105 - in /jackrabbit/commons/filevault/trunk/vault-core/src:
main/java/org/apache/jackrabbit/vault/util/DocViewProperty.java
test/java/org/apache/jackrabbit/vault/util/DocViewPropertyTest.java
Author: tripod
Date: Fri Aug 30 22:49:36 2013
New Revision: 1519105
URL: http://svn.apache.org/r1519105
Log:
JCR-3661 jcrvlt: String[]{""} not packaged correctly
Modified:
jackrabbit/commons/filevault/trunk/vault-core/src/main/java/org/apache/jackrabbit/vault/util/DocViewProperty.java
jackrabbit/commons/filevault/trunk/vault-core/src/test/java/org/apache/jackrabbit/vault/util/DocViewPropertyTest.java
Modified: jackrabbit/commons/filevault/trunk/vault-core/src/main/java/org/apache/jackrabbit/vault/util/DocViewProperty.java
URL: http://svn.apache.org/viewvc/jackrabbit/commons/filevault/trunk/vault-core/src/main/java/org/apache/jackrabbit/vault/util/DocViewProperty.java?rev=1519105&r1=1519104&r2=1519105&view=diff
==============================================================================
--- jackrabbit/commons/filevault/trunk/vault-core/src/main/java/org/apache/jackrabbit/vault/util/DocViewProperty.java (original)
+++ jackrabbit/commons/filevault/trunk/vault-core/src/main/java/org/apache/jackrabbit/vault/util/DocViewProperty.java Fri Aug 30 22:49:36 2013
@@ -174,6 +174,12 @@ public class DocViewProperty {
state = 'u';
unicode = 0;
unicodePos = 0;
+ } else if (c == '0') {
+ // special case to treat empty values. see JCR-3661
+ state = 'v';
+ if (vals == null) {
+ vals = new LinkedList<String>();
+ }
} else {
state = 'v';
tmp.append(c);
@@ -247,14 +253,19 @@ public class DocViewProperty {
attrValue.append(',');
}
String strValue = ValueHelper.serialize(values[i], false);
- switch (prop.getType()) {
- case PropertyType.STRING:
- case PropertyType.NAME:
- case PropertyType.PATH:
- escape(attrValue, strValue, true);
- break;
- default:
- attrValue.append(strValue);
+ if (values.length == 1 && strValue.length() == 0) {
+ // special case for empty string MV value (JCR-3661)
+ attrValue.append("\\0");
+ } else {
+ switch (prop.getType()) {
+ case PropertyType.STRING:
+ case PropertyType.NAME:
+ case PropertyType.PATH:
+ escape(attrValue, strValue, true);
+ break;
+ default:
+ attrValue.append(strValue);
+ }
}
}
attrValue.append(']');
Modified: jackrabbit/commons/filevault/trunk/vault-core/src/test/java/org/apache/jackrabbit/vault/util/DocViewPropertyTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/commons/filevault/trunk/vault-core/src/test/java/org/apache/jackrabbit/vault/util/DocViewPropertyTest.java?rev=1519105&r1=1519104&r2=1519105&view=diff
==============================================================================
--- jackrabbit/commons/filevault/trunk/vault-core/src/test/java/org/apache/jackrabbit/vault/util/DocViewPropertyTest.java (original)
+++ jackrabbit/commons/filevault/trunk/vault-core/src/test/java/org/apache/jackrabbit/vault/util/DocViewPropertyTest.java Fri Aug 30 22:49:36 2013
@@ -17,9 +17,13 @@
package org.apache.jackrabbit.vault.util;
+import javax.jcr.Property;
import javax.jcr.PropertyType;
+import javax.jcr.Value;
+import javax.jcr.nodetype.PropertyDefinition;
import org.apache.jackrabbit.util.Text;
+import org.mockito.Mockito;
import junit.framework.TestCase;
@@ -112,6 +116,54 @@ public class DocViewPropertyTest extends
assertEquals(p, true, PropertyType.UNDEFINED);
}
+ /**
+ * Special test for mv properties with 1 empty string value (JCR-3661)
+ * @throws Exception
+ */
+ public void testEmptyMVString() throws Exception {
+ Property p = Mockito.mock(Property.class);
+ Value value = Mockito.mock(Value.class);
+
+ Mockito.when(value.getString()).thenReturn("");
+ Value[] values = new Value[]{value};
+ PropertyDefinition pd = Mockito.mock(PropertyDefinition.class);
+ Mockito.when(pd.isMultiple()).thenReturn(true);
+
+ Mockito.when(p.getType()).thenReturn(PropertyType.STRING);
+ Mockito.when(p.getName()).thenReturn("foo");
+ Mockito.when(p.getValues()).thenReturn(values);
+ Mockito.when(p.getDefinition()).thenReturn(pd);
+
+ String result = DocViewProperty.format(p);
+ assertEquals("formatted property", "[\\0]", result);
+
+ // now round trip back
+ DocViewProperty dp = DocViewProperty.parse("foo", result);
+ assertEquals(dp, true, PropertyType.UNDEFINED, "");
+ }
+
+ public void testEmptyMVBoolean() throws Exception {
+ Property p = Mockito.mock(Property.class);
+ Value value = Mockito.mock(Value.class);
+
+ Mockito.when(value.getString()).thenReturn("false");
+ Value[] values = new Value[]{value};
+ PropertyDefinition pd = Mockito.mock(PropertyDefinition.class);
+ Mockito.when(pd.isMultiple()).thenReturn(true);
+
+ Mockito.when(p.getType()).thenReturn(PropertyType.BOOLEAN);
+ Mockito.when(p.getName()).thenReturn("foo");
+ Mockito.when(p.getValues()).thenReturn(values);
+ Mockito.when(p.getDefinition()).thenReturn(pd);
+
+ String result = DocViewProperty.format(p);
+ assertEquals("formatted property", "{Boolean}[false]", result);
+
+ // now round trip back
+ DocViewProperty dp = DocViewProperty.parse("foo", result);
+ assertEquals(dp, true, PropertyType.BOOLEAN, "false");
+ }
+
public void testEscape() {
assertEscaped("hello", "hello", false);
assertEscaped("hello, world", "hello, world", false);