/*
 * Copyright 2011, 2012 Odysseus Software GmbH
 *
 * Licensed 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.
 */
package org.apache.synapse.commons.staxon.core.json;

import javax.xml.namespace.QName;
import javax.xml.stream.XMLOutputFactory;

/**
 * <p>Json XML factory configuration interface.</p>
 * <p>A <code>JsonXMLConfig</code> instance can be used to configure either
 * of <code>JsonXMLInputFactory</code> or <code>JsonXMLOutputFactory</code>.</p>
 * <p/>
 * <p>Default values are defined by static {@link #DEFAULT} instance.
 *
 * @see JsonXMLInputFactory
 * @see JsonXMLOutputFactory
 */
public interface JsonXMLConfig {
    /**
     * <p>Default configuration:</p>
     * <ul>
     * <li><em>autoArray</em> - <code>false</code></li>
     * <li><em>autoPrimitive</em> - <code>false</code></li>
     * <li><em>multiplePI</em> - <code>true</code></li>
     * <li><em>namespaceDeclarations</em> - <code>true</code></li>
     * <li><em>namespaceSeparator</em> - <code>':'</code></li>
     * <li><em>prettyPrint</em> - <code>false</code></li>
     * <li><em>virtualRoot</em> - <code>null</code></li>
     * </ul>
     */
    public static final JsonXMLConfig DEFAULT = new JsonXMLConfig() {
        @Override
        public boolean isAutoArray() {
            return false;
        }

        @Override
        public boolean isAutoPrimitive() {
            return false;
        }

        @Override
        public boolean isMultiplePI() {
            return true;
        }

        @Override
        public boolean isNamespaceDeclarations() {
            return true;
        }

        @Override
        public char getNamespaceSeparator() {
            return ':';
        }

        @Override
        public boolean isPrettyPrint() {
            return false;
        }

        @Override
        public QName getVirtualRoot() {
            return null;
        }

        @Override
        public boolean isRepairingNamespaces() {
            return false;
        }

        @Override
        public  String getCustomRegex(){
            return null;
        }

        @Override
        public String getCustomReplaceRegex() {
            return null;
        }

        @Override
        public String getCustomReplaceSequence() {
            return "";
        }

        @Override
        public boolean isReadWriteXmlNil() {
            return false;
        }

        @Override
        public boolean isWriteNullForEmptyElements() {
            return true;
        }

        @Override
        public boolean isPreserverNamespacesForJson() {
            return false;
        }

        @Override
        public boolean isProcessNCNames() {
            return false;
        }
    };

    /**
     * <p>Trigger arrays automatically?</p>
     *
     * @return auto array flag
     * @see JsonXMLOutputFactory#PROP_AUTO_ARRAY
     */
    public boolean isAutoArray();

    /**
     * <p>Convert element text to number/boolean/null primitives automatically?</p>
     *
     * @return auto primitive flag
     * @see JsonXMLOutputFactory#PROP_AUTO_ARRAY
     */
    public boolean isAutoPrimitive();

    /**
     * <p>Whether to use the {@link JsonXMLStreamConstants#MULTIPLE_PI_TARGET}
     * processing instruction to indicate an array start.
     * If <code>true</code>, a PI is used to inform the writer to begin an array,
     * passing the name of following multiple elements as data.
     * The writer will close arrays automatically.</p>
     * If <code>true</code>, this reader will insert a PI with the field
     * name as PI data.
     * <p/>
     * <p>Note that the element given in the PI may occur zero times,
     * indicating an "empty array".</p>
     *
     * @return multiple PI flag
     * @see JsonXMLInputFactory#PROP_MULTIPLE_PI
     * @see JsonXMLOutputFactory#PROP_MULTIPLE_PI
     */
    public boolean isMultiplePI();

    /**
     * <p>Whether to write namespace declarations.</p>
     *
     * @return namespace declarations flag
     * @see JsonXMLOutputFactory#PROP_NAMESPACE_DECLARATIONS
     */
    public boolean isNamespaceDeclarations();

    /**
     * <p>Namespace prefix separator.</p>
     *
     * @return namespace separator
     * @see JsonXMLInputFactory#PROP_NAMESPACE_SEPARATOR
     * @see JsonXMLOutputFactory#PROP_NAMESPACE_SEPARATOR
     */
    public char getNamespaceSeparator();

    /**
     * <p>Format output for better readability?</p>
     *
     * @return pretty print flag
     * @see JsonXMLOutputFactory#PROP_PRETTY_PRINT
     */
    public boolean isPrettyPrint();

    /**
     * <p>JSON documents may have have multiple root properties. However,
     * XML requires a single root element. This property specifies
     * the root as a "virtual" element, which will be removed from the stream
     * when writing and added to the stream when reading.
     *
     * @return virtual root
     * @see JsonXMLInputFactory#PROP_VIRTUAL_ROOT
     * @see JsonXMLOutputFactory#PROP_VIRTUAL_ROOT
     */
    public QName getVirtualRoot();

    /**
     * <p>Repair namespaces when writing</+>
     *
     * @return namespace-repairing flag
     * @see XMLOutputFactory#IS_REPAIRING_NAMESPACES
     */
    public boolean isRepairingNamespaces();


    /**
     *<p>Format output ignoring scientific numbers</p>
     * @see JsonXMLOutputFactory#PROP_CUSTOM_REGEX
     * @return autoprimitive enabled with scientific Number Ignore flag
     */
    public String getCustomRegex();

    public String getCustomReplaceRegex();

    public String getCustomReplaceSequence();

    public boolean isReadWriteXmlNil();

    /**
     * Used in XML->JSON conversion. Decides whether to set null
     * or "" for an empty XML element without nil attribute
     *
     * @return true if null is written, false if "" is written
     */
    public boolean isWriteNullForEmptyElements();

    /**
     * Preserves the namespace declarations in the JSON output in XML to JSON transformations.
     *
     * @return preserveNamespacesForJson
     */
    public boolean isPreserverNamespacesForJson();

    /**
     * Builds valid XML NCNames when building XML element names in XML to JSON transformations.
     *
     * @return processNCNames
     */
    public boolean isProcessNCNames();
}