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