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     virtual ~CConfigurableDomain();
     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     virtual bool fromXml(const CXmlElement &xmlElement, CXmlSerializingContext &serializingContext);
    150 
    151     // From IXmlSource
    152     virtual void toXml(CXmlElement &xmlElement, CXmlSerializingContext &serializingContext) const;
    153     virtual void childrenToXml(CXmlElement &xmlElement,
    154                                CXmlSerializingContext &serializingContext) const;
    155 
    156     // Class kind
    157     virtual std::string getKind() const;
    158 
    159 protected:
    160     // Content dumping
    161     std::string logValue(utility::ErrorContext &errorContext) const override;
    162 
    163 private:
    164     // Get pending configuration
    165     const CDomainConfiguration *getPendingConfiguration() const;
    166 
    167     // Search for an applicable configuration
    168     const CDomainConfiguration *findApplicableDomainConfiguration() const;
    169 
    170     // Returns true if children dynamic creation is to be dealt with (here, will allow child
    171     // deletion upon clean)
    172     virtual bool childrenAreDynamic() const;
    173 
    174     // Ensure validity on areas related to configurable element
    175     void validateAreas(const CConfigurableElement *pConfigurableElement,
    176                        const CParameterBlackboard *pMainBlackboard);
    177 
    178     // Attempt validation for all configurable element's areas, relying on already existing valid
    179     // configuration inside domain
    180     void autoValidateAll();
    181 
    182     // Attempt validation for one configurable element's areas, relying on already existing valid
    183     // configuration inside domain
    184     void autoValidateAreas(const CConfigurableElement *pConfigurableElement);
    185 
    186     // Attempt configuration validation for all configurable elements' areas, relying on already
    187     // existing valid configuration inside domain
    188     bool autoValidateConfiguration(CDomainConfiguration *pDomainConfiguration);
    189 
    190     // Search for a valid configuration for given configurable element
    191     const CDomainConfiguration *findValidDomainConfiguration(
    192         const CConfigurableElement *pConfigurableElement) const;
    193 
    194     // In case configurable element was removed
    195     void computeSyncSet();
    196 
    197     // Check configurable element already attached
    198     bool containsConfigurableElement(
    199         const CConfigurableElement *pConfigurableCandidateElement) const;
    200 
    201     /** Merge any descended configurable element to this one
    202      *
    203      * @param[in] newElement pointer to element which has potential descendants which can be merged
    204      * @param[out] infos useful information we can provide to client
    205      */
    206     void mergeAlreadyAssociatedDescendantConfigurableElements(CConfigurableElement *newElement,
    207                                                               core::Results &infos);
    208 
    209     void mergeConfigurations(CConfigurableElement *pToConfigurableElement,
    210                              CConfigurableElement *pFromConfigurableElement);
    211 
    212     /** Actually realize the association between the domain and a configurable  element
    213      *
    214      * @param[in] pConfigurableElement pointer to the element to add
    215      * @param[out] infos useful information we can provide to client
    216      * @param[in] (optional) pMainBlackboard, pointer to the application main blackboard
    217      *            Default value is NULL, when provided, blackboard area concerning the configurable
    218      *            element are validated.
    219      */
    220     void doAddConfigurableElement(CConfigurableElement *pConfigurableElement, core::Results &infos,
    221                                   const CParameterBlackboard *pMainBlackboard = NULL);
    222 
    223     void doRemoveConfigurableElement(CConfigurableElement *pConfigurableElement,
    224                                      bool bRecomputeSyncSet);
    225 
    226     // XML parsing
    227     /**
    228      * Deserialize domain configurations from an Xml document and add them to
    229      * the domain.
    230      *
    231      * @param[in] xmlElement the XML element to be parsed
    232      * @param[in] serializingContext context for the deserialization
    233      *
    234      * @return false if an error occurs, true otherwise.
    235      */
    236     bool parseDomainConfigurations(const CXmlElement &xmlElement,
    237                                    CXmlDomainImportContext &serializingContext);
    238     /**
    239      * Deserialize domain elements from an Xml document and add them to
    240      * the domain.
    241      *
    242      * @param[in] xmlElement the XML element to be parsed
    243      * @param[in] serializingContext context for the deserialization
    244      *
    245      * @return false if an error occurs, true otherwise.
    246      */
    247     bool parseConfigurableElements(const CXmlElement &xmlElement,
    248                                    CXmlDomainImportContext &serializingContext);
    249     /**
    250      * Deserialize settings from an Xml document and add them to
    251      * the domain.
    252      *
    253      * @param[in] xmlElement the XML element to be parsed
    254      * @param[in] xmlDomainImportContext context for the deserialization
    255      *
    256      * @return false if an error occurs, true otherwise.
    257      */
    258     bool parseSettings(const CXmlElement &xmlElement, CXmlDomainImportContext &serializingContext);
    259 
    260     // XML composing
    261     void composeDomainConfigurations(CXmlElement &xmlElement,
    262                                      CXmlSerializingContext &serializingContext) const;
    263     void composeConfigurableElements(CXmlElement &xmlElement) const;
    264     void composeSettings(CXmlElement &xmlElement, CXmlDomainExportContext &context) const;
    265 
    266     // Syncer set retrieval from configurable element
    267     CSyncerSet *getSyncerSet(const CConfigurableElement *pConfigurableElement) const;
    268 
    269     // Configuration retrieval
    270     CDomainConfiguration *findConfiguration(const std::string &strConfiguration,
    271                                             std::string &strError);
    272     const CDomainConfiguration *findConfiguration(const std::string &strConfiguration,
    273                                                   std::string &strError) const;
    274 
    275     // Configurable elements
    276     std::list<CConfigurableElement *> _configurableElementList;
    277 
    278     // Associated syncer sets
    279     std::map<const CConfigurableElement *, CSyncerSet *> _configurableElementToSyncerSetMap;
    280 
    281     // Sequence awareness
    282     bool _bSequenceAware{false};
    283 
    284     // Syncer set used to ensure propoer synchronization of restored configurable elements
    285     CSyncerSet _syncerSet;
    286 
    287     // Last applied configuration
    288     mutable const CDomainConfiguration *_pLastAppliedConfiguration{nullptr};
    289 };
    290