package com.ctc.wstx.cfg;

import javax.xml.XMLConstants;
import javax.xml.stream.XMLStreamConstants;

/**
 * "Static" class that contains error message constants. Note that the
 * error message constants are NOT made final; reason is that doing so
 * would make compiler inline them in other classes. Doing so would increase
 * class size (although not mem usage -- Strings do get interned), with
 * minimal performance impact.
 */
public class ErrorConsts
    implements XMLStreamConstants
{
    // // // Types of warnings we issue via XMLReporter

    public static String WT_ENT_DECL = "entity declaration";
    public static String WT_ELEM_DECL = "element declaration";
    public static String WT_ATTR_DECL = "attribute declaration";
    public static String WT_XML_DECL = "xml declaration";
    public static String WT_DT_DECL = "doctype declaration";
    public static String WT_NS_DECL = "namespace declaration";

    /**
     * This is the generic type for warnings based on XMLValidationProblem
     * objects.
     */
    public static String WT_VALIDATION = "schema validation";

    // // And then warning strings

    public static String W_UNDEFINED_ELEM = "Undefined element \"{0}\"; referred to by attribute(s)";
    public static String W_MIXED_ENCODINGS = "Inconsistent text encoding; declared as \"{0}\" in xml declaration, application had passed \"{1}\"";
    public static String W_MISSING_DTD = "Missing DOCTYPE declaration in validating mode; can not validate elements or attributes";
    public static String W_DTD_DUP_ATTR = "Attribute \"{0}\" (for element <{1}>) declared multiple times";
    public static String W_DTD_ATTR_REDECL = "Attribute \"{0}\" already declared for element <{1}>; ignoring re-declaration";

    // // // Generic errors:

    public static String ERR_INTERNAL = "Internal error";
    public static String ERR_NULL_ARG = "Illegal to pass null as argument";
    public static String ERR_UNKNOWN_FEATURE = "Unrecognized feature \"{0}\"";

    // // // Wrong reader state:

    public static String ERR_STATE_NOT_STELEM = "Current event not START_ELEMENT";
    public static String ERR_STATE_NOT_ELEM = "Current event not START_ELEMENT or END_ELEMENT";
    public static String ERR_STATE_NOT_PI = "Current event not PROCESSING_INSTRUCTION";
    public static String ERR_STATE_NOT_ELEM_OR_TEXT = "Current event ({0}) not START_ELEMENT, END_ELEMENT, CHARACTERS or CDATA";

    // // // XML declaration related problems

    public static String ERR_XML_10_VS_11 = "XML 1.0 document can not refer to XML 1.1 parsed external entities";

    // // // Structural problems, prolog/epilog:

    public static String ERR_DTD_IN_EPILOG = "Can not have DOCTYPE declaration in epilog";
    public static String ERR_DTD_DUP = "Duplicate DOCTYPE declaration";
    public static String ERR_CDATA_IN_EPILOG = " (CDATA not allowed in prolog/epilog)";

    // // // Illegal input:

    public static String ERR_HYPHENS_IN_COMMENT = "String '--' not allowed in comment (missing '>'?)";
    public static String ERR_BRACKET_IN_TEXT = "String ']]>' not allowed in textual content, except as the end marker of CDATA section";

    // // // Generic parsing errors:

    public static String ERR_UNEXP_KEYWORD = "Unexpected keyword \"{0}\"; expected \"{1}\"";

    public static String ERR_WF_PI_MISSING_TARGET = "Missing processing instruction target";
    public static String ERR_WF_PI_XML_TARGET = "Illegal processing instruction target (\"{0}\"); 'xml' (case insensitive) is reserved by the specs.";
    public static String ERR_WF_PI_XML_MISSING_SPACE = "excepted either space or \"?>\" after PI target";

    // // // Entity problems:

    public static String ERR_WF_ENTITY_EXT_DECLARED = "Entity \"{0}\" declared externally, but referenced from a document declared 'standalone=\"yes\"'";

    public static String ERR_WF_GE_UNDECLARED = "Undeclared general entity \"{0}\"";

    public static String ERR_WF_GE_UNDECLARED_SA = "Undeclared general entity \"{0}\" (document in stand-alone mode; perhaps declared externally?)";

    // // // Namespace problems:

    public static String ERR_NS_UNDECLARED = "Undeclared namespace prefix \"{0}\"";
    public static String ERR_NS_UNDECLARED_FOR_ATTR = "Undeclared namespace prefix \"{0}\" (for attribute \"{1}\")";

    public static String ERR_NS_REDECL_XML = "Trying to redeclare prefix \"xml\" from its default URI \""
                                               +XMLConstants.XML_NS_URI
                                               +"\" to \"{0}\"";

    public static String ERR_NS_REDECL_XMLNS = "Trying to declare prefix \"xmlns\" (illegal as per NS 1.1 #4)";

    public static String ERR_NS_REDECL_XML_URI = "Trying to bind URI \""
        +XMLConstants.XML_NS_URI+"\" to prefix \"{0}\" (can only bind to \"xml\")";

    public static String ERR_NS_REDECL_XMLNS_URI = "Trying to bind URI \""
        +XMLConstants.XMLNS_ATTRIBUTE_NS_URI+"\" to prefix \"{0}\" (can not be explicitly bound)";

    public static String ERR_NS_EMPTY = 
"Non-default namespace can not map to empty URI (as per Namespace 1.0 # 2) in XML 1.0 documents";


    // // // DTD-specific:

    public static String ERR_DTD_MAINLEVEL_KEYWORD = "; expected a keyword (ATTLIST, ELEMENT, ENTITY, NOTATION), comment, or conditional section";

    public static String ERR_DTD_ATTR_TYPE = "; expected one of type (CDATA, ID, IDREF, IDREFS, ENTITY, ENTITIES NOTATION, NMTOKEN or NMTOKENS)";

    public static String ERR_DTD_DEFAULT_TYPE = "; expected #REQUIRED, #IMPLIED or #FIXED";

    public static String ERR_DTD_ELEM_REDEFD =
        "Trying to redefine element \"{0}\" (originally defined at {1})";
    public static String ERR_DTD_NOTATION_REDEFD =
        "Trying to redefine notation \"{0}\" (originally defined at {1})";

    public static String ERR_DTD_UNDECLARED_ENTITY =
        "Undeclared {0} entity \"{1}\"";

    public static String ERR_DTD_XML_SPACE = "Attribute xml:space has to be defined of type enumerated, and have 1 or 2 values, 'default' and/or 'preserve'";

    public static String ERR_DTD_XML_ID = "Attribute xml:id has to have attribute type of ID, as per Xml:id specification";


    // // // DTD-validation:

    public static String ERR_VLD_UNKNOWN_ELEM = "Undefined element <{0}> encountered";

    public static String ERR_VLD_EMPTY = "Element <{0}> has EMPTY content specification; can not contain {1}";
    public static String ERR_VLD_NON_MIXED = "Element <{0}> has non-mixed content specification; can not contain non-white space text, or any CDATA sections";
    public static String ERR_VLD_ANY = "Element <{0}> has ANY content specification; can not contain {1}";
    public static String ERR_VLD_UNKNOWN_ATTR = "Element <{0}> has no attribute \"{1}\"";
    public static String ERR_VLD_WRONG_ROOT = "Unexpected root element <{0}>; expected <{0}> as per DOCTYPE declaration";

    // // // Output problems:

    public static String WERR_PROLOG_CDATA =
        "Trying to output a CDATA block outside main element tree (in prolog or epilog)";
    public static String WERR_PROLOG_NONWS_TEXT =
        "Trying to output non-whitespace characters outside main element tree (in prolog or epilog)";
    public static String WERR_PROLOG_SECOND_ROOT =
        "Trying to output second root, <{0}>";

    public static String WERR_CDATA_CONTENT =
        "Illegal input: CDATA block has embedded ']]>' in it (index {0})";
    public static String WERR_COMMENT_CONTENT = 
        "Illegal input: comment content has embedded '--' in it (index {0})";

    public static String WERR_ATTR_NO_ELEM =
        "Trying to write an attribute when there is no open start element.";

    public static String WERR_NAME_EMPTY = "Illegal to pass empty name";

    public static String WERR_NAME_ILLEGAL_FIRST_CHAR = "Illegal first name character {0} in name \"{1}\"";
    public static String WERR_NAME_ILLEGAL_CHAR = "Illegal name character {0} in name \"{1}\" (index #{2})";

    /*
    ////////////////////////////////////////////////////
    // Utility methods
    ////////////////////////////////////////////////////
     */

    public static String tokenTypeDesc(int type)
    {
        switch (type) {
        case START_ELEMENT:
            return "START_ELEMENT";
        case END_ELEMENT:
            return "END_ELEMENT";
        case START_DOCUMENT:
            return "START_DOCUMENT";
        case END_DOCUMENT:
            return "END_DOCUMENT";

        case CHARACTERS:
            return "CHARACTERS";
        case CDATA:
            return "CDATA";
        case SPACE:
            return "SPACE";

        case COMMENT:
            return "COMMENT";
        case PROCESSING_INSTRUCTION:
            return "PROCESSING_INSTRUCTION";
        case DTD:
            return "DTD";
        case ENTITY_REFERENCE:
            return "ENTITY_REFERENCE";
        }
        return "["+type+"]";
    }
}
