package org.xmlpull.v1; import java.io.IOException; import java.io.OutputStream; import java.io.Writer; /** * Define an interface to serialization of XML Infoset. * This interface abstracts away if serialized XML is XML 1.0 compatible text or * other formats of XML 1.0 serializations (such as binary XML for example with WBXML). * * <p><b>PLEASE NOTE:</b> This interface will be part of XmlPull 1.2 API. * It is included as basis for discussion. It may change in any way. * * <p>Exceptions that may be thrown are: IOException or runtime exception * (more runtime exceptions can be thrown but are not declared and as such * have no semantics defined for this interface): * <ul> * <li><em>IllegalArgumentException</em> - for almost all methods to signal that * argument is illegal * <li><em>IllegalStateException</em> - to signal that call has good arguments but * is not expected here (violation of contract) and for features/properties * when requesting setting unimplemented feature/property * (UnsupportedOperationException would be better but it is not in MIDP) * </ul> * * <p><b>NOTE:</b> writing CDSECT, ENTITY_REF, IGNORABLE_WHITESPACE, * PROCESSING_INSTRUCTION, COMMENT, and DOCDECL in some implementations * may not be supported (for example when serializing to WBXML). * In such case IllegalStateException will be thrown and it is recommended * to use an optional feature to signal that implementation is not * supporting this kind of output. */ public interface XmlSerializer { /** * Set feature identified by name (recommended to be URI for uniqueness). * Some well known optional features are defined in * <a href="http://www.xmlpull.org/v1/doc/features.html"> * http://www.xmlpull.org/v1/doc/features.html</a>. * * If feature is not recognized or can not be set * then IllegalStateException MUST be thrown. * * @exception IllegalStateException If the feature is not supported or can not be set */ void setFeature(String name, boolean state) throws IllegalArgumentException, IllegalStateException; /** * Return the current value of the feature with given name. * <p><strong>NOTE:</strong> unknown properties are <strong>always</strong> returned as null * * @param name The name of feature to be retrieved. * @return The value of named feature. * @exception IllegalArgumentException if feature string is null */ boolean getFeature(String name); /** * Set the value of a property. * (the property name is recommended to be URI for uniqueness). * Some well known optional properties are defined in * <a href="http://www.xmlpull.org/v1/doc/properties.html"> * http://www.xmlpull.org/v1/doc/properties.html</a>. * * If property is not recognized or can not be set * then IllegalStateException MUST be thrown. * * @exception IllegalStateException if the property is not supported or can not be set */ void setProperty(String name, Object value) throws IllegalArgumentException, IllegalStateException; /** * Look up the value of a property. * * The property name is any fully-qualified URI. I * <p><strong>NOTE:</strong> unknown properties are <string>always</strong> returned as null * * @param name The name of property to be retrieved. * @return The value of named property. */ Object getProperty(String name); /** * Set to use binary output stream with given encoding. */ void setOutput (OutputStream os, String encoding) throws IOException, IllegalArgumentException, IllegalStateException; /** * Set the output to the given writer. * <p><b>WARNING</b> no information about encoding is available! */ void setOutput (Writer writer) throws IOException, IllegalArgumentException, IllegalStateException; /** * Write <?xml declaration with encoding (if encoding not null) * and standalone flag (if standalone not null) * This method can only be called just after setOutput. */ void startDocument (String encoding, Boolean standalone) throws IOException, IllegalArgumentException, IllegalStateException; /** * Finish writing. All unclosed start tags will be closed and output * will be flushed. After calling this method no more output can be * serialized until next call to setOutput() */ void endDocument () throws IOException, IllegalArgumentException, IllegalStateException; /** * Binds the given prefix to the given namespace. * This call is valid for the next element including child elements. * The prefix and namespace MUST be always declared even if prefix * is not used in element (startTag() or attribute()) - for XML 1.0 * it must result in declaring <code>xmlns:prefix='namespace'</code> * (or <code>xmlns:prefix="namespace"</code> depending what character is used * to quote attribute value). * * <p><b>NOTE:</b> this method MUST be called directly before startTag() * and if anything but startTag() or setPrefix() is called next there will be exception. * <p><b>NOTE:</b> prefixes "xml" and "xmlns" are already bound * and can not be redefined see: * <a href="http://www.w3.org/XML/xml-names-19990114-errata#NE05">Namespaces in XML Errata</a>. * <p><b>NOTE:</b> to set default namespace use as prefix empty string. * * @param prefix must be not null (or IllegalArgumentException is thrown) * @param namespace must be not null */ void setPrefix (String prefix, String namespace) throws IOException, IllegalArgumentException, IllegalStateException; /** * Return namespace that corresponds to given prefix * If there is no prefix bound to this namespace return null * but if generatePrefix is false then return generated prefix. * * <p><b>NOTE:</b> if the prefix is empty string "" and default namespace is bound * to this prefix then empty string ("") is returned. * * <p><b>NOTE:</b> prefixes "xml" and "xmlns" are already bound * will have values as defined * <a href="http://www.w3.org/TR/REC-xml-names/">Namespaces in XML specification</a> */ String getPrefix (String namespace, boolean generatePrefix) throws IllegalArgumentException; /** * Returns the current depth of the element. * Outside the root element, the depth is 0. The * depth is incremented by 1 when startTag() is called. * The depth is decremented after the call to endTag() * event was observed. * * <pre> * <!-- outside --> 0 * <root> 1 * sometext 1 * <foobar> 2 * </foobar> 2 * </root> 1 * <!-- outside --> 0 * </pre> */ int getDepth(); /** * Returns the namespace URI of the current element as set by startTag(). * * <p><b>NOTE:</b> that means in particular that: <ul> * <li>if there was startTag("", ...) then getNamespace() returns "" * <li>if there was startTag(null, ...) then getNamespace() returns null * </ul> * * @return namespace set by startTag() that is currently in scope */ String getNamespace (); /** * Returns the name of the current element as set by startTag(). * It can only be null before first call to startTag() * or when last endTag() is called to close first startTag(). * * @return namespace set by startTag() that is currently in scope */ String getName(); /** * Writes a start tag with the given namespace and name. * If there is no prefix defined for the given namespace, * a prefix will be defined automatically. * The explicit prefixes for namespaces can be established by calling setPrefix() * immediately before this method. * If namespace is null no namespace prefix is printed but just name. * If namespace is empty string then serializer will make sure that * default empty namespace is declared (in XML 1.0 xmlns='') * or throw IllegalStateException if default namespace is already bound * to non-empty string. */ XmlSerializer startTag (String namespace, String name) throws IOException, IllegalArgumentException, IllegalStateException; /** * Write an attribute. Calls to attribute() MUST follow a call to * startTag() immediately. If there is no prefix defined for the * given namespace, a prefix will be defined automatically. * If namespace is null or empty string * no namespace prefix is printed but just name. */ XmlSerializer attribute (String namespace, String name, String value) throws IOException, IllegalArgumentException, IllegalStateException; /** * Write end tag. Repetition of namespace and name is just for avoiding errors. * <p><b>Background:</b> in kXML endTag had no arguments, and non matching tags were * very difficult to find... * If namespace is null no namespace prefix is printed but just name. * If namespace is empty string then serializer will make sure that * default empty namespace is declared (in XML 1.0 xmlns=''). */ XmlSerializer endTag (String namespace, String name) throws IOException, IllegalArgumentException, IllegalStateException; // /** // * Writes a start tag with the given namespace and name. // * <br />If there is no prefix defined (prefix == null) for the given namespace, // * a prefix will be defined automatically. // * <br />If explicit prefixes is passed (prefix != null) then it will be used // *and namespace declared if not already declared or // * throw IllegalStateException the same prefix was already set on this // * element (setPrefix()) and was bound to different namespace. // * <br />If namespace is null then prefix must be null too or IllegalStateException is thrown. // * <br />If namespace is null then no namespace prefix is printed but just name. // * <br />If namespace is empty string then serializer will make sure that // * default empty namespace is declared (in XML 1.0 xmlns='') // * or throw IllegalStateException if default namespace is already bound // * to non-empty string. // */ // XmlSerializer startTag (String prefix, String namespace, String name) // throws IOException, IllegalArgumentException, IllegalStateException; // // /** // * Write an attribute. Calls to attribute() MUST follow a call to // * startTag() immediately. // * <br />If there is no prefix defined (prefix == null) for the given namespace, // * a prefix will be defined automatically. // * <br />If explicit prefixes is passed (prefix != null) then it will be used // * and namespace declared if not already declared or // * throw IllegalStateException the same prefix was already set on this // * element (setPrefix()) and was bound to different namespace. // * <br />If namespace is null then prefix must be null too or IllegalStateException is thrown. // * <br />If namespace is null then no namespace prefix is printed but just name. // * <br />If namespace is empty string then serializer will make sure that // * default empty namespace is declared (in XML 1.0 xmlns='') // * or throw IllegalStateException if default namespace is already bound // * to non-empty string. // */ // XmlSerializer attribute (String prefix, String namespace, String name, String value) // throws IOException, IllegalArgumentException, IllegalStateException; // // /** // * Write end tag. Repetition of namespace, prefix, and name is just for avoiding errors. // * <br />If namespace or name arguments are different from corresponding startTag call // * then IllegalArgumentException is thrown, if prefix argument is not null and is different // * from corresponding starTag then IllegalArgumentException is thrown. // * <br />If namespace is null then prefix must be null too or IllegalStateException is thrown. // * <br />If namespace is null then no namespace prefix is printed but just name. // * <br />If namespace is empty string then serializer will make sure that // * default empty namespace is declared (in XML 1.0 xmlns=''). // * <p><b>Background:</b> in kXML endTag had no arguments, and non matching tags were // * very difficult to find...</p> // */ // ALEK: This is really optional as prefix in end tag MUST correspond to start tag but good for error checking // XmlSerializer endTag (String prefix, String namespace, String name) // throws IOException, IllegalArgumentException, IllegalStateException; /** * Writes text, where special XML chars are escaped automatically */ XmlSerializer text (String text) throws IOException, IllegalArgumentException, IllegalStateException; /** * Writes text, where special XML chars are escaped automatically */ XmlSerializer text (char [] buf, int start, int len) throws IOException, IllegalArgumentException, IllegalStateException; void cdsect (String text) throws IOException, IllegalArgumentException, IllegalStateException; void entityRef (String text) throws IOException, IllegalArgumentException, IllegalStateException; void processingInstruction (String text) throws IOException, IllegalArgumentException, IllegalStateException; void comment (String text) throws IOException, IllegalArgumentException, IllegalStateException; void docdecl (String text) throws IOException, IllegalArgumentException, IllegalStateException; void ignorableWhitespace (String text) throws IOException, IllegalArgumentException, IllegalStateException; /** * Write all pending output to the stream. * If method startTag() or attribute() was called then start tag is closed (final >) * before flush() is called on underlying output stream. * * <p><b>NOTE:</b> if there is need to close start tag * (so no more attribute() calls are allowed) but without flushing output * call method text() with empty string (text("")). * */ void flush () throws IOException; }