1 /******************************************************************
3 * Copyright 2015 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 ******************************************************************/
21 #include "simulator_single_resource_impl.h"
22 #include "simulator_utils.h"
23 #include "oc_interface_details.h"
24 #include "simulator_logger.h"
27 #define TAG "SIMULATOR_SINGLE_RESOURCE"
29 SimulatorSingleResourceImpl::SimulatorSingleResourceImpl()
31 m_type = SimulatorResource::Type::SINGLE_RESOURCE;
32 m_interfaces.push_back(OC::DEFAULT_INTERFACE);
33 m_property = static_cast<OCResourceProperty>(OC_DISCOVERABLE | OC_OBSERVABLE);
34 m_resModelSchema = SimulatorResourceModelSchema::build();
36 // Set resource supports GET, PUT and POST by default
37 m_requestModels["GET"] = nullptr;
38 m_requestModels["POST"] = nullptr;
39 m_requestModels["PUT"] = nullptr;
41 m_resourceHandle = nullptr;
44 void SimulatorSingleResourceImpl::setName(const std::string &name)
46 VALIDATE_INPUT(name.empty(), "Name is empty!")
50 void SimulatorSingleResourceImpl::setURI(const std::string &uri)
52 VALIDATE_INPUT(uri.empty(), "Uri is empty!")
54 std::lock_guard<std::recursive_mutex> lock(m_objectLock);
57 throw SimulatorException(SIMULATOR_OPERATION_NOT_ALLOWED,
58 "URI can not be set when resource is started!");
64 void SimulatorSingleResourceImpl::setResourceType(const std::string &resourceType)
66 VALIDATE_INPUT(resourceType.empty(), "Resource type is empty!")
68 std::lock_guard<std::recursive_mutex> lock(m_objectLock);
71 throw SimulatorException(SIMULATOR_OPERATION_NOT_ALLOWED,
72 "Resource type cannot be set when resource is started!");
75 m_resourceType = resourceType;
78 void SimulatorSingleResourceImpl::setInterface(const std::string &interfaceType)
80 VALIDATE_INPUT(interfaceType.empty(), "Interface type list is empty!")
82 if (false == OCInterfaceDetails::getInstance()->isInterface(interfaceType))
84 OIC_LOG(ERROR, TAG, "Request is not OIC spec defined!");
88 std::lock_guard<std::recursive_mutex> lock(m_objectLock);
91 throw SimulatorException(SIMULATOR_OPERATION_NOT_ALLOWED,
92 "Resource interface can not be reset when resource is started!");
95 if (interfaceType != OC::DEFAULT_INTERFACE)
96 m_interfaces = {OC::DEFAULT_INTERFACE, interfaceType};
99 void SimulatorSingleResourceImpl::setInterface(const std::vector<std::string> &interfaceTypes)
101 VALIDATE_INPUT(interfaceTypes.empty(), "Interface type list is empty!")
103 std::lock_guard<std::recursive_mutex> lock(m_objectLock);
104 if (m_resourceHandle)
106 throw SimulatorException(SIMULATOR_OPERATION_NOT_ALLOWED,
107 "Resource interface can not be reset when resource is started!");
110 m_interfaces = {OC::DEFAULT_INTERFACE};
111 for (auto &interfaceType : interfaceTypes)
113 if (false == OCInterfaceDetails::getInstance()->isInterface(interfaceType))
116 if (m_interfaces.end() ==
117 std::find(m_interfaces.begin(), m_interfaces.end(), interfaceType))
119 m_interfaces.push_back(interfaceType);
124 void SimulatorSingleResourceImpl::addInterface(const std::string &interfaceType)
126 VALIDATE_INPUT(interfaceType.empty(), "Interface type is empty!")
128 if (false == OCInterfaceDetails::getInstance()->isInterface(interfaceType))
130 OIC_LOG(ERROR, TAG, "Request is not OIC spec defined!");
134 if (m_interfaces.end() != std::find(m_interfaces.begin(), m_interfaces.end(), interfaceType))
136 SIM_LOG(ILogger::ERROR, "[" << m_uri << "] "
137 << "Resource already supporting this Interface: " << interfaceType)
141 std::lock_guard<std::recursive_mutex> lock(m_objectLock);
142 if (m_resourceHandle)
144 typedef OCStackResult (*bindInterfaceToResource)(const OCResourceHandle &,
145 const std::string &);
147 invokeocplatform(static_cast<bindInterfaceToResource>(
148 OC::OCPlatform::bindInterfaceToResource), m_resourceHandle,
152 m_interfaces.push_back(interfaceType);
155 void SimulatorSingleResourceImpl::setObservable(bool state)
157 std::lock_guard<std::recursive_mutex> lock(m_objectLock);
158 if (m_resourceHandle)
160 throw SimulatorException(SIMULATOR_OPERATION_NOT_ALLOWED,
161 "Observation state can not be changed when resource is started!");
165 m_property = static_cast<OCResourceProperty>(m_property | OC_OBSERVABLE);
167 m_property = static_cast<OCResourceProperty>(m_property ^ OC_OBSERVABLE);
170 void SimulatorSingleResourceImpl::setDiscoverable(bool state)
172 std::lock_guard<std::recursive_mutex> lock(m_objectLock);
173 if (m_resourceHandle)
175 throw SimulatorException(SIMULATOR_OPERATION_NOT_ALLOWED,
176 "Discoverable state can not be changed when resource is started!");
180 m_property = static_cast<OCResourceProperty>(m_property | OC_DISCOVERABLE);
182 m_property = static_cast<OCResourceProperty>(m_property ^ OC_DISCOVERABLE);
185 void SimulatorSingleResourceImpl::setObserverCallback(ObserverCallback callback)
187 VALIDATE_CALLBACK(callback)
188 m_observeCallback = callback;
191 void SimulatorSingleResourceImpl::setModelChangeCallback(ResourceModelUpdateCallback callback)
193 VALIDATE_CALLBACK(callback)
194 m_modelCallback = callback;
197 bool SimulatorSingleResourceImpl::isObservable() const
199 return ((m_property & OC_OBSERVABLE) == OC_OBSERVABLE);
202 bool SimulatorSingleResourceImpl::isDiscoverable() const
204 return ((m_property & OC_DISCOVERABLE) == OC_DISCOVERABLE);
207 bool SimulatorSingleResourceImpl::isStarted() const
209 return (nullptr != m_resourceHandle);
212 void SimulatorSingleResourceImpl::start()
214 std::lock_guard<std::recursive_mutex> lock(m_objectLock);
215 if (m_resourceHandle)
217 SIM_LOG(ILogger::ERROR, "[" << m_uri << "] " << "Resource already started!")
221 if (m_uri.empty() || m_resourceType.empty())
223 throw SimulatorException(SIMULATOR_ERROR, "Incomplete data to start resource!");
226 typedef OCStackResult (*RegisterResource)(OCResourceHandle &, std::string &,
227 const std::string &, const std::string &, OC::EntityHandler, uint8_t);
229 invokeocplatform(static_cast<RegisterResource>(OC::OCPlatform::registerResource),
230 m_resourceHandle, m_uri, m_resourceType, m_interfaces[0],
231 std::bind(&SimulatorSingleResourceImpl::handleRequests,
232 this, std::placeholders::_1), m_property);
234 for (size_t index = 1; m_interfaces.size() > 1 && index < m_interfaces.size(); index++)
236 typedef OCStackResult (*bindInterfaceToResource)(const OCResourceHandle &,
237 const std::string &);
241 invokeocplatform(static_cast<bindInterfaceToResource>(
242 OC::OCPlatform::bindInterfaceToResource), m_resourceHandle,
243 m_interfaces[index]);
245 catch (SimulatorException &e)
253 void SimulatorSingleResourceImpl::stop()
255 std::lock_guard<std::recursive_mutex> lock(m_objectLock);
256 if (!m_resourceHandle)
258 SIM_LOG(ILogger::ERROR, "[" << m_uri << "] " << "Resource is not started yet!")
262 // Stop all the update automation of this resource
263 m_updateAutomationMgr.stopAll();
265 // Clear all the observers
266 removeAllObservers();
268 // Unregister the resource from stack
269 typedef OCStackResult (*UnregisterResource)(const OCResourceHandle &);
271 invokeocplatform(static_cast<UnregisterResource>(OC::OCPlatform::unregisterResource),
274 m_resourceHandle = nullptr;
277 SimulatorResourceModel SimulatorSingleResourceImpl::getResourceModel()
279 std::lock_guard<std::recursive_mutex> lock(m_modelLock);
283 std::vector<ObserverInfo> SimulatorSingleResourceImpl::getObservers() const
285 return m_observersList;
288 void SimulatorSingleResourceImpl::notify(int observerID)
290 SimulatorResourceModel resModel;
292 std::lock_guard<std::recursive_mutex> lock(m_modelLock);
293 resModel = m_resModel;
296 notify(observerID, resModel);
299 void SimulatorSingleResourceImpl::notifyAll()
301 SimulatorResourceModel resModel;
303 std::lock_guard<std::recursive_mutex> lock(m_modelLock);
304 resModel = m_resModel;
310 bool SimulatorSingleResourceImpl::getAttribute(const std::string &attrName,
311 SimulatorResourceAttribute &attribute)
313 std::lock_guard<std::recursive_mutex> modelLock(m_modelLock);
314 std::lock_guard<std::mutex> schemaLock(m_modelSchemaLock);
316 if (m_resModel.contains(attrName))
318 attribute.setName(attrName);
319 attribute.setValue(m_resModel.getAttributeValue(attrName));
320 attribute.setProperty(m_resModelSchema->get(attrName));
327 std::map<std::string, SimulatorResourceAttribute>
328 SimulatorSingleResourceImpl::getAttributes()
330 std::lock_guard<std::recursive_mutex> modelLock(m_modelLock);
331 std::lock_guard<std::mutex> schemaLock(m_modelSchemaLock);
333 std::map<std::string, SimulatorResourceAttribute> attributes;
334 for (auto &attributeEntry : m_resModel.getAttributeValues())
336 SimulatorResourceAttribute attribute(attributeEntry.first);
337 attribute.setValue(attributeEntry.second);
339 attribute.setProperty(m_resModelSchema->get(attributeEntry.first));
340 attributes[attributeEntry.first] = attribute;
346 bool SimulatorSingleResourceImpl::addAttribute(
347 const SimulatorResourceAttribute &attribute, bool notify)
349 if (attribute.getName().empty() || nullptr == attribute.getProperty())
354 // Add attribute to resource representation and its schema
355 std::lock_guard<std::recursive_mutex> modelLock(m_modelLock);
356 std::lock_guard<std::mutex> schemaLock(m_modelSchemaLock);
358 if (!m_resModel.add(attribute.getName(), attribute.getValue()))
363 m_resModelSchema->add(attribute.getName(), attribute.getProperty());
365 if (notify && isStarted())
371 catch (SimulatorException &e)
373 SIM_LOG(ILogger::ERROR, "[" << m_uri << "] " << "Error when notifying the observers!")
381 bool SimulatorSingleResourceImpl::updateAttributeValue(
382 const SimulatorResourceAttribute &attribute, bool notify)
384 if (attribute.getName().empty())
389 // Validate the new value against attribute schema property
390 std::lock_guard<std::mutex> schemaLock(m_modelSchemaLock);
391 auto property = m_resModelSchema->get(attribute.getName());
392 if (!(property->validate(attribute.getValue())))
397 // Update the attribute value
398 std::lock_guard<std::recursive_mutex> modelLock(m_modelLock);
399 if (!m_resModel.update(attribute.getName(), attribute.getValue()))
404 if (notify && isStarted())
410 catch (SimulatorException &e)
412 SIM_LOG(ILogger::ERROR, "[" << m_uri << "] " << "Error when notifying the observers!")
420 bool SimulatorSingleResourceImpl::removeAttribute(
421 const std::string &attrName, bool notify)
423 if (attrName.empty())
428 // Remove attribute from resource representation and its schema
429 std::lock_guard<std::recursive_mutex> modelLock(m_modelLock);
430 std::lock_guard<std::mutex> schemaLock(m_modelSchemaLock);
432 m_resModelSchema->remove(attrName);
433 if (!m_resModel.remove(attrName))
438 if (notify && isStarted())
444 catch (SimulatorException &e)
446 SIM_LOG(ILogger::ERROR, "[" << m_uri << "] " << "Error when notifying the observers!")
454 int SimulatorSingleResourceImpl::startResourceUpdation(AutoUpdateType type,
455 int updateInterval, AutoUpdateCompleteCallback callback)
457 VALIDATE_CALLBACK(callback)
459 std::lock_guard<std::recursive_mutex> lock(m_objectLock);
460 if (!m_resourceHandle)
462 throw SimulatorException(SIMULATOR_NO_RESOURCE, "Resource is not started!");
465 return m_updateAutomationMgr.startResourceAutomation(shared_from_this(), type,
466 updateInterval, callback);
469 int SimulatorSingleResourceImpl::startAttributeUpdation(const std::string &attrName,
470 AutoUpdateType type, int updateInterval, AutoUpdateCompleteCallback callback)
472 VALIDATE_CALLBACK(callback)
474 std::lock_guard<std::recursive_mutex> lock(m_objectLock);
475 if (!m_resourceHandle)
477 throw SimulatorException(SIMULATOR_NO_RESOURCE, "Resource is not started!");
480 return m_updateAutomationMgr.startAttributeAutomation(shared_from_this(), attrName,
481 type, updateInterval, callback);
484 std::vector<int> SimulatorSingleResourceImpl::getResourceUpdations()
486 return m_updateAutomationMgr.getResourceAutomationIds();
489 std::vector<int> SimulatorSingleResourceImpl::getAttributeUpdations()
491 return m_updateAutomationMgr.getAttributeAutomationIds();
494 void SimulatorSingleResourceImpl::stopUpdation(const int id)
496 m_updateAutomationMgr.stop(id);
499 void SimulatorSingleResourceImpl::notifyApp()
503 m_modelCallback(m_uri, m_resModel);
507 void SimulatorSingleResourceImpl::notifyApp(const SimulatorResourceModel &resModel)
511 m_modelCallback(m_uri, resModel);
515 void SimulatorSingleResourceImpl::setResourceModel(const SimulatorResourceModel &resModel)
517 std::lock_guard<std::recursive_mutex> lock(m_modelLock);
518 m_resModel = resModel;
521 void SimulatorSingleResourceImpl::setResourceModelSchema(
522 const std::shared_ptr<SimulatorResourceModelSchema> &resModelSchema)
524 std::lock_guard<std::mutex> lock(m_modelSchemaLock);
525 m_resModelSchema = resModelSchema;
528 void SimulatorSingleResourceImpl::setRequestModel(
529 const std::unordered_map<std::string, std::shared_ptr<RequestModel>> &requestModels)
531 m_requestModels = requestModels;
534 bool SimulatorSingleResourceImpl::updateResourceModel(const SimulatorResourceModel &reqResModel,
535 SimulatorResourceModel &updatedResModel, bool overwrite, bool notify)
537 std::lock_guard<std::mutex> schemaLock(m_modelSchemaLock);
538 std::lock_guard<std::recursive_mutex> modelLock(m_modelLock);
540 size_t reqModelSize = reqResModel.size();
541 SimulatorResourceModel tempResModel;
543 for (auto &attributeName : m_resModel.getAttributeNameSet())
545 // Break the loop if update request model has no more attributes for validation.
551 // Check attribute presence criteria
552 if (!reqResModel.contains(attributeName))
562 if (!(m_resModel.getType(attributeName) == reqResModel.getType(attributeName)))
567 // Validate the new value against attribute schema property
568 auto property = m_resModelSchema->get(attributeName);
569 if (!(property->validate(reqResModel.getAttributeValue(attributeName))))
574 tempResModel.add(attributeName, reqResModel.getAttributeValue(attributeName));
577 // Validation is success, now update the attribute values.
578 for (auto &valueEntry : tempResModel.getAttributeValues())
580 m_resModel.update(valueEntry.first, valueEntry.second);
583 updatedResModel = m_resModel;
585 if (notify && isStarted())
591 catch (SimulatorException &e)
593 SIM_LOG(ILogger::ERROR, "[" << m_uri << "] " << "Error when notifying the observers!")
601 void SimulatorSingleResourceImpl::notify(int observerID, const SimulatorResourceModel &resModel)
603 std::lock_guard<std::recursive_mutex> lock(m_objectLock);
604 if (!m_resourceHandle)
607 std::shared_ptr<OC::OCResourceResponse> response(new OC::OCResourceResponse);
608 response->setErrorCode(200);
609 response->setResponseResult(OC_EH_OK);
610 response->setResourceRepresentation(resModel.asOCRepresentation(), m_interfaces[0]);
612 OC::ObservationIds observers;
613 observers.push_back(observerID);
615 typedef OCStackResult (*NotifyListOfObservers)(OCResourceHandle, OC::ObservationIds &,
616 const std::shared_ptr<OC::OCResourceResponse>);
618 invokeocplatform(static_cast<NotifyListOfObservers>(OC::OCPlatform::notifyListOfObservers),
619 m_resourceHandle, observers, response);
622 void SimulatorSingleResourceImpl::notifyAll(const SimulatorResourceModel &resModel)
624 std::lock_guard<std::recursive_mutex> lock(m_objectLock);
625 if (!m_resourceHandle)
628 if (!m_observersList.size())
631 std::shared_ptr<OC::OCResourceResponse> response(new OC::OCResourceResponse);
632 response->setErrorCode(200);
633 response->setResponseResult(OC_EH_OK);
634 response->setResourceRepresentation(resModel.asOCRepresentation(), m_interfaces[0]);
636 OC::ObservationIds observers;
637 for (auto &observer : m_observersList)
638 observers.push_back(observer.id);
640 typedef OCStackResult (*NotifyListOfObservers)(OCResourceHandle, OC::ObservationIds &,
641 const std::shared_ptr<OC::OCResourceResponse>);
643 invokeocplatform(static_cast<NotifyListOfObservers>(OC::OCPlatform::notifyListOfObservers),
644 m_resourceHandle, observers, response);
647 void SimulatorSingleResourceImpl::setCommonProperties(OC::OCRepresentation &ocResRep)
649 std::lock_guard<std::recursive_mutex> lock(m_objectLock);
650 ocResRep.setValue("rt", m_resourceType);
651 ocResRep.setValue("if", m_interfaces);
652 ocResRep.setValue("n", m_name);
655 OCEntityHandlerResult SimulatorSingleResourceImpl::handleRequests(
656 std::shared_ptr<OC::OCResourceRequest> request)
660 OIC_LOG(ERROR, TAG, "Request received from stack is null!");
664 OCEntityHandlerResult result = OC_EH_OK;
666 // Handle GET, PUT, POST and DELETE requests
667 if (OC::RequestHandlerFlag::RequestFlag & request->getRequestHandlerFlag())
670 OC::OCRepresentation rep = request->getResourceRepresentation();
671 std::string payload = getPayloadString(rep);
672 SIM_LOG(ILogger::INFO, "[" << m_uri << "] " << request->getRequestType()
673 << " request received. \n**Payload details**\n" << payload)
676 if ("GET" == request->getRequestType())
678 result = handleGET(request);
680 else if ("PUT" == request->getRequestType())
682 result = handlePUT(request);
684 else if ("POST" == request->getRequestType())
686 result = handlePOST(request);
688 else if ("DELETE" == request->getRequestType())
690 result = handleDELETE(request);
694 // Handle OBSERVE requests
695 if ((OC::RequestHandlerFlag::ObserverFlag & request->getRequestHandlerFlag())
698 OC::ObservationInfo observationInfo = request->getObservationInfo();
699 if (OC::ObserveAction::ObserveRegister == observationInfo.action)
701 addObserver(observationInfo);
702 SIM_LOG(ILogger::INFO, "[" << m_uri << "] Observer added [id: "
703 << (int)observationInfo.obsId << ", address: " << observationInfo.address
704 << ", port: " << observationInfo.port << "].");
706 else if (OC::ObserveAction::ObserveUnregister == observationInfo.action)
708 removeObserver(observationInfo);
709 SIM_LOG(ILogger::INFO, "[" << m_uri << "] Observer removed [id: "
710 << (int)observationInfo.obsId << ", address: " << observationInfo.address
711 << ", port: " << observationInfo.port << "].");
718 void SimulatorSingleResourceImpl::addObserver(const OC::ObservationInfo &ocObserverInfo)
720 ObserverInfo info {ocObserverInfo.obsId, ocObserverInfo.address, ocObserverInfo.port};
721 m_observersList.push_back(info);
723 if (m_observeCallback)
724 m_observeCallback(m_uri, ObservationStatus::REGISTER, info);
727 void SimulatorSingleResourceImpl::removeObserver(const OC::ObservationInfo &ocObserverInfo)
731 for (auto iter = m_observersList.begin(); iter != m_observersList.end(); iter++)
733 if ((*iter).id == ocObserverInfo.obsId)
737 m_observersList.erase(iter);
742 if (found && m_observeCallback)
743 m_observeCallback(m_uri, ObservationStatus::UNREGISTER, info);
746 void SimulatorSingleResourceImpl::removeAllObservers()
748 std::vector<ObserverInfo> observerList = m_observersList;
749 m_observersList.clear();
750 for (size_t index = 0; index < observerList.size(); index++)
752 if (m_observeCallback)
753 m_observeCallback(m_uri, ObservationStatus::UNREGISTER, observerList[index]);
757 OCEntityHandlerResult SimulatorSingleResourceImpl::handleGET(
758 const std::shared_ptr<OC::OCResourceRequest> &request)
760 // Check if resource support GET request
761 if (m_requestModels.end() == m_requestModels.find("GET"))
763 SIM_LOG(ILogger::ERROR, "[" << m_uri << "] "
764 << "Resource does not support GET request!")
765 return sendResponse(request, 405, OC_EH_ERROR);
768 // Handling interface query parameter "if"
769 auto interfaceType = m_interfaces[0];
770 auto requestQueryParams = request->getQueryParameters();
771 if (requestQueryParams.end() != requestQueryParams.find("if"))
773 interfaceType = requestQueryParams["if"];
776 if (!isValidInterface(interfaceType, "GET"))
778 SIM_LOG(ILogger::ERROR, "[" << m_uri << "] "
779 << "GET request received on invalid interface : " << interfaceType)
783 OC::OCRepresentation resourceRep = getResourceModel().asOCRepresentation();
785 // Add common properties to resource representation if interface is
786 // neither "oic.if.a" nor "oic.if.s".
787 if (OC::ACTUATOR_INTERFACE != interfaceType &&
788 OC::SENSOR_INTERFACE != interfaceType)
790 setCommonProperties(resourceRep);
793 return sendResponse(request, 200, OC_EH_OK, resourceRep, interfaceType);
796 OCEntityHandlerResult SimulatorSingleResourceImpl::handlePUT(
797 const std::shared_ptr<OC::OCResourceRequest> &request)
799 // Check if resource support PUT request
800 if (m_requestModels.end() == m_requestModels.find("PUT"))
802 SIM_LOG(ILogger::ERROR, "[" << m_uri << "] "
803 << "Resource does not support PUT request!")
804 return sendResponse(request, 405, OC_EH_ERROR);
807 // Handling interface query parameter "if"
808 auto interfaceType = m_interfaces[0];
809 auto requestQueryParams = request->getQueryParameters();
810 if (requestQueryParams.end() != requestQueryParams.find("if"))
812 interfaceType = requestQueryParams["if"];
815 if (!isValidInterface(interfaceType, "PUT"))
817 SIM_LOG(ILogger::ERROR, "[" << m_uri << "] "
818 << "PUT request received on invalid interface : " << interfaceType)
822 OC::OCRepresentation reqOcRep = request->getResourceRepresentation();
823 SimulatorResourceModel reqResModel = SimulatorResourceModel::build(reqOcRep);
824 SimulatorResourceModel updatedResModel;
825 if (true == updateResourceModel(reqResModel, updatedResModel, true, false))
827 auto ocRep = updatedResModel.asOCRepresentation();
828 auto result = sendResponse(request, 200, OC_EH_OK,
829 ocRep, m_interfaces[0]);
830 notifyApp(updatedResModel);
835 catch (SimulatorException &e)
837 SIM_LOG(ILogger::ERROR, "[" << m_uri << "] "
838 << "Error when notifying the observers!")
844 SIM_LOG(ILogger::ERROR, "[" << m_uri << "] " << "Updating resource representation failed!")
845 return sendResponse(request, 400, OC_EH_ERROR);
848 OCEntityHandlerResult SimulatorSingleResourceImpl::handlePOST(
849 const std::shared_ptr<OC::OCResourceRequest> &request)
851 // Check if resource support PUT request
852 if (m_requestModels.end() == m_requestModels.find("POST"))
854 SIM_LOG(ILogger::ERROR, "[" << m_uri << "] "
855 << "Resource does not support POST request!")
856 return sendResponse(request, 405, OC_EH_ERROR);
859 // Handling interface query parameter "if"
860 auto interfaceType = m_interfaces[0];
861 auto requestQueryParams = request->getQueryParameters();
862 if (requestQueryParams.end() != requestQueryParams.find("if"))
864 interfaceType = requestQueryParams["if"];
867 if (!isValidInterface(interfaceType, "POST"))
869 SIM_LOG(ILogger::ERROR, "[" << m_uri << "] "
870 << "POST request received on invalid interface : " << interfaceType)
874 OC::OCRepresentation reqOcRep = request->getResourceRepresentation();
875 SimulatorResourceModel reqResModel = SimulatorResourceModel::build(reqOcRep);
876 SimulatorResourceModel updatedResModel;
877 if (true == updateResourceModel(reqResModel, updatedResModel, false, false))
879 auto ocRep = updatedResModel.asOCRepresentation();
880 auto result = sendResponse(request, 200, OC_EH_OK,
881 ocRep, m_interfaces[0]);
882 notifyApp(updatedResModel);
887 catch (SimulatorException &e)
889 SIM_LOG(ILogger::ERROR, "[" << m_uri << "] "
890 << "Error when notifying the observers!")
896 SIM_LOG(ILogger::ERROR, "[" << m_uri << "] " << "Updating resource representation failed!")
897 return sendResponse(request, 400, OC_EH_ERROR);
900 OCEntityHandlerResult SimulatorSingleResourceImpl::handleDELETE(
901 const std::shared_ptr<OC::OCResourceRequest> &request)
903 SIM_LOG(ILogger::ERROR, "[" << m_uri << "] "
904 << "Resource does not support DELETE request!")
905 return sendResponse(request, 405, OC_EH_ERROR);;
908 bool SimulatorSingleResourceImpl::isValidInterface(const std::string &interfaceType,
909 const std::string &requestType)
911 // Is this OIC defined interface ?
913 OCInterfaceDetails::getInstance()->isRequestSupported(interfaceType, requestType))
918 // Does resource support this interface ?
919 std::lock_guard<std::recursive_mutex> lock(m_objectLock);
920 if (m_interfaces.end() ==
921 std::find(m_interfaces.begin(), m_interfaces.end(), interfaceType))
929 OCEntityHandlerResult SimulatorSingleResourceImpl::sendResponse(
930 const std::shared_ptr<OC::OCResourceRequest> &request, const int errorCode,
931 OCEntityHandlerResult responseResult)
933 std::shared_ptr<OC::OCResourceResponse> response(new OC::OCResourceResponse());
934 response->setRequestHandle(request->getRequestHandle());
935 response->setResourceHandle(request->getResourceHandle());
936 response->setErrorCode(errorCode);
937 response->setResponseResult(responseResult);
938 if (OC_STACK_OK != OC::OCPlatform::sendResponse(response))
940 SIM_LOG(ILogger::ERROR, "[" << m_uri << "] Failed to send response for " <<
941 request->getRequestType() <<" request!")
945 SIM_LOG(ILogger::INFO, "[" << m_uri << "] Sent response for " <<
946 request->getRequestType() << " request.")
951 OCEntityHandlerResult SimulatorSingleResourceImpl::sendResponse(
952 const std::shared_ptr<OC::OCResourceRequest> &request, const int errorCode,
953 OCEntityHandlerResult responseResult, OC::OCRepresentation &payload,
954 const std::string &interfaceType)
956 std::shared_ptr<OC::OCResourceResponse> response(new OC::OCResourceResponse());
957 response->setRequestHandle(request->getRequestHandle());
958 response->setResourceHandle(request->getResourceHandle());
959 response->setErrorCode(errorCode);
960 response->setResponseResult(responseResult);
961 response->setResourceRepresentation(payload, interfaceType);
962 if (OC_STACK_OK != OC::OCPlatform::sendResponse(response))
964 SIM_LOG(ILogger::ERROR, "[" << m_uri << "] Failed to send response for " <<
965 request->getRequestType() <<" request!")
969 SIM_LOG(ILogger::INFO, "[" << m_uri << "] Sent response for " <<
970 request->getRequestType() << " request \n\n" <<
971 "**Payload details**" << getPayloadString(payload))