/*
 * 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.
 */
#if !defined(STYLESHEETCONSTRUCTIONCONTEXT_HEADER_GUARD_1357924680)
#define STYLESHEETCONSTRUCTIONCONTEXT_HEADER_GUARD_1357924680



// Base include file.  Must be first.
#include <xalanc/XSLT/XSLTDefinitions.hpp>



#include <xalanc/PlatformSupport/URISupport.hpp>



#include <xalanc/XalanDOM/XalanDOMString.hpp>



#include <xalanc/XPath/XalanQName.hpp>
#include <xalanc/XPath/XPath.hpp>
#include <xalanc/XPath/XPathConstructionContext.hpp>



XALAN_DECLARE_XERCES_CLASS(AttributeList)
XALAN_DECLARE_XERCES_CLASS(DocumentHandler)
XALAN_DECLARE_XERCES_CLASS(Locator)



XALAN_CPP_NAMESPACE_BEGIN



typedef XERCES_CPP_NAMESPACE_QUALIFIER AttributeList    AttributeListType;
typedef XERCES_CPP_NAMESPACE_QUALIFIER DocumentHandler  DocumentHandlerType;

XALAN_USING_XERCES(AttributeList)
XALAN_USING_XERCES(DocumentHandler)
XALAN_USING_XERCES(Locator)



class AVT;
class AVTPart;
class ElemTemplate;
class ElemTemplateElement;
class ExtensionNSHandler;
class PrefixResolver;
class Stylesheet;
class StylesheetRoot;
class XalanDocument;
class XalanMatchPatternData;
class XalanNode;
class XSLTInputSource;



//
// An abstract class which provides support for constructing the internal
// representation  of a stylesheet.
//
class XALAN_XSLT_EXPORT StylesheetConstructionContext : public XPathConstructionContext
{
public:

    typedef XalanQName::NamespacesStackType     NamespacesStackType;

    /**
     * IDs for XSL element types. These are the values
     * that must be returned by getElementToken().
     */
    enum eElementToken
    {
        ELEMNAME_UNDEFINED = -2,
        ELEMNAME_EMPTY = -1,
        ELEMNAME_WITH_PARAM,
        ELEMNAME_APPLY_TEMPLATES,
        ELEMNAME_CHOOSE,
        ELEMNAME_COMMENT,
        ELEMNAME_COPY,
        ELEMNAME_COPY_OF,
        ELEMNAME_ATTRIBUTE,
        ELEMNAME_ATTRIBUTE_SET,
        ELEMNAME_EXTENSION,
        ELEMNAME_FOR_EACH,
        ELEMNAME_KEY,
        ELEMNAME_IF,
        ELEMNAME_IMPORT,
        ELEMNAME_INCLUDE,
        ELEMNAME_CALL_TEMPLATE,
        ELEMNAME_PARAM,
        ELEMNAME_NUMBER,
        ELEMNAME_OTHERWISE,
        ELEMNAME_PI,
        ELEMNAME_PRESERVE_SPACE,
        ELEMNAME_TEMPLATE,
        ELEMNAME_SORT,
        ELEMNAME_STRIP_SPACE,
        ELEMNAME_STYLESHEET,
        ELEMNAME_TEXT,
        ELEMNAME_VALUE_OF,
        ELEMNAME_WHEN,
        ELEMNAME_FALLBACK,
        ELEMNAME_ELEMENT,

        ELEMNAME_APPLY_IMPORTS,

        ELEMNAME_VARIABLE,
        ELEMNAME_MESSAGE,

        ELEMNAME_OUTPUT,
        ELEMNAME_DECIMAL_FORMAT,
        ELEMNAME_NAMESPACE_ALIAS,

        // This one doesn't really have a name.
        // It's used for any literal result
        // element.
        ELEMNAME_LITERAL_RESULT,

        // This one doesn't really have a name.
        // It's used for any literal text in
        // the content of a literal result
        // element.
        ELEMNAME_TEXT_LITERAL_RESULT,

        // This one doesn't really have a name.
        // It's used for forward-compatible
        // processing.
        ELEMNAME_FORWARD_COMPATIBLE,

        // Extension handling.
        ELEMNAME_EXTENSION_CALL,
        ELEMNAME_EXTENSION_HANDLER
    };

    typedef URISupport::URLAutoPtrType  URLAutoPtrType;

    explicit
    StylesheetConstructionContext(MemoryManager&    theManager);

    virtual
    ~StylesheetConstructionContext();


    // These are inherited from XPathConstructionContext...
    virtual void
    problem(
            eSource                 source,
            eClassification         classification,
            const XalanDOMString&   msg,
            const Locator*          locator,
            const XalanNode*        sourceNode) = 0;

    virtual void
    problem(
            eSource                 source,
            eClassification         classification,
            const XalanDOMString&   msg,
            const XalanNode*        sourceNode) = 0;

    virtual void
    reset() = 0;

    virtual const XalanDOMString&
    getPooledString(const XalanDOMString&   theString) = 0;

    virtual const XalanDOMString&
    getPooledString(
            const XalanDOMChar*         theString,
            XalanDOMString::size_type   theLength = XalanDOMString::npos) = 0;

    virtual XalanDOMString&
    getCachedString() = 0;

    virtual bool
    releaseCachedString(XalanDOMString&     theString) = 0;

    /**
     * Create a new StylesheetRoot instance.  The StylesheetConstructionContext
     * instance owns the StylesheetRoot instance, and will delete it when asked
     * or when the StylesheetConstructionContext instance is destroyed.
     *
     * @param theBaseIdentifier A URI to the stylesheet file.
     * @return A pointer to a new StylesheetRoot instance.
     */
    virtual StylesheetRoot*
    create(const XalanDOMString&    theBaseIdentifier) = 0;

    /**
     * Create a new StylesheetRoot instance.  The StylesheetConstructionContext
     * instance owns the StylesheetRoot instance, and will delete it when asked
     * or when the StylesheetConstructionContext instance is destroyed.
     *
     * @param theInputSource A reference to the input source.
     * @return A pointer to a new StylesheetRoot instance.
     */
    virtual StylesheetRoot*
    create(const XSLTInputSource&   theInputSource) = 0;

    /**
     * Create a new Stylesheet instance.  The StylesheetConstructionContext
     * instance owns the Stylesheet instance, and will delete it when asked
     * or when the StylesheetConstructionContext instance is destroyed.
     *
     * @param A reference to the StylesheetRoot instance.
     * @param theBaseIdentifier A URI to the stylesheet file.
     * @return A pointer to a new StylesheetRoot instance.
     */
    virtual Stylesheet*
    create(
            StylesheetRoot&         theStylesheetRoot,
            const XalanDOMString&   theBaseIdentifier) = 0;

    /**
     * Destroy a StylesheetRoot instance.  If this StylesheetConstructionContext
     * instance does not own the StylesheetRoot, it will not delete it
     *
     * @param theStylesheet A pointer to the StylesheetRoot instance to delete.
     */
    virtual void
    destroy(StylesheetRoot*     theStylesheetRoot) = 0;

    /**
     * Determine the fully qualified URI for a string.
     *
     * @param urlString string to qualify
     * @return auto pointer to fully qualified URI
     */
    virtual URLAutoPtrType
    getURLFromString(const XalanDOMString&  urlString) = 0;

    /**
     * Determine the fully qualified URI for a string.
     *
     * @param urlString string to qualify
     * @return string to fully qualified URI
     */
    virtual XalanDOMString&
    getURLStringFromString(
            const XalanDOMString&   urlString,
            XalanDOMString&         theResult) = 0;

    /**
     * Determine the fully qualified URI for a string.
     *
     * @param urlString string to qualify
     * @param base base location for URI
     * @return auto pointer to fully qualified URI
     */
    virtual URLAutoPtrType
    getURLFromString(
            const XalanDOMString&   urlString,
            const XalanDOMString&   base) = 0;

    /**
     * Determine the fully qualified URI for a string.
     *
     * @param urlString string to qualify
     * @param base base location for URI
     * @return string to fully qualified URI
     */
    virtual XalanDOMString&
    getURLStringFromString(
            const XalanDOMString&   urlString,
            const XalanDOMString&   base,
            XalanDOMString&         theResult) = 0;

    /**
     * Retrieve the URI for the current XSLT namespace, for example,
     * "http://www.w3.org/1999/XSL/Transform" 
     * 
     * @return URI string
     */
    virtual const XalanDOMString&
    getXSLTNamespaceURI() const = 0;

    /**
     * Create and initialize an xpath for a match pattern and return it. This
     * is to be used by stylesheet elements that need an XPath that is
     * guaranteed to persist while it lives.
     *
     * @param locator the locator for the XPath. May be null.
     * @param str string to match
     * @param resolver resolver for namespace resolution
     * @param allowVariableReferences If true, variable references are allowed.
     * @param allowKeyFunction If true, calls to the key() function are allowed.
     * @return XPath for match pattern
     */
    virtual XPath*
    createMatchPattern(
            const Locator*          locator,
            const XalanDOMString&   str,
            const PrefixResolver&   resolver,
            bool                    allowVariableReferences = true,
            bool                    allowKeyFunction = true) = 0;

    /**
     * Create and initialize an xpath for a match pattern and return it. This
     * is to be used by stylesheet elements that need an XPath that is
     * guaranteed to persist while it lives.
     *
     * @param locator the locator for the XPath. May be null.
     * @param str string to match
     * @param resolver resolver for namespace resolution
     * @param allowVariableReferences If true, variable references are allowed.
     * @param allowKeyFunction If true, calls to the key() function are allowed.
     * @return XPath for match pattern
     */
    virtual XPath*
    createMatchPattern(
            const Locator*          locator,
            const XalanDOMChar*     str,
            const PrefixResolver&   resolver,
            bool                    allowVariableReferences = true,
            bool                    allowKeyFunction = true) = 0;

    /**
     * Create and initialize an xpath and return it. This is to be used by
     * stylesheet elements that need an XPath that is guaranteed to persist
     * while it lives.
     *
     * @param locator the locator for the XPath. May be null.
     * @param str string to match
     * @param resolver resolver for namespace resolution
     * @return XPath for string matched
     */
    virtual XPath*
    createXPath(
            const Locator*          locator,
            const XalanDOMString&   str,
            const PrefixResolver&   resolver,
            bool                    allowVariableReferences = true,
            bool                    allowKeyFunction = true) = 0;

    /**
     * Create and initialize an xpath and return it. This is to be used by
     * stylesheet elements that need an XPath that is guaranteed to persist
     * while it lives.
     *
     * @param locator the locator for the XPath. May be null.
     * @param str string to match
     * @param resolver resolver for namespace resolution
     * @return XPath for string matched
     */
    virtual XPath*
    createXPath(
            const Locator*          locator,
            const XalanDOMChar*     str,
            const PrefixResolver&   resolver,
            bool                    allowVariableReferences = true,
            bool                    allowKeyFunction = true) = 0;

    /**
     * Create and initialize an xpath and return it. This is to be used by
     * stylesheet elements that need an XPath that is guaranteed to persist
     * while it lives.
     *
     * @param locator the locator for the XPath. May be null.
     * @param str string to match
     * @param resolver resolver for namespace resolution
     * @return XPath for string matched
     */
    virtual XPath*
    createXPath(
            const Locator*              locator,
            const XalanDOMChar*         str,
            XalanDOMString::size_type   len,
            const PrefixResolver&       resolver,
            bool                        allowVariableReferences = true,
            bool                        allowKeyFunction = true) = 0;

    /**
     * Get the locator from the top of the locator stack.
     *
     * @return A pointer to the Locator, or 0 if there is nothing on the stack.
     */
    virtual const Locator*
    getLocatorFromStack() const = 0;

    /**
     * Push a locator on to the locator stack.
     *
     * @param A pointer to the Locator to push.
     */
    virtual void
    pushLocatorOnStack(const Locator*   locator) = 0;

    /**
     * Pop the locator from the top of the locator stack.
     */
    virtual void
    popLocatorStack() = 0;

    /**
     * Get the Xalan namespace for built-in extensions.
     *
     * @return Xalan namespace for extensions
     */
    virtual const XalanDOMString&
    getXalanXSLNameSpaceURL() const = 0;

    /**
     * Read in the XML file, either producing a Document or calling SAX events,
     * and register the document in a table.  If the document has already been
     * read in, it will not be reparsed.
     *
     * @param urlString location of the XML
     * @param docHandler pointer to SAX event handler
     * @param docToRegister if using a SAX event handler, the object to register in the source docs table. 
     * @return document object, which represents the parsed XML
     * @exception SAXException
     */
    virtual XalanDocument*
    parseXML(
            const XalanDOMString&   urlString,
            DocumentHandler*        docHandler, 
            XalanDocument*          docToRegister,
            ErrorHandler*           theErrorHandler = 0) = 0;

    /**
     * Given an name, determine if it is the xml:space attribute
     *
     * @param theAttributeName The name to check
     * @param theStylesheet The current Stylesheet instance
     * @param theLocator The Locator for error reporting.  May be 0.
     *
     * @return true if the string is the xml:space attribute name
     */
    virtual bool
    isXMLSpaceAttribute(
            const XalanDOMChar*     theAttributeName,
            const Stylesheet&       theStylesheet,
            const Locator*          theLocator = 0) = 0;

    /**
     * Given an name, determine if it is the xsl:use-attribute-sets attribute
     *
     * @param theAttributeName The name to check
     * @param theStylesheet The current Stylesheet instance
     * @param theLocator The Locator for error reporting.  May be 0.
     *
     * @return true if the string is the xsl:use-attribute-sets attribute name
     */
    virtual bool
    isXSLUseAttributeSetsAttribute(
            const XalanDOMChar*     theAttributeName,
            const Stylesheet&       theStylesheet,
            const Locator*          theLocator = 0) = 0;

    /**
     * Given an name, determine if it is a valid QName
     *
     * @param theName The name to check
     * @param theStylesheet The current Stylesheet instance
     * @param theLocator The Locator for error reporting.  May be 0.
     *
     * @return true if the string is a valid QName.
     */
    virtual bool
    isValidQName(
            const XalanDOMChar*     theName,
            const Stylesheet&       theStylesheet,
            const Locator*          theLocator = 0) = 0;

    /**
     * Given an XSL tag name, return an integer token that corresponds to
     * the enums defined above.
     *
     * @param name a probable xsl:xxx element
     * @return The enum value for that token, or ELEMNAME_UNDEFINED
     */
    virtual eElementToken
    getElementToken(const XalanDOMString&   name) const = 0;

    /**
     * Get the latest XSLT version currently supported.
     *
     * @return XSLT version number
     */
    virtual double
    getXSLTVersionSupported() const = 0;

    /**
     * Allocate a vector of XalanDOMChar of the specified
     * size.
     *
     * @param theLength The length of the character vector
     * @return A pointer to the vector.
     */
    virtual XalanDOMChar*
    allocateXalanDOMCharVector(XalanDOMString::size_type    theLength) = 0;

    /**
     * Allocate a vector of XalanDOMChar of the specified
     * size.
     *
     * @param theString The source character array
     * @param theLength The length of the character vector
     * @param fTerminate If true, terminate the new vector with 0
     * @return A pointer to the array.
     */
    virtual XalanDOMChar*
    allocateXalanDOMCharVector(
            const XalanDOMChar*         theString,
            XalanDOMString::size_type   theLength = XalanDOMString::npos,
            bool                        fTerminate = true) = 0;

    /**
     * Create an AVT instance.
     *
     * @param locator the Locator for the instance.  May be null.
     * @param name name of AVT
     * @param stringedValue string value to parse
     * @param resolver resolver for namespace resolution
     * @return A pointer to the instance.
     */
    virtual const AVT*
    createAVT(
            const Locator*          locator,
            const XalanDOMChar*     name,
            const XalanDOMChar*     stringedValue,
            const PrefixResolver&   resolver) = 0;

    /**
     * Create an AVTPart instance.
     *
     * @param theString The source character array
     * @param theLength The length of the character vector
     * @param fTerminate If true, terminate the new vector with 0
     * @return A pointer to the instance.
     */
    virtual const AVTPart*
    createAVTPart(
            const XalanDOMChar*         theString,
            XalanDOMString::size_type   theLength = XalanDOMString::npos) = 0;

    /**
     * Create an AVTPart instance.
     *
     * @param locator the Locator for the instance.  May be null.
     * @param str The XPath expression for the instance
     * @param len The length of the expression
     * @param resolver resolver for namespace resolution
     * @return A pointer to the instance.
     */
    virtual const AVTPart*
    createAVTPart(
            const Locator*              locator,
            const XalanDOMChar*         str,
            XalanDOMString::size_type   len,
            const PrefixResolver&       resolver) = 0;

    /**
     * Allocate a vector of const AVT* of the specified
     * length.
     *
     * @param theLength The length of the vector
     * @return A pointer to the vector.
     */
    virtual const AVT**
    allocateAVTPointerVector(size_type  theLength) = 0;

    /**
     * Allocate a vector of const AVTPart* of the specified
     * length.
     *
     * @param theLength The length of the vector
     * @return A pointer to the vector.
     */
    virtual const AVTPart**
    allocateAVTPartPointerVector(size_type  theLength) = 0;

    /**
     * Create a XalanQName-derived instance.
     *
     * @param qname The qname string
     * @param namespaces The stack of namespaces
     * @param Locator The current Locator, if any
     * @param fUseDefault If true, a qname without a prefix will use the default namespace
     * @return A pointer to the new instance
     */
    virtual const XalanQName*
    createXalanQName(
            const XalanDOMString&       qname,
            const NamespacesStackType&  namespaces,
            const Locator*              locator = 0,
            bool                        fUseDefault = false) = 0;

    /**
     * Create a XalanQName-derived instance.
     *
     * @param qname The qname string
     * @param namespaces The stack of namespaces
     * @param Locator The current Locator, if any
     * @param fUseDefault If true, a qname without a prefix will use the default namespace
     * @return A pointer to the new instance
     */
    virtual const XalanQName*
    createXalanQName(
            const XalanDOMChar*         qname,
            const NamespacesStackType&  namespaces,
            const Locator*              locator = 0,
            bool                        fUseDefault = false) = 0;

    /**
     * Tokenize a string and return the QNames corresponding to
     * those tokens.
     *
     * @param count The number of namespaces in the vector returned
     * @param qnameTokens The string to tokenize
     * @param namespaces The stack of namespaces
     * @param Locator The current Locator, if any
     * @param fUseDefault If true, qnames without prefixes will use the default namespace
     * @return The resulting vector of XalanQName instances.
     */
    virtual const XalanQName**
    tokenizeQNames(
            size_type&                  count,
            const XalanDOMChar*         qnameTokens,
            const NamespacesStackType&  namespaces,
            const Locator*              locator = 0,
            bool                        fUseDefault = false) = 0;

    /**
     * Create a stylesheet element for the provided type.   The
     * instance owns the memory and will delete the element when
     * it goes out of scope and the containing stylesheet is
     * destroyed.
     *
     * @param token The enum value of the element to create.
     * @param stylesheetTree The stylesheet containing the element
     * @param atts The list of attributes for the element
     * @param locator The Locator instance for error reporting.  May be 0.
     *
     * @return A pointer to the new instance.
     */
    virtual ElemTemplateElement*
    createElement(
            int                     token,
            Stylesheet&             stylesheetTree,
            const AttributeList&    atts,
            const Locator*          locator = 0) = 0;

    /**
     * Create a elements which have specific names. The instance
     * owns the memory and will delete the element when it goes
     * out of scope and the containing stylesheet is destroyed.
     *
     * @param token The enum value of the element to create.
     * @param stylesheetTree The stylesheet containing the element
     * @param name The name of the element
     * @param atts The list of attributes for the element
     * @param locator The Locator instance for error reporting.  May be 0.
     *
     * @return A pointer to the new instance.
     */
    virtual ElemTemplateElement*
    createElement(
            int                     token,
            Stylesheet&             stylesheetTree,
            const XalanDOMChar*     name,
            const AttributeList&    atts,
            const Locator*          locator = 0) = 0;

    /**
     * Create a an element for literal text. The instance owns the
     * memory and will delete the element when it goes out of
     * scope and the containing stylesheet is destroyed.
     *
     * @param stylesheetTree The stylesheet containing the element
     * @param chars The pointer to character string for element
     * @param length length of the chars parameter.
     * @param preserveSpace true is space should be preserved
     * @param disableOutputEscaping true if output escaping should be disabled
     * @param locator The Locator instance for error reporting.  May be 0.
     *
     * @return A pointer to the new instance.
     */
    virtual ElemTemplateElement*
    createElement(
            Stylesheet&                 stylesheetTree,
            const XalanDOMChar*         chars,
            XalanDOMString::size_type   length,
            bool                        preserveSpace,
            bool                        disableOutputEscaping,
            const Locator*              locator = 0) = 0;

    /**
     * Create an element to handle an extension element.   The
     * instance owns the memory and will delete the element when
     * it goes out of scope and the containing stylesheet is
     * destroyed.
     *
     * @param stylesheetTree The stylesheet containing the element
     * @param name The name of the element
     * @param atts The list of attributes for the element
     * @param handler The handler for elements in the extension namespace
     * @param locator The Locator instance for error reporting.  May be 0.
     *
     * @return A pointer to the new instance.
     */
    virtual ElemTemplateElement*
    createElement(
            Stylesheet&             stylesheetTree,
            const XalanDOMChar*     name,
            const AttributeList&    atts,
            ExtensionNSHandler&     handler,
            const Locator*          locator = 0) = 0;

    /**
     * Create an instance of XalanMatchPatternData, which describes
     * data related to a match pattern and template in stylesheet.
     * The instance owns the memory and will delete the element when
     * it goes out of scope and the containing stylesheet is
     * destroyed.
     *
     * @param theTemplate The ElemTemplate node that contains the template for this pattern
     * @param thePosition The position in the stylesheet
     * @param theTargetString The target string for match pattern
     * @param TheMatchPattern The match pattern
     * @param thePatternString the pattern string
     * @param thePriority The priority for the match pattern.
     *
     * @return A pointer to the new instance.
     */
    virtual const XalanMatchPatternData*
    createXalanMatchPatternData(
            const ElemTemplate&     theTemplate,
            size_type               thePosition,
            const XalanDOMString&   theTargetString,
            const XPath&            theMatchPattern,
            const XalanDOMString&   thePatternString,
            XPath::eMatchScore      thePriority) = 0;
};



XALAN_CPP_NAMESPACE_END



#endif  // STYLESHEETCONSTRUCTIONCONTEXT_HEADER_GUARD_1357924680
