PageRenderTime 43ms CodeModel.GetById 12ms RepoModel.GetById 0ms app.codeStats 1ms

/src/common/types/PolicyBucket.cpp

https://gitlab.com/github-cloud-corporation/cynara
C++ | 136 lines | 91 code | 23 blank | 22 comment | 19 complexity | 21fbc1c595ad84fde68a388c212a9d16 MD5 | raw file
  1. /*
  2. * Copyright (c) 2014 Samsung Electronics Co., Ltd All Rights Reserved
  3. *
  4. * Licensed under the Apache License, Version 2.0 (the "License");
  5. * you may not use this file except in compliance with the License.
  6. * You may obtain a copy of the License at
  7. *
  8. * http://www.apache.org/licenses/LICENSE-2.0
  9. *
  10. * Unless required by applicable law or agreed to in writing, software
  11. * distributed under the License is distributed on an "AS IS" BASIS,
  12. * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  13. * See the License for the specific language governing permissions and
  14. * limitations under the License.
  15. */
  16. /**
  17. * @file src/common/types/PolicyBucket.cpp
  18. * @author Aleksander Zdyb <a.zdyb@samsung.com>
  19. * @version 1.0
  20. * @brief Implementation of Cynara::PolicyBucket methods
  21. */
  22. #include <cstring>
  23. #include <sstream>
  24. #include <exceptions/InvalidBucketIdException.h>
  25. #include <types/PolicyCollection.h>
  26. #include <types/PolicyKeyHelpers.h>
  27. #include "PolicyBucket.h"
  28. namespace Cynara {
  29. const char PolicyBucket::m_idSeparators[] = "-_";
  30. PolicyBucket::PolicyBucket(const PolicyBucketId &id, const PolicyResult &defaultPolicy)
  31. : m_defaultPolicy(defaultPolicy), m_id(id) {
  32. idValidator(id);
  33. }
  34. PolicyBucket::PolicyBucket(const PolicyBucketId &id, const PolicyCollection &policies)
  35. : m_policyCollection(makePolicyMap(policies)), m_defaultPolicy(PredefinedPolicyType::DENY),
  36. m_id(id) {
  37. idValidator(id);
  38. }
  39. PolicyBucket::PolicyBucket(const PolicyBucketId &id, const PolicyResult &defaultPolicy,
  40. const PolicyCollection &policies)
  41. : m_policyCollection(makePolicyMap(policies)), m_defaultPolicy(defaultPolicy), m_id(id) {
  42. idValidator(id);
  43. }
  44. PolicyBucket PolicyBucket::filtered(const PolicyKey &key) const {
  45. PolicyBucket result(m_id + "_filtered");
  46. const auto &policies = m_policyCollection;
  47. const auto variants = PolicyKeyHelpers::keyVariants(key);
  48. for (const auto &variant : variants) {
  49. const auto policyIter = policies.find(variant);
  50. if (policyIter != policies.end()) {
  51. result.m_policyCollection[policyIter->first] = policyIter->second;
  52. }
  53. }
  54. // Inherit original policy
  55. result.setDefaultPolicy(defaultPolicy());
  56. return result;
  57. }
  58. void PolicyBucket::insertPolicy(PolicyPtr policy) {
  59. const auto gluedKey = PolicyKeyHelpers::glueKey(policy->key());
  60. m_policyCollection[gluedKey] = policy;
  61. }
  62. void PolicyBucket::deletePolicy(const PolicyKey &key) {
  63. const auto gluedKey = PolicyKeyHelpers::glueKey(key);
  64. m_policyCollection.erase(gluedKey);
  65. }
  66. void PolicyBucket::deletePolicy(std::function<bool(PolicyPtr)> predicate) {
  67. auto &policies = m_policyCollection;
  68. for (auto iter = policies.begin(); iter != policies.end(); ) {
  69. if (predicate(iter->second)) {
  70. policies.erase(iter++);
  71. } else {
  72. ++iter;
  73. }
  74. }
  75. }
  76. PolicyBucket::Policies PolicyBucket::listPolicies(const PolicyKey &filter) const {
  77. PolicyBucket::Policies policies;
  78. for (auto iter = m_policyCollection.begin(); iter != m_policyCollection.end(); ++iter) {
  79. auto &policyPtr = iter->second;
  80. if (policyPtr->key().matchFilter(filter))
  81. policies.push_back(*policyPtr);
  82. }
  83. return policies;
  84. }
  85. PolicyBucket::BucketIds PolicyBucket::getSubBuckets(void) const {
  86. PolicyBucket::BucketIds buckets;
  87. for (auto iter = m_policyCollection.begin(); iter != m_policyCollection.end(); ++iter) {
  88. auto &policyPtr = iter->second;
  89. if (policyPtr->result().policyType() == PredefinedPolicyType::BUCKET)
  90. buckets.insert(policyPtr->result().metadata());
  91. }
  92. return buckets;
  93. }
  94. PolicyMap PolicyBucket::makePolicyMap(const PolicyCollection &policies) {
  95. PolicyMap result;
  96. for (const auto &policy : policies) {
  97. const auto gluedKey = PolicyKeyHelpers::glueKey(policy->key());
  98. result[gluedKey] = policy;
  99. }
  100. return result;
  101. }
  102. void PolicyBucket::idValidator(const PolicyBucketId &id) {
  103. auto isCharInvalid = [] (char c) {
  104. return !(std::isalnum(c) || isIdSeparator(c));
  105. };
  106. if (id.end() != find_if(id.begin(), id.end(), isCharInvalid)) {
  107. throw InvalidBucketIdException(id);
  108. }
  109. }
  110. bool PolicyBucket::isIdSeparator(char c) {
  111. return strchr(m_idSeparators, c) != nullptr;
  112. }
  113. } // namespace Cynara