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;