1b76c9d6de717a9a1cfd94e7a8eca7ee4a2035cd7David Wagner/*
29368eea42a1afb01dd44110582f997115b50e742François Gaffie * Copyright (c) 2011-2015, Intel Corporation
3b76c9d6de717a9a1cfd94e7a8eca7ee4a2035cd7David Wagner * All rights reserved.
4b76c9d6de717a9a1cfd94e7a8eca7ee4a2035cd7David Wagner *
5b76c9d6de717a9a1cfd94e7a8eca7ee4a2035cd7David Wagner * Redistribution and use in source and binary forms, with or without modification,
6b76c9d6de717a9a1cfd94e7a8eca7ee4a2035cd7David Wagner * are permitted provided that the following conditions are met:
7b76c9d6de717a9a1cfd94e7a8eca7ee4a2035cd7David Wagner *
8b76c9d6de717a9a1cfd94e7a8eca7ee4a2035cd7David Wagner * 1. Redistributions of source code must retain the above copyright notice, this
9b76c9d6de717a9a1cfd94e7a8eca7ee4a2035cd7David Wagner * list of conditions and the following disclaimer.
10b76c9d6de717a9a1cfd94e7a8eca7ee4a2035cd7David Wagner *
11b76c9d6de717a9a1cfd94e7a8eca7ee4a2035cd7David Wagner * 2. Redistributions in binary form must reproduce the above copyright notice,
12b76c9d6de717a9a1cfd94e7a8eca7ee4a2035cd7David Wagner * this list of conditions and the following disclaimer in the documentation and/or
13b76c9d6de717a9a1cfd94e7a8eca7ee4a2035cd7David Wagner * other materials provided with the distribution.
14b76c9d6de717a9a1cfd94e7a8eca7ee4a2035cd7David Wagner *
15b76c9d6de717a9a1cfd94e7a8eca7ee4a2035cd7David Wagner * 3. Neither the name of the copyright holder nor the names of its contributors
16b76c9d6de717a9a1cfd94e7a8eca7ee4a2035cd7David Wagner * may be used to endorse or promote products derived from this software without
17b76c9d6de717a9a1cfd94e7a8eca7ee4a2035cd7David Wagner * specific prior written permission.
18b76c9d6de717a9a1cfd94e7a8eca7ee4a2035cd7David Wagner *
19b76c9d6de717a9a1cfd94e7a8eca7ee4a2035cd7David Wagner * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
20b76c9d6de717a9a1cfd94e7a8eca7ee4a2035cd7David Wagner * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
21b76c9d6de717a9a1cfd94e7a8eca7ee4a2035cd7David Wagner * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
22b76c9d6de717a9a1cfd94e7a8eca7ee4a2035cd7David Wagner * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
23b76c9d6de717a9a1cfd94e7a8eca7ee4a2035cd7David Wagner * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
24b76c9d6de717a9a1cfd94e7a8eca7ee4a2035cd7David Wagner * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
25b76c9d6de717a9a1cfd94e7a8eca7ee4a2035cd7David Wagner * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
26b76c9d6de717a9a1cfd94e7a8eca7ee4a2035cd7David Wagner * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
27b76c9d6de717a9a1cfd94e7a8eca7ee4a2035cd7David Wagner * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
28b76c9d6de717a9a1cfd94e7a8eca7ee4a2035cd7David Wagner * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
2968a912857707864bbaaff9808717813105072a6ePatrick Benavoli */
3068a912857707864bbaaff9808717813105072a6ePatrick Benavoli#include "Element.h"
317f26582e6a732524231af95aefab829c9f0b92d2Kevin Rocard#include "XmlElementSerializingContext.h"
327f26582e6a732524231af95aefab829c9f0b92d2Kevin Rocard#include "ElementLibrary.h"
339368eea42a1afb01dd44110582f997115b50e742François Gaffie#include "ErrorContext.hpp"
349368eea42a1afb01dd44110582f997115b50e742François Gaffie#include <algorithm>
3568a912857707864bbaaff9808717813105072a6ePatrick Benavoli#include <assert.h>
3668a912857707864bbaaff9808717813105072a6ePatrick Benavoli#include <stdio.h>
3768a912857707864bbaaff9808717813105072a6ePatrick Benavoli#include <stdarg.h>
382aab8716b2302c196349326a228e82b881d5fde3Guillaume Denneulin#include <stdlib.h>
3968a912857707864bbaaff9808717813105072a6ePatrick Benavoli
40d9526499d6ab53b7d13d1434f748f6f2161c2e0aSebastien Gonzalveusing std::string;
41d9526499d6ab53b7d13d1434f748f6f2161c2e0aSebastien Gonzalve
42a9be2d378b7ad84e679a48efa81f42fb54f85d9aJean-Michel Triviconst std::string CElement::gDescriptionPropertyName = "Description";
43a9be2d378b7ad84e679a48efa81f42fb54f85d9aJean-Michel Trivi
449368eea42a1afb01dd44110582f997115b50e742François GaffieCElement::CElement(const string &strName) : _strName(strName)
4568a912857707864bbaaff9808717813105072a6ePatrick Benavoli{
4668a912857707864bbaaff9808717813105072a6ePatrick Benavoli}
4768a912857707864bbaaff9808717813105072a6ePatrick Benavoli
4868a912857707864bbaaff9808717813105072a6ePatrick BenavoliCElement::~CElement()
4968a912857707864bbaaff9808717813105072a6ePatrick Benavoli{
5068a912857707864bbaaff9808717813105072a6ePatrick Benavoli    removeChildren();
5168a912857707864bbaaff9808717813105072a6ePatrick Benavoli}
5268a912857707864bbaaff9808717813105072a6ePatrick Benavoli
539368eea42a1afb01dd44110582f997115b50e742François Gaffievoid CElement::setDescription(const string &strDescription)
5468a912857707864bbaaff9808717813105072a6ePatrick Benavoli{
5568a912857707864bbaaff9808717813105072a6ePatrick Benavoli    _strDescription = strDescription;
5668a912857707864bbaaff9808717813105072a6ePatrick Benavoli}
5768a912857707864bbaaff9808717813105072a6ePatrick Benavoli
589368eea42a1afb01dd44110582f997115b50e742François Gaffieconst string &CElement::getDescription() const
5968a912857707864bbaaff9808717813105072a6ePatrick Benavoli{
6068a912857707864bbaaff9808717813105072a6ePatrick Benavoli    return _strDescription;
6168a912857707864bbaaff9808717813105072a6ePatrick Benavoli}
6268a912857707864bbaaff9808717813105072a6ePatrick Benavoli
6368a912857707864bbaaff9808717813105072a6ePatrick Benavolibool CElement::childrenAreDynamic() const
6468a912857707864bbaaff9808717813105072a6ePatrick Benavoli{
6568a912857707864bbaaff9808717813105072a6ePatrick Benavoli    // By default, children are searched and not created during xml parsing
6668a912857707864bbaaff9808717813105072a6ePatrick Benavoli    return false;
6768a912857707864bbaaff9808717813105072a6ePatrick Benavoli}
6868a912857707864bbaaff9808717813105072a6ePatrick Benavoli
699368eea42a1afb01dd44110582f997115b50e742François Gaffiebool CElement::init(string &strError)
7068a912857707864bbaaff9808717813105072a6ePatrick Benavoli{
7168a912857707864bbaaff9808717813105072a6ePatrick Benavoli
729368eea42a1afb01dd44110582f997115b50e742François Gaffie    for (CElement *child : _childArray) {
7368a912857707864bbaaff9808717813105072a6ePatrick Benavoli
749368eea42a1afb01dd44110582f997115b50e742François Gaffie        if (!child->init(strError)) {
7568a912857707864bbaaff9808717813105072a6ePatrick Benavoli
7668a912857707864bbaaff9808717813105072a6ePatrick Benavoli            return false;
7768a912857707864bbaaff9808717813105072a6ePatrick Benavoli        }
7868a912857707864bbaaff9808717813105072a6ePatrick Benavoli    }
7968a912857707864bbaaff9808717813105072a6ePatrick Benavoli
8068a912857707864bbaaff9808717813105072a6ePatrick Benavoli    return true;
8168a912857707864bbaaff9808717813105072a6ePatrick Benavoli}
8268a912857707864bbaaff9808717813105072a6ePatrick Benavoli
839368eea42a1afb01dd44110582f997115b50e742François Gaffiestring CElement::dumpContent(utility::ErrorContext &errorContext, const size_t depth) const
8468a912857707864bbaaff9808717813105072a6ePatrick Benavoli{
859368eea42a1afb01dd44110582f997115b50e742François Gaffie    string output;
8668a912857707864bbaaff9808717813105072a6ePatrick Benavoli    string strIndent;
8768a912857707864bbaaff9808717813105072a6ePatrick Benavoli
8868a912857707864bbaaff9808717813105072a6ePatrick Benavoli    // Level
899368eea42a1afb01dd44110582f997115b50e742François Gaffie    size_t indents = depth;
9068a912857707864bbaaff9808717813105072a6ePatrick Benavoli
919368eea42a1afb01dd44110582f997115b50e742François Gaffie    while (indents--) {
9268a912857707864bbaaff9808717813105072a6ePatrick Benavoli
9368a912857707864bbaaff9808717813105072a6ePatrick Benavoli        strIndent += "    ";
9468a912857707864bbaaff9808717813105072a6ePatrick Benavoli    }
9568a912857707864bbaaff9808717813105072a6ePatrick Benavoli    // Type
969368eea42a1afb01dd44110582f997115b50e742François Gaffie    output += strIndent + "- " + getKind();
9768a912857707864bbaaff9808717813105072a6ePatrick Benavoli
9868a912857707864bbaaff9808717813105072a6ePatrick Benavoli    // Name
9968a912857707864bbaaff9808717813105072a6ePatrick Benavoli    if (!_strName.empty()) {
10068a912857707864bbaaff9808717813105072a6ePatrick Benavoli
1019368eea42a1afb01dd44110582f997115b50e742François Gaffie        output += ": " + getName();
10268a912857707864bbaaff9808717813105072a6ePatrick Benavoli    }
10368a912857707864bbaaff9808717813105072a6ePatrick Benavoli
10468a912857707864bbaaff9808717813105072a6ePatrick Benavoli    // Value
1059368eea42a1afb01dd44110582f997115b50e742François Gaffie    string strValue = logValue(errorContext);
10668a912857707864bbaaff9808717813105072a6ePatrick Benavoli
10768a912857707864bbaaff9808717813105072a6ePatrick Benavoli    if (!strValue.empty()) {
10868a912857707864bbaaff9808717813105072a6ePatrick Benavoli
1099368eea42a1afb01dd44110582f997115b50e742François Gaffie        output += " = " + strValue;
11068a912857707864bbaaff9808717813105072a6ePatrick Benavoli    }
11168a912857707864bbaaff9808717813105072a6ePatrick Benavoli
1129368eea42a1afb01dd44110582f997115b50e742François Gaffie    output += "\n";
11368a912857707864bbaaff9808717813105072a6ePatrick Benavoli
1149368eea42a1afb01dd44110582f997115b50e742François Gaffie    for (CElement *pChild : _childArray) {
11568a912857707864bbaaff9808717813105072a6ePatrick Benavoli
1169368eea42a1afb01dd44110582f997115b50e742François Gaffie        output += pChild->dumpContent(errorContext, depth + 1);
11768a912857707864bbaaff9808717813105072a6ePatrick Benavoli    }
1189368eea42a1afb01dd44110582f997115b50e742François Gaffie
1199368eea42a1afb01dd44110582f997115b50e742François Gaffie    return output;
12068a912857707864bbaaff9808717813105072a6ePatrick Benavoli}
12168a912857707864bbaaff9808717813105072a6ePatrick Benavoli
1222ecf900ad8c30ce9f8e81f57977a1a80a6f6d8afPatrick Benavoli// Element properties
1239368eea42a1afb01dd44110582f997115b50e742François Gaffievoid CElement::showProperties(string &strResult) const
1242ecf900ad8c30ce9f8e81f57977a1a80a6f6d8afPatrick Benavoli{
1252ecf900ad8c30ce9f8e81f57977a1a80a6f6d8afPatrick Benavoli    strResult += "Kind: " + getKind() + "\n";
126a9be2d378b7ad84e679a48efa81f42fb54f85d9aJean-Michel Trivi    showDescriptionProperty(strResult);
1272ecf900ad8c30ce9f8e81f57977a1a80a6f6d8afPatrick Benavoli}
1282ecf900ad8c30ce9f8e81f57977a1a80a6f6d8afPatrick Benavoli
129a9be2d378b7ad84e679a48efa81f42fb54f85d9aJean-Michel Trivivoid CElement::showDescriptionProperty(std::string &strResult) const
1302ecf900ad8c30ce9f8e81f57977a1a80a6f6d8afPatrick Benavoli{
131a9be2d378b7ad84e679a48efa81f42fb54f85d9aJean-Michel Trivi    if (!getDescription().empty()) {
132a9be2d378b7ad84e679a48efa81f42fb54f85d9aJean-Michel Trivi        strResult += gDescriptionPropertyName + ": " + getDescription() + "\n";
133a9be2d378b7ad84e679a48efa81f42fb54f85d9aJean-Michel Trivi    }
134ee65e6d992e5fd7c81f62ced1cbed532989c09f7Patrick Benavoli}
135ee65e6d992e5fd7c81f62ced1cbed532989c09f7Patrick Benavoli
1362ecf900ad8c30ce9f8e81f57977a1a80a6f6d8afPatrick Benavoli// Content dumping
1379368eea42a1afb01dd44110582f997115b50e742François Gaffiestring CElement::logValue(utility::ErrorContext & /*ctx*/) const
13868a912857707864bbaaff9808717813105072a6ePatrick Benavoli{
1399368eea42a1afb01dd44110582f997115b50e742François Gaffie    return "";
14068a912857707864bbaaff9808717813105072a6ePatrick Benavoli}
14168a912857707864bbaaff9808717813105072a6ePatrick Benavoli
14268a912857707864bbaaff9808717813105072a6ePatrick Benavoli// From IXmlSink
1439368eea42a1afb01dd44110582f997115b50e742François Gaffiebool CElement::fromXml(const CXmlElement &xmlElement, CXmlSerializingContext &serializingContext)
14468a912857707864bbaaff9808717813105072a6ePatrick Benavoli{
1459368eea42a1afb01dd44110582f997115b50e742François Gaffie    xmlElement.getAttribute(gDescriptionPropertyName, _strDescription);
146a9be2d378b7ad84e679a48efa81f42fb54f85d9aJean-Michel Trivi
14768a912857707864bbaaff9808717813105072a6ePatrick Benavoli    // Propagate through children
14868a912857707864bbaaff9808717813105072a6ePatrick Benavoli    CXmlElement::CChildIterator childIterator(xmlElement);
14968a912857707864bbaaff9808717813105072a6ePatrick Benavoli
15068a912857707864bbaaff9808717813105072a6ePatrick Benavoli    CXmlElement childElement;
15168a912857707864bbaaff9808717813105072a6ePatrick Benavoli
15268a912857707864bbaaff9808717813105072a6ePatrick Benavoli    while (childIterator.next(childElement)) {
15368a912857707864bbaaff9808717813105072a6ePatrick Benavoli
1549368eea42a1afb01dd44110582f997115b50e742François Gaffie        CElement *pChild;
15568a912857707864bbaaff9808717813105072a6ePatrick Benavoli
15668a912857707864bbaaff9808717813105072a6ePatrick Benavoli        if (!childrenAreDynamic()) {
15768a912857707864bbaaff9808717813105072a6ePatrick Benavoli
15868a912857707864bbaaff9808717813105072a6ePatrick Benavoli            pChild = findChildOfKind(childElement.getType());
15968a912857707864bbaaff9808717813105072a6ePatrick Benavoli
16068a912857707864bbaaff9808717813105072a6ePatrick Benavoli            if (!pChild) {
16168a912857707864bbaaff9808717813105072a6ePatrick Benavoli
1629368eea42a1afb01dd44110582f997115b50e742François Gaffie                serializingContext.setError("Unable to handle XML element: " +
1639368eea42a1afb01dd44110582f997115b50e742François Gaffie                                            childElement.getPath());
16468a912857707864bbaaff9808717813105072a6ePatrick Benavoli
16568a912857707864bbaaff9808717813105072a6ePatrick Benavoli                return false;
16668a912857707864bbaaff9808717813105072a6ePatrick Benavoli            }
16768a912857707864bbaaff9808717813105072a6ePatrick Benavoli
16868a912857707864bbaaff9808717813105072a6ePatrick Benavoli        } else {
16968a912857707864bbaaff9808717813105072a6ePatrick Benavoli            // Child needs creation
1703ba083ee0b0ff7e01caeb3bc7395377071e20fe6Guillaume Denneulin            pChild = createChild(childElement, serializingContext);
17168a912857707864bbaaff9808717813105072a6ePatrick Benavoli
1723ba083ee0b0ff7e01caeb3bc7395377071e20fe6Guillaume Denneulin            if (!pChild) {
17368a912857707864bbaaff9808717813105072a6ePatrick Benavoli
17468a912857707864bbaaff9808717813105072a6ePatrick Benavoli                return false;
17568a912857707864bbaaff9808717813105072a6ePatrick Benavoli            }
17668a912857707864bbaaff9808717813105072a6ePatrick Benavoli        }
17768a912857707864bbaaff9808717813105072a6ePatrick Benavoli
17868a912857707864bbaaff9808717813105072a6ePatrick Benavoli        // Dig
1799368eea42a1afb01dd44110582f997115b50e742François Gaffie        if (!pChild->fromXml(childElement, serializingContext)) {
18068a912857707864bbaaff9808717813105072a6ePatrick Benavoli
18168a912857707864bbaaff9808717813105072a6ePatrick Benavoli            return false;
18268a912857707864bbaaff9808717813105072a6ePatrick Benavoli        }
18368a912857707864bbaaff9808717813105072a6ePatrick Benavoli    }
18468a912857707864bbaaff9808717813105072a6ePatrick Benavoli
18568a912857707864bbaaff9808717813105072a6ePatrick Benavoli    return true;
18668a912857707864bbaaff9808717813105072a6ePatrick Benavoli}
18768a912857707864bbaaff9808717813105072a6ePatrick Benavoli
1889368eea42a1afb01dd44110582f997115b50e742François Gaffievoid CElement::childrenToXml(CXmlElement &xmlElement,
1899368eea42a1afb01dd44110582f997115b50e742François Gaffie                             CXmlSerializingContext &serializingContext) const
19068a912857707864bbaaff9808717813105072a6ePatrick Benavoli{
19168a912857707864bbaaff9808717813105072a6ePatrick Benavoli    // Browse children and propagate
1929368eea42a1afb01dd44110582f997115b50e742François Gaffie    for (CElement *pChild : _childArray) {
19368a912857707864bbaaff9808717813105072a6ePatrick Benavoli
19468a912857707864bbaaff9808717813105072a6ePatrick Benavoli        // Create corresponding child element
19568a912857707864bbaaff9808717813105072a6ePatrick Benavoli        CXmlElement xmlChildElement;
19668a912857707864bbaaff9808717813105072a6ePatrick Benavoli
1979368eea42a1afb01dd44110582f997115b50e742François Gaffie        xmlElement.createChild(xmlChildElement, pChild->getXmlElementName());
19868a912857707864bbaaff9808717813105072a6ePatrick Benavoli
19968a912857707864bbaaff9808717813105072a6ePatrick Benavoli        // Propagate
20068a912857707864bbaaff9808717813105072a6ePatrick Benavoli        pChild->toXml(xmlChildElement, serializingContext);
20168a912857707864bbaaff9808717813105072a6ePatrick Benavoli    }
20268a912857707864bbaaff9808717813105072a6ePatrick Benavoli}
20368a912857707864bbaaff9808717813105072a6ePatrick Benavoli
2049368eea42a1afb01dd44110582f997115b50e742François Gaffievoid CElement::toXml(CXmlElement &xmlElement, CXmlSerializingContext &serializingContext) const
2058cb5d8815da673747b729d5e0a05a5cdc11a9081David Wagner{
2068cb5d8815da673747b729d5e0a05a5cdc11a9081David Wagner    setXmlNameAttribute(xmlElement);
207a9be2d378b7ad84e679a48efa81f42fb54f85d9aJean-Michel Trivi    setXmlDescriptionAttribute(xmlElement);
2088cb5d8815da673747b729d5e0a05a5cdc11a9081David Wagner    childrenToXml(xmlElement, serializingContext);
2098cb5d8815da673747b729d5e0a05a5cdc11a9081David Wagner}
2108cb5d8815da673747b729d5e0a05a5cdc11a9081David Wagner
2119368eea42a1afb01dd44110582f997115b50e742François Gaffievoid CElement::setXmlDescriptionAttribute(CXmlElement &xmlElement) const
212a9be2d378b7ad84e679a48efa81f42fb54f85d9aJean-Michel Trivi{
213a9be2d378b7ad84e679a48efa81f42fb54f85d9aJean-Michel Trivi    const string &description = getDescription();
214a9be2d378b7ad84e679a48efa81f42fb54f85d9aJean-Michel Trivi    if (!description.empty()) {
2159368eea42a1afb01dd44110582f997115b50e742François Gaffie        xmlElement.setAttribute(gDescriptionPropertyName, description);
216a9be2d378b7ad84e679a48efa81f42fb54f85d9aJean-Michel Trivi    }
217a9be2d378b7ad84e679a48efa81f42fb54f85d9aJean-Michel Trivi}
218a9be2d378b7ad84e679a48efa81f42fb54f85d9aJean-Michel Trivi
2199368eea42a1afb01dd44110582f997115b50e742François Gaffievoid CElement::setXmlNameAttribute(CXmlElement &xmlElement) const
22068a912857707864bbaaff9808717813105072a6ePatrick Benavoli{
22168a912857707864bbaaff9808717813105072a6ePatrick Benavoli    // By default, set Name attribute if any
22268a912857707864bbaaff9808717813105072a6ePatrick Benavoli    string strName = getName();
22368a912857707864bbaaff9808717813105072a6ePatrick Benavoli
22468a912857707864bbaaff9808717813105072a6ePatrick Benavoli    if (!strName.empty()) {
22568a912857707864bbaaff9808717813105072a6ePatrick Benavoli
22668a912857707864bbaaff9808717813105072a6ePatrick Benavoli        xmlElement.setNameAttribute(strName);
22768a912857707864bbaaff9808717813105072a6ePatrick Benavoli    }
22868a912857707864bbaaff9808717813105072a6ePatrick Benavoli}
22968a912857707864bbaaff9808717813105072a6ePatrick Benavoli
23068a912857707864bbaaff9808717813105072a6ePatrick Benavoli// Name
2319368eea42a1afb01dd44110582f997115b50e742François Gaffievoid CElement::setName(const string &strName)
23268a912857707864bbaaff9808717813105072a6ePatrick Benavoli{
23368a912857707864bbaaff9808717813105072a6ePatrick Benavoli    _strName = strName;
23468a912857707864bbaaff9808717813105072a6ePatrick Benavoli}
23568a912857707864bbaaff9808717813105072a6ePatrick Benavoli
2369368eea42a1afb01dd44110582f997115b50e742François Gaffieconst string &CElement::getName() const
23768a912857707864bbaaff9808717813105072a6ePatrick Benavoli{
23868a912857707864bbaaff9808717813105072a6ePatrick Benavoli    return _strName;
23968a912857707864bbaaff9808717813105072a6ePatrick Benavoli}
24068a912857707864bbaaff9808717813105072a6ePatrick Benavoli
2419368eea42a1afb01dd44110582f997115b50e742François Gaffiebool CElement::rename(const string &strName, string &strError)
24268a912857707864bbaaff9808717813105072a6ePatrick Benavoli{
24368a912857707864bbaaff9808717813105072a6ePatrick Benavoli    // Check for conflict with brotherhood if relevant
24468a912857707864bbaaff9808717813105072a6ePatrick Benavoli    if (_pParent && _pParent->childrenAreDynamic()) {
24568a912857707864bbaaff9808717813105072a6ePatrick Benavoli
2469368eea42a1afb01dd44110582f997115b50e742François Gaffie        for (CElement *pParentChild : _pParent->_childArray) {
24768a912857707864bbaaff9808717813105072a6ePatrick Benavoli
24868a912857707864bbaaff9808717813105072a6ePatrick Benavoli            if (pParentChild != this && pParentChild->getName() == strName) {
24968a912857707864bbaaff9808717813105072a6ePatrick Benavoli
25068a912857707864bbaaff9808717813105072a6ePatrick Benavoli                // Conflict
25168a912857707864bbaaff9808717813105072a6ePatrick Benavoli                strError = "Name conflicts with brother element";
25268a912857707864bbaaff9808717813105072a6ePatrick Benavoli
25368a912857707864bbaaff9808717813105072a6ePatrick Benavoli                return false;
25468a912857707864bbaaff9808717813105072a6ePatrick Benavoli            }
25568a912857707864bbaaff9808717813105072a6ePatrick Benavoli        }
25668a912857707864bbaaff9808717813105072a6ePatrick Benavoli    }
25768a912857707864bbaaff9808717813105072a6ePatrick Benavoli    // Change name
25868a912857707864bbaaff9808717813105072a6ePatrick Benavoli    setName(strName);
25968a912857707864bbaaff9808717813105072a6ePatrick Benavoli
26068a912857707864bbaaff9808717813105072a6ePatrick Benavoli    return true;
26168a912857707864bbaaff9808717813105072a6ePatrick Benavoli}
26268a912857707864bbaaff9808717813105072a6ePatrick Benavoli
26368a912857707864bbaaff9808717813105072a6ePatrick Benavolistring CElement::getPathName() const
26468a912857707864bbaaff9808717813105072a6ePatrick Benavoli{
26568a912857707864bbaaff9808717813105072a6ePatrick Benavoli    if (!_strName.empty()) {
26668a912857707864bbaaff9808717813105072a6ePatrick Benavoli
26768a912857707864bbaaff9808717813105072a6ePatrick Benavoli        return _strName;
26868a912857707864bbaaff9808717813105072a6ePatrick Benavoli    } else {
26968a912857707864bbaaff9808717813105072a6ePatrick Benavoli
27068a912857707864bbaaff9808717813105072a6ePatrick Benavoli        return getKind();
27168a912857707864bbaaff9808717813105072a6ePatrick Benavoli    }
27268a912857707864bbaaff9808717813105072a6ePatrick Benavoli}
27368a912857707864bbaaff9808717813105072a6ePatrick Benavoli
2746ba361d96bc2581667b3400f87ff89fae6449e1fPatrick Benavoli// Hierarchy
2759368eea42a1afb01dd44110582f997115b50e742François Gaffievoid CElement::addChild(CElement *pChild)
27668a912857707864bbaaff9808717813105072a6ePatrick Benavoli{
27768a912857707864bbaaff9808717813105072a6ePatrick Benavoli    _childArray.push_back(pChild);
27868a912857707864bbaaff9808717813105072a6ePatrick Benavoli
27968a912857707864bbaaff9808717813105072a6ePatrick Benavoli    pChild->_pParent = this;
28068a912857707864bbaaff9808717813105072a6ePatrick Benavoli}
28168a912857707864bbaaff9808717813105072a6ePatrick Benavoli
2829368eea42a1afb01dd44110582f997115b50e742François GaffieCElement *CElement::getChild(size_t index)
28368a912857707864bbaaff9808717813105072a6ePatrick Benavoli{
2849368eea42a1afb01dd44110582f997115b50e742François Gaffie    assert(index <= _childArray.size());
28568a912857707864bbaaff9808717813105072a6ePatrick Benavoli
2869368eea42a1afb01dd44110582f997115b50e742François Gaffie    return _childArray[index];
28768a912857707864bbaaff9808717813105072a6ePatrick Benavoli}
28868a912857707864bbaaff9808717813105072a6ePatrick Benavoli
2899368eea42a1afb01dd44110582f997115b50e742François Gaffieconst CElement *CElement::getChild(size_t index) const
29068a912857707864bbaaff9808717813105072a6ePatrick Benavoli{
2919368eea42a1afb01dd44110582f997115b50e742François Gaffie    assert(index <= _childArray.size());
29268a912857707864bbaaff9808717813105072a6ePatrick Benavoli
2939368eea42a1afb01dd44110582f997115b50e742François Gaffie    return _childArray[index];
29468a912857707864bbaaff9808717813105072a6ePatrick Benavoli}
29568a912857707864bbaaff9808717813105072a6ePatrick Benavoli
2969368eea42a1afb01dd44110582f997115b50e742François GaffieCElement *CElement::createChild(const CXmlElement &childElement,
2979368eea42a1afb01dd44110582f997115b50e742François Gaffie                                CXmlSerializingContext &serializingContext)
2983ba083ee0b0ff7e01caeb3bc7395377071e20fe6Guillaume Denneulin{
2993ba083ee0b0ff7e01caeb3bc7395377071e20fe6Guillaume Denneulin    // Context
3009368eea42a1afb01dd44110582f997115b50e742François Gaffie    CXmlElementSerializingContext &elementSerializingContext =
3019368eea42a1afb01dd44110582f997115b50e742François Gaffie        static_cast<CXmlElementSerializingContext &>(serializingContext);
3023ba083ee0b0ff7e01caeb3bc7395377071e20fe6Guillaume Denneulin
3033ba083ee0b0ff7e01caeb3bc7395377071e20fe6Guillaume Denneulin    // Child needs creation
3049368eea42a1afb01dd44110582f997115b50e742François Gaffie    CElement *pChild = elementSerializingContext.getElementLibrary()->createElement(childElement);
3053ba083ee0b0ff7e01caeb3bc7395377071e20fe6Guillaume Denneulin
3063ba083ee0b0ff7e01caeb3bc7395377071e20fe6Guillaume Denneulin    if (!pChild) {
3073ba083ee0b0ff7e01caeb3bc7395377071e20fe6Guillaume Denneulin
3089368eea42a1afb01dd44110582f997115b50e742François Gaffie        elementSerializingContext.setError("Unable to create XML element " +
3099368eea42a1afb01dd44110582f997115b50e742François Gaffie                                           childElement.getPath());
3103ba083ee0b0ff7e01caeb3bc7395377071e20fe6Guillaume Denneulin
3113ba083ee0b0ff7e01caeb3bc7395377071e20fe6Guillaume Denneulin        return NULL;
3123ba083ee0b0ff7e01caeb3bc7395377071e20fe6Guillaume Denneulin    }
3133ba083ee0b0ff7e01caeb3bc7395377071e20fe6Guillaume Denneulin    // Store created child!
3143ba083ee0b0ff7e01caeb3bc7395377071e20fe6Guillaume Denneulin    addChild(pChild);
3153ba083ee0b0ff7e01caeb3bc7395377071e20fe6Guillaume Denneulin
3163ba083ee0b0ff7e01caeb3bc7395377071e20fe6Guillaume Denneulin    return pChild;
3173ba083ee0b0ff7e01caeb3bc7395377071e20fe6Guillaume Denneulin}
3183ba083ee0b0ff7e01caeb3bc7395377071e20fe6Guillaume Denneulin
3199368eea42a1afb01dd44110582f997115b50e742François Gaffiebool CElement::removeChild(CElement *pChild)
32068a912857707864bbaaff9808717813105072a6ePatrick Benavoli{
3219368eea42a1afb01dd44110582f997115b50e742François Gaffie    auto childIt = find(begin(_childArray), end(_childArray), pChild);
3229368eea42a1afb01dd44110582f997115b50e742François Gaffie    if (childIt != end(_childArray)) {
32368a912857707864bbaaff9808717813105072a6ePatrick Benavoli
3249368eea42a1afb01dd44110582f997115b50e742François Gaffie        _childArray.erase(childIt);
3259368eea42a1afb01dd44110582f997115b50e742François Gaffie        return true;
32668a912857707864bbaaff9808717813105072a6ePatrick Benavoli    }
32768a912857707864bbaaff9808717813105072a6ePatrick Benavoli    return false;
32868a912857707864bbaaff9808717813105072a6ePatrick Benavoli}
32968a912857707864bbaaff9808717813105072a6ePatrick Benavoli
3309368eea42a1afb01dd44110582f997115b50e742François Gaffievoid CElement::listChildren(string &strChildList) const
33168a912857707864bbaaff9808717813105072a6ePatrick Benavoli{
33268a912857707864bbaaff9808717813105072a6ePatrick Benavoli    // Get list of children names
3339368eea42a1afb01dd44110582f997115b50e742François Gaffie    for (CElement *pChild : _childArray) {
33468a912857707864bbaaff9808717813105072a6ePatrick Benavoli
33568a912857707864bbaaff9808717813105072a6ePatrick Benavoli        strChildList += pChild->getName() + "\n";
33668a912857707864bbaaff9808717813105072a6ePatrick Benavoli    }
33768a912857707864bbaaff9808717813105072a6ePatrick Benavoli}
33868a912857707864bbaaff9808717813105072a6ePatrick Benavoli
3399368eea42a1afb01dd44110582f997115b50e742François Gaffiestring CElement::listQualifiedPaths(bool bDive, size_t level) const
34068a912857707864bbaaff9808717813105072a6ePatrick Benavoli{
3416ba361d96bc2581667b3400f87ff89fae6449e1fPatrick Benavoli    string strResult;
3426ba361d96bc2581667b3400f87ff89fae6449e1fPatrick Benavoli
3436ba361d96bc2581667b3400f87ff89fae6449e1fPatrick Benavoli    // Dive Will cause only leaf nodes to be printed
3449368eea42a1afb01dd44110582f997115b50e742François Gaffie    if (!bDive || !getNbChildren()) {
3456ba361d96bc2581667b3400f87ff89fae6449e1fPatrick Benavoli
3466ba361d96bc2581667b3400f87ff89fae6449e1fPatrick Benavoli        strResult = getQualifiedPath() + "\n";
3476ba361d96bc2581667b3400f87ff89fae6449e1fPatrick Benavoli    }
34868a912857707864bbaaff9808717813105072a6ePatrick Benavoli
3499368eea42a1afb01dd44110582f997115b50e742François Gaffie    if (bDive || !level) {
35068a912857707864bbaaff9808717813105072a6ePatrick Benavoli        // Get list of children paths
3519368eea42a1afb01dd44110582f997115b50e742François Gaffie        for (CElement *pChild : _childArray) {
35268a912857707864bbaaff9808717813105072a6ePatrick Benavoli
3539368eea42a1afb01dd44110582f997115b50e742François Gaffie            strResult += pChild->listQualifiedPaths(bDive, level + 1);
35468a912857707864bbaaff9808717813105072a6ePatrick Benavoli        }
35568a912857707864bbaaff9808717813105072a6ePatrick Benavoli    }
35668a912857707864bbaaff9808717813105072a6ePatrick Benavoli    return strResult;
35768a912857707864bbaaff9808717813105072a6ePatrick Benavoli}
35868a912857707864bbaaff9808717813105072a6ePatrick Benavoli
3599368eea42a1afb01dd44110582f997115b50e742François Gaffievoid CElement::listChildrenPaths(string &strChildList) const
36068a912857707864bbaaff9808717813105072a6ePatrick Benavoli{
36168a912857707864bbaaff9808717813105072a6ePatrick Benavoli    // Get list of children paths
3629368eea42a1afb01dd44110582f997115b50e742François Gaffie    for (CElement *pChild : _childArray) {
36368a912857707864bbaaff9808717813105072a6ePatrick Benavoli
36468a912857707864bbaaff9808717813105072a6ePatrick Benavoli        strChildList += pChild->getPath() + "\n";
36568a912857707864bbaaff9808717813105072a6ePatrick Benavoli    }
36668a912857707864bbaaff9808717813105072a6ePatrick Benavoli}
36768a912857707864bbaaff9808717813105072a6ePatrick Benavoli
368911844b16c6b627f421bc3368de427de3ca9f60cPatrick Benavolisize_t CElement::getNbChildren() const
36968a912857707864bbaaff9808717813105072a6ePatrick Benavoli{
37068a912857707864bbaaff9808717813105072a6ePatrick Benavoli    return _childArray.size();
37168a912857707864bbaaff9808717813105072a6ePatrick Benavoli}
37268a912857707864bbaaff9808717813105072a6ePatrick Benavoli
3739368eea42a1afb01dd44110582f997115b50e742François Gaffieconst CElement *CElement::getParent() const
37468a912857707864bbaaff9808717813105072a6ePatrick Benavoli{
37568a912857707864bbaaff9808717813105072a6ePatrick Benavoli    return _pParent;
37668a912857707864bbaaff9808717813105072a6ePatrick Benavoli}
37768a912857707864bbaaff9808717813105072a6ePatrick Benavoli
3789368eea42a1afb01dd44110582f997115b50e742François GaffieCElement *CElement::getParent()
37968a912857707864bbaaff9808717813105072a6ePatrick Benavoli{
38068a912857707864bbaaff9808717813105072a6ePatrick Benavoli    return _pParent;
38168a912857707864bbaaff9808717813105072a6ePatrick Benavoli}
38268a912857707864bbaaff9808717813105072a6ePatrick Benavoli
38368a912857707864bbaaff9808717813105072a6ePatrick Benavolivoid CElement::clean()
38468a912857707864bbaaff9808717813105072a6ePatrick Benavoli{
38568a912857707864bbaaff9808717813105072a6ePatrick Benavoli    if (childrenAreDynamic()) {
38668a912857707864bbaaff9808717813105072a6ePatrick Benavoli
38768a912857707864bbaaff9808717813105072a6ePatrick Benavoli        removeChildren();
38868a912857707864bbaaff9808717813105072a6ePatrick Benavoli    } else {
38968a912857707864bbaaff9808717813105072a6ePatrick Benavoli        // Just propagate
3909368eea42a1afb01dd44110582f997115b50e742François Gaffie        for (CElement *pChild : _childArray) {
39168a912857707864bbaaff9808717813105072a6ePatrick Benavoli
3929368eea42a1afb01dd44110582f997115b50e742François Gaffie            pChild->clean();
39368a912857707864bbaaff9808717813105072a6ePatrick Benavoli        }
39468a912857707864bbaaff9808717813105072a6ePatrick Benavoli    }
39568a912857707864bbaaff9808717813105072a6ePatrick Benavoli}
39668a912857707864bbaaff9808717813105072a6ePatrick Benavoli
39768a912857707864bbaaff9808717813105072a6ePatrick Benavolivoid CElement::removeChildren()
39868a912857707864bbaaff9808717813105072a6ePatrick Benavoli{
39968a912857707864bbaaff9808717813105072a6ePatrick Benavoli    // Delete in reverse order
40068a912857707864bbaaff9808717813105072a6ePatrick Benavoli    ChildArrayReverseIterator it;
40168a912857707864bbaaff9808717813105072a6ePatrick Benavoli
40268a912857707864bbaaff9808717813105072a6ePatrick Benavoli    for (it = _childArray.rbegin(); it != _childArray.rend(); ++it) {
40368a912857707864bbaaff9808717813105072a6ePatrick Benavoli
40468a912857707864bbaaff9808717813105072a6ePatrick Benavoli        delete *it;
40568a912857707864bbaaff9808717813105072a6ePatrick Benavoli    }
40668a912857707864bbaaff9808717813105072a6ePatrick Benavoli    _childArray.clear();
40768a912857707864bbaaff9808717813105072a6ePatrick Benavoli}
40868a912857707864bbaaff9808717813105072a6ePatrick Benavoli
4099368eea42a1afb01dd44110582f997115b50e742François Gaffieconst CElement *CElement::findDescendant(CPathNavigator &pathNavigator) const
41068a912857707864bbaaff9808717813105072a6ePatrick Benavoli{
4119368eea42a1afb01dd44110582f997115b50e742François Gaffie    string *pStrChildName = pathNavigator.next();
41268a912857707864bbaaff9808717813105072a6ePatrick Benavoli
41368a912857707864bbaaff9808717813105072a6ePatrick Benavoli    if (!pStrChildName) {
41468a912857707864bbaaff9808717813105072a6ePatrick Benavoli
41568a912857707864bbaaff9808717813105072a6ePatrick Benavoli        return this;
41668a912857707864bbaaff9808717813105072a6ePatrick Benavoli    }
41768a912857707864bbaaff9808717813105072a6ePatrick Benavoli
4189368eea42a1afb01dd44110582f997115b50e742François Gaffie    const CElement *pChild = findChild(*pStrChildName);
41968a912857707864bbaaff9808717813105072a6ePatrick Benavoli
42068a912857707864bbaaff9808717813105072a6ePatrick Benavoli    if (!pChild) {
42168a912857707864bbaaff9808717813105072a6ePatrick Benavoli
42268a912857707864bbaaff9808717813105072a6ePatrick Benavoli        return NULL;
42368a912857707864bbaaff9808717813105072a6ePatrick Benavoli    }
42468a912857707864bbaaff9808717813105072a6ePatrick Benavoli
42568a912857707864bbaaff9808717813105072a6ePatrick Benavoli    return pChild->findDescendant(pathNavigator);
42668a912857707864bbaaff9808717813105072a6ePatrick Benavoli}
42768a912857707864bbaaff9808717813105072a6ePatrick Benavoli
4289368eea42a1afb01dd44110582f997115b50e742François GaffieCElement *CElement::findDescendant(CPathNavigator &pathNavigator)
42968a912857707864bbaaff9808717813105072a6ePatrick Benavoli{
4309368eea42a1afb01dd44110582f997115b50e742François Gaffie    string *pStrChildName = pathNavigator.next();
43168a912857707864bbaaff9808717813105072a6ePatrick Benavoli
43268a912857707864bbaaff9808717813105072a6ePatrick Benavoli    if (!pStrChildName) {
43368a912857707864bbaaff9808717813105072a6ePatrick Benavoli
43468a912857707864bbaaff9808717813105072a6ePatrick Benavoli        return this;
43568a912857707864bbaaff9808717813105072a6ePatrick Benavoli    }
43668a912857707864bbaaff9808717813105072a6ePatrick Benavoli
4379368eea42a1afb01dd44110582f997115b50e742François Gaffie    CElement *pChild = findChild(*pStrChildName);
43868a912857707864bbaaff9808717813105072a6ePatrick Benavoli
43968a912857707864bbaaff9808717813105072a6ePatrick Benavoli    if (!pChild) {
44068a912857707864bbaaff9808717813105072a6ePatrick Benavoli
44168a912857707864bbaaff9808717813105072a6ePatrick Benavoli        return NULL;
44268a912857707864bbaaff9808717813105072a6ePatrick Benavoli    }
44368a912857707864bbaaff9808717813105072a6ePatrick Benavoli
44468a912857707864bbaaff9808717813105072a6ePatrick Benavoli    return pChild->findDescendant(pathNavigator);
44568a912857707864bbaaff9808717813105072a6ePatrick Benavoli}
44668a912857707864bbaaff9808717813105072a6ePatrick Benavoli
4479368eea42a1afb01dd44110582f997115b50e742François Gaffiebool CElement::isDescendantOf(const CElement *pCandidateAscendant) const
44868a912857707864bbaaff9808717813105072a6ePatrick Benavoli{
44968a912857707864bbaaff9808717813105072a6ePatrick Benavoli    if (!_pParent) {
45068a912857707864bbaaff9808717813105072a6ePatrick Benavoli
45168a912857707864bbaaff9808717813105072a6ePatrick Benavoli        return false;
45268a912857707864bbaaff9808717813105072a6ePatrick Benavoli    }
45368a912857707864bbaaff9808717813105072a6ePatrick Benavoli    if (_pParent == pCandidateAscendant) {
45468a912857707864bbaaff9808717813105072a6ePatrick Benavoli
45568a912857707864bbaaff9808717813105072a6ePatrick Benavoli        return true;
45668a912857707864bbaaff9808717813105072a6ePatrick Benavoli    }
45768a912857707864bbaaff9808717813105072a6ePatrick Benavoli    return _pParent->isDescendantOf(pCandidateAscendant);
45868a912857707864bbaaff9808717813105072a6ePatrick Benavoli}
45968a912857707864bbaaff9808717813105072a6ePatrick Benavoli
4609368eea42a1afb01dd44110582f997115b50e742François GaffieCElement *CElement::findChild(const string &strName)
46168a912857707864bbaaff9808717813105072a6ePatrick Benavoli{
4629368eea42a1afb01dd44110582f997115b50e742François Gaffie    for (CElement *pChild : _childArray) {
46368a912857707864bbaaff9808717813105072a6ePatrick Benavoli
4649368eea42a1afb01dd44110582f997115b50e742François Gaffie        if (pChild->getPathName() == strName) {
46568a912857707864bbaaff9808717813105072a6ePatrick Benavoli
4669368eea42a1afb01dd44110582f997115b50e742François Gaffie            return pChild;
46768a912857707864bbaaff9808717813105072a6ePatrick Benavoli        }
46868a912857707864bbaaff9808717813105072a6ePatrick Benavoli    }
46968a912857707864bbaaff9808717813105072a6ePatrick Benavoli
47068a912857707864bbaaff9808717813105072a6ePatrick Benavoli    return NULL;
47168a912857707864bbaaff9808717813105072a6ePatrick Benavoli}
47268a912857707864bbaaff9808717813105072a6ePatrick Benavoli
4739368eea42a1afb01dd44110582f997115b50e742François Gaffieconst CElement *CElement::findChild(const string &strName) const
47468a912857707864bbaaff9808717813105072a6ePatrick Benavoli{
4759368eea42a1afb01dd44110582f997115b50e742François Gaffie    for (CElement *pChild : _childArray) {
47668a912857707864bbaaff9808717813105072a6ePatrick Benavoli
4779368eea42a1afb01dd44110582f997115b50e742François Gaffie        if (pChild->getPathName() == strName) {
47868a912857707864bbaaff9808717813105072a6ePatrick Benavoli
4799368eea42a1afb01dd44110582f997115b50e742François Gaffie            return pChild;
48068a912857707864bbaaff9808717813105072a6ePatrick Benavoli        }
48168a912857707864bbaaff9808717813105072a6ePatrick Benavoli    }
48268a912857707864bbaaff9808717813105072a6ePatrick Benavoli
48368a912857707864bbaaff9808717813105072a6ePatrick Benavoli    return NULL;
48468a912857707864bbaaff9808717813105072a6ePatrick Benavoli}
48568a912857707864bbaaff9808717813105072a6ePatrick Benavoli
4869368eea42a1afb01dd44110582f997115b50e742François GaffieCElement *CElement::findChildOfKind(const string &strKind)
48768a912857707864bbaaff9808717813105072a6ePatrick Benavoli{
4889368eea42a1afb01dd44110582f997115b50e742François Gaffie    for (CElement *pChild : _childArray) {
48968a912857707864bbaaff9808717813105072a6ePatrick Benavoli
4909368eea42a1afb01dd44110582f997115b50e742François Gaffie        if (pChild->getKind() == strKind) {
49168a912857707864bbaaff9808717813105072a6ePatrick Benavoli
4929368eea42a1afb01dd44110582f997115b50e742François Gaffie            return pChild;
49368a912857707864bbaaff9808717813105072a6ePatrick Benavoli        }
49468a912857707864bbaaff9808717813105072a6ePatrick Benavoli    }
49568a912857707864bbaaff9808717813105072a6ePatrick Benavoli
49668a912857707864bbaaff9808717813105072a6ePatrick Benavoli    return NULL;
49768a912857707864bbaaff9808717813105072a6ePatrick Benavoli}
49868a912857707864bbaaff9808717813105072a6ePatrick Benavoli
4999368eea42a1afb01dd44110582f997115b50e742François Gaffieconst CElement *CElement::findChildOfKind(const string &strKind) const
50068a912857707864bbaaff9808717813105072a6ePatrick Benavoli{
5019368eea42a1afb01dd44110582f997115b50e742François Gaffie    for (CElement *pChild : _childArray) {
50268a912857707864bbaaff9808717813105072a6ePatrick Benavoli
5039368eea42a1afb01dd44110582f997115b50e742François Gaffie        if (pChild->getKind() == strKind) {
50468a912857707864bbaaff9808717813105072a6ePatrick Benavoli
5059368eea42a1afb01dd44110582f997115b50e742François Gaffie            return pChild;
50668a912857707864bbaaff9808717813105072a6ePatrick Benavoli        }
50768a912857707864bbaaff9808717813105072a6ePatrick Benavoli    }
50868a912857707864bbaaff9808717813105072a6ePatrick Benavoli
50968a912857707864bbaaff9808717813105072a6ePatrick Benavoli    return NULL;
51068a912857707864bbaaff9808717813105072a6ePatrick Benavoli}
51168a912857707864bbaaff9808717813105072a6ePatrick Benavoli
51268a912857707864bbaaff9808717813105072a6ePatrick Benavolistring CElement::getPath() const
51368a912857707864bbaaff9808717813105072a6ePatrick Benavoli{
51468a912857707864bbaaff9808717813105072a6ePatrick Benavoli    // Take out root element from the path
51568a912857707864bbaaff9808717813105072a6ePatrick Benavoli    if (_pParent && _pParent->_pParent) {
51668a912857707864bbaaff9808717813105072a6ePatrick Benavoli
51768a912857707864bbaaff9808717813105072a6ePatrick Benavoli        return _pParent->getPath() + "/" + getPathName();
51868a912857707864bbaaff9808717813105072a6ePatrick Benavoli    }
51968a912857707864bbaaff9808717813105072a6ePatrick Benavoli    return "/" + getPathName();
52068a912857707864bbaaff9808717813105072a6ePatrick Benavoli}
52168a912857707864bbaaff9808717813105072a6ePatrick Benavoli
52268a912857707864bbaaff9808717813105072a6ePatrick Benavolistring CElement::getQualifiedPath() const
52368a912857707864bbaaff9808717813105072a6ePatrick Benavoli{
52468a912857707864bbaaff9808717813105072a6ePatrick Benavoli    return getPath() + " [" + getKind() + "]";
52568a912857707864bbaaff9808717813105072a6ePatrick Benavoli}
52668a912857707864bbaaff9808717813105072a6ePatrick Benavoli
5279368eea42a1afb01dd44110582f997115b50e742François Gaffiestring CElement::getXmlElementName() const
52868a912857707864bbaaff9808717813105072a6ePatrick Benavoli{
5299368eea42a1afb01dd44110582f997115b50e742François Gaffie    // Default to element kind
5309368eea42a1afb01dd44110582f997115b50e742François Gaffie    return getKind();
53168a912857707864bbaaff9808717813105072a6ePatrick Benavoli}
532