ConfigurableDomain.cpp revision f2fd15a331fd3b5b63f0dc6f492651330adcedf9
193250d172612c405135d56ffd306deae5ebc6df1Kevin Rocard/*
268a912857707864bbaaff9808717813105072a6ePatrick Benavoli * INTEL CONFIDENTIAL
368a912857707864bbaaff9808717813105072a6ePatrick Benavoli * Copyright © 2011 Intel
468a912857707864bbaaff9808717813105072a6ePatrick Benavoli * Corporation All Rights Reserved.
568a912857707864bbaaff9808717813105072a6ePatrick Benavoli *
668a912857707864bbaaff9808717813105072a6ePatrick Benavoli * The source code contained or described herein and all documents related to
768a912857707864bbaaff9808717813105072a6ePatrick Benavoli * the source code ("Material") are owned by Intel Corporation or its suppliers
868a912857707864bbaaff9808717813105072a6ePatrick Benavoli * or licensors. Title to the Material remains with Intel Corporation or its
968a912857707864bbaaff9808717813105072a6ePatrick Benavoli * suppliers and licensors. The Material contains trade secrets and proprietary
1068a912857707864bbaaff9808717813105072a6ePatrick Benavoli * and confidential information of Intel or its suppliers and licensors. The
1168a912857707864bbaaff9808717813105072a6ePatrick Benavoli * Material is protected by worldwide copyright and trade secret laws and
1268a912857707864bbaaff9808717813105072a6ePatrick Benavoli * treaty provisions. No part of the Material may be used, copied, reproduced,
1368a912857707864bbaaff9808717813105072a6ePatrick Benavoli * modified, published, uploaded, posted, transmitted, distributed, or
1468a912857707864bbaaff9808717813105072a6ePatrick Benavoli * disclosed in any way without Intel’s prior express written permission.
1568a912857707864bbaaff9808717813105072a6ePatrick Benavoli *
1668a912857707864bbaaff9808717813105072a6ePatrick Benavoli * No license under any patent, copyright, trade secret or other intellectual
1768a912857707864bbaaff9808717813105072a6ePatrick Benavoli * property right is granted to or conferred upon you by disclosure or delivery
1868a912857707864bbaaff9808717813105072a6ePatrick Benavoli * of the Materials, either expressly, by implication, inducement, estoppel or
1968a912857707864bbaaff9808717813105072a6ePatrick Benavoli * otherwise. Any license under such intellectual property rights must be
2068a912857707864bbaaff9808717813105072a6ePatrick Benavoli * express and approved by Intel in writing.
2168a912857707864bbaaff9808717813105072a6ePatrick Benavoli *
2268a912857707864bbaaff9808717813105072a6ePatrick Benavoli * CREATED: 2011-06-01
2368a912857707864bbaaff9808717813105072a6ePatrick Benavoli * UPDATED: 2011-07-27
2468a912857707864bbaaff9808717813105072a6ePatrick Benavoli */
2568a912857707864bbaaff9808717813105072a6ePatrick Benavoli#include "ConfigurableDomain.h"
2668a912857707864bbaaff9808717813105072a6ePatrick Benavoli#include "DomainConfiguration.h"
2768a912857707864bbaaff9808717813105072a6ePatrick Benavoli#include "ConfigurableElement.h"
2868a912857707864bbaaff9808717813105072a6ePatrick Benavoli#include "ConfigurationAccessContext.h"
2968a912857707864bbaaff9808717813105072a6ePatrick Benavoli#include "XmlDomainSerializingContext.h"
3068a912857707864bbaaff9808717813105072a6ePatrick Benavoli#include <assert.h>
3168a912857707864bbaaff9808717813105072a6ePatrick Benavoli
3268a912857707864bbaaff9808717813105072a6ePatrick Benavoli#define base CBinarySerializableElement
3368a912857707864bbaaff9808717813105072a6ePatrick Benavoli
3463499d4763e42d76bfd39b79871f611381d2d164Patrick BenavoliCConfigurableDomain::CConfigurableDomain(const string& strName) : base(strName), _bSequenceAware(false), _pLastAppliedConfiguration(NULL)
3568a912857707864bbaaff9808717813105072a6ePatrick Benavoli{
3668a912857707864bbaaff9808717813105072a6ePatrick Benavoli}
3768a912857707864bbaaff9808717813105072a6ePatrick Benavoli
3868a912857707864bbaaff9808717813105072a6ePatrick BenavoliCConfigurableDomain::~CConfigurableDomain()
3968a912857707864bbaaff9808717813105072a6ePatrick Benavoli{
4063499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli    // Remove all configurable elements
4168a912857707864bbaaff9808717813105072a6ePatrick Benavoli    ConfigurableElementListIterator it;
4268a912857707864bbaaff9808717813105072a6ePatrick Benavoli
4368a912857707864bbaaff9808717813105072a6ePatrick Benavoli    for (it = _configurableElementList.begin(); it != _configurableElementList.end(); ++it) {
4468a912857707864bbaaff9808717813105072a6ePatrick Benavoli
4568a912857707864bbaaff9808717813105072a6ePatrick Benavoli        CConfigurableElement* pConfigurableElement = *it;
4668a912857707864bbaaff9808717813105072a6ePatrick Benavoli
4768a912857707864bbaaff9808717813105072a6ePatrick Benavoli        // Remove from configurable element
4868a912857707864bbaaff9808717813105072a6ePatrick Benavoli        pConfigurableElement->removeAttachedConfigurableDomain(this);
4968a912857707864bbaaff9808717813105072a6ePatrick Benavoli    }
5063499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli
5163499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli    // Remove all associated syncer sets
5263499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli    ConfigurableElementToSyncerSetMapIterator mapIt;
5363499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli
5463499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli    for (mapIt = _configurableElementToSyncerSetMap.begin(); mapIt != _configurableElementToSyncerSetMap.end(); ++mapIt) {
5563499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli
5663499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli        delete mapIt->second;
5763499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli    }
5868a912857707864bbaaff9808717813105072a6ePatrick Benavoli}
5968a912857707864bbaaff9808717813105072a6ePatrick Benavoli
6068a912857707864bbaaff9808717813105072a6ePatrick Benavolistring CConfigurableDomain::getKind() const
6168a912857707864bbaaff9808717813105072a6ePatrick Benavoli{
6268a912857707864bbaaff9808717813105072a6ePatrick Benavoli    return "ConfigurableDomain";
6368a912857707864bbaaff9808717813105072a6ePatrick Benavoli}
6468a912857707864bbaaff9808717813105072a6ePatrick Benavoli
6568a912857707864bbaaff9808717813105072a6ePatrick Benavolibool CConfigurableDomain::childrenAreDynamic() const
6668a912857707864bbaaff9808717813105072a6ePatrick Benavoli{
6768a912857707864bbaaff9808717813105072a6ePatrick Benavoli    return true;
6868a912857707864bbaaff9808717813105072a6ePatrick Benavoli}
6968a912857707864bbaaff9808717813105072a6ePatrick Benavoli
700bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli// Content dumping
710bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavolivoid CConfigurableDomain::logValue(string& strValue, CErrorContext& errorContext) const
720bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli{
730bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli    (void)errorContext;
740bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli
750bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli    strValue = "{";
760bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli
770bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli    // Sequence awareness
780bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli    strValue += "Sequence aware: ";
790bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli    strValue += _bSequenceAware ? "yes" : "no";
800bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli
810bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli    // Last applied configuration
820bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli    strValue += ", Last applied configuration: ";
830bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli    strValue += _pLastAppliedConfiguration ? _pLastAppliedConfiguration->getName() : "<none>";
840bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli
850bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli    strValue += "}";
860bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli}
870bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli
8863499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli// Sequence awareness
8963499d4763e42d76bfd39b79871f611381d2d164Patrick Benavolivoid CConfigurableDomain::setSequenceAwareness(bool bSequenceAware)
9063499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli{
9163499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli    if (_bSequenceAware != bSequenceAware) {
9263499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli
93ace81f873b910493ab884dc5a6a38ba6ec3d56d3Kevin Rocard        log_info("Making domain \"%s\" sequence %s", getName().c_str(), bSequenceAware ? "aware" : "unaware");
9463499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli
9563499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli        _bSequenceAware = bSequenceAware;
9663499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli    }
9763499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli}
9863499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli
9963499d4763e42d76bfd39b79871f611381d2d164Patrick Benavolibool CConfigurableDomain::getSequenceAwareness() const
10063499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli{
10163499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli    return _bSequenceAware;
10263499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli}
10363499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli
10468a912857707864bbaaff9808717813105072a6ePatrick Benavoli// From IXmlSource
10568a912857707864bbaaff9808717813105072a6ePatrick Benavolivoid CConfigurableDomain::toXml(CXmlElement& xmlElement, CXmlSerializingContext& serializingContext) const
10668a912857707864bbaaff9808717813105072a6ePatrick Benavoli{
10763499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli    // Sequence awareness
10863499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli    xmlElement.setAttributeBoolean("SequenceAware", _bSequenceAware);
10963499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli
11068a912857707864bbaaff9808717813105072a6ePatrick Benavoli    // Configurations
11168a912857707864bbaaff9808717813105072a6ePatrick Benavoli    composeDomainConfigurations(xmlElement, serializingContext);
11268a912857707864bbaaff9808717813105072a6ePatrick Benavoli
11368a912857707864bbaaff9808717813105072a6ePatrick Benavoli    // Configurable Elements
11463499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli    composeConfigurableElements(xmlElement);
11563499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli
11663499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli    // Settings
11763499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli    composeSettings(xmlElement, serializingContext);
11868a912857707864bbaaff9808717813105072a6ePatrick Benavoli}
11968a912857707864bbaaff9808717813105072a6ePatrick Benavoli
12068a912857707864bbaaff9808717813105072a6ePatrick Benavoli// XML composing
12168a912857707864bbaaff9808717813105072a6ePatrick Benavolivoid CConfigurableDomain::composeDomainConfigurations(CXmlElement& xmlElement, CXmlSerializingContext& serializingContext) const
12268a912857707864bbaaff9808717813105072a6ePatrick Benavoli{
12368a912857707864bbaaff9808717813105072a6ePatrick Benavoli    // Create Configurations element
12468a912857707864bbaaff9808717813105072a6ePatrick Benavoli    CXmlElement xmlConfigurationsElement;
12568a912857707864bbaaff9808717813105072a6ePatrick Benavoli
12668a912857707864bbaaff9808717813105072a6ePatrick Benavoli    xmlElement.createChild(xmlConfigurationsElement, "Configurations");
12768a912857707864bbaaff9808717813105072a6ePatrick Benavoli
12868a912857707864bbaaff9808717813105072a6ePatrick Benavoli    // Delegate to base
12968a912857707864bbaaff9808717813105072a6ePatrick Benavoli    base::toXml(xmlConfigurationsElement, serializingContext);
13068a912857707864bbaaff9808717813105072a6ePatrick Benavoli}
13168a912857707864bbaaff9808717813105072a6ePatrick Benavoli
13263499d4763e42d76bfd39b79871f611381d2d164Patrick Benavolivoid CConfigurableDomain::composeConfigurableElements(CXmlElement& xmlElement) const
13368a912857707864bbaaff9808717813105072a6ePatrick Benavoli{
13468a912857707864bbaaff9808717813105072a6ePatrick Benavoli    // Create ConfigurableElements element
13568a912857707864bbaaff9808717813105072a6ePatrick Benavoli    CXmlElement xmlConfigurableElementsElement;
13668a912857707864bbaaff9808717813105072a6ePatrick Benavoli
13768a912857707864bbaaff9808717813105072a6ePatrick Benavoli    xmlElement.createChild(xmlConfigurableElementsElement, "ConfigurableElements");
13868a912857707864bbaaff9808717813105072a6ePatrick Benavoli
13968a912857707864bbaaff9808717813105072a6ePatrick Benavoli    // Serialize out all configurable elements settings
14068a912857707864bbaaff9808717813105072a6ePatrick Benavoli    ConfigurableElementListIterator it;
14168a912857707864bbaaff9808717813105072a6ePatrick Benavoli
14268a912857707864bbaaff9808717813105072a6ePatrick Benavoli    for (it = _configurableElementList.begin(); it != _configurableElementList.end(); ++it) {
14368a912857707864bbaaff9808717813105072a6ePatrick Benavoli
14468a912857707864bbaaff9808717813105072a6ePatrick Benavoli        const CConfigurableElement* pConfigurableElement = *it;
14568a912857707864bbaaff9808717813105072a6ePatrick Benavoli
14668a912857707864bbaaff9808717813105072a6ePatrick Benavoli        // Create corresponding XML child element
14768a912857707864bbaaff9808717813105072a6ePatrick Benavoli        CXmlElement xmlChildConfigurableElement;
14868a912857707864bbaaff9808717813105072a6ePatrick Benavoli
14968a912857707864bbaaff9808717813105072a6ePatrick Benavoli        xmlConfigurableElementsElement.createChild(xmlChildConfigurableElement, "ConfigurableElement");
15068a912857707864bbaaff9808717813105072a6ePatrick Benavoli
15168a912857707864bbaaff9808717813105072a6ePatrick Benavoli        // Set Path attribute
15268a912857707864bbaaff9808717813105072a6ePatrick Benavoli        xmlChildConfigurableElement.setAttributeString("Path", pConfigurableElement->getPath());
15368a912857707864bbaaff9808717813105072a6ePatrick Benavoli    }
15468a912857707864bbaaff9808717813105072a6ePatrick Benavoli}
15568a912857707864bbaaff9808717813105072a6ePatrick Benavoli
15663499d4763e42d76bfd39b79871f611381d2d164Patrick Benavolivoid CConfigurableDomain::composeSettings(CXmlElement& xmlElement, CXmlSerializingContext& serializingContext) const
15768a912857707864bbaaff9808717813105072a6ePatrick Benavoli{
15863499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli    // Context
15963499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli    const CXmlDomainSerializingContext& xmlDomainSerializingContext = static_cast<const CXmlDomainSerializingContext&>(serializingContext);
16063499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli
16163499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli    if (!xmlDomainSerializingContext.withSettings()) {
16263499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli
16363499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli        return;
16463499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli    }
16563499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli
16663499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli    // Create Settings element
16763499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli    CXmlElement xmlSettingsElement;
16863499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli
16963499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli    xmlElement.createChild(xmlSettingsElement, "Settings");
17063499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli
17163499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli    // Serialize out all configurations settings
17268a912857707864bbaaff9808717813105072a6ePatrick Benavoli    uint32_t uiNbConfigurations = getNbChildren();
17368a912857707864bbaaff9808717813105072a6ePatrick Benavoli    uint32_t uiChildConfiguration;
17468a912857707864bbaaff9808717813105072a6ePatrick Benavoli
17568a912857707864bbaaff9808717813105072a6ePatrick Benavoli    for (uiChildConfiguration = 0; uiChildConfiguration < uiNbConfigurations; uiChildConfiguration++) {
17668a912857707864bbaaff9808717813105072a6ePatrick Benavoli
17768a912857707864bbaaff9808717813105072a6ePatrick Benavoli        const CDomainConfiguration* pDomainConfiguration = static_cast<const CDomainConfiguration*>(getChild(uiChildConfiguration));
17868a912857707864bbaaff9808717813105072a6ePatrick Benavoli
17968a912857707864bbaaff9808717813105072a6ePatrick Benavoli        // Create child xml element for that configuration
18068a912857707864bbaaff9808717813105072a6ePatrick Benavoli        CXmlElement xmlConfigurationSettingsElement;
18168a912857707864bbaaff9808717813105072a6ePatrick Benavoli
18263499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli        xmlSettingsElement.createChild(xmlConfigurationSettingsElement, pDomainConfiguration->getKind());
18368a912857707864bbaaff9808717813105072a6ePatrick Benavoli
18468a912857707864bbaaff9808717813105072a6ePatrick Benavoli        // Set its name attribute
18568a912857707864bbaaff9808717813105072a6ePatrick Benavoli        xmlConfigurationSettingsElement.setNameAttribute(pDomainConfiguration->getName());
18668a912857707864bbaaff9808717813105072a6ePatrick Benavoli
18763499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli        // Serialize out configuration settings
18863499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli        pDomainConfiguration->composeSettings(xmlConfigurationSettingsElement, serializingContext);
18968a912857707864bbaaff9808717813105072a6ePatrick Benavoli    }
19068a912857707864bbaaff9808717813105072a6ePatrick Benavoli}
19168a912857707864bbaaff9808717813105072a6ePatrick Benavoli
19268a912857707864bbaaff9808717813105072a6ePatrick Benavoli// From IXmlSink
19368a912857707864bbaaff9808717813105072a6ePatrick Benavolibool CConfigurableDomain::fromXml(const CXmlElement& xmlElement, CXmlSerializingContext& serializingContext)
19468a912857707864bbaaff9808717813105072a6ePatrick Benavoli{
19563499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli    // Context
19663499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli    CXmlDomainSerializingContext& xmlDomainSerializingContext = static_cast<CXmlDomainSerializingContext&>(serializingContext);
19763499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli
19863499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli    // Sequence awareness (optional)
19963499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli    _bSequenceAware = xmlElement.hasAttribute("SequenceAware") && xmlElement.getAttributeBoolean("SequenceAware");
20063499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli
20168a912857707864bbaaff9808717813105072a6ePatrick Benavoli    // Local parsing. Do not dig
20263499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli    if (!parseDomainConfigurations(xmlElement, serializingContext) || !parseConfigurableElements(xmlElement, serializingContext) || !parseSettings(xmlElement, serializingContext)) {
20363499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli
20463499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli        return false;
20563499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli    }
20663499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli
20763499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli    // All provided configurations are parsed
20863499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli    // Attempt validation on areas of non provided configurations for all configurable elements if required
20963499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli    if (xmlDomainSerializingContext.autoValidationRequired()) {
21063499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli
21163499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli        autoValidateAll();
21263499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli    }
21363499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli
21463499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli    return true;
21568a912857707864bbaaff9808717813105072a6ePatrick Benavoli}
21668a912857707864bbaaff9808717813105072a6ePatrick Benavoli
21768a912857707864bbaaff9808717813105072a6ePatrick Benavoli// XML parsing
21868a912857707864bbaaff9808717813105072a6ePatrick Benavolibool CConfigurableDomain::parseDomainConfigurations(const CXmlElement& xmlElement, CXmlSerializingContext& serializingContext)
21968a912857707864bbaaff9808717813105072a6ePatrick Benavoli{
22068a912857707864bbaaff9808717813105072a6ePatrick Benavoli    // We're supposedly clean
22168a912857707864bbaaff9808717813105072a6ePatrick Benavoli    assert(_configurableElementList.empty());
22268a912857707864bbaaff9808717813105072a6ePatrick Benavoli
22368a912857707864bbaaff9808717813105072a6ePatrick Benavoli    // Get Configurations element
22468a912857707864bbaaff9808717813105072a6ePatrick Benavoli    CXmlElement xmlConfigurationsElement;
22568a912857707864bbaaff9808717813105072a6ePatrick Benavoli
22668a912857707864bbaaff9808717813105072a6ePatrick Benavoli    xmlElement.getChildElement("Configurations", xmlConfigurationsElement);
22768a912857707864bbaaff9808717813105072a6ePatrick Benavoli
22868a912857707864bbaaff9808717813105072a6ePatrick Benavoli    // Parse it and create domain configuration objects
22968a912857707864bbaaff9808717813105072a6ePatrick Benavoli    return base::fromXml(xmlConfigurationsElement, serializingContext);
23068a912857707864bbaaff9808717813105072a6ePatrick Benavoli}
23168a912857707864bbaaff9808717813105072a6ePatrick Benavoli
23268a912857707864bbaaff9808717813105072a6ePatrick Benavoli// Parse configurable elements
23368a912857707864bbaaff9808717813105072a6ePatrick Benavolibool CConfigurableDomain::parseConfigurableElements(const CXmlElement& xmlElement, CXmlSerializingContext& serializingContext)
23468a912857707864bbaaff9808717813105072a6ePatrick Benavoli{
23568a912857707864bbaaff9808717813105072a6ePatrick Benavoli    // Get System Class Element
23668a912857707864bbaaff9808717813105072a6ePatrick Benavoli    CElement* pRootElement = getRoot();
23768a912857707864bbaaff9808717813105072a6ePatrick Benavoli
23868a912857707864bbaaff9808717813105072a6ePatrick Benavoli    CElement* pSystemClassElement = pRootElement->findChildOfKind("SystemClass");
23968a912857707864bbaaff9808717813105072a6ePatrick Benavoli
24068a912857707864bbaaff9808717813105072a6ePatrick Benavoli    assert(pSystemClassElement);
24168a912857707864bbaaff9808717813105072a6ePatrick Benavoli
24268a912857707864bbaaff9808717813105072a6ePatrick Benavoli    // Get ConfigurableElements element
24368a912857707864bbaaff9808717813105072a6ePatrick Benavoli    CXmlElement xmlConfigurableElementsElement;
24468a912857707864bbaaff9808717813105072a6ePatrick Benavoli    xmlElement.getChildElement("ConfigurableElements", xmlConfigurableElementsElement);
24568a912857707864bbaaff9808717813105072a6ePatrick Benavoli
24668a912857707864bbaaff9808717813105072a6ePatrick Benavoli    // Parse it and associate found configurable elements to it
24768a912857707864bbaaff9808717813105072a6ePatrick Benavoli    CXmlElement::CChildIterator it(xmlConfigurableElementsElement);
24868a912857707864bbaaff9808717813105072a6ePatrick Benavoli
24968a912857707864bbaaff9808717813105072a6ePatrick Benavoli    CXmlElement xmlConfigurableElementElement;
25068a912857707864bbaaff9808717813105072a6ePatrick Benavoli
25168a912857707864bbaaff9808717813105072a6ePatrick Benavoli    while (it.next(xmlConfigurableElementElement)) {
25268a912857707864bbaaff9808717813105072a6ePatrick Benavoli
25368a912857707864bbaaff9808717813105072a6ePatrick Benavoli        // Locate configurable element
25468a912857707864bbaaff9808717813105072a6ePatrick Benavoli        string strConfigurableElementPath = xmlConfigurableElementElement.getAttributeString("Path");
25568a912857707864bbaaff9808717813105072a6ePatrick Benavoli
25668a912857707864bbaaff9808717813105072a6ePatrick Benavoli        CPathNavigator pathNavigator(strConfigurableElementPath);
257065264a93ce9c63b6a5c95e985188ee33ba587d3Patrick Benavoli        string strError;
25868a912857707864bbaaff9808717813105072a6ePatrick Benavoli
25968a912857707864bbaaff9808717813105072a6ePatrick Benavoli        // Is there an element and does it match system class name?
260065264a93ce9c63b6a5c95e985188ee33ba587d3Patrick Benavoli        if (!pathNavigator.navigateThrough(pSystemClassElement->getName(), strError)) {
26168a912857707864bbaaff9808717813105072a6ePatrick Benavoli
262065264a93ce9c63b6a5c95e985188ee33ba587d3Patrick Benavoli            serializingContext.setError("Could not find configurable element of path " + strConfigurableElementPath + " from ConfigurableDomain description " + getName() + " (" + strError + ")");
26368a912857707864bbaaff9808717813105072a6ePatrick Benavoli
26468a912857707864bbaaff9808717813105072a6ePatrick Benavoli            return false;
26568a912857707864bbaaff9808717813105072a6ePatrick Benavoli        }
26668a912857707864bbaaff9808717813105072a6ePatrick Benavoli        // Browse system class for configurable element
26768a912857707864bbaaff9808717813105072a6ePatrick Benavoli        CConfigurableElement* pConfigurableElement = static_cast<CConfigurableElement*>(pSystemClassElement->findDescendant(pathNavigator));
26868a912857707864bbaaff9808717813105072a6ePatrick Benavoli
26968a912857707864bbaaff9808717813105072a6ePatrick Benavoli        if (!pConfigurableElement) {
27068a912857707864bbaaff9808717813105072a6ePatrick Benavoli
27168a912857707864bbaaff9808717813105072a6ePatrick Benavoli            serializingContext.setError("Could not find configurable element of path " + strConfigurableElementPath + " from ConfigurableDomain description " + getName());
27268a912857707864bbaaff9808717813105072a6ePatrick Benavoli
27368a912857707864bbaaff9808717813105072a6ePatrick Benavoli            return false;
27468a912857707864bbaaff9808717813105072a6ePatrick Benavoli        }
27568a912857707864bbaaff9808717813105072a6ePatrick Benavoli        // Add found element to domain
27668a912857707864bbaaff9808717813105072a6ePatrick Benavoli        if (!addConfigurableElement(pConfigurableElement, NULL, strError)) {
27768a912857707864bbaaff9808717813105072a6ePatrick Benavoli
27868a912857707864bbaaff9808717813105072a6ePatrick Benavoli            serializingContext.setError(strError);
27968a912857707864bbaaff9808717813105072a6ePatrick Benavoli
28068a912857707864bbaaff9808717813105072a6ePatrick Benavoli            return false;
28168a912857707864bbaaff9808717813105072a6ePatrick Benavoli        }
28268a912857707864bbaaff9808717813105072a6ePatrick Benavoli    }
28368a912857707864bbaaff9808717813105072a6ePatrick Benavoli
28468a912857707864bbaaff9808717813105072a6ePatrick Benavoli    return true;
28568a912857707864bbaaff9808717813105072a6ePatrick Benavoli}
28668a912857707864bbaaff9808717813105072a6ePatrick Benavoli
28763499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli// Parse settings
28863499d4763e42d76bfd39b79871f611381d2d164Patrick Benavolibool CConfigurableDomain::parseSettings(const CXmlElement& xmlElement, CXmlSerializingContext& serializingContext)
28968a912857707864bbaaff9808717813105072a6ePatrick Benavoli{
29068a912857707864bbaaff9808717813105072a6ePatrick Benavoli    // Context
29168a912857707864bbaaff9808717813105072a6ePatrick Benavoli    CXmlDomainSerializingContext& xmlDomainSerializingContext = static_cast<CXmlDomainSerializingContext&>(serializingContext);
29268a912857707864bbaaff9808717813105072a6ePatrick Benavoli
29363499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli    // Check we actually need to parse configuration settings
29463499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli    if (!xmlDomainSerializingContext.withSettings()) {
29568a912857707864bbaaff9808717813105072a6ePatrick Benavoli
29663499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli        // No parsing required
29763499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli        return true;
29863499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli    }
29968a912857707864bbaaff9808717813105072a6ePatrick Benavoli
30063499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli    // Get Settings element
30163499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli    CXmlElement xmlSettingsElement;
30263499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli    if (!xmlElement.getChildElement("Settings", xmlSettingsElement)) {
30368a912857707864bbaaff9808717813105072a6ePatrick Benavoli
30463499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli        // No settings, bail out successfully
30563499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli        return true;
30668a912857707864bbaaff9808717813105072a6ePatrick Benavoli    }
30768a912857707864bbaaff9808717813105072a6ePatrick Benavoli
30863499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli    // Parse configuration settings
30963499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli    CXmlElement::CChildIterator it(xmlSettingsElement);
31068a912857707864bbaaff9808717813105072a6ePatrick Benavoli
31163499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli    CXmlElement xmlConfigurationSettingsElement;
3126ba361d96bc2581667b3400f87ff89fae6449e1fPatrick Benavoli
31363499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli    while (it.next(xmlConfigurationSettingsElement)) {
31463499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli        // Get domain configuration
31563499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli        CDomainConfiguration* pDomainConfiguration = static_cast<CDomainConfiguration*>(findChild(xmlConfigurationSettingsElement.getNameAttribute()));
3166ba361d96bc2581667b3400f87ff89fae6449e1fPatrick Benavoli
31763499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli        if (!pDomainConfiguration) {
3186ba361d96bc2581667b3400f87ff89fae6449e1fPatrick Benavoli
31963499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli            xmlDomainSerializingContext.setError("Could not find domain configuration referred to by configurable domain " + getName());
3206ba361d96bc2581667b3400f87ff89fae6449e1fPatrick Benavoli
3216ba361d96bc2581667b3400f87ff89fae6449e1fPatrick Benavoli            return false;
3226ba361d96bc2581667b3400f87ff89fae6449e1fPatrick Benavoli        }
32363499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli        // Have domain configuration parse settings for all configurable elements
32463499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli        if (!pDomainConfiguration->parseSettings(xmlConfigurationSettingsElement, xmlDomainSerializingContext)) {
3256ba361d96bc2581667b3400f87ff89fae6449e1fPatrick Benavoli
3266ba361d96bc2581667b3400f87ff89fae6449e1fPatrick Benavoli            return false;
3276ba361d96bc2581667b3400f87ff89fae6449e1fPatrick Benavoli        }
3286ba361d96bc2581667b3400f87ff89fae6449e1fPatrick Benavoli    }
3296ba361d96bc2581667b3400f87ff89fae6449e1fPatrick Benavoli
33068a912857707864bbaaff9808717813105072a6ePatrick Benavoli    return true;
33168a912857707864bbaaff9808717813105072a6ePatrick Benavoli}
33268a912857707864bbaaff9808717813105072a6ePatrick Benavoli// Configurable elements association
33368a912857707864bbaaff9808717813105072a6ePatrick Benavolibool CConfigurableDomain::addConfigurableElement(CConfigurableElement* pConfigurableElement, const CParameterBlackboard* pMainBlackboard, string& strError)
33468a912857707864bbaaff9808717813105072a6ePatrick Benavoli{
33568a912857707864bbaaff9808717813105072a6ePatrick Benavoli    // Already associated?
33668a912857707864bbaaff9808717813105072a6ePatrick Benavoli    if (containsConfigurableElement(pConfigurableElement)) {
33768a912857707864bbaaff9808717813105072a6ePatrick Benavoli
33868a912857707864bbaaff9808717813105072a6ePatrick Benavoli        strError = "Configurable element " + pConfigurableElement->getPath() + " already associated to configuration domain " + getName();
33968a912857707864bbaaff9808717813105072a6ePatrick Benavoli
34068a912857707864bbaaff9808717813105072a6ePatrick Benavoli        return false;
34168a912857707864bbaaff9808717813105072a6ePatrick Benavoli    }
34268a912857707864bbaaff9808717813105072a6ePatrick Benavoli
34368a912857707864bbaaff9808717813105072a6ePatrick Benavoli    // Already owned?
34468a912857707864bbaaff9808717813105072a6ePatrick Benavoli    if (pConfigurableElement->belongsTo(this)) {
34568a912857707864bbaaff9808717813105072a6ePatrick Benavoli
34668a912857707864bbaaff9808717813105072a6ePatrick Benavoli        strError = "Configurable element " + pConfigurableElement->getPath() + " already owned by configuration domain " + getName();
34768a912857707864bbaaff9808717813105072a6ePatrick Benavoli
34868a912857707864bbaaff9808717813105072a6ePatrick Benavoli        return false;
34968a912857707864bbaaff9808717813105072a6ePatrick Benavoli    }
350ace81f873b910493ab884dc5a6a38ba6ec3d56d3Kevin Rocard    log_info("Adding configurable element \"%s\" into domain \"%s\"", pConfigurableElement->getPath().c_str(), getName().c_str());
35168a912857707864bbaaff9808717813105072a6ePatrick Benavoli
35268a912857707864bbaaff9808717813105072a6ePatrick Benavoli    // Do add
3539620e44c6c7605bf589f60331eb5b05b71336853Frédéric Boisnard    doAddConfigurableElement(pConfigurableElement, pMainBlackboard);
35468a912857707864bbaaff9808717813105072a6ePatrick Benavoli
35568a912857707864bbaaff9808717813105072a6ePatrick Benavoli    return true;
35668a912857707864bbaaff9808717813105072a6ePatrick Benavoli}
35768a912857707864bbaaff9808717813105072a6ePatrick Benavoli
35868a912857707864bbaaff9808717813105072a6ePatrick Benavolibool CConfigurableDomain::removeConfigurableElement(CConfigurableElement* pConfigurableElement, string& strError)
35968a912857707864bbaaff9808717813105072a6ePatrick Benavoli{
36068a912857707864bbaaff9808717813105072a6ePatrick Benavoli    // Not associated?
36168a912857707864bbaaff9808717813105072a6ePatrick Benavoli    if (!containsConfigurableElement(pConfigurableElement)) {
36268a912857707864bbaaff9808717813105072a6ePatrick Benavoli
36368a912857707864bbaaff9808717813105072a6ePatrick Benavoli        strError = "Configurable element " + pConfigurableElement->getPath() + " not associated to configuration domain " + getName();
36468a912857707864bbaaff9808717813105072a6ePatrick Benavoli
36568a912857707864bbaaff9808717813105072a6ePatrick Benavoli        return false;
36668a912857707864bbaaff9808717813105072a6ePatrick Benavoli    }
367ace81f873b910493ab884dc5a6a38ba6ec3d56d3Kevin Rocard    log_info("Removing configurable element \"%s\" from domain \"%s\"", pConfigurableElement->getPath().c_str(), getName().c_str());
36868a912857707864bbaaff9808717813105072a6ePatrick Benavoli
36968a912857707864bbaaff9808717813105072a6ePatrick Benavoli    // Do remove
37068a912857707864bbaaff9808717813105072a6ePatrick Benavoli    doRemoveConfigurableElement(pConfigurableElement, true);
37168a912857707864bbaaff9808717813105072a6ePatrick Benavoli
37268a912857707864bbaaff9808717813105072a6ePatrick Benavoli    return true;
37368a912857707864bbaaff9808717813105072a6ePatrick Benavoli}
37468a912857707864bbaaff9808717813105072a6ePatrick Benavoli
37568a912857707864bbaaff9808717813105072a6ePatrick Benavoli// Domain splitting
37668a912857707864bbaaff9808717813105072a6ePatrick Benavolibool CConfigurableDomain::split(CConfigurableElement* pConfigurableElement, string& strError)
37768a912857707864bbaaff9808717813105072a6ePatrick Benavoli{
37868a912857707864bbaaff9808717813105072a6ePatrick Benavoli    // Not associated?
37968a912857707864bbaaff9808717813105072a6ePatrick Benavoli    if (!containsConfigurableElement(pConfigurableElement)) {
38068a912857707864bbaaff9808717813105072a6ePatrick Benavoli
38168a912857707864bbaaff9808717813105072a6ePatrick Benavoli        strError = "Configurable element " + pConfigurableElement->getPath() + " not associated to configuration domain " + getName();
38268a912857707864bbaaff9808717813105072a6ePatrick Benavoli
38368a912857707864bbaaff9808717813105072a6ePatrick Benavoli        return false;
38468a912857707864bbaaff9808717813105072a6ePatrick Benavoli    }
385ace81f873b910493ab884dc5a6a38ba6ec3d56d3Kevin Rocard    log_info("Splitting configurable element \"%s\" domain \"%s\"", pConfigurableElement->getPath().c_str(), getName().c_str());
38668a912857707864bbaaff9808717813105072a6ePatrick Benavoli
38768a912857707864bbaaff9808717813105072a6ePatrick Benavoli    // Create sub domain areas for all configurable element's children
38868a912857707864bbaaff9808717813105072a6ePatrick Benavoli    uint32_t uiNbConfigurableElementChildren = pConfigurableElement->getNbChildren();
38968a912857707864bbaaff9808717813105072a6ePatrick Benavoli
39068a912857707864bbaaff9808717813105072a6ePatrick Benavoli    if (!uiNbConfigurableElementChildren) {
39168a912857707864bbaaff9808717813105072a6ePatrick Benavoli
39268a912857707864bbaaff9808717813105072a6ePatrick Benavoli        strError = "Configurable element " + pConfigurableElement->getPath() + " has no children to split configurable domain to";
39368a912857707864bbaaff9808717813105072a6ePatrick Benavoli
39468a912857707864bbaaff9808717813105072a6ePatrick Benavoli        return false;
39568a912857707864bbaaff9808717813105072a6ePatrick Benavoli    }
39668a912857707864bbaaff9808717813105072a6ePatrick Benavoli
39768a912857707864bbaaff9808717813105072a6ePatrick Benavoli    uint32_t uiChild;
39868a912857707864bbaaff9808717813105072a6ePatrick Benavoli
39968a912857707864bbaaff9808717813105072a6ePatrick Benavoli    for (uiChild = 0; uiChild < uiNbConfigurableElementChildren; uiChild++) {
40068a912857707864bbaaff9808717813105072a6ePatrick Benavoli
40168a912857707864bbaaff9808717813105072a6ePatrick Benavoli        CConfigurableElement* pChildConfigurableElement = static_cast<CConfigurableElement*>(pConfigurableElement->getChild(uiChild));
40268a912857707864bbaaff9808717813105072a6ePatrick Benavoli
40368a912857707864bbaaff9808717813105072a6ePatrick Benavoli        doAddConfigurableElement(pChildConfigurableElement);
40468a912857707864bbaaff9808717813105072a6ePatrick Benavoli    }
40568a912857707864bbaaff9808717813105072a6ePatrick Benavoli
40668a912857707864bbaaff9808717813105072a6ePatrick Benavoli    // Delegate to configurations
40768a912857707864bbaaff9808717813105072a6ePatrick Benavoli    uint32_t uiNbConfigurations = getNbChildren();
40868a912857707864bbaaff9808717813105072a6ePatrick Benavoli
40968a912857707864bbaaff9808717813105072a6ePatrick Benavoli    for (uiChild = 0; uiChild < uiNbConfigurations; uiChild++) {
41068a912857707864bbaaff9808717813105072a6ePatrick Benavoli
41168a912857707864bbaaff9808717813105072a6ePatrick Benavoli        CDomainConfiguration* pDomainConfiguration = static_cast<CDomainConfiguration*>(getChild(uiChild));
41268a912857707864bbaaff9808717813105072a6ePatrick Benavoli
41368a912857707864bbaaff9808717813105072a6ePatrick Benavoli        pDomainConfiguration->split(pConfigurableElement);
41468a912857707864bbaaff9808717813105072a6ePatrick Benavoli    }
41568a912857707864bbaaff9808717813105072a6ePatrick Benavoli
41668a912857707864bbaaff9808717813105072a6ePatrick Benavoli    // Remove given configurable element from this domain
41768a912857707864bbaaff9808717813105072a6ePatrick Benavoli    // Note: we shouldn't need to recompute the sync set in that case, as the splitted element should include the syncers of its children elements
41868a912857707864bbaaff9808717813105072a6ePatrick Benavoli    doRemoveConfigurableElement(pConfigurableElement, false);
41968a912857707864bbaaff9808717813105072a6ePatrick Benavoli
42068a912857707864bbaaff9808717813105072a6ePatrick Benavoli    return true;
42168a912857707864bbaaff9808717813105072a6ePatrick Benavoli}
42268a912857707864bbaaff9808717813105072a6ePatrick Benavoli
4238b243f50a38a26e6b373287e07cb7e4743a8cd28Frédéric Boisnard// Check if there is a pending configuration for this domain: i.e. an applicable configuration different from the last applied configuration
4248b243f50a38a26e6b373287e07cb7e4743a8cd28Frédéric Boisnardconst CDomainConfiguration* CConfigurableDomain::getPendingConfiguration() const
4258b243f50a38a26e6b373287e07cb7e4743a8cd28Frédéric Boisnard{
4268b243f50a38a26e6b373287e07cb7e4743a8cd28Frédéric Boisnard    const CDomainConfiguration* pApplicableDomainConfiguration = findApplicableDomainConfiguration();
4278b243f50a38a26e6b373287e07cb7e4743a8cd28Frédéric Boisnard
4288b243f50a38a26e6b373287e07cb7e4743a8cd28Frédéric Boisnard    if (pApplicableDomainConfiguration) {
4298b243f50a38a26e6b373287e07cb7e4743a8cd28Frédéric Boisnard
4308b243f50a38a26e6b373287e07cb7e4743a8cd28Frédéric Boisnard        // Check not the last one before applying
4318b243f50a38a26e6b373287e07cb7e4743a8cd28Frédéric Boisnard        if (!_pLastAppliedConfiguration || (_pLastAppliedConfiguration != pApplicableDomainConfiguration)) {
4328b243f50a38a26e6b373287e07cb7e4743a8cd28Frédéric Boisnard
4338b243f50a38a26e6b373287e07cb7e4743a8cd28Frédéric Boisnard            return pApplicableDomainConfiguration;
4348b243f50a38a26e6b373287e07cb7e4743a8cd28Frédéric Boisnard        }
4358b243f50a38a26e6b373287e07cb7e4743a8cd28Frédéric Boisnard    }
4368b243f50a38a26e6b373287e07cb7e4743a8cd28Frédéric Boisnard
4378b243f50a38a26e6b373287e07cb7e4743a8cd28Frédéric Boisnard    return NULL;
4388b243f50a38a26e6b373287e07cb7e4743a8cd28Frédéric Boisnard}
4398b243f50a38a26e6b373287e07cb7e4743a8cd28Frédéric Boisnard
44068a912857707864bbaaff9808717813105072a6ePatrick Benavoli// Configuration application if required
441f2fd15a331fd3b5b63f0dc6f492651330adcedf9Guillaume Denneulinvoid CConfigurableDomain::apply(CParameterBlackboard* pParameterBlackboard, CSyncerSet* pSyncerSet, bool bForce) const
44268a912857707864bbaaff9808717813105072a6ePatrick Benavoli{
443f2fd15a331fd3b5b63f0dc6f492651330adcedf9Guillaume Denneulin    // Apply configuration only if the blackboard will
444f2fd15a331fd3b5b63f0dc6f492651330adcedf9Guillaume Denneulin    // be synchronized either now or by syncerSet.
445f2fd15a331fd3b5b63f0dc6f492651330adcedf9Guillaume Denneulin    if(!pSyncerSet ^ _bSequenceAware) {
446f2fd15a331fd3b5b63f0dc6f492651330adcedf9Guillaume Denneulin        // The configuration can not be syncronised
447f2fd15a331fd3b5b63f0dc6f492651330adcedf9Guillaume Denneulin        return;
448f2fd15a331fd3b5b63f0dc6f492651330adcedf9Guillaume Denneulin    }
449f2fd15a331fd3b5b63f0dc6f492651330adcedf9Guillaume Denneulin
45068a912857707864bbaaff9808717813105072a6ePatrick Benavoli    if (bForce) {
45168a912857707864bbaaff9808717813105072a6ePatrick Benavoli        // Force a configuration restore by forgetting about last applied configuration
45268a912857707864bbaaff9808717813105072a6ePatrick Benavoli        _pLastAppliedConfiguration = NULL;
45368a912857707864bbaaff9808717813105072a6ePatrick Benavoli    }
45468a912857707864bbaaff9808717813105072a6ePatrick Benavoli    const CDomainConfiguration* pApplicableDomainConfiguration = findApplicableDomainConfiguration();
45568a912857707864bbaaff9808717813105072a6ePatrick Benavoli
45668a912857707864bbaaff9808717813105072a6ePatrick Benavoli    if (pApplicableDomainConfiguration) {
45768a912857707864bbaaff9808717813105072a6ePatrick Benavoli
45868a912857707864bbaaff9808717813105072a6ePatrick Benavoli        // Check not the last one before applying
45968a912857707864bbaaff9808717813105072a6ePatrick Benavoli        if (!_pLastAppliedConfiguration || _pLastAppliedConfiguration != pApplicableDomainConfiguration) {
46068a912857707864bbaaff9808717813105072a6ePatrick Benavoli
461f2fd15a331fd3b5b63f0dc6f492651330adcedf9Guillaume Denneulin            log_info("Applying configuration \"%s\" from domain \"%s\"",
462f2fd15a331fd3b5b63f0dc6f492651330adcedf9Guillaume Denneulin                     pApplicableDomainConfiguration->getName().c_str(),
463f2fd15a331fd3b5b63f0dc6f492651330adcedf9Guillaume Denneulin                     getName().c_str());
464f2fd15a331fd3b5b63f0dc6f492651330adcedf9Guillaume Denneulin
465f2fd15a331fd3b5b63f0dc6f492651330adcedf9Guillaume Denneulin            // Check if we need to synchronize during restore
466f2fd15a331fd3b5b63f0dc6f492651330adcedf9Guillaume Denneulin            bool bSync = !pSyncerSet && _bSequenceAware;
46768a912857707864bbaaff9808717813105072a6ePatrick Benavoli
46868a912857707864bbaaff9808717813105072a6ePatrick Benavoli            // Do the restore
469f2fd15a331fd3b5b63f0dc6f492651330adcedf9Guillaume Denneulin            pApplicableDomainConfiguration->restore(pParameterBlackboard, bSync, NULL);
47068a912857707864bbaaff9808717813105072a6ePatrick Benavoli
47168a912857707864bbaaff9808717813105072a6ePatrick Benavoli            // Record last applied configuration
47268a912857707864bbaaff9808717813105072a6ePatrick Benavoli            _pLastAppliedConfiguration = pApplicableDomainConfiguration;
47368a912857707864bbaaff9808717813105072a6ePatrick Benavoli
474f2fd15a331fd3b5b63f0dc6f492651330adcedf9Guillaume Denneulin            // Check we need to provide syncer set to caller
475f2fd15a331fd3b5b63f0dc6f492651330adcedf9Guillaume Denneulin            if (pSyncerSet && !_bSequenceAware) {
47663499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli
47763499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli                // Since we applied changes, add our own sync set to the given one
478f2fd15a331fd3b5b63f0dc6f492651330adcedf9Guillaume Denneulin                *pSyncerSet += _syncerSet;
47963499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli            }
48068a912857707864bbaaff9808717813105072a6ePatrick Benavoli        }
48168a912857707864bbaaff9808717813105072a6ePatrick Benavoli    }
48268a912857707864bbaaff9808717813105072a6ePatrick Benavoli}
48368a912857707864bbaaff9808717813105072a6ePatrick Benavoli
48468a912857707864bbaaff9808717813105072a6ePatrick Benavoli// Return applicable configuration validity for given configurable element
48568a912857707864bbaaff9808717813105072a6ePatrick Benavolibool CConfigurableDomain::isApplicableConfigurationValid(const CConfigurableElement* pConfigurableElement) const
48668a912857707864bbaaff9808717813105072a6ePatrick Benavoli{
48768a912857707864bbaaff9808717813105072a6ePatrick Benavoli    const CDomainConfiguration* pApplicableDomainConfiguration = findApplicableDomainConfiguration();
48868a912857707864bbaaff9808717813105072a6ePatrick Benavoli
48968a912857707864bbaaff9808717813105072a6ePatrick Benavoli    return pApplicableDomainConfiguration && pApplicableDomainConfiguration->isValid(pConfigurableElement);
49068a912857707864bbaaff9808717813105072a6ePatrick Benavoli}
49168a912857707864bbaaff9808717813105072a6ePatrick Benavoli
49268a912857707864bbaaff9808717813105072a6ePatrick Benavoli// In case configurable element was removed
49368a912857707864bbaaff9808717813105072a6ePatrick Benavolivoid CConfigurableDomain::computeSyncSet()
49468a912857707864bbaaff9808717813105072a6ePatrick Benavoli{
49568a912857707864bbaaff9808717813105072a6ePatrick Benavoli    // Clean sync set first
49663499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli    _syncerSet.clear();
49768a912857707864bbaaff9808717813105072a6ePatrick Benavoli
49863499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli    // Add syncer sets for all associated configurable elements
49963499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli    ConfigurableElementToSyncerSetMapIterator mapIt;
50068a912857707864bbaaff9808717813105072a6ePatrick Benavoli
50163499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli    for (mapIt = _configurableElementToSyncerSetMap.begin(); mapIt != _configurableElementToSyncerSetMap.end(); ++mapIt) {
50268a912857707864bbaaff9808717813105072a6ePatrick Benavoli
50363499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli        const CSyncerSet* pSyncerSet = mapIt->second;
50468a912857707864bbaaff9808717813105072a6ePatrick Benavoli
50563499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli        _syncerSet += *pSyncerSet;
50668a912857707864bbaaff9808717813105072a6ePatrick Benavoli    }
50768a912857707864bbaaff9808717813105072a6ePatrick Benavoli}
50868a912857707864bbaaff9808717813105072a6ePatrick Benavoli
50968a912857707864bbaaff9808717813105072a6ePatrick Benavoli// Configuration Management
51068a912857707864bbaaff9808717813105072a6ePatrick Benavolibool CConfigurableDomain::createConfiguration(const string& strName, const CParameterBlackboard* pMainBlackboard, string& strError)
51168a912857707864bbaaff9808717813105072a6ePatrick Benavoli{
51268a912857707864bbaaff9808717813105072a6ePatrick Benavoli    // Already exists?
51368a912857707864bbaaff9808717813105072a6ePatrick Benavoli    if (findChild(strName)) {
51468a912857707864bbaaff9808717813105072a6ePatrick Benavoli
51568a912857707864bbaaff9808717813105072a6ePatrick Benavoli        strError = "Already existing configuration";
51668a912857707864bbaaff9808717813105072a6ePatrick Benavoli
51768a912857707864bbaaff9808717813105072a6ePatrick Benavoli        return false;
51868a912857707864bbaaff9808717813105072a6ePatrick Benavoli    }
519ace81f873b910493ab884dc5a6a38ba6ec3d56d3Kevin Rocard    log_info("Creating domain configuration \"%s\" into domain \"%s\"", strName.c_str(), getName().c_str());
52068a912857707864bbaaff9808717813105072a6ePatrick Benavoli
52168a912857707864bbaaff9808717813105072a6ePatrick Benavoli    // Creation
52268a912857707864bbaaff9808717813105072a6ePatrick Benavoli    CDomainConfiguration* pDomainConfiguration = new CDomainConfiguration(strName);
52368a912857707864bbaaff9808717813105072a6ePatrick Benavoli
52468a912857707864bbaaff9808717813105072a6ePatrick Benavoli    // Configurable elements association
52568a912857707864bbaaff9808717813105072a6ePatrick Benavoli    ConfigurableElementListIterator it;
52668a912857707864bbaaff9808717813105072a6ePatrick Benavoli
52768a912857707864bbaaff9808717813105072a6ePatrick Benavoli    for (it = _configurableElementList.begin(); it != _configurableElementList.end(); ++it) {
52868a912857707864bbaaff9808717813105072a6ePatrick Benavoli
52963499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli        const CConfigurableElement* pConfigurableElement = *it;;
53063499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli
53163499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli        // Retrieve associated syncer set
53263499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli        CSyncerSet* pSyncerSet = getSyncerSet(pConfigurableElement);
53363499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli
53463499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli        // Associate to configuration
53563499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli        pDomainConfiguration->addConfigurableElement(pConfigurableElement, pSyncerSet);
53668a912857707864bbaaff9808717813105072a6ePatrick Benavoli    }
53768a912857707864bbaaff9808717813105072a6ePatrick Benavoli
53868a912857707864bbaaff9808717813105072a6ePatrick Benavoli    // Hierarchy
53968a912857707864bbaaff9808717813105072a6ePatrick Benavoli    addChild(pDomainConfiguration);
54068a912857707864bbaaff9808717813105072a6ePatrick Benavoli
54168a912857707864bbaaff9808717813105072a6ePatrick Benavoli    // Ensure validity of fresh new domain configuration
54268a912857707864bbaaff9808717813105072a6ePatrick Benavoli    // Attempt auto validation, so that the user gets his/her own settings by defaults
54368a912857707864bbaaff9808717813105072a6ePatrick Benavoli    if (!autoValidateConfiguration(pDomainConfiguration)) {
54468a912857707864bbaaff9808717813105072a6ePatrick Benavoli
54568a912857707864bbaaff9808717813105072a6ePatrick Benavoli        // No valid configuration found to copy in from, validate againt main blackboard (will concerned remaining invalid parts)
54668a912857707864bbaaff9808717813105072a6ePatrick Benavoli        pDomainConfiguration->validate(pMainBlackboard);
54768a912857707864bbaaff9808717813105072a6ePatrick Benavoli    }
54868a912857707864bbaaff9808717813105072a6ePatrick Benavoli
54968a912857707864bbaaff9808717813105072a6ePatrick Benavoli    return true;
55068a912857707864bbaaff9808717813105072a6ePatrick Benavoli}
55168a912857707864bbaaff9808717813105072a6ePatrick Benavoli
55268a912857707864bbaaff9808717813105072a6ePatrick Benavolibool CConfigurableDomain::deleteConfiguration(const string& strName, string& strError)
55368a912857707864bbaaff9808717813105072a6ePatrick Benavoli{
5540bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli    CDomainConfiguration* pDomainConfiguration = findConfiguration(strName, strError);
55568a912857707864bbaaff9808717813105072a6ePatrick Benavoli
55668a912857707864bbaaff9808717813105072a6ePatrick Benavoli    if (!pDomainConfiguration) {
55768a912857707864bbaaff9808717813105072a6ePatrick Benavoli
55868a912857707864bbaaff9808717813105072a6ePatrick Benavoli        return false;
55968a912857707864bbaaff9808717813105072a6ePatrick Benavoli    }
56068a912857707864bbaaff9808717813105072a6ePatrick Benavoli
561ace81f873b910493ab884dc5a6a38ba6ec3d56d3Kevin Rocard    log_info("Deleting configuration \"%s\" from domain \"%s\"", strName.c_str(), getName().c_str());
56268a912857707864bbaaff9808717813105072a6ePatrick Benavoli
56368a912857707864bbaaff9808717813105072a6ePatrick Benavoli    // Was the last applied?
56468a912857707864bbaaff9808717813105072a6ePatrick Benavoli    if (pDomainConfiguration == _pLastAppliedConfiguration) {
56568a912857707864bbaaff9808717813105072a6ePatrick Benavoli
56668a912857707864bbaaff9808717813105072a6ePatrick Benavoli        // Forget about it
56768a912857707864bbaaff9808717813105072a6ePatrick Benavoli        _pLastAppliedConfiguration = NULL;
56868a912857707864bbaaff9808717813105072a6ePatrick Benavoli    }
56968a912857707864bbaaff9808717813105072a6ePatrick Benavoli
57068a912857707864bbaaff9808717813105072a6ePatrick Benavoli    // Hierarchy
57168a912857707864bbaaff9808717813105072a6ePatrick Benavoli    removeChild(pDomainConfiguration);
57268a912857707864bbaaff9808717813105072a6ePatrick Benavoli
57368a912857707864bbaaff9808717813105072a6ePatrick Benavoli    // Destroy
57468a912857707864bbaaff9808717813105072a6ePatrick Benavoli    delete pDomainConfiguration;
57568a912857707864bbaaff9808717813105072a6ePatrick Benavoli
57668a912857707864bbaaff9808717813105072a6ePatrick Benavoli    return true;
57768a912857707864bbaaff9808717813105072a6ePatrick Benavoli}
57868a912857707864bbaaff9808717813105072a6ePatrick Benavoli
57968a912857707864bbaaff9808717813105072a6ePatrick Benavolivoid CConfigurableDomain::listAssociatedToElements(string& strResult) const
58068a912857707864bbaaff9808717813105072a6ePatrick Benavoli{
58168a912857707864bbaaff9808717813105072a6ePatrick Benavoli    strResult = "\n";
58268a912857707864bbaaff9808717813105072a6ePatrick Benavoli
58368a912857707864bbaaff9808717813105072a6ePatrick Benavoli    ConfigurableElementListIterator it;
58468a912857707864bbaaff9808717813105072a6ePatrick Benavoli
58568a912857707864bbaaff9808717813105072a6ePatrick Benavoli    // Browse all configurable elements
58668a912857707864bbaaff9808717813105072a6ePatrick Benavoli    for (it = _configurableElementList.begin(); it != _configurableElementList.end(); ++it) {
58768a912857707864bbaaff9808717813105072a6ePatrick Benavoli
58868a912857707864bbaaff9808717813105072a6ePatrick Benavoli        const CConfigurableElement* pConfigurableElement = *it;
58968a912857707864bbaaff9808717813105072a6ePatrick Benavoli
59068a912857707864bbaaff9808717813105072a6ePatrick Benavoli        strResult += pConfigurableElement->getPath() + "\n";
59168a912857707864bbaaff9808717813105072a6ePatrick Benavoli    }
59268a912857707864bbaaff9808717813105072a6ePatrick Benavoli}
59368a912857707864bbaaff9808717813105072a6ePatrick Benavoli
59468a912857707864bbaaff9808717813105072a6ePatrick Benavolibool CConfigurableDomain::renameConfiguration(const string& strName, const string& strNewName, string& strError)
59568a912857707864bbaaff9808717813105072a6ePatrick Benavoli{
5960bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli    CDomainConfiguration* pDomainConfiguration = findConfiguration(strName, strError);
59768a912857707864bbaaff9808717813105072a6ePatrick Benavoli
59868a912857707864bbaaff9808717813105072a6ePatrick Benavoli    if (!pDomainConfiguration) {
59968a912857707864bbaaff9808717813105072a6ePatrick Benavoli
60068a912857707864bbaaff9808717813105072a6ePatrick Benavoli        return false;
60168a912857707864bbaaff9808717813105072a6ePatrick Benavoli    }
602ace81f873b910493ab884dc5a6a38ba6ec3d56d3Kevin Rocard    log_info("Renaming domain \"%s\"'s configuration \"%s\" to \"%s\"", getName().c_str(), strName.c_str(), strNewName.c_str());
60368a912857707864bbaaff9808717813105072a6ePatrick Benavoli
60468a912857707864bbaaff9808717813105072a6ePatrick Benavoli    // Rename
60568a912857707864bbaaff9808717813105072a6ePatrick Benavoli    return pDomainConfiguration->rename(strNewName, strError);
60668a912857707864bbaaff9808717813105072a6ePatrick Benavoli}
60768a912857707864bbaaff9808717813105072a6ePatrick Benavoli
608ace81f873b910493ab884dc5a6a38ba6ec3d56d3Kevin Rocardbool CConfigurableDomain::restoreConfiguration(const string& strName, CParameterBlackboard* pMainBlackboard, bool bAutoSync, list<string>& lstrError) const
60968a912857707864bbaaff9808717813105072a6ePatrick Benavoli{
610ace81f873b910493ab884dc5a6a38ba6ec3d56d3Kevin Rocard    string strError;
611ace81f873b910493ab884dc5a6a38ba6ec3d56d3Kevin Rocard
6120bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli    const CDomainConfiguration* pDomainConfiguration = findConfiguration(strName, strError);
61368a912857707864bbaaff9808717813105072a6ePatrick Benavoli
61468a912857707864bbaaff9808717813105072a6ePatrick Benavoli    if (!pDomainConfiguration) {
61568a912857707864bbaaff9808717813105072a6ePatrick Benavoli
616ace81f873b910493ab884dc5a6a38ba6ec3d56d3Kevin Rocard        lstrError.push_back(strError);
61768a912857707864bbaaff9808717813105072a6ePatrick Benavoli        return false;
61868a912857707864bbaaff9808717813105072a6ePatrick Benavoli    }
619ace81f873b910493ab884dc5a6a38ba6ec3d56d3Kevin Rocard    log_info("Restoring domain \"%s\"'s configuration \"%s\" to parameter blackboard", getName().c_str(), pDomainConfiguration->getName().c_str());
62068a912857707864bbaaff9808717813105072a6ePatrick Benavoli
62168a912857707864bbaaff9808717813105072a6ePatrick Benavoli    // Delegate
622ace81f873b910493ab884dc5a6a38ba6ec3d56d3Kevin Rocard    bool bSuccess = pDomainConfiguration->restore(pMainBlackboard, bAutoSync && _bSequenceAware, &lstrError);
62368a912857707864bbaaff9808717813105072a6ePatrick Benavoli
62468a912857707864bbaaff9808717813105072a6ePatrick Benavoli    // Record last applied configuration
62568a912857707864bbaaff9808717813105072a6ePatrick Benavoli    _pLastAppliedConfiguration = pDomainConfiguration;
62668a912857707864bbaaff9808717813105072a6ePatrick Benavoli
62768a912857707864bbaaff9808717813105072a6ePatrick Benavoli    // Synchronize
628ace81f873b910493ab884dc5a6a38ba6ec3d56d3Kevin Rocard    if (bAutoSync && !_bSequenceAware) {
629ace81f873b910493ab884dc5a6a38ba6ec3d56d3Kevin Rocard
630ace81f873b910493ab884dc5a6a38ba6ec3d56d3Kevin Rocard        bSuccess &= _syncerSet.sync(*pMainBlackboard, false, &lstrError);
631ace81f873b910493ab884dc5a6a38ba6ec3d56d3Kevin Rocard    }
632ace81f873b910493ab884dc5a6a38ba6ec3d56d3Kevin Rocard    return bSuccess;
63368a912857707864bbaaff9808717813105072a6ePatrick Benavoli}
63468a912857707864bbaaff9808717813105072a6ePatrick Benavoli
63568a912857707864bbaaff9808717813105072a6ePatrick Benavolibool CConfigurableDomain::saveConfiguration(const string& strName, const CParameterBlackboard* pMainBlackboard, string& strError)
63668a912857707864bbaaff9808717813105072a6ePatrick Benavoli{
63768a912857707864bbaaff9808717813105072a6ePatrick Benavoli    // Find Domain configuration
6380bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli    CDomainConfiguration* pDomainConfiguration = findConfiguration(strName, strError);
63968a912857707864bbaaff9808717813105072a6ePatrick Benavoli
64068a912857707864bbaaff9808717813105072a6ePatrick Benavoli    if (!pDomainConfiguration) {
64168a912857707864bbaaff9808717813105072a6ePatrick Benavoli
64268a912857707864bbaaff9808717813105072a6ePatrick Benavoli        return false;
64368a912857707864bbaaff9808717813105072a6ePatrick Benavoli    }
644ace81f873b910493ab884dc5a6a38ba6ec3d56d3Kevin Rocard    log_info("Saving domain \"%s\"'s configuration \"%s\" from parameter blackboard", getName().c_str(), pDomainConfiguration->getName().c_str());
64568a912857707864bbaaff9808717813105072a6ePatrick Benavoli
64668a912857707864bbaaff9808717813105072a6ePatrick Benavoli    // Delegate
64768a912857707864bbaaff9808717813105072a6ePatrick Benavoli    pDomainConfiguration->save(pMainBlackboard);
64868a912857707864bbaaff9808717813105072a6ePatrick Benavoli
64968a912857707864bbaaff9808717813105072a6ePatrick Benavoli    return true;
65068a912857707864bbaaff9808717813105072a6ePatrick Benavoli}
65168a912857707864bbaaff9808717813105072a6ePatrick Benavoli
6520bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavolibool CConfigurableDomain::setElementSequence(const string& strConfiguration, const vector<string>& astrNewElementSequence, string& strError)
65363499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli{
65463499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli    // Find Domain configuration
6550bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli    CDomainConfiguration* pDomainConfiguration = findConfiguration(strConfiguration, strError);
65663499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli
65763499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli    if (!pDomainConfiguration) {
65863499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli
65963499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli        return false;
66063499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli    }
66163499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli
66263499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli    // Delegate to configuration
66363499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli    return pDomainConfiguration->setElementSequence(astrNewElementSequence, strError);
66463499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli}
66563499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli
6660bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavolibool CConfigurableDomain::getElementSequence(const string& strConfiguration, string& strResult) const
66763499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli{
66863499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli    // Find Domain configuration
6690bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli    const CDomainConfiguration* pDomainConfiguration = findConfiguration(strConfiguration, strResult);
67063499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli
67163499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli    if (!pDomainConfiguration) {
67263499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli
67363499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli        return false;
67463499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli    }
67563499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli
67663499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli    // Delegate to configuration
67763499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli    pDomainConfiguration->getElementSequence(strResult);
67863499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli
67963499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli    return true;
68063499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli}
68163499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli
6820bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavolibool CConfigurableDomain::setApplicationRule(const string& strConfiguration, const string& strApplicationRule, const CSelectionCriteriaDefinition* pSelectionCriteriaDefinition, string& strError)
6830bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli{
6840bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli    // Find Domain configuration
6850bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli    CDomainConfiguration* pDomainConfiguration = findConfiguration(strConfiguration, strError);
6860bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli
6870bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli    if (!pDomainConfiguration) {
6880bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli
6890bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli        return false;
6900bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli    }
6910bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli
6920bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli    // Delegate to configuration
6930bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli    return pDomainConfiguration->setApplicationRule(strApplicationRule, pSelectionCriteriaDefinition, strError);
6940bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli}
6950bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli
6960bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavolibool CConfigurableDomain::clearApplicationRule(const string& strConfiguration, string& strError)
6970bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli{
6980bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli    // Find Domain configuration
6990bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli    CDomainConfiguration* pDomainConfiguration = findConfiguration(strConfiguration, strError);
7000bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli
7010bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli    if (!pDomainConfiguration) {
7020bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli
7030bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli        return false;
7040bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli    }
7050bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli
7060bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli    // Delegate to configuration
7070bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli    pDomainConfiguration->clearApplicationRule();
7080bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli
7090bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli    return true;
7100bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli}
7110bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli
7120bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavolibool CConfigurableDomain::getApplicationRule(const string& strConfiguration, string& strResult) const
7130bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli{
7140bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli    // Find Domain configuration
7150bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli    const CDomainConfiguration* pDomainConfiguration = findConfiguration(strConfiguration, strResult);
7160bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli
7170bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli    if (!pDomainConfiguration) {
7180bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli
7190bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli        return false;
7200bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli    }
7210bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli
7220bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli    // Delegate to configuration
7230bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli    pDomainConfiguration->getApplicationRule(strResult);
7240bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli
7250bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli    return true;
7260bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli}
7270bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli
72868a912857707864bbaaff9808717813105072a6ePatrick Benavoli// Last applied configuration
72968a912857707864bbaaff9808717813105072a6ePatrick Benavolistring CConfigurableDomain::getLastAppliedConfigurationName() const
73068a912857707864bbaaff9808717813105072a6ePatrick Benavoli{
73168a912857707864bbaaff9808717813105072a6ePatrick Benavoli    if (_pLastAppliedConfiguration) {
73268a912857707864bbaaff9808717813105072a6ePatrick Benavoli
73368a912857707864bbaaff9808717813105072a6ePatrick Benavoli        return _pLastAppliedConfiguration->getName();
73468a912857707864bbaaff9808717813105072a6ePatrick Benavoli    }
73568a912857707864bbaaff9808717813105072a6ePatrick Benavoli    return "<none>";
73668a912857707864bbaaff9808717813105072a6ePatrick Benavoli}
73768a912857707864bbaaff9808717813105072a6ePatrick Benavoli
7388b243f50a38a26e6b373287e07cb7e4743a8cd28Frédéric Boisnard// Pending configuration
7398b243f50a38a26e6b373287e07cb7e4743a8cd28Frédéric Boisnardstring CConfigurableDomain::getPendingConfigurationName() const
7408b243f50a38a26e6b373287e07cb7e4743a8cd28Frédéric Boisnard{
7418b243f50a38a26e6b373287e07cb7e4743a8cd28Frédéric Boisnard    const CDomainConfiguration* pPendingConfiguration = getPendingConfiguration();
7428b243f50a38a26e6b373287e07cb7e4743a8cd28Frédéric Boisnard
7438b243f50a38a26e6b373287e07cb7e4743a8cd28Frédéric Boisnard    if (pPendingConfiguration) {
7448b243f50a38a26e6b373287e07cb7e4743a8cd28Frédéric Boisnard
7458b243f50a38a26e6b373287e07cb7e4743a8cd28Frédéric Boisnard        return pPendingConfiguration->getName();
7468b243f50a38a26e6b373287e07cb7e4743a8cd28Frédéric Boisnard    }
7478b243f50a38a26e6b373287e07cb7e4743a8cd28Frédéric Boisnard    return "<none>";
7488b243f50a38a26e6b373287e07cb7e4743a8cd28Frédéric Boisnard}
7498b243f50a38a26e6b373287e07cb7e4743a8cd28Frédéric Boisnard
75068a912857707864bbaaff9808717813105072a6ePatrick Benavoli// Ensure validity on whole domain from main blackboard
75168a912857707864bbaaff9808717813105072a6ePatrick Benavolivoid CConfigurableDomain::validate(const CParameterBlackboard* pMainBlackboard)
75268a912857707864bbaaff9808717813105072a6ePatrick Benavoli{
753ace81f873b910493ab884dc5a6a38ba6ec3d56d3Kevin Rocard    log_info("Validating whole domain \"" + getName() + "\" against main blackboard");
75468a912857707864bbaaff9808717813105072a6ePatrick Benavoli
75568a912857707864bbaaff9808717813105072a6ePatrick Benavoli    // Propagate
75668a912857707864bbaaff9808717813105072a6ePatrick Benavoli    uint32_t uiNbConfigurations = getNbChildren();
75768a912857707864bbaaff9808717813105072a6ePatrick Benavoli    uint32_t uiChild;
75868a912857707864bbaaff9808717813105072a6ePatrick Benavoli
75968a912857707864bbaaff9808717813105072a6ePatrick Benavoli    for (uiChild = 0; uiChild < uiNbConfigurations; uiChild++) {
76068a912857707864bbaaff9808717813105072a6ePatrick Benavoli
76168a912857707864bbaaff9808717813105072a6ePatrick Benavoli        CDomainConfiguration* pDomainConfiguration = static_cast<CDomainConfiguration*>(getChild(uiChild));
76268a912857707864bbaaff9808717813105072a6ePatrick Benavoli
76368a912857707864bbaaff9808717813105072a6ePatrick Benavoli        pDomainConfiguration->validate(pMainBlackboard);
76468a912857707864bbaaff9808717813105072a6ePatrick Benavoli    }
76568a912857707864bbaaff9808717813105072a6ePatrick Benavoli}
76668a912857707864bbaaff9808717813105072a6ePatrick Benavoli
76768a912857707864bbaaff9808717813105072a6ePatrick Benavoli// Ensure validity on areas related to configurable element
76868a912857707864bbaaff9808717813105072a6ePatrick Benavolivoid CConfigurableDomain::validateAreas(const CConfigurableElement* pConfigurableElement, const CParameterBlackboard* pMainBlackboard)
76968a912857707864bbaaff9808717813105072a6ePatrick Benavoli{
770ace81f873b910493ab884dc5a6a38ba6ec3d56d3Kevin Rocard    log_info("Validating domain \"" + getName() + "\" against main blackboard for configurable element \"" + pConfigurableElement->getPath() + "\"");
77168a912857707864bbaaff9808717813105072a6ePatrick Benavoli
77268a912857707864bbaaff9808717813105072a6ePatrick Benavoli    // Propagate
77368a912857707864bbaaff9808717813105072a6ePatrick Benavoli    uint32_t uiNbConfigurations = getNbChildren();
77468a912857707864bbaaff9808717813105072a6ePatrick Benavoli    uint32_t uiChild;
77568a912857707864bbaaff9808717813105072a6ePatrick Benavoli
77668a912857707864bbaaff9808717813105072a6ePatrick Benavoli    for (uiChild = 0; uiChild < uiNbConfigurations; uiChild++) {
77768a912857707864bbaaff9808717813105072a6ePatrick Benavoli
77868a912857707864bbaaff9808717813105072a6ePatrick Benavoli        CDomainConfiguration* pDomainConfiguration = static_cast<CDomainConfiguration*>(getChild(uiChild));
77968a912857707864bbaaff9808717813105072a6ePatrick Benavoli
78068a912857707864bbaaff9808717813105072a6ePatrick Benavoli        pDomainConfiguration->validate(pConfigurableElement, pMainBlackboard);
78168a912857707864bbaaff9808717813105072a6ePatrick Benavoli    }
78268a912857707864bbaaff9808717813105072a6ePatrick Benavoli}
78368a912857707864bbaaff9808717813105072a6ePatrick Benavoli
78468a912857707864bbaaff9808717813105072a6ePatrick Benavoli// Attempt validation for all configurable element's areas, relying on already existing valid configuration inside domain
78568a912857707864bbaaff9808717813105072a6ePatrick Benavolivoid CConfigurableDomain::autoValidateAll()
78668a912857707864bbaaff9808717813105072a6ePatrick Benavoli{
78768a912857707864bbaaff9808717813105072a6ePatrick Benavoli    // Validate
78868a912857707864bbaaff9808717813105072a6ePatrick Benavoli    ConfigurableElementListIterator it;
78968a912857707864bbaaff9808717813105072a6ePatrick Benavoli
79068a912857707864bbaaff9808717813105072a6ePatrick Benavoli    // Browse all configurable elements for configuration validation
79168a912857707864bbaaff9808717813105072a6ePatrick Benavoli    for (it = _configurableElementList.begin(); it != _configurableElementList.end(); ++it) {
79268a912857707864bbaaff9808717813105072a6ePatrick Benavoli
79368a912857707864bbaaff9808717813105072a6ePatrick Benavoli        const CConfigurableElement* pConfigurableElement = *it;
79468a912857707864bbaaff9808717813105072a6ePatrick Benavoli
79568a912857707864bbaaff9808717813105072a6ePatrick Benavoli        // Auto validate element
79668a912857707864bbaaff9808717813105072a6ePatrick Benavoli        autoValidateAreas(pConfigurableElement);
79768a912857707864bbaaff9808717813105072a6ePatrick Benavoli    }
79868a912857707864bbaaff9808717813105072a6ePatrick Benavoli}
79968a912857707864bbaaff9808717813105072a6ePatrick Benavoli
80068a912857707864bbaaff9808717813105072a6ePatrick Benavoli// Attempt validation for configurable element's areas, relying on already existing valid configuration inside domain
80168a912857707864bbaaff9808717813105072a6ePatrick Benavolivoid CConfigurableDomain::autoValidateAreas(const CConfigurableElement* pConfigurableElement)
80268a912857707864bbaaff9808717813105072a6ePatrick Benavoli{
80368a912857707864bbaaff9808717813105072a6ePatrick Benavoli    // Find first valid configuration for given configurable element
80468a912857707864bbaaff9808717813105072a6ePatrick Benavoli    const CDomainConfiguration* pValidDomainConfiguration = findValidDomainConfiguration(pConfigurableElement);
80568a912857707864bbaaff9808717813105072a6ePatrick Benavoli
80668a912857707864bbaaff9808717813105072a6ePatrick Benavoli    // No valid configuration found, give up
80768a912857707864bbaaff9808717813105072a6ePatrick Benavoli    if (!pValidDomainConfiguration) {
80868a912857707864bbaaff9808717813105072a6ePatrick Benavoli
80968a912857707864bbaaff9808717813105072a6ePatrick Benavoli        return;
81068a912857707864bbaaff9808717813105072a6ePatrick Benavoli    }
81168a912857707864bbaaff9808717813105072a6ePatrick Benavoli
812ace81f873b910493ab884dc5a6a38ba6ec3d56d3Kevin Rocard    log_info("Auto validating domain \"" + getName() + "\" against configuration \"" + pValidDomainConfiguration->getName() + "\" for configurable element " + pConfigurableElement->getPath());
81368a912857707864bbaaff9808717813105072a6ePatrick Benavoli
81468a912857707864bbaaff9808717813105072a6ePatrick Benavoli    // Validate all other configurations against found one, if any
81568a912857707864bbaaff9808717813105072a6ePatrick Benavoli    uint32_t uiNbConfigurations = getNbChildren();
81668a912857707864bbaaff9808717813105072a6ePatrick Benavoli    uint32_t uiChild;
81768a912857707864bbaaff9808717813105072a6ePatrick Benavoli
81868a912857707864bbaaff9808717813105072a6ePatrick Benavoli    for (uiChild = 0; uiChild < uiNbConfigurations; uiChild++) {
81968a912857707864bbaaff9808717813105072a6ePatrick Benavoli
82068a912857707864bbaaff9808717813105072a6ePatrick Benavoli        CDomainConfiguration* pDomainConfiguration = static_cast<CDomainConfiguration*>(getChild(uiChild));
82168a912857707864bbaaff9808717813105072a6ePatrick Benavoli
82268a912857707864bbaaff9808717813105072a6ePatrick Benavoli        if (pDomainConfiguration != pValidDomainConfiguration && !pDomainConfiguration->isValid(pConfigurableElement)) {
82368a912857707864bbaaff9808717813105072a6ePatrick Benavoli            // Validate
82468a912857707864bbaaff9808717813105072a6ePatrick Benavoli            pDomainConfiguration->validateAgainst(pValidDomainConfiguration, pConfigurableElement);
82568a912857707864bbaaff9808717813105072a6ePatrick Benavoli        }
82668a912857707864bbaaff9808717813105072a6ePatrick Benavoli    }
82768a912857707864bbaaff9808717813105072a6ePatrick Benavoli}
82868a912857707864bbaaff9808717813105072a6ePatrick Benavoli
82968a912857707864bbaaff9808717813105072a6ePatrick Benavoli// Attempt configuration validation for all configurable elements' areas, relying on already existing valid configuration inside domain
83068a912857707864bbaaff9808717813105072a6ePatrick Benavolibool CConfigurableDomain::autoValidateConfiguration(CDomainConfiguration* pDomainConfiguration)
83168a912857707864bbaaff9808717813105072a6ePatrick Benavoli{
83268a912857707864bbaaff9808717813105072a6ePatrick Benavoli    // Find another configuration than this one, that ought to be valid!
83368a912857707864bbaaff9808717813105072a6ePatrick Benavoli    uint32_t uiNbConfigurations = getNbChildren();
83468a912857707864bbaaff9808717813105072a6ePatrick Benavoli    uint32_t uiChild;
83568a912857707864bbaaff9808717813105072a6ePatrick Benavoli
83668a912857707864bbaaff9808717813105072a6ePatrick Benavoli    for (uiChild = 0; uiChild < uiNbConfigurations; uiChild++) {
83768a912857707864bbaaff9808717813105072a6ePatrick Benavoli
83868a912857707864bbaaff9808717813105072a6ePatrick Benavoli        const CDomainConfiguration* pPotententialValidDomainConfiguration = static_cast<const CDomainConfiguration*>(getChild(uiChild));
83968a912857707864bbaaff9808717813105072a6ePatrick Benavoli
84068a912857707864bbaaff9808717813105072a6ePatrick Benavoli        if (pPotententialValidDomainConfiguration != pDomainConfiguration) {
84168a912857707864bbaaff9808717813105072a6ePatrick Benavoli
84268a912857707864bbaaff9808717813105072a6ePatrick Benavoli            // Validate against it
84368a912857707864bbaaff9808717813105072a6ePatrick Benavoli            pDomainConfiguration->validateAgainst(pPotententialValidDomainConfiguration);
84468a912857707864bbaaff9808717813105072a6ePatrick Benavoli
84568a912857707864bbaaff9808717813105072a6ePatrick Benavoli            return true;
84668a912857707864bbaaff9808717813105072a6ePatrick Benavoli        }
84768a912857707864bbaaff9808717813105072a6ePatrick Benavoli    }
84868a912857707864bbaaff9808717813105072a6ePatrick Benavoli    return false;
84968a912857707864bbaaff9808717813105072a6ePatrick Benavoli}
85068a912857707864bbaaff9808717813105072a6ePatrick Benavoli
85168a912857707864bbaaff9808717813105072a6ePatrick Benavoli// Search for a valid configuration for given configurable element
85268a912857707864bbaaff9808717813105072a6ePatrick Benavoliconst CDomainConfiguration* CConfigurableDomain::findValidDomainConfiguration(const CConfigurableElement* pConfigurableElement) const
85368a912857707864bbaaff9808717813105072a6ePatrick Benavoli{
85468a912857707864bbaaff9808717813105072a6ePatrick Benavoli    uint32_t uiNbConfigurations = getNbChildren();
85568a912857707864bbaaff9808717813105072a6ePatrick Benavoli    uint32_t uiChild;
85668a912857707864bbaaff9808717813105072a6ePatrick Benavoli
85768a912857707864bbaaff9808717813105072a6ePatrick Benavoli    for (uiChild = 0; uiChild < uiNbConfigurations; uiChild++) {
85868a912857707864bbaaff9808717813105072a6ePatrick Benavoli
85968a912857707864bbaaff9808717813105072a6ePatrick Benavoli        const CDomainConfiguration* pDomainConfiguration = static_cast<const CDomainConfiguration*>(getChild(uiChild));
86068a912857707864bbaaff9808717813105072a6ePatrick Benavoli
86168a912857707864bbaaff9808717813105072a6ePatrick Benavoli        if (pDomainConfiguration->isValid(pConfigurableElement)) {
86268a912857707864bbaaff9808717813105072a6ePatrick Benavoli
86368a912857707864bbaaff9808717813105072a6ePatrick Benavoli            return pDomainConfiguration;
86468a912857707864bbaaff9808717813105072a6ePatrick Benavoli        }
86568a912857707864bbaaff9808717813105072a6ePatrick Benavoli    }
86668a912857707864bbaaff9808717813105072a6ePatrick Benavoli    return NULL;
86768a912857707864bbaaff9808717813105072a6ePatrick Benavoli}
86868a912857707864bbaaff9808717813105072a6ePatrick Benavoli
86968a912857707864bbaaff9808717813105072a6ePatrick Benavoli// Search for an applicable configuration
87068a912857707864bbaaff9808717813105072a6ePatrick Benavoliconst CDomainConfiguration* CConfigurableDomain::findApplicableDomainConfiguration() const
87168a912857707864bbaaff9808717813105072a6ePatrick Benavoli{
87268a912857707864bbaaff9808717813105072a6ePatrick Benavoli    uint32_t uiNbConfigurations = getNbChildren();
87368a912857707864bbaaff9808717813105072a6ePatrick Benavoli    uint32_t uiChild;
87468a912857707864bbaaff9808717813105072a6ePatrick Benavoli
87568a912857707864bbaaff9808717813105072a6ePatrick Benavoli    for (uiChild = 0; uiChild < uiNbConfigurations; uiChild++) {
87668a912857707864bbaaff9808717813105072a6ePatrick Benavoli
87768a912857707864bbaaff9808717813105072a6ePatrick Benavoli        const CDomainConfiguration* pDomainConfiguration = static_cast<const CDomainConfiguration*>(getChild(uiChild));
87868a912857707864bbaaff9808717813105072a6ePatrick Benavoli
87968a912857707864bbaaff9808717813105072a6ePatrick Benavoli        if (pDomainConfiguration->isApplicable()) {
88068a912857707864bbaaff9808717813105072a6ePatrick Benavoli
88168a912857707864bbaaff9808717813105072a6ePatrick Benavoli            return pDomainConfiguration;
88268a912857707864bbaaff9808717813105072a6ePatrick Benavoli        }
88368a912857707864bbaaff9808717813105072a6ePatrick Benavoli    }
88468a912857707864bbaaff9808717813105072a6ePatrick Benavoli    return NULL;
88568a912857707864bbaaff9808717813105072a6ePatrick Benavoli}
88668a912857707864bbaaff9808717813105072a6ePatrick Benavoli
88768a912857707864bbaaff9808717813105072a6ePatrick Benavoli// Gather set of configurable elements
88868a912857707864bbaaff9808717813105072a6ePatrick Benavolivoid CConfigurableDomain::gatherConfigurableElements(set<const CConfigurableElement*>& configurableElementSet) const
88968a912857707864bbaaff9808717813105072a6ePatrick Benavoli{
89068a912857707864bbaaff9808717813105072a6ePatrick Benavoli    // Insert all configurable elements
89168a912857707864bbaaff9808717813105072a6ePatrick Benavoli    configurableElementSet.insert(_configurableElementList.begin(), _configurableElementList.end());
89268a912857707864bbaaff9808717813105072a6ePatrick Benavoli}
89368a912857707864bbaaff9808717813105072a6ePatrick Benavoli
89468a912857707864bbaaff9808717813105072a6ePatrick Benavoli// Check configurable element already attached
89568a912857707864bbaaff9808717813105072a6ePatrick Benavolibool CConfigurableDomain::containsConfigurableElement(const CConfigurableElement* pConfigurableCandidateElement) const
89668a912857707864bbaaff9808717813105072a6ePatrick Benavoli{
89768a912857707864bbaaff9808717813105072a6ePatrick Benavoli    ConfigurableElementListIterator it;
89868a912857707864bbaaff9808717813105072a6ePatrick Benavoli
89968a912857707864bbaaff9808717813105072a6ePatrick Benavoli    // Browse all configurable elements for comparison
90068a912857707864bbaaff9808717813105072a6ePatrick Benavoli    for (it = _configurableElementList.begin(); it != _configurableElementList.end(); ++it) {
90168a912857707864bbaaff9808717813105072a6ePatrick Benavoli
90268a912857707864bbaaff9808717813105072a6ePatrick Benavoli        if (pConfigurableCandidateElement == *it) {
90368a912857707864bbaaff9808717813105072a6ePatrick Benavoli
90468a912857707864bbaaff9808717813105072a6ePatrick Benavoli            return true;
90568a912857707864bbaaff9808717813105072a6ePatrick Benavoli        }
90668a912857707864bbaaff9808717813105072a6ePatrick Benavoli    }
90768a912857707864bbaaff9808717813105072a6ePatrick Benavoli    return false;
90868a912857707864bbaaff9808717813105072a6ePatrick Benavoli}
90968a912857707864bbaaff9808717813105072a6ePatrick Benavoli
91068a912857707864bbaaff9808717813105072a6ePatrick Benavoli// Merge any descended configurable element to this one with this one
91168a912857707864bbaaff9808717813105072a6ePatrick Benavolivoid CConfigurableDomain::mergeAlreadyAssociatedDescendantConfigurableElements(CConfigurableElement* pNewConfigurableElement)
91268a912857707864bbaaff9808717813105072a6ePatrick Benavoli{
91368a912857707864bbaaff9808717813105072a6ePatrick Benavoli    list<CConfigurableElement*> mergedConfigurableElementList;
91468a912857707864bbaaff9808717813105072a6ePatrick Benavoli
91568a912857707864bbaaff9808717813105072a6ePatrick Benavoli    ConfigurableElementListIterator it;
91668a912857707864bbaaff9808717813105072a6ePatrick Benavoli
91768a912857707864bbaaff9808717813105072a6ePatrick Benavoli    // Browse all configurable elements (new one not yet in the list!)
91868a912857707864bbaaff9808717813105072a6ePatrick Benavoli    for (it = _configurableElementList.begin(); it != _configurableElementList.end(); ++it) {
91968a912857707864bbaaff9808717813105072a6ePatrick Benavoli
92068a912857707864bbaaff9808717813105072a6ePatrick Benavoli        CConfigurableElement* pConfigurablePotentialDescendantElement = *it;
92168a912857707864bbaaff9808717813105072a6ePatrick Benavoli
92268a912857707864bbaaff9808717813105072a6ePatrick Benavoli        if (pConfigurablePotentialDescendantElement->isDescendantOf(pNewConfigurableElement)) {
92368a912857707864bbaaff9808717813105072a6ePatrick Benavoli
924ace81f873b910493ab884dc5a6a38ba6ec3d56d3Kevin Rocard            log_info("In domain \"%s\", merging descendant configurable element's configurations \"%s\" into its ascendant \"%s\" ones", getName().c_str(), pConfigurablePotentialDescendantElement->getName().c_str(), pNewConfigurableElement->getName().c_str());
92568a912857707864bbaaff9808717813105072a6ePatrick Benavoli
92668a912857707864bbaaff9808717813105072a6ePatrick Benavoli            // Merge configuration data
92768a912857707864bbaaff9808717813105072a6ePatrick Benavoli            mergeConfigurations(pNewConfigurableElement, pConfigurablePotentialDescendantElement);
92868a912857707864bbaaff9808717813105072a6ePatrick Benavoli
92968a912857707864bbaaff9808717813105072a6ePatrick Benavoli            // Keep track for removal
93068a912857707864bbaaff9808717813105072a6ePatrick Benavoli            mergedConfigurableElementList.push_back(pConfigurablePotentialDescendantElement);
93168a912857707864bbaaff9808717813105072a6ePatrick Benavoli        }
93268a912857707864bbaaff9808717813105072a6ePatrick Benavoli    }
93368a912857707864bbaaff9808717813105072a6ePatrick Benavoli
93468a912857707864bbaaff9808717813105072a6ePatrick Benavoli    // Remove all merged elements (new one not yet in the list!)
93568a912857707864bbaaff9808717813105072a6ePatrick Benavoli    for (it = mergedConfigurableElementList.begin(); it != mergedConfigurableElementList.end(); ++it) {
93668a912857707864bbaaff9808717813105072a6ePatrick Benavoli
93768a912857707864bbaaff9808717813105072a6ePatrick Benavoli        CConfigurableElement* pMergedConfigurableElement = *it;
93868a912857707864bbaaff9808717813105072a6ePatrick Benavoli
93968a912857707864bbaaff9808717813105072a6ePatrick Benavoli        // Remove merged from configurable element from internal tracking list
94068a912857707864bbaaff9808717813105072a6ePatrick Benavoli        // Note: we shouldn't need to recompute the sync set in that case, as the merged to element should include the syncers of merged from elements
94168a912857707864bbaaff9808717813105072a6ePatrick Benavoli        doRemoveConfigurableElement(pMergedConfigurableElement, false);
94268a912857707864bbaaff9808717813105072a6ePatrick Benavoli    }
94368a912857707864bbaaff9808717813105072a6ePatrick Benavoli}
94468a912857707864bbaaff9808717813105072a6ePatrick Benavoli
94568a912857707864bbaaff9808717813105072a6ePatrick Benavolivoid CConfigurableDomain::mergeConfigurations(CConfigurableElement* pToConfigurableElement, CConfigurableElement* pFromConfigurableElement)
94668a912857707864bbaaff9808717813105072a6ePatrick Benavoli{
94768a912857707864bbaaff9808717813105072a6ePatrick Benavoli    // Propagate to domain configurations
94868a912857707864bbaaff9808717813105072a6ePatrick Benavoli    uint32_t uiNbConfigurations = getNbChildren();
94968a912857707864bbaaff9808717813105072a6ePatrick Benavoli    uint32_t uiChild;
95068a912857707864bbaaff9808717813105072a6ePatrick Benavoli
95168a912857707864bbaaff9808717813105072a6ePatrick Benavoli    for (uiChild = 0; uiChild < uiNbConfigurations; uiChild++) {
95268a912857707864bbaaff9808717813105072a6ePatrick Benavoli
95368a912857707864bbaaff9808717813105072a6ePatrick Benavoli        CDomainConfiguration* pDomainConfiguration = static_cast<CDomainConfiguration*>(getChild(uiChild));
95468a912857707864bbaaff9808717813105072a6ePatrick Benavoli
95568a912857707864bbaaff9808717813105072a6ePatrick Benavoli        // Do the merge.
95668a912857707864bbaaff9808717813105072a6ePatrick Benavoli        pDomainConfiguration->merge(pToConfigurableElement, pFromConfigurableElement);
95768a912857707864bbaaff9808717813105072a6ePatrick Benavoli    }
95868a912857707864bbaaff9808717813105072a6ePatrick Benavoli}
95968a912857707864bbaaff9808717813105072a6ePatrick Benavoli
96068a912857707864bbaaff9808717813105072a6ePatrick Benavoli// Configurable elements association
9619620e44c6c7605bf589f60331eb5b05b71336853Frédéric Boisnardvoid CConfigurableDomain::doAddConfigurableElement(CConfigurableElement* pConfigurableElement, const CParameterBlackboard *pMainBlackboard)
96268a912857707864bbaaff9808717813105072a6ePatrick Benavoli{
96368a912857707864bbaaff9808717813105072a6ePatrick Benavoli    // Inform configurable element
96468a912857707864bbaaff9808717813105072a6ePatrick Benavoli    pConfigurableElement->addAttachedConfigurableDomain(this);
96568a912857707864bbaaff9808717813105072a6ePatrick Benavoli
96663499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli    // Create associated syncer set
96763499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli    CSyncerSet* pSyncerSet = new CSyncerSet;
96863499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli
96963499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli    // Add to sync set the configurable element one
97063499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli    pConfigurableElement->fillSyncerSet(*pSyncerSet);
97163499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli
97263499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli    // Store it
97363499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli    _configurableElementToSyncerSetMap[pConfigurableElement] = pSyncerSet;
97463499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli
97563499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli    // Add it to global one
97663499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli    _syncerSet += *pSyncerSet;
97763499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli
97868a912857707864bbaaff9808717813105072a6ePatrick Benavoli    // Inform configurations
97968a912857707864bbaaff9808717813105072a6ePatrick Benavoli    uint32_t uiNbConfigurations = getNbChildren();
98068a912857707864bbaaff9808717813105072a6ePatrick Benavoli    uint32_t uiChild;
98168a912857707864bbaaff9808717813105072a6ePatrick Benavoli
98268a912857707864bbaaff9808717813105072a6ePatrick Benavoli    for (uiChild = 0; uiChild < uiNbConfigurations; uiChild++) {
98368a912857707864bbaaff9808717813105072a6ePatrick Benavoli
98468a912857707864bbaaff9808717813105072a6ePatrick Benavoli        CDomainConfiguration* pDomainConfiguration = static_cast<CDomainConfiguration*>(getChild(uiChild));
98568a912857707864bbaaff9808717813105072a6ePatrick Benavoli
98663499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli        pDomainConfiguration->addConfigurableElement(pConfigurableElement, pSyncerSet);
98768a912857707864bbaaff9808717813105072a6ePatrick Benavoli    }
98868a912857707864bbaaff9808717813105072a6ePatrick Benavoli
9899620e44c6c7605bf589f60331eb5b05b71336853Frédéric Boisnard    // Ensure area validity for that configurable element (if main blackboard provided)
9909620e44c6c7605bf589f60331eb5b05b71336853Frédéric Boisnard    if (pMainBlackboard) {
9919620e44c6c7605bf589f60331eb5b05b71336853Frédéric Boisnard
9929620e44c6c7605bf589f60331eb5b05b71336853Frédéric Boisnard        // Need to validate against main blackboard
9939620e44c6c7605bf589f60331eb5b05b71336853Frédéric Boisnard        validateAreas(pConfigurableElement, pMainBlackboard);
9949620e44c6c7605bf589f60331eb5b05b71336853Frédéric Boisnard    }
9959620e44c6c7605bf589f60331eb5b05b71336853Frédéric Boisnard
9969620e44c6c7605bf589f60331eb5b05b71336853Frédéric Boisnard    // Already associated descendend configurable elements need a merge of their configuration data
99768a912857707864bbaaff9808717813105072a6ePatrick Benavoli    mergeAlreadyAssociatedDescendantConfigurableElements(pConfigurableElement);
99868a912857707864bbaaff9808717813105072a6ePatrick Benavoli
99968a912857707864bbaaff9808717813105072a6ePatrick Benavoli    // Add to list
100068a912857707864bbaaff9808717813105072a6ePatrick Benavoli    _configurableElementList.push_back(pConfigurableElement);
100168a912857707864bbaaff9808717813105072a6ePatrick Benavoli}
100268a912857707864bbaaff9808717813105072a6ePatrick Benavoli
100368a912857707864bbaaff9808717813105072a6ePatrick Benavolivoid CConfigurableDomain::doRemoveConfigurableElement(CConfigurableElement* pConfigurableElement, bool bRecomputeSyncSet)
100468a912857707864bbaaff9808717813105072a6ePatrick Benavoli{
100568a912857707864bbaaff9808717813105072a6ePatrick Benavoli    // Remove from list
100668a912857707864bbaaff9808717813105072a6ePatrick Benavoli    _configurableElementList.remove(pConfigurableElement);
100768a912857707864bbaaff9808717813105072a6ePatrick Benavoli
100863499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli    // Remove associated syncer set
100963499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli    CSyncerSet* pSyncerSet = getSyncerSet(pConfigurableElement);
101063499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli
101163499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli    _configurableElementToSyncerSetMap.erase(pConfigurableElement);
101263499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli
101363499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli    delete pSyncerSet;
101463499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli
101568a912857707864bbaaff9808717813105072a6ePatrick Benavoli    // Inform configurable element
101668a912857707864bbaaff9808717813105072a6ePatrick Benavoli    pConfigurableElement->removeAttachedConfigurableDomain(this);
101768a912857707864bbaaff9808717813105072a6ePatrick Benavoli
101868a912857707864bbaaff9808717813105072a6ePatrick Benavoli    // Inform configurations
101968a912857707864bbaaff9808717813105072a6ePatrick Benavoli    uint32_t uiNbConfigurations = getNbChildren();
102068a912857707864bbaaff9808717813105072a6ePatrick Benavoli    uint32_t uiChild;
102168a912857707864bbaaff9808717813105072a6ePatrick Benavoli
102268a912857707864bbaaff9808717813105072a6ePatrick Benavoli    for (uiChild = 0; uiChild < uiNbConfigurations; uiChild++) {
102368a912857707864bbaaff9808717813105072a6ePatrick Benavoli
102468a912857707864bbaaff9808717813105072a6ePatrick Benavoli        CDomainConfiguration* pDomainConfiguration = static_cast<CDomainConfiguration*>(getChild(uiChild));
102568a912857707864bbaaff9808717813105072a6ePatrick Benavoli
102668a912857707864bbaaff9808717813105072a6ePatrick Benavoli        pDomainConfiguration->removeConfigurableElement(pConfigurableElement);
102768a912857707864bbaaff9808717813105072a6ePatrick Benavoli    }
102868a912857707864bbaaff9808717813105072a6ePatrick Benavoli    // Recompute our sync set if needed
102968a912857707864bbaaff9808717813105072a6ePatrick Benavoli    if (bRecomputeSyncSet) {
103068a912857707864bbaaff9808717813105072a6ePatrick Benavoli
103168a912857707864bbaaff9808717813105072a6ePatrick Benavoli        computeSyncSet();
103268a912857707864bbaaff9808717813105072a6ePatrick Benavoli    }
103368a912857707864bbaaff9808717813105072a6ePatrick Benavoli}
103463499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli
103563499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli// Syncer set retrieval from configurable element
103663499d4763e42d76bfd39b79871f611381d2d164Patrick BenavoliCSyncerSet* CConfigurableDomain::getSyncerSet(const CConfigurableElement* pConfigurableElement) const
103763499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli{
103863499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli    ConfigurableElementToSyncerSetMapIterator mapIt = _configurableElementToSyncerSetMap.find(pConfigurableElement);
103963499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli
104063499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli    assert(mapIt != _configurableElementToSyncerSetMap.end());
104163499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli
104263499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli    return mapIt->second;
104363499d4763e42d76bfd39b79871f611381d2d164Patrick Benavoli}
10440bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli
10450bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli// Configuration retrieval
10460bd50546a8d06a6865d32c695adf8893fa71250aPatrick BenavoliCDomainConfiguration* CConfigurableDomain::findConfiguration(const string& strConfiguration, string& strError)
10470bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli{
10480bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli    CDomainConfiguration* pDomainConfiguration = static_cast<CDomainConfiguration*>(findChild(strConfiguration));
10490bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli
10500bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli    if (!pDomainConfiguration) {
10510bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli
10520bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli        strError = "Domain configuration " + strConfiguration + " not found";
10530bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli
10540bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli        return NULL;
10550bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli    }
10560bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli    return pDomainConfiguration;
10570bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli}
10580bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli
10590bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoliconst CDomainConfiguration* CConfigurableDomain::findConfiguration(const string& strConfiguration, string& strError) const
10600bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli{
10610bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli    const CDomainConfiguration* pDomainConfiguration = static_cast<const CDomainConfiguration*>(findChild(strConfiguration));
10620bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli
10630bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli    if (!pDomainConfiguration) {
10640bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli
10650bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli        strError = "Domain configuration " + strConfiguration + " not found";
10660bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli
10670bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli        return NULL;
10680bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli    }
10690bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli    return pDomainConfiguration;
10700bd50546a8d06a6865d32c695adf8893fa71250aPatrick Benavoli}
1071