You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@jackrabbit.apache.org by st...@apache.org on 2006/03/10 17:58:21 UTC

svn commit: r384850 - in /incubator/jackrabbit/trunk/jackrabbit/src/main/java/org/apache/jackrabbit/core/xml: DocViewImportHandler.java DocViewSAXEventGenerator.java

Author: stefan
Date: Fri Mar 10 08:58:17 2006
New Revision: 384850

URL: http://svn.apache.org/viewcvs?rev=384850&view=rev
Log:
JCR-325: multi-value serialization in document view export is not spec-compliant; for the time being just skip multi-valued properties on document view export which is legal according to "6.4.2.5 Multi-value Properties"

Modified:
    incubator/jackrabbit/trunk/jackrabbit/src/main/java/org/apache/jackrabbit/core/xml/DocViewImportHandler.java
    incubator/jackrabbit/trunk/jackrabbit/src/main/java/org/apache/jackrabbit/core/xml/DocViewSAXEventGenerator.java

Modified: incubator/jackrabbit/trunk/jackrabbit/src/main/java/org/apache/jackrabbit/core/xml/DocViewImportHandler.java
URL: http://svn.apache.org/viewcvs/incubator/jackrabbit/trunk/jackrabbit/src/main/java/org/apache/jackrabbit/core/xml/DocViewImportHandler.java?rev=384850&r1=384849&r2=384850&view=diff
==============================================================================
--- incubator/jackrabbit/trunk/jackrabbit/src/main/java/org/apache/jackrabbit/core/xml/DocViewImportHandler.java (original)
+++ incubator/jackrabbit/trunk/jackrabbit/src/main/java/org/apache/jackrabbit/core/xml/DocViewImportHandler.java Fri Mar 10 08:58:17 2006
@@ -20,7 +20,6 @@
 import org.apache.jackrabbit.name.NamespaceResolver;
 import org.apache.jackrabbit.name.QName;
 import org.apache.jackrabbit.util.ISO9075;
-import org.apache.jackrabbit.util.Text;
 import org.apache.jackrabbit.core.NodeId;
 import org.apache.log4j.Logger;
 import org.xml.sax.Attributes;
@@ -154,7 +153,7 @@
     /**
      * {@inheritDoc}
      * <p/>
-     * See also {@link DocViewSAXEventGenerator#leaving(javax.jcr.Node, int)}
+     * See also {@link DocViewSAXEventGenerator#leavingProperties(javax.jcr.Node, int)}
      * regarding special handling of multi-valued properties on export.
      */
     public void startElement(String namespaceURI, String localName,
@@ -183,25 +182,13 @@
                 String attrValue = atts.getValue(i);
                 Importer.TextValue[] propValues;
 
-                if (attrValue.startsWith("\n")) {
-                    // assume multi-valued property:
-                    // a leading line-feed (a valid whitespace NMTOKENS delimiter)
-                    // is interpreted as a hint that this attribute value is of
-                    // type NMTOKENS.
-                    // see DocViewSAXEventGenerator#leaving(Node, int)
-                    attrValue = attrValue.substring(1);
-                    String[] strings = Text.explode(attrValue, ' ', true);
-                    propValues = new Importer.TextValue[strings.length];
-                    for (int j = 0; j < strings.length; j++) {
-                        // decode encoded blanks in value
-                        strings[j] = Text.replace(strings[j], "_x0020_", " ");
-                        propValues[j] = new StringValue(strings[j]);
-                    }
-                } else {
-                    // assume single-valued property
-                    propValues = new Importer.TextValue[1];
-                    propValues[0] = new StringValue(attrValue);
-                }
+                // always assume single-valued property for the time being
+                // until a way of properly serializing/detecting multi-valued
+                // properties on re-import is found (see JCR-325);
+                // see also DocViewSAXEventGenerator#leavingProperties(Node, int)
+                // todo proper multi-value serialization support
+                propValues = new Importer.TextValue[1];
+                propValues[0] = new StringValue(attrValue);
 
                 if (propName.equals(QName.JCR_PRIMARYTYPE)) {
                     // jcr:primaryType

Modified: incubator/jackrabbit/trunk/jackrabbit/src/main/java/org/apache/jackrabbit/core/xml/DocViewSAXEventGenerator.java
URL: http://svn.apache.org/viewcvs/incubator/jackrabbit/trunk/jackrabbit/src/main/java/org/apache/jackrabbit/core/xml/DocViewSAXEventGenerator.java?rev=384850&r1=384849&r2=384850&view=diff
==============================================================================
--- incubator/jackrabbit/trunk/jackrabbit/src/main/java/org/apache/jackrabbit/core/xml/DocViewSAXEventGenerator.java (original)
+++ incubator/jackrabbit/trunk/jackrabbit/src/main/java/org/apache/jackrabbit/core/xml/DocViewSAXEventGenerator.java Fri Mar 10 08:58:17 2006
@@ -29,7 +29,6 @@
 import javax.jcr.Property;
 import javax.jcr.PropertyType;
 import javax.jcr.RepositoryException;
-import javax.jcr.Value;
 import java.util.ArrayList;
 import java.util.Iterator;
 import java.util.List;
@@ -136,6 +135,20 @@
             while (iter.hasNext()) {
                 Property prop = (Property) iter.next();
                 String propName = prop.getName();
+
+                if (prop.getDefinition().isMultiple()) {
+                    // todo proper multi-value serialization support
+                    // skip multi-valued properties for the time being
+                    // until a way of properly handling/detecting multi-valued
+                    // properties on re-import is found (see JCR-325);
+                    // see also DocViewImportHandler#startElement()
+
+                    // skipping multi-valued properties entirely is legal
+                    // according to "6.4.2.5 Multi-value Properties" of the
+                    // jsr-170 specification
+                    continue;
+                }
+
                 // attribute name (encode property name to make sure it's a valid xml name)
                 String attrName = ISO9075.encode(propName);
                 QName qName = getQName(attrName);
@@ -147,47 +160,8 @@
                             qName.getLocalName(), attrName, CDATA_TYPE, "");
                 } else {
                     StringBuffer attrValue = new StringBuffer();
-                    // process property value(s)
-                    boolean multiValued = prop.getDefinition().isMultiple();
-
-                    if (multiValued) {
-                        // multi-valued property:
-                        // according to "6.4.2.5 Multi-value Properties" of the
-                        // jsr-170 specification a multi-valued property can be
-                        // either skipped or it must be exported as NMTOKENS
-                        // type where "a mechanism must be adopted whereby upon
-                        // re-import the distinction between multi- and single-
-                        // value properties is not lost"...
-
-                        // the following implementation is a pragmatic approach
-                        // in the interest of improved useability:
-                        // the attribute value is constructed by concatenating
-                        // the serialized and escaped values, separated by a
-                        // space character each, into a single string and
-                        // prepending a new-line to help distinguish multi-
-                        // from single-valued properties on re-import.
-
-                        // use a leading line-feed (a valid whitespace
-                        // delimiter) as a hint on re-import that this attribute
-                        // value is of type NMTOKENS; note that line-feed rather
-                        // than space has been chosen as leading line-feeds are 
-                        // not affected by attribute-value normalization
-                        // (http://www.w3.org/TR/REC-xml/#AVNormalize)
-                        attrValue.append("\n");
-                        Value[] vals = prop.getValues();
-                        for (int i = 0; i < vals.length; i++) {
-                            if (i > 0) {
-                                // use space as delimiter for separate values
-                                attrValue.append(" ");
-                            }
-                            // serialize value (with encoded embedded spaces)
-                            attrValue.append(ValueHelper.serialize(vals[i], true));
-                        }
-                    } else {
-                        // single-valued property:
-                        // serialize value without encoding embedded spaces
-                        attrValue.append(ValueHelper.serialize(prop.getValue(), false));
-                    }
+                    // serialize single-valued property
+                    attrValue.append(ValueHelper.serialize(prop.getValue(), false));
                     attrs.addAttribute(qName.getNamespaceURI(),
                             qName.getLocalName(), attrName, CDATA_TYPE,
                             attrValue.toString());