Blame src/cppunit/XmlElement.cpp

Packit 8c9aa0
#include <cppunit/tools/StringTools.h>
Packit 8c9aa0
#include <cppunit/tools/XmlElement.h>
Packit 8c9aa0
#include <stdexcept>
Packit 8c9aa0
Packit 8c9aa0
Packit 8c9aa0
CPPUNIT_NS_BEGIN
Packit 8c9aa0
Packit 8c9aa0
  
Packit 8c9aa0
XmlElement::XmlElement( std::string elementName,
Packit 8c9aa0
                        std::string content ) 
Packit 8c9aa0
  : m_name( elementName )
Packit 8c9aa0
  , m_content( content )
Packit 8c9aa0
  , m_attributes()
Packit 8c9aa0
  , m_elements()
Packit 8c9aa0
{
Packit 8c9aa0
}
Packit 8c9aa0
Packit 8c9aa0
    
Packit 8c9aa0
XmlElement::XmlElement( std::string elementName,
Packit 8c9aa0
                        int numericContent )
Packit 8c9aa0
  : m_name( elementName )
Packit 8c9aa0
  , m_content()
Packit 8c9aa0
  , m_attributes()
Packit 8c9aa0
  , m_elements()
Packit 8c9aa0
{
Packit 8c9aa0
  setContent( numericContent );
Packit 8c9aa0
}
Packit 8c9aa0
Packit 8c9aa0
Packit 8c9aa0
XmlElement::~XmlElement()
Packit 8c9aa0
{
Packit 8c9aa0
  Elements::iterator itNode = m_elements.begin();
Packit 8c9aa0
  while ( itNode != m_elements.end() )
Packit 8c9aa0
  {
Packit 8c9aa0
    XmlElement *element = *itNode++;
Packit 8c9aa0
    delete element;
Packit 8c9aa0
  }
Packit 8c9aa0
}
Packit 8c9aa0
Packit 8c9aa0
Packit 8c9aa0
std::string 
Packit 8c9aa0
XmlElement::name() const
Packit 8c9aa0
{
Packit 8c9aa0
  return m_name;
Packit 8c9aa0
}
Packit 8c9aa0
Packit 8c9aa0
Packit 8c9aa0
std::string 
Packit 8c9aa0
XmlElement::content() const
Packit 8c9aa0
{
Packit 8c9aa0
  return m_content;
Packit 8c9aa0
}
Packit 8c9aa0
Packit 8c9aa0
Packit 8c9aa0
void 
Packit 8c9aa0
XmlElement::setName( const std::string &name )
Packit 8c9aa0
{
Packit 8c9aa0
  m_name = name;
Packit 8c9aa0
}
Packit 8c9aa0
Packit 8c9aa0
Packit 8c9aa0
void 
Packit 8c9aa0
XmlElement::setContent( const std::string &content )
Packit 8c9aa0
{
Packit 8c9aa0
  m_content = content;
Packit 8c9aa0
}
Packit 8c9aa0
Packit 8c9aa0
Packit 8c9aa0
void 
Packit 8c9aa0
XmlElement::setContent( int numericContent )
Packit 8c9aa0
{
Packit 8c9aa0
  m_content = StringTools::toString( numericContent );
Packit 8c9aa0
}
Packit 8c9aa0
Packit 8c9aa0
Packit 8c9aa0
void 
Packit 8c9aa0
XmlElement::addAttribute( std::string attributeName,
Packit 8c9aa0
                          std::string value  )
Packit 8c9aa0
{
Packit 8c9aa0
  m_attributes.push_back( Attribute( attributeName, value ) );
Packit 8c9aa0
}
Packit 8c9aa0
Packit 8c9aa0
Packit 8c9aa0
void 
Packit 8c9aa0
XmlElement::addAttribute( std::string attributeName,
Packit 8c9aa0
                          int numericValue )
Packit 8c9aa0
{
Packit 8c9aa0
  addAttribute( attributeName, StringTools::toString( numericValue ) );
Packit 8c9aa0
}
Packit 8c9aa0
Packit 8c9aa0
Packit 8c9aa0
void 
Packit 8c9aa0
XmlElement::addElement( XmlElement *node )
Packit 8c9aa0
{
Packit 8c9aa0
  m_elements.push_back( node );
Packit 8c9aa0
}
Packit 8c9aa0
Packit 8c9aa0
Packit 8c9aa0
int 
Packit 8c9aa0
XmlElement::elementCount() const
Packit 8c9aa0
{
Packit 8c9aa0
  return m_elements.size();
Packit 8c9aa0
}
Packit 8c9aa0
Packit 8c9aa0
Packit 8c9aa0
XmlElement *
Packit 8c9aa0
XmlElement::elementAt( int index ) const
Packit 8c9aa0
{
Packit 8c9aa0
  if ( index < 0  ||  index >= elementCount() )
Packit 8c9aa0
    throw std::invalid_argument( "XmlElement::elementAt(), out of range index" );
Packit 8c9aa0
Packit 8c9aa0
  return m_elements[ index ];
Packit 8c9aa0
}
Packit 8c9aa0
Packit 8c9aa0
Packit 8c9aa0
XmlElement *
Packit 8c9aa0
XmlElement::elementFor( const std::string &name ) const
Packit 8c9aa0
{
Packit 8c9aa0
  Elements::const_iterator itElement = m_elements.begin();
Packit 8c9aa0
  for ( ; itElement != m_elements.end(); ++itElement )
Packit 8c9aa0
  {
Packit 8c9aa0
    if ( (*itElement)->name() == name )
Packit 8c9aa0
      return *itElement;
Packit 8c9aa0
  }
Packit 8c9aa0
Packit 8c9aa0
  throw std::invalid_argument( "XmlElement::elementFor(), not matching child element found" );
Packit 8c9aa0
  return NULL;  // make some compilers happy.
Packit 8c9aa0
}
Packit 8c9aa0
Packit 8c9aa0
Packit 8c9aa0
std::string 
Packit 8c9aa0
XmlElement::toString( const std::string &indent ) const
Packit 8c9aa0
{
Packit 8c9aa0
  std::string element( indent );
Packit 8c9aa0
  element += "<";
Packit 8c9aa0
  element += m_name;
Packit 8c9aa0
  if ( !m_attributes.empty() )
Packit 8c9aa0
  {
Packit 8c9aa0
    element += " ";
Packit 8c9aa0
    element += attributesAsString();
Packit 8c9aa0
  }
Packit 8c9aa0
  element += ">";
Packit 8c9aa0
Packit 8c9aa0
  if ( !m_elements.empty() )
Packit 8c9aa0
  {
Packit 8c9aa0
    element += "\n";
Packit 8c9aa0
Packit 8c9aa0
    std::string subNodeIndent( indent + "  " );
Packit 8c9aa0
    Elements::const_iterator itNode = m_elements.begin();
Packit 8c9aa0
    while ( itNode != m_elements.end() )
Packit 8c9aa0
    {
Packit 8c9aa0
      const XmlElement *node = *itNode++;
Packit 8c9aa0
      element += node->toString( subNodeIndent );
Packit 8c9aa0
    }
Packit 8c9aa0
Packit 8c9aa0
    element += indent;
Packit 8c9aa0
  }
Packit 8c9aa0
Packit 8c9aa0
  if ( !m_content.empty() )
Packit 8c9aa0
  {
Packit 8c9aa0
    element += escape( m_content );
Packit 8c9aa0
    if ( !m_elements.empty() )
Packit 8c9aa0
    {
Packit 8c9aa0
      element += "\n";
Packit 8c9aa0
      element += indent;
Packit 8c9aa0
    }
Packit 8c9aa0
  }
Packit 8c9aa0
Packit 8c9aa0
  element += "</";
Packit 8c9aa0
  element += m_name;
Packit 8c9aa0
  element += ">\n";
Packit 8c9aa0
Packit 8c9aa0
  return element;
Packit 8c9aa0
}
Packit 8c9aa0
Packit 8c9aa0
Packit 8c9aa0
std::string 
Packit 8c9aa0
XmlElement::attributesAsString() const
Packit 8c9aa0
{
Packit 8c9aa0
  std::string attributes;
Packit 8c9aa0
  Attributes::const_iterator itAttribute = m_attributes.begin();
Packit 8c9aa0
  while ( itAttribute != m_attributes.end() )
Packit 8c9aa0
  {
Packit 8c9aa0
    if ( !attributes.empty() )
Packit 8c9aa0
       attributes += " ";
Packit 8c9aa0
Packit 8c9aa0
    const Attribute &attribute = *itAttribute++;
Packit 8c9aa0
    attributes += attribute.first;
Packit 8c9aa0
    attributes += "=\"";
Packit 8c9aa0
    attributes += escape( attribute.second );
Packit 8c9aa0
    attributes += "\"";
Packit 8c9aa0
  }
Packit 8c9aa0
  return attributes;
Packit 8c9aa0
}
Packit 8c9aa0
Packit 8c9aa0
Packit 8c9aa0
std::string 
Packit 8c9aa0
XmlElement::escape( std::string value ) const
Packit 8c9aa0
{
Packit 8c9aa0
  std::string escaped;
Packit 8c9aa0
  for ( unsigned int index =0; index < value.length(); ++index )
Packit 8c9aa0
  {
Packit 8c9aa0
    char c = value[index ];
Packit 8c9aa0
    switch ( c )    // escape all predefined XML entity (safe?)
Packit 8c9aa0
    {
Packit 8c9aa0
    case '<': 
Packit 8c9aa0
      escaped += "<";
Packit 8c9aa0
      break;
Packit 8c9aa0
    case '>': 
Packit 8c9aa0
      escaped += ">";
Packit 8c9aa0
      break;
Packit 8c9aa0
    case '&': 
Packit 8c9aa0
      escaped += "&";
Packit 8c9aa0
      break;
Packit 8c9aa0
    case '\'': 
Packit 8c9aa0
      escaped += "'";
Packit 8c9aa0
      break;
Packit 8c9aa0
    case '"': 
Packit 8c9aa0
      escaped += """;
Packit 8c9aa0
      break;
Packit 8c9aa0
    default:
Packit 8c9aa0
      escaped += c;
Packit 8c9aa0
    }
Packit 8c9aa0
  }
Packit 8c9aa0
  
Packit 8c9aa0
  return escaped;
Packit 8c9aa0
}
Packit 8c9aa0
Packit 8c9aa0
Packit 8c9aa0
CPPUNIT_NS_END
Packit 8c9aa0