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