Home | History | Annotate | Download | only in parameter
      1 /*
      2  * Copyright (c) 2011-2015, Intel Corporation
      3  * All rights reserved.
      4  *
      5  * Redistribution and use in source and binary forms, with or without modification,
      6  * are permitted provided that the following conditions are met:
      7  *
      8  * 1. Redistributions of source code must retain the above copyright notice, this
      9  * list of conditions and the following disclaimer.
     10  *
     11  * 2. Redistributions in binary form must reproduce the above copyright notice,
     12  * this list of conditions and the following disclaimer in the documentation and/or
     13  * other materials provided with the distribution.
     14  *
     15  * 3. Neither the name of the copyright holder nor the names of its contributors
     16  * may be used to endorse or promote products derived from this software without
     17  * specific prior written permission.
     18  *
     19  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
     20  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
     21  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
     22  * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
     23  * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
     24  * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
     25  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
     26  * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
     27  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
     28  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
     29  */
     30 #pragma once
     31 
     32 #include "XmlSerializingContext.h"
     33 #include "XmlDomainImportContext.h"
     34 #include "XmlDomainExportContext.h"
     35 #include "SyncerSet.h"
     36 #include "Results.h"
     37 #include <list>
     38 #include <set>
     39 #include <map>
     40 #include <string>
     41 
     42 class CConfigurableElement;
     43 class CDomainConfiguration;
     44 class CParameterBlackboard;
     45 class CSelectionCriteriaDefinition;
     46 
     47 class CConfigurableDomain : public CElement
     48 {
     49     typedef std::list<CConfigurableElement *>::const_iterator ConfigurableElementListIterator;
     50     typedef std::map<const CConfigurableElement *, CSyncerSet *>::const_iterator
     51         ConfigurableElementToSyncerSetMapIterator;
     52 
     53 public:
     54     CConfigurableDomain() = default;
     55     CConfigurableDomain(const std::string &strName);
     56     ~CConfigurableDomain() override;
     57 
     58     // Sequence awareness
     59     void setSequenceAwareness(bool bSequenceAware);
     60     bool getSequenceAwareness() const;
     61 
     62     // Configuration Management
     63     bool createConfiguration(const std::string &strName,
     64                              const CParameterBlackboard *pMainBlackboard, std::string &strError);
     65     bool deleteConfiguration(const std::string &strName, std::string &strError);
     66     bool renameConfiguration(const std::string &strName, const std::string &strNewName,
     67                              std::string &strError);
     68 
     69     /** Restore a configuration
     70      *
     71      * @param[in] configurationName the configuration name
     72      * @param[in] mainBlackboard the application main blackboard
     73      * @param[in] autoSync boolean which indicates if auto sync mechanism is on
     74      * @param[out] errors, errors encountered during restoration
     75      * @return true if success false otherwise
     76      */
     77     bool restoreConfiguration(const std::string &configurationName,
     78                               CParameterBlackboard *mainBlackboard, bool autoSync,
     79                               core::Results &errors) const;
     80 
     81     bool saveConfiguration(const std::string &strName, const CParameterBlackboard *pMainBlackboard,
     82                            std::string &strError);
     83     bool setElementSequence(const std::string &strConfiguration,
     84                             const std::vector<std::string> &astrNewElementSequence,
     85                             std::string &strError);
     86     bool getElementSequence(const std::string &strConfiguration, std::string &strResult) const;
     87     bool setApplicationRule(const std::string &strConfiguration,
     88                             const std::string &strApplicationRule,
     89                             const CSelectionCriteriaDefinition *pSelectionCriteriaDefinition,
     90                             std::string &strError);
     91     bool clearApplicationRule(const std::string &strConfiguration, std::string &strError);
     92     bool getApplicationRule(const std::string &strConfiguration, std::string &strResult) const;
     93 
     94     // Last applied configuration name
     95     std::string getLastAppliedConfigurationName() const;
     96 
     97     // Pending configuration name
     98     std::string getPendingConfigurationName() const;
     99 
    100     // Associated Configurable elements
    101     void gatherConfigurableElements(
    102         std::set<const CConfigurableElement *> &configurableElementSet) const;
    103     void listAssociatedToElements(std::string &strResult) const;
    104 
    105     /** Add a configurable element to the domain
    106      *
    107      * @param[in] pConfigurableElement pointer to the element to add
    108      * @param[in] pMainBlackboard pointer to the application main blackboard
    109      * @param[out] infos useful information we can provide to client
    110      * @return true if succeed false otherwise
    111      */
    112     bool addConfigurableElement(CConfigurableElement *pConfigurableElement,
    113                                 const CParameterBlackboard *pMainBlackboard, core::Results &infos);
    114 
    115     bool removeConfigurableElement(CConfigurableElement *pConfigurableElement,
    116                                    std::string &strError);
    117 
    118     // Blackboard Configuration and Base Offset retrieval
    119     CParameterBlackboard *findConfigurationBlackboard(
    120         const std::string &strConfiguration, const CConfigurableElement *pConfigurableElement,
    121         size_t &baseOffset, bool &bIsLastApplied, std::string &strError) const;
    122 
    123     /** Split the domain in two.
    124      * Remove an element of a domain and create a new domain which owns the element.
    125      *
    126      * @param[in] pConfigurableElement pointer to the element to remove
    127      * @param[out] infos useful information we can provide to client
    128      * @return true if succeed false otherwise
    129      */
    130     bool split(CConfigurableElement *pConfigurableElement, core::Results &infos);
    131 
    132     // Ensure validity on whole domain from main blackboard
    133     void validate(const CParameterBlackboard *pMainBlackboard);
    134 
    135     /** Apply the configuration if required
    136      *
    137      * @param[in] pParameterBlackboard the blackboard to synchronize
    138      * @param[in] pSyncerSet pointer to the set containing application syncers
    139      * @param[in] bForced boolean used to force configuration application
    140      * @param[out] info string containing useful information we can provide to client
    141      */
    142     void apply(CParameterBlackboard *pParameterBlackboard, CSyncerSet *pSyncerSet, bool bForced,
    143                std::string &info) const;
    144 
    145     // Return applicable configuration validity for given configurable element
    146     bool isApplicableConfigurationValid(const CConfigurableElement *pConfigurableElement) const;
    147 
    148     // From IXmlSink
    149     bool fromXml(const CXmlElement &xmlElement,
    150                  CXmlSerializingContext &serializingContext) override;
    151 
    152     // From IXmlSource
    153     void toXml(CXmlElement &xmlElement, CXmlSerializingContext &serializingContext) const override;
    154     void childrenToXml(CXmlElement &xmlElement,
    155                        CXmlSerializingContext &serializingContext) const override;
    156 
    157     // Class kind
    158     std::string getKind() const override;
    159 
    160 protected:
    161     // Content dumping
    162     std::string logValue(utility::ErrorContext &errorContext) const override;
    163 
    164 private:
    165     // Get pending configuration
    166     const CDomainConfiguration *getPendingConfiguration() const;
    167 
    168     // Search for an applicable configuration
    169     const CDomainConfiguration *findApplicableDomainConfiguration() const;
    170 
    171     // Returns true if children dynamic creation is to be dealt with (here, will allow child
    172     // deletion upon clean)
    173     bool childrenAreDynamic() const override;
    174 
    175     // Ensure validity on areas related to configurable element
    176     void validateAreas(const CConfigurableElement *pConfigurableElement,
    177                        const CParameterBlackboard *pMainBlackboard);
    178 
    179     // Attempt validation for all configurable element's areas, relying on already existing valid
    180     // configuration inside domain
    181     void autoValidateAll();
    182 
    183     // Attempt validation for one configurable element's areas, relying on already existing valid
    184     // configuration inside domain
    185     void autoValidateAreas(const CConfigurableElement *pConfigurableElement);
    186 
    187     // Attempt configuration validation for all configurable elements' areas, relying on already
    188     // existing valid configuration inside domain
    189     bool autoValidateConfiguration(CDomainConfiguration *pDomainConfiguration);
    190 
    191     // Search for a valid configuration for given configurable element
    192     const CDomainConfiguration *findValidDomainConfiguration(
    193         const CConfigurableElement *pConfigurableElement) const;
    194 
    195     // In case configurable element was removed
    196     void computeSyncSet();
    197 
    198     // Check configurable element already attached
    199     bool containsConfigurableElement(
    200         const CConfigurableElement *pConfigurableCandidateElement) const;
    201 
    202     /** Merge any descended configurable element to this one
    203      *
    204      * @param[in] newElement pointer to element which has potential descendants which can be merged
    205      * @param[out] infos useful information we can provide to client
    206      */
    207     void mergeAlreadyAssociatedDescendantConfigurableElements(CConfigurableElement *newElement,
    208                                                               core::Results &infos);
    209 
    210     void mergeConfigurations(CConfigurableElement *pToConfigurableElement,
    211                              CConfigurableElement *pFromConfigurableElement);
    212 
    213     /** Actually realize the association between the domain and a configurable  element
    214      *
    215      * @param[in] pConfigurableElement pointer to the element to add
    216      * @param[out] infos useful information we can provide to client
    217      * @param[in] (optional) pMainBlackboard, pointer to the application main blackboard
    218      *            Default value is NULL, when provided, blackboard area concerning the configurable
    219      *            element are validated.
    220      */
    221     void doAddConfigurableElement(CConfigurableElement *pConfigurableElement, core::Results &infos,
    222                                   const CParameterBlackboard *pMainBlackboard = nullptr);
    223 
    224     void doRemoveConfigurableElement(CConfigurableElement *pConfigurableElement,
    225                                      bool bRecomputeSyncSet);
    226 
    227     // XML parsing
    228     /**
    229      * Deserialize domain configurations from an Xml document and add them to
    230      * the domain.
    231      *
    232      * @param[in] xmlElement the XML element to be parsed
    233      * @param[in] serializingContext context for the deserialization
    234      *
    235      * @return false if an error occurs, true otherwise.
    236      */
    237     bool parseDomainConfigurations(const CXmlElement &xmlElement,
    238                                    CXmlDomainImportContext &serializingContext);
    239     /**
    240      * Deserialize domain elements from an Xml document and add them to
    241      * the domain.
    242      *
    243      * @param[in] xmlElement the XML element to be parsed
    244      * @param[in] serializingContext context for the deserialization
    245      *
    246      * @return false if an error occurs, true otherwise.
    247      */
    248     bool parseConfigurableElements(const CXmlElement &xmlElement,
    249                                    CXmlDomainImportContext &serializingContext);
    250     /**
    251      * Deserialize settings from an Xml document and add them to
    252      * the domain.
    253      *
    254      * @param[in] xmlElement the XML element to be parsed
    255      * @param[in] xmlDomainImportContext context for the deserialization
    256      *
    257      * @return false if an error occurs, true otherwise.
    258      */
    259     bool parseSettings(const CXmlElement &xmlElement, CXmlDomainImportContext &serializingContext);
    260 
    261     // XML composing
    262     void composeDomainConfigurations(CXmlElement &xmlElement,
    263                                      CXmlSerializingContext &serializingContext) const;
    264     void composeConfigurableElements(CXmlElement &xmlElement) const;
    265     void composeSettings(CXmlElement &xmlElement, CXmlDomainExportContext &context) const;
    266 
    267     // Syncer set retrieval from configurable element
    268     CSyncerSet *getSyncerSet(const CConfigurableElement *pConfigurableElement) const;
    269 
    270     // Configuration retrieval
    271     CDomainConfiguration *findConfiguration(const std::string &strConfiguration,
    272                                             std::string &strError);
    273     const CDomainConfiguration *findConfiguration(const std::string &strConfiguration,
    274                                                   std::string &strError) const;
    275 
    276     // Configurable elements
    277     std::list<CConfigurableElement *> _configurableElementList;
    278 
    279     // Associated syncer sets
    280     std::map<const CConfigurableElement *, CSyncerSet *> _configurableElementToSyncerSetMap;
    281 
    282     // Sequence awareness
    283     bool _bSequenceAware{false};
    284 
    285     // Syncer set used to ensure propoer synchronization of restored configurable elements
    286     CSyncerSet _syncerSet;
    287 
    288     // Last applied configuration
    289     mutable const CDomainConfiguration *_pLastAppliedConfiguration{nullptr};
    290 };
    291