/*
 * 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(XPATHEVALUATOR_HEADER_GUARD_1357924680)
#define XPATHEVALUATOR_HEADER_GUARD_1357924680



#include <xalanc/XPath/XPathDefinitions.hpp>



#if defined(XALAN_AUTO_PTR_REQUIRES_DEFINITION)
#include <xalanc/XPath/XObjectFactory.hpp>
#include <xalanc/XPath/XPathFactoryDefault.hpp>
#include <xalanc/XPath/XPathConstructionContextDefault.hpp>
#include <xalanc/XPath/XPathExecutionContextDefault.hpp>
#endif



#include <xalanc/Include/XalanMemMgrAutoPtr.hpp>



#include <xalanc/XalanDOM/XalanDOMString.hpp>



namespace XALAN_CPP_NAMESPACE {



#if !defined(XALAN_AUTO_PTR_REQUIRES_DEFINITION)
class XObjectFactory;
class XPathFactoryDefault;
class XPathConstructionContextDefault;
class XPathExecutionContextDefault;
#endif



class DOMSupport;
class NodeRefList;
class PrefixResolver;
class XalanNode;
class XalanElement;
class XObjectPtr;
class XPath;
class XPathEnvSupport;
class XPathExecutionContext;



class XALAN_XPATH_EXPORT XPathEvaluator
{
public:

    // Static initializer to be called before any instances are
    // created.  The call is _not_ thread-safe, you must only call
    // it once, unless you have called terminate previously, and
    // you want to re-initialize the library.
    static void
    initialize(MemoryManager& theManager XALAN_DEFAULT_MEMMGR);

    // Static terminator to be called after all instances
    // are destroyed.  The call is _not_ thread-safe.  Once
    // terminated, you can call initialize() again, to
    // re-initialize the library.
    static void
    terminate();


    XPathEvaluator(MemoryManager&   theManager XALAN_DEFAULT_MEMMGR);

    ~XPathEvaluator();

    /**
     * Evaluate the supplied XPath expression, within the given context.  If
     * the expression doesn't select a node, 0 is returned.  If it selects
     * more than one node, only the first is returned.
     *
     * @param domSupport An instance of the corresponding DOMSupport-derived for the DOM implementation being used.
     * @param contextNode The source tree context node
     * @param xpathString The XPath expression to evaluate
     * @param namespaceNode A node to use for namespace prefix resolution.
     * @return A pointer to the node selected by the expression, if any.
     */
    XalanNode*
    selectSingleNode(
            DOMSupport&             domSupport,
            XalanNode*              contextNode,
            const XalanDOMChar*     xpathString,
            const XalanElement*     namespaceNode = 0);

    /**
     * Evaluate the supplied XPath expression, within the given context.  If
     * the expression doesn't select a node, 0 is returned.  If it selects
     * more than one node, only the first is returned.
     *
     * @param domSupport An instance of the corresponding DOMSupport-derived for the DOM implementation being used.
     * @param contextNode The source tree context node
     * @param xpathString The XPath expression to evaluate
     * @param prefixResolver A prefix resolver instance to use for namespace prefix resolution.
     * @return A pointer to the node selected by the expression, if any.
     */
    XalanNode*
    selectSingleNode(
            DOMSupport&             domSupport,
            XalanNode*              contextNode,
            const XalanDOMChar*     xpathString,
            const PrefixResolver&   prefixResolver);

    /**
     * Evaluate the supplied XPath, within the given context.  If
     * the expression doesn't select a node, 0 is returned.  If it selects
     * more than one node, only the first is returned.
     *
     * @param domSupport An instance of the corresponding DOMSupport-derived for the DOM implementation being used.
     * @param contextNode The source tree context node
     * @param xpath A reference to a compiled XPath expression.
     * @param namespaceNode A node to use for namespace prefix resolution.
     * @return A pointer to the node selected by the expression, if any.
     */
    XalanNode*
    selectSingleNode(
            DOMSupport&             domSupport,
            XalanNode*              contextNode,
            const XPath&            xpath,
            const XalanElement*     namespaceNode = 0);

    /**
     * Evaluate the supplied XPath, within the given context.  If
     * the expression doesn't select a node, 0 is returned.  If it selects
     * more than one node, only the first is returned.
     *
     * @param domSupport An instance of the corresponding DOMSupport-derived for the DOM implementation being used.
     * @param contextNode The source tree context node
     * @param xpath A reference to a compiled XPath expression.
     * @param prefixResolver A prefix resolver instance to use for namespace prefix resolution.
     * @return A pointer to the node selected by the expression, if any.
     */
    XalanNode*
    selectSingleNode(
            DOMSupport&             domSupport,
            XalanNode*              contextNode,
            const XPath&            xpath,
            const PrefixResolver&   prefixResolver);

    /**
     * Evaluate the supplied XPath expression, within the given context.  If
     * the expression doesn't select a node, an empty list is returned.
     *
     * @param domSupport An instance of the corresponding DOMSupport-derived for the DOM implementation being used.
     * @param contextNode The source tree context node
     * @param xpathString The XPath expression to evaluate
     * @param namespaceNode A node to use for namespace prefix resolution.
     * @return A list of selected nodes.
     */
    NodeRefList&
    selectNodeList(
            NodeRefList&            result,
            DOMSupport&             domSupport,
            XalanNode*              contextNode,
            const XalanDOMChar*     xpathString,
            const XalanElement*     namespaceNode = 0);

    /**
     * Evaluate the supplied XPath expression, within the given context.  If
     * the expression doesn't select a node, an empty list is returned.
     *
     * @param domSupport An instance of the corresponding DOMSupport-derived for the DOM implementation being used.
     * @param contextNode The source tree context node
     * @param xpathString The XPath expression to evaluate
     * @param prefixResolver A prefix resolver instance to use for namespace prefix resolution.
     * @return A list of selected nodes.
     */
    NodeRefList&
    selectNodeList(
            NodeRefList&            result,
            DOMSupport&             domSupport,
            XalanNode*              contextNode,
            const XalanDOMChar*     xpathString,
            const PrefixResolver&   prefixResolver);

    /**
     * Evaluate the supplied XPath, within the given context.  If
     * the expression doesn't select a node, an empty list is returned.
     *
     * @param domSupport An instance of the corresponding DOMSupport-derived for the DOM implementation being used.
     * @param contextNode The source tree context node
     * @param xpath A reference to a compiled XPath expression.
     * @param namespaceNode A node to use for namespace prefix resolution.
     * @return A list of selected nodes.
     */
    NodeRefList&
    selectNodeList(
            NodeRefList&            result,
            DOMSupport&             domSupport,
            XalanNode*              contextNode,
            const XPath&            xpath,
            const XalanElement*     namespaceNode = 0);

    /**
     * Evaluate the supplied XPath, within the given context.  If
     * the expression doesn't select a node, an empty list is returned.
     *
     * @param domSupport An instance of the corresponding DOMSupport-derived for the DOM implementation being used.
     * @param contextNode The source tree context node
     * @param xpath A reference to a compiled XPath expression.
     * @param prefixResolver A prefix resolver instance to use for namespace prefix resolution.
     * @return A list of selected nodes.
     */
    NodeRefList&
    selectNodeList(
            NodeRefList&            result,
            DOMSupport&             domSupport,
            XalanNode*              contextNode,
            const XPath&            xpath,
            const PrefixResolver&   prefixResolver);

    /**
     * Evaluate the supplied XPath expression, within the given context.  The
     * result is returned as a generalized object.  The object will be
     * destroyed when the user's copy of the returned XObjectPtr goes out of
     * scope, or when the XPathEvaluator goes out of scope or another expression
     * is evaluated.
     *
     * The user's XObjectPtr copy _must_ no longer be in scope when the XPathEvaluator
     * instance goes out of scope, or another expression is evaluated.
     *
     * @param domSupport An instance of the corresponding DOMSupport-derived for the DOM implementation being used.
     * @param contextNode The source tree context node
     * @param xpathString The XPath expression to evaluate
     * @param namespaceNode A node to use for namespace prefix resolution.
     * @return The result of evaluting the XPath expression.
     */
    XObjectPtr
    evaluate(
            DOMSupport&             domSupport,
            XalanNode*              contextNode,
            const XalanDOMChar*     xpathString,
            const XalanElement*     namespaceNode = 0);

    /**
     * Evaluate the supplied XPath expression, within the given context.  The
     * result is returned as a generalized object.  The object will be
     * destroyed when the user's copy of the returned XObjectPtr goes out of
     * scope, or when the XPathEvaluator goes out of scope or another expression
     * is evaluated.
     *
     * The user's XObjectPtr copy _must_ no longer be in scope when the XPathEvaluator
     * instance goes out of scope, or another expression is evaluated.
     *
     * @param domSupport An instance of the corresponding DOMSupport-derived for the DOM implementation being used.
     * @param contextNode The source tree context node
     * @param xpathString The XPath expression to evaluate
     * @param prefixResolver A prefix resolver instance to use for namespace prefix resolution.
     * @return The result of evaluting the XPath expression.
     */
    XObjectPtr
    evaluate(
            DOMSupport&             domSupport,
            XalanNode*              contextNode,
            const XalanDOMChar*     xpathString,
            const PrefixResolver&   prefixResolver);

    /**
     * Evaluate the supplied XPath expression, within the given context.  The
     * result is returned as a generalized object.  The object will be
     * destroyed when the user's copy of the returned XObjectPtr goes out of
     * scope, or when the XPathEvaluator goes out of scope or another expression
     * is evaluated.
     *
     * The user's XObjectPtr copy _must_ no longer be in scope when the XPathEvaluator
     * instance goes out of scope, or another expression is evaluated.
     *
     * @param domSupport An instance of the corresponding DOMSupport-derived for the DOM implementation being used.
     * @param contextNode The source tree context node
     * @param xpath A reference to a compiled XPath expression.
     * @param namespaceNode A node to use for namespace prefix resolution.
     * @return The result of evaluting the XPath expression.
     */
    XObjectPtr
    evaluate(
            DOMSupport&             domSupport,
            XalanNode*              contextNode,
            const XPath&            xpath,
            const XalanElement*     namespaceNode = 0);

    /**
     * Evaluate the supplied XPath expression, within the given context.  The
     * result is returned as a generalized object.  The object will be
     * destroyed when the user's copy of the returned XObjectPtr goes out of
     * scope, or when the XPathEvaluator goes out of scope or another expression
     * is evaluated.
     *
     * The user's XObjectPtr copy _must_ no longer be in scope when the XPathEvaluator
     * instance goes out of scope, or another expression is evaluated.
     *
     * @param domSupport An instance of the corresponding DOMSupport-derived for the DOM implementation being used.
     * @param contextNode The source tree context node
     * @param xpath A reference to a compiled XPath expression.
     * @param prefixResolver A prefix resolver instance to use for namespace prefix resolution.
     * @return The result of evaluting the XPath expression.
     */
    XObjectPtr
    evaluate(
            DOMSupport&             domSupport,
            XalanNode*              contextNode,
            const XPath&            xpath,
            const PrefixResolver&   prefixResolver);

    /**
     * Compile an XPath expression into an object which can be used multiple times.
     * Call destroyXPath() when finished with the instance.  Otherwise, the object
     * will be destroyed when the XPathEvaluator instance goes out of scope.  Since
     * no PrefixResolver is supplied, the XPath expression may not contain any
     * namespace prefixes.
     *
     * @param xpathString The XPath expression to evaluate
     * @return A pointer to an XPath instance.
     */
    XPath*
    createXPath(const XalanDOMChar*     xpathString);

    /**
     * Compile an XPath expression into an object which can be used multiple times.
     * Call destroyXPath() when finished with the instance.  Otherwise, the object
     * will be destroyed when the XPathEvaluator instance goes out of scope.
     *
     * @param xpathString The XPath expression to evaluate
     * @param domSupport An instance of the corresponding DOMSupport-derived for the DOM implementation being used.
     * @param namespaceNode A node to use for namespace prefix resolution.
     * @return A pointer to an XPath instance.
     */
    XPath*
    createXPath(
            const XalanDOMChar*     xpathString,
            DOMSupport&             domSupport,
            const XalanElement*     namespaceNode);

    /**
     * Compile an XPath expression into an object which can be used multiple times.
     * Call destroyXPath() when finished with the instance.  Otherwise, the object
     * will be destroyed when the XPathEvaluator instance goes out of scope.
     *
     * @param xpathString The XPath expression to evaluate
     * @param prefixResolver A prefix resolver instance to use for namespace prefix resolution.
     * @return A pointer to an XPath instance.
     */
    XPath*
    createXPath(
            const XalanDOMChar*     xpathString,
            const PrefixResolver&   prefixResolver);

    /**
     * Destory a compiled XPath instance.  The instance must have
     * been created using createXPath().
     *
     * @param theXPath The XPath instance to destroy
     * @return true if the instance was successfully destroyed
     */
    bool
    destroyXPath(XPath*     theXPath);

    XPathExecutionContext&
    getExecutionContext();

private:

    /**
     * A helper function to evaluate the supplied XPath expression, within
     * the given context.
     *
     * @param domSupport An instance of the corresponding DOMSupport-derived for the DOM implementation being used.
     * @param contextNode The source tree context node
     * @param xpathString The XPath expression to evaluate
     * @param prefixResolver A prefix resolver instance to use for namespace prefix resolution.
     * @param envSupport The XPathEnvSupport instance to use.
     * @return The result of evaluting the XPath expression.
     */
    XObjectPtr
    evaluate(
            DOMSupport&             domSupport,
            XalanNode*              contextNode,
            const XalanDOMChar*     xpathString,
            const PrefixResolver&   prefixResolver,
            XPathEnvSupport&        envSupport);

    /**
     * A helper function to evaluate the supplied XPath expression, within
     * the given context.
     *
     * @param domSupport An instance of the corresponding DOMSupport-derived for the DOM implementation being used.
     * @param contextNode The source tree context node
     * @param xpath The XPath to evaluate
     * @param prefixResolver A prefix resolver instance to use for namespace prefix resolution.
     * @param envSupport The XPathEnvSupport instance to use.
     * @return The result of evaluting the XPath expression.
     */
    XObjectPtr
    evaluate(
            DOMSupport&             domSupport,
            XalanNode*              contextNode,
            const XPath&            xpath,
            const PrefixResolver&   prefixResolver,
            XPathEnvSupport&        envSupport);

    // Data members...
    const XalanMemMgrAutoPtr<XObjectFactory>                    m_xobjectFactory;

    const XalanMemMgrAutoPtr<XPathFactoryDefault>               m_xpathFactory;

    const XalanMemMgrAutoPtr<XPathConstructionContextDefault>   m_constructionContext;

    const XalanMemMgrAutoPtr<XPathExecutionContextDefault>      m_executionContext;

    MemoryManager&                                              m_memoryManager;
};



}



#endif  // XPATHEVALUATOR_HEADER_GUARD_1357924680
