提交 f26a55a4482d1f9fdf4bae96cd253d6951106cbf

作者 LJH 李佳桓
1 个父辈 17dbfb23

add

正在显示 1 个修改的文件 包含 170 行增加0 行删除
  1 +/**************************************************************************
  2 +* file: dmpserviceregistry.cpp
  3 +
  4 +* Author: wanzhongping
  5 +* Date: 2020-12-23 15:53:11
  6 +* Email: zhongpingw@chinadci.com
  7 +* copyright: 广州城市信息研究所有限公司
  8 +***************************************************************************/
  9 +#include "dmpserviceregistry.h"
  10 +#include "dmpservice.h"
  11 +#include <boost/format.hpp>
  12 +#include <boost/algorithm/string.hpp>
  13 +
  14 +namespace
  15 +{
  16 +
  17 + string MakeServiceKey(const string &name, const string &version)
  18 + {
  19 + boost::format fmt = boost::format("%1%_%2%") % name % version;
  20 + return fmt.str();
  21 + }
  22 +
  23 + bool IsVersionGreater(const string &v1, const string &v2)
  24 + {
  25 + vector<string> vecSeg1;
  26 + boost::split(vecSeg1, v1, boost::is_any_of("."), boost::token_compress_on);
  27 + vector<string> vecSeg2;
  28 + boost::split(vecSeg2, v2, boost::is_any_of("."), boost::token_compress_on);
  29 +
  30 + vector<string>::iterator it1 = vecSeg1.begin();
  31 + vector<string>::iterator it2 = vecSeg2.begin();
  32 + bool isint;
  33 + while (it1 != vecSeg1.end() && it2 != vecSeg2.end())
  34 + {
  35 + if (*it1 != *it2)
  36 + {
  37 + // Compare as numbers
  38 + int i1 = atoi(it1->c_str());
  39 + int i2 = atoi(it2->c_str());
  40 + if (i1 != i2)
  41 + {
  42 + return i1 > i2;
  43 + }
  44 + }
  45 + ++it1;
  46 + ++it2;
  47 + }
  48 + return false;
  49 + }
  50 +} // namespace
  51 +
  52 +DmpServiceRegistry::~DmpServiceRegistry()
  53 +{
  54 + CleanUp();
  55 + std::cout << "Destructing DmpServiceRegistry" << std::endl;
  56 +}
  57 +
  58 +void DmpServiceRegistry::Init(const boost::filesystem::path &module_path)
  59 +{
  60 + nativeLoader_.LoadModules(module_path, *this);
  61 +}
  62 +
  63 +std::shared_ptr<DmpService> DmpServiceRegistry::GetService(const string &name, const string &version)
  64 +{
  65 + std::shared_ptr<DmpService> sp_service = nullptr;
  66 + string key;
  67 + string nameUpper = boost::to_upper_copy(name);
  68 + VersionMap::const_iterator it = serviceVersions_.find(nameUpper);
  69 + if (it != serviceVersions_.end())
  70 + {
  71 + key = version.empty() ? it->second.second : MakeServiceKey(nameUpper, version);
  72 + ServiceMap::const_iterator iter = services_.find(key);
  73 + if (iter != services_.end())
  74 + {
  75 + sp_service = iter->second;
  76 + }
  77 + else
  78 + {
  79 + // Return the default version
  80 + //QgsMessageLog::logMessage(QString("Service %1 %2 not found, returning default").arg(name, version));
  81 + sp_service = services_[it->second.second];
  82 + }
  83 + }
  84 + else
  85 + {
  86 + //QgsMessageLog::logMessage(QString("Service %1 is not registered").arg(name));
  87 + }
  88 + return sp_service;
  89 +}
  90 +
  91 +void DmpServiceRegistry::RegisterService(std::shared_ptr<DmpService> service)
  92 +{
  93 + string name = service->Name();
  94 + boost::to_upper(name);
  95 + string version = service->Version();
  96 +
  97 + string key = MakeServiceKey(name, version);
  98 + if (services_.find(key) != services_.end()){
  99 + return;
  100 + }
  101 + services_[key] = service;
  102 + if (serviceVersions_.find(name) == serviceVersions_.end()){
  103 + serviceVersions_.insert(pair<string, pair<string, string>>(name, pair<string, string>(version, key)));
  104 + }
  105 +}
  106 +
  107 +int DmpServiceRegistry::UnregisterService(const string &name, const string &version)
  108 +{
  109 + int removed = 0;
  110 + VersionMap::const_iterator it = serviceVersions_.find(name);
  111 + if (it != serviceVersions_.end())
  112 + {
  113 + if (version.empty())
  114 + {
  115 + ServiceMap::iterator iter = services_.begin();
  116 + while (iter != services_.end())
  117 + {
  118 + if (iter->second->Name() == name)
  119 + {
  120 + //QgsMessageLog::logMessage( QString( "Unregistering service %1 %2" ).arg( name, ( *it )->version() ) );
  121 + iter = services_.erase(iter);
  122 + ++removed;
  123 + }
  124 + else
  125 + {
  126 + ++iter;
  127 + }
  128 + }
  129 + serviceVersions_.erase(it);
  130 + }
  131 + else
  132 + {
  133 + string key = MakeServiceKey(name, version);
  134 + ServiceMap::iterator found = services_.find(key);
  135 + if (found != services_.end())
  136 + {
  137 + //QgsMessageLog::logMessage( QString( "Unregistering service %1 %2" ).arg( name, version ) );
  138 + services_.erase(found);
  139 + removed = 1;
  140 +
  141 + //findGreaterVersion为匿名函数
  142 + string maxVer;
  143 + std::function<void(const ServiceMap::value_type &)>
  144 + findGreaterVersion = [name, &maxVer](const ServiceMap::value_type &item) {
  145 + if (item.second->Name() == name &&
  146 + (maxVer.empty() || IsVersionGreater(item.second->Version(), maxVer)))
  147 + maxVer = item.second->Version();
  148 + };
  149 +
  150 + serviceVersions_.erase(name);
  151 +
  152 + std::for_each(services_.begin(), services_.end(), findGreaterVersion);
  153 + if (!maxVer.empty())
  154 + {
  155 + // Set the new default service
  156 + string key = MakeServiceKey(name, maxVer);
  157 + serviceVersions_.insert(pair<string, pair<string, string>>(name, pair<string, string>(version, key)));
  158 + }
  159 + }
  160 + }
  161 + }
  162 + return removed;
  163 +}
  164 +
  165 +void DmpServiceRegistry::CleanUp()
  166 +{
  167 + serviceVersions_.clear();
  168 + services_.clear();
  169 + nativeLoader_.UnloadModules();
  170 +}
注册登录 后发表评论