You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ws.apache.org by ve...@apache.org on 2011/04/04 18:47:43 UTC

svn commit: r1088682 - in /webservices/commons/trunk/modules/axiom/modules/axiom-api/src/main/java/org/apache/axiom: om/ om/impl/ om/impl/builder/ om/impl/serialize/ util/sax/

Author: veithen
Date: Mon Apr  4 16:47:42 2011
New Revision: 1088682

URL: http://svn.apache.org/viewvc?rev=1088682&view=rev
Log:
AXIOM-353: Also integrated SAXOMBuilder into the OMXMLParserWrapper/OMXMLBuilderFactory/OMMetaFactory API. This will allow alternative implementations of the Axiom API to do extra optimizations that will benefit e.g. to the XmlBeans databinding in Axis2.

Added:
    webservices/commons/trunk/modules/axiom/modules/axiom-api/src/main/java/org/apache/axiom/om/impl/builder/SAXOMXMLParserWrapper.java   (with props)
    webservices/commons/trunk/modules/axiom/modules/axiom-api/src/main/java/org/apache/axiom/util/sax/
    webservices/commons/trunk/modules/axiom/modules/axiom-api/src/main/java/org/apache/axiom/util/sax/AbstractXMLReader.java   (with props)
Modified:
    webservices/commons/trunk/modules/axiom/modules/axiom-api/src/main/java/org/apache/axiom/om/OMMetaFactory.java
    webservices/commons/trunk/modules/axiom/modules/axiom-api/src/main/java/org/apache/axiom/om/OMXMLBuilderFactory.java
    webservices/commons/trunk/modules/axiom/modules/axiom-api/src/main/java/org/apache/axiom/om/impl/AbstractOMMetaFactory.java
    webservices/commons/trunk/modules/axiom/modules/axiom-api/src/main/java/org/apache/axiom/om/impl/serialize/OMXMLReader.java

Modified: webservices/commons/trunk/modules/axiom/modules/axiom-api/src/main/java/org/apache/axiom/om/OMMetaFactory.java
URL: http://svn.apache.org/viewvc/webservices/commons/trunk/modules/axiom/modules/axiom-api/src/main/java/org/apache/axiom/om/OMMetaFactory.java?rev=1088682&r1=1088681&r2=1088682&view=diff
==============================================================================
--- webservices/commons/trunk/modules/axiom/modules/axiom-api/src/main/java/org/apache/axiom/om/OMMetaFactory.java (original)
+++ webservices/commons/trunk/modules/axiom/modules/axiom-api/src/main/java/org/apache/axiom/om/OMMetaFactory.java Mon Apr  4 16:47:42 2011
@@ -20,6 +20,7 @@
 package org.apache.axiom.om;
 
 import javax.xml.stream.XMLStreamReader;
+import javax.xml.transform.sax.SAXSource;
 
 import org.apache.axiom.om.util.StAXParserConfiguration;
 import org.apache.axiom.soap.SOAPFactory;
@@ -97,6 +98,21 @@ public interface OMMetaFactory {
     OMXMLParserWrapper createOMBuilder(OMFactory omFactory, StAXParserConfiguration configuration, InputSource is);
     
     /**
+     * Create an object model builder for plain XML that gets its input from a {@link SAXSource}.
+     * 
+     * @param omFactory
+     *            The object model factory to use. This factory must be obtained from the same
+     *            {@link OMMetaFactory} instance as the one used to invoke this method. In general
+     *            the factory will be retrieved from {@link #getOMFactory()}), but in some cases it
+     *            may be necessary to pass a {@link SOAPFactory} instance, although this method will
+     *            never produce a SOAP infoset.
+     * @param source
+     *            the source of the XML document
+     * @return the builder
+     */
+    OMXMLParserWrapper createSAXOMBuilder(OMFactory omFactory, SAXSource source);
+    
+    /**
      * Create an object model builder for SOAP that pulls events from a StAX stream reader. The
      * implementation will select the appropriate {@link SOAPFactory} based on the namespace URI of
      * the SOAP envelope.

Modified: webservices/commons/trunk/modules/axiom/modules/axiom-api/src/main/java/org/apache/axiom/om/OMXMLBuilderFactory.java
URL: http://svn.apache.org/viewvc/webservices/commons/trunk/modules/axiom/modules/axiom-api/src/main/java/org/apache/axiom/om/OMXMLBuilderFactory.java?rev=1088682&r1=1088681&r2=1088682&view=diff
==============================================================================
--- webservices/commons/trunk/modules/axiom/modules/axiom-api/src/main/java/org/apache/axiom/om/OMXMLBuilderFactory.java (original)
+++ webservices/commons/trunk/modules/axiom/modules/axiom-api/src/main/java/org/apache/axiom/om/OMXMLBuilderFactory.java Mon Apr  4 16:47:42 2011
@@ -22,6 +22,7 @@ import java.io.InputStream;
 import java.io.Reader;
 
 import javax.xml.stream.XMLStreamReader;
+import javax.xml.transform.sax.SAXSource;
 
 import org.apache.axiom.om.util.StAXParserConfiguration;
 import org.apache.axiom.soap.SOAPFactory;
@@ -180,6 +181,33 @@ public class OMXMLBuilderFactory {
     }
     
     /**
+     * Create an object model builder that reads a plain XML document from the provided
+     * {@link SAXSource}.
+     * 
+     * @param source
+     *            the source of the XML document
+     * @return the builder
+     */
+    public static OMXMLParserWrapper createSAXOMBuilder(SAXSource source) {
+        OMMetaFactory metaFactory = OMAbstractFactory.getMetaFactory();
+        return metaFactory.createSAXOMBuilder(metaFactory.getOMFactory(), source);
+    }
+    
+    /**
+     * Create an object model builder that reads an XML document from the provided {@link SAXSource}
+     * using a specified object model factory.
+     * 
+     * @param omFactory
+     *            the object model factory to use
+     * @param source
+     *            the source of the XML document
+     * @return the builder
+     */
+    public static OMXMLParserWrapper createSAXOMBuilder(OMFactory omFactory, SAXSource source) {
+        return omFactory.getMetaFactory().createSAXOMBuilder(omFactory, source);
+    }
+    
+    /**
      * Create an object model builder for SOAP that pulls events from a StAX stream reader.
      * The method will select the appropriate {@link SOAPFactory}
      * based on the namespace URI of the SOAP envelope.

Modified: webservices/commons/trunk/modules/axiom/modules/axiom-api/src/main/java/org/apache/axiom/om/impl/AbstractOMMetaFactory.java
URL: http://svn.apache.org/viewvc/webservices/commons/trunk/modules/axiom/modules/axiom-api/src/main/java/org/apache/axiom/om/impl/AbstractOMMetaFactory.java?rev=1088682&r1=1088681&r2=1088682&view=diff
==============================================================================
--- webservices/commons/trunk/modules/axiom/modules/axiom-api/src/main/java/org/apache/axiom/om/impl/AbstractOMMetaFactory.java (original)
+++ webservices/commons/trunk/modules/axiom/modules/axiom-api/src/main/java/org/apache/axiom/om/impl/AbstractOMMetaFactory.java Mon Apr  4 16:47:42 2011
@@ -20,11 +20,13 @@ package org.apache.axiom.om.impl;
 
 import javax.xml.stream.XMLStreamException;
 import javax.xml.stream.XMLStreamReader;
+import javax.xml.transform.sax.SAXSource;
 
 import org.apache.axiom.om.OMException;
 import org.apache.axiom.om.OMFactory;
 import org.apache.axiom.om.OMMetaFactory;
 import org.apache.axiom.om.OMXMLParserWrapper;
+import org.apache.axiom.om.impl.builder.SAXOMXMLParserWrapper;
 import org.apache.axiom.om.impl.builder.StAXOMBuilder;
 import org.apache.axiom.om.util.StAXParserConfiguration;
 import org.apache.axiom.om.util.StAXUtils;
@@ -69,6 +71,10 @@ public abstract class AbstractOMMetaFact
     public OMXMLParserWrapper createOMBuilder(OMFactory omFactory, StAXParserConfiguration configuration, InputSource is) {
         return createStAXOMBuilder(omFactory, createXMLStreamReader(configuration, is));
     }
+    
+    public OMXMLParserWrapper createSAXOMBuilder(OMFactory omFactory, SAXSource source) {
+        return new SAXOMXMLParserWrapper(omFactory, source);
+    }
 
     public SOAPModelBuilder createStAXSOAPModelBuilder(XMLStreamReader parser) {
         StAXSOAPModelBuilder builder = new StAXSOAPModelBuilder(this, parser);

Added: webservices/commons/trunk/modules/axiom/modules/axiom-api/src/main/java/org/apache/axiom/om/impl/builder/SAXOMXMLParserWrapper.java
URL: http://svn.apache.org/viewvc/webservices/commons/trunk/modules/axiom/modules/axiom-api/src/main/java/org/apache/axiom/om/impl/builder/SAXOMXMLParserWrapper.java?rev=1088682&view=auto
==============================================================================
--- webservices/commons/trunk/modules/axiom/modules/axiom-api/src/main/java/org/apache/axiom/om/impl/builder/SAXOMXMLParserWrapper.java (added)
+++ webservices/commons/trunk/modules/axiom/modules/axiom-api/src/main/java/org/apache/axiom/om/impl/builder/SAXOMXMLParserWrapper.java Mon Apr  4 16:47:42 2011
@@ -0,0 +1,131 @@
+/*
+ * 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.axiom.om.impl.builder;
+
+import java.io.IOException;
+
+import javax.xml.transform.sax.SAXSource;
+
+import org.apache.axiom.om.OMDocument;
+import org.apache.axiom.om.OMElement;
+import org.apache.axiom.om.OMException;
+import org.apache.axiom.om.OMFactory;
+import org.apache.axiom.om.OMXMLParserWrapper;
+import org.xml.sax.ContentHandler;
+import org.xml.sax.SAXException;
+import org.xml.sax.XMLReader;
+
+/**
+ * {@link OMXMLParserWrapper} implementation for SAX parsers. By "SAX parser" we mean anything that
+ * is able to write a sequence of events to a SAX {@link ContentHandler}.
+ * <p>
+ * <b>Note:</b> This is a very naive implementation. Other implementations of the Axiom API may
+ * provide smarter implementations. For example, in theory it should be possible to defer the
+ * invocation of the parser until the {@link OMElement} object returned by
+ * {@link #getDocumentElement()} is accessed.
+ */
+public class SAXOMXMLParserWrapper implements OMXMLParserWrapper {
+    private final OMFactory factory;
+    private final SAXSource source;
+    private OMDocument document;
+
+    public SAXOMXMLParserWrapper(OMFactory factory, SAXSource source) {
+        this.factory = factory;
+        this.source = source;
+    }
+
+    public OMDocument getDocument() {
+        if (document == null) {
+            SAXOMBuilder builder = new SAXOMBuilder(factory);
+            XMLReader reader = source.getXMLReader();
+            reader.setContentHandler(builder);
+            try {
+                reader.parse(source.getInputSource());
+            } catch (IOException ex) {
+                throw new OMException(ex);
+            } catch (SAXException ex) {
+                throw new OMException(ex);
+            }
+        }
+        return document;
+    }
+
+    public OMElement getDocumentElement() {
+        return getDocument().getOMDocumentElement();
+    }
+
+    public OMElement getDocumentElement(boolean discardDocument) {
+        return getDocumentElement();
+    }
+
+    public void close() {
+        // TODO
+        throw new UnsupportedOperationException();
+    }
+
+    public void discard(OMElement el) throws OMException {
+        // TODO
+        throw new UnsupportedOperationException();
+    }
+
+    public short getBuilderType() {
+        // TODO
+        throw new UnsupportedOperationException();
+    }
+
+    public String getCharacterEncoding() {
+        // TODO
+        throw new UnsupportedOperationException();
+    }
+
+    public Object getParser() {
+        // TODO
+        throw new UnsupportedOperationException();
+    }
+
+    public Object getRegisteredContentHandler() {
+        // TODO
+        throw new UnsupportedOperationException();
+    }
+
+    public boolean isCache() {
+        // TODO
+        throw new UnsupportedOperationException();
+    }
+
+    public boolean isCompleted() {
+        // TODO
+        throw new UnsupportedOperationException();
+    }
+
+    public int next() throws OMException {
+        // TODO
+        throw new UnsupportedOperationException();
+    }
+
+    public void registerExternalContentHandler(Object obj) {
+        // TODO
+        throw new UnsupportedOperationException();
+    }
+
+    public void setCache(boolean b) throws OMException {
+        // TODO
+        throw new UnsupportedOperationException();
+    }
+}

Propchange: webservices/commons/trunk/modules/axiom/modules/axiom-api/src/main/java/org/apache/axiom/om/impl/builder/SAXOMXMLParserWrapper.java
------------------------------------------------------------------------------
    svn:eol-style = native

Modified: webservices/commons/trunk/modules/axiom/modules/axiom-api/src/main/java/org/apache/axiom/om/impl/serialize/OMXMLReader.java
URL: http://svn.apache.org/viewvc/webservices/commons/trunk/modules/axiom/modules/axiom-api/src/main/java/org/apache/axiom/om/impl/serialize/OMXMLReader.java?rev=1088682&r1=1088681&r2=1088682&view=diff
==============================================================================
--- webservices/commons/trunk/modules/axiom/modules/axiom-api/src/main/java/org/apache/axiom/om/impl/serialize/OMXMLReader.java (original)
+++ webservices/commons/trunk/modules/axiom/modules/axiom-api/src/main/java/org/apache/axiom/om/impl/serialize/OMXMLReader.java Mon Apr  4 16:47:42 2011
@@ -34,17 +34,12 @@ import org.apache.axiom.om.OMNamespace;
 import org.apache.axiom.om.OMNode;
 import org.apache.axiom.om.OMProcessingInstruction;
 import org.apache.axiom.om.OMText;
+import org.apache.axiom.util.sax.AbstractXMLReader;
 import org.xml.sax.Attributes;
 import org.xml.sax.ContentHandler;
-import org.xml.sax.DTDHandler;
-import org.xml.sax.EntityResolver;
-import org.xml.sax.ErrorHandler;
 import org.xml.sax.InputSource;
 import org.xml.sax.SAXException;
-import org.xml.sax.SAXNotRecognizedException;
-import org.xml.sax.SAXNotSupportedException;
 import org.xml.sax.XMLReader;
-import org.xml.sax.ext.LexicalHandler;
 
 /**
  * SAX {@link XMLReader} implementation that traverses a given OM tree and invokes the
@@ -66,97 +61,14 @@ import org.xml.sax.ext.LexicalHandler;
  * aware of the namespace mapping for the <tt>ns</tt> prefix, even if the serialization starts
  * only at the child element.
  */
-public class OMXMLReader implements XMLReader {
-    private static final String URI_LEXICAL_HANDLER = "http://xml.org/sax/properties/lexical-handler";
-    
+public class OMXMLReader extends AbstractXMLReader {
     private final OMElement element;
     private final AttributesAdapter attributesAdapter = new AttributesAdapter();
     
-    private boolean namespaces = true;
-    private boolean namespacePrefixes = false;
-    
-    private ContentHandler contentHandler;
-    private LexicalHandler lexicalHandler;
-    private DTDHandler dtdHandler;
-    private EntityResolver entityResolver;
-    private ErrorHandler errorHandler;
-    
     public OMXMLReader(OMElement element) {
         this.element = element;
     }
 
-    public ContentHandler getContentHandler() {
-        return contentHandler;
-    }
-
-    public void setContentHandler(ContentHandler contentHandler) {
-        this.contentHandler = contentHandler;
-    }
-
-    public DTDHandler getDTDHandler() {
-        return dtdHandler;
-    }
-
-    public void setDTDHandler(DTDHandler dtdHandler) {
-        this.dtdHandler = dtdHandler;
-    }
-
-    public EntityResolver getEntityResolver() {
-        return entityResolver;
-    }
-
-    public void setEntityResolver(EntityResolver entityResolver) {
-        this.entityResolver = entityResolver;
-    }
-
-    public ErrorHandler getErrorHandler() {
-        return errorHandler;
-    }
-
-    public void setErrorHandler(ErrorHandler errorHandler) {
-        this.errorHandler = errorHandler;
-    }
-
-    public boolean getFeature(String name)
-            throws SAXNotRecognizedException, SAXNotSupportedException {
-        throw new SAXNotRecognizedException(name);
-    }
-
-    public void setFeature(String name, boolean value)
-            throws SAXNotRecognizedException, SAXNotSupportedException {
-        
-        if ("http://xml.org/sax/features/namespaces".equals(name)) {
-            namespaces = value;
-        } else if ("http://xml.org/sax/features/namespace-prefixes".equals(name)) {
-            namespacePrefixes = value;
-        } else {
-            throw new SAXNotRecognizedException(name);
-        }
-    }
-
-    public Object getProperty(String name)
-            throws SAXNotRecognizedException, SAXNotSupportedException {
-        
-        if ("http://xml.org/sax/features/namespaces".equals(name)) {
-            return Boolean.valueOf(namespaces);
-        } else if ("http://xml.org/sax/features/namespace-prefixes".equals(name)) {
-            return Boolean.valueOf(namespacePrefixes);
-        } else if (URI_LEXICAL_HANDLER.equals(name)) {
-            return lexicalHandler;
-        } else {
-            throw new SAXNotRecognizedException(name);
-        }
-    }
-
-    public void setProperty(String name, Object value)
-            throws SAXNotRecognizedException, SAXNotSupportedException {
-        if (URI_LEXICAL_HANDLER.equals(name)) {
-            lexicalHandler = (LexicalHandler)value;
-        } else {
-            throw new SAXNotRecognizedException(name);
-        }
-    }
-
     public void parse(InputSource input) throws IOException, SAXException {
         parse();
     }

Added: webservices/commons/trunk/modules/axiom/modules/axiom-api/src/main/java/org/apache/axiom/util/sax/AbstractXMLReader.java
URL: http://svn.apache.org/viewvc/webservices/commons/trunk/modules/axiom/modules/axiom-api/src/main/java/org/apache/axiom/util/sax/AbstractXMLReader.java?rev=1088682&view=auto
==============================================================================
--- webservices/commons/trunk/modules/axiom/modules/axiom-api/src/main/java/org/apache/axiom/util/sax/AbstractXMLReader.java (added)
+++ webservices/commons/trunk/modules/axiom/modules/axiom-api/src/main/java/org/apache/axiom/util/sax/AbstractXMLReader.java Mon Apr  4 16:47:42 2011
@@ -0,0 +1,122 @@
+/*
+ * 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.axiom.util.sax;
+
+import org.xml.sax.ContentHandler;
+import org.xml.sax.DTDHandler;
+import org.xml.sax.EntityResolver;
+import org.xml.sax.ErrorHandler;
+import org.xml.sax.InputSource;
+import org.xml.sax.SAXNotRecognizedException;
+import org.xml.sax.SAXNotSupportedException;
+import org.xml.sax.XMLReader;
+import org.xml.sax.ext.LexicalHandler;
+
+/**
+ * Partial implementation of the {@link XMLReader} interface. It implements all the getters and
+ * setters so that subclasses only need to implement {@link XMLReader#parse(InputSource)} and
+ * {@link XMLReader#parse(String)}. Subclasses can access the various handlers and properties set on
+ * the reader through protected attributes.
+ */
+public abstract class AbstractXMLReader implements XMLReader {
+    private static final String URI_LEXICAL_HANDLER = "http://xml.org/sax/properties/lexical-handler";
+    
+    protected boolean namespaces = true;
+    protected boolean namespacePrefixes = false;
+    
+    protected ContentHandler contentHandler;
+    protected LexicalHandler lexicalHandler;
+    protected DTDHandler dtdHandler;
+    protected EntityResolver entityResolver;
+    protected ErrorHandler errorHandler;
+    
+    public ContentHandler getContentHandler() {
+        return contentHandler;
+    }
+
+    public void setContentHandler(ContentHandler contentHandler) {
+        this.contentHandler = contentHandler;
+    }
+
+    public DTDHandler getDTDHandler() {
+        return dtdHandler;
+    }
+
+    public void setDTDHandler(DTDHandler dtdHandler) {
+        this.dtdHandler = dtdHandler;
+    }
+
+    public EntityResolver getEntityResolver() {
+        return entityResolver;
+    }
+
+    public void setEntityResolver(EntityResolver entityResolver) {
+        this.entityResolver = entityResolver;
+    }
+
+    public ErrorHandler getErrorHandler() {
+        return errorHandler;
+    }
+
+    public void setErrorHandler(ErrorHandler errorHandler) {
+        this.errorHandler = errorHandler;
+    }
+
+    public boolean getFeature(String name)
+            throws SAXNotRecognizedException, SAXNotSupportedException {
+        throw new SAXNotRecognizedException(name);
+    }
+
+    public void setFeature(String name, boolean value)
+            throws SAXNotRecognizedException, SAXNotSupportedException {
+        
+        if ("http://xml.org/sax/features/namespaces".equals(name)) {
+            namespaces = value;
+        } else if ("http://xml.org/sax/features/namespace-prefixes".equals(name)) {
+            namespacePrefixes = value;
+        } else {
+            throw new SAXNotRecognizedException(name);
+        }
+    }
+
+    public Object getProperty(String name)
+            throws SAXNotRecognizedException, SAXNotSupportedException {
+        
+        if ("http://xml.org/sax/features/namespaces".equals(name)) {
+            return Boolean.valueOf(namespaces);
+        } else if ("http://xml.org/sax/features/namespace-prefixes".equals(name)) {
+            return Boolean.valueOf(namespacePrefixes);
+        } else if (URI_LEXICAL_HANDLER.equals(name)) {
+            return lexicalHandler;
+        } else {
+            throw new SAXNotRecognizedException(name);
+        }
+    }
+
+    public void setProperty(String name, Object value)
+            throws SAXNotRecognizedException, SAXNotSupportedException {
+        if (URI_LEXICAL_HANDLER.equals(name)) {
+            lexicalHandler = (LexicalHandler)value;
+        } else {
+            throw new SAXNotRecognizedException(name);
+        }
+    }
+
+
+}

Propchange: webservices/commons/trunk/modules/axiom/modules/axiom-api/src/main/java/org/apache/axiom/util/sax/AbstractXMLReader.java
------------------------------------------------------------------------------
    svn:eol-style = native