All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.eclipse.persistence.internal.oxm.record.XMLStreamReaderReader Maven / Gradle / Ivy

There is a newer version: 4.0.2
Show newest version
/*
 * Copyright (c) 1998, 2020 Oracle and/or its affiliates. All rights reserved.
 *
 * This program and the accompanying materials are made available under the
 * terms of the Eclipse Public License v. 2.0 which is available at
 * http://www.eclipse.org/legal/epl-2.0,
 * or the Eclipse Distribution License v. 1.0 which is available at
 * http://www.eclipse.org/org/documents/edl-v10.php.
 *
 * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
 */

// Contributors:
//     bdoughan - June 24/2009 - 2.0 - Initial implementation
package org.eclipse.persistence.internal.oxm.record;

import javax.xml.stream.XMLStreamReader;

import org.eclipse.persistence.internal.oxm.Constants;
import org.eclipse.persistence.internal.oxm.Unmarshaller;
import org.eclipse.persistence.internal.oxm.record.namespaces.UnmarshalNamespaceContext;
import org.xml.sax.ContentHandler;
import org.xml.sax.InputSource;
import org.xml.sax.Locator;
import org.xml.sax.SAXException;
import org.xml.sax.ext.Locator2;

/**
 * Convert an XMLStreamReader into SAX events.
 */
public class XMLStreamReaderReader extends XMLReaderAdapter {

    private int depth = 0;
    private UnmarshalNamespaceContext unmarshalNamespaceContext;
    private XMLStreamReaderAttributes indexedAttributeList;
    private boolean qNameAware;
    private XMLStreamReader xmlStreamReader;

    public XMLStreamReaderReader() {
        unmarshalNamespaceContext = new UnmarshalNamespaceContext();
        indexedAttributeList = new XMLStreamReaderAttributes();
    }

    public XMLStreamReaderReader(Unmarshaller xmlUnmarshaller) {
        super(xmlUnmarshaller);
        unmarshalNamespaceContext = new UnmarshalNamespaceContext();
        indexedAttributeList = new XMLStreamReaderAttributes();
    }

    @Override
    public Locator getLocator(){
        if(locator == null){
            locator = new StreamReaderLocator(xmlStreamReader);
        }
        return locator;
    }

    @Override
    public void setContentHandler (ContentHandler handler) {
        if(handler instanceof UnmarshalRecord){
            ((UnmarshalRecord)handler).setUnmarshalNamespaceResolver(unmarshalNamespaceContext);
            qNameAware = false;
            if(null == validatingContentHandler) {
                this.contentHandler = (UnmarshalRecord) handler;
            }else{
                 validatingContentHandler.setContentHandler(handler);
            }
        }else if(handler instanceof SAXUnmarshallerHandler){
            ((SAXUnmarshallerHandler)handler).setUnmarshalNamespaceResolver(unmarshalNamespaceContext);
            qNameAware = true;
            if(null == validatingContentHandler) {
                this.contentHandler = (SAXUnmarshallerHandler) handler;
            }else{
                 validatingContentHandler.setContentHandler(handler);
            }
        } else {
            super.setContentHandler(handler);
            qNameAware = true;
        }
    }

    @Override
    public void parse(InputSource input) throws SAXException {
        if(null == contentHandler) {
            return;
        }
        if(input instanceof XMLStreamReaderInputSource) {
            XMLStreamReader xmlStreamReader = ((XMLStreamReaderInputSource) input).getXmlStreamReader();
            parse(xmlStreamReader);
        }
    }

    public void parse(XMLStreamReader xmlStreamReader) throws SAXException {
        this.xmlStreamReader = xmlStreamReader;
        unmarshalNamespaceContext.setXmlStreamReader(xmlStreamReader);
        indexedAttributeList.setXmlStreamReader(xmlStreamReader);
        try {
            contentHandler.startDocument();
            parseEvent(xmlStreamReader, xmlStreamReader.getEventType());
            while(depth > 0) {
                int eventType = xmlStreamReader.next();
                parseEvent(xmlStreamReader, eventType);
            }
            if(xmlStreamReader.hasNext()) {
                xmlStreamReader.next();
            }
            contentHandler.endDocument();
        } catch(SAXException e ) {
            throw e;
        } catch(Exception e) {
            throw new SAXException(e);
        }
    }

    private void parseEvent(XMLStreamReader xmlStreamReader, int eventType) throws SAXException {
        switch (eventType) {
            case XMLStreamReader.START_ELEMENT: {
                depth++;
                int namespaceCount = xmlStreamReader.getNamespaceCount();
                if(namespaceCount > 0) {
                    for(int x=0; x 0) {
                    for(int x=0; xAn implementation of Locator, created from an existing XMLStreamReader.

* * @see org.xml.sax.Locator * @see javax.xml.stream.XMLStreamReader */ private static class StreamReaderLocator implements Locator2 { private XMLStreamReader reader; /** * Instantiates a new StreamReaderLocator. * * @param r the XMLStreamReader object from which to copy location information. */ public StreamReaderLocator(XMLStreamReader r) { this.reader = r; } /** * Returns the public ID of this Locator. */ @Override public String getPublicId() { return this.reader.getLocation().getPublicId(); } /** * Returns the system ID of this Locator. */ @Override public String getSystemId() { return this.reader.getLocation().getSystemId(); } /** * Returns the line number of this Locator. */ @Override public int getLineNumber() { return this.reader.getLocation().getLineNumber(); } /** * Returns the column number of this Locator. */ @Override public int getColumnNumber() { return this.reader.getLocation().getColumnNumber(); } @Override public String getXMLVersion() { return null; } @Override public String getEncoding() { return null; } } }




© 2015 - 2024 Weber Informatics LLC | Privacy Policy