You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@jackrabbit.apache.org by ju...@apache.org on 2008/01/28 22:54:14 UTC

svn commit: r616070 - in /jackrabbit/trunk/jackrabbit-jcr-commons/src: main/java/org/apache/jackrabbit/commons/ main/java/org/apache/jackrabbit/commons/xml/ test/java/org/apache/jackrabbit/commons/xml/

Author: jukka
Date: Mon Jan 28 13:54:12 2008
New Revision: 616070

URL: http://svn.apache.org/viewvc?rev=616070&view=rev
Log:
JCR-1350: Add a serializing content handler
    - Improved separation of concerns between the XML utility classes

Added:
    jackrabbit/trunk/jackrabbit-jcr-commons/src/main/java/org/apache/jackrabbit/commons/xml/ParsingContentHandler.java
      - copied, changed from r616047, jackrabbit/trunk/jackrabbit-jcr-commons/src/main/java/org/apache/jackrabbit/commons/xml/DefaultContentHandler.java
    jackrabbit/trunk/jackrabbit-jcr-commons/src/test/java/org/apache/jackrabbit/commons/xml/ParsingContentHandlerTest.java
Modified:
    jackrabbit/trunk/jackrabbit-jcr-commons/src/main/java/org/apache/jackrabbit/commons/AbstractSession.java
    jackrabbit/trunk/jackrabbit-jcr-commons/src/main/java/org/apache/jackrabbit/commons/AbstractWorkspace.java
    jackrabbit/trunk/jackrabbit-jcr-commons/src/main/java/org/apache/jackrabbit/commons/xml/DefaultContentHandler.java

Modified: jackrabbit/trunk/jackrabbit-jcr-commons/src/main/java/org/apache/jackrabbit/commons/AbstractSession.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-jcr-commons/src/main/java/org/apache/jackrabbit/commons/AbstractSession.java?rev=616070&r1=616069&r2=616070&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-jcr-commons/src/main/java/org/apache/jackrabbit/commons/AbstractSession.java (original)
+++ jackrabbit/trunk/jackrabbit-jcr-commons/src/main/java/org/apache/jackrabbit/commons/AbstractSession.java Mon Jan 28 13:54:12 2008
@@ -34,7 +34,7 @@
 import javax.xml.transform.sax.TransformerHandler;
 import javax.xml.transform.stream.StreamResult;
 
-import org.apache.jackrabbit.commons.xml.DefaultContentHandler;
+import org.apache.jackrabbit.commons.xml.ParsingContentHandler;
 import org.xml.sax.ContentHandler;
 import org.xml.sax.SAXException;
 
@@ -121,9 +121,13 @@
     public void importXML(
             String parentAbsPath, InputStream in, int uuidBehavior)
             throws IOException, RepositoryException {
-        ContentHandler handler =
-            getImportContentHandler(parentAbsPath, uuidBehavior);
-        new DefaultContentHandler(handler).parse(in);
+        try {
+            ContentHandler handler =
+                getImportContentHandler(parentAbsPath, uuidBehavior);
+            new ParsingContentHandler(handler).parse(in);
+        } catch (SAXException e) {
+            throw new RepositoryException("XML import failed", e);
+        }
     }
 
     /**

Modified: jackrabbit/trunk/jackrabbit-jcr-commons/src/main/java/org/apache/jackrabbit/commons/AbstractWorkspace.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-jcr-commons/src/main/java/org/apache/jackrabbit/commons/AbstractWorkspace.java?rev=616070&r1=616069&r2=616070&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-jcr-commons/src/main/java/org/apache/jackrabbit/commons/AbstractWorkspace.java (original)
+++ jackrabbit/trunk/jackrabbit-jcr-commons/src/main/java/org/apache/jackrabbit/commons/AbstractWorkspace.java Mon Jan 28 13:54:12 2008
@@ -22,8 +22,9 @@
 import javax.jcr.RepositoryException;
 import javax.jcr.Workspace;
 
-import org.apache.jackrabbit.commons.xml.DefaultContentHandler;
+import org.apache.jackrabbit.commons.xml.ParsingContentHandler;
 import org.xml.sax.ContentHandler;
+import org.xml.sax.SAXException;
 
 /**
  * Abstract base class for implementing the JCR {@link Workspace} interface.
@@ -44,9 +45,13 @@
     public void importXML(
             String parentAbsPath, InputStream in, int uuidBehavior)
             throws IOException, RepositoryException {
-        ContentHandler handler =
-            getImportContentHandler(parentAbsPath, uuidBehavior);
-        new DefaultContentHandler(handler).parse(in);
+        try {
+            ContentHandler handler =
+                getImportContentHandler(parentAbsPath, uuidBehavior);
+            new ParsingContentHandler(handler).parse(in);
+        } catch (SAXException e) {
+            throw new RepositoryException("XML import failed", e);
+        }
     }
 
 }

Modified: jackrabbit/trunk/jackrabbit-jcr-commons/src/main/java/org/apache/jackrabbit/commons/xml/DefaultContentHandler.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-jcr-commons/src/main/java/org/apache/jackrabbit/commons/xml/DefaultContentHandler.java?rev=616070&r1=616069&r2=616070&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-jcr-commons/src/main/java/org/apache/jackrabbit/commons/xml/DefaultContentHandler.java (original)
+++ jackrabbit/trunk/jackrabbit-jcr-commons/src/main/java/org/apache/jackrabbit/commons/xml/DefaultContentHandler.java Mon Jan 28 13:54:12 2008
@@ -16,21 +16,8 @@
  */
 package org.apache.jackrabbit.commons.xml;
 
-import java.io.IOException;
-import java.io.InputStream;
-
-import javax.jcr.InvalidSerializedDataException;
-import javax.jcr.RepositoryException;
-import javax.xml.parsers.FactoryConfigurationError;
-import javax.xml.parsers.ParserConfigurationException;
-import javax.xml.parsers.SAXParser;
-import javax.xml.parsers.SAXParserFactory;
-
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 import org.xml.sax.Attributes;
 import org.xml.sax.ContentHandler;
-import org.xml.sax.InputSource;
 import org.xml.sax.Locator;
 import org.xml.sax.SAXException;
 import org.xml.sax.helpers.DefaultHandler;
@@ -44,12 +31,6 @@
 public class DefaultContentHandler extends DefaultHandler {
 
     /**
-     * Logger instance.
-     */
-    private static final Logger logger =
-        LoggerFactory.getLogger(DefaultContentHandler.class);
-
-    /**
      * The adapted content handler instance.
      */
     private final ContentHandler handler;
@@ -62,42 +43,6 @@
      */
     public DefaultContentHandler(ContentHandler handler) {
         this.handler = handler;
-    }
-
-    /**
-     * Utility method that parses the given input stream using this handler.
-     *
-     * @param in XML input stream
-     * @throws IOException if an I/O error occurs
-     * @throws RepositoryException if another error occurs
-     */
-    public void parse(InputStream in) throws IOException, RepositoryException {
-        try {
-            SAXParserFactory factory = SAXParserFactory.newInstance();
-            factory.setNamespaceAware(true);
-            factory.setFeature(
-                    "http://xml.org/sax/features/namespace-prefixes", false);
-
-            SAXParser parser = factory.newSAXParser();
-            // JCR-984 & JCR-985: Log the name of the SAXParser class
-            logger.debug("Using SAX parser " + parser.getClass().getName());
-            parser.parse(new InputSource(in), this);
-        } catch (FactoryConfigurationError e) {
-            throw new RepositoryException(
-                    "SAX parser implementation not available", e);
-        } catch (ParserConfigurationException e) {
-            throw new RepositoryException("SAX parser configuration error", e);
-        } catch (SAXException e) {
-            Exception exception = e.getException();
-            if (exception instanceof RepositoryException) {
-                throw (RepositoryException) exception;
-            } else if (exception instanceof IOException) {
-                throw (IOException) exception;
-            } else {
-                throw new InvalidSerializedDataException(
-                        "Error parsing XML import", e);
-            }
-        }
     }
 
     //------------------------------------------------------< ContentHandler >

Copied: jackrabbit/trunk/jackrabbit-jcr-commons/src/main/java/org/apache/jackrabbit/commons/xml/ParsingContentHandler.java (from r616047, jackrabbit/trunk/jackrabbit-jcr-commons/src/main/java/org/apache/jackrabbit/commons/xml/DefaultContentHandler.java)
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-jcr-commons/src/main/java/org/apache/jackrabbit/commons/xml/ParsingContentHandler.java?p2=jackrabbit/trunk/jackrabbit-jcr-commons/src/main/java/org/apache/jackrabbit/commons/xml/ParsingContentHandler.java&p1=jackrabbit/trunk/jackrabbit-jcr-commons/src/main/java/org/apache/jackrabbit/commons/xml/DefaultContentHandler.java&r1=616047&r2=616070&rev=616070&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-jcr-commons/src/main/java/org/apache/jackrabbit/commons/xml/DefaultContentHandler.java (original)
+++ jackrabbit/trunk/jackrabbit-jcr-commons/src/main/java/org/apache/jackrabbit/commons/xml/ParsingContentHandler.java Mon Jan 28 13:54:12 2008
@@ -19,40 +19,21 @@
 import java.io.IOException;
 import java.io.InputStream;
 
-import javax.jcr.InvalidSerializedDataException;
-import javax.jcr.RepositoryException;
-import javax.xml.parsers.FactoryConfigurationError;
 import javax.xml.parsers.ParserConfigurationException;
-import javax.xml.parsers.SAXParser;
 import javax.xml.parsers.SAXParserFactory;
 
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.xml.sax.Attributes;
 import org.xml.sax.ContentHandler;
 import org.xml.sax.InputSource;
-import org.xml.sax.Locator;
 import org.xml.sax.SAXException;
 import org.xml.sax.helpers.DefaultHandler;
 
 /**
- * Adapter class for exposing a {@link ContentHandler} instance as
- * {@link DefaultHandler} object.
+ * Utility class that decorates a {@link ContentHandler} instance with
+ * simple XML parsing capability.
  *
  * @since Jackrabbit JCR Commons 1.5
  */
-public class DefaultContentHandler extends DefaultHandler {
-
-    /**
-     * Logger instance.
-     */
-    private static final Logger logger =
-        LoggerFactory.getLogger(DefaultContentHandler.class);
-
-    /**
-     * The adapted content handler instance.
-     */
-    private final ContentHandler handler;
+public class ParsingContentHandler extends DefaultContentHandler {
 
     /**
      * Creates a {@link DefaultHandler} adapter for the given content
@@ -60,172 +41,26 @@
      *
      * @param handler content handler
      */
-    public DefaultContentHandler(ContentHandler handler) {
-        this.handler = handler;
+    public ParsingContentHandler(ContentHandler handler) {
+        super(handler);
     }
 
     /**
      * Utility method that parses the given input stream using this handler.
+     * The parser is namespace-aware.
      *
      * @param in XML input stream
      * @throws IOException if an I/O error occurs
-     * @throws RepositoryException if another error occurs
+     * @throws SAXException if an XML parsing error occurs
      */
-    public void parse(InputStream in) throws IOException, RepositoryException {
+    public void parse(InputStream in) throws IOException, SAXException {
         try {
             SAXParserFactory factory = SAXParserFactory.newInstance();
             factory.setNamespaceAware(true);
-            factory.setFeature(
-                    "http://xml.org/sax/features/namespace-prefixes", false);
-
-            SAXParser parser = factory.newSAXParser();
-            // JCR-984 & JCR-985: Log the name of the SAXParser class
-            logger.debug("Using SAX parser " + parser.getClass().getName());
-            parser.parse(new InputSource(in), this);
-        } catch (FactoryConfigurationError e) {
-            throw new RepositoryException(
-                    "SAX parser implementation not available", e);
+            factory.newSAXParser().parse(new InputSource(in), this);
         } catch (ParserConfigurationException e) {
-            throw new RepositoryException("SAX parser configuration error", e);
-        } catch (SAXException e) {
-            Exception exception = e.getException();
-            if (exception instanceof RepositoryException) {
-                throw (RepositoryException) exception;
-            } else if (exception instanceof IOException) {
-                throw (IOException) exception;
-            } else {
-                throw new InvalidSerializedDataException(
-                        "Error parsing XML import", e);
-            }
+            throw new SAXException("SAX parser configuration error", e);
         }
-    }
-
-    //------------------------------------------------------< ContentHandler >
-
-    /**
-     * Delegated to {@link #handler}.
-     *
-     * @param ch passed through
-     * @param start passed through
-     * @param length passed through
-     * @throws SAXException if an error occurs
-     */
-    public void characters(char[] ch, int start, int length)
-            throws SAXException {
-        handler.characters(ch, start, length);
-    }
-
-    /**
-     * Delegated to {@link #handler}.
-     *
-     * @throws SAXException if an error occurs
-     */
-    public void endDocument() throws SAXException {
-        handler.endDocument();
-    }
-
-    /**
-     * Delegated to {@link #handler}.
-     *
-     * @param namespaceURI passed through
-     * @param localName passed through
-     * @param qName passed through
-     * @throws SAXException if an error occurs
-     */
-    public void endElement(
-            String namespaceURI, String localName, String qName)
-            throws SAXException {
-        handler.endElement(namespaceURI, localName, qName);
-    }
-
-    /**
-     * Delegated to {@link #handler}.
-     *
-     * @param prefix passed through
-     * @throws SAXException if an error occurs
-     */
-    public void endPrefixMapping(String prefix) throws SAXException {
-        handler.endPrefixMapping(prefix);
-    }
-
-    /**
-     * Delegated to {@link #handler}.
-     *
-     * @param ch passed through
-     * @param start passed through
-     * @param length passed through
-     * @throws SAXException if an error occurs
-     */
-    public void ignorableWhitespace(char[] ch, int start, int length)
-            throws SAXException {
-        handler.ignorableWhitespace(ch, start, length);
-    }
-
-    /**
-     * Delegated to {@link #handler}.
-     *
-     * @param target passed through
-     * @param data passed through
-     * @throws SAXException if an error occurs
-     */
-    public void processingInstruction(String target, String data)
-            throws SAXException {
-        handler.processingInstruction(target, data);
-    }
-
-    /**
-     * Delegated to {@link #handler}.
-     *
-     * @param locator passed through
-     */
-    public void setDocumentLocator(Locator locator) {
-        handler.setDocumentLocator(locator);
-    }
-
-    /**
-     * Delegated to {@link #handler}.
-     *
-     * @param name passed through
-     * @throws SAXException if an error occurs
-     */
-    public void skippedEntity(String name) throws SAXException {
-        handler.skippedEntity(name);
-    }
-
-    /**
-     * Delegated to {@link #handler}.
-     *
-     * @throws SAXException if an error occurs
-     */
-    public void startDocument() throws SAXException {
-        handler.startDocument();
-    }
-
-    /**
-     * Delegated to {@link #handler}.
-     *
-     * @param namespaceURI passed through
-     * @param localName passed through
-     * @param qName passed through
-     * @param atts passed through
-     * @throws SAXException if an error occurs
-     */
-    public void startElement(
-            String namespaceURI, String localName, String qName,
-            Attributes atts) throws SAXException {
-        handler.startElement(namespaceURI, localName, qName, atts);
-    }
-
-    /**
-     * Delegated to {@link #handler}.
-     *
-     * @param prefix passed through
-     * @param uri passed through
-     * @throws SAXException if an error occurs
-     */
-    public void startPrefixMapping(String prefix, String uri)
-            throws SAXException {
-        handler.startPrefixMapping(prefix, uri);
     }
 
 }

Added: jackrabbit/trunk/jackrabbit-jcr-commons/src/test/java/org/apache/jackrabbit/commons/xml/ParsingContentHandlerTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-jcr-commons/src/test/java/org/apache/jackrabbit/commons/xml/ParsingContentHandlerTest.java?rev=616070&view=auto
==============================================================================
--- jackrabbit/trunk/jackrabbit-jcr-commons/src/test/java/org/apache/jackrabbit/commons/xml/ParsingContentHandlerTest.java (added)
+++ jackrabbit/trunk/jackrabbit-jcr-commons/src/test/java/org/apache/jackrabbit/commons/xml/ParsingContentHandlerTest.java Mon Jan 28 13:54:12 2008
@@ -0,0 +1,61 @@
+/*
+ * 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.
+ */
+package org.apache.jackrabbit.commons.xml;
+
+import java.io.ByteArrayInputStream;
+import java.io.StringWriter;
+
+import javax.xml.transform.stream.StreamResult;
+
+import junit.framework.TestCase;
+
+import org.xml.sax.ContentHandler;
+
+public class ParsingContentHandlerTest extends TestCase {
+
+    public void testSerializingContentHandler() throws Exception {
+        String source =
+            "<p:a xmlns:p=\"uri\"><b p:foo=\"bar\">abc</b><c/>xyz</p:a>";
+        StringWriter writer = new StringWriter();
+
+        ContentHandler handler =
+            SerializingContentHandler.getSerializer(new StreamResult(writer));
+        new ParsingContentHandler(handler).parse(
+                new ByteArrayInputStream(source.getBytes("UTF-8")));
+
+        String xml = writer.toString();
+        assertContains(xml, "<p:a");
+        assertContains(xml, "xmlns:p");
+        assertContains(xml, "=");
+        assertContains(xml, "uri");
+        assertContains(xml, ">");
+        assertContains(xml, "<b");
+        assertContains(xml, "p:foo");
+        assertContains(xml, "bar");
+        assertContains(xml, "abc");
+        assertContains(xml, "</b>");
+        assertContains(xml, "<c/>");
+        assertContains(xml, "xyz");
+        assertContains(xml, "</p:a>");
+    }
+
+    private void assertContains(String haystack, String needle) {
+        if (haystack.indexOf(needle) == -1) {
+            fail("'" + haystack + "' does not contain '" + needle+ "'");
+        }
+    }
+}