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