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
38namespace parameterFramework
39{
40
41/** Create temporary config files on disk. */
42class ConfigFiles
43{
44public:
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
60private:
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