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:
ConfigFiles(const Config & config)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 
getPath()58     std::string getPath() { return mConfigFile.getPath(); }
59 
60 private:
toXml(const Config::Plugin::Collection & plugins)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 
format(std::string format,std::map<std::string,std::string> subs)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 
replace(std::string & on,const std::string & from,const std::string & to)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 } // namespace parameterFramework
128