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
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
/*
* XSEC
*
* XSECNameSpaceHolder := Container class for holding and managing the name space stack
* Used when running through a DOM document
*
* $Id$
*
*/
#ifndef XSECNAMESPACEEXPANDER_HEADER
#define XSECNAMESPACEEXPANDER_HEADER
// XSEC Includes
#include <xsec/framework/XSECDefs.hpp>
#include <xsec/utils/XSECSafeBuffer.hpp>
#include <xsec/utils/XSECSafeBufferFormatter.hpp>
// Xerces Includes
XSEC_DECLARE_XERCES_CLASS(DOMDocument);
XSEC_DECLARE_XERCES_CLASS(DOMNode);
XSEC_DECLARE_XERCES_CLASS(DOMElement);
#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 {
#if defined(XALAN_NO_NAMESPACES)
typedef vector<XSECNameSpaceEntry *> NameSpaceEntryListVectorType;
#else
typedef std::vector<XSECNameSpaceEntry *> NameSpaceEntryListVectorType;
#endif
public:
/** @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
void recurse(XERCES_CPP_NAMESPACE_QUALIFIER DOMElement *n);
// data
NameSpaceEntryListVectorType m_lst; // List of added name spaces
XERCES_CPP_NAMESPACE_QUALIFIER DOMDocument
* mp_doc; // The owner document
XERCES_CPP_NAMESPACE_QUALIFIER DOMElement
* mp_fragment; // If we are doing a fragment
bool m_expanded; // Have we expanded already?
XSECSafeBufferFormatter * mp_formatter;
};
#endif /* XSECNAMESPACEEXPANDER_HEADER */