package org.xmlpull.v1; import java.io.IOException; import java.io.OutputStream; import java.io.Writer; /** * Define an interface to serialziation of XML Infoset. This interface abstracts * away if serialized XML is XML 1.0 comaptible 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 recommened to use an optional * feature to signal that implementation is not supporting this kind of output. */ public interface XmlSerializer { /** * 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; void cdsect(String text) throws IOException, IllegalArgumentException, IllegalStateException; void comment(String text) throws IOException, IllegalArgumentException, IllegalStateException; void docdecl(String text) 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; /** * 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 serialzier * will make sure that default empty namespace is declared (in XML 1.0 * xmlns=''). */ XmlSerializer endTag(String namespace, String name) throws IOException, IllegalArgumentException, IllegalStateException; void entityRef(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 flushinging output call method text() with * empty string (text("")). * */ void flush() throws IOException; /** * 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(); /** * 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); /** * 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(); /** * Returns the namespace URI of the current element as set by startTag(). * * <p> * <b>NOTE:</b> that measn in particaulr 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(); /** * 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 defualt 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; /** * 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); void ignorableWhitespace(String text) throws IOException, IllegalArgumentException, IllegalStateException; void processingInstruction(String text) 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; /** * 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 recocgnized 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; /** * 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; /** * 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; /** * Set the value of a property. (the property name is recommened 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 recocgnized 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; /** * 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; /** * 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 serialzier 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; /** * Writes text, where special XML chars are escaped automatically */ XmlSerializer text(char[] buf, int start, int len) throws IOException, IllegalArgumentException, IllegalStateException; /** * Writes text, where special XML chars are escaped automatically */ XmlSerializer text(String text) throws IOException, IllegalArgumentException, IllegalStateException; }