blob: 21bca16e2700606bb158fc09cbb7d088508c8952 [file] [log] [blame]
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
* XSECNameSpaceHolder := Container class for holding and managing the name space stack
* Used when running through a DOM document
* $Id$
// XSEC Includes
#include <xsec/framework/XSECDefs.hpp>
#include <xsec/utils/XSECSafeBuffer.hpp>
#include <xsec/utils/XSECSafeBufferFormatter.hpp>
// Xerces Includes
#include <vector>
// --------------------------------------------------------------------------------
// Structure Definition for the nodes within the list of nodes
// --------------------------------------------------------------------------------
struct XSECNameSpaceEntry {
// Variables
safeBuffer m_name; // The name for this name space
XERCES_CPP_NAMESPACE_QUALIFIER DOMElement * mp_node; // The Element Node owner
XERCES_CPP_NAMESPACE_QUALIFIER DOMNode * mp_att; // The added attribute node
// --------------------------------------------------------------------------------
// Class definition for the list
// --------------------------------------------------------------------------------
* @ingroup pubsig
* @brief Class to "expand" name spaces
* For most things, a DOM model interoperates well with XPath. Unfortunately,
* name-spaces are the one main problem. In particular, the XPath spec
* states that every element node has an attribute node for its own
* namespaces, and one for namespaces above that are in scope.
* In the DOM scheme of things, a namespace is only available in the node in
* which it is defined. Normally this is not a problem, you can just just
* refer backwards until you find the namespace you need. However, for XPath
* expressions that select namespace nodes, we need to actually promulgate
* the name-spaces down to every node where they are visible so that the XPath
* selection will work properly.
* This is important for Canonicalisation of the found nodes, but we cannot
* do this only in the canonicaliser as it does not internally understand how
* to do DSIG style XPath. So the XPath is done externally, and the
* resultant node set (including any selected "Expanded" attribute nodes).
* are passed in.
* The expander therefore handles the propogation of the namespace nodes, and
* removes the propogated nodes when it goes out of scope (or when
* deleteAddedNamespaces() is called).
class XSEC_EXPORT XSECNameSpaceExpander {
typedef vector<XSECNameSpaceEntry *> NameSpaceEntryListVectorType;
typedef std::vector<XSECNameSpaceEntry *> NameSpaceEntryListVectorType;
/** @name Constructors and Destructors */
* \brief Main constructure
* Use this constructor to expand namespaces through an entire document.
* @param d The DOM document to be expanded.
XSECNameSpaceExpander(XERCES_CPP_NAMESPACE_QUALIFIER DOMDocument *d); // Constructor
* \brief Fragment constructor
* Use this constructor to expand namespaces in a given fragment only.
* @note The fragment does not need to be rooted in an actual document.
* @param f The starting element of the fragment to be expanded.
XSECNameSpaceExpander(XERCES_CPP_NAMESPACE_QUALIFIER DOMElement *f); // frag Constructor
~XSECNameSpaceExpander(); // Default destructor
// Operate
* \brief Expand namespaces.
* Perform the expansion operation and create a list of all added nodes.
void expandNameSpaces();
* \brief Collapse name-spaces
* Delete all namespaces added in exandNameSpaces() (using the list that
* was created at that time
void deleteAddedNamespaces();
// Check if a node is an added node
bool nodeWasAdded(XERCES_CPP_NAMESPACE_QUALIFIER DOMNode *n) const;
private: // Functions
XSECNameSpaceExpander(); // No default constructor
// data
NameSpaceEntryListVectorType m_lst; // List of added name spaces
* mp_doc; // The owner document
* mp_fragment; // If we are doing a fragment
bool m_expanded; // Have we expanded already?
XSECSafeBufferFormatter * mp_formatter;