1 /*
2 * Copyright (c) 2024-2025 Huawei Device Co., Ltd.
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at
6 *
7 * http://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
14 */
15
16 #include "export_config_manager.h"
17
18 #include "file_util.h"
19 #include "hiview_global.h"
20 #include "hiview_logger.h"
21 #include "string_util.h"
22
23 namespace OHOS {
24 namespace HiviewDFX {
25 DEFINE_LOG_TAG("HiView-EventExportConfig");
26 namespace {
27 constexpr char EXPORT_CFG_FILE_NAME_SUFFIX[] = "_event_export_config.json";
28
GetExportConfigDir()29 std::string GetExportConfigDir()
30 {
31 auto& context = HiviewGlobal::GetInstance();
32 if (context == nullptr) {
33 return "";
34 }
35 std::string configDir = context->GetHiViewDirectory(HiviewContext::DirectoryType::CONFIG_DIRECTORY);
36 return FileUtil::IncludeTrailingPathDelimiter(configDir.append("sys_event_export"));
37 }
38 }
39
GetInstance()40 ExportConfigManager& ExportConfigManager::GetInstance()
41 {
42 static ExportConfigManager instance;
43 return instance;
44 }
45
ExportConfigManager()46 ExportConfigManager::ExportConfigManager()
47 {
48 Init();
49 }
50
GetModuleNames(std::vector<std::string> & moduleNames) const51 void ExportConfigManager::GetModuleNames(std::vector<std::string>& moduleNames) const
52 {
53 if (exportConfigs_.empty()) {
54 HIVIEW_LOGW("no module name found.");
55 return;
56 }
57 for (auto& config : exportConfigs_) {
58 moduleNames.emplace_back(config.first);
59 }
60 }
61
GetAllExportConfigs(std::vector<std::shared_ptr<ExportConfig>> & configs) const62 void ExportConfigManager::GetAllExportConfigs(std::vector<std::shared_ptr<ExportConfig>>& configs) const
63 {
64 for (auto& config : exportConfigs_) {
65 configs.emplace_back(config.second);
66 }
67 }
68
GetExportConfig(const std::string & moduleName) const69 std::shared_ptr<ExportConfig> ExportConfigManager::GetExportConfig(const std::string& moduleName) const
70 {
71 auto iter = exportConfigs_.find(moduleName);
72 if (iter == exportConfigs_.end()) {
73 return nullptr;
74 }
75 return iter->second;
76 }
77
Init()78 void ExportConfigManager::Init()
79 {
80 std::string configDir = GetExportConfigDir();
81 HIVIEW_LOGD("configuration file directory is %{public}s.", configDir.c_str());
82 if (configDir.empty()) {
83 return;
84 }
85 if (!FileUtil::IsLegalPath(configDir) || !FileUtil::FileExists(configDir)) {
86 HIVIEW_LOGW("configuration file directory is invalid, dir: %{public}s.", configDir.c_str());
87 return;
88 }
89 std::vector<std::string> configFiles;
90 FileUtil::GetDirFiles(configDir, configFiles);
91 if (configFiles.empty()) {
92 HIVIEW_LOGW("no event export configuration file found.");
93 return;
94 }
95 ParseConfigFiles(configFiles);
96 }
97
ParseConfigFiles(const std::vector<std::string> & configFiles)98 void ExportConfigManager::ParseConfigFiles(const std::vector<std::string>& configFiles)
99 {
100 for (auto& configFile : configFiles) {
101 ParseConfigFile(configFile);
102 }
103 }
104
ParseConfigFile(const std::string & configFile)105 void ExportConfigManager::ParseConfigFile(const std::string& configFile)
106 {
107 // module name consists of only lowercase letter and underline.
108 // eg. module name parsed from 'hiview_event_export_config.json' is 'hiview'
109 std::string cfgFileName = FileUtil::ExtractFileName(configFile);
110 if (!StringUtil::EndWith(cfgFileName, EXPORT_CFG_FILE_NAME_SUFFIX)) {
111 HIVIEW_LOGW("config file name is invalid, file=%{public}s.", cfgFileName.c_str());
112 return;
113 }
114 std::string moduleName = StringUtil::EraseString(cfgFileName, EXPORT_CFG_FILE_NAME_SUFFIX);
115 auto config = GetExportConfig(moduleName);
116 if (config != nullptr) {
117 HIVIEW_LOGW("this config file of %{public}s module has been parsed", moduleName.c_str());
118 return;
119 }
120 ExportConfigParser parser(configFile, moduleName);
121 config = parser.Parse();
122 if (config == nullptr || config->taskType == INVALID_TASK_TYPE) {
123 HIVIEW_LOGE("failed to parse or parsed config is invalid from file: %{public}s", configFile.c_str());
124 return;
125 }
126 exportConfigs_.emplace(moduleName, config);
127 }
128 } // HiviewDFX
129 } // OHOS