svn commit: r1195818 - in /xalan/c/trunk/src/xalanc/XalanTransformer: XalanTransformer.cpp XalanTransformer.hpp
[email protected] Tue, 01 Nov 2011 04:49:53 -0000
| Newsgroups | gmane.text.xml.xalan.cvs |
|---|---|
| Message-ID | <[email protected]> |
Author: shathaway
Date: Tue Nov 1 04:49:53 2011
New Revision: 1195818
URL: http://svn.apache.org/viewvc?rev=1195818&view=rev
Log:
XALANC-451 XalanTransformer setStylesheetParam() :: add support for strings, numbers, and nodesets
Modified:
xalan/c/trunk/src/xalanc/XalanTransformer/XalanTransformer.cpp
xalan/c/trunk/src/xalanc/XalanTransformer/XalanTransformer.hpp
Modified: xalan/c/trunk/src/xalanc/XalanTransformer/XalanTransformer.cpp
URL: http://svn.apache.org/viewvc/xalan/c/trunk/src/xalanc/XalanTransformer/XalanTransformer.cpp?rev=1195818&r1=1195817&r2=1195818&view=diff
==============================================================================
--- xalan/c/trunk/src/xalanc/XalanTransformer/XalanTransformer.cpp (original)
+++ xalan/c/trunk/src/xalanc/XalanTransformer/XalanTransformer.cpp Tue Nov 1 04:49:53 2011
@@ -17,8 +17,6 @@
*/
#include "XalanTransformer.hpp"
-
-
#include <algorithm>
#if defined(XALAN_CLASSIC_IOSTREAMS)
#include <iostream.h>
@@ -127,6 +125,7 @@ XalanTransformer::XalanTransformer(Memor
m_warningStream(&std::cerr),
#endif
m_outputEncoding(m_memoryManager),
+ m_topXObjectFactory(XObjectFactoryDefault::create(m_memoryManager)),
m_stylesheetExecutionContext(StylesheetExecutionContextDefault::create(m_memoryManager))
{
#if defined(XALAN_USE_ICU)
@@ -148,6 +147,9 @@ XalanTransformer::XalanTransformer(Memor
XalanTransformer::~XalanTransformer()
{
+ // Clean up Top-Level Parameters
+ clearStylesheetParams();
+
XALAN_USING_STD(for_each)
// Clean up the XalanCompiledStylesheet vector.
@@ -861,7 +863,32 @@ XalanTransformer::destroyParsedSource(co
}
}
+void
+XalanTransformer::setStylesheetParam(
+ const XalanDOMString& qname,
+ const XalanDOMString& expression)
+{
+ m_params[qname].m_expression = expression;
+}
+
+void
+XalanTransformer::setStylesheetParam(
+ const XalanDOMString& qname,
+ XObjectPtr object)
+{
+ m_params[qname].m_value = object;
+}
+
+void
+XalanTransformer::setStylesheetParam(
+ const char* qname,
+ XObjectPtr object)
+{
+ setStylesheetParam(
+ XalanDOMString(qname, m_memoryManager),
+ object);
+}
void
XalanTransformer::setStylesheetParam(
@@ -869,15 +896,49 @@ XalanTransformer::setStylesheetParam(
const char* expression)
{
setStylesheetParam(
- XalanDOMString(
- qname,
- m_memoryManager),
- XalanDOMString(
- expression,
- m_memoryManager));
+ XalanDOMString(qname, m_memoryManager),
+ XalanDOMString(expression, m_memoryManager));
}
+void
+XalanTransformer::setStylesheetParam(
+ const char* qname,
+ double number)
+{
+ setStylesheetParam(
+ XalanDOMString(qname, m_memoryManager),
+ m_topXObjectFactory->createNumber(number));
+}
+void
+XalanTransformer::setStylesheetParam(
+ const XalanDOMString& qname,
+ double number)
+{
+ setStylesheetParam(
+ qname,
+ m_topXObjectFactory->createNumber(number));
+}
+
+void
+XalanTransformer::setStylesheetParam(
+ const char* qname,
+ XalanNode* nodeset)
+{
+ setStylesheetParam(
+ XalanDOMString(qname, m_memoryManager),
+ m_topXObjectFactory->createNodeSet(nodeset));
+}
+
+void
+XalanTransformer::setStylesheetParam(
+ const XalanDOMString& qname,
+ XalanNode* nodeset)
+{
+ setStylesheetParam(
+ qname,
+ m_topXObjectFactory->createNodeSet(nodeset));
+}
bool
XalanTransformer::removeTraceListener(TraceListener* theTraceListener)
@@ -1044,7 +1105,6 @@ XalanTransformer::getEscapeURLs() const
}
-
void
XalanTransformer::setEscapeURLs(eEscapeURLs value)
{
@@ -1147,7 +1207,21 @@ XalanTransformer::reset()
m_stylesheetExecutionContext->reset();
- clearStylesheetParams();
+// JIRA-451 Preserve top-level parameters across reset()
+// The reset() is done to prepare for a new transformation
+// by reusing the m_stylesheetExecutionContext.
+//
+// Absense of clearStylesheetParams() makes the top-level params
+// sticky across transformations. The clearStylesheetParams()
+// purges the top-level parameters from the XalanTransformer
+// instance.
+//
+// Presence of clearStylesheetParams() will require the application
+// to submit a new set of top-level parameters to the XalanTransformer
+// if needed for the next doTransform() operation.
+//
+// clearStylesheetParams();
+
}
catch(...)
{
@@ -1276,9 +1350,19 @@ XalanTransformer::doTransform(
i != m_params.end();
++i)
{
- theProcessor.setStylesheetParam(
- (*i).first,
- (*i).second);
+ const XalanDOMString& theName = (*i).first;
+ const XalanParamHolder& theCurrent= (*i).second;
+ const XalanDOMString& theExpression = theCurrent.m_expression;
+ XObjectPtr theObject = theCurrent.m_value;
+
+ if (theExpression.length() > 0)
+ {
+ theProcessor.setStylesheetParam(theName, theExpression);
+ }
+ else
+ {
+ theProcessor.setStylesheetParam(theName, theObject);
+ }
}
}
Modified: xalan/c/trunk/src/xalanc/XalanTransformer/XalanTransformer.hpp
URL: http://svn.apache.org/viewvc/xalan/c/trunk/src/xalanc/XalanTransformer/XalanTransformer.hpp?rev=1195818&r1=1195817&r2=1195818&view=diff
==============================================================================
--- xalan/c/trunk/src/xalanc/XalanTransformer/XalanTransformer.hpp (original)
+++ xalan/c/trunk/src/xalanc/XalanTransformer/XalanTransformer.hpp Tue Nov 1 04:49:53 2011
@@ -15,11 +15,10 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
+
#if !defined(XALANTRANSFORMER_HEADER_GUARD)
#define XALANTRANSFORMER_HEADER_GUARD
-
-
// Base include file. Must be first.
#include <xalanc/XalanTransformer/XalanTransformerDefinitions.hpp>
@@ -37,7 +36,10 @@ class ostream;
#include <xalanc/Include/XalanVector.hpp>
-
+#include <xalanc/XalanDOM/XalanNode.hpp>
+#include <xalanc/Include/XalanMap.hpp>
+#include <xalanc/XSLT/XalanParamHolder.hpp>
+#include <xalanc/XPath/XObjectFactoryDefault.hpp>
#include <xalanc/XPath/XalanQNameByValue.hpp>
@@ -77,7 +79,8 @@ class XalanCompiledStylesheet;
class XalanParsedSource;
class XalanTransformerOutputStream;
-
+class XObjectFactoryDefault;
+class XalanNode;
/**
* This is a simple C++ interface for some common usage patterns. It's
@@ -96,6 +99,14 @@ public:
typedef std::ostream StreamType;
#endif
+ typedef XalanVector<const XalanCompiledStylesheet*> CompiledStylesheetPtrVectorType;
+ typedef XalanVector<const XalanParsedSource*> ParsedSourcePtrVectorType;
+
+ typedef XalanMap<XalanDOMString, XalanParamHolder> ParamMapType;
+
+ typedef XalanMap<XalanQNameByValue, Function*> FunctionMapType;
+ typedef XalanVector<TraceListener*> TraceListenerVectorType;
+
XalanTransformer(MemoryManager& theManager = XalanMemMgrs::getDefaultXercesMemMgr());
virtual
@@ -481,6 +492,19 @@ public:
const XalanDOMString& functionName);
/**
+ * Retrieve the factory object for creating XObjects.
+ *
+ * @return factory object instance
+ */
+ XObjectFactory&
+ getXObjectFactory() const
+ {
+ assert(m_topXObjectFactory != 0);
+
+ return *m_topXObjectFactory;
+ }
+
+ /**
* Set a top-level parameter, which the stylesheet can access
* with a top-level xsl:param. Top-level params are "sticky,"
* and must be removed with a call to clearStylesheetParams().
@@ -490,11 +514,8 @@ public:
*/
void
setStylesheetParam(
- const XalanDOMString& qname,
- const XalanDOMString& expression)
- {
- m_params[qname] = expression;
- }
+ const XalanDOMString& key,
+ const XalanDOMString& expression);
/**
* Set a top-level parameter, which the stylesheet can access
@@ -506,16 +527,95 @@ public:
*/
void
setStylesheetParam(
- const char* qname,
+ const char* key,
const char* expression);
/**
+ * Set a top-level parameter, which the stylesheet can access
+ * with a top-level xsl:param. Top-level params are "sticky,"
+ * and must be removed with a call to clearStylesheetParams().
+ *
+ * @param key name of the param
+ * @param number value to be evaluated
+ */
+ void
+ setStylesheetParam(
+ const char* key,
+ double number);
+
+ /**
+ * Set a top-level parameter, which the stylesheet can access
+ * with a top-level xsl:param. Top-level params are "sticky,"
+ * and must be removed with a call to clearStylesheetParams().
+ *
+ * @param key name of the param
+ * @param number value to be evaluated
+ */
+ void
+ setStylesheetParam(
+ const XalanDOMString& key,
+ double number);
+
+ /**
+ * Set a top-level parameter, which the stylesheet can access
+ * with a top-level xsl:param. Top-level params are "sticky,"
+ * and must be removed with a call to clearStylesheetParams().
+ *
+ * @param key name of the param
+ * @param nodeset XML nodeset that will be evaulated
+ */
+ void
+ setStylesheetParam(
+ const char* key,
+ XalanNode* nodeset);
+
+ /**
+ * Set a top-level parameter, which the stylesheet can access
+ * with a top-level xsl:param. Top-level params are "sticky,"
+ * and must be removed with a call to clearStylesheetParams().
+ *
+ * @param key name of the param
+ * @param nodeset XML nodeset that will be evaluated
+ */
+ void
+ setStylesheetParam(
+ const XalanDOMString& key,
+ XalanNode* nodeset);
+
+ /**
+ * Set a top-level parameter, which the stylesheet can access
+ * with a top-level xsl:param. Top-level params are "sticky,"
+ * and must be removed with a call to clearStylesheetParams().
+ *
+ * @param key name of the param
+ * @param object any XObject owned by the transformer
+ */
+ void
+ setStylesheetParam(
+ const char* key,
+ XObjectPtr object);
+
+ /**
+ * Set a top-level parameter, which the stylesheet can access
+ * with a top-level xsl:param. Top-level params are "sticky,"
+ * and must be removed with a call to clearStylesheetParams().
+ *
+ * @param key name of the param
+ * @param object any XObject owned by the transformer
+ */
+ void
+ setStylesheetParam(
+ const XalanDOMString& key,
+ XObjectPtr object);
+
+ /**
* Clear any stylesheet params.
*/
void
clearStylesheetParams()
{
m_params.clear();
+ m_topXObjectFactory->reset();
}
/**
@@ -926,14 +1026,6 @@ public:
bool
getICUAvailable() const;
- typedef XalanVector<const XalanCompiledStylesheet*> CompiledStylesheetPtrVectorType;
- typedef XalanVector<const XalanParsedSource*> ParsedSourcePtrVectorType;
-
- typedef XalanMap<XalanDOMString, XalanDOMString> ParamMapType;
-
- typedef XalanMap<XalanQNameByValue, Function*> FunctionMapType;
- typedef XalanVector<TraceListener*> TraceListenerVectorType;
-
class EnsureFunctionsInstallation
{
public:
@@ -1102,6 +1194,8 @@ private:
bool m_poolAllTextNodes;
+ XObjectFactoryDefault* m_topXObjectFactory;
+
// This should always be the latest data member!!!
StylesheetExecutionContextDefault* m_stylesheetExecutionContext;