OW_XMLNode.cpp

Go to the documentation of this file.
00001 /*******************************************************************************
00002 * Copyright (C) 2004 Vintela, Inc. All rights reserved.
00003 *
00004 * Redistribution and use in source and binary forms, with or without
00005 * modification, are permitted provided that the following conditions are met:
00006 *
00007 *  - Redistributions of source code must retain the above copyright notice,
00008 *    this list of conditions and the following disclaimer.
00009 *
00010 *  - Redistributions in binary form must reproduce the above copyright notice,
00011 *    this list of conditions and the following disclaimer in the documentation
00012 *    and/or other materials provided with the distribution.
00013 *
00014 *  - Neither the name of Vintela, Inc. nor the names of its
00015 *    contributors may be used to endorse or promote products derived from this
00016 *    software without specific prior written permission.
00017 *
00018 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS''
00019 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
00020 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
00021 * ARE DISCLAIMED. IN NO EVENT SHALL Vintela, Inc. OR THE CONTRIBUTORS
00022 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
00023 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
00024 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
00025 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
00026 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
00027 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
00028 * POSSIBILITY OF SUCH DAMAGE.
00029 *******************************************************************************/
00030 
00037 #include "OW_config.h"
00038 #include "OW_XMLNode.hpp"
00039 #include "OW_XMLAttribute.hpp"
00040 #include "OW_CIMException.hpp"
00041 #include "OW_Format.hpp"
00042 #include "OW_StringStream.hpp"
00043 #include "OW_XMLEscape.hpp"
00044 
00045 #ifdef OW_HAVE_OSTREAM
00046 #include <ostream>
00047 #else
00048 #include <iostream>
00049 #endif
00050 
00051 namespace OW_NAMESPACE
00052 {
00053 
00055 XMLNodeImpl::XMLNodeImpl(const String& name,
00056    const XMLAttributeArray& attrArray) :
00057    m_nextNode(NULL), m_childNode(NULL), m_lastChildNode(NULL),
00058    m_XMLAttributeArray(attrArray), m_strName(name), m_strText()
00059 {
00060 }
00061 
00063 XMLNodeImpl::XMLNodeImpl(const String& name) :
00064    m_nextNode(NULL), m_childNode(NULL), m_lastChildNode(NULL),
00065    m_XMLAttributeArray(), m_strName(name), m_strText()
00066 {
00067 }
00068 
00070 XMLNodeImpl::XMLNodeImpl() :
00071    m_nextNode(NULL), m_childNode(NULL), m_lastChildNode(NULL),
00072    m_XMLAttributeArray(), m_strName(), m_strText()
00073 {
00074 }
00075 
00077 void
00078 XMLNodeImpl::assignText(const String& text)
00079 {
00080    m_strText = text;
00081 }
00082 
00084 void
00085 XMLNodeImpl::appendText(const String& text)
00086 {
00087    m_strText += text;
00088 }
00089 
00091 String
00092 XMLNodeImpl::getAttribute(const String& name, bool throwException) const
00093 {
00094    int arraySize = m_XMLAttributeArray.size();
00095 
00096    for (int i = 0; i < arraySize; i++)
00097    {
00098       XMLAttribute attr = m_XMLAttributeArray[i];
00099 
00100       // Should this be case insensentive? NO
00101       if (attr.getName().equals(name))
00102       {
00103          return attr.getValue();
00104       }
00105    }
00106    if (throwException)
00107    {
00108       OW_THROWCIMMSG(CIMException::INVALID_PARAMETER,
00109             Format("Failed to find "
00110                "attribute: %1 in node: %2", name, m_strName).c_str() );
00111    }
00112 
00113    return String();
00114 }
00115 
00117 void
00118 XMLNodeImpl::addAttribute(const XMLAttribute & attribute)
00119 {
00120    m_XMLAttributeArray.push_back(attribute);
00121 }
00122 
00124 XMLAttributeArray
00125 XMLNodeImpl::getAttrs() const
00126 {
00127    return m_XMLAttributeArray;
00128 }
00129 
00131 String
00132 XMLNodeImpl::getText() const
00133 {
00134    return m_strText;
00135 }
00136 
00138 String 
00139 XMLNodeImpl::getName() const
00140 {
00141    return m_strName;
00142 }
00143 
00145 XMLNodeImplRef
00146 XMLNodeImpl::findElement(const char* elementName, bool throwException) const
00147 {
00148    XMLNodeImplRef tmpRef(new XMLNodeImpl(*this));
00149 
00150    for ( ;tmpRef; tmpRef = tmpRef->m_nextNode)
00151    {
00152       if (tmpRef->getName() == elementName)
00153       {
00154          return tmpRef;
00155       }
00156    }
00157    if (throwException)
00158    {
00159       OW_THROWCIMMSG(CIMException::FAILED,
00160             Format("XMLNodeImpl::findElement failed to find a matching "
00161                "elementName.  Token id = %1", elementName).c_str() );
00162    }
00163    return XMLNodeImplRef(NULL);
00164 }
00165 
00167 XMLNodeImplRef
00168 XMLNodeImpl::nextElement(const char* elementName, bool throwException) const
00169 {
00170    if (!m_nextNode)
00171    {
00172       if (throwException)
00173       {
00174          OW_THROWCIMMSG(CIMException::FAILED, Format("XMLNodeImpl::nextElement found a NULL element instead of %1", elementName).c_str());
00175       }
00176       else
00177       {
00178          return XMLNodeImplRef(0);
00179       }
00180    }
00181    if (m_nextNode->getName() == elementName)
00182    {
00183       return m_nextNode;
00184    }
00185 
00186    if (throwException)
00187    {
00188       OW_THROWCIMMSG(CIMException::FAILED,
00189             Format("XMLNodeImpl::nextElement didn't match elementName. "
00190                "Token id=%1, found tokenid=%2",
00191                elementName, m_nextNode->getName() ).c_str() );
00192    }
00193 
00194    return XMLNodeImplRef(NULL);
00195 }
00196 
00198 void
00199 XMLNodeImpl::mustElement(const char* elementName) const
00200 {
00201    if (elementName != getName())
00202    {
00203       OW_THROWCIMMSG(CIMException::FAILED,
00204             Format("XMLNodeImpl::mustElement: elementName did not match "
00205             "node. Token id=%1, found=%2", elementName, getName() ).c_str() );
00206    }
00207 }
00208 
00210 XMLNodeImplRef
00211 XMLNodeImpl::mustElementChild(const char* elementName)   const
00212 {
00213    mustElement(elementName);
00214 
00215    if (!m_childNode)
00216    {
00217       OW_THROWCIMMSG(CIMException::FAILED,
00218             Format("XMLNodeImpl::mustElementChild found a NULL child. "
00219                "Token id=%1",
00220                elementName ).c_str() );
00221    }
00222 
00223    return m_childNode;
00224 }
00225 
00227 XMLNodeImplRef
00228 XMLNodeImpl::mustChildElement(const char* elementName)   const
00229 {
00230    if (!m_childNode)
00231    {
00232       OW_THROWCIMMSG(CIMException::FAILED,
00233             Format("XMLNodeImpl::mustChildElement found a NULL child. "
00234                "Token id=%1",
00235                elementName ).c_str() );
00236    }
00237 
00238    if (m_childNode->getName() != elementName)
00239    {
00240       OW_THROWCIMMSG(CIMException::FAILED,
00241             Format("XMLNodeImpl::mustChildElement: elementName did not match "
00242             "child. "
00243             "Token id=%1, found tokenid=%2",
00244             elementName, m_childNode->getName() ).c_str() );
00245    }
00246    return m_childNode;
00247 }
00248 
00250 XMLNodeImplRef
00251 XMLNodeImpl::mustChildElementChild(const char* elementName) const
00252 {
00253    if (!m_childNode)
00254    {
00255       OW_THROWCIMMSG(CIMException::FAILED,
00256             Format("XMLNodeImpl::mustChildElementChild found a NULL child. "
00257             "Token id=%1",
00258             elementName ).c_str() );
00259    }
00260 
00261    if (m_childNode->getName() != elementName)
00262    {
00263       OW_THROWCIMMSG(CIMException::FAILED,
00264             Format("XMLNodeImpl::mustChildElementChild: elementName did "
00265             "not match child. "
00266             "Token id=%1, found tokenid=%2",
00267             elementName, m_childNode->getName() ).c_str() );
00268    }
00269 
00270    if (!m_childNode->m_childNode)
00271    {
00272       OW_THROWCIMMSG(CIMException::FAILED,
00273             Format("XMLNodeImpl::mustChildElementChild found a NULL child "
00274             "of child Node. "
00275             "Token id=%1, found tokenid=%2",
00276             elementName, m_childNode->getName() ).c_str() );
00277    }
00278 
00279    return(m_childNode->m_childNode);
00280 }
00281 
00283 XMLNodeImplRef
00284 XMLNodeImpl::mustChildFindElement(const char* elementName) const
00285 {
00286    if (!m_childNode)
00287    {
00288       OW_THROWCIMMSG(CIMException::FAILED,
00289             Format("XMLNodeImpl::mustChildElementChild found a NULL child. "
00290             "Token id=%1",
00291             elementName ).c_str() );
00292    }
00293 
00294    return(m_childNode->findElement(elementName, true));
00295 }
00296 
00298 XMLNodeImplRef
00299 XMLNodeImpl::findElementChild(const char* elementName, bool throwException)   const
00300 {
00301    XMLNodeImplRef tmpRef = findElement(elementName, throwException);
00302 
00303    if (!tmpRef)
00304    {
00305       return tmpRef;
00306    }
00307    else
00308    {
00309       return tmpRef->m_childNode;
00310    }
00311 }
00312 
00314 XMLNodeImplRef
00315 XMLNodeImpl::mustChildFindElementChild(const char* elementName)   const
00316 {
00317    return m_childNode->findElementChild(elementName, true);
00318 }
00319 
00321 void
00322 XMLNodeImpl::setNext(const XMLNodeImplRef& node)
00323 {
00324    m_nextNode = node;
00325 }
00326 
00328 XMLNodeImplRef
00329 XMLNodeImpl::getNext() const
00330 {
00331    return m_nextNode;
00332 }
00333 
00335 void
00336 XMLNodeImpl::addChild(const XMLNodeImplRef& node)
00337 {
00338    if (!m_childNode)
00339    {
00340       m_childNode=node;
00341       m_lastChildNode=node;
00342    }
00343    else
00344    {
00345       m_lastChildNode->m_nextNode=node;
00346       m_lastChildNode=node;
00347    }
00348 }
00349 
00351 XMLNodeImplRef
00352 XMLNodeImpl::mustGetChild() const
00353 {
00354    if (!m_childNode)
00355    {
00356       OW_THROWCIMMSG(CIMException::FAILED,
00357             "XMLNodeImpl::mustGetChild found a NULL child");
00358    }
00359 
00360    return m_childNode;
00361 }
00362 
00364 XMLNodeImplRef
00365 XMLNodeImpl::getChild() const
00366 {
00367    return m_childNode;
00368 }
00369 
00371 XMLNodeArray
00372 XMLNodeImpl::getChildren() const
00373 {
00374    XMLNodeArray ar;
00375    if ( !m_childNode )
00376    {
00377       return ar;
00378    }
00379    XMLNodeImplRef r = m_childNode;
00380    do
00381    {
00382       ar.push_back(r);
00383       r = r->m_nextNode;
00384    } while ( r );
00385 
00386    return ar;
00387 }
00388 
00390 void
00391 XMLNodeImpl::printNode( std::ostream& ostr ) const
00392 {
00393    String name = getName();
00394    XMLAttributeArray aa = getAttrs();
00395 
00396    ostr << '<' << name;
00397    for ( XMLAttributeArray::const_iterator aiter = aa.begin();
00398          aiter != aa.end(); ++aiter )
00399    {
00400       ostr << ' ' << aiter->getName() << "=\"" << XMLEscape(aiter->getValue()) << '"';
00401    }
00402 
00403    if (getText().empty() && !getChild())
00404    {
00405       ostr << "/>";
00406    }
00407    else
00408    {
00409       ostr << '>';
00410       ostr << XMLEscape(getText());
00411       XMLNode curChild = getChild();
00412       while (curChild)
00413       {
00414          curChild.printNode(ostr);
00415          curChild = curChild.getNext();
00416       }
00417       ostr << "</" << name << '>';
00418    }
00419 }
00420 
00422 String
00423 XMLNodeImpl::toString() const
00424 {
00425    OStringStream ss;
00426    printNode( ss );
00427    return ss.releaseString();
00428 }
00429 
00430 
00431 //*************************************************************************
00432 // XMLNode Implementation
00433 //*************************************************************************
00434 
00436 XMLNode::XMLNode(const XMLNode& arg) :
00437    m_impl(arg.m_impl)
00438 {
00439 }
00440 
00442 XMLNode::XMLNode(const String& name, const XMLAttributeArray& attrArray)
00443    : m_impl(new XMLNodeImpl(name, attrArray))
00444 {
00445 }
00446 
00448 XMLNode::XMLNode(const XMLNodeImplRef& ref) : m_impl(ref)
00449 {
00450 }
00451 
00453 XMLNode::XMLNode(const String& name) : m_impl(new XMLNodeImpl(name))
00454 {
00455 }
00456 
00457 
00459 XMLNode::XMLNode() : m_impl(NULL)
00460 {
00461 }
00462 
00464 // Put here to avoid dtor inline
00465 XMLNode::~XMLNode()
00466 {
00467 }
00468 
00470 XMLNode&
00471 XMLNode::operator= (const XMLNode & arg)
00472 {
00473    m_impl = arg.m_impl;
00474    return *this;
00475 }
00476 
00478 void
00479 XMLNode::setToNULL()
00480 {
00481    XMLNodeImplRef tmpRef(NULL);
00482    m_impl = tmpRef;
00483 }
00484 
00486 void
00487 XMLNode::assignText(const String& text) const
00488 {
00489    m_impl->assignText(text);
00490 }
00491 
00493 void
00494 XMLNode::appendText(const String& text) const
00495 {
00496    m_impl->appendText(text);
00497 }
00498 
00500 void
00501 XMLNode::addAttribute(const XMLAttribute& attribute) const
00502 {
00503    return m_impl->addAttribute(attribute);
00504 }
00505 
00507 String
00508 XMLNode::getAttribute(const String& name) const
00509 {
00510    return m_impl->getAttribute(name);
00511 }
00512 
00514 String
00515 XMLNode::mustGetAttribute(const String& name) const 
00516 {
00517    return m_impl->getAttribute(name, true);
00518 }
00519 
00521 XMLAttributeArray
00522 XMLNode::getAttrs() const
00523 {
00524    return m_impl->getAttrs();
00525 }
00526 
00528 String
00529 XMLNode::getText() const
00530 {
00531    return m_impl->getText();
00532 }
00533 
00535 String
00536 XMLNode::getName() const
00537 {
00538    return m_impl->getName();
00539 }
00540 
00542 XMLNode
00543 XMLNode::findElement(const char* elementName) const
00544 {
00545    return XMLNode(m_impl->findElement(elementName));
00546 }
00547 
00549 XMLNode
00550 XMLNode::mustFindElement(const char* elementName) const  
00551 {
00552    return XMLNode(m_impl->findElement(elementName, true));
00553 }
00554 
00556 XMLNode
00557 XMLNode::nextElement(const char* elementName)
00558 {
00559    return XMLNode(m_impl->nextElement(elementName));
00560 }
00561 
00563 XMLNode
00564 XMLNode::mustNextElement(const char* elementName) const 
00565 {
00566    return XMLNode(m_impl->nextElement(elementName, true));
00567 }
00568 
00570 void
00571 XMLNode::mustElement(const char* elementName) const   
00572 {
00573    m_impl->mustElement(elementName);
00574 }
00575 
00577 XMLNode
00578 XMLNode::mustElementChild(const char* elementName) const 
00579 {
00580    return XMLNode(m_impl->mustElementChild(elementName));
00581 }
00582 
00584 XMLNode
00585 XMLNode::mustChildElement(const char* elementName) const 
00586 {
00587    return XMLNode(m_impl->mustChildElement(elementName));
00588 }
00589 
00591 XMLNode
00592 XMLNode::mustChildElementChild(const char* elementName) const 
00593 {
00594    return XMLNode(m_impl->mustChildElementChild(elementName));
00595 }
00596 
00598 XMLNode
00599 XMLNode::mustChildFindElement(const char* elementName) const   
00600 {
00601    return XMLNode(m_impl->mustChildFindElement(elementName));
00602 }
00603 
00605 XMLNode
00606 XMLNode::findElementChild(const char* elementName) const
00607 {
00608    return XMLNode(m_impl->findElementChild(elementName));
00609 }
00610 
00612 XMLNode
00613 XMLNode::mustFindElementChild(const char* elementName) const   
00614 {
00615    return XMLNode(m_impl->findElementChild(elementName, true));
00616 }
00617 
00619 XMLNode
00620 XMLNode::mustChildFindElementChild(const char* elementName) const 
00621 {
00622    return XMLNode(m_impl->mustChildFindElementChild(elementName));
00623 }
00624 
00626 void
00627 XMLNode::setNext(const XMLNode& node) const
00628 {
00629    m_impl->setNext(node.m_impl);
00630 }
00631 
00633 XMLNode
00634 XMLNode::getNext() const
00635 {
00636    return XMLNode(m_impl->getNext());
00637 }
00638 
00640 void
00641 XMLNode::addChild(const XMLNode& node) const
00642 {
00643    m_impl->addChild(node.m_impl);
00644 }
00645 
00647 XMLNode
00648 XMLNode::mustGetChild() const
00649 {
00650    return XMLNode(m_impl->mustGetChild());
00651 }
00652 
00654 XMLNode
00655 XMLNode::getChild() const
00656 {
00657    return XMLNode(m_impl->getChild());
00658 }
00659 
00661 XMLNodeArray
00662 XMLNode::getChildren() const
00663 {
00664    return m_impl->getChildren();
00665 }
00666 
00668 void
00669 XMLNode::printNode( std::ostream& ostr ) const 
00670 {
00671    m_impl->printNode( ostr );
00672 }
00673 
00675 String
00676 XMLNode::toString() const
00677 {
00678    return m_impl->toString();
00679 }
00680 
00681 
00683 std::ostream& operator<<(std::ostream& ostr, const XMLNode& node)
00684 {
00685    node.printNode(ostr);
00686    return ostr;
00687 }
00688 
00689 
00690 } // end namespace OW_NAMESPACE
00691 

Generated on Thu Feb 9 08:48:19 2006 for openwbem by  doxygen 1.4.6