| /* |
| * The Apache Software License, Version 1.1 |
| * |
| * |
| * Copyright (c) 1999 The Apache Software Foundation. All rights |
| * reserved. |
| * |
| * Redistribution and use in source and binary forms, with or without |
| * modification, are permitted provided that the following conditions |
| * are met: |
| * |
| * 1. Redistributions of source code must retain the above copyright |
| * notice, this list of conditions and the following disclaimer. |
| * |
| * 2. Redistributions in binary form must reproduce the above copyright |
| * notice, this list of conditions and the following disclaimer in |
| * the documentation and/or other materials provided with the |
| * distribution. |
| * |
| * 3. The end-user documentation included with the redistribution, |
| * if any, must include the following acknowledgment: |
| * "This product includes software developed by the |
| * Apache Software Foundation (http://www.apache.org/)." |
| * Alternately, this acknowledgment may appear in the software itself, |
| * if and wherever such third-party acknowledgments normally appear. |
| * |
| * 4. The names "Xalan" and "Apache Software Foundation" must |
| * not be used to endorse or promote products derived from this |
| * software without prior written permission. For written |
| * permission, please contact apache@apache.org. |
| * |
| * 5. Products derived from this software may not be called "Apache", |
| * nor may "Apache" appear in their name, without prior written |
| * permission of the Apache Software Foundation. |
| * |
| * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED |
| * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
| * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE |
| * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR |
| * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, |
| * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT |
| * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF |
| * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND |
| * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, |
| * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT |
| * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF |
| * SUCH DAMAGE. |
| * ==================================================================== |
| * |
| * This software consists of voluntary contributions made by many |
| * individuals on behalf of the Apache Software Foundation and was |
| * originally based on software copyright (c) 1999, International |
| * Business Machines, Inc., http://www.ibm.com. For more |
| * information on the Apache Software Foundation, please see |
| * <http://www.apache.org/>. |
| * |
| * @author <a href="mailto:david_n_bertoni@lotus.com">David N. Bertoni</a> |
| */ |
| #if !defined(STYLESHEETEXECUTIONCONTEXT_HEADER_GUARD_1357924680) |
| #define STYLESHEETEXECUTIONCONTEXT_HEADER_GUARD_1357924680 |
| |
| |
| |
| // Base include file. Must be first. |
| #include <XSLT/XSLTDefinitions.hpp> |
| |
| |
| |
| #if defined(XALAN_OLD_STREAMS) |
| #include <iostream.h> |
| #else |
| #include <iosfwd> |
| #endif |
| |
| |
| |
| #include <cstddef> |
| #include <memory> |
| |
| |
| |
| // Base class header file... |
| #include <XPath/XPathExecutionContext.hpp> |
| |
| |
| |
| #include <XalanDOM/XalanDOMString.hpp> |
| |
| |
| |
| // Base class header file... |
| #include <PlatformSupport/ExecutionContext.hpp> |
| |
| |
| |
| #if defined(XALAN_AUTO_PTR_REQUIRES_DEFINITION) |
| #include <PlatformSupport/XalanNumberFormat.hpp> |
| #endif |
| |
| |
| |
| #include <Include/XalanAutoPtr.hpp> |
| |
| |
| |
| #include <PlatformSupport/AttributeListImpl.hpp> |
| |
| |
| |
| #include <XSLT/KeyTable.hpp> |
| #include <XSLT/TopLevelArg.hpp> |
| |
| |
| |
| class CountersTable; |
| class ElemTemplateElement; |
| class ElemVariable; |
| class FormatterListener; |
| class FormatterToDOM; |
| class FormatterToHTML; |
| class FormatterToText; |
| class FormatterToXML; |
| class GenerateEvent; |
| class KeyTable; |
| class PrefixResolver; |
| class NodeRefListBase; |
| class NodeSorter; |
| class PrintWriter; |
| class XalanQName; |
| class SelectionEvent; |
| class Stylesheet; |
| class StylesheetRoot; |
| class XalanOutputStream; |
| class TracerEvent; |
| class Writer; |
| class XalanDocument; |
| class XalanDocumentFragment; |
| class XalanElement; |
| class XalanNode; |
| class XalanNumberFormat; |
| class XPath; |
| class XObject; |
| class XObjectPtr; |
| class XResultTreeFrag; |
| |
| |
| |
| // |
| // An abstract class which provides support for executing stylesheets. |
| // |
| class XALAN_XSLT_EXPORT StylesheetExecutionContext : public XPathExecutionContext |
| { |
| public: |
| |
| typedef size_t size_type; |
| |
| explicit |
| StylesheetExecutionContext(); |
| |
| virtual |
| ~StylesheetExecutionContext(); |
| |
| // These interfaces are new... |
| |
| /** |
| * Determine whether conflicts should be reported. |
| * |
| * @return true if conflicts should not be warned |
| */ |
| virtual bool |
| getQuietConflictWarnings() const = 0; |
| |
| /** |
| * Retrieve root document for stylesheet. Note that |
| * this does not have to be a XalanDocument -- it can |
| * be any node in a document. |
| * |
| * @return root document |
| */ |
| virtual XalanNode* |
| getRootDocument() const = 0; |
| |
| /** |
| * Set root document for stylesheet. Note that |
| * this does not have to be a XalanDocument -- it can |
| * be any node in a document. |
| * |
| * @param theDocument root document |
| */ |
| virtual void |
| setRootDocument(XalanNode* theDocument) = 0; |
| |
| /** |
| * Create a new empty document. |
| * |
| * @return new document |
| */ |
| virtual XalanDocument* |
| createDocument() const = 0; |
| |
| /** |
| * Set root stylesheet for stylesheet. |
| * |
| * @param theStylesheet root stylesheet |
| */ |
| virtual void |
| setStylesheetRoot(const StylesheetRoot* theStylesheet) = 0; |
| |
| /** |
| * Retrieve the current mode of the element |
| * |
| * @return QName for mode |
| */ |
| virtual const XalanQName* |
| getCurrentMode() const = 0; |
| |
| /** |
| * Set the current mode of the element |
| * |
| * @param QName for mode |
| */ |
| virtual void |
| setCurrentMode(const XalanQName* theMode) = 0; |
| |
| /** |
| * Whether diagnostic output is to be generated |
| * |
| * @return true for diagnostics output |
| */ |
| virtual bool |
| doDiagnosticsOutput() const = 0; |
| |
| /** |
| * Print a diagnostics string to the output device |
| * |
| * @param theString string to print |
| */ |
| virtual void |
| diag(const XalanDOMString& theString) = 0; |
| |
| /** |
| * Mark the time, so that displayDuration can later display the elapsed |
| * clock ticks. |
| * |
| * @param theKey element to push |
| */ |
| virtual void |
| pushTime(const void* theKey) = 0; |
| |
| /** |
| * Display the duration since pushTime was called. |
| * |
| * @param theMessage message to display |
| * @param theKey key for which duration is displayed |
| */ |
| virtual void |
| displayDuration( |
| const XalanDOMString& theMessage, |
| const void* theKey) = 0; |
| |
| /** |
| * See if there is an element pending. |
| */ |
| virtual bool |
| isElementPending() const = 0; |
| |
| /** |
| * Replace the contents of a pending attribute. |
| * |
| * @param theName name of attribute |
| * @param theNewType type of attribute |
| * @param theNewValue new value of attribute |
| */ |
| virtual void |
| replacePendingAttribute( |
| const XalanDOMChar* theName, |
| const XalanDOMChar* theNewType, |
| const XalanDOMChar* theNewValue) = 0; |
| |
| /** |
| * Get the current formatter listener. |
| * |
| * @return pointer to formatter listener |
| */ |
| virtual FormatterListener* |
| getFormatterListener() const = 0; |
| |
| /** |
| * Set the current formatter listener. |
| * |
| * @param flistener pointer to new formatter listener |
| */ |
| virtual void |
| setFormatterListener(FormatterListener* flistener) = 0; |
| |
| virtual void |
| pushOutputContext(FormatterListener* flistener = 0) = 0; |
| |
| virtual void |
| popOutputContext() = 0; |
| |
| class OutputContextPushPop |
| { |
| public: |
| |
| /** |
| * Construct an object to push and pop the current output context. |
| * |
| * @param theExecutionContext a reference to the current execution context |
| * @param theNewListener the new FormatterListener to set. |
| */ |
| OutputContextPushPop( |
| StylesheetExecutionContext& theExecutionContext, |
| FormatterListener* theNewListener = 0) : |
| m_executionContext(theExecutionContext) |
| { |
| m_executionContext.pushOutputContext(theNewListener); |
| } |
| |
| ~OutputContextPushPop() |
| { |
| m_executionContext.popOutputContext(); |
| } |
| |
| private: |
| |
| StylesheetExecutionContext& m_executionContext; |
| }; |
| |
| /** |
| * Add a result attribute to the list of pending attributes. |
| * |
| * @param aname name of attribute |
| * @param value value of attribute |
| */ |
| virtual void |
| addResultAttribute( |
| const XalanDOMString& aname, |
| const XalanDOMString& value) = 0; |
| |
| /** |
| * Add namespace attributes for a node to the list of pending attributes. |
| * |
| * @param src source node |
| */ |
| virtual void |
| copyNamespaceAttributes(const XalanNode& src) = 0; |
| |
| /** |
| * Retrieve the result prefix corresponding to a namespace. |
| * |
| * @param theNamespace namespace for prefix |
| * |
| * @return A pointer to a string containing the prefix, or 0 if the namespace is not mapped. |
| */ |
| virtual const XalanDOMString* |
| getResultPrefixForNamespace(const XalanDOMString& theNamespace) const = 0; |
| |
| /** |
| * Retrieve the result namespace corresponding to a prefix. |
| * |
| * @param thePrefix prefix for namespace |
| * |
| * @return A pointer to a string containing the namespace, or 0 if the prefix is not mapped. |
| */ |
| virtual const XalanDOMString* |
| getResultNamespaceForPrefix(const XalanDOMString& thePrefix) const = 0; |
| |
| /** |
| * Determine whether or not a prefix is in use on the pending element or |
| * the pending attributes. |
| * |
| * @param thePrefix prefix for namespace |
| * |
| * @return true if the prefix is in use, false if not. |
| */ |
| virtual bool |
| isPendingResultPrefix(const XalanDOMString& thePrefix) = 0; |
| |
| /** |
| * Generate a random namespace prefix guaranteed to be unique. |
| * |
| * @return unique namespace prefix |
| */ |
| virtual XalanDOMString |
| getUniqueNamespaceValue() const = 0; |
| |
| /** |
| * Generate a random namespace prefix guaranteed to be unique. |
| * |
| * @param theValue A string for returning the new prefix |
| */ |
| virtual void |
| getUniqueNamespaceValue(XalanDOMString& theValue) const = 0; |
| |
| /** |
| * Retrieve the current number of spaces to indent. |
| * |
| * @return number of spaces |
| */ |
| 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 |
| * XObject is not necessarily that of the Stylesheet. |
| * |
| * @param str string expression for XPath evaluation |
| * @param contextNode current node in the source tree |
| * @param resolver resolver for namespace resolution |
| * @return pointer to resulting XObject |
| */ |
| virtual const XObjectPtr |
| executeXPath( |
| const XalanDOMString& str, |
| XalanNode* contextNode, |
| const XalanElement& resolver) = 0; |
| |
| /** |
| * Create and initialize an xpath and return it. This is to be used to |
| * create an XPath that is only used during execution. |
| * |
| * @param str string expression for XPath evaluation |
| * @param resolver resolver for namespace resolution |
| * @return pointer to resulting XPath |
| */ |
| virtual const XPath* |
| createMatchPattern( |
| const XalanDOMString& str, |
| const PrefixResolver& resolver) = 0; |
| |
| /** |
| * Return the XPath created by createMatchPattern(). |
| * |
| * @param xpath The XPath to return. |
| */ |
| virtual void |
| returnXPath(const XPath* xpath) = 0; |
| |
| // A helper class to automatically return an XPath instance. |
| class XPathGuard |
| { |
| public: |
| |
| XPathGuard( |
| StylesheetExecutionContext& context, |
| const XPath* xpath = 0) : |
| m_context(context), |
| m_xpath(xpath) |
| { |
| } |
| |
| ~XPathGuard() |
| { |
| if (m_xpath != 0) |
| { |
| m_context.returnXPath(m_xpath); |
| } |
| } |
| |
| const XPath* |
| get() const |
| { |
| return m_xpath; |
| } |
| |
| const XPath* |
| release() |
| { |
| const XPath* const temp = m_xpath; |
| |
| m_xpath = 0; |
| |
| return temp; |
| } |
| |
| void |
| reset(const XPath* xpath) |
| { |
| if (m_xpath != 0) |
| { |
| m_context.returnXPath(m_xpath); |
| } |
| |
| m_xpath = xpath; |
| } |
| |
| private: |
| |
| StylesheetExecutionContext& m_context; |
| |
| const XPath* m_xpath; |
| }; |
| |
| #if defined(XALAN_NO_NAMESPACES) |
| typedef vector<TopLevelArg> ParamVectorType; |
| #else |
| typedef std::vector<TopLevelArg> ParamVectorType; |
| #endif |
| |
| /** |
| * Set a list of top level variables in the specified execution context |
| * stylesheet. |
| * |
| * @param topLevelParams list of top level parameters |
| */ |
| virtual void |
| pushTopLevelVariables(const ParamVectorType& topLevelParams) = 0; |
| |
| /** |
| * Execute the supplied XPath and and create a |
| * variable in the current context. |
| * |
| * @param element element marker for variable |
| * @param str string expression for XPath evaluation |
| * @param contextNode current node in the source tree |
| * @param resolver resolver for namespace resolution |
| * @return a pointer to the XObject result |
| */ |
| virtual const XObjectPtr |
| createVariable( |
| const ElemTemplateElement* element, |
| const XPath& xpath, |
| XalanNode* contextNode, |
| const PrefixResolver& resolver) = 0; |
| |
| /** |
| * Create an ResultTreeFragment as a variable and push it |
| * on to the stack with the current context. |
| * |
| * @param element element marker for variable |
| * @param templateChild result tree fragment to use. |
| * @param sourceNode source node |
| * @return a pointer to the XObject result |
| */ |
| virtual const XObjectPtr |
| createVariable( |
| const ElemTemplateElement* element, |
| const ElemTemplateElement& templateChild, |
| XalanNode* sourceNode) = 0; |
| |
| /** |
| * Execute an XPath using the provided expression, |
| * and push the result as a variable in the context of |
| * the supplied element. |
| * |
| * @param name name of variable |
| * @param element element marker for variable |
| * @param str string expression for XPath evaluation |
| * @param contextNode current node in the source tree |
| * @param resolver resolver for namespace resolution |
| * @return nothing |
| */ |
| virtual void |
| pushVariable( |
| const XalanQName& name, |
| const ElemTemplateElement* element, |
| const XalanDOMString& str, |
| XalanNode* contextNode, |
| const PrefixResolver& resolver) = 0; |
| |
| /** |
| * Execute the supplied XPath and push the result as a |
| * variable in the current context. |
| * |
| * @param name name of variable |
| * @param element element marker for variable |
| * @param str string expression for XPath evaluation |
| * @param contextNode current node in the source tree |
| * @param resolver resolver for namespace resolution |
| * @return nothing |
| */ |
| virtual void |
| pushVariable( |
| const XalanQName& name, |
| const ElemTemplateElement* element, |
| const XPath& xpath, |
| XalanNode* contextNode, |
| const PrefixResolver& resolver) = 0; |
| |
| /** |
| * Create an ResultTreeFragment as a variable and push it |
| * on to the stack with the current context. |
| * |
| * @param name name of variable |
| * @param element element marker for variable |
| * @param templateChild result tree fragment to use. |
| * @param sourceNode source node |
| */ |
| virtual void |
| pushVariable( |
| const XalanQName& name, |
| const ElemTemplateElement* element, |
| const ElemTemplateElement& templateChild, |
| XalanNode* sourceNode) = 0; |
| |
| /** |
| * Push a named variable onto the variables stack. |
| * The variable has already been evaluated. |
| * |
| * @param name name of variable |
| * @param val pointer to XObject value |
| * @param element element marker for variable |
| */ |
| virtual void |
| pushVariable( |
| const XalanQName& name, |
| const XObjectPtr val, |
| const ElemTemplateElement* element) = 0; |
| |
| /** |
| * Push a named variable onto the processor variable stack |
| * The variable will be evaluated when first referenced. |
| * |
| * @param name name of variable |
| * @param var pointer to ElemVariable instance |
| * @param element element marker for variable |
| */ |
| virtual void |
| pushVariable( |
| const XalanQName& name, |
| const ElemVariable* var, |
| const ElemTemplateElement* element) = 0; |
| |
| /** |
| * Push a context marker onto the stack to let us know when to stop |
| * searching for a var. |
| */ |
| virtual void |
| pushContextMarker() = 0; |
| |
| /** |
| * Pop the current context from the current context stack. |
| */ |
| virtual void |
| popContextMarker() = 0; |
| |
| /* |
| * A class to manage pushing and popping an element's stack |
| * frame context. |
| */ |
| class PushAndPopContextMarker |
| { |
| public: |
| |
| PushAndPopContextMarker(StylesheetExecutionContext& executionContext) : |
| m_executionContext(executionContext) |
| { |
| executionContext.pushContextMarker(); |
| } |
| |
| ~PushAndPopContextMarker() |
| { |
| m_executionContext.popContextMarker(); |
| } |
| |
| private: |
| |
| StylesheetExecutionContext& m_executionContext; |
| }; |
| |
| /** |
| * Resolve the params that were pushed by the caller. |
| */ |
| virtual void |
| resolveTopLevelParams() = 0; |
| |
| /** |
| * Reset the vector of top level parameters. |
| */ |
| virtual void |
| clearTopLevelParams() = 0; |
| |
| class ResolveAndClearTopLevelParams |
| { |
| public: |
| |
| ResolveAndClearTopLevelParams(StylesheetExecutionContext& executionContext) : |
| m_executionContext(executionContext) |
| { |
| m_executionContext.resolveTopLevelParams(); |
| } |
| |
| ~ResolveAndClearTopLevelParams() |
| { |
| m_executionContext.clearTopLevelParams(); |
| } |
| |
| private: |
| |
| StylesheetExecutionContext& m_executionContext; |
| }; |
| |
| /** |
| * Given a template, search for the arguments and push them on the stack. |
| * Also, push default arguments on the stack. |
| * |
| * @param xslCallTemplateElement "call-template" element |
| * @param sourceNode source node |
| * @param targetTemplate target template |
| */ |
| virtual void |
| pushParams( |
| const ElemTemplateElement& xslCallTemplateElement, |
| XalanNode* sourceNode, |
| const ElemTemplateElement* targetTemplate) = 0; |
| |
| /** |
| * Given a name, return a string representing the value, but don't look in |
| * the global space. |
| * |
| * @param theName name of variable |
| * @return pointer to XObject for variable |
| */ |
| virtual const XObjectPtr |
| getParamVariable(const XalanQName& theName) = 0; |
| |
| /** |
| * Push a frame marker for an element. |
| * |
| * @param elem the element |
| */ |
| virtual void |
| pushElementFrame(const ElemTemplateElement* elem) = 0; |
| |
| /** |
| * Pop a frame marker for an element. |
| * |
| * @param elem the element |
| */ |
| virtual void |
| popElementFrame(const ElemTemplateElement* elem) = 0; |
| |
| /* |
| * A class to manage pushing and popping an element's stack |
| * frame context. |
| */ |
| class PushAndPopElementFrame |
| { |
| public: |
| |
| PushAndPopElementFrame( |
| StylesheetExecutionContext& executionContext, |
| const ElemTemplateElement* element) : |
| m_executionContext(executionContext), |
| m_element(element) |
| { |
| executionContext.pushElementFrame(element); |
| } |
| |
| ~PushAndPopElementFrame() |
| { |
| m_executionContext.popElementFrame(m_element); |
| } |
| |
| private: |
| |
| StylesheetExecutionContext& m_executionContext; |
| |
| const ElemTemplateElement* m_element; |
| }; |
| |
| /** |
| * Get the top of the global stack frame. |
| * |
| * @return current value of index |
| */ |
| virtual int |
| getGlobalStackFrameIndex() const = 0; |
| |
| /** |
| * Get the top of the stack frame from where a search |
| * for a variable or param should take place. |
| * |
| * @return current value of index |
| */ |
| virtual int |
| getCurrentStackFrameIndex() const = 0; |
| |
| /** |
| * Set the top of the stack frame from where a search |
| * for a variable or param should take place. |
| * |
| * @param currentStackFrameIndex new value of index |
| */ |
| virtual void |
| setCurrentStackFrameIndex(int currentStackFrameIndex = -1) = 0; |
| |
| /* |
| * A class to manage the state of the variable stacks frame index. |
| */ |
| class SetAndRestoreCurrentStackFrameIndex |
| { |
| public: |
| |
| SetAndRestoreCurrentStackFrameIndex( |
| StylesheetExecutionContext& executionContext, |
| int newIndex) : |
| m_executionContext(executionContext), |
| m_savedIndex(executionContext.getCurrentStackFrameIndex()) |
| { |
| executionContext.setCurrentStackFrameIndex(newIndex); |
| } |
| |
| ~SetAndRestoreCurrentStackFrameIndex() |
| { |
| m_executionContext.setCurrentStackFrameIndex(m_savedIndex); |
| } |
| |
| int |
| getStackFrameIndex() const |
| { |
| return m_savedIndex; |
| } |
| |
| private: |
| |
| StylesheetExecutionContext& m_executionContext; |
| |
| const int m_savedIndex; |
| }; |
| |
| /* |
| * A class to manage stack state during execution. |
| */ |
| class ParamsPushPop |
| { |
| public: |
| |
| ParamsPushPop( |
| StylesheetExecutionContext& executionContext, |
| const ElemTemplateElement& xslCallTemplateElement, |
| XalanNode* sourceNode, |
| const ElemTemplateElement* targetTemplate); |
| |
| ~ParamsPushPop(); |
| |
| int |
| getStackFrameIndex() const |
| { |
| return m_savedStackFrameIndex; |
| } |
| |
| private: |
| |
| StylesheetExecutionContext& m_executionContext; |
| |
| const int m_savedStackFrameIndex; |
| }; |
| |
| /** |
| * Receive notification of the beginning of a document. |
| * |
| * <p>The SAX parser will invoke this method only once, before any |
| * other methods in this interface or in DTDHandler (except for |
| * setDocumentLocator).</p> |
| * |
| * @exception SAXException |
| */ |
| virtual void |
| startDocument() = 0; |
| |
| /** |
| * Receive notification of the end of a document. |
| * |
| * <p>The SAX parser will invoke this method only once, and it will |
| * be the last method invoked during the parse. The parser shall |
| * not invoke this method until it has either abandoned parsing |
| * (because of an unrecoverable error) or reached the end of |
| * input.</p> |
| * |
| * @exception SAXException |
| */ |
| virtual void |
| endDocument() = 0; |
| |
| /** |
| * Receive notification of the beginning of an element. |
| * |
| * @param name element type name |
| */ |
| virtual void |
| startElement(const XalanDOMChar* name) = 0; |
| |
| /** |
| * Receive notification of the end of an element. |
| * |
| * @param name element type name |
| */ |
| virtual void |
| endElement(const XalanDOMChar* name) = 0; |
| |
| /** |
| * Receive notification of character data. |
| * |
| * @param ch pointer to characters from the XML document |
| * @param start start position in the array |
| * @param length number of characters to read from the array |
| */ |
| virtual void |
| characters( |
| const XalanDOMChar* ch, |
| XalanDOMString::size_type start, |
| XalanDOMString::size_type length) = 0; |
| |
| /** |
| * Receive notification of character data. If available, when the |
| * disable-output-escaping attribute is used, output raw text without |
| * escaping. |
| * |
| * @param ch pointer to characters from the XML document |
| * @param start start position in the array |
| * @param length number of characters to read from the array |
| */ |
| virtual void |
| charactersRaw( |
| const XalanDOMChar* ch, |
| XalanDOMString::size_type start, |
| XalanDOMString::size_type length) = 0; |
| |
| /** |
| * Called when a Comment is to be constructed. |
| * |
| * @param data pointer to comment data |
| */ |
| virtual void |
| comment(const XalanDOMChar* data) = 0; |
| |
| /** |
| * Receive notification of a processing instruction. |
| * |
| * @param target processing instruction target |
| * @param data processing instruction data, or null if none was supplied |
| */ |
| virtual void |
| processingInstruction( |
| const XalanDOMChar* target, |
| const XalanDOMChar* data) = 0; |
| |
| /** |
| * Flush the pending element. |
| */ |
| virtual void |
| flushPending() = 0; |
| |
| /** |
| * Clone an element with or without children. |
| * |
| * @param node node to clone |
| * @param nodeType the type of the node |
| * @param isLiteral true if a literal element |
| * @param overrideStrip false if white space stripping should be done |
| * @param shouldCloneAttributes true if attributes should be cloned |
| * @param styleNode the stylesheet element that generated the clone. |
| */ |
| virtual void |
| cloneToResultTree( |
| XalanNode& node, |
| XalanNode::NodeType nodeType, |
| bool isLiteral, |
| bool overrideStrip, |
| bool shouldCloneAttributes, |
| const ElemTemplateElement* styleNode = 0) = 0; |
| |
| /** |
| * Create an XObject that represents a Result tree fragment. |
| * |
| * @param templateChild result tree fragment to use. |
| * @param sourceNode source node |
| * @return XObject instance |
| */ |
| virtual const XObjectPtr |
| createXResultTreeFrag( |
| const ElemTemplateElement& templateChild, |
| XalanNode* sourceNode) = 0; |
| |
| /** |
| * Output an object to the result tree by doing the right conversions. |
| * This is public for access by extensions. |
| * |
| * @param obj the XObject to output |
| */ |
| virtual void |
| outputToResultTree(const XObject& xobj) = 0; |
| |
| /** |
| * Given a result tree fragment, walk the tree and |
| * output it to the result stream. |
| * |
| * @param theTree result tree fragment |
| */ |
| virtual void |
| outputResultTreeFragment(const XObject& theTree) = 0; |
| |
| /** |
| * Determine the full XSLT Namespace URI. |
| * |
| * @return Xalan namespace URI |
| */ |
| virtual const XalanDOMString& |
| getXSLNameSpaceURL() const = 0; |
| |
| /** |
| * Special Xalan namespace for built-in extensions. |
| * |
| * @return Xalan namespace for extensions |
| */ |
| virtual const XalanDOMString& |
| getXalanXSLNameSpaceURL() const = 0; |
| |
| /** |
| * Determine if an element is on the recursion stack. |
| * |
| * @return true if element on stack |
| */ |
| virtual bool |
| findOnElementRecursionStack(const ElemTemplateElement* theElement) const = 0; |
| |
| /** |
| * Push an element onto the recursion stack. |
| * |
| * @param theElement pointer to element to push |
| */ |
| virtual void |
| pushOnElementRecursionStack(const ElemTemplateElement* theElement) = 0; |
| |
| /** |
| * Pop an element off the recursion stack. |
| * |
| * @return pointer to element popped |
| */ |
| virtual const ElemTemplateElement* |
| popElementRecursionStack() = 0; |
| |
| /** |
| * Class for keeping track of elements pushed on the element recursion stack |
| */ |
| class ElementRecursionStackPusher |
| { |
| public: |
| |
| /** |
| * Construct an instance of the recursion stack pusher. |
| * |
| * @param executionContext current execution context |
| * @param element pointer to element to push |
| */ |
| ElementRecursionStackPusher( |
| StylesheetExecutionContext& executionContext, |
| const ElemTemplateElement* element) : |
| m_executionContext(executionContext) |
| { |
| m_executionContext.pushOnElementRecursionStack(element); |
| } |
| |
| ~ElementRecursionStackPusher() |
| { |
| m_executionContext.popElementRecursionStack(); |
| } |
| |
| private: |
| |
| StylesheetExecutionContext& m_executionContext; |
| }; |
| |
| |
| /** |
| * This is a hook that XResultTreeFrag instances (which are reference |
| * counted), can notify the owning StylesheetExecutionContext instance |
| * when they are dereferenced and can be cleaned up. |
| * |
| * @param theXResultTreeFrag The instance that is being returned. |
| * |
| * @return true if the XResultTreeFrag instance belongs to the execution context. false if not. |
| */ |
| virtual bool |
| returnXResultTreeFrag(XResultTreeFrag* theXResultTreeFrag) = 0; |
| |
| |
| enum eDummy |
| { |
| eDefaultXMLIndentAmount = 0, |
| eDefaultHTMLIndentAmount = 0 |
| }; |
| |
| /** |
| * Create a new FormatterToXML instance. The execution context |
| * owns the instance and will delete it when reset. |
| * |
| * @param writer character output stream to use |
| * @param version version of the output method |
| * @param doIndent true if output is to be indented |
| * @param indent number of spaces to indent at each nesting level |
| * @param encoding character encoding for the writer |
| * @param mediaType media type (MIME content type) of the data |
| * @param doctypeSystem system identifier to be used in the document |
| * type declaration |
| * @param doctypePublic public identifier to be used in the document |
| * type declaration |
| * @param xmlDecl true if the XSLT processor should output an XML |
| * declaration |
| * @param standalone true if the XSLT processor should output a |
| * standalone document declaration |
| * @return a pointer to the new instance. |
| */ |
| virtual FormatterToXML* |
| createFormatterToXML( |
| Writer& writer, |
| const XalanDOMString& version = XalanDOMString(), |
| bool doIndent = false, |
| int indent = eDefaultXMLIndentAmount, |
| const XalanDOMString& encoding = XalanDOMString(), |
| const XalanDOMString& mediaType = XalanDOMString(), |
| const XalanDOMString& doctypeSystem = XalanDOMString(), |
| const XalanDOMString& doctypePublic = XalanDOMString(), |
| bool xmlDecl = true, |
| const XalanDOMString& standalone = XalanDOMString()) = 0; |
| |
| /** |
| * Create a new FormatterToHTML instance. The execution context |
| * owns the instance and will delete it when reset. |
| * |
| * @param writer character output stream to use |
| * @param encoding character encoding for the writer |
| * @param mediaType media type (MIME content type) of the data |
| * @param doctypeSystem system identifier to be used in the document |
| * type declaration |
| * @param doctypePublic public identifier to be used in the document |
| * type declaration |
| * @param doIndent true if output is to be indented |
| * @param indent number of spaces to indent at each nesting level |
| * @param version version of the output method |
| * @param standalone true if the XSLT processor should output a |
| * standalone document declaration |
| * @param xmlDecl true if the XSLT processor should output an XML |
| * declaration |
| * @return a pointer to the new instance. |
| */ |
| virtual FormatterToHTML* |
| createFormatterToHTML( |
| Writer& writer, |
| const XalanDOMString& encoding = XalanDOMString(), |
| const XalanDOMString& mediaType = XalanDOMString(), |
| const XalanDOMString& doctypeSystem = XalanDOMString(), |
| const XalanDOMString& doctypePublic = XalanDOMString(), |
| bool doIndent = true, |
| int indent = eDefaultHTMLIndentAmount, |
| const XalanDOMString& version = XalanDOMString(), |
| const XalanDOMString& standalone = XalanDOMString(), |
| bool xmlDecl = false) = 0; |
| |
| /** |
| * Construct a FormatterToDOM instance. it will add the DOM nodes |
| * to the document fragment. |
| * |
| * @param doc document for nodes |
| * @param docFrag document fragment for nodes, default none |
| * @param currentElement current element for nodes, default none |
| */ |
| virtual FormatterToDOM* |
| createFormatterToDOM( |
| XalanDocument* doc, |
| XalanDocumentFragment* docFrag, |
| XalanElement* currentElement) = 0; |
| |
| /** |
| * Construct a FormatterToDOM instance. it will add the DOM nodes |
| * to the document fragment. |
| * |
| * @param doc document for nodes |
| * @param docFrag document fragment for nodes, default none |
| * @param currentElement current element for nodes, default none |
| */ |
| virtual FormatterToDOM* |
| createFormatterToDOM( |
| XalanDocument* doc, |
| XalanElement* elem) = 0; |
| |
| /** |
| * FormatterToText instance constructor. |
| * |
| * @param writer writer for output |
| * @param encoding character encoding for the writer |
| */ |
| virtual FormatterToText* |
| createFormatterToText( |
| Writer& writer, |
| const XalanDOMString& encoding) = 0; |
| |
| /** |
| * Borrow a cached FormatterToText instance. |
| * |
| * @return A pointer to the instance. |
| */ |
| virtual FormatterToText* |
| borrowFormatterToText() = 0; |
| |
| /** |
| * Return a previously borrowed FormatterToText instance. |
| * |
| * @param theFormatter A pointer the to previously borrowed instance. |
| * @return true if the instance was previously borrowed, false if not. |
| */ |
| virtual bool |
| returnFormatterToText(FormatterToText* theFormatter) = 0; |
| |
| class BorrowReturnFormatterToText |
| { |
| public: |
| |
| BorrowReturnFormatterToText( |
| StylesheetExecutionContext& executionContext, |
| Writer& writer, |
| bool normalizeLinefeed = true, |
| bool handleIgnorableWhitespace = true); |
| |
| ~BorrowReturnFormatterToText() |
| { |
| assert(m_formatter != 0); |
| |
| m_executionContext.returnFormatterToText(m_formatter); |
| } |
| |
| FormatterToText& |
| operator*() const |
| { |
| assert(m_formatter != 0); |
| |
| return *m_formatter; |
| } |
| |
| FormatterToText* |
| get() const |
| { |
| assert(m_formatter != 0); |
| |
| return m_formatter; |
| } |
| |
| FormatterToText* |
| operator->() const |
| { |
| return get(); |
| } |
| |
| private: |
| |
| StylesheetExecutionContext& m_executionContext; |
| |
| FormatterToText* m_formatter; |
| }; |
| |
| |
| /** |
| * Borrow a cached NodeSorter instance. |
| * |
| * @return A pointer to the instance. |
| */ |
| virtual NodeSorter* |
| borrowNodeSorter() = 0; |
| |
| /** |
| * Return a previously borrowed NodeSorter instance. |
| * |
| * @param theSorter A pointer the to previously borrowed instance. |
| * @return true if the instance was previously borrowed, false if not. |
| */ |
| virtual bool |
| returnNodeSorter(NodeSorter* theSorter) = 0; |
| |
| class BorrowReturnNodeSorter |
| { |
| public: |
| |
| BorrowReturnNodeSorter(StylesheetExecutionContext& executionContext) : |
| m_executionContext(executionContext), |
| m_sorter(executionContext.borrowNodeSorter()) |
| { |
| assert(m_sorter != 0); |
| } |
| |
| ~BorrowReturnNodeSorter() |
| { |
| assert(m_sorter != 0); |
| |
| m_executionContext.returnNodeSorter(m_sorter); |
| } |
| |
| NodeSorter& |
| operator*() const |
| { |
| assert(m_sorter != 0); |
| |
| return *m_sorter; |
| } |
| |
| NodeSorter* |
| get() const |
| { |
| assert(m_sorter != 0); |
| |
| return m_sorter; |
| } |
| |
| NodeSorter* |
| operator->() const |
| { |
| return get(); |
| } |
| |
| private: |
| |
| StylesheetExecutionContext& m_executionContext; |
| |
| NodeSorter* m_sorter; |
| }; |
| |
| |
| typedef XalanAutoPtr<XalanNumberFormat> XalanNumberFormatAutoPtr; |
| |
| /** |
| * Create a new XalanNumberFormat instance. |
| * |
| * @return an XalanNumberFormatAutoPtr that owns a new |
| * XalanNumberFormat instance. |
| */ |
| virtual XalanNumberFormatAutoPtr |
| createXalanNumberFormat() = 0; |
| |
| |
| // Trace interface... |
| |
| /** |
| * Determine the number of trace listeners. |
| * |
| * @return number of listeners |
| */ |
| virtual size_type |
| getTraceListeners() const = 0; |
| |
| /** |
| * Fire a generate event. |
| * |
| * @param ge generate event to fire |
| */ |
| virtual void |
| fireGenerateEvent(const GenerateEvent& ge) = 0; |
| |
| /** |
| * Fire a trace event. |
| * |
| * @param te trace event to fire |
| */ |
| virtual void |
| fireTraceEvent(const TracerEvent& te) = 0; |
| |
| /** |
| * Fire a selection event. |
| * |
| * @param se selection event to fire |
| */ |
| virtual void |
| fireSelectEvent(const SelectionEvent& se) = 0; |
| |
| /** |
| * If this is set to true, simple traces of template calls are made. |
| * |
| * @return true if traces made |
| */ |
| virtual bool |
| getTraceSelects() const = 0; |
| |
| /** |
| * Compose a diagnostic trace of the current selection |
| * |
| * @param theTemplate current context node |
| * @param nl list of selected nodes |
| */ |
| virtual void |
| traceSelect( |
| const XalanElement& theTemplate, |
| const NodeRefListBase& nl) const = 0; |
| |
| /** |
| * Compare two strings using the collation of the |
| * current locale. |
| * |
| * @param theLHS a string to compare |
| * @param theRHS a string to compare |
| * @return < 0 if theLHS is before theRHS, 0 if they are equal, or > 0 if theLHS is after theRHS |
| */ |
| virtual int |
| collationCompare( |
| const XalanDOMString& theLHS, |
| const XalanDOMString& theRHS) = 0; |
| |
| /** |
| * Compare two strings using the collation of the |
| * supplied locale. |
| * |
| * @param theLHS a string to compare |
| * @param theRHS a string to compare |
| * @param theLocal a string that specifies the locale |
| * @return < 0 if theLHS is before theRHS, 0 if they are equal, or > 0 if theLHS is after theRHS |
| */ |
| virtual int |
| collationCompare( |
| const XalanDOMString& theLHS, |
| const XalanDOMString& theRHS, |
| const XalanDOMString& theLocale) = 0; |
| |
| /** |
| * Compare two strings using the collation of the |
| * current locale. |
| * |
| * @param theLHS a string to compare |
| * @param theRHS a string to compare |
| * @return < 0 if theLHS is before theRHS, 0 if they are equal, or > 0 if theLHS is after theRHS |
| */ |
| virtual int |
| collationCompare( |
| const XalanDOMChar* theLHS, |
| const XalanDOMChar* theRHS) = 0; |
| |
| /** |
| * Compare two strings using the collation of the |
| * current locale. |
| * |
| * @param theLHS a string to compare |
| * @param theRHS a string to compare |
| * @param theLocal a string that specifies the locale |
| * @return < 0 if theLHS is before theRHS, 0 if they are equal, or > 0 if theLHS is after theRHS |
| */ |
| virtual int |
| collationCompare( |
| const XalanDOMChar* theLHS, |
| const XalanDOMChar* theRHS, |
| const XalanDOMChar* theLocale) = 0; |
| |
| /** |
| * Determine if a KeyDeclaration is being constructed. |
| * |
| * @param The KeyDeclaration in question. |
| * @return true if being constructed |
| */ |
| virtual bool |
| getInConstruction(const KeyDeclaration& keyDeclaration) const = 0; |
| |
| /** |
| * Add KeyDeclaration to construction list. |
| * |
| * @param KeyDeclaration being constructed |
| */ |
| virtual void |
| beginConstruction(const KeyDeclaration& keyDeclaration) = 0; |
| |
| /** |
| * Remove KeyDeclaration from construction list. |
| * |
| * @param constructed KeyDeclaration |
| */ |
| virtual void |
| endConstruction(const KeyDeclaration& keyDeclaration) = 0; |
| |
| /** |
| * Create a PrintWriter for the provided stream. |
| * |
| * @param theTextOutputStream The output stream for the PrintWriter. |
| * @return The new instance. |
| */ |
| virtual PrintWriter* |
| createPrintWriter(XalanOutputStream* theTextOutputStream) = 0; |
| |
| /** |
| * Create a PrintWriter. Create an appropriate output stream |
| * using the provided file name and encoding. |
| * |
| * @param theFileName The file name for the output stream |
| * @param theEncoding The encoding for the output stream |
| * @return The new instance. |
| */ |
| virtual PrintWriter* |
| createPrintWriter( |
| const XalanDOMString& theFileName, |
| const XalanDOMString& theEncoding) = 0; |
| |
| /** |
| * Create a PrintWriter using the provided ostream instance. |
| * |
| * @param ostream The output stream for the PrintWriter. |
| * @return The new instance. |
| */ |
| virtual PrintWriter* |
| #if defined(XALAN_NO_NAMESPACES) |
| createPrintWriter(ostream& theStream) = 0; |
| #else |
| createPrintWriter(std::ostream& theStream) = 0; |
| #endif |
| |
| /** |
| * Get the counters table, which is a table of cached |
| * results that is used by ElemNumber. |
| * |
| * @return A reference to the counters table. |
| */ |
| virtual CountersTable& |
| getCountersTable() = 0; |
| |
| /** |
| * Send character data from a node to the result tree. |
| * |
| * @param node The node to send. |
| */ |
| virtual void |
| characters(const XalanNode& node) = 0; |
| |
| /** |
| * Send character data from an XObject to the result tree. |
| * |
| * @param node The xobject to send. |
| */ |
| virtual void |
| characters(const XObjectPtr& xobject) = 0; |
| |
| /** |
| * Send raw character data from a node to the result tree. |
| * |
| * @param node The node to send. |
| * @param length number of characters to read from the array |
| */ |
| virtual void |
| charactersRaw(const XalanNode& node) = 0; |
| |
| /** |
| * Send raw character data from an XObject to the result tree. |
| * |
| * @param node The xobject to send. |
| */ |
| virtual void |
| charactersRaw(const XObjectPtr& xobject) = 0; |
| |
| |
| // These interfaces are inherited from XPathExecutionContext... |
| |
| virtual void |
| reset() = 0; |
| |
| virtual XalanNode* |
| getCurrentNode() const = 0; |
| |
| virtual void |
| setCurrentNode(XalanNode* theCurrentNode) = 0; |
| |
| virtual XObjectFactory& |
| getXObjectFactory() const = 0; |
| |
| virtual XObjectPtr |
| createNodeSet(XalanNode& theNode) = 0; |
| |
| virtual bool |
| isNodeAfter( |
| const XalanNode& node1, |
| const XalanNode& node2) const = 0; |
| |
| virtual const NodeRefListBase& |
| getContextNodeList() const = 0; |
| |
| virtual void |
| setContextNodeList(const NodeRefListBase& theList) = 0; |
| |
| virtual size_type |
| getContextNodeListLength() const = 0; |
| |
| virtual size_type |
| getContextNodeListPosition(const XalanNode& contextNode) const = 0; |
| |
| virtual bool |
| elementAvailable( |
| const XalanDOMString& theNamespace, |
| const XalanDOMString& elementName) const = 0; |
| |
| virtual bool |
| functionAvailable( |
| const XalanDOMString& theNamespace, |
| const XalanDOMString& functionName) const = 0; |
| |
| virtual const XObjectPtr |
| extFunction( |
| const XalanDOMString& theNamespace, |
| const XalanDOMString& functionName, |
| XalanNode* context, |
| const XObjectArgVectorType& argVec, |
| const Locator* locator) = 0; |
| |
| virtual XalanDocument* |
| parseXML( |
| const XalanDOMString& urlString, |
| const XalanDOMString& base) const = 0; |
| |
| virtual MutableNodeRefList* |
| borrowMutableNodeRefList() = 0; |
| |
| virtual bool |
| returnMutableNodeRefList(MutableNodeRefList* theList) = 0; |
| |
| virtual MutableNodeRefList* |
| createMutableNodeRefList() const = 0; |
| |
| virtual XalanDOMString& |
| getCachedString() = 0; |
| |
| virtual bool |
| releaseCachedString(XalanDOMString& theString) = 0; |
| |
| virtual void |
| getNodeSetByKey( |
| XalanNode* doc, |
| const XalanDOMString& name, |
| const XalanDOMString& ref, |
| const PrefixResolver& resolver, |
| MutableNodeRefList& nodelist) = 0; |
| |
| virtual const XObjectPtr |
| getVariable( |
| const XalanQName& name, |
| const Locator* locator = 0) = 0; |
| |
| virtual const PrefixResolver* |
| getPrefixResolver() const = 0; |
| |
| virtual void |
| setPrefixResolver(const PrefixResolver* thePrefixResolver) = 0; |
| |
| virtual const XalanDOMString* |
| getNamespaceForPrefix(const XalanDOMString& prefix) const = 0; |
| |
| virtual XalanDOMString |
| findURIFromDoc(const XalanDocument* owner) const = 0; |
| |
| virtual const XalanDOMString& |
| getUnparsedEntityURI( |
| const XalanDOMString& theName, |
| const XalanDocument& theDocument) const = 0; |
| |
| virtual bool |
| shouldStripSourceNode(const XalanNode& node) = 0; |
| |
| virtual bool |
| getThrowFoundIndex() const = 0; |
| |
| virtual void |
| setThrowFoundIndex(bool fThrow) = 0; |
| |
| virtual XalanDocument* |
| getSourceDocument(const XalanDOMString& theURI) const = 0; |
| |
| virtual void |
| setSourceDocument( |
| const XalanDOMString& theURI, |
| XalanDocument* theDocument) = 0; |
| |
| |
| virtual const XalanDecimalFormatSymbols* |
| getDecimalFormatSymbols(const XalanQName& qname) = 0; |
| |
| // These interfaces are inherited from ExecutionContext... |
| |
| virtual void |
| error( |
| const XalanDOMString& msg, |
| const XalanNode* sourceNode = 0, |
| const XalanNode* styleNode = 0) const = 0; |
| |
| virtual void |
| error( |
| const XalanDOMString& msg, |
| const XalanNode* sourceNode, |
| const Locator* locator) const = 0; |
| |
| virtual void |
| error( |
| const char* msg, |
| const XalanNode* sourceNode = 0, |
| const XalanNode* styleNode = 0) const = 0; |
| |
| virtual void |
| error( |
| const char* msg, |
| const XalanNode* sourceNode, |
| const Locator* locator) const = 0; |
| |
| virtual void |
| warn( |
| const XalanDOMString& msg, |
| const XalanNode* sourceNode = 0, |
| const XalanNode* styleNode = 0) const = 0; |
| |
| virtual void |
| warn( |
| const XalanDOMString& msg, |
| const XalanNode* sourceNode, |
| const Locator* locator) const = 0; |
| |
| virtual void |
| warn( |
| const char* msg, |
| const XalanNode* sourceNode = 0, |
| const XalanNode* styleNode = 0) const = 0; |
| |
| virtual void |
| warn( |
| const char* msg, |
| const XalanNode* sourceNode, |
| const Locator* locator) const = 0; |
| |
| virtual void |
| message( |
| const XalanDOMString& msg, |
| const XalanNode* sourceNode = 0, |
| const XalanNode* styleNode = 0) const = 0; |
| |
| virtual void |
| message( |
| const XalanDOMString& msg, |
| const XalanNode* sourceNode, |
| const Locator* locator) const = 0; |
| |
| virtual void |
| message( |
| const char* msg, |
| const XalanNode* sourceNode = 0, |
| const XalanNode* styleNode = 0) const = 0; |
| |
| virtual void |
| message( |
| const char* msg, |
| const XalanNode* sourceNode, |
| const Locator* locator) const = 0; |
| }; |
| |
| |
| |
| #endif // STYLESHEETEXECUTIONCONTEXT_HEADER_GUARD_1357924680 |