114cf0368Sopenharmony_ci/* 214cf0368Sopenharmony_ci * Copyright (c) 2023 Huawei Device Co., Ltd. 314cf0368Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License"); 414cf0368Sopenharmony_ci * you may not use this file except in compliance with the License. 514cf0368Sopenharmony_ci * You may obtain a copy of the License at 614cf0368Sopenharmony_ci * 714cf0368Sopenharmony_ci * http://www.apache.org/licenses/LICENSE-2.0 814cf0368Sopenharmony_ci * 914cf0368Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software 1014cf0368Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS, 1114cf0368Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1214cf0368Sopenharmony_ci * See the License for the specific language governing permissions and 1314cf0368Sopenharmony_ci * limitations under the License. 1414cf0368Sopenharmony_ci */ 1514cf0368Sopenharmony_ci#define LOG_TAG "UtdGraph" 1614cf0368Sopenharmony_ci#include "utd_graph.h" 1714cf0368Sopenharmony_ci#include "logger.h" 1814cf0368Sopenharmony_cinamespace OHOS { 1914cf0368Sopenharmony_cinamespace UDMF { 2014cf0368Sopenharmony_ciUtdGraph::UtdGraph() 2114cf0368Sopenharmony_ci{ 2214cf0368Sopenharmony_ci LOG_INFO(UDMF_CLIENT, "construct UtdGraph sucess."); 2314cf0368Sopenharmony_ci} 2414cf0368Sopenharmony_ci 2514cf0368Sopenharmony_ciUtdGraph::~UtdGraph() 2614cf0368Sopenharmony_ci{ 2714cf0368Sopenharmony_ci} 2814cf0368Sopenharmony_ci 2914cf0368Sopenharmony_ciUtdGraph &UtdGraph::GetInstance() 3014cf0368Sopenharmony_ci{ 3114cf0368Sopenharmony_ci static auto instance = new UtdGraph(); 3214cf0368Sopenharmony_ci return *instance; 3314cf0368Sopenharmony_ci} 3414cf0368Sopenharmony_ci 3514cf0368Sopenharmony_cibool UtdGraph::IsValidType(const std::string &node) 3614cf0368Sopenharmony_ci{ 3714cf0368Sopenharmony_ci std::unique_lock<std::mutex> lock(graphMutex_); 3814cf0368Sopenharmony_ci return graph_->IsValidType(node); 3914cf0368Sopenharmony_ci} 4014cf0368Sopenharmony_ci 4114cf0368Sopenharmony_civoid UtdGraph::InitUtdGraph(const std::vector<TypeDescriptorCfg> &descriptorCfgs) 4214cf0368Sopenharmony_ci{ 4314cf0368Sopenharmony_ci std::map<std::string, uint32_t> typeIdIndex; 4414cf0368Sopenharmony_ci uint32_t descriptorsNum = static_cast<uint32_t>(descriptorCfgs.size()); 4514cf0368Sopenharmony_ci for (uint32_t i = 0; i < descriptorsNum; i++) { 4614cf0368Sopenharmony_ci typeIdIndex.insert(std::make_pair(descriptorCfgs[i].typeId, i)); 4714cf0368Sopenharmony_ci } 4814cf0368Sopenharmony_ci std::unique_lock<std::mutex> lock(graphMutex_); 4914cf0368Sopenharmony_ci graph_ = std::make_unique<Graph>(descriptorsNum, typeIdIndex); 5014cf0368Sopenharmony_ci for (const auto &descriptorCfg : descriptorCfgs) { 5114cf0368Sopenharmony_ci std::vector<std::string> belongsTo = descriptorCfg.belongingToTypes; 5214cf0368Sopenharmony_ci for (auto belongsToType : belongsTo) { 5314cf0368Sopenharmony_ci graph_->AddEdge(belongsToType, descriptorCfg.typeId); 5414cf0368Sopenharmony_ci } 5514cf0368Sopenharmony_ci } 5614cf0368Sopenharmony_ci LOG_INFO(UDMF_CLIENT, "InitUtdGraph success, descriptorsNum:%{public}u. ", descriptorsNum); 5714cf0368Sopenharmony_ci} 5814cf0368Sopenharmony_ci 5914cf0368Sopenharmony_cibool UtdGraph::IsLowerLevelType(const std::string &lowerLevelType, const std::string &heigitLevelType) 6014cf0368Sopenharmony_ci{ 6114cf0368Sopenharmony_ci std::unique_lock<std::mutex> lock(graphMutex_); 6214cf0368Sopenharmony_ci bool isFind = false; 6314cf0368Sopenharmony_ci int32_t start = graph_->GetIndex(lowerLevelType); 6414cf0368Sopenharmony_ci int32_t end = graph_->GetIndex(heigitLevelType); 6514cf0368Sopenharmony_ci if (start < 0 || end < 0) { 6614cf0368Sopenharmony_ci return false; 6714cf0368Sopenharmony_ci } 6814cf0368Sopenharmony_ci uint32_t uStart = static_cast<uint32_t>(start); 6914cf0368Sopenharmony_ci uint32_t uEnd = static_cast<uint32_t>(end); 7014cf0368Sopenharmony_ci graph_->Dfs(uStart, [&isFind, &uEnd](uint32_t currNode)-> bool { 7114cf0368Sopenharmony_ci if (uEnd == currNode) { 7214cf0368Sopenharmony_ci isFind = true; 7314cf0368Sopenharmony_ci return true; 7414cf0368Sopenharmony_ci } 7514cf0368Sopenharmony_ci return false; 7614cf0368Sopenharmony_ci }); 7714cf0368Sopenharmony_ci return isFind; 7814cf0368Sopenharmony_ci} 7914cf0368Sopenharmony_ci 8014cf0368Sopenharmony_cistd::unique_ptr<Graph> UtdGraph::ConstructNewGraph(const std::vector<TypeDescriptorCfg> &descriptorCfgs) 8114cf0368Sopenharmony_ci{ 8214cf0368Sopenharmony_ci std::map<std::string, uint32_t> typeIdIndex; 8314cf0368Sopenharmony_ci uint32_t descriptorsNum = static_cast<uint32_t>(descriptorCfgs.size()); 8414cf0368Sopenharmony_ci for (uint32_t i = 0; i < descriptorsNum; i++) { 8514cf0368Sopenharmony_ci typeIdIndex.insert(std::make_pair(descriptorCfgs[i].typeId, i)); 8614cf0368Sopenharmony_ci } 8714cf0368Sopenharmony_ci auto graph = std::make_unique<Graph>(descriptorsNum, typeIdIndex); 8814cf0368Sopenharmony_ci 8914cf0368Sopenharmony_ci for (const auto &descriptorCfg : descriptorCfgs) { 9014cf0368Sopenharmony_ci std::vector<std::string> belongsTo = descriptorCfg.belongingToTypes; 9114cf0368Sopenharmony_ci for (auto belongsToType : belongsTo) { 9214cf0368Sopenharmony_ci graph->AddEdge(belongsToType, descriptorCfg.typeId); 9314cf0368Sopenharmony_ci } 9414cf0368Sopenharmony_ci } 9514cf0368Sopenharmony_ci return graph; 9614cf0368Sopenharmony_ci} 9714cf0368Sopenharmony_ci 9814cf0368Sopenharmony_civoid UtdGraph::Update(std::unique_ptr<Graph> graph) 9914cf0368Sopenharmony_ci{ 10014cf0368Sopenharmony_ci std::unique_lock<std::mutex> lock(graphMutex_); 10114cf0368Sopenharmony_ci graph_ = std::move(graph); 10214cf0368Sopenharmony_ci} 10314cf0368Sopenharmony_ci} // namespace UDMF 10414cf0368Sopenharmony_ci} // namespace OHOS 105