/*
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements. See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership. The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the  "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
/*
 * $Id:  $
 */

package org.apache.xml.serializer.dom3;

import org.w3c.dom.ls.LSOutput;

import java.io.Writer;
import java.io.OutputStream;

/**
 * This is a copy of the Xerces-2J class org.apache.xerces.dom.DOMOutputImpl.java
 * 
 * This class represents an output destination for data.
 * This interface allows an application to encapsulate information about an
 * output destination in a single object, which may include a URI, a byte stream
 * (possibly with a specifiedencoding), a base URI, and/or a character stream.
 * The exact definitions of a byte stream and a character stream are binding
 * dependent.
 * The application is expected to provide objects that implement this interface
 * whenever such objects are needed. The application can either provide its
 * own objects that implement this interface, or it can use the generic factory
 * method DOMImplementationLS.createLSOutput() to create objects that
 * implement this interface.
 * The DOMSerializer will use the LSOutput object to determine where to
 * serialize the output to. The DOMSerializer will look at the different
 * outputs specified in the LSOutput in the following order to know which one
 * to output to, the first one that data can be output to will be used:
 * 1.LSOutput.characterStream
 * 2.LSOutput.byteStream
 * 3.LSOutput.systemId
 * LSOutput objects belong to the application. The DOM implementation will
 * never modify them (though it may make copies and modify the copies,
 * if necessary).
 *
 *
 * @author Arun Yadav, Sun Microsytems
 * @author Gopal Sharma, Sun Microsystems
 * @version $Id : 
 * @xsl.usage internal 
 */

final class DOMOutputImpl implements LSOutput {
    
    private Writer fCharStream = null;
    private OutputStream fByteStream = null;
    private String fSystemId = null;
    private String fEncoding = null;
    
    /**
     * Default Constructor
     */
    DOMOutputImpl() {}
    
    /**
     * An attribute of a language and binding dependent type that represents a
     * writable stream of bytes. If the application knows the character encoding
     * of the byte stream, it should set the encoding attribute. Setting the
     * encoding in this way will override any encoding specified in an XML
     * declaration in the data.
     */
    
    public Writer getCharacterStream(){
        return fCharStream;
    };
    
    /**
     * An attribute of a language and binding dependent type that represents a
     * writable stream of bytes. If the application knows the character encoding
     * of the byte stream, it should set the encoding attribute. Setting the
     * encoding in this way will override any encoding specified in an XML
     * declaration in the data.
     */
    
    public void setCharacterStream(Writer characterStream){
        fCharStream = characterStream;
    };
    
    /**
     * Depending on the language binding in use, this attribute may not be
     * available. An attribute of a language and binding dependent type that
     * represents a writable stream to which 16-bit units can be output. The
     * application must encode the stream using UTF-16 (defined in [Unicode] and
     *  Amendment 1 of [ISO/IEC 10646]).
     */
    
    public OutputStream getByteStream(){
        return fByteStream;
    };
    
    /**
     * Depending on the language binding in use, this attribute may not be
     * available. An attribute of a language and binding dependent type that
     * represents a writable stream to which 16-bit units can be output. The
     * application must encode the stream using UTF-16 (defined in [Unicode] and
     *  Amendment 1 of [ISO/IEC 10646]).
     */
    
    public void setByteStream(OutputStream byteStream){
        fByteStream = byteStream;
    };
    
    /**
     * The system identifier, a URI reference [IETF RFC 2396], for this output
     *  destination. If the application knows the character encoding of the
     *  object pointed to by the system identifier, it can set the encoding
     *  using the encoding attribute. If the system ID is a relative URI
     *  reference (see section 5 in [IETF RFC 2396]), the behavior is
     *  implementation dependent.
     */
    
    public String getSystemId(){
        return fSystemId;
    };
    
    /**
     * The system identifier, a URI reference [IETF RFC 2396], for this output
     *  destination. If the application knows the character encoding of the
     *  object pointed to by the system identifier, it can set the encoding
     *  using the encoding attribute. If the system ID is a relative URI
     *  reference (see section 5 in [IETF RFC 2396]), the behavior is
     *  implementation dependent.
     */
    
    public void setSystemId(String systemId){
        fSystemId = systemId;
    };
    
    /**
     * The character encoding, if known. The encoding must be a string
     * acceptable for an XML encoding declaration ([XML 1.0] section 4.3.3
     * "Character Encoding in Entities"). This attribute has no effect when the
     * application provides a character stream or string data. For other sources
     * of input, an encoding specified by means of this attribute will override
     * any encoding specified in the XML declaration or the Text declaration, or
     * an encoding obtained from a higher level protocol, such as HTTP
     * [IETF RFC 2616].
     */
    
    public String getEncoding(){
        return fEncoding;
    };
    
    /**
     * The character encoding, if known. The encoding must be a string
     * acceptable for an XML encoding declaration ([XML 1.0] section 4.3.3
     * "Character Encoding in Entities"). This attribute has no effect when the
     * application provides a character stream or string data. For other sources
     * of input, an encoding specified by means of this attribute will override
     * any encoding specified in the XML declaration or the Text declaration, or
     * an encoding obtained from a higher level protocol, such as HTTP
     * [IETF RFC 2616].
     */
    
    public void setEncoding(String encoding){
        fEncoding = encoding;
    };
    
}//DOMOutputImpl
