jaxp/src/com/sun/org/apache/xalan/internal/xsltc/trax/StAXStream2SAX.java
changeset 12457 c348e06f0e82
parent 12005 a754d69d5e60
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jaxp/src/com/sun/org/apache/xalan/internal/xsltc/trax/StAXStream2SAX.java	Thu Apr 12 08:38:26 2012 -0700
@@ -0,0 +1,550 @@
+/*
+ * Copyright (c) 2005, 2006, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package com.sun.org.apache.xalan.internal.xsltc.trax;
+
+import java.io.IOException;
+import java.util.Hashtable;
+import java.util.Stack;
+import java.util.Vector;
+import java.util.Iterator;
+
+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.Locator;
+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;
+import org.xml.sax.ext.Locator2;
+import org.xml.sax.helpers.AttributesImpl;
+import com.sun.org.apache.xalan.internal.xsltc.dom.SAXImpl;
+
+
+
+import javax.xml.namespace.QName;
+import javax.xml.stream.XMLStreamReader;
+import javax.xml.stream.XMLStreamConstants;
+import javax.xml.stream.XMLStreamException;
+import javax.xml.stream.events.Attribute;
+import javax.xml.stream.events.Characters;
+import javax.xml.stream.events.EndElement;
+import javax.xml.stream.events.Namespace;
+import javax.xml.stream.events.ProcessingInstruction;
+import javax.xml.stream.events.StartElement;
+import javax.xml.stream.events.StartDocument;
+import javax.xml.stream.events.XMLEvent;
+
+
+
+/**
+ * @author Padmaja Vedula
+ * @author Sunitha Reddy
+ */
+public class StAXStream2SAX implements XMLReader, Locator {
+
+    //private final static String EMPTYSTRING = "";
+    //private static final String XMLNS_PREFIX = "xmlns";
+
+    // StAX Stream source
+    private final XMLStreamReader staxStreamReader;
+
+    //private Node _dom = null;
+    private ContentHandler _sax = null;
+    private LexicalHandler _lex = null;
+    private SAXImpl _saxImpl = null;
+    //private Hashtable _nsPrefixes = new Hashtable();
+
+    public StAXStream2SAX(XMLStreamReader staxSrc) {
+            staxStreamReader = staxSrc;
+    }
+
+    public ContentHandler getContentHandler() {
+        return _sax;
+    }
+
+    public void setContentHandler(ContentHandler handler) throws
+        NullPointerException
+    {
+        _sax = handler;
+        if (handler instanceof LexicalHandler) {
+            _lex = (LexicalHandler) handler;
+        }
+
+        if (handler instanceof SAXImpl) {
+            _saxImpl = (SAXImpl)handler;
+        }
+    }
+
+
+    public void parse(InputSource unused) throws IOException, SAXException {
+        try {
+            bridge();
+        } catch (XMLStreamException e) {
+            throw new SAXException(e);
+        }
+    }
+
+
+    //Main Work Starts Here.
+    public void parse() throws IOException, SAXException, XMLStreamException {
+        bridge();
+    }
+
+
+   /**
+     * This class is only used internally so this method should never
+     * be called.
+     */
+    public void parse(String sysId) throws IOException, SAXException {
+        throw new IOException("This method is not yet implemented.");
+    }
+
+
+   public void bridge() throws XMLStreamException {
+
+        try {
+            // remembers the nest level of elements to know when we are done.
+            int depth=0;
+
+            // skip over START_DOCUMENT
+            int event = staxStreamReader.getEventType();
+            if (event == XMLStreamConstants.START_DOCUMENT) {
+                event = staxStreamReader.next();
+            }
+
+            // If not a START_ELEMENT (e.g., a DTD), skip to next tag
+            if (event != XMLStreamConstants.START_ELEMENT) {
+                event = staxStreamReader.nextTag();
+                // An error if a START_ELEMENT isn't found now
+                if (event != XMLStreamConstants.START_ELEMENT) {
+                    throw new IllegalStateException("The current event is " +
+                            "not START_ELEMENT\n but" + event);
+                }
+            }
+
+            handleStartDocument();
+
+            do {
+                // These are all of the events listed in the javadoc for
+                // XMLEvent.
+                // The spec only really describes 11 of them.
+                switch (event) {
+                    case XMLStreamConstants.START_ELEMENT :
+                        depth++;
+                        handleStartElement();
+                        break;
+                    case XMLStreamConstants.END_ELEMENT :
+                        handleEndElement();
+                        depth--;
+                        break;
+                    case XMLStreamConstants.CHARACTERS :
+                        handleCharacters();
+                        break;
+                    case XMLStreamConstants.ENTITY_REFERENCE :
+                        handleEntityReference();
+                        break;
+                    case XMLStreamConstants.PROCESSING_INSTRUCTION :
+                        handlePI();
+                        break;
+                    case XMLStreamConstants.COMMENT :
+                        handleComment();
+                        break;
+                    case XMLStreamConstants.DTD :
+                        handleDTD();
+                        break;
+                    case XMLStreamConstants.ATTRIBUTE :
+                        handleAttribute();
+                        break;
+                    case XMLStreamConstants.NAMESPACE :
+                        handleNamespace();
+                        break;
+                    case XMLStreamConstants.CDATA :
+                        handleCDATA();
+                        break;
+                    case XMLStreamConstants.ENTITY_DECLARATION :
+                        handleEntityDecl();
+                        break;
+                    case XMLStreamConstants.NOTATION_DECLARATION :
+                        handleNotationDecl();
+                        break;
+                    case XMLStreamConstants.SPACE :
+                        handleSpace();
+                        break;
+                    default :
+                        throw new InternalError("processing event: " + event);
+                }
+
+                event=staxStreamReader.next();
+            } while (depth!=0);
+
+            handleEndDocument();
+        } catch (SAXException e) {
+            throw new XMLStreamException(e);
+        }
+    }
+
+    private void handleEndDocument() throws SAXException {
+        _sax.endDocument();
+    }
+
+    private void handleStartDocument() throws SAXException {
+        _sax.setDocumentLocator(new Locator2() {
+            public int getColumnNumber() {
+                return staxStreamReader.getLocation().getColumnNumber();
+            }
+            public int getLineNumber() {
+                return staxStreamReader.getLocation().getLineNumber();
+            }
+            public String getPublicId() {
+                return staxStreamReader.getLocation().getPublicId();
+            }
+            public String getSystemId() {
+                return staxStreamReader.getLocation().getSystemId();
+            }
+            public String getXMLVersion() {
+                return staxStreamReader.getVersion();
+            }
+            public String getEncoding() {
+                return staxStreamReader.getEncoding();
+            }
+         });
+        _sax.startDocument();
+    }
+
+    private void handlePI() throws XMLStreamException {
+        try {
+            _sax.processingInstruction(
+                staxStreamReader.getPITarget(),
+                staxStreamReader.getPIData());
+        } catch (SAXException e) {
+            throw new XMLStreamException(e);
+        }
+    }
+
+    private void handleCharacters() throws XMLStreamException {
+
+        // workaround for bugid 5046319 - switch over to commented section
+        // below when it is fixed.
+        int textLength = staxStreamReader.getTextLength();
+        char[] chars = new char[textLength];
+
+        staxStreamReader.getTextCharacters(0, chars, 0, textLength);
+
+        try {
+            _sax.characters(chars, 0, chars.length);
+        } catch (SAXException e) {
+            throw new XMLStreamException(e);
+        }
+
+
+//        int start = 0;
+//        int len;
+//        do {
+//            len = staxStreamReader.getTextCharacters(start, buf, 0, buf.length);
+//            start += len;
+//            try {
+//                _sax.characters(buf, 0, len);
+//            } catch (SAXException e) {
+//                throw new XMLStreamException(e);
+//            }
+//        } while (len == buf.length);
+    }
+
+    private void handleEndElement() throws XMLStreamException {
+        QName qName = staxStreamReader.getName();
+
+        try {
+            //construct prefix:localName from qName
+            String qname = "";
+            if (qName.getPrefix() != null && qName.getPrefix().trim().length() != 0){
+                qname = qName.getPrefix() + ":";
+            }
+            qname += qName.getLocalPart();
+
+            // fire endElement
+            _sax.endElement(
+                qName.getNamespaceURI(),
+                qName.getLocalPart(),
+                qname);
+
+            // end namespace bindings
+            int nsCount = staxStreamReader.getNamespaceCount();
+            for (int i = nsCount - 1; i >= 0; i--) {
+                String prefix = staxStreamReader.getNamespacePrefix(i);
+                if (prefix == null) { // true for default namespace
+                    prefix = "";
+                }
+                _sax.endPrefixMapping(prefix);
+            }
+        } catch (SAXException e) {
+            throw new XMLStreamException(e);
+        }
+    }
+
+    private void handleStartElement() throws XMLStreamException {
+
+        try {
+            // start namespace bindings
+            int nsCount = staxStreamReader.getNamespaceCount();
+            for (int i = 0; i < nsCount; i++) {
+                String prefix = staxStreamReader.getNamespacePrefix(i);
+                if (prefix == null) { // true for default namespace
+                    prefix = "";
+                }
+                _sax.startPrefixMapping(
+                    prefix,
+                    staxStreamReader.getNamespaceURI(i));
+            }
+
+            // fire startElement
+            QName qName = staxStreamReader.getName();
+            String prefix = qName.getPrefix();
+            String rawname;
+            if(prefix==null || prefix.length()==0)
+                rawname = qName.getLocalPart();
+            else
+                rawname = prefix + ':' + qName.getLocalPart();
+            Attributes attrs = getAttributes();
+            _sax.startElement(
+                qName.getNamespaceURI(),
+                qName.getLocalPart(),
+                rawname,
+                attrs);
+        } catch (SAXException e) {
+            throw new XMLStreamException(e);
+        }
+    }
+
+    /**
+     * Get the attributes associated with the given START_ELEMENT or ATTRIBUTE
+     * StAXevent.
+     *
+     * @return the StAX attributes converted to an org.xml.sax.Attributes
+     */
+    private Attributes getAttributes() {
+        AttributesImpl attrs = new AttributesImpl();
+
+        int eventType = staxStreamReader.getEventType();
+        if (eventType != XMLStreamConstants.ATTRIBUTE
+            && eventType != XMLStreamConstants.START_ELEMENT) {
+            throw new InternalError(
+                "getAttributes() attempting to process: " + eventType);
+        }
+
+        // in SAX, namespace declarations are not part of attributes by default.
+        // (there's a property to control that, but as far as we are concerned
+        // we don't use it.) So don't add xmlns:* to attributes.
+
+        // gather non-namespace attrs
+        for (int i = 0; i < staxStreamReader.getAttributeCount(); i++) {
+            String uri = staxStreamReader.getAttributeNamespace(i);
+            if(uri==null)   uri="";
+            String localName = staxStreamReader.getAttributeLocalName(i);
+            String prefix = staxStreamReader.getAttributePrefix(i);
+            String qName;
+            if(prefix==null || prefix.length()==0)
+                qName = localName;
+            else
+                qName = prefix + ':' + localName;
+            String type = staxStreamReader.getAttributeType(i);
+            String value = staxStreamReader.getAttributeValue(i);
+
+            attrs.addAttribute(uri, localName, qName, type, value);
+        }
+
+        return attrs;
+    }
+
+    private void handleNamespace() {
+        // no-op ???
+        // namespace events don't normally occur outside of a startElement
+        // or endElement
+    }
+
+    private void handleAttribute() {
+        // no-op ???
+        // attribute events don't normally occur outside of a startElement
+        // or endElement
+    }
+
+    private void handleDTD() {
+        // no-op ???
+        // it seems like we need to pass this info along, but how?
+    }
+
+    private void handleComment() {
+        // no-op ???
+    }
+
+    private void handleEntityReference() {
+        // no-op ???
+    }
+
+    private void handleSpace() {
+        // no-op ???
+        // this event is listed in the javadoc, but not in the spec.
+    }
+
+    private void handleNotationDecl() {
+        // no-op ???
+        // this event is listed in the javadoc, but not in the spec.
+    }
+
+    private void handleEntityDecl() {
+        // no-op ???
+        // this event is listed in the javadoc, but not in the spec.
+    }
+
+    private void handleCDATA() {
+        // no-op ???
+        // this event is listed in the javadoc, but not in the spec.
+    }
+
+
+    /**
+     * This class is only used internally so this method should never
+     * be called.
+     */
+    public DTDHandler getDTDHandler() {
+        return null;
+    }
+
+    /**
+     * This class is only used internally so this method should never
+     * be called.
+     */
+    public ErrorHandler getErrorHandler() {
+        return null;
+    }
+
+    /**
+     * This class is only used internally so this method should never
+     * be called.
+     */
+    public boolean getFeature(String name) throws SAXNotRecognizedException,
+        SAXNotSupportedException
+    {
+        return false;
+    }
+
+    /**
+     * This class is only used internally so this method should never
+     * be called.
+     */
+    public void setFeature(String name, boolean value) throws
+        SAXNotRecognizedException, SAXNotSupportedException
+    {
+    }
+
+    /**
+     * This class is only used internally so this method should never
+     * be called.
+     */
+    public void setDTDHandler(DTDHandler handler) throws NullPointerException {
+    }
+
+    /**
+     * This class is only used internally so this method should never
+     * be called.
+     */
+    public void setEntityResolver(EntityResolver resolver) throws
+        NullPointerException
+    {
+    }
+
+    /**
+     * This class is only used internally so this method should never
+     * be called.
+     */
+    public EntityResolver getEntityResolver() {
+        return null;
+    }
+
+    /**
+     * This class is only used internally so this method should never
+     * be called.
+     */
+    public void setErrorHandler(ErrorHandler handler) throws
+        NullPointerException
+    {
+    }
+
+    /**
+     * This class is only used internally so this method should never
+     * be called.
+     */
+    public void setProperty(String name, Object value) throws
+        SAXNotRecognizedException, SAXNotSupportedException {
+    }
+
+    /**
+     * This class is only used internally so this method should never
+     * be called.
+     */
+    public Object getProperty(String name) throws SAXNotRecognizedException,
+        SAXNotSupportedException
+    {
+        return null;
+    }
+
+    /**
+     * This class is only used internally so this method should never
+     * be called.
+     */
+    public int getColumnNumber() {
+        return 0;
+    }
+
+    /**
+     * This class is only used internally so this method should never
+     * be called.
+     */
+    public int getLineNumber() {
+        return 0;
+    }
+
+    /**
+     * This class is only used internally so this method should never
+     * be called.
+     */
+    public String getPublicId() {
+        return null;
+    }
+
+    /**
+     * This class is only used internally so this method should never
+     * be called.
+     */
+    public String getSystemId() {
+        return null;
+    }
+
+}