You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@xalan.apache.org by db...@apache.org on 2001/01/16 03:50:04 UTC
cvs commit: xml-xalan/c/src/XSLT StylesheetExecutionContext.hpp StylesheetExecutionContextDefault.cpp StylesheetExecutionContextDefault.hpp XSLTEngineImpl.cpp XSLTEngineImpl.hpp XSLTProcessor.hpp
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