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

com.sun.xml.rpc.streaming.XMLReaderImpl Maven / Gradle / Ivy

/*
 * Copyright (c) 1997, 2018 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.
 *
 * This Source Code may also be made available under the following Secondary
 * Licenses when the conditions for such availability set forth in the
 * Eclipse Public License v. 2.0 are satisfied: GNU General Public License,
 * version 2 with the GNU Classpath Exception, which is available at
 * https://www.gnu.org/software/classpath/license.html.
 *
 * SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0
 */

package com.sun.xml.rpc.streaming;
import java.io.IOException;
import java.io.InputStream;
import java.util.Iterator;

import javax.xml.namespace.QName;

import org.xml.sax.InputSource;

import com.sun.xml.rpc.sp.AttributesEx;
import com.sun.xml.rpc.sp.ParseException;
import com.sun.xml.rpc.sp.Parser2;
import com.sun.xml.rpc.util.exception.LocalizableExceptionAdapter;
import com.sun.xml.rpc.util.xml.XmlUtil;

/**
 * 

A concrete XMLReader implementation class.

* *

This implementation uses a specially modified streaming parser * to avoid duplicating work already done by the parser itself. * This approach makes normal parsing very fast, but recording is * expected to be quite poor performancewise.

* * @author JAX-RPC Development Team */ public class XMLReaderImpl extends XMLReaderBase { public XMLReaderImpl(InputSource source) { this(source, false); } public XMLReaderImpl(InputSource source, boolean rejectDTDs) { _state = BOF; _stream = source.getByteStream(); _parser = new Parser2(_stream, true, true, rejectDTDs); _elementIds = new ElementIdStack(); _attributeAdapter = new AttributesAdapter(); } public void close() { try { _state = EOF; _stream.close(); } catch (IOException e) { throw new XMLReaderException( "xmlreader.ioException", new LocalizableExceptionAdapter(e)); } } public int getState() { return _state; } public QName getName() { if (_name == null) { _name = new QName(getURI(), getLocalName()); } return _name; } public String getURI() { return _parser.getCurURI(); } public String getLocalName() { return _parser.getCurName(); } public Attributes getAttributes() { _attributeAdapter.setTarget(_parser.getAttributes()); return _attributeAdapter; } public String getValue() { return _parser.getCurValue(); } public int getElementId() { return _elementId; } public int getLineNumber() { return _parser.getLineNumber(); } public String getURI(String prefix) { return _parser.getNamespaceSupport().getURI(prefix); } public Iterator getPrefixes() { return _parser.getNamespaceSupport().getPrefixes(); } public int next() { if (_state == EOF) { return EOF; } _name = null; try { _state = _parser.parse(); if (_state == DOC_END) { _state = EOF; } } catch (ParseException e) { throw new XMLReaderException( "xmlreader.parseException", new LocalizableExceptionAdapter(e)); } catch (IOException e) { throw new XMLReaderException( "xmlreader.ioException", new LocalizableExceptionAdapter(e)); } switch (_state) { case START : _elementId = _elementIds.pushNext(); break; case END : _elementId = _elementIds.pop(); break; case CHARS : case EOF : case PI : break; default : throw new XMLReaderException( "xmlreader.illegalStateEncountered", Integer.toString(_state)); } return _state; } public XMLReader recordElement() { return new RecordedXMLReader(this, _parser.getNamespaceSupport()); //throw new UnsupportedOperationException(); } public void skipElement(int elementId) { while (!(_state == EOF || (_state == END && _elementId == elementId))) { next(); } } private int _state; private QName _name; private InputStream _stream; private AttributesAdapter _attributeAdapter; private ElementIdStack _elementIds; private int _elementId; private Parser2 _parser; private static final int DOC_END = -1; private static final int DOC_START = -2; private static final int EMPTY = -3; private static final int EXCEPTION = -4; static class AttributesAdapter implements Attributes { public AttributesAdapter() { } public void setTarget(AttributesEx attr) { _attr = attr; } public int getLength() { return _attr.getLength(); } public boolean isNamespaceDeclaration(int index) { // use "==" instead of equals() because we know that the string // will always be interned return _attr.getURI(index) == XMLNS_NAMESPACE_URI; } public QName getName(int index) { return new QName(getURI(index), getLocalName(index)); } public String getURI(int index) { return _attr.getURI(index); } public String getLocalName(int index) { return _attr.getLocalName(index); } public String getPrefix(int index) { String qname = _attr.getQName(index); if (qname == null) { return null; } else { return XmlUtil.getPrefix(qname); } } public String getValue(int index) { return _attr.getValue(index); } public int getIndex(QName name) { return _attr.getIndex(name.getNamespaceURI(), name.getLocalPart()); } public int getIndex(String uri, String localName) { return _attr.getIndex(uri, localName); } public int getIndex(String localName) { return _attr.getIndex(localName); } public String getValue(QName name) { return _attr.getValue(name.getNamespaceURI(), name.getLocalPart()); } public String getValue(String uri, String localName) { return _attr.getValue(uri, localName); } public String getValue(String localName) { return _attr.getValue(localName); } public String toString() { StringBuffer attributes = new StringBuffer(); for (int i = 0; i < getLength(); ++i) { if (i != 0) { attributes.append("\n"); } attributes.append( getURI(i) + ":" + getLocalName(i) + " = " + getValue(i)); } return attributes.toString(); } private AttributesEx _attr; static final String XMLNS_NAMESPACE_URI = "http://www.w3.org/2000/xmlns/"; } }




© 2015 - 2024 Weber Informatics LLC | Privacy Policy