/*   Copyright 2004 The Apache Software Foundation
 *
 *   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.
 */
/*
* Contributed by Dutta Satadip for adding functionality to retrieve xml validation errors
* programatically.
*/
package org.apache.xmlbeans;

import java.util.List;

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

/**
 * The XmlValidationError class extends the {@link XmlError }XMLError class. The XML Validator contains
 * extra attributes that can be used to construct the XML validation error programatically.
 * <p>
 * To extract the validation error cast the errors to XmlValidationError instead of
 * XmlError for example:
 * <br/>
 * <pre>
 * xobj.validate(new XmlOptions().setErrorListener(errors))
 * for (Iterator it = errors.iterator(); it.hasNext(); )
 * {
 *      XmlError err = (XmlError)it.next());
 *      if (err instanceof XmlValidationError)
 *      {
 *          XmlValidationError validationError = (XmlValidationError) err;
 *     }
 * }
 *</pre>
 *
 *
 * Whenever an XmlValidationError is retrieved it will always be populated with
 * the following information:
 * <ul>
 * <li>Message</li>
 * <li>Severity</li>
 * <li>Error Type </li>
 * </ul>
 *
 * <p>
 *  The error type is very important because the other attributes of the
 * XMLValidationError are populated based on the error type.
 * </p>
 * if errortype == INCORRECT_ELEMENT then
 * <br/>
 *      offendingQName, badSchemaType will always be present, however expectedSchemaType and
 *      expectedQNames are available only if it is possible to determine them during vaildation.
 *<br/>
 *
 * <p>
 * if errortype == ELEMENT_NOT_ALLOWED then
 * <br/>
 *      badSchemaType will always be present, however expectedSchemaType and
 *      offendingQName are available only if it is possible to determine them during vaildation.
 * <br/>
 *
 * <p>
 * if errortype == INCORRECT_ATTRIBUTE then
 * <br/>
 *      offendingQName, badSchemaType will always be present
 * <br/>
 *
 * <p>
 * if errortype == ATTRIBUTE_TYPE_INVALID  then
 * <br/>
 *      no other addtional attributes are populated
 * <br/>
 *
 * <p>
 * if errortype == LIST_INVALID  then
 * <br/>
 *      expectedSchemaType will always be present
 * <br/>
 *
 * <p>
 * if errortype == UNION_INVALID  then
 * <br/>
 *      expectedSchemaType will always be present
 * <br/>
 *
 *
 * <p>
 * if errortype == NIL_ELEMENT  then
 * <br/>
 *      offendingQName, expectedSchemaType and badSchemaType  will always be present
 * <br/>
 *
 * <p>
 * if errortype == ELEMENT_TYPE_INVALID  then
 * <br/>
 *      offendingQName  will always be present, other attributes may be available
 * <br/>
 */

public class XmlValidationError extends XmlError
{

    public static final int INCORRECT_ELEMENT = 1;
    public static final int ELEMENT_NOT_ALLOWED = 2;
    public static final int ELEMENT_TYPE_INVALID = 3;
    public static final int NIL_ELEMENT = 4;

    public static final int INCORRECT_ATTRIBUTE = 1000;
    public static final int ATTRIBUTE_TYPE_INVALID = 1001;

    public static final int LIST_INVALID = 2000;
    public static final int UNION_INVALID = 3000;

    public static final int UNDEFINED = 10000;

    // QName of field in error.  can be null.
    private QName _fieldQName;
    private QName _offendingQName;
    private SchemaType _expectedSchemaType;

    private List _expectedQNames;
    private int _errorType;

    private SchemaType _badSchemaType;

    /**
     * The static factory methods should be used instead of
     * this constructor.
     */
    // KHK: remove this
    private XmlValidationError(String message, int severity,
       XmlCursor cursor, QName fieldQName, QName offendingQname, SchemaType expectedSchemaType,
       List expectedQNames, int errorType, SchemaType badSchemaType)
    {
        super(message, (String)null, severity, cursor);

        setFieldQName(fieldQName);
        setOffendingQName(offendingQname);
        setExpectedSchemaType(expectedSchemaType);
        setExpectedQNames(expectedQNames);
        setErrorType(errorType);
        setBadSchemaType(badSchemaType);
    }

    /**
     * The static factory methods should be used instead of
     * this constructor.
     */
    private XmlValidationError(String code, Object[] args, int severity,
       XmlCursor cursor, QName fieldQName, QName offendingQname, SchemaType expectedSchemaType,
       List expectedQNames, int errorType, SchemaType badSchemaType)
    {
        super(code, args, severity, cursor);

        setFieldQName(fieldQName);
        setOffendingQName(offendingQname);
        setExpectedSchemaType(expectedSchemaType);
        setExpectedQNames(expectedQNames);
        setErrorType(errorType);
        setBadSchemaType(badSchemaType);
    }

    /**
     * The static factory methods should be used instead of
     * this constructor.
     */
    // KHK: remove this
    private XmlValidationError(String message, int severity,
       Location loc, QName fieldQName, QName offendingQname, SchemaType expectedSchemaType,
       List expectedQNames, int errorType, SchemaType badSchemaType)
    {
        super(message, (String)null, severity, loc);

        setFieldQName(fieldQName);
        setOffendingQName(offendingQname);
        setExpectedSchemaType(expectedSchemaType);
        setExpectedQNames(expectedQNames);
        setErrorType(errorType);
        setBadSchemaType(badSchemaType);
    }

    /**
     * The static factory methods should be used instead of
     * this constructor.
     */
    private XmlValidationError(String code, Object[] args, int severity,
        Location loc, QName fieldQName, QName offendingQname, SchemaType expectedSchemaType,
        List expectedQNames, int errorType, SchemaType badSchemaType)
    {
        super(code, args, severity, loc);

        setFieldQName(fieldQName);
        setOffendingQName(offendingQname);
        setExpectedSchemaType(expectedSchemaType);
        setExpectedQNames(expectedQNames);
        setErrorType(errorType);
        setBadSchemaType(badSchemaType);
    }

    public static XmlValidationError forCursorWithDetails( String message, String code, Object[] args, int severity,
       XmlCursor cursor, QName fieldQName, QName offendingQname, SchemaType expectedSchemaType,
       List expectedQNames, int errorType, SchemaType badSchemaType)
    {
        if (code == null)
            return new XmlValidationError(message, severity, cursor, fieldQName, offendingQname,
                expectedSchemaType, expectedQNames, errorType, badSchemaType);
        else
            return new XmlValidationError(code, args, severity, cursor, fieldQName, offendingQname,
                expectedSchemaType, expectedQNames, errorType, badSchemaType);
    }

    public static XmlValidationError forLocationWithDetails( String message, String code, Object[] args, int severity,
        Location location, QName fieldQName, QName offendingQname, SchemaType expectedSchemaType,
        List expectedQNames, int errorType, SchemaType badSchemaType)
    {
        if (code == null)
            return new XmlValidationError(message, severity, location, fieldQName, offendingQname,
                expectedSchemaType, expectedQNames, errorType, badSchemaType);
        else
            return new XmlValidationError(code, args, severity, location, fieldQName, offendingQname,
                expectedSchemaType, expectedQNames, errorType, badSchemaType);
    }

    public String getMessage()
    {
        if (_fieldQName != null)
        {
            String msg = super.getMessage();
            StringBuilder sb = new StringBuilder(msg.length() + 100);

            sb.append(msg);

            sb.append(" in element ");
            sb.append(_fieldQName.getLocalPart());
            if (_fieldQName.getNamespaceURI() != null && _fieldQName.getNamespaceURI().length() != 0)
                sb.append('@').append(_fieldQName.getNamespaceURI());

            return sb.toString();
        }
        else
            return super.getMessage();
    }

    public SchemaType getBadSchemaType()
    {
        return _badSchemaType;
    }

    public void setBadSchemaType(SchemaType _badSchemaType)
    {
        this._badSchemaType = _badSchemaType;
    }

    public int getErrorType()
    {
        return _errorType;
    }

    public void setErrorType(int _errorType)
    {
        this._errorType = _errorType;
    }

    public List getExpectedQNames()
    {
        return _expectedQNames;
    }

    public void setExpectedQNames(List _expectedQNames)
    {
        this._expectedQNames = _expectedQNames;
    }

    public QName getFieldQName()
    {
        return _fieldQName;
    }

    public void setFieldQName(QName _fieldQName)
    {
        this._fieldQName = _fieldQName;
    }

    public QName getOffendingQName()
    {
        return _offendingQName;
    }

    public void setOffendingQName(QName _offendingQName)
    {
        this._offendingQName = _offendingQName;
    }

    public SchemaType getExpectedSchemaType()
    {
        return _expectedSchemaType;
    }

    public void setExpectedSchemaType(SchemaType _expectedSchemaType)
    {
        this._expectedSchemaType = _expectedSchemaType;
    }
}
