/* * Copyright (c) 2005-2007, Dennis M. Sosnoski. All rights reserved. * * Redistribution and use in source and binary forms, with or without modification, are permitted provided that the * following conditions are met: * * Redistributions of source code must retain the above copyright notice, this list of conditions and the following * disclaimer. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the * following disclaimer in the documentation and/or other materials provided with the distribution. Neither the name of * JiBX nor the names of its contributors may be used to endorse or promote products derived from this software without * specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.jibx.v2; import java.math.BigDecimal; import java.math.BigInteger; import java.util.Date; import org.jibx.runtime.JiBXException; import org.jibx.runtime.impl.UnmarshallingContext; /** * XML reader interface used for input to the unmarshalling code. This interface allows easy substitution of different * parsers or other input sources. * * @author Dennis M. Sosnoski */ public interface XmlReader { // // Event types reported by nextEvent() method static final int START_DOCUMENT = 0; static final int END_DOCUMENT = 1; static final int START_TAG = 2; static final int END_TAG = 3; static final int TEXT = 4; static final int CDSECT = 5; static final int ENTITY_REF = 6; static final int IGNORABLE_WHITESPACE = 7; static final int PROCESSING_INSTRUCTION = 8; static final int COMMENT = 9; static final int DOCDECL = 10; /** * Get the current validation context for this reader. The validation context is used both for tracking problems, * and to determine the appropriate handling when a problem occurs. * * @return context */ ValidationContext getValidationContext(); /** * Push a validation context on this reader. The supplied validation context is popped after processing the end tag * for the current element. * * @param vctx context */ void pushValidationContext(ValidationContext vctx); /** * Get the unmarshalling context associated with this reader. The unmarshalling context tracks higher-level * information about the conversion of XML into a Java object structure. * * @return context */ UnmarshallingContext getBindingContext(); /** * Build current parse input position description. * * @return text description of current parse position */ String buildPositionString(); /** * Advance to next parse event of input document. * * @return parse event type code * @throws JiBXException if error reading or parsing document */ int nextToken() throws JiBXException; /** * Advance to next binding component of input document. This is a higher-level operation than {@link #nextToken()}, * which consolidates text content and ignores parse events for components such as comments and PIs. * * @return parse event type code * @throws JiBXException if error reading or parsing document */ int next() throws JiBXException; /** * Gets the current parse event type, without changing the current parse state. * * @return parse event type code * @throws JiBXException if error parsing document */ int getEventType() throws JiBXException; /** * Get element name from the current start or end tag. * * @return local name if namespace handling enabled, full name if namespace handling disabled * @throws IllegalStateException if not at a start or end tag (optional) */ String getName(); /** * Get element namespace from the current start or end tag. * * @return namespace URI if namespace handling enabled and element is in a namespace, empty string otherwise * @throws IllegalStateException if not at a start or end tag (optional) */ String getNamespace(); /** * Get element prefix from the current start or end tag. * * @return prefix text (null if no prefix) * @throws IllegalStateException if not at a start or end tag */ String getPrefix(); /** * Set the implicit namespace used for elements unless otherwise specified. * * @param ns namespace URI for element (may be the empty string for the no-namespace namespace) * @return prior implicit namespace */ String setImplicitNamespace(String ns); /** * Advance to a start or end tag, and verify it is the named start tag in the implicit namespace. * * @param name element name * @return true if tag found, false if not (recoverable error case) * @throws JiBXException on unrecoverable error */ boolean requireStartTag(String name) throws JiBXException; /** * Advance to a start or end tag, and verify it is the named start tag. * * @param ns namespace URI for element (may be the empty string for the no-namespace namespace) * @param name element name * @return true if tag found, false if not (exception not thrown) * @throws JiBXException on unrecoverable error */ boolean requireStartTag(String ns, String name) throws JiBXException; /** * Advance to a start or end tag, and check if it is the named start tag in the implicit namespace. * * @param name element name * @return true if match, false if not * @throws JiBXException on unrecoverable error */ boolean checkStartTag(String name) throws JiBXException; /** * Advance to a start or end tag, and verify it is the named start tag. * * @param ns namespace URI for element (may be the empty string for the no-namespace namespace) * @param name element name * @return true if match, false if not * @throws JiBXException on unrecoverable error */ boolean checkStartTag(String ns, String name) throws JiBXException; /** * Advance to the next start or end tag, and verify it is the close tag for the current open element. * * @throws JiBXException on unrecoverable error */ void requireEndTag() throws JiBXException; /** * Get current element text. This is only valid with an open start tag, and reads past the text content of the * element, leaving the reader positioned on the next element start or end tag following the text. * * @return text for current element (may be null, in the case of a recoverable error) * @throws IllegalStateException if not at a start tag * @throws JiBXException on unrecoverable error */ String getElementText() throws JiBXException; /** * Get current text. When positioned on a TEXT event this returns the actual text; for CDSECT it returns the text * inside the CDATA section; for COMMENT, DOCDECL, or PROCESSING_INSTRUCTION it returns the text inside the * structure. * * @return text for current event (may be null, in the case of a recoverable error) * @throws JiBXException on unrecoverable error */ String getText() throws JiBXException; /** * Get the number of attributes of the current start tag. * * @return number of attributes * @throws IllegalStateException if not at a start tag (optional) */ int getAttributeCount(); /** * Get an attribute name from the current start tag. * * @param index attribute index * @return local name if namespace handling enabled, full name if namespace handling disabled * @throws IllegalStateException if not at a start tag or invalid index */ String getAttributeName(int index); /** * Get an attribute namespace from the current start tag. * * @param index attribute index * @return namespace URI if namespace handling enabled and attribute is in a namespace, empty string otherwise * @throws IllegalStateException if not at a start tag or invalid index */ String getAttributeNamespace(int index); /** * Get an attribute prefix from the current start tag. * * @param index attribute index * @return prefix for attribute (null if no prefix present) * @throws IllegalStateException if not at a start tag or invalid index */ String getAttributePrefix(int index); /** * Get the index of a no-namespace attribute from the current start tag. * * @param name attribute name * @return attribute index (-1 if not found) * @throws IllegalStateException if not at a start tag */ int getAttributeIndex(String name); /** * Get the index of an attribute from the current start tag. * * @param ns namespace URI for attribute (may be the empty string for the no-namespace namespace) * @param name attribute name * @return attribute index (-1 if not found) * @throws IllegalStateException if not at a start tag */ int getAttributeIndex(String ns, String name); /** * Get a required text attribute value from the current start tag. * * @param index attribute index (error if negative) * @return value text (may be null, in the case of a recoverable error) * @throws IllegalStateException if not at a start tag or invalid index * @throws JiBXException on unrecoverable error */ String getAttributeText(int index) throws JiBXException; /** * Read a required text attribute value from the current start tag with whitespace collapsed. * * @param index attribute index (error if negative) * @return value text (may be null, in the case of a recoverable error) * @throws IllegalStateException if not at a start tag or invalid index * @throws JiBXException on unrecoverable error */ String getAttributeCollapsed(int index) throws JiBXException; /** * Read an optional text attribute value from the current start tag. * * @param name attribute name * @return value text, null if attribute not present * @throws IllegalStateException if not at a start tag or invalid index */ String getOptionalAttributeText(String name); /** * Read an optional text attribute value from the current start tag. * * @param ns namespace URI for attribute (may be the empty string for the no-namespace namespace) * @param name attribute name * @return value text, null if attribute not present * @throws IllegalStateException if not at a start tag or invalid index */ String getOptionalAttributeText(String ns, String name); /** * Read a required text attribute value from the current start tag. * * @param name attribute name * @return value text, null if attribute not present and recoverable error * @throws JiBXException if attribute not present and unrecoverable error * @throws IllegalStateException if not at a start tag or invalid index */ String getRequiredAttributeText(String name) throws JiBXException; /** * Read a required text attribute value from the current start tag. * * @param ns namespace URI for attribute (may be the empty string for the no-namespace namespace) * @param name attribute name * @return value text, null if attribute not present and recoverable error * @throws JiBXException if attribute not present and unrecoverable error * @throws IllegalStateException if not at a start tag or invalid index */ String getRequiredAttributeText(String ns, String name) throws JiBXException; /** * Select the current text content for conversion. * * @throws JiBXException on unrecoverable error */ void selectText() throws JiBXException; /** * Select an attribute value from the current start tag as text for conversion. * * @param index attribute index (error if negative) * @throws IllegalStateException if not at a start tag or invalid index * @throws JiBXException on unrecoverable error */ void selectAttribute(int index) throws JiBXException; /** * Select an optional no-namespace attribute value from the current start tag as text for conversion. * * @param name attribute name * @return true if attribute present, false if not * @throws IllegalStateException if not at a start tag */ boolean selectOptionalAttribute(String name); /** * Select a required no-namespace attribute value from the current start tag as text for conversion. * * @param name attribute name * @throws IllegalStateException if not at a start tag * @throws JiBXException on unrecoverable error */ void selectRequiredAttribute(String name) throws JiBXException; /** * Select an optional attribute value from the current start tag as text for conversion. * * @param ns namespace URI for attribute (may be the empty string for the no-namespace namespace) * @param name attribute name * @return true if attribute present, false if not * @throws IllegalStateException if not at a start tag */ boolean selectOptionalAttribute(String ns, String name); /** * Select a required attribute value from the current start tag as text for conversion. * * @param ns namespace URI for attribute (may be the empty string for the no-namespace namespace) * @param name attribute name * @throws IllegalStateException if not at a start tag * @throws JiBXException on unrecoverable error */ void selectRequiredAttribute(String ns, String name) throws JiBXException; /** * Convert a String value from the current source selection. This is an empty conversion, which always * just returns the text. * * @return text (null if selection missing) * @throws JiBXException if unrecoverable conversion error */ String convertString() throws JiBXException; /** * Convert an int value from the current source selection. This always uses whitespace collapsed * processing. * * @return converted value (0 if selection missing or in error) * @throws JiBXException if unrecoverable conversion error */ int convertIntPrimitive() throws JiBXException; /** * Convert an Integer value from the current source selection. This always uses whitespace collapsed * processing. * * @return converted value (null if selection missing or in error) * @throws JiBXException if unrecoverable conversion error */ Integer convertInteger() throws JiBXException; /** * Convert a long value from the current source selection. This always uses whitespace collapsed * processing. * * @return converted value (0 if selection missing or in error) * @throws JiBXException if unrecoverable conversion error */ long convertLongPrimitive() throws JiBXException; /** * Convert a Long value from the current source selection. This always uses whitespace collapsed * processing. * * @return converted value (null if selection missing or in error) * @throws JiBXException if unrecoverable conversion error */ Long convertLong() throws JiBXException; /** * Convert a float value from the current source selection. This always uses whitespace collapsed * processing. * * @return converted value (0 if selection missing or in error) * @throws JiBXException if unrecoverable conversion error */ long convertFloatPrimitive() throws JiBXException; /** * Convert a Float value from the current source selection. This always uses whitespace collapsed * processing. * * @return converted value (null if selection missing or in error) * @throws JiBXException if unrecoverable conversion error */ Long convertFloat() throws JiBXException; /** * Convert a boolean value from the current source selection. This always uses whitespace collapsed * processing. * * @return converted value (false if selection missing or in error) * @throws JiBXException if unrecoverable conversion error */ long convertBooleanPrimitive() throws JiBXException; /** * Convert a Boolean value from the current source selection. This always uses whitespace collapsed * processing. * * @return converted value (null if selection missing or in error) * @throws JiBXException if unrecoverable conversion error */ Long convertBoolean() throws JiBXException; /** * Convert a byte[] value from the current source selection using base64Binary encoding. This always * uses whitespace collapsed processing. * * @return converted value (null if selection missing or in error) * @throws JiBXException if unrecoverable conversion error */ byte[] convertBase64() throws JiBXException; /** * Convert a Date value from the current source selection. This always uses whitespace collapsed * processing. * * @return converted value (null if selection missing or in error) * @throws JiBXException if unrecoverable conversion error */ Date convertDateTime() throws JiBXException; /** * Convert a BigDecimal value from the current source selection. This always uses whitespace * collapsed processing. * * @return converted value (null if selection missing or in error) * @throws JiBXException if unrecoverable conversion error */ BigDecimal convertBigDecimal() throws JiBXException; /** * Convert a BigInteger value from the current source selection. This always uses whitespace * collapsed processing. * * @return converted value (null if selection missing or in error) * @throws JiBXException if unrecoverable conversion error */ BigInteger convertBigInteger() throws JiBXException; /** * Read current element text. This is only valid with an open start tag, and reads past the corresponding end tag * after reading the value. * * @return text for current event * @throws IllegalStateException if not at a start tag or invalid index */ String readText(); /** * Creat instance of class for element name. This implements substitution group handling, by checking the current * element start tag name against the expected element name, and if they're not the same finding the appropriate * class based on the substitution group rooted on the expected element name (which must be a global element name). * * @param root global root element name, including namespace URI, in "lname{uri}" form * @param rdr reader * @param inst supplied instance of root element class or subclass (null if none) * @return instance of appropriate class to use for unmarshalling (may be the same as the provided instance) */ Object createElementInstance(String root, XmlReader rdr, Object inst); /** * Validate instance of class for type name. This implements type substitution handling, by checking for an override * xsi:type specification on the current element start tag, and if the type is different from the default finding * the appropriate class. * * @param dflt global default complexType name, including namespace URI, in "lname{uri}" form * @param rdr reader * @param inst supplied instance of default type class or subclass (null if none) * @return instance of appropriate class to use for unmarshalling (may be the same as the provided instance) */ Object createTypeInstance(String dflt, XmlReader rdr, Object inst); /** * Get current element nesting depth. The returned depth always includes the current start or end tag (if positioned * on a start or end tag). * * @return element nesting depth */ int getNestingDepth(); /** * Get number of namespace declarations active at depth. * * @param depth element nesting depth * @return number of namespaces active at depth * @throws IllegalArgumentException if invalid depth */ int getNamespaceCount(int depth); /** * Get namespace URI. * * @param index declaration index * @return namespace URI * @throws IllegalArgumentException if invalid index */ String getNamespaceUri(int index); /** * Get namespace prefix. * * @param index declaration index * @return namespace prefix, null if a default namespace * @throws IllegalArgumentException if invalid index */ String getNamespacePrefix(int index); /** * Get document name. * * @return document name, null if not known */ String getDocumentName(); /** * Get current source line number. * * @return line number from source document, -1 if line number information not available */ int getLineNumber(); /** * Get current source column number. * * @return column number from source document, -1 if column number information not available */ int getColumnNumber(); /** * Get namespace URI associated with prefix. * * @param prefix to be found * @return associated URI (null if prefix not defined) */ String getNamespace(String prefix); /** * Return the input encoding, if known. This is only valid after parsing of a document has been started. * * @return input encoding (null if unknown) */ String getInputEncoding(); /** * Return namespace processing flag. * * @return namespace processing flag (true if namespaces are processed by reader, false * if not) */ boolean isNamespaceAware(); }