dbertoni    01/01/15 18:50:04

  Modified:    c/src/XSLT StylesheetExecutionContext.hpp
                        StylesheetExecutionContextDefault.cpp
                        StylesheetExecutionContextDefault.hpp
                        XSLTEngineImpl.cpp XSLTEngineImpl.hpp
                        XSLTProcessor.hpp
  Log:
  Moved creation of result tree fragments to the execution context.
  
  Revision  Changes    Path
  1.45      +6 -0      xml-xalan/c/src/XSLT/StylesheetExecutionContext.hpp
  
  Index: StylesheetExecutionContext.hpp
  ===================================================================
  RCS file: /home/cvs/xml-xalan/c/src/XSLT/StylesheetExecutionContext.hpp,v
  retrieving revision 1.44
  retrieving revision 1.45
  diff -u -r1.44 -r1.45
  --- StylesheetExecutionContext.hpp    2001/01/08 18:29:52     1.44
  +++ StylesheetExecutionContext.hpp    2001/01/16 02:50:02     1.45
  @@ -1427,6 +1427,12 @@
        virtual bool
        returnMutableNodeRefList(MutableNodeRefList*    theList) = 0;
   
  +     virtual ResultTreeFragBase*
  +     borrowResultTreeFrag() = 0;
  +
  +     virtual bool
  +     returnResultTreeFrag(ResultTreeFragBase*        theResultTreeFragBase) 
= 0;
  +
        virtual MutableNodeRefList*
        createMutableNodeRefList() const = 0;
   
  
  
  
  1.50      +82 -8     
xml-xalan/c/src/XSLT/StylesheetExecutionContextDefault.cpp
  
  Index: StylesheetExecutionContextDefault.cpp
  ===================================================================
  RCS file: 
/home/cvs/xml-xalan/c/src/XSLT/StylesheetExecutionContextDefault.cpp,v
  retrieving revision 1.49
  retrieving revision 1.50
  diff -u -r1.49 -r1.50
  --- StylesheetExecutionContextDefault.cpp     2001/01/12 20:45:10     1.49
  +++ StylesheetExecutionContextDefault.cpp     2001/01/16 02:50:02     1.50
  @@ -93,6 +93,11 @@
   
   
   
  +#include <XalanSourceTree/FormatterToSourceTree.hpp>
  +#include <XalanSourceTree/XalanSourceTreeDocument.hpp>
  +
  +
  +
   #include "Constants.hpp"
   #include "ElemTemplateElement.hpp"
   #include "ElemWithParam.hpp"
  @@ -139,7 +144,9 @@
        m_matchPatternCache(),
        m_keyTables(),
        m_keyDeclarationSet(),
  -     m_countersTable()
  +     m_countersTable(),
  +     m_useDOMResultTreeFactory(false),
  +     m_sourceTreeResultTreeFactory()
   {
   }
   
  @@ -859,14 +866,43 @@
                        XalanNode*                                      
sourceNode,
                        const QName&                            mode)
   {
  -     XalanAutoPtr<ResultTreeFragBase>
  -             theFragment(m_xsltProcessor.createResultTreeFrag(*this,
  -                                                                             
                                 templateChild,
  -                                                                             
                                 sourceTree,
  -                                                                             
                                 sourceNode,
  -                                                                             
                                 mode));
  +     BorrowReturnResultTreeFrag      theResultTreeFrag(*this);
  +
  +     if (m_useDOMResultTreeFactory == true)
  +     {
  +             XalanDocument* const    theDocument = 
m_xsltProcessor.getDOMFactory();
  +
  +             FormatterToDOM  tempFormatter(
  +                                     theDocument,
  +                                     theResultTreeFrag.get(),
  +                                     0);
  +
  +             theResultTreeFrag->setOwnerDocument(theDocument);
  +
  +             StylesheetExecutionContext::OutputContextPushPop        
theOutputContextPushPop(
  +                             *this,
  +                             &tempFormatter);
  +
  +             templateChild.executeChildren(*this, sourceTree, sourceNode, 
mode);
  +     }
  +     else
  +     {
  +             XalanSourceTreeDocument* const  theDocument = 
getSourceTreeFactory();
  +
  +             FormatterToSourceTree   tempFormatter(
  +                                     theDocument,
  +                                     theResultTreeFrag.get());
  +
  +             theResultTreeFrag->setOwnerDocument(theDocument);
  +
  +             StylesheetExecutionContext::OutputContextPushPop        
theOutputContextPushPop(
  +                             *this,
  +                             &tempFormatter);
   
  -     return getXObjectFactory().createResultTreeFrag(theFragment.release());
  +             templateChild.executeChildren(*this, sourceTree, sourceNode, 
mode);
  +     }
  +
  +     return getXObjectFactory().createResultTreeFrag(theResultTreeFrag);
   }
   
   
  @@ -1296,6 +1332,11 @@
   
        assert(m_matchPatternCache.size() == 0);
   
  +     // Destroy the source tree factory, which
  +     // will destroy all result tree fragment nodes
  +     // that were generated...
  +     m_sourceTreeResultTreeFactory.reset();
  +
        m_countersTable.reset();
   
        // Reset the default execution context...
  @@ -1463,6 +1504,22 @@
   
   
   
  +ResultTreeFragBase*
  +StylesheetExecutionContextDefault::borrowResultTreeFrag()
  +{
  +     return m_xpathExecutionContextDefault.borrowResultTreeFrag();
  +}
  +
  +
  +
  +bool
  +StylesheetExecutionContextDefault::returnResultTreeFrag(ResultTreeFragBase*  
        theResultTreeFragBase)
  +{
  +     return 
m_xpathExecutionContextDefault.returnResultTreeFrag(theResultTreeFragBase);
  +}
  +
  +
  +
   MutableNodeRefList*
   StylesheetExecutionContextDefault::createMutableNodeRefList() const
   {
  @@ -1780,6 +1837,23 @@
                        const XalanNode*        styleNode) const
   {
        message(TranscodeFromLocalCodePage(msg), sourceNode, styleNode);
  +}
  +
  +
  +
  +XalanSourceTreeDocument*
  +StylesheetExecutionContextDefault::getSourceTreeFactory() const
  +{
  +     if(m_sourceTreeResultTreeFactory.get() == 0)
  +     {
  +#if defined(XALAN_NO_MUTABLE)
  +             
((XSLTEngineImpl*)this)->m_sourceTreeResultTreeFactory.reset(new 
XalanSourceTreeDocument);
  +#else
  +             m_sourceTreeResultTreeFactory.reset(new 
XalanSourceTreeDocument);
  +#endif
  +     }
  +
  +     return m_sourceTreeResultTreeFactory.get();
   }
   
   
  
  
  
  1.45      +53 -0     
xml-xalan/c/src/XSLT/StylesheetExecutionContextDefault.hpp
  
  Index: StylesheetExecutionContextDefault.hpp
  ===================================================================
  RCS file: 
/home/cvs/xml-xalan/c/src/XSLT/StylesheetExecutionContextDefault.hpp,v
  retrieving revision 1.44
  retrieving revision 1.45
  diff -u -r1.44 -r1.45
  --- StylesheetExecutionContextDefault.hpp     2001/01/08 18:29:53     1.44
  +++ StylesheetExecutionContextDefault.hpp     2001/01/16 02:50:03     1.45
  @@ -78,12 +78,19 @@
   
   
   
  +#if defined(XALAN_AUTO_PTR_REQUIRES_DEFINITION)
  +#include <XalanSourceTree/XalanSourceTreeDocument.hpp>
  +#endif
  +
  +
  +
   #include <XSLT/CountersTable.hpp>
   #include <XSLT/Stylesheet.hpp>
   #include <XSLT/VariablesStack.hpp>
   
   
   
  +class XalanSourceTreeDocument;
   class XPathProcessor;
   class XObjectFactory;
   class XSLTEngineImpl;
  @@ -147,6 +154,31 @@
        virtual
        ~StylesheetExecutionContextDefault();
   
  +     /**
  +      * Get the value of the flag that controls whether result tree
  +      * fragments are created using a DOM factory, or a 
XalanSourceTreeDocument.
  +      *
  +      * @return The value
  +      */
  +     bool
  +     getUseDOMResultTreeFactory() const
  +     {
  +             return m_useDOMResultTreeFactory;
  +     }
  +
  +     /**
  +      * Set the value of the flag that controls whether result tree
  +      * fragments are created using a DOM factory, or a 
XalanSourceTreeDocument.
  +      *
  +      * @param The boolean value
  +      */
  +     void
  +     setUseDOMResultTreeFactory(bool         theValue)
  +     {
  +             m_useDOMResultTreeFactory = theValue;
  +     }
  +
  +
        // These interfaces are inherited from StylesheetExecutionContext...
   
        virtual bool
  @@ -655,6 +687,12 @@
        virtual bool
        returnMutableNodeRefList(MutableNodeRefList*    theList);
   
  +     virtual ResultTreeFragBase*
  +     borrowResultTreeFrag();
  +
  +     virtual bool
  +     returnResultTreeFrag(ResultTreeFragBase*        theResultTreeFragBase);
  +
        virtual MutableNodeRefList*
        createMutableNodeRefList() const;
   
  @@ -772,6 +810,13 @@
   private:
   
        /**
  +      * Get a XalanSourceTreeDocument, primarily for creating result 
  +      * tree fragments.
  +      */
  +     XalanSourceTreeDocument*
  +     getSourceTreeFactory() const;
  +
  +     /**
         * Determine if the XPath is one that we have cached.
         *
         * @param theXPath the XPath instance to check
  @@ -839,6 +884,14 @@
        KeyDeclarationSetType                           m_keyDeclarationSet;
   
        CountersTable                                           m_countersTable;
  +
  +     bool                                                            
m_useDOMResultTreeFactory;
  +
  +     /**
  +      * The factory that will be used to create result tree fragments based 
on our
  +      * proprietary source tree.
  +      */
  +     mutable XalanAutoPtr<XalanSourceTreeDocument>   
m_sourceTreeResultTreeFactory;
   
        static XalanNumberFormatFactory         
s_defaultXalanNumberFormatFactory;
   
  
  
  
  1.80      +18 -53    xml-xalan/c/src/XSLT/XSLTEngineImpl.cpp
  
  Index: XSLTEngineImpl.cpp
  ===================================================================
  RCS file: /home/cvs/xml-xalan/c/src/XSLT/XSLTEngineImpl.cpp,v
  retrieving revision 1.79
  retrieving revision 1.80
  diff -u -r1.79 -r1.80
  --- XSLTEngineImpl.cpp        2001/01/08 18:29:55     1.79
  +++ XSLTEngineImpl.cpp        2001/01/16 02:50:03     1.80
  @@ -122,6 +122,11 @@
   
   
   
  +#include <XalanSourceTree/XalanSourceTreeDocument.hpp>
  +#include <XalanSourceTree/FormatterToSourceTree.hpp>
  +
  +
  +
   #include "Constants.hpp"
   #include "ElemWithParam.hpp"
   #include "FunctionCurrent.hpp"
  @@ -161,7 +166,8 @@
        DocumentHandler(),
        m_outputCarriageReturns(false),
        m_outputLinefeeds(false),
  -     m_resultTreeFactory(0),
  +     m_useDOMResultTreeFactory(false),
  +     m_domResultTreeFactory(0),
        m_resultNameSpacePrefix(),
        m_resultNameSpaceURL(),
        m_currentNode(),
  @@ -199,7 +205,13 @@
        m_durationsTable.clear();
        m_stylesheetLocatorStack.clear();
        m_cdataStack.clear();
  -     m_resultTreeFactory = 0;
  +
  +     if (m_domResultTreeFactory != 0)
  +     {
  +             m_parserLiaison.destroyDocument(m_domResultTreeFactory);
  +             m_domResultTreeFactory = 0;
  +     }
  +
        m_currentNode = 0;
   
        m_outputContextStack.reset();
  @@ -2055,35 +2067,6 @@
   
   
   
  -ResultTreeFragBase*
  -XSLTEngineImpl::createResultTreeFrag(
  -                     StylesheetExecutionContext&             
executionContext,
  -                     const ElemTemplateElement&              templateChild, 
  -                     XalanNode*                                              
sourceTree, 
  -                     XalanNode*                                              
sourceNode,
  -                     const QName&                                    mode)
  -{
  -     XalanAutoPtr<ResultTreeFragBase> pfrag(createDocFrag());
  -
  -     FormatterToDOM  tempFormatter(m_resultTreeFactory, 
  -                                                               pfrag.get(),
  -                                                               0);
  -
  -//   setMustFlushPendingStartDocument(true);
  -
  -//   flushPending();
  -
  -     StylesheetExecutionContext::OutputContextPushPop        
theOutputContextPushPop(
  -                     executionContext,
  -                     &tempFormatter);
  -
  -     templateChild.executeChildren(executionContext, sourceTree, sourceNode, 
mode);
  -
  -     return pfrag.release();
  -}
  -
  -
  -
   void
   XSLTEngineImpl::outputResultTreeFragment(
                        StylesheetExecutionContext&             
executionContext,
  @@ -2857,30 +2840,20 @@
   XalanDocument*
   XSLTEngineImpl::getDOMFactory() const
   {
  -     if(m_resultTreeFactory == 0)
  +     if(m_domResultTreeFactory == 0)
        {
   #if defined(XALAN_NO_MUTABLE)
  -             ((XSLTEngineImpl*)this)->m_resultTreeFactory = 
m_parserLiaison.createDocument();
  +             ((XSLTEngineImpl*)this)->m_domResultTreeFactory = 
m_parserLiaison.createDOMFactory();
   #else
  -             m_resultTreeFactory = m_parserLiaison.createDocument();
  +             m_domResultTreeFactory = m_parserLiaison.createDOMFactory();
   #endif
        }
   
  -     return m_resultTreeFactory;
  +     return m_domResultTreeFactory;
   }
   
   
   
  -/**
  - * Create a document fragment.  This function may return null.
  - */
  -ResultTreeFragBase* XSLTEngineImpl::createDocFrag() const
  -{
  -     return new ResultTreeFrag(*getDOMFactory());
  -}
  -  
  -
  -
   XLocator*
   XSLTEngineImpl::getXLocatorFromNode(const XalanNode* node) const
   {
  @@ -2895,14 +2868,6 @@
                        XLocator*                       xlocator)
   {
        m_xpathEnvSupport.associateXLocatorToNode(node, xlocator);
  -}
  -
  -
  -
  -ResultTreeFragBase*
  -XSLTEngineImpl::createResultTreeFrag() const
  -{
  -     return new ResultTreeFrag(*getDOMFactory());
   }
   
   
  
  
  
  1.58      +16 -29    xml-xalan/c/src/XSLT/XSLTEngineImpl.hpp
  
  Index: XSLTEngineImpl.hpp
  ===================================================================
  RCS file: /home/cvs/xml-xalan/c/src/XSLT/XSLTEngineImpl.hpp,v
  retrieving revision 1.57
  retrieving revision 1.58
  diff -u -r1.57 -r1.58
  --- XSLTEngineImpl.hpp        2001/01/08 18:29:56     1.57
  +++ XSLTEngineImpl.hpp        2001/01/16 02:50:03     1.58
  @@ -124,6 +124,7 @@
   class StylesheetExecutionContext;
   class StylesheetRoot;
   class XalanAttr;
  +class XalanSourceTreeDocument;
   class XalanText;
   class XLocator;
   class XMLParserLiaison;
  @@ -261,17 +262,6 @@
                        const XalanDOMString&   stringedValue,
                        XPathExecutionContext&  executionContext);
   
  -     virtual ResultTreeFragBase*
  -     createResultTreeFrag(
  -                     StylesheetExecutionContext&     executionContext,
  -                     const ElemTemplateElement&              templateChild,
  -                     XalanNode*                                              
sourceTree,
  -                     XalanNode*                                              
sourceNode,
  -                     const QName&                                    mode);
  -
  -     virtual ResultTreeFragBase*
  -     createResultTreeFrag() const;
  -
        virtual void
        resolveTopLevelParams(StylesheetExecutionContext&       
executionContext);
   
  @@ -1009,6 +999,13 @@
        reset();
   
        /**
  +      * Get a DOM document, primarily for creating result 
  +      * tree fragments.
  +      */
  +     virtual XalanDocument*
  +     getDOMFactory() const;
  +
  +     /**
         * Retrieve the XPath environment support object
         *
         * @return XPath environment support object
  @@ -1108,14 +1105,6 @@
        }
   
        /**
  -      * Create a document fragment.  This function may return null.
  -      *
  -      * @return pointer to new document fragment
  -      */
  -     ResultTreeFragBase*
  -     createDocFrag() const;
  -
  -     /**
         * Get the list of attributes yet to be processed
         * 
         * @return attribute list
  @@ -1223,6 +1212,7 @@
                }
        }
   
  +
        // These methods are inherited from DocumentHandler ...
        
        virtual void
  @@ -1403,10 +1393,15 @@
         */
        bool    m_outputLinefeeds;
   
  +     /**
  +      * If true, build DOM-based result tree fragments.
  +      */
  +     bool                                                                    
                m_useDOMResultTreeFactory;
  +
        /**
  -      * The factory that will be used to create result tree fragments.
  +      * The factory that will be used to create DOM-based result tree 
fragments.
         */
  -     mutable XalanDocument*  m_resultTreeFactory;
  +     mutable XalanDocument*                                                  
m_domResultTreeFactory;
   
        /**
         * The namespace that the result tree conforms to.  A null value 
  @@ -1471,7 +1466,6 @@
   
   private:
   
  -
        /**
         * Determine if any pending attributes is a default
         * namespace.
  @@ -1621,13 +1615,6 @@
         * until NodeList variables are implemented.
         */
        static const bool       s_resolveContentsEarly;
  -
  -     /**
  -      * Get a DOM document, primarily for creating result 
  -      * tree fragments.
  -      */
  -     virtual XalanDocument*
  -     getDOMFactory() const;
   
        bool
        getResolveContentsEarly() const
  
  
  
  1.18      +0 -27     xml-xalan/c/src/XSLT/XSLTProcessor.hpp
  
  Index: XSLTProcessor.hpp
  ===================================================================
  RCS file: /home/cvs/xml-xalan/c/src/XSLT/XSLTProcessor.hpp,v
  retrieving revision 1.17
  retrieving revision 1.18
  diff -u -r1.17 -r1.18
  --- XSLTProcessor.hpp 2000/12/21 04:48:31     1.17
  +++ XSLTProcessor.hpp 2001/01/16 02:50:03     1.18
  @@ -276,33 +276,6 @@
                        XPathExecutionContext&  executionContext) = 0;
   
        /**
  -      * Given a stylesheet element, create a result tree fragment from its 
  -      * contents.  Caller owns the memory.
  -      *
  -      * @param templateChild template element that holds the fragment
  -      * @param sourceTree    source tree document context
  -      * @param sourceNode    current source context node
  -      * @param mode                  mode under which the template is 
operating
  -      * @return pointer to an object that represents the result tree fragment
  -      * @exception XSLProcessorException 
  -      */
  -     virtual ResultTreeFragBase*
  -     createResultTreeFrag(
  -                     StylesheetExecutionContext&     executionContext,
  -                     const ElemTemplateElement&              templateChild,
  -                     XalanNode*                                              
sourceTree,
  -                     XalanNode*                                              
sourceNode,
  -                     const QName&                                    mode) = 
0;
  -
  -     /**
  -      * Create an empty result tree fragment. Caller owns the memory.
  -      *
  -      * @return pointer to an object that represents the result tree fragment
  -      */
  -     virtual ResultTreeFragBase*
  -     createResultTreeFrag() const = 0;
  -
  -     /**
         * Resolve the params that were pushed by the caller.
         */
        virtual void
  
  
  

Reply via email to