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/10/30 05:11:22 UTC

cvs commit: xml-xalan/c/src/XSLT StylesheetExecutionContext.hpp StylesheetExecutionContextDefault.cpp StylesheetExecutionContextDefault.hpp

dbertoni    01/10/29 20:11:22

  Modified:    c/src/XSLT StylesheetExecutionContext.hpp
                        StylesheetExecutionContextDefault.cpp
                        StylesheetExecutionContextDefault.hpp
  Log:
  Changes for new result tree fragment implementation.  Changes to store indent amount and prefer that to the XMLParserLiaison instance.
  
  Revision  Changes    Path
  1.67      +8 -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.66
  retrieving revision 1.67
  diff -u -r1.66 -r1.67
  --- StylesheetExecutionContext.hpp	2001/10/19 18:42:23	1.66
  +++ StylesheetExecutionContext.hpp	2001/10/30 04:11:22	1.67
  @@ -400,6 +400,14 @@
   	virtual int
   	getIndent() const = 0;
   
  +	/**
  +	 * Set the current number of spaces to indent.
  +	 * 
  +	 * @param indentAmount The number of spaces to indent.  Use -1 for the default amount.
  +	 */
  +	virtual void
  +	setIndent(int	indentAmount) = 0;
  +
   	// $$$ ToDo: Remove this one!!!!
   	/**
   	 * Execute an XPath and return the resulting XObject. The lifetime of this
  
  
  
  1.78      +95 -12    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.77
  retrieving revision 1.78
  diff -u -r1.77 -r1.78
  --- StylesheetExecutionContextDefault.cpp	2001/10/19 18:42:23	1.77
  +++ StylesheetExecutionContextDefault.cpp	2001/10/30 04:11:22	1.78
  @@ -97,6 +97,7 @@
   
   #include <XalanSourceTree/FormatterToSourceTree.hpp>
   #include <XalanSourceTree/XalanSourceTreeDocument.hpp>
  +#include <XalanSourceTree/XalanSourceTreeDocumentFragment.hpp>
   
   
   
  @@ -153,7 +154,8 @@
   	m_formatterToTextCache(),
   	m_formatterToSourceTreeCache(),
   	m_nodeSorterCache(),
  -	m_resultTreeFragCache(eResultTreeFragCacheListSize)
  +	m_resultTreeFragCache(*this, eResultTreeFragCacheListSize),
  +	m_indentAmount(-1)
   {
   }
   
  @@ -187,7 +189,8 @@
   	m_formatterToTextCache(),
   	m_formatterToSourceTreeCache(),
   	m_nodeSorterCache(),
  -	m_resultTreeFragCache(eResultTreeFragCacheListSize)
  +	m_resultTreeFragCache(*this, eResultTreeFragCacheListSize),
  +	m_indentAmount(-1)
   {
   }
   
  @@ -456,13 +459,28 @@
   int
   StylesheetExecutionContextDefault::getIndent() const
   {
  -	assert(m_xsltProcessor != 0);
  +	if (m_indentAmount != -1)
  +	{
  +		return m_indentAmount;
  +	}
  +	else
  +	{
  +		assert(m_xsltProcessor != 0);
   
  -	return m_xsltProcessor->getXMLParserLiaison().getIndent();
  +		return m_xsltProcessor->getXMLParserLiaison().getIndent();
  +	}
   }
   
   
   
  +void
  +StylesheetExecutionContextDefault::setIndent(int	indentAmount)
  +{
  +	m_indentAmount = indentAmount;
  +}
  +
  +
  +
   const XObjectPtr
   StylesheetExecutionContextDefault::executeXPath(
   			const XalanDOMString&	str,
  @@ -911,7 +929,7 @@
   
   	BorrowReturnResultTreeFrag	theResultTreeFrag(*this);
   
  -	GetReleaseCachedObject<FormatterToSourceTreeCacheType>	theGuard(m_formatterToSourceTreeCache);
  +	GuardCachedObject<FormatterToSourceTreeCacheType>	theGuard(m_formatterToSourceTreeCache);
   
   	FormatterToSourceTree* const	theFormatter = theGuard.get();
   	assert(theFormatter != 0);
  @@ -919,7 +937,16 @@
   	XalanSourceTreeDocument* const	theDocument = getSourceTreeFactory();
   
   	theFormatter->setDocument(theDocument);
  -	theFormatter->setDocumentFragment(theResultTreeFrag.get());
  +
  +	XalanSourceTreeDocumentFragment* const	theDocumentFragment =
  +#if defined(XALAN_OLD_STYLE_CASTS)
  +		((const ResultTreeFrag*)theResultTreeFrag.get())->getDocumentFragment();
  +#else
  +		static_cast<const ResultTreeFrag*>(theResultTreeFrag.get())->getDocumentFragment();
  +#endif
  +	assert(theDocumentFragment != 0);
  +
  +	theFormatter->setDocumentFragment(theDocumentFragment);
   
   	theFormatter->setPrefixResolver(m_xsltProcessor);
   
  @@ -1428,12 +1455,17 @@
   	m_formatterToTextCache.reset();
   	m_formatterToSourceTreeCache.reset();
   	m_nodeSorterCache.reset();
  -	m_resultTreeFragCache.reset(),
  +	m_resultTreeFragCache.reset();
   
   	// Just in case endDocument() was not called,
   	// clean things up...
   	cleanUpTransients();
   
  +	// Destroy the source tree factory, which
  +	// will destroy all result tree fragment nodes
  +	// that were generated...
  +	m_sourceTreeResultTreeFactory.reset();
  +
   	// Reset the default execution context...
   	m_xpathExecutionContextDefault.reset();
   }
  @@ -2149,6 +2181,8 @@
   XalanSourceTreeDocument*
   StylesheetExecutionContextDefault::getSourceTreeFactory() const
   {
  +	assert(m_xsltProcessor != 0);
  +
   	if(m_sourceTreeResultTreeFactory.get() == 0)
   	{
   #if defined(XALAN_NO_MUTABLE)
  @@ -2309,15 +2343,64 @@
   
   	m_keyTables.clear();
   
  -	// Destroy the source tree factory, which
  -	// will destroy all result tree fragment nodes
  -	// that were generated...
  -	m_sourceTreeResultTreeFactory.reset();
  -
   	m_countersTable.reset();
   
   	// Clear any cached XPaths...
   	clearXPathCache();
   
   	assert(m_matchPatternCache.size() == 0);
  +}
  +
  +
  +
  +StylesheetExecutionContextDefault::ResultTreeFragCache::ResultTreeFragCache(
  +			StylesheetExecutionContextDefault&	theExecutionContext,
  +			unsigned int						initialSize) :
  +	m_resultTreeFragCache(initialSize),
  +	m_documentFragmentCache(initialSize)
  +{
  +	m_documentFragmentCache.m_createFunctor.setExecutionContext(&theExecutionContext);
  +}
  +
  +
  +
  +StylesheetExecutionContextDefault::ResultTreeFragCache::~ResultTreeFragCache()
  +{
  +}
  +
  +
  +
  +ResultTreeFragBase*
  +StylesheetExecutionContextDefault::ResultTreeFragCache::get()
  +{
  +	GuardCachedObject<ResultTreeFragCacheType>		theResultTreeFrag(m_resultTreeFragCache);
  +	assert(theResultTreeFrag.get() != 0);
  +
  +	theResultTreeFrag.get()->setDocumentFragment(m_documentFragmentCache.get());
  +	assert(theResultTreeFrag.get()->getDocumentFragment() != 0);
  +
  +	return theResultTreeFrag.release();
  +}
  +
  +
  +
  +bool
  +StylesheetExecutionContextDefault::ResultTreeFragCache::release(ResultTreeFragBase*		theResultTreeFragBase)
  +{
  +	assert(theResultTreeFragBase != 0);
  +
  +	ResultTreeFrag* const	theResultTreeFrag =
  +#if defined(XALAN_OLD_STYLE_CASTS)
  +		(ResultTreeFrag*)theResultTreeFragBase;
  +#else
  +		static_cast<ResultTreeFrag*>(theResultTreeFragBase);
  +#endif
  +
  +	XalanSourceTreeDocumentFragment* const	theDocumentFragment =
  +			theResultTreeFrag->getDocumentFragment();
  +	assert(theDocumentFragment != 0);
  +
  +	m_documentFragmentCache.release(theDocumentFragment);
  +
  +	return m_resultTreeFragCache.release(theResultTreeFrag);
   }
  
  
  
  1.70      +114 -10   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.69
  retrieving revision 1.70
  diff -u -r1.69 -r1.70
  --- StylesheetExecutionContextDefault.hpp	2001/10/19 18:42:23	1.69
  +++ StylesheetExecutionContextDefault.hpp	2001/10/30 04:11:22	1.70
  @@ -78,7 +78,6 @@
   
   
   
  -#include <XPath/ResultTreeFrag.hpp>
   #include <XPath/XPathExecutionContextDefault.hpp>
   
   
  @@ -91,11 +90,13 @@
   #include <XalanSourceTree/XalanSourceTreeDocument.hpp>
   #endif
   #include <XalanSourceTree/FormatterToSourceTree.hpp>
  +#include <XalanSourceTree/XalanSourceTreeDocumentFragment.hpp>
   
   
   
   #include <XSLT/CountersTable.hpp>
   #include <XSLT/NodeSorter.hpp>
  +#include <XSLT/ResultTreeFrag.hpp>
   #include <XSLT/Stylesheet.hpp>
   #include <XSLT/VariablesStack.hpp>
   
  @@ -338,6 +339,9 @@
   	virtual int
   	getIndent() const;
   
  +	virtual void
  +	setIndent(int	indentAmount);
  +
   	// $$$ ToDo: Get rid of this!!!!
   	virtual const XObjectPtr
   	executeXPath(
  @@ -950,6 +954,13 @@
   		XSLTEngineImpl&		m_xsltProcessor;
   	};
   
  +	/**
  +	 * Get a XalanSourceTreeDocument, primarily for creating result 
  +	 * tree fragments.
  +	 */
  +	XalanSourceTreeDocument*
  +	getSourceTreeFactory() const;
  +
   private:
   
   	/**
  @@ -967,13 +978,6 @@
   			ParamsVectorType&			params);
   
   	/**
  -	 * 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
  @@ -1007,6 +1011,105 @@
   	void
   	cleanUpTransients();
   
  +	/**
  +	 *
  +	 * A simple class to cache ResultTreeFrag and
  +	 * XalanSourceTreeDocumentFragment instances.
  +	 *
  +	 */
  +	class XALAN_XSLT_EXPORT ResultTreeFragCache
  +	{
  +	public:
  +
  +		ResultTreeFragCache(
  +				StylesheetExecutionContextDefault&	theExecutionContext,
  +				unsigned int						initialSize);
  +
  +		~ResultTreeFragCache();
  +
  +		ResultTreeFragBase*
  +		get();
  +
  +		bool
  +		release(ResultTreeFragBase*		theResultTreeFragBase);
  +
  +		void
  +		reset()
  +		{
  +			m_resultTreeFragCache.reset();
  +
  +			m_documentFragmentCache.reset();
  +		}
  +
  +	private:
  +
  +		/**
  +		 *
  +		 * A simple functor class to create XalanSourceTreeDocumentFragment
  +		 * instances.  This is necessary because the constructor requires
  +		 * a XalanSourceTreeDocument instance.
  +		 *
  +		 */
  +		class XALAN_XSLT_EXPORT LocalCreateFunctor
  +		{
  +		public:
  +
  +			LocalCreateFunctor() :
  +				m_executionContext(0)
  +			{
  +			}
  +
  +			void
  +			setExecutionContext(StylesheetExecutionContextDefault*	theExecutionContext)
  +			{
  +				m_executionContext = theExecutionContext;
  +			}
  +
  +			XalanSourceTreeDocumentFragment*
  +			operator()() const
  +			{
  +				assert(m_executionContext != 0);
  +
  +				return new XalanSourceTreeDocumentFragment(*m_executionContext->getSourceTreeFactory());
  +			}
  +
  +			StylesheetExecutionContextDefault*		m_executionContext;
  +		};
  +
  +		/**
  +		 *
  +		 * A simple functor class to clear the children from a 
  +		 * XalanSourceTreeDocumentFragment so it can be re-used.
  +		 *
  +		 */
  +		class XALAN_XSLT_EXPORT LocalResetFunctor
  +		{
  +		public:
  +
  +			void
  +			operator()(XalanSourceTreeDocumentFragment*		theInstance) const
  +			{
  +				theInstance->clearChildren();
  +			}
  +		};
  +
  +		typedef XalanObjectCache<
  +					ResultTreeFrag,
  +					DefaultCacheCreateFunctor<ResultTreeFrag>,
  +					DeleteFunctor<ResultTreeFrag>,
  +					ClearCacheResetFunctor<ResultTreeFrag> >		ResultTreeFragCacheType;
  +
  +		typedef XalanObjectCache<
  +					XalanSourceTreeDocumentFragment,
  +					LocalCreateFunctor,
  +					DeleteFunctor<XalanSourceTreeDocumentFragment>,
  +					LocalResetFunctor>											DocumentFragmentCacheType;
  +
  +		ResultTreeFragCacheType			m_resultTreeFragCache;
  +
  +		DocumentFragmentCacheType		m_documentFragmentCache;
  +	};
  +
   	XPathExecutionContextDefault	m_xpathExecutionContextDefault;
   
   	// $$ ToDo: Try to remove this dependency, and rely only on XSLTProcessor...
  @@ -1064,15 +1167,16 @@
   	typedef XalanObjectCacheDefault<FormatterToText>		FormatterToTextCacheType;
   	typedef XalanObjectCacheDefault<FormatterToSourceTree>	FormatterToSourceTreeCacheType;
   	typedef XalanObjectCacheDefault<NodeSorter>				NodeSorterCacheType;
  -	typedef XalanObjectCache<ResultTreeFragBase, DefaultCacheCreateFunctor<ResultTreeFrag>, DeleteFunctor<ResultTreeFragBase>, ClearCacheResetFunctor<ResultTreeFragBase> >		ResultTreeFragCacheType;
   
   	FormatterToTextCacheType			m_formatterToTextCache;
   
   	FormatterToSourceTreeCacheType		m_formatterToSourceTreeCache;
   
   	NodeSorterCacheType					m_nodeSorterCache;
  +
  +	ResultTreeFragCache					m_resultTreeFragCache;
   
  -	ResultTreeFragCacheType				m_resultTreeFragCache;
  +	int									m_indentAmount;
   
   	static XalanNumberFormatFactory		s_defaultXalanNumberFormatFactory;
   
  
  
  

---------------------------------------------------------------------
To unsubscribe, e-mail: xalan-cvs-unsubscribe@xml.apache.org
For additional commands, e-mail: xalan-cvs-help@xml.apache.org