2 * Copyright (c) 2014 Samsung Electronics Co., Ltd All Rights Reserved
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
8 * http://www.apache.org/licenses/LICENSE-2.0
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.
17 * @file InMemoryStorageBackend.cpp
18 * @author Aleksander Zdyb <a.zdyb@partner.samsung.com>
20 * @brief Implementation of InMemoryStorageBackend
23 #include "InMemoryStorageBackend.h"
27 InMemoryStorageBackend::InMemoryStorageBackend() {
28 // Make sure, there's always default bucket
29 this->buckets().insert({ defaultPolicyBucketId, PolicyBucket() });
32 InMemoryStorageBackend::~InMemoryStorageBackend() {}
34 PolicyBucket InMemoryStorageBackend::searchDefaultBucket(const PolicyKey &key) {
35 return searchBucket(defaultPolicyBucketId, key);
38 PolicyBucket InMemoryStorageBackend::searchBucket(const PolicyBucketId &bucketId,
39 const PolicyKey &key) {
40 const auto &bucket = this->buckets().at(bucketId);
41 return bucket.filtered(key);
44 void InMemoryStorageBackend::insertPolicy(const PolicyBucketId &bucketId, PolicyPtr policy) {
46 auto &bucket = buckets().at(bucketId);
47 auto &policies = bucket.policyCollection();
48 policies.push_back(policy);
49 } catch (const std::out_of_range &) {
50 throw BucketNotExistsException(bucketId);
54 void InMemoryStorageBackend::createBucket(const PolicyBucketId &bucketId,
55 const PolicyResult &defaultPolicy) {
56 PolicyBucket newBucket;
57 newBucket.setDefaultPolicy(defaultPolicy);
58 buckets().insert({ bucketId, newBucket });
61 void InMemoryStorageBackend::deleteBucket(const PolicyBucketId &bucketId) {
62 auto bucketErased = buckets().erase(bucketId);
63 if (bucketErased == 0) {
64 throw BucketNotExistsException(bucketId);
68 void InMemoryStorageBackend::deletePolicy(const PolicyBucketId &bucketId, const PolicyKey &key) {
70 // TODO: Move the erase code to PolicyCollection maybe?
71 auto &bucket = buckets().at(bucketId);
72 auto &policies = bucket.policyCollection();
73 policies.erase(remove_if(policies.begin(), policies.end(),
74 [key](PolicyPtr policy) -> bool {
75 return policy->key() == key;
77 } catch(const std::out_of_range &) {
78 throw BucketNotExistsException(bucketId);
82 void InMemoryStorageBackend::deleteLinking(const PolicyBucketId &bucketId) {
83 auto bucketIdMatches = [&bucketId] (PolicyPtr policy) -> bool {
84 auto policyResult = policy->result();
86 // Check bucket id only if policy is a bucket policy
87 // TODO: Maybe move the test to PolicyResult
88 if (policyResult.policyType() == PolicyType::BUCKET) {
89 return policyResult.metadata() == bucketId;
94 for(auto &bucketIter : buckets()) {
95 // TODO: Move the erase code to PolicyCollection maybe?
96 auto &bucket = bucketIter.second;
97 auto &policies = bucket.policyCollection();
98 policies.erase(remove_if(policies.begin(), policies.end(), bucketIdMatches),
103 } /* namespace Cynara */