1020a203aSopenharmony_ci/*
2020a203aSopenharmony_ci * Copyright (c) 2021 Huawei Device Co., Ltd.
3020a203aSopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License");
4020a203aSopenharmony_ci * you may not use this file except in compliance with the License.
5020a203aSopenharmony_ci * You may obtain a copy of the License at
6020a203aSopenharmony_ci *
7020a203aSopenharmony_ci *     http://www.apache.org/licenses/LICENSE-2.0
8020a203aSopenharmony_ci *
9020a203aSopenharmony_ci * Unless required by applicable law or agreed to in writing, software
10020a203aSopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS,
11020a203aSopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12020a203aSopenharmony_ci * See the License for the specific language governing permissions and
13020a203aSopenharmony_ci * limitations under the License.
14020a203aSopenharmony_ci */
15020a203aSopenharmony_ci#include "compose_rule.h"
16020a203aSopenharmony_ci
17020a203aSopenharmony_ci#include <algorithm>
18020a203aSopenharmony_ci#include <fstream>
19020a203aSopenharmony_ci#include <memory>
20020a203aSopenharmony_ci
21020a203aSopenharmony_ci#include "file_util.h"
22020a203aSopenharmony_ci#include "hiview_logger.h"
23020a203aSopenharmony_ci#include "string_util.h"
24020a203aSopenharmony_ci
25020a203aSopenharmony_ciusing namespace std;
26020a203aSopenharmony_cinamespace OHOS {
27020a203aSopenharmony_cinamespace HiviewDFX {
28020a203aSopenharmony_ciDEFINE_LOG_TAG("ComposeRule");
29020a203aSopenharmony_ci
30020a203aSopenharmony_civoid ComposeRule::ParseComposeRule(const string& config, const string& type, vector<string> featureIds)
31020a203aSopenharmony_ci{
32020a203aSopenharmony_ci    std::ifstream fin(config, std::ifstream::binary);
33020a203aSopenharmony_ci#ifdef JSONCPP_VERSION_STRING
34020a203aSopenharmony_ci    Json::CharReaderBuilder builder;
35020a203aSopenharmony_ci    Json::CharReaderBuilder::strictMode(&builder.settings_);
36020a203aSopenharmony_ci    JSONCPP_STRING errs;
37020a203aSopenharmony_ci#else
38020a203aSopenharmony_ci    Json::Reader reader(Json::Features::strictMode());
39020a203aSopenharmony_ci#endif
40020a203aSopenharmony_ci
41020a203aSopenharmony_ci    Json::Value root;
42020a203aSopenharmony_ci#ifdef JSONCPP_VERSION_STRING
43020a203aSopenharmony_ci    bool ret = parseFromStream(builder, fin, &root, &errs);
44020a203aSopenharmony_ci    if (!ret || !errs.empty() || !root.isMember(type)) {
45020a203aSopenharmony_ci        HIVIEW_LOGE("Json parse fail, err is %{public}s or %{public}s don't exist in %{public}s.",
46020a203aSopenharmony_ci            errs.c_str(), type.c_str(), config.c_str());
47020a203aSopenharmony_ci        return;
48020a203aSopenharmony_ci    }
49020a203aSopenharmony_ci#else
50020a203aSopenharmony_ci    if (!reader.parse(fin, root) || !root.isMember(type)) {
51020a203aSopenharmony_ci        HIVIEW_LOGE("Json parse fail in %{public}s.", config.c_str());
52020a203aSopenharmony_ci        return;
53020a203aSopenharmony_ci    }
54020a203aSopenharmony_ci#endif
55020a203aSopenharmony_ci
56020a203aSopenharmony_ci    ParseRule(root[type], type, featureIds);
57020a203aSopenharmony_ci    HIVIEW_LOGI("ComposeRule ParseFile end.");
58020a203aSopenharmony_ci    return;
59020a203aSopenharmony_ci}
60020a203aSopenharmony_ci
61020a203aSopenharmony_cistd::list<std::pair<std::string, std::map<std::string, std::string>>> ComposeRule::GetComposeRule() const
62020a203aSopenharmony_ci{
63020a203aSopenharmony_ci    return composeRules_;
64020a203aSopenharmony_ci}
65020a203aSopenharmony_ci
66020a203aSopenharmony_civoid ComposeRule::ParseRule(const Json::Value& json, const string& type, vector<string>& featureIds)
67020a203aSopenharmony_ci{
68020a203aSopenharmony_ci    sort(featureIds.begin(), featureIds.end(), ComparePrio);
69020a203aSopenharmony_ci    for (const auto& featureId : featureIds) {
70020a203aSopenharmony_ci        map<string, string> composeParams = GetMapFromJson(json, featureId);
71020a203aSopenharmony_ci        composeRules_.emplace_back(pair<string, map<string, string>>(featureId, composeParams));
72020a203aSopenharmony_ci    }
73020a203aSopenharmony_ci}
74020a203aSopenharmony_ci
75020a203aSopenharmony_cibool ComposeRule::ComparePrio(const string& featureIdOne, const string& featureIdTwo)
76020a203aSopenharmony_ci{
77020a203aSopenharmony_ci    return StringUtil::GetRightSubstr(featureIdOne, "_") < StringUtil::GetRightSubstr(featureIdTwo, "_");
78020a203aSopenharmony_ci}
79020a203aSopenharmony_ci
80020a203aSopenharmony_cistd::map<std::string, std::string> ComposeRule::GetMapFromJson(const Json::Value& json, const string& featureId)
81020a203aSopenharmony_ci{
82020a203aSopenharmony_ci    if (!json.isMember(featureId)) {
83020a203aSopenharmony_ci        HIVIEW_LOGE("ComposeRule don't have %{public}s featureId.", featureId.c_str());
84020a203aSopenharmony_ci        return {};
85020a203aSopenharmony_ci    }
86020a203aSopenharmony_ci    std::map<std::string, std::string> result;
87020a203aSopenharmony_ci    auto value = json[featureId];
88020a203aSopenharmony_ci    for (auto iter = value.begin(); iter != value.end(); iter++) {
89020a203aSopenharmony_ci        result.emplace(pair<std::string, std::string>(iter.key().asString(), (*iter).asString()));
90020a203aSopenharmony_ci    }
91020a203aSopenharmony_ci    return result;
92020a203aSopenharmony_ci}
93020a203aSopenharmony_ci} // namespace HiviewDFX
94020a203aSopenharmony_ci} // namespace OHOS
95