1 /******************************************************************
3 * Copyright 2014 Samsung Electronics All Rights Reserved.
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 ******************************************************************/
20 #include "SSMResourceServer.h"
22 #include "Common/PlatformLayer.h"
23 #include "Common/InternalInterface.h"
26 static std::vector< std::map<std::string, std::string> > g_vecQueryEventResults;
28 class CQueryEngineEvent: public IQueryEngineEvent
31 std::string m_queryEngineId;
32 OCResourceHandle m_hSSMResource;
36 CQueryEngineEvent(std::string queryEngineId, OCResourceHandle resourceHandle)
38 m_queryEngineId = queryEngineId;
39 m_hSSMResource = resourceHandle;
42 SSMRESULT onQueryEngineEvent(int cqid, IDataReader *pResult)
45 IModelData *pModelData = NULL;
46 std::vector < std::string > affectedModels;
48 std::map<std::string, std::string> queryEventResult;
50 std::stringstream sstream;
53 queryEventResult["queryEngineId"] = m_queryEngineId;
57 queryEventResult["CQID"] = sstream.str();
60 pResult->getAffectedModels(&affectedModels);
62 // Affected Model Count
63 sstream << affectedModels.size();
64 queryEventResult["modelCount"] = sstream.str();
67 //TODO: we assume that contains only one model at time
68 for (std::vector< std::string >::iterator itor = affectedModels.begin();
69 itor != affectedModels.end(); ++itor)
73 queryEventResult["modelName"] = sstream.str();
76 pResult->getModelDataCount(*itor, &dataCount);
80 queryEventResult["dataCount"] = sstream.str();
83 //FixME: we have to support multiple data count
84 for (int i = 0; i < dataCount; i++)
86 pResult->getModelData(*itor, i, &pModelData);
89 sstream << pModelData->getDataId();
90 queryEventResult["dataId"] = sstream.str();
94 sstream << pModelData->getPropertyCount();
95 queryEventResult["propertyCount"] = sstream.str();
98 for (int j = 0; j < pModelData->getPropertyCount(); j++)
100 // Property Name & Value
101 sstream << pModelData->getPropertyValue(j).c_str();
102 queryEventResult[pModelData->getPropertyName(j).c_str()] = sstream.str();
108 g_vecQueryEventResults.push_back(queryEventResult);
110 //TODO: need to modify for notifying proper clients
111 if (OCPlatform::notifyAllObservers(m_hSSMResource) != OC_STACK_OK)
118 SSMResourceServer::SSMResourceServer()
120 m_hSSMResource = NULL;
123 SSMResourceServer::~SSMResourceServer()
127 int SSMResourceServer::initializeManager(std::string &xmlDescription)
129 SSMRESULT res = SSM_E_FAIL;
131 SSM_CLEANUP_ASSERT(InitializeSSMCore(xmlDescription));
132 SSM_CLEANUP_ASSERT(StartSSMCore());
134 if (createResource() != 0)
136 SSM_CLEANUP_ASSERT (SSM_E_FAIL);
146 int SSMResourceServer::terminateManager()
148 SSMRESULT res = SSM_E_FAIL;
150 SSM_CLEANUP_ASSERT(StopSSMCore());
151 SSM_CLEANUP_ASSERT(TerminateSSMCore());
160 int SSMResourceServer::createResource()
162 std::string resourceURI = "/service/SoftSensorManager"; // URI of the resource
163 std::string resourceTypeName = "core.SoftSensorManager"; // resource type name.
164 std::string resourceInterface = DEFAULT_INTERFACE; // resource interface.
166 // OCResourceProperty is defined ocstack.h
167 uint8_t resourceProperty = OC_DISCOVERABLE | OC_OBSERVABLE;
169 // This will internally create and register the resource.
170 OCStackResult result = OCPlatform::registerResource(m_hSSMResource, resourceURI,
171 resourceTypeName, resourceInterface,
172 std::bind(&SSMResourceServer::entityHandler, this, std::placeholders::_1
173 ), resourceProperty);
175 if (OC_STACK_OK != result)
183 OCEntityHandlerResult SSMResourceServer::entityHandler(std::shared_ptr< OCResourceRequest > request)
185 SSMRESULT res = SSM_E_FAIL;
187 auto response = std::make_shared<OC::OCResourceResponse>();
191 // Get the request type and request flag
192 std::string requestType = request->getRequestType();
193 int requestFlag = request->getRequestHandlerFlag();
195 response->setRequestHandle(request->getRequestHandle());
196 response->setResourceHandle(request->getResourceHandle());
198 if (requestFlag & RequestHandlerFlag::RequestFlag)
200 // If the request type is GET
201 if (requestType == "GET")
203 std::map<std::string, std::string> responseAttributeMap;
205 OCRepresentation rep = request->getResourceRepresentation();
207 if (g_vecQueryEventResults.size() > 0)
209 responseAttributeMap = g_vecQueryEventResults.front();
210 g_vecQueryEventResults.erase(g_vecQueryEventResults.begin());
215 for (std::map<std::string, std::string>::iterator itor =
216 responseAttributeMap.begin(); itor != responseAttributeMap.end();
219 rep.setValue(itor->first, itor->second);
222 response->setErrorCode(200);
223 response->setResourceRepresentation(rep, DEFAULT_INTERFACE);
226 else if (requestType == "PUT")
228 OCRepresentation rep = request->getResourceRepresentation();
230 IQueryEngine *pQueryEngine = NULL;
232 std::stringstream sstream;
234 // Process query params and do required operations ..
235 if (rep.getValue<std::string>("command") == "CreateQueryEngine")
237 CQueryEngineEvent *queryEngineEvent = NULL;
239 res = CreateQueryEngine(&pQueryEngine);
243 rep.setValue("error", "CreateQueryEngine failed");
247 sstream << reinterpret_cast<intptr_t>(pQueryEngine);
249 // Register QueryEngineEvent
250 queryEngineEvent = new CQueryEngineEvent(sstream.str(), m_hSSMResource);
252 if (queryEngineEvent == NULL)
254 rep.setValue("error", "QueryEngineEvent create failed");
258 res = pQueryEngine->registerQueryEvent(queryEngineEvent);
262 rep.setValue("error", "RegisterQueryEvent failed");
266 rep.setValue("queryEngineId", sstream.str());
268 else if (rep.getValue<std::string>("command") == "ReleaseQueryEngine")
270 pQueryEngine = (IQueryEngine *) std::stoll(
271 rep.getValue<std::string>("queryEngineId"));
273 ReleaseQueryEngine(pQueryEngine);
275 else if (rep.getValue<std::string>("command") == "ExecuteContextQuery")
279 pQueryEngine = (IQueryEngine *)std::stoll(
280 rep.getValue<std::string>("queryEngineId"));
282 res = pQueryEngine->executeContextQuery(
283 rep.getValue<std::string>("contextQuery"), &CQID);
287 rep.setValue("error", "ExecuteContextQuery failed");
293 rep.setValue("CQID", sstream.str());
295 else if (rep.getValue<std::string>("command") == "KillContextQuery")
297 pQueryEngine = (IQueryEngine *)std::stoll(
298 rep.getValue<std::string>("queryEngineId"));
300 res = pQueryEngine->killContextQuery(std::stoi(rep.getValue<std::string>("CQID")));
304 rep.setValue("error", "KillContextQuery failed");
312 response->setErrorCode(200);
313 response->setResourceRepresentation(rep, DEFAULT_INTERFACE);
316 else if (requestType == "POST")
318 // POST request operations
320 else if (requestType == "DELETE")
322 // DELETE request operations
326 if (requestFlag & RequestHandlerFlag::ObserverFlag)
328 // perform observe related operations on the resource.
332 return OCPlatform::sendResponse(response) == OC_STACK_OK ? OC_EH_OK : OC_EH_ERROR;