/*
 * 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: XSLOutputAttributes.java 468654 2006-10-28 07:09:23Z minchau $
 */
package org.apache.xml.serializer;

import java.util.Vector;

/**
 * This interface has methods associated with the XSLT xsl:output attribues
 * specified in the stylesheet that effect the format of the document output.
 * 
 * In an XSLT stylesheet these attributes appear for example as:
 * <pre>
 * <xsl:output method="xml" omit-xml-declaration="no" indent="yes"/> 
 * </pre>
 * The xsl:output attributes covered in this interface are:
 * <pre>
 * version
 * encoding
 * omit-xml-declarations
 * standalone
 * doctype-public
 * doctype-system
 * cdata-section-elements
 * indent
 * media-type
 * </pre>
 * 
 * The one attribute not covered in this interface is <code>method</code> as
 * this value is implicitly chosen by the serializer that is created, for
 * example ToXMLStream vs. ToHTMLStream or another one.
 * 
 * This interface is only used internally within Xalan.
 * 
 * @xsl.usage internal
 */
interface XSLOutputAttributes
{
    /**
     * Returns the previously set value of the value to be used as the public
     * identifier in the document type declaration (DTD).
     *
     *@return the public identifier to be used in the DOCTYPE declaration in the
     * output document.
     */
    public String getDoctypePublic();
    /**
     * Returns the previously set value of the value to be used
     * as the system identifier in the document type declaration (DTD).
     * @return the system identifier to be used in the DOCTYPE declaration in
     * the output document.
     *
     */ 
    public String getDoctypeSystem();
    /**
     * @return the character encoding to be used in the output document.
     */    
    public String getEncoding();
    /**
	 * @return true if the output document should be indented to visually
	 * indicate its structure.
     */    
    public boolean getIndent();
    
    /**
     * @return the number of spaces to indent for each indentation level.
     */
    public int getIndentAmount();
    /**
     * @return the mediatype the media-type or MIME type associated with the
     * output document.
     */    
    public String getMediaType();
    /**
     * @return true if the XML declaration is to be omitted from the output
     * document.
     */    
    public boolean getOmitXMLDeclaration();
    /**
      * @return a value of "yes" if the <code>standalone</code> delaration is to
      * be included in the output document.
      */    
    public String getStandalone();
    /**
     * @return the version of the output format.
     */    
    public String getVersion();






    /**
     * Sets the value coming from the xsl:output cdata-section-elements
     * stylesheet property.
     * 
     * This sets the elements whose text elements are to be output as CDATA
     * sections.
     * @param URI_and_localNames pairs of namespace URI and local names that
     * identify elements whose text elements are to be output as CDATA sections.
     * The namespace of the local element must be the given URI to match. The
     * qName is not given because the prefix does not matter, only the namespace
     * URI to which that prefix would map matters, so the prefix itself is not
     * relevant in specifying which elements have their text to be output as
     * CDATA sections.
     */
    public void setCdataSectionElements(Vector URI_and_localNames);

    /** Set the value coming from the xsl:output doctype-public and doctype-system stylesheet properties
     * @param system the system identifier to be used in the DOCTYPE declaration
     * in the output document.
     * @param pub the public identifier to be used in the DOCTYPE declaration in
     * the output document.
     */
    public void setDoctype(String system, String pub);

    /** Set the value coming from the xsl:output doctype-public stylesheet attribute.
      * @param doctype the public identifier to be used in the DOCTYPE
      * declaration in the output document.
      */
    public void setDoctypePublic(String doctype);
    /** Set the value coming from the xsl:output doctype-system stylesheet attribute.
      * @param doctype the system identifier to be used in the DOCTYPE
      * declaration in the output document.
      */
    public void setDoctypeSystem(String doctype);
    /**
     * Sets the character encoding coming from the xsl:output encoding stylesheet attribute.
     * @param encoding the character encoding
     */
    public void setEncoding(String encoding);
    /**
     * Sets the value coming from the xsl:output indent stylesheet
     * attribute.
     * @param indent true if the output document should be indented to visually
     * indicate its structure.
     */
    public void setIndent(boolean indent);
    /**
     * Sets the value coming from the xsl:output media-type stylesheet attribute.
     * @param mediatype the media-type or MIME type associated with the output
     * document.
     */
    public void setMediaType(String mediatype);
    /**
     * Sets the value coming from the xsl:output omit-xml-declaration stylesheet attribute
     * @param b true if the XML declaration is to be omitted from the output
     * document.
     */
    public void setOmitXMLDeclaration(boolean b);
    /**
     * Sets the value coming from the xsl:output standalone stylesheet attribute.
     * @param standalone a value of "yes" indicates that the
     * <code>standalone</code> delaration is to be included in the output
     * document.
     */
    public void setStandalone(String standalone);
    /**
     * Sets the value coming from the xsl:output version attribute.
     * @param version the version of the output format.
     */
    public void setVersion(String version);

    /**
     * Get the value for a property that affects seraialization,
     * if a property was set return that value, otherwise return
     * the default value, otherwise return null.
     * @param name The name of the property, which is just the local name
     * if it is in no namespace, but is the URI in curly braces followed by
     * the local name if it is in a namespace, for example:
     * <ul>
     * <li> "encoding"
     * <li> "method"
     * <li> "{http://xml.apache.org/xalan}indent-amount"
     * <li> "{http://xml.apache.org/xalan}line-separator"
     * </ul>
     * @return The value of the parameter
     */
    public String getOutputProperty(String name);
    /**
     * Get the default value for a property that affects seraialization,
     * or null if there is none. It is possible that a non-default value
     * was set for the property, however the value returned by this method
     * is unaffected by any non-default settings.
     * @param name The name of the property.
     * @return The default value of the parameter, or null if there is no default value.
     */    
    public String getOutputPropertyDefault(String name);
    /**
     * Set the non-default value for a property that affects seraialization.
     * @param name The name of the property, which is just the local name
     * if it is in no namespace, but is the URI in curly braces followed by
     * the local name if it is in a namespace, for example:
     * <ul>
     * <li> "encoding"
     * <li> "method"
     * <li> "{http://xml.apache.org/xalan}indent-amount"
     * <li> "{http://xml.apache.org/xalan}line-separator"
     * </ul>
     * @val The non-default value of the parameter
     */    
    public void   setOutputProperty(String name, String val);
    
    /**
     * Set the default value for a property that affects seraialization.
     * @param name The name of the property, which is just the local name
     * if it is in no namespace, but is the URI in curly braces followed by
     * the local name if it is in a namespace, for example:
     * <ul>
     * <li> "encoding"
     * <li> "method"
     * <li> "{http://xml.apache.org/xalan}indent-amount"
     * <li> "{http://xml.apache.org/xalan}line-separator"
     * </ul>
     * @val The default value of the parameter
     */ 
    public void   setOutputPropertyDefault(String name, String val);
}
