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 2005/04/05 17:58:07 UTC
svn commit: r160189 - in
incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core:
SessionImpl.java WorkspaceImpl.java xml/DocViewImportHandler.java
xml/ImportHandler.java xml/SysViewImportHandler.java
Author: stefan
Date: Tue Apr 5 08:58:06 2005
New Revision: 160189
URL: http://svn.apache.org/viewcvs?view=rev&rev=160189
Log:
- ImportHandler & specialized friends now rely on default SAX2 Namespace support
- Doc/SysViewImportHandler are now processing ignorableWhitespace events
Modified:
incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/SessionImpl.java
incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/WorkspaceImpl.java
incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/xml/DocViewImportHandler.java
incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/xml/ImportHandler.java
incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/xml/SysViewImportHandler.java
Modified: incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/SessionImpl.java
URL: http://svn.apache.org/viewcvs/incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/SessionImpl.java?view=diff&r1=160188&r2=160189
==============================================================================
--- incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/SessionImpl.java (original)
+++ incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/SessionImpl.java Tue Apr 5 08:58:06 2005
@@ -1008,9 +1008,15 @@
ImportHandler handler = (ImportHandler) getImportContentHandler(parentAbsPath);
try {
- XMLReader parser = XMLReaderFactory.createXMLReader("org.apache.xerces.parsers.SAXParser");
+ XMLReader parser =
+ XMLReaderFactory.createXMLReader("org.apache.xerces.parsers.SAXParser");
parser.setContentHandler(handler);
parser.setErrorHandler(handler);
+ // being paranoid...
+ parser.setFeature("http://xml.org/sax/features/namespaces", true);
+ parser.setFeature("http://xml.org/sax/features/namespace-prefixes",
+ false);
+
parser.parse(new InputSource(in));
} catch (SAXException se) {
// check for wrapped repository exception
Modified: incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/WorkspaceImpl.java
URL: http://svn.apache.org/viewcvs/incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/WorkspaceImpl.java?view=diff&r1=160188&r2=160189
==============================================================================
--- incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/WorkspaceImpl.java (original)
+++ incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/WorkspaceImpl.java Tue Apr 5 08:58:06 2005
@@ -1645,6 +1645,11 @@
XMLReaderFactory.createXMLReader("org.apache.xerces.parsers.SAXParser");
parser.setContentHandler(handler);
parser.setErrorHandler(handler);
+ // being paranoid...
+ parser.setFeature("http://xml.org/sax/features/namespaces", true);
+ parser.setFeature("http://xml.org/sax/features/namespace-prefixes",
+ false);
+
parser.parse(new InputSource(in));
} catch (SAXException se) {
// check for wrapped repository exception
Modified: incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/xml/DocViewImportHandler.java
URL: http://svn.apache.org/viewcvs/incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/xml/DocViewImportHandler.java?view=diff&r1=160188&r2=160189
==============================================================================
--- incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/xml/DocViewImportHandler.java (original)
+++ incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/xml/DocViewImportHandler.java Tue Apr 5 08:58:06 2005
@@ -17,10 +17,8 @@
package org.apache.jackrabbit.core.xml;
import org.apache.jackrabbit.core.BaseException;
-import org.apache.jackrabbit.core.IllegalNameException;
import org.apache.jackrabbit.core.NamespaceResolver;
import org.apache.jackrabbit.core.QName;
-import org.apache.jackrabbit.core.UnknownPrefixException;
import org.apache.jackrabbit.core.util.ISO9075;
import org.apache.log4j.Logger;
import org.xml.sax.Attributes;
@@ -30,6 +28,7 @@
import javax.jcr.RepositoryException;
import java.util.ArrayList;
import java.util.Stack;
+import java.io.IOException;
/**
* <code>DocViewImportHandler</code> processes Document View XML SAX events
@@ -119,18 +118,7 @@
}
try {
- QName nodeName;
- if (namespaceURI != null && !"".equals(namespaceURI)) {
- nodeName = new QName(namespaceURI, localName);
- } else {
- try {
- nodeName = QName.fromJCRName(qName, nsContext);
- } catch (IllegalNameException ine) {
- throw new SAXException("illegal node name: " + qName, ine);
- } catch (UnknownPrefixException upe) {
- throw new SAXException("illegal node name: " + qName, upe);
- }
- }
+ QName nodeName = new QName(namespaceURI, localName);
// decode node name
nodeName = ISO9075.decode(nodeName);
@@ -141,20 +129,7 @@
ArrayList props = new ArrayList(atts.getLength());
for (int i = 0; i < atts.getLength(); i++) {
- QName propName;
- if (atts.getURI(i) != null && !"".equals(atts.getURI(i))) {
- propName = new QName(atts.getURI(i), atts.getLocalName(i));
- } else {
- try {
- propName = QName.fromJCRName(atts.getQName(i), nsContext);
- } catch (IllegalNameException ine) {
- throw new SAXException("illegal property name: "
- + atts.getQName(i), ine);
- } catch (UnknownPrefixException upe) {
- throw new SAXException("illegal property name: "
- + atts.getQName(i), upe);
- }
- }
+ QName propName = new QName(atts.getURI(i), atts.getLocalName(i));
// decode property name
propName = ISO9075.decode(propName);
@@ -224,6 +199,21 @@
/**
* buffer character data; will be processed
* in endElement and startElement method
+ */
+ if (textHandler == null) {
+ textHandler = new StringBufferValue();
+ }
+ textHandler.append(ch, start, length);
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public void ignorableWhitespace(char ch[], int start, int length)
+ throws SAXException {
+ /**
+ * buffer data reported by the ignorableWhitespace event;
+ * will be processed in endElement and startElement method
*/
if (textHandler == null) {
textHandler = new StringBufferValue();
Modified: incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/xml/ImportHandler.java
URL: http://svn.apache.org/viewcvs/incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/xml/ImportHandler.java?view=diff&r1=160188&r2=160189
==============================================================================
--- incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/xml/ImportHandler.java (original)
+++ incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/xml/ImportHandler.java Tue Apr 5 08:58:06 2005
@@ -16,11 +16,9 @@
*/
package org.apache.jackrabbit.core.xml;
-import org.apache.jackrabbit.core.BaseException;
import org.apache.jackrabbit.core.Constants;
import org.apache.jackrabbit.core.NamespaceRegistryImpl;
import org.apache.jackrabbit.core.NamespaceResolver;
-import org.apache.jackrabbit.core.QName;
import org.apache.log4j.Logger;
import org.xml.sax.Attributes;
import org.xml.sax.ContentHandler;
@@ -35,12 +33,19 @@
/**
* An <code>ImportHandler</code> instance can be used to import serialized
- * data in System View XML or Document View XML. Processing of the XML is handled
- * by specialized <code>ContentHandler</code>s (i.e. <code>SysViewImportHandler</code>
- * and <code>DocViewImportHandler</code>).
+ * data in System View XML or Document View XML. Processing of the XML is
+ * handled by specialized <code>ContentHandler</code>s
+ * (i.e. <code>SysViewImportHandler</code> and <code>DocViewImportHandler</code>).
* <p/>
* The actual task of importing though is delegated to the implementation of
* the <code>{@link Importer}</code> interface.
+ * <p/>
+ * <b>Important Note:</b>
+ * <p/>
+ * These SAX Event Handlers expect that Namespace URI's and local names are
+ * reported in the <code>start/endElement</code> events and that
+ * <code>start/endPrefixMapping</code> events are reported
+ * (i.e. default SAX2 Namespace processing).
*/
public class ImportHandler extends DefaultHandler {
@@ -213,21 +218,7 @@
if (!initialized) {
// the namespace of the first element determines the type of XML
// (system view/document view)
- String nsURI;
- if (namespaceURI != null && !"".equals(namespaceURI)) {
- nsURI = namespaceURI;
- } else {
- try {
- nsURI = QName.fromJCRName(qName, nsResolver).getNamespaceURI();
- } catch (BaseException e) {
- // should never happen...
- String msg = "internal error: failed to parse/resolve element name "
- + qName;
- log.debug(msg);
- throw new SAXException(msg, e);
- }
- }
- systemViewXML = Constants.NS_SV_URI.equals(nsURI);
+ systemViewXML = Constants.NS_SV_URI.equals(namespaceURI);
if (systemViewXML) {
targetHandler = new SysViewImportHandler(importer, nsContext);
Modified: incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/xml/SysViewImportHandler.java
URL: http://svn.apache.org/viewcvs/incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/xml/SysViewImportHandler.java?view=diff&r1=160188&r2=160189
==============================================================================
--- incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/xml/SysViewImportHandler.java (original)
+++ incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/xml/SysViewImportHandler.java Tue Apr 5 08:58:06 2005
@@ -16,7 +16,6 @@
*/
package org.apache.jackrabbit.core.xml;
-import org.apache.jackrabbit.core.BaseException;
import org.apache.jackrabbit.core.IllegalNameException;
import org.apache.jackrabbit.core.NamespaceResolver;
import org.apache.jackrabbit.core.QName;
@@ -117,34 +116,19 @@
public void startElement(String namespaceURI, String localName,
String qName, Attributes atts)
throws SAXException {
- String elemName;
- String nsURI;
- if (namespaceURI != null && !"".equals(namespaceURI)) {
- nsURI = namespaceURI;
- elemName = localName;
- } else {
- try {
- nsURI = QName.fromJCRName(qName, nsContext).getNamespaceURI();
- elemName = QName.fromJCRName(qName, nsContext).getLocalName();
- } catch (BaseException e) {
- // should never happen...
- String msg = "internal error: failed to parse/resolve element name " + qName;
- log.debug(msg);
- throw new SAXException(msg, e);
- }
- }
// check namespace
- if (!NS_SV_URI.equals(nsURI)) {
- throw new SAXException(new InvalidSerializedDataException("invalid namespace for element in system view xml document: " + nsURI));
+ if (!NS_SV_URI.equals(namespaceURI)) {
+ throw new SAXException(new InvalidSerializedDataException("invalid namespace for element in system view xml document: "
+ + namespaceURI));
}
// check element name
- if (SysViewSAXEventGenerator.NODE_ELEMENT.equals(elemName)) {
+ if (SysViewSAXEventGenerator.NODE_ELEMENT.equals(localName)) {
// sv:node element
// node name (value of sv:name attribute)
String name = atts.getValue(SysViewSAXEventGenerator.PREFIXED_NAME_ATTRIBUTE);
if (name == null) {
- throw new SAXException(new InvalidSerializedDataException("missing mandatory sv:name attributeof element sv:node"));
+ throw new SAXException(new InvalidSerializedDataException("missing mandatory sv:name attribute of element sv:node"));
}
if (!stack.isEmpty()) {
@@ -167,7 +151,7 @@
throw new SAXException(new InvalidSerializedDataException("illegal node name: " + name, upe));
}
stack.push(state);
- } else if (SysViewSAXEventGenerator.PROPERTY_ELEMENT.equals(elemName)) {
+ } else if (SysViewSAXEventGenerator.PROPERTY_ELEMENT.equals(localName)) {
// sv:property element
// reset temp fields
@@ -176,7 +160,7 @@
// property name (value of sv:name attribute)
String name = atts.getValue(SysViewSAXEventGenerator.PREFIXED_NAME_ATTRIBUTE);
if (name == null) {
- throw new SAXException(new InvalidSerializedDataException("missing mandatory sv:name attributeof element sv:property"));
+ throw new SAXException(new InvalidSerializedDataException("missing mandatory sv:name attribute of element sv:property"));
}
try {
currentPropName = QName.fromJCRName(name, nsContext);
@@ -188,10 +172,10 @@
// property type (sv:type attribute)
String type = atts.getValue(SysViewSAXEventGenerator.PREFIXED_TYPE_ATTRIBUTE);
if (type == null) {
- throw new SAXException(new InvalidSerializedDataException("missing mandatory sv:type attributeof element sv:property"));
+ throw new SAXException(new InvalidSerializedDataException("missing mandatory sv:type attribute of element sv:property"));
}
currentPropType = PropertyType.valueFromName(type);
- } else if (SysViewSAXEventGenerator.VALUE_ELEMENT.equals(elemName)) {
+ } else if (SysViewSAXEventGenerator.VALUE_ELEMENT.equals(localName)) {
// sv:value element
// reset temp fields
@@ -200,15 +184,18 @@
try {
currentPropValue = new CLOBValue();
} catch (IOException ioe) {
- throw new SAXException("error while processing property value",
- ioe);
+ String msg = "error while processing property value "
+ + currentPropName;
+ log.debug(msg, ioe);
+ throw new SAXException(msg, ioe);
}
} else {
// 'normal' value; use StringBuffer-backed value appender
currentPropValue = new StringBufferValue();
}
} else {
- throw new SAXException(new InvalidSerializedDataException("unexpected element found in system view xml document: " + elemName));
+ throw new SAXException(new InvalidSerializedDataException("unexpected element found in system view xml document: "
+ + localName));
}
}
@@ -231,24 +218,30 @@
/**
* {@inheritDoc}
*/
- public void endElement(String namespaceURI, String localName, String qName)
+ public void ignorableWhitespace(char ch[], int start, int length)
throws SAXException {
- String elemName;
- if (localName != null && !"".equals(localName)) {
- elemName = localName;
- } else {
+ if (currentPropValue != null) {
+ // property value
+
+ // data reported by the ignorableWhitespace event within
+ // sv:value tags is considered part of the value
try {
- elemName = QName.fromJCRName(qName, nsContext).getLocalName();
- } catch (BaseException e) {
- // should never happen...
- String msg = "internal error: failed to parse/resolve element name " + qName;
- log.debug(msg);
- throw new SAXException(msg, e);
+ currentPropValue.append(ch, start, length);
+ } catch (IOException ioe) {
+ throw new SAXException("error while processing property value",
+ ioe);
}
}
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public void endElement(String namespaceURI, String localName, String qName)
+ throws SAXException {
// check element name
ImportState state = (ImportState) stack.peek();
- if (SysViewSAXEventGenerator.NODE_ELEMENT.equals(elemName)) {
+ if (SysViewSAXEventGenerator.NODE_ELEMENT.equals(localName)) {
// sv:node element
if (!state.started) {
// need to start & end current node
@@ -260,7 +253,7 @@
}
// pop current state from stack
stack.pop();
- } else if (SysViewSAXEventGenerator.PROPERTY_ELEMENT.equals(elemName)) {
+ } else if (SysViewSAXEventGenerator.PROPERTY_ELEMENT.equals(localName)) {
// sv:property element
// check if all system properties (jcr:primaryType, jcr:uuid etc.)
@@ -283,7 +276,8 @@
state.mixinNames = new ArrayList(currentPropValues.size());
}
for (int i = 0; i < currentPropValues.size(); i++) {
- AppendableValue val = (AppendableValue) currentPropValues.get(0);
+ AppendableValue val =
+ (AppendableValue) currentPropValues.get(0);
String s = null;
try {
s = val.retrieve();
@@ -314,13 +308,13 @@
}
// reset temp fields
currentPropValues.clear();
- } else if (SysViewSAXEventGenerator.VALUE_ELEMENT.equals(elemName)) {
+ } else if (SysViewSAXEventGenerator.VALUE_ELEMENT.equals(localName)) {
// sv:value element
currentPropValues.add(currentPropValue);
// reset temp fields
currentPropValue = null;
} else {
- throw new SAXException(new InvalidSerializedDataException("invalid element in system view xml document: " + elemName));
+ throw new SAXException(new InvalidSerializedDataException("invalid element in system view xml document: " + localName));
}
}