/****************************************************************************
**
** Copyright (C) 2016 The Qt Company Ltd.
** Contact: https://www.qt.io/licensing/
**
** This file is part of the QtXmlPatterns module of the Qt Toolkit.
**
** $QT_BEGIN_LICENSE:LGPL$
** Commercial License Usage
** Licensees holding valid commercial Qt licenses may use this file in
** accordance with the commercial license agreement provided with the
** Software or, alternatively, in accordance with the terms contained in
** a written agreement between you and The Qt Company. For licensing terms
** and conditions see https://www.qt.io/terms-conditions. For further
** information use the contact form at https://www.qt.io/contact-us.
**
** GNU Lesser General Public License Usage
** Alternatively, this file may be used under the terms of the GNU Lesser
** General Public License version 3 as published by the Free Software
** Foundation and appearing in the file LICENSE.LGPL3 included in the
** packaging of this file. Please review the following information to
** ensure the GNU Lesser General Public License version 3 requirements
** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
**
** GNU General Public License Usage
** Alternatively, this file may be used under the terms of the GNU
** General Public License version 2.0 or (at your option) the GNU General
** Public license version 3 or any later version approved by the KDE Free
** Qt Foundation. The licenses are as published by the Free Software
** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
** included in the packaging of this file. Please review the following
** information to ensure the GNU General Public License requirements will
** be met: https://www.gnu.org/licenses/gpl-2.0.html and
** https://www.gnu.org/licenses/gpl-3.0.html.
**
** $QT_END_LICENSE$
**
****************************************************************************/

//
//  W A R N I N G
//  -------------
//
// This file is not part of the Qt API.  It exists purely as an
// implementation detail.  This header file may change from version to
// version without notice, or even be removed.
//
// We mean it.

#ifndef Patternist_MaintainingReader_H
#define Patternist_MaintainingReader_H

#include <QSet>
#include <QSourceLocation>
#include <QStack>
#include <QStringList>
#include <QXmlStreamReader>

#include <private/qxpathhelper_p.h>
#include <private/qxslttokenlookup_p.h>

QT_BEGIN_NAMESPACE

class QUrl;

namespace QPatternist
{
    /**
     * @short A structure that lists the optional and required
     * attributes of an element. Used with MaintainingReader.
     *
     * A constant source to misunderstandings is mixing up the order of
     * arguments for functions that takes a local name and a namespace. Be wary
     * of this.
     *
     * @author Frans Englich <frans.englich@nokia.com>
     * @since 4.5
     */
    template<typename TokenLookupClass,
             typename LookupKey = typename TokenLookupClass::NodeName>
    class ElementDescription
    {
    public:
        typedef QHash<LookupKey, ElementDescription<TokenLookupClass, LookupKey> > Hash;
        QSet<typename TokenLookupClass::NodeName> requiredAttributes;
        QSet<typename TokenLookupClass::NodeName> optionalAttributes;
    };

    /**
     * @short Base class for tokenizers that reads XML formats. This is
     * XSLTTokenizer, and the W3C XML Schema parser.
     *
     * MaintainingReader is intended for sub-classing.
     *
     * @tparam TokenLookupClass The name of the class that is generated by
     * QTokenAutomaton and which supplies tokenizing tokens. For XSLTTokenizer,
     * this is XSLTTokenLookup, for instance.
     *
     * @tparam LookupKey The type that is passed to validateElement() and is
     * the key in ElementDescription. For the schema code, where elements have
     * different interpretations depending on context, the lookup key is hence
     * not equal element name.
     *
     * @author Frans Englich <frans.englich@nokia.com>
     * @since 4.5
     */
    template<typename TokenLookupClass,
             typename LookupKey = typename TokenLookupClass::NodeName>
    class MaintainingReader : public QXmlStreamReader
                            , protected TokenLookupClass
    {
    protected:

        MaintainingReader(const typename ElementDescription<TokenLookupClass, LookupKey>::Hash &elementDescriptions,
                          const QSet<typename TokenLookupClass::NodeName> &standardAttributes,
                          const ReportContext::Ptr &context,
                          QIODevice *const queryDevice);

        virtual ~MaintainingReader();

        TokenType readNext();

        /**
         * Returns the name of the current element.
         */
        inline typename TokenLookupClass::NodeName currentElementName() const;

        /**
         * @short Convenience function for calling ReportContext::error().
         */
        void error(const QString &message,
                   const ReportContext::ErrorCode code) const;

        /**
         * @short Convenience function for calling ReportContext::warning().
         */
        void warning(const QString &message) const;

        /**
         * @short Returns the location of the document that MaintainingReader
         * is parsing. Used for error reporting
         */
        virtual QUrl documentURI() const = 0;

        /**
         * @short Returns @c true, if any attribute is allowed on the
         * element currently being validated.
         */
        virtual bool isAnyAttributeAllowed() const = 0;

        /**
         * QXmlStreamReader::isWhitespace() returns true for whitespace that is
         * not expressed as character references, while XSL-T operatates ontop
         * of the XDM, which means we needs to return true for those too.
         *
         * @see <a href="http://www.w3.org/TR/xslt20/#data-model">4 Data Model</a>
         */
        bool isWhitespace() const;

        /**
         * This function is not merged with handleStandardAttributes() because
         * handleStandardAttributes() needs to be called for all elements,
         * while validateElement() only applies to XSL-T elements.
         *
         * @see handleStandardAttributes()
         */
        void validateElement(const LookupKey name) const;

        QXmlStreamAttributes                                                    m_currentAttributes;

        bool                                                                    m_hasHandledStandardAttributes;

        /**
         * This stack mirrors the depth of elements in the parsed document. If
         * no @c xml:space is present on the current element, MaintainingReader
         * simply pushes the current top(). However, it never sets the value
         * depending on @c xml:space's value.
         */
        QStack<bool>                                                            m_stripWhitespace;

        /**
         * @short Returns the value for attribute by name \a name.
         *
         * If it doesn't exist, an error is raised.
         *
         * It is assumed that m_reader's current state is
         * QXmlStreamReader::StartElement.
         */
        QString readAttribute(const QString &localName,
                              const QString &namespaceURI = QString()) const;

        /**
         * @short Returns @c true if the current element has an attribute whose
         * name is @p namespaceURI and local name is @p localName.
         */
        bool hasAttribute(const QString &namespaceURI, const QString &localName) const;

        /**
         * @short Returns @c true if the current element has an attribute whose
         * local name is @p localName and namespace URI is null.
         */
        inline bool hasAttribute(const QString &localName) const;

    private:
        typename TokenLookupClass::NodeName                                     m_currentElementName;

        /**
         * This member is private, see the error() and warning() functions in
         * this class.
         */
        const ReportContext::Ptr                                                m_context;

        /**
         * Returns the current location that QXmlStreamReader has.
         */
        inline QSourceLocation currentLocation() const;

        const typename ElementDescription<TokenLookupClass, LookupKey>::Hash    m_elementDescriptions;
        const QSet<typename TokenLookupClass::NodeName>                         m_standardAttributes;
        Q_DISABLE_COPY(MaintainingReader)
    };

#include "qmaintainingreader_tpl_p.h"

}

QT_END_NAMESPACE

#endif

