#ifndef DOMXPathEvaluator_HEADER_GUARD_
#define DOMXPathEvaluator_HEADER_GUARD_

/*
 * 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.
 */

#include <xercesc/util/XercesDefs.hpp>

XERCES_CPP_NAMESPACE_BEGIN

class DOMXPathNSResolver;
class DOMXPathExpression;
class DOMNode;

/**
 * The evaluation of XPath expressions is provided by <code>DOMXPathEvaluator</code>. 
 * In a DOM implementation which supports the XPath 3.0 feature, the <code>DOMXPathEvaluator</code>
 * interface will be implemented on the same object which implements the Document interface permitting
 * it to be obtained by casting or by using the DOM Level 3 getInterface method. In this case the
 * implementation obtained from the Document supports the XPath DOM module and is compatible 
 * with the XPath 1.0 specification.
 * Evaluation of expressions with specialized extension functions or variables may not
 * work in all implementations and is, therefore, not portable. XPathEvaluator implementations
 * may be available from other sources that could provide specific support for specialized extension
 * functions or variables as would be defined by other specifications.
 * @since DOM Level 3
 */
class CDOM_EXPORT DOMXPathEvaluator
{

protected:
    // -----------------------------------------------------------------------
    //  Hidden constructors
    // -----------------------------------------------------------------------
    /** @name Hidden constructors */
    //@{    
    DOMXPathEvaluator() {};
    //@}

private:
    // -----------------------------------------------------------------------
    // Unimplemented constructors and operators
    // -----------------------------------------------------------------------
    /** @name Unimplemented constructors and operators */
    //@{
    DOMXPathEvaluator(const DOMXPathEvaluator &);
    DOMXPathEvaluator& operator = (const  DOMXPathEvaluator&);
    //@}

public:
    // -----------------------------------------------------------------------
    //  All constructors are hidden, just the destructor is available
    // -----------------------------------------------------------------------
    /** @name Destructor */
    //@{
    /**
     * Destructor
     *
     */
    virtual ~DOMXPathEvaluator() {};
    //@}

    // -----------------------------------------------------------------------
    // Virtual DOMDocument interface
    // -----------------------------------------------------------------------
    /** @name Functions introduced in DOM Level 3 */
    //@{

    /**
     * Creates a parsed XPath expression with resolved namespaces. This is useful
     * when an expression will be reused in an application since it makes it 
     * possible to compile the expression string into a more efficient internal 
     * form and preresolve all namespace prefixes which occur within the expression.
     * @param expression of type XMLCh - The XPath expression string to be parsed.
     * @param resolver of type <code>XPathNSResolver</code> - The resolver permits 
     * translation of all prefixes, including the xml namespace prefix, within the XPath expression
     * into appropriate namespace URIs. If this is specified as null, any namespace 
     * prefix within the expression will result in <code>DOMException</code> being thrown with the
     * code NAMESPACE_ERR.
     * @return <code>XPathExpression</code> The compiled form of the XPath expression.
     * @exception <code>XPathException</code>
     * INVALID_EXPRESSION_ERR: Raised if the expression is not legal according to the 
     * rules of the <code>DOMXPathEvaluator</code>.
     * @exception DOMException
     * NAMESPACE_ERR: Raised if the expression contains namespace prefixes which cannot
     * be resolved by the specified <code>XPathNSResolver</code>.
     * @since DOM Level 3
     */
    virtual const DOMXPathExpression*    createExpression(const XMLCh *expression, const DOMXPathNSResolver *resolver) = 0;


    /** Adapts any DOM node to resolve namespaces so that an XPath expression can be
     * easily evaluated relative to the context of the node where it appeared within
     * the document. This adapter works like the DOM Level 3 method lookupNamespaceURI
     * on nodes in resolving the namespaceURI from a given prefix using the current 
     * information available in the node's hierarchy at the time lookupNamespaceURI 
     * is called. also correctly resolving the implicit xml prefix.
     * @param nodeResolver of type <code>DOMNode</code> The node to be used as a context 
     * for namespace resolution.
     * @return <code>XPathNSResolver</code> <code>XPathNSResolver</code> which resolves namespaces 
     * with respect to the definitions in scope for a specified node.
     */
    virtual const DOMXPathNSResolver*    createNSResolver(DOMNode *nodeResolver) = 0;


    /**
     * Evaluates an XPath expression string and returns a result of the specified 
     * type if possible.
     * @param expression of type XMLCh The XPath expression string to be parsed 
     * and evaluated.
     * @param contextNode of type <code>DOMNode</code> The context is context node 
     * for the evaluation 
     * of this XPath expression. If the <code>DOMXPathEvaluator</code> was obtained by
     * casting the <code>DOMDocument</code> then this must be owned by the same 
     * document and must be a <code>DOMDocument</code>, <code>DOMElement</code>, 
     * <code>DOMAttribute</code>, <code>DOMText</code>, <code>DOMCDATASection</code>, 
     * <code>DOMComment</code>, <code>DOMProcessingInstruction</code>, or 
     * <code>XPathNamespace</code> node. If the context node is a <code>DOMText</code> or 
     * a <code>DOMCDATASection</code>, then the context is interpreted as the whole 
     * logical text node as seen by XPath, unless the node is empty in which case it
     * may not serve as the XPath context.
     * @param resolver of type <code>XPathNSResolver</code> The resolver permits 
     * translation of all prefixes, including the xml namespace prefix, within 
     * the XPath expression into appropriate namespace URIs. If this is specified 
     * as null, any namespace prefix within the expression will result in 
     * <code>DOMException</code> being thrown with the code NAMESPACE_ERR.
     * @param type of type unsigned short - If a specific type is specified, then 
     * the result will be returned as the corresponding type.
     * For XPath 1.0 results, this must be one of the codes of the <code>XPathResult</code>
     * interface.
     * @param result of type void* - The result specifies a specific result object
     * which may be reused and returned by this method. If this is specified as 
     * null or the implementation does not reuse the specified result, a new result
     * object will be constructed and returned.
     * For XPath 1.0 results, this object will be of type <code>XPathResult</code>.
     * @return void* The result of the evaluation of the XPath expression.
     * For XPath 1.0 results, this object will be of type <code>XPathResult</code>.
     * @exception <code>XPathException</code>
     * INVALID_EXPRESSION_ERR: Raised if the expression is not legal 
     * according to the rules of the <code>DOMXPathEvaluator</code>
     * TYPE_ERR: Raised if the result cannot be converted to return the specified type.
     * @exception DOMException
     * NAMESPACE_ERR: Raised if the expression contains namespace prefixes 
     * which cannot be resolved by the specified <code>XPathNSResolver</code>.
     * WRONG_DOCUMENT_ERR: The Node is from a document that is not supported 
     * by this <code>DOMXPathEvaluator</code>.
     * NOT_SUPPORTED_ERR: The Node is not a type permitted as an XPath context 
     * node or the request type is not permitted by this <code>DOMXPathEvaluator</code>.
     */
    virtual void* evaluate(const XMLCh *expression, DOMNode *contextNode, const DOMXPathNSResolver *resolver, 
                           unsigned short type, void* result) = 0;

    //@}
};

XERCES_CPP_NAMESPACE_END

#endif
