1 //******************************************************************
3 // Copyright 2015 Samsung Electronics All Rights Reserved.
5 //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
7 // Licensed under the Apache License, Version 2.0 (the "License");
8 // you may not use this file except in compliance with the License.
9 // You may obtain a copy of the License at
11 // http://www.apache.org/licenses/LICENSE-2.0
13 // Unless required by applicable law or agreed to in writing, software
14 // distributed under the License is distributed on an "AS IS" BASIS,
15 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16 // See the License for the specific language governing permissions and
17 // limitations under the License.
19 //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
21 #include "ResourceCacheManager.h"
22 #include "RCSException.h"
29 ResourceCacheManager *ResourceCacheManager::s_instance = NULL;
30 std::mutex ResourceCacheManager::s_mutexForCreation;
31 std::mutex ResourceCacheManager::s_mutex;
32 std::unique_ptr<std::list<DataCachePtr>> ResourceCacheManager::s_cacheDataList(nullptr);
34 ResourceCacheManager::~ResourceCacheManager()
36 std::lock_guard<std::mutex> lock(s_mutex);
37 if (s_cacheDataList != nullptr)
39 s_cacheDataList->clear();
43 ResourceCacheManager *ResourceCacheManager::getInstance()
45 if (s_instance == nullptr)
47 s_mutexForCreation.lock();
48 if (s_instance == nullptr)
50 s_instance = new ResourceCacheManager();
51 s_instance->initializeResourceCacheManager();
53 s_mutexForCreation.unlock();
58 CacheID ResourceCacheManager::requestResourceCache(
59 PrimitiveResourcePtr pResource, CacheCB func, CACHE_METHOD cm,
60 REPORT_FREQUENCY rf, long reportTime)
62 if (pResource == nullptr)
64 throw RCSInvalidParameterException {"[requestResourceCache] Primitive Resource is invaild"};
69 if (cm == CACHE_METHOD::OBSERVE_ONLY)
71 if (func == NULL || func == nullptr)
73 throw RCSInvalidParameterException {"[requestResourceCache] CacheCB is invaild"};
76 std::lock_guard<std::mutex> lock(s_mutex);
77 retID = OCGetRandom();
78 while(observeCacheIDmap.find(retID) != observeCacheIDmap.end())
80 retID = OCGetRandom();
83 auto newHandler = std::make_shared<ObserveCache>(pResource);
84 newHandler->startCache(std::move(func));
85 m_observeCacheList.push_back(newHandler);
87 observeCacheIDmap.insert(std::make_pair(retID, newHandler));
91 if (rf != REPORT_FREQUENCY::NONE)
93 if (func == NULL || func == nullptr)
95 throw RCSInvalidParameterException {"[requestResourceCache] CacheCB is invaild"};
100 reportTime = CACHE_DEFAULT_REPORT_MILLITIME;
104 DataCachePtr newHandler = findDataCache(pResource);
105 if (newHandler == nullptr)
107 std::lock_guard<std::mutex> lock(s_mutex);
108 newHandler.reset(new DataCache());
109 newHandler->initializeDataCache(pResource);
110 s_cacheDataList->push_back(newHandler);
112 retID = newHandler->addSubscriber(func, rf, reportTime);
114 cacheIDmap.insert(std::make_pair(retID, newHandler));
119 void ResourceCacheManager::cancelResourceCache(CacheID id)
121 auto observeIns = observeCacheIDmap.find(id);
122 auto dataCacheIns = cacheIDmap.find(id);
123 if ((dataCacheIns == cacheIDmap.end() && observeIns == observeCacheIDmap.end())
126 throw RCSInvalidParameterException {"[cancelResourceCache] CacheID is invaild"};
129 if (observeIns != observeCacheIDmap.end())
131 (observeIns->second)->stopCache();
132 (observeIns->second).reset();
133 observeCacheIDmap.erase(observeIns);
137 DataCachePtr foundCacheHandler = findDataCache(id);
138 if (foundCacheHandler != nullptr)
140 CacheID retID = foundCacheHandler->deleteSubscriber(id);
143 cacheIDmap.erase(id);
145 std::lock_guard<std::mutex> lock(s_mutex);
146 if (foundCacheHandler->isEmptySubscriber())
148 s_cacheDataList->remove(foundCacheHandler);
153 void ResourceCacheManager::updateResourceCache(CacheID updateId) const
157 throw RCSInvalidParameterException {"[getCachedData] CacheID is NULL"};
160 DataCachePtr foundCache = findDataCache(updateId);
161 if (foundCache == nullptr)
163 throw RCSInvalidParameterException {"[getCachedData] CacheID is invaild"};
165 foundCache->requestGet();
168 const RCSResourceAttributes ResourceCacheManager::getCachedData(CacheID id) const
172 throw RCSInvalidParameterException {"[getCachedData] CacheID is NULL"};
175 auto observePtr = observeCacheIDmap.find(id);
176 if (observePtr != observeCacheIDmap.end())
178 return (observePtr->second)->getCachedData();
181 DataCachePtr handler = findDataCache(id);
182 if (handler == nullptr)
184 throw RCSInvalidParameterException {"[getCachedData] CacheID is invaild"};
187 if (handler->isCachedData() == false)
189 throw HasNoCachedDataException {"[getCachedData] Cached Data is not stored"};
192 return handler->getCachedData();
195 CACHE_STATE ResourceCacheManager::getResourceCacheState(CacheID id) const
199 throw RCSInvalidParameterException {"[getResourceCacheState] CacheID is NULL"};
202 auto observePtr = observeCacheIDmap.find(id);
203 if (observePtr != observeCacheIDmap.end())
205 return (observePtr->second)->getCacheState();
208 DataCachePtr handler = findDataCache(id);
209 if (handler == nullptr)
211 return CACHE_STATE::NONE;
213 return handler->getCacheState();
216 bool ResourceCacheManager::isCachedData(CacheID id) const
220 throw RCSInvalidParameterException {"[isCachedData] CacheID is NULL"};
223 auto observePtr = observeCacheIDmap.find(id);
224 if (observePtr != observeCacheIDmap.end())
226 return (observePtr->second)->isCachedData();
229 DataCachePtr handler = findDataCache(id);
230 if (handler == nullptr)
232 throw RCSInvalidParameterException {"[isCachedData] CacheID is invaild"};
234 return handler->isCachedData();
237 void ResourceCacheManager::initializeResourceCacheManager()
239 std::lock_guard<std::mutex> lock(s_mutex);
240 if (s_cacheDataList == nullptr)
243 = std::unique_ptr<std::list<DataCachePtr>>(new std::list<DataCachePtr>);
247 DataCachePtr ResourceCacheManager::findDataCache(PrimitiveResourcePtr pResource) const
249 DataCachePtr retHandler = nullptr;
250 std::lock_guard<std::mutex> lock(s_mutex);
251 for (auto &i : * s_cacheDataList)
253 if (i->getPrimitiveResource()->getUri() == pResource->getUri() &&
254 i->getPrimitiveResource()->getHost() == pResource->getHost())
263 DataCachePtr ResourceCacheManager::findDataCache(CacheID id) const
265 DataCachePtr retHandler = nullptr;
266 for (auto it : cacheIDmap)
270 retHandler = it.second;
277 } // namespace Service