package org.codehaus.stax2.io;

import java.io.OutputStream;
import java.io.IOException;
import java.io.Writer;

import javax.xml.transform.Result;

/**
 * This is the base class for additional output results (implementations
 * of {@link javax.xml.transform.Result}) that Stax2
 * {@link org.codehaus.stax2.XMLInputFactory2} implementations should support.
 *<p>
 * Note about usage by the parser factory implementations: the expectation
 * is that at least one of methods {@link #constructWriter} and
 * {@link #constructOutputStream} will succeed, but not necessarily both.
 * This generally depends on type of resource being represented: for example,
 * if the source is a StringBuffer, it is most naturally
 * represent via {@link Writer}. For File-backed results, on the other hand,
 * an {@link OutputStream} is the most natural access method.
 *<p>
 * Other things to note about using result {@link Writer}s and
 * {@link OutputStream}s:
 * <ul>
 *  <li>Caller is responsible for closing any {@link Writer} and
 *    {@link OutputStream} instances requested. That is, caller owns
 *    these accessor objects.
 *   </li>
 *  <li>Result objects are only required to return a non-null object
 *    <b>once</b>: after this, if new non-null instances are returned,
 *    they <b>must not</b> be the same objects as returned earlier.
 *    Implementations can choose to construct new instances to the same
 *    backing data structure or resource; if so, they should document
 *    this behavior.
 *   </li>
 *  </ul>
 */
public abstract class Stax2Result
    implements Result
{
    protected String mSystemId;
    protected String mPublicId;
    protected String mEncoding;

    protected Stax2Result() { }

    /*
    /////////////////////////////////////////
    // Public API, simple accessors/mutators
    /////////////////////////////////////////
     */

    public String getSystemId() {
        return mSystemId;
    }

    public void setSystemId(String id) {
        mSystemId = id;
    }

    public String getPublicId() {
        return mPublicId;
    }

    public void setPublicId(String id) {
        mPublicId = id;
    }

    public String getEncoding() {
        return mEncoding;
    }

    public void setEncoding(String enc) {
        mEncoding = enc;
    }


    /*
    ///////////////////////////////////////////
    // Public API, convenience factory methods
    ///////////////////////////////////////////
     */

    /**
     * This method creates a {@link Writer} via which underlying output
     * target can be written to. Note that caller is responsible for
     * closing that Writer when it is done reading it.
     */
    public abstract Writer constructWriter()
        throws IOException;

    /**
     * This method creates an {@link OutputStream} via which underlying output
     * target can be written to. Note that caller is responsible for
     * closing that OutputStream when it is done reading it
     */
    public abstract OutputStream constructOutputStream()
        throws IOException;
}
