You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@jackrabbit.apache.org by re...@apache.org on 2007/04/27 14:00:26 UTC
svn commit: r533070 - in /jackrabbit/trunk:
contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/xml/
jackrabbit-core/src/main/java/org/apache/jackrabbit/core/xml/
jackrabbit-jcr-commons/src/main/java/org/apache/jackrabbit/value/
Author: reschke
Date: Fri Apr 27 05:00:24 2007
New Revision: 533070
URL: http://svn.apache.org/viewvc?view=rev&rev=533070
Log:
JCR-674: add base64 encoding for non-binary properties that do non-XML characters (checking for now: control characters other than TAB, NL, CR); note this only affects export, import still needs to be done.
Modified:
jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/xml/SysViewSAXEventGenerator.java
jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/xml/SysViewSAXEventGenerator.java
jackrabbit/trunk/jackrabbit-jcr-commons/src/main/java/org/apache/jackrabbit/value/ValueHelper.java
Modified: jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/xml/SysViewSAXEventGenerator.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/xml/SysViewSAXEventGenerator.java?view=diff&rev=533070&r1=533069&r2=533070
==============================================================================
--- jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/xml/SysViewSAXEventGenerator.java (original)
+++ jackrabbit/trunk/contrib/spi/jcr2spi/src/main/java/org/apache/jackrabbit/jcr2spi/xml/SysViewSAXEventGenerator.java Fri Apr 27 05:00:24 2007
@@ -18,6 +18,7 @@
import org.apache.jackrabbit.name.QName;
import org.apache.jackrabbit.value.ValueHelper;
+import org.xml.sax.Attributes;
import org.xml.sax.ContentHandler;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.AttributesImpl;
@@ -62,6 +63,21 @@
public static final String CDATA_TYPE = "CDATA";
public static final String ENUMERATION_TYPE = "ENUMERATION";
+ private static final String NS_XMLSCHEMA_INSTANCE_URI = "http://www.w3.org/2001/XMLSchema-instance";
+ private static final String NS_XMLSCHEMA_INSTANCE_PREFIX = "xsi";
+ private static final String NS_XMLSCHEMA_URI = "http://www.w3.org/2001/XMLSchema";
+ private static final String NS_XMLSCHEMA_PREFIX = "xs";
+
+ private static final Attributes ATTRS_EMPTY = new AttributesImpl();
+ private static final Attributes ATTRS_BINARY_ENCODED_VALUE;
+ static {
+ AttributesImpl attrs = new AttributesImpl();
+ attrs.addAttribute(QName.NS_XMLNS_URI, NS_XMLSCHEMA_INSTANCE_PREFIX, "xmlns:" + NS_XMLSCHEMA_INSTANCE_PREFIX, CDATA_TYPE, NS_XMLSCHEMA_INSTANCE_URI);
+ attrs.addAttribute(QName.NS_XMLNS_URI, NS_XMLSCHEMA_PREFIX, "xmlns:" + NS_XMLSCHEMA_PREFIX, CDATA_TYPE, NS_XMLSCHEMA_URI);
+ attrs.addAttribute(NS_XMLSCHEMA_INSTANCE_URI, "type", NS_XMLSCHEMA_INSTANCE_PREFIX + ":type", "CDATA", NS_XMLSCHEMA_PREFIX + ":base64Binary");
+ ATTRS_BINARY_ENCODED_VALUE = attrs;
+ }
+
/**
* Constructor
*
@@ -174,9 +190,28 @@
for (int i = 0; i < vals.length; i++) {
Value val = vals[i];
+ Attributes attributes = ATTRS_EMPTY;
+ boolean mustSendBinary = false;
+
+ if (val.getType() != PropertyType.BINARY) {
+ String ser = val.getString();
+ for (int ci = 0; ci < ser.length() && mustSendBinary == false; ci++) {
+ char c = ser.charAt(ci);
+ if (c >= 0 && c < 32 && c != '\r' && c != '\n' && c != '\t') {
+ mustSendBinary = true;
+ }
+ }
+
+ if (mustSendBinary) {
+ contentHandler.startPrefixMapping(NS_XMLSCHEMA_INSTANCE_PREFIX, NS_XMLSCHEMA_INSTANCE_URI);
+ contentHandler.startPrefixMapping(NS_XMLSCHEMA_PREFIX, NS_XMLSCHEMA_URI);
+ attributes = ATTRS_BINARY_ENCODED_VALUE;
+ }
+ }
+
// start value element
contentHandler.startElement(QName.NS_SV_URI, VALUE_ELEMENT,
- PREFIXED_VALUE_ELEMENT, new AttributesImpl());
+ PREFIXED_VALUE_ELEMENT, attributes);
// characters
Writer writer = new Writer() {
@@ -195,7 +230,7 @@
}
};
try {
- ValueHelper.serialize(val, false, writer);
+ ValueHelper.serialize(val, false, mustSendBinary, writer);
// no need to close our Writer implementation
//writer.close();
} catch (IOException ioe) {
@@ -212,6 +247,11 @@
// end value element
contentHandler.endElement(QName.NS_SV_URI, VALUE_ELEMENT,
PREFIXED_VALUE_ELEMENT);
+
+ if (mustSendBinary) {
+ contentHandler.endPrefixMapping(NS_XMLSCHEMA_INSTANCE_PREFIX);
+ contentHandler.endPrefixMapping(NS_XMLSCHEMA_PREFIX);
+ }
}
}
}
Modified: jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/xml/SysViewSAXEventGenerator.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/xml/SysViewSAXEventGenerator.java?view=diff&rev=533070&r1=533069&r2=533070
==============================================================================
--- jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/xml/SysViewSAXEventGenerator.java (original)
+++ jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/xml/SysViewSAXEventGenerator.java Fri Apr 27 05:00:24 2007
@@ -43,6 +43,21 @@
public static final String CDATA_TYPE = "CDATA";
public static final String ENUMERATION_TYPE = "ENUMERATION";
+ private static final String NS_XMLSCHEMA_INSTANCE_URI = "http://www.w3.org/2001/XMLSchema-instance";
+ private static final String NS_XMLSCHEMA_INSTANCE_PREFIX = "xsi";
+ private static final String NS_XMLSCHEMA_URI = "http://www.w3.org/2001/XMLSchema";
+ private static final String NS_XMLSCHEMA_PREFIX = "xs";
+
+ private static final Attributes ATTRS_EMPTY = new AttributesImpl();
+ private static final Attributes ATTRS_BINARY_ENCODED_VALUE;
+ static {
+ AttributesImpl attrs = new AttributesImpl();
+ attrs.addAttribute(QName.NS_XMLNS_URI, NS_XMLSCHEMA_INSTANCE_PREFIX, "xmlns:" + NS_XMLSCHEMA_INSTANCE_PREFIX, CDATA_TYPE, NS_XMLSCHEMA_INSTANCE_URI);
+ attrs.addAttribute(QName.NS_XMLNS_URI, NS_XMLSCHEMA_PREFIX, "xmlns:" + NS_XMLSCHEMA_PREFIX, CDATA_TYPE, NS_XMLSCHEMA_URI);
+ attrs.addAttribute(NS_XMLSCHEMA_INSTANCE_URI, "type", NS_XMLSCHEMA_INSTANCE_PREFIX + ":type", "CDATA", NS_XMLSCHEMA_PREFIX + ":base64Binary");
+ ATTRS_BINARY_ENCODED_VALUE = attrs;
+ }
+
/**
* Name resolver for producing qualified XML names.
*/
@@ -151,8 +166,27 @@
for (int i = 0; i < vals.length; i++) {
Value val = vals[i];
+ Attributes attributes = ATTRS_EMPTY;
+ boolean mustSendBinary = false;
+
+ if (val.getType() != PropertyType.BINARY) {
+ String ser = val.getString();
+ for (int ci = 0; ci < ser.length() && mustSendBinary == false; ci++) {
+ char c = ser.charAt(ci);
+ if (c >= 0 && c < 32 && c != '\r' && c != '\n' && c != '\t') {
+ mustSendBinary = true;
+ }
+ }
+
+ if (mustSendBinary) {
+ contentHandler.startPrefixMapping(NS_XMLSCHEMA_INSTANCE_PREFIX, NS_XMLSCHEMA_INSTANCE_URI);
+ contentHandler.startPrefixMapping(NS_XMLSCHEMA_PREFIX, NS_XMLSCHEMA_URI);
+ attributes = ATTRS_BINARY_ENCODED_VALUE;
+ }
+ }
+
// start value element
- startElement(QName.SV_VALUE, new AttributesImpl());
+ startElement(QName.SV_VALUE, attributes);
// characters
Writer writer = new Writer() {
@@ -171,7 +205,7 @@
}
};
try {
- ValueHelper.serialize(val, false, writer);
+ ValueHelper.serialize(val, false, mustSendBinary, writer);
// no need to close our Writer implementation
//writer.close();
} catch (IOException ioe) {
@@ -187,6 +221,11 @@
// end value element
endElement(QName.SV_VALUE);
+
+ if (mustSendBinary) {
+ contentHandler.endPrefixMapping(NS_XMLSCHEMA_INSTANCE_PREFIX);
+ contentHandler.endPrefixMapping(NS_XMLSCHEMA_PREFIX);
+ }
}
}
}
Modified: jackrabbit/trunk/jackrabbit-jcr-commons/src/main/java/org/apache/jackrabbit/value/ValueHelper.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-jcr-commons/src/main/java/org/apache/jackrabbit/value/ValueHelper.java?view=diff&rev=533070&r1=533069&r2=533070
==============================================================================
--- jackrabbit/trunk/jackrabbit-jcr-commons/src/main/java/org/apache/jackrabbit/value/ValueHelper.java (original)
+++ jackrabbit/trunk/jackrabbit-jcr-commons/src/main/java/org/apache/jackrabbit/value/ValueHelper.java Fri Apr 27 05:00:24 2007
@@ -562,7 +562,7 @@
throws IllegalStateException, RepositoryException {
StringWriter writer = new StringWriter();
try {
- serialize(value, encodeBlanks, writer);
+ serialize(value, encodeBlanks, false, writer);
} catch (IOException ioe) {
throw new RepositoryException("failed to serialize value",
ioe);
@@ -571,6 +571,15 @@
}
/**
+ * @deprecated use {@link #serialize(Value, boolean, boolean, Writer)} instead
+ */
+ public static void serialize(Value value, boolean encodeBlanks,
+ Writer writer)
+ throws IllegalStateException, IOException, RepositoryException {
+ serialize(value, encodeBlanks, false, writer);
+ }
+
+ /**
* Outputs the serialized value to a <code>Writer</code>. The serialization
* format is the same as used by Document & System View XML, i.e.
* binary values will be Base64-encoded whereas for all others
@@ -579,13 +588,14 @@
* @param value the value to be serialized
* @param encodeBlanks if <code>true</code> space characters will be encoded
* as <code>"_x0020_"</code> within he output string.
+ * @param enforceBase64 if <code>true</code>, base64 encoding will always be used
* @param writer writer to output the encoded data
* @throws IllegalStateException if the given value is in an illegal state
* @throws IOException if an i/o error occured during the
* serialization
* @throws RepositoryException if an error occured during the serialization.
*/
- public static void serialize(Value value, boolean encodeBlanks,
+ public static void serialize(Value value, boolean encodeBlanks, boolean enforceBase64,
Writer writer)
throws IllegalStateException, IOException, RepositoryException {
if (value.getType() == PropertyType.BINARY) {
@@ -606,11 +616,17 @@
}
} else {
String textVal = value.getString();
- if (encodeBlanks) {
- // enocde blanks in string
- textVal = Text.replace(textVal, " ", "_x0020_");
+ if (enforceBase64) {
+ byte bytes[] = textVal.getBytes("UTF-8");
+ Base64.encode(bytes, 0, bytes.length, writer);
+ }
+ else {
+ if (encodeBlanks) {
+ // enocde blanks in string
+ textVal = Text.replace(textVal, " ", "_x0020_");
+ }
+ writer.write(textVal);
}
- writer.write(textVal);
}
}