/*
* Copyright (c) 2004-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.MarshallingContext;
/**
* XML writer interface used for output of marshalled document. This interface allows easy substitution of different
* output formats, including parse event stream equivalents. This makes heavy use of state information, so each method
* call defined is only valid in certain states.
*
* @author Dennis M. Sosnoski
*/
public interface XmlWriter
{
/**
* Get the marshalling context associated with this writer. The marshalling context tracks higher-level information
* about the conversion of XML into a Java object structure.
*
* @return context
*/
MarshallingContext getContext();
/**
* Get the current validation context for this writer. The validation context is used both for tracking problems,
* and to determine the appropriate handling when a problem occurs.
*
* @return context
*/
ValidationContext getValidationContext();
/**
* Get the current element nesting depth. Elements are only counted in the depth returned when they're officially
* open - after the start tag has been output and before the end tag has been output.
*
* @return number of nested elements at current point in output
*/
int getNestingDepth();
/**
* Get the number of namespaces currently defined. This is equivalent to the index of the next extension namespace
* added.
*
* @return namespace count
*/
int getNamespaceCount();
/**
* Set nesting indentation. This is advisory only, and implementations of this interface are free to ignore it. The
* intent is to indicate that the generated output should use indenting to illustrate element nesting.
*
* @param count number of character to indent per level, or disable indentation if negative (zero means new line
* only)
* @param newline sequence of characters used for a line ending (null
means use the single character
* '\n')
* @param indent whitespace character used for indentation
*/
void setIndent(int count, String newline, char indent);
/**
* Set attribute double-quote character usage. If this is true
, the double-quote (") character is
* preferred for attribute values; if false
(the default), the single-quote (') character is preferred.
* This setting is advisory only, and implementations of this interface are free to ignore it.
*
* @param prefdbl prefer double-quote flag
*/
void setAttributeDoubleQuote(boolean prefdbl);
/**
* Set boolean numeric value usage. If this is true
, numeric values ('0' and '1') are preferred for
* boolean values; if false
(the default), text values ('false' and 'true') are preferred. This setting
* is advisory only, and implementations of this interface are free to ignore it.
*
* @param prefnum prefer numeric boolean value flag
*/
void setBooleanNumeric(boolean prefnum);
/**
* Set the implicit namespace used for elements unless otherwise specified. The namespace must have been opened
* prior to this call.
*
* @param ns namespace URI for element (may be the empty string for the no-namespace namespace)
* @return prior implicit namespace
*/
String setImplicitNamespace(String ns);
/**
* Write the start tag for an element in the implicit namespace.
*
* @param name element name
* @throws JiBXException on unrecoverable error
*/
void startTag(String name) throws JiBXException;
/**
* Write the start tag for an element.
*
* @param ns namespace URI for element (may be the empty string for the no-namespace namespace)
* @param name unqualified element name
* @throws JiBXException on unrecoverable error
*/
void startTag(String ns, String name) throws JiBXException;
/**
* Declare a namespace, make it the implicit namespace, and write the start tag for an element in that namespace.
* This is just a shortcut for the sequence of calls {@link #openNamespace(String, String)}, {@link
* #setImplicitNamespace(String)}, {@link #startTag(String)}.
*
* @param ns namespace URI for element (may be the empty string for the no-namespace namespace)
* @param prefix prefix to be used for the namespace (use "" for default namespace declaration)
* @param name unqualified element name
* @throws JiBXException on unrecoverable error
*/
void startTagImplicit(String ns, String prefix, String name) throws JiBXException;
/**
* Add a namespace declaration to the next element start tag. If the namespace is already open this call does
* nothing.
*
* @param ns namespace URI (may be the empty string for the no-namespace namespace)
* @param prefix prefix to be used for the namespace (use "" for default namespace declaration)
* @throws JiBXException on unrecoverable error
*/
void openNamespace(String ns, String prefix) throws JiBXException;
/**
* Add no-namespace text attribute to current open start tag. This is only valid with an open start tag.
*
* @param name unqualified attribute name
* @param value text value for attribute
* @throws JiBXException on unrecoverable error
*/
void addTextAttribute(String name, String value) throws JiBXException;
/**
* Add text attribute to current open start tag. This is only valid with an open start tag.
*
* @param ns namespace URI (may be the empty string for the no-namespace namespace)
* @param name unqualified attribute name
* @param value text value for attribute
* @throws JiBXException on unrecoverable error
*/
void addTextAttribute(String ns, String name, String value) throws JiBXException;
/**
* Add optional no-namespace text attribute to current open start tag. This is only valid with an open start tag.
*
* @param name unqualified attribute name
* @param value text value for attribute (null
if no value)
* @throws JiBXException on unrecoverable error
*/
void addOptionalTextAttribute(String name, String value) throws JiBXException;
/**
* Add optional text attribute to current open start tag. This is only valid with an open start tag.
*
* @param ns namespace URI (may be the empty string for the no-namespace namespace)
* @param name unqualified attribute name
* @param value text value for attribute (null
if no value)
* @throws JiBXException on unrecoverable error
*/
void addOptionalTextAttribute(String ns, String name, String value) throws JiBXException;
/**
* Select text content as the destination for a conversion.
*
* @throws JiBXException on unrecoverable error
*/
void selectContent() throws JiBXException;
/**
* Select a child element in the implicit namespace as the destination for a conversion.
*
* @param name element name
* @throws JiBXException on unrecoverable error
*/
void selectContent(String name) throws JiBXException;
/**
* Select a child element as the destination for a conversion.
*
* @param ns namespace URI (may be the empty string for the no-namespace namespace)
* @param name element name
* @throws JiBXException on unrecoverable error
*/
void selectContent(String ns, String name) throws JiBXException;
/**
* Select a no-namespace attribute as the destination for a conversion. This is only valid with an open start tag.
*
* @param name unqualified attribute name
* @throws JiBXException on unrecoverable error
*/
void selectAttribute(String name) throws JiBXException;
/**
* Select an attribute as the destination for a conversion. This is only valid with an open start tag.
*
* @param ns namespace URI (may be the empty string for the no-namespace namespace)
* @param name unqualified attribute name
* @throws JiBXException on unrecoverable error
*/
void selectAttribute(String ns, String name) throws JiBXException;
/**
* Write a String
value to the current text selection.
*
* @param value
* @throws JiBXException on unrecoverable error
*/
void convert(String value) throws JiBXException;
/**
* Write an int
value to the current text selection.
*
* @param value
* @throws JiBXException on unrecoverable error
*/
void convert(int value) throws JiBXException;
/**
* Write a long
value to the current text selection.
*
* @param value
* @throws JiBXException on unrecoverable error
*/
void convert(long value) throws JiBXException;
/**
* Write a float
value to the current text selection.
*
* @param value
* @throws JiBXException on unrecoverable error
*/
void convert(float value) throws JiBXException;
/**
* Write a double
value to the current text selection.
*
* @param value
* @throws JiBXException on unrecoverable error
*/
void convert(double value) throws JiBXException;
/**
* Write a boolean
value to the current text selection.
*
* @param value
* @throws JiBXException on unrecoverable error
*/
void convert(boolean value) throws JiBXException;
/**
* Write a byte[]
value to the current text selection using base64Binary encoding.
*
* @param value attribute value
* @throws JiBXException on unrecoverable error
*/
void convert(byte[] value) throws JiBXException;
/**
* Write a long
milliseconds time value to the current text selection as an xsd:dateTime.
*
* @param value
* @throws JiBXException on unrecoverable error
*/
void convertDateTime(long value) throws JiBXException;
/**
* Write a long
milliseconds time value and associated nanosecond count to the current text selection
* as an xsd:dateTime.
*
* @param value
* @param nanos
* @throws JiBXException on unrecoverable error
*/
void convertDateTime(long value, int nanos) throws JiBXException;
/**
* Write a long
milliseconds time value to the current text selection as an xsd:date.
*
* @param value
* @throws JiBXException on unrecoverable error
*/
void convertDate(long value) throws JiBXException;
/**
* Write a long
milliseconds time value to the current text selection as an xsd:time.
*
* @param value
* @throws JiBXException on unrecoverable error
*/
void convertTime(long value) throws JiBXException;
/**
* Write a long
milliseconds time value and associated nanosecond count to the current text selection
* as an xsd:time.
*
* @param value
* @param nanos
* @throws JiBXException on unrecoverable error
*/
void convertTime(long value, int nanos) throws JiBXException;
/**
* Write a qualified name value to the current text selection. The qualified name is presented as a pair consisting
* of namespace URI and local name in order to allow flexible use.
*
* @param ns namespace URI (empty string if no-namespace namespace)
* @param name local name
* @throws JiBXException on unrecoverable error
*/
void convertQName(String ns, String name) throws JiBXException;
/**
* Write a BigDecimal
value to the current text selection.
*
* @param value (non-null
)
* @throws JiBXException on unrecoverable error
*/
void convert(BigDecimal value) throws JiBXException;
/**
* Write a BigInteger
value to the current text selection.
*
* @param value (non-null
)
* @throws JiBXException on unrecoverable error
*/
void convert(BigInteger value) throws JiBXException;
/**
* Write a text value as the content of the current element. This writes the corresponding end tag after writing the
* value.
*
* @param value content value
* @throws JiBXException on unrecoverable error
*/
void addText(String value) throws JiBXException;
/**
* Write end tag for current open element.
*
* @throws JiBXException on unrecoverable error
*/
void endTag() throws JiBXException;
/**
* Handle a missing required element value from the implicit namespace in the generated document.
*
* @param name
* @throws JiBXException on unrecoverable error
*/
void handleMissingElement(String name) throws JiBXException;
/**
* Handle a missing required element value in the generated document.
*
* @param ns
* @param name
* @throws JiBXException on unrecoverable error
*/
void handleMissingElement(String ns, String name) throws JiBXException;
/**
* Handle a missing required attribute value from the implicit namespace in the generated document.
*
* @param name
* @throws JiBXException on unrecoverable error
*/
void handleMissingAttribute(String name) throws JiBXException;
/**
* Handle a missing required attribute value in the generated document.
*
* @param ns
* @param name
* @throws JiBXException on unrecoverable error
*/
void handleMissingAttribute(String ns, String name) throws JiBXException;
/**
* Write XML declaration to document. This can only be called before any other methods in the interface are called.
*
* @param version XML version text
* @param encoding text for encoding attribute (unspecified if null
)
* @param standalone text for standalone attribute (unspecified if null
)
* @throws JiBXException on error writing to document
*/
void writeXMLDecl(String version, String encoding, String standalone) throws JiBXException;
/**
* Write ordinary character data text content to document.
*
* @param text content value text (must not be null
)
* @throws JiBXException on error writing to document
*/
void writeTextContent(String text) throws JiBXException;
/**
* Write CDATA text to document.
*
* @param text content value text (must not be null
)
* @throws JiBXException on error writing to document
*/
void writeCData(String text) throws JiBXException;
/**
* Write comment to document.
*
* @param text comment text (must not be null
)
* @throws JiBXException on error writing to document
*/
void writeComment(String text) throws JiBXException;
/**
* Write entity reference to document.
*
* @param name entity name (must not be null
)
* @throws JiBXException on error writing to document
*/
void writeEntityRef(String name) throws JiBXException;
/**
* Write DOCTYPE declaration to document.
*
* @param name root element name
* @param sys system ID (null
if none, must be non-null
for ID to be used)
* @param pub ID (null
if none)
* @param subset internal subset (null
if none)
* @throws JiBXException on error writing to document
*/
void writeDocType(String name, String sys, String pub, String subset) throws JiBXException;
/**
* Write processing instruction to document.
*
* @param target processing instruction target name (must not be null
)
* @param data processing instruction data (must not be null
)
* @throws JiBXException on error writing to document
*/
void writePI(String target, String data) throws JiBXException;
/**
* Request output indent. The writer implementation should normally indent output as appropriate. This method can be
* used to request indenting of output that might otherwise not be indented. The normal effect when used with a
* text-oriented writer should be to output the appropriate line end sequence followed by the appropriate number of
* indent characters for the current nesting level.
*
* @throws JiBXException on error writing to document
*/
void indent() throws JiBXException;
/**
* Flush document output. Writes any buffered data to the output medium. This does not flush the output
* medium itself, only any internal buffering within the writer.
*
* @throws JiBXException on error writing to document
*/
void flush() throws JiBXException;
/**
* Close document output. Completes writing of document output, including flushing and closing the output medium.
*
* @throws JiBXException on error writing to document
*/
void close() throws JiBXException;
/**
* Reset to initial state for reuse. The context is serially reusable, as long as this method is called to clear any
* retained state information between uses. It is automatically called when output is set.
*/
void reset();
/**
* Get namespace URIs for mapping. This gets the full ordered array of namespaces known in the binding used for this
* marshalling, where the index number of each namespace URI is the namespace index used to lookup the prefix when
* marshalling a name in that namespace. The returned array must not be modified.
*
* @return array of namespaces
*/
String[] getNamespaces();
/**
* Get URI for namespace.
*
* @param index namespace URI index number
* @return namespace URI text, or null
if the namespace index is invalid
*/
String getNamespaceUri(int index);
/**
* Get current prefix defined for namespace.
*
* @param index namespace URI index number
* @return current prefix text, or null
if the namespace is not currently mapped
*/
String getNamespacePrefix(int index);
/**
* Get index of namespace mapped to prefix. This can be an expensive operation with time proportional to the number
* of namespaces defined, so it should be used with care.
*
* @param prefix text to match (non-null
, use "" for default prefix)
* @return index namespace URI index number mapped to prefix
*/
int getPrefixIndex(String prefix);
/**
* Append extension namespace URIs to those in mapping.
*
* @param uris namespace URIs to extend those in mapping
*/
void pushExtensionNamespaces(String[] uris);
/**
* Remove extension namespace URIs. This removes the last set of extension namespaces pushed using
* {@link #pushExtensionNamespaces}.
*/
void popExtensionNamespaces();
/**
* Get extension namespace URIs added to those in mapping. This gets the current set of extension definitions. The
* returned arrays must not be modified.
*
* @return array of arrays of extension namespaces (null
if none)
*/
String[][] getExtensionNamespaces();
/**
* Open the specified namespaces for use. This method is normally only called internally, when namespace
* declarations are actually written to output. It is exposed as part of this interface to allow for special
* circumstances where namespaces are being written outside the usual processing. The namespaces will remain open
* for use until the current element is closed.
*
* @param nums array of namespace indexes defined by this element (must be constant, reference is kept until
* namespaces are closed)
* @param prefs array of namespace prefixes mapped by this element (no null
values, use "" for
* default namespace declaration)
* @return array of indexes for namespaces not previously active (the ones actually needing to be declared, in the
* case of text output)
* @throws JiBXException on error writing to document
*/
int[] openNamespaces(int[] nums, String[] prefs) throws JiBXException;
}