• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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