Home | History | Annotate | Download | only in include
      1 /*
      2  * Copyright (c) 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 "TmpFile.hpp"
     33 #include "Config.hpp"
     34 
     35 #include <string>
     36 #include <map>
     37 
     38 namespace parameterFramework
     39 {
     40 
     41 /** Create temporary config files on disk. */
     42 class ConfigFiles
     43 {
     44 public:
     45     ConfigFiles(const Config &config)
     46         : mStructureFile(
     47               format(mStructureTemplate, {{"type", config.subsystemType},
     48                                           {"instances", config.instances},
     49                                           {"components", config.components},
     50                                           {"subsystemMapping", config.subsystemMapping}})),
     51           mDomainsFile(format(mDomainsTemplate, {{"domains", config.domains}})),
     52           mConfigFile(format(mConfigTemplate, {{"structurePath", mStructureFile.getPath()},
     53                                                {"domainsPath", mDomainsFile.getPath()},
     54                                                {"plugins", toXml(config.plugins)}}))
     55     {
     56     }
     57 
     58     std::string getPath() { return mConfigFile.getPath(); }
     59 
     60 private:
     61     std::string toXml(const Config::Plugin::Collection &plugins)
     62     {
     63         std::string pluginsXml;
     64         for (auto &pluginLocation : plugins) {
     65             std::string pluginsLocationXml;
     66             auto location = pluginLocation.first;
     67             auto paths = pluginLocation.second;
     68             for (auto &path : paths) {
     69                 pluginsLocationXml += "<Plugin Name='" + path + "'/>\n";
     70             }
     71             pluginsXml +=
     72                 "<Location Folder='" + location + "'>\n" + pluginsLocationXml + "\n</Location>\n";
     73         }
     74         return pluginsXml;
     75     }
     76 
     77     std::string format(std::string format, std::map<std::string, std::string> subs)
     78     {
     79         for (auto &sub : subs) {
     80             replace(format, '{' + sub.first + '}', sub.second);
     81         }
     82         return format;
     83     }
     84 
     85     void replace(std::string &on, const std::string &from, const std::string &to)
     86     {
     87         auto from_pos = on.find(from);
     88         if (from_pos != std::string::npos) {
     89             on.replace(from_pos, from.length(), to);
     90         }
     91     }
     92 
     93     const char *mConfigTemplate = R"(<?xml version='1.0' encoding='UTF-8'?>
     94         <ParameterFrameworkConfiguration SystemClassName='test' TuningAllowed='true'>
     95             <SubsystemPlugins>
     96                 {plugins}
     97             </SubsystemPlugins>
     98             <StructureDescriptionFileLocation Path='{structurePath}'/>
     99             <SettingsConfiguration>
    100                 <ConfigurableDomainsFileLocation Path='{domainsPath}'/>
    101             </SettingsConfiguration>
    102         </ParameterFrameworkConfiguration>
    103      )";
    104     const char *mStructureTemplate = R"(<?xml version='1.0' encoding='UTF-8'?>
    105         <SystemClass Name='test'>
    106             <Subsystem Name='test' Type='{type}' Mapping='{subsystemMapping}'>
    107                 <ComponentLibrary>
    108                     {components}
    109                 </ComponentLibrary>
    110                 <InstanceDefinition>
    111                     {instances}
    112                 </InstanceDefinition>
    113             </Subsystem>
    114         </SystemClass>
    115     )";
    116     const char *mDomainsTemplate = R"(<?xml version='1.0' encoding='UTF-8'?>
    117          <ConfigurableDomains SystemClassName="test">
    118              {domains}
    119          </ConfigurableDomains>
    120     )";
    121 
    122     utility::TmpFile mStructureFile;
    123     utility::TmpFile mDomainsFile;
    124     utility::TmpFile mConfigFile;
    125 };
    126 
    127 } // parameterFramework
    128