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