org.eclipse.persistence.internal.oxm.record.XMLStreamReaderReader Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of org.eclipse.persistence.core Show documentation
Show all versions of org.eclipse.persistence.core Show documentation
EclipseLink build based upon Git transaction ecdf3c32c4
/*
* 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;
}
}
}