org.eclipse.persistence.internal.oxm.record.XMLStreamReaderReader Maven / Gradle / Ivy
/*
* 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;
}
}
}