dbertoni    01/08/31 14:38:37

  Modified:    c/src/XPath XPathEvaluator.cpp XPathEvaluator.hpp
  Log:
  New features.
  
  Revision  Changes    Path
  1.4       +167 -5    xml-xalan/c/src/XPath/XPathEvaluator.cpp
  
  Index: XPathEvaluator.cpp
  ===================================================================
  RCS file: /home/cvs/xml-xalan/c/src/XPath/XPathEvaluator.cpp,v
  retrieving revision 1.3
  retrieving revision 1.4
  diff -u -r1.3 -r1.4
  --- XPathEvaluator.cpp        2001/06/14 19:12:14     1.3
  +++ XPathEvaluator.cpp        2001/08/31 21:38:36     1.4
  @@ -93,6 +93,7 @@
   
   XPathEvaluator::XPathEvaluator() :
        m_xobjectFactory(new XObjectFactoryDefault),
  +     m_xpathFactory(new XPathFactoryDefault),
        m_executionContext(new XPathExecutionContextDefault)
   
   {
  @@ -155,6 +156,48 @@
   
   
   
  +XalanNode*
  +XPathEvaluator::selectSingleNode(
  +                     DOMSupport&                             domSupport,
  +                     XalanNode*                              contextNode,
  +                     const XPath&                    xpath,
  +                     const XalanElement*             namespaceNode)
  +{
  +     const XObjectPtr        theResult(
  +             evaluate(
  +                     domSupport,
  +                     contextNode,
  +                     xpath,
  +                     namespaceNode));
  +
  +     const NodeRefListBase&  theNodeList = theResult->nodeset();
  +
  +     return theNodeList.getLength() == 0 ? 0 : theNodeList.item(0);
  +}
  +
  +
  +
  +XalanNode*
  +XPathEvaluator::selectSingleNode(
  +                     DOMSupport&                             domSupport,
  +                     XalanNode*                              contextNode,
  +                     const XPath&                    xpath,
  +                     const PrefixResolver&   prefixResolver)
  +{
  +     const XObjectPtr        theResult(
  +             evaluate(
  +                     domSupport,
  +                     contextNode,
  +                     xpath,
  +                     prefixResolver));
  +
  +     const NodeRefListBase&  theNodeList = theResult->nodeset();
  +
  +     return theNodeList.getLength() == 0 ? 0 : theNodeList.item(0);
  +}
  +
  +
  +
   NodeRefList
   XPathEvaluator::selectNodeList(
                        DOMSupport&                             domSupport,
  @@ -193,6 +236,44 @@
   
   
   
  +NodeRefList
  +XPathEvaluator::selectNodeList(
  +                     DOMSupport&                             domSupport,
  +                     XalanNode*                              contextNode,
  +                     const XPath&                    xpath,
  +                     const XalanElement*             namespaceNode)
  +{
  +     const XObjectPtr        theResult(
  +             evaluate(
  +                     domSupport,
  +                     contextNode,
  +                     xpath,
  +                     namespaceNode));
  +
  +     return NodeRefList(theResult->nodeset());
  +}
  +
  +
  +
  +NodeRefList
  +XPathEvaluator::selectNodeList(
  +                     DOMSupport&                             domSupport,
  +                     XalanNode*                              contextNode,
  +                     const XPath&                    xpath,
  +                     const PrefixResolver&   prefixResolver)
  +{
  +     const XObjectPtr        theResult(
  +             evaluate(
  +                     domSupport,
  +                     contextNode,
  +                     xpath,
  +                     prefixResolver));
  +
  +     return NodeRefList(theResult->nodeset());
  +}
  +
  +
  +
   XObjectPtr
   XPathEvaluator::evaluate(
                        DOMSupport&                             domSupport,
  @@ -216,6 +297,25 @@
   XPathEvaluator::evaluate(
                        DOMSupport&                             domSupport,
                        XalanNode*                              contextNode,
  +                     const XPath&                    xpath,
  +                     const XalanElement*             namespaceNode)
  +{
  +     XPathEnvSupportDefault  theEnvSupportDefault;
  +
  +     return evaluate(
  +                             domSupport,
  +                             contextNode,
  +                             xpath,
  +                             ElementPrefixResolverProxy(namespaceNode, 
theEnvSupportDefault, domSupport),
  +                             theEnvSupportDefault);
  +}
  +
  +
  +
  +XObjectPtr
  +XPathEvaluator::evaluate(
  +                     DOMSupport&                             domSupport,
  +                     XalanNode*                              contextNode,
                        const XalanDOMChar*             xpathString,
                        const PrefixResolver&   prefixResolver)
   {
  @@ -235,17 +335,62 @@
   XPathEvaluator::evaluate(
                        DOMSupport&                             domSupport,
                        XalanNode*                              contextNode,
  +                     const XPath&                    xpath,
  +                     const PrefixResolver&   prefixResolver)
  +{
  +     XPathEnvSupportDefault  theEnvSupportDefault;
  +
  +     return evaluate(
  +                             domSupport,
  +                             contextNode,
  +                             xpath,
  +                             prefixResolver,
  +                             theEnvSupportDefault);
  +}
  +
  +
  +
  +XPath*
  +XPathEvaluator::createXPath(
                        const XalanDOMChar*             xpathString,
  +                     const PrefixResolver&   prefixResolver)
  +{
  +     XPath* const    theXPath = m_xpathFactory->create();
  +     assert(theXPath != 0);
  +
  +     XPathProcessorImpl              theProcessor;
  +
  +    theProcessor.initXPath(
  +                     *theXPath,
  +                     XalanDOMString(xpathString),
  +                     prefixResolver);
  +
  +     return theXPath;
  +}
  +
  +
  +
  +bool
  +XPathEvaluator::destroyXPath(XPath*          theXPath)
  +{
  +     assert(theXPath != 0);
  +
  +     return m_xpathFactory->returnObject(theXPath);
  +}
  +
  +
  +
  +XObjectPtr
  +XPathEvaluator::evaluate(
  +                     DOMSupport&                             domSupport,
  +                     XalanNode*                              contextNode,
  +                     const XalanDOMChar*             xpathString,
                        const PrefixResolver&   prefixResolver,
                        XPathEnvSupport&                envSupport)
   {
        assert(contextNode != 0);
        assert(xpathString != 0);
   
  -     // Reset these, in case we've been here before...
  -     m_executionContext->reset();
  -     m_xobjectFactory->reset();
  -
        // Create an XPath, and an XPathProcessorImpl to process
        // the XPath.
        XPath                                   theXPath;
  @@ -257,6 +402,23 @@
                        XalanDOMString(xpathString),
                        prefixResolver);
   
  +     return evaluate(domSupport, contextNode, theXPath, prefixResolver, 
envSupport);
  +}
  +
  +
  +
  +XObjectPtr
  +XPathEvaluator::evaluate(
  +                     DOMSupport&                             domSupport,
  +                     XalanNode*                              contextNode,
  +                     const XPath&                    xpath,
  +                     const PrefixResolver&   prefixResolver,
  +                     XPathEnvSupport&                envSupport)
  +{
  +     // Reset these, in case we've been here before...
  +     m_executionContext->reset();
  +     m_xobjectFactory->reset();
  +
        // Set up the connections between the execution context and
        // the provided support objects...
        m_executionContext->setXPathEnvSupport(&envSupport);
  @@ -267,7 +429,7 @@
   
        // OK, evaluate the expression...
        const XObjectPtr        theResult(
  -             theXPath.execute(
  +             xpath.execute(
                        contextNode,
                        prefixResolver,
                        *m_executionContext.get()));
  
  
  
  1.3       +190 -10   xml-xalan/c/src/XPath/XPathEvaluator.hpp
  
  Index: XPathEvaluator.hpp
  ===================================================================
  RCS file: /home/cvs/xml-xalan/c/src/XPath/XPathEvaluator.hpp,v
  retrieving revision 1.2
  retrieving revision 1.3
  diff -u -r1.2 -r1.3
  --- XPathEvaluator.hpp        2001/07/10 05:15:50     1.2
  +++ XPathEvaluator.hpp        2001/08/31 21:38:36     1.3
  @@ -65,6 +65,7 @@
   
   #if defined(XALAN_AUTO_PTR_REQUIRES_DEFINITION)
   #include <XPath/XObjectFactory.hpp>
  +#include <XPath/XPathFactory.hpp>
   #include <XPath/XPathExecutionContextDefault.hpp>
   #endif
   
  @@ -80,6 +81,7 @@
   
   #if !defined(XALAN_AUTO_PTR_REQUIRES_DEFINITION)
   class XObjectFactory;
  +class XPathFactory;
   class XPathExecutionContextDefault;
   #endif
   
  @@ -91,6 +93,7 @@
   class XalanNode;
   class XalanElement;
   class XObjectPtr;
  +class XPath;
   class XPathEnvSupport;
   
   
  @@ -151,6 +154,42 @@
                        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.
         *
  @@ -185,14 +224,49 @@
                        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(
  +                     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(
  +                     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 returned when the user's copy of the returned
  -      * XObjectPtr goes out of scope, or when the XPathEvaluator instance
  -      * is reset or goes out of scope.  The user's XObjectPtr copy _must_ no
  -      * longer be in scope when the XPathEvaluator instance is reset or
  -      * out of scope.
  +      * 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
  @@ -210,10 +284,11 @@
         * Evaluate the supplied XPath expression, within the given context.  
The
         * result is returned as a generalized object.  The object will be
         * destroyed when the returned when the user's copy of the returned
  -      * XObjectPtr goes out of scope, or when the XalanXPathEvaluator 
instance
  -      * is reset or goes out of scope.  The user's XObjectPtr copy _must_ no
  -      * longer be in scope when the XPathEvaluator instance is reset or
  -      * out of scope.
  +      * 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
  @@ -228,6 +303,90 @@
                        const XalanDOMChar*             xpathString,
                        const PrefixResolver&   prefixResolver);
   
  +     /**
  +      * Evaluate the supplied XPath, within the given context.  The
  +      * result is returned as a generalized object.  The object will be
  +      * destroyed when the returned 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, within the given context.  The
  +      * result is returned as a generalized object.  The object will be
  +      * destroyed when the returned 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.
  +      *
  +      * @param xpathString The XPath expression to evaluate
  +      * @param namespaceNode A node to use for namespace prefix resolution.
  +      * @return A pointer to an XPath instance.
  +      */
  +     XPath*
  +     createXPath(
  +                     const XalanDOMChar*             xpathString,
  +                     const XalanElement*             namespaceNode = 0);
  +
  +     /**
  +      * 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);
  +
   private:
   
        /**
  @@ -238,7 +397,7 @@
         * @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 doEvaluate The XPathEnvSupport instance to use.
  +      * @param envSupport The XPathEnvSupport instance to use.
         * @return The result of evaluting the XPath expression.
         */
        XObjectPtr
  @@ -247,10 +406,31 @@
                        XalanNode*                              contextNode,
                        const XalanDOMChar*             xpathString,
                        const PrefixResolver&   prefixResolver,
  -                     XPathEnvSupport&                doEvaluate);
  +                     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 XalanAutoPtr<XObjectFactory>                                      
m_xobjectFactory;
  +
  +     const XalanAutoPtr<XPathFactory>                                        
m_xpathFactory;
   
        const XalanAutoPtr<XPathExecutionContextDefault>        
m_executionContext;
   };
  
  
  

---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to