Added Simulator Resource Model Support to read collection resource.
authorabitha.s <abitha.s@samsung.com>
Fri, 30 Oct 2015 11:56:51 +0000 (17:26 +0530)
committerMadan Lanka <lanka.madan@samsung.com>
Tue, 3 Nov 2015 04:03:45 +0000 (04:03 +0000)
1.Implementation of reading Collection resource values from RAML in C++
2.Added values to SimulatorResourceModel for Array type properties.
3.Modified reading InterfaceType value as vector.

Change-Id: I38d82bd1201d3de66fc0d8c250c4816b37d1814e
Signed-off-by: abitha.s <abitha.s@samsung.com>
Reviewed-on: https://gerrit.iotivity.org/gerrit/3987
Tested-by: jenkins-iotivity <jenkins-iotivity@opendaylight.org>
Reviewed-by: Madan Lanka <lanka.madan@samsung.com>
service/simulator/src/server/simulator_collection_resource_impl.cpp [changed mode: 0644->0755]
service/simulator/src/server/simulator_collection_resource_impl.h [changed mode: 0644->0755]
service/simulator/src/server/simulator_resource_factory.cpp
service/simulator/src/server/simulator_resource_factory.h [changed mode: 0644->0755]
service/simulator/src/server/simulator_single_resource_impl.cpp [changed mode: 0644->0755]
service/simulator/src/server/simulator_single_resource_impl.h [changed mode: 0644->0755]

old mode 100644 (file)
new mode 100755 (executable)
index f46f0aa..d3a3ff7
@@ -58,6 +58,11 @@ std::vector<std::string> SimulatorCollectionResourceImpl::getInterface() const
     return m_interfaces;
 }
 
+void SimulatorCollectionResourceImpl::setInterface(const std::vector<std::string> &interfaces)
+{
+    m_interfaces = interfaces;
+}
+
 void SimulatorCollectionResourceImpl::setName(const std::string &name)
 {
     VALIDATE_INPUT(name.empty(), "Name is empty!")
@@ -206,6 +211,18 @@ void SimulatorCollectionResourceImpl::stop()
     m_resourceHandle = nullptr;
 }
 
+SimulatorResourceModel SimulatorCollectionResourceImpl::getResourceModel()
+{
+    std::lock_guard<std::mutex> lock(m_modelLock);
+    return m_resModel;
+}
+
+void SimulatorCollectionResourceImpl::setResourceModel(const SimulatorResourceModel &resModel)
+{
+    std::lock_guard<std::mutex> lock(m_modelLock);
+    m_resModel = resModel;
+}
+
 std::vector<ObserverInfo> SimulatorCollectionResourceImpl::getObserversList()
 {
     return m_observersList;
old mode 100644 (file)
new mode 100755 (executable)
index ab8f347..97d09cd
@@ -34,6 +34,7 @@ class SimulatorCollectionResourceImpl : public SimulatorCollectionResource
         std::string getURI() const;
         std::string getResourceType() const;
         std::vector<std::string> getInterface() const;
+        void setInterface(const std::vector<std::string> &interfaces);
         void setName(const std::string &name);
         void setURI(const std::string &uri);
         void setResourceType(const std::string &resourceType);
@@ -44,6 +45,8 @@ class SimulatorCollectionResourceImpl : public SimulatorCollectionResource
         bool isStarted();
         void start();
         void stop();
+        SimulatorResourceModel getResourceModel();
+        void setResourceModel(const SimulatorResourceModel &resModel);
         std::vector<ObserverInfo> getObserversList();
         void notify(int id);
         void notifyAll();
@@ -73,6 +76,8 @@ class SimulatorCollectionResourceImpl : public SimulatorCollectionResource
         std::string m_resourceType;
         std::vector<std::string> m_interfaces;
 
+        std::mutex m_modelLock;
+        SimulatorResourceModel m_resModel;
         std::recursive_mutex m_objectLock;
         std::mutex m_childResourcesLock;
         std::map<std::string, SimulatorResourceSP> m_childResources;
index 90d2a6d..19bc538 100644 (file)
-/******************************************************************
- *
- * Copyright 2015 Samsung Electronics All Rights Reserved.
- *
- *
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
- ******************************************************************/
-
-#include "simulator_resource_factory.h"
-#include "simulator_single_resource_impl.h"
-#include "simulator_collection_resource_impl.h"
-#include "RamlParser.h"
-#include "simulator_logger.h"
-#include "logger.h"
-
-#define TAG "SIM_RESOURCE_FACTORY"
-
-SimulatorResourceFactory *SimulatorResourceFactory::getInstance()
-{
-    static SimulatorResourceFactory s_instance;
-    return &s_instance;
-}
-
-std::shared_ptr<SimulatorResource> SimulatorResourceFactory::createResource(
-    const std::string &configPath)
-{
-    // Parse the RAML file
-    std::shared_ptr<RAML::RamlParser> ramlParser = std::make_shared<RAML::RamlParser>(configPath);
-    RAML::RamlPtr raml = ramlParser->getRamlPtr();
-
-    // Get the first resource model from RAML
-    RAML::RamlResourcePtr ramlResource;
-    if (0 == raml->getResources().size()
-        || nullptr == (ramlResource = raml->getResources().begin()->second))
-    {
-        OC_LOG(ERROR, TAG, "Zero resources detected from RAML!");
-        return nullptr;
-    }
-
-    return buildResource(ramlResource);
-}
-
-std::vector<std::shared_ptr<SimulatorResource> > SimulatorResourceFactory::createResource(
-    const std::string &configPath, unsigned int count)
-{
-    std::vector<std::shared_ptr<SimulatorResource>> resources;
-
-    // Parse the RAML file
-    std::shared_ptr<RAML::RamlParser> ramlParser = std::make_shared<RAML::RamlParser>(configPath);
-    RAML::RamlPtr raml = ramlParser->getRamlPtr();
-
-    // Get the first resource model from RAML
-    RAML::RamlResourcePtr ramlResource;
-    if (0 == raml->getResources().size()
-        || nullptr == (ramlResource = raml->getResources().begin()->second))
-    {
-        OC_LOG(ERROR, TAG, "Zero resources detected from RAML!");
-        return resources;
-    }
-
-    while (count--)
-    {
-        std::shared_ptr<SimulatorResource> resource = buildResource(ramlResource);
-        if (!resource)
-        {
-            OC_LOG(ERROR, TAG, "Failed to create resource!");
-            return resources;
-        }
-
-        resources.push_back(resource);
-    }
-
-    return resources;
-}
-
-std::shared_ptr<SimulatorSingleResource> SimulatorResourceFactory::createSingleResource(
-    const std::string &name, const std::string &uri, const std::string &resourceType)
-{
-    SimulatorSingleResourceImpl *simpleResource = new SimulatorSingleResourceImpl();
-    simpleResource->setName(name);
-    simpleResource->setURI(uri);
-    simpleResource->setResourceType(resourceType);
-    return std::shared_ptr<SimulatorSingleResource>(simpleResource);
-}
-
-std::shared_ptr<SimulatorCollectionResource> SimulatorResourceFactory::createCollectionResource(
-    const std::string &name, const std::string &uri, const std::string &resourceType)
-{
-    SimulatorCollectionResourceImpl *collectionResource = new SimulatorCollectionResourceImpl();
-    collectionResource->setName(name);
-    collectionResource->setURI(uri);
-    collectionResource->setResourceType(resourceType);
-    return std::shared_ptr<SimulatorCollectionResource>(collectionResource);
-}
-
-std::shared_ptr<SimulatorResource> SimulatorResourceFactory::buildResource(
-    std::shared_ptr<RAML::RamlResource> ramlResource)
-{
-    std::string name;
-    std::string uri;
-    std::string resourceType;
-    std::string interfaceType;
-
-    name = ramlResource->getDisplayName();
-    uri = ramlResource->getResourceUri();
-
-    // Get the resource representation schema from GET response body
-    RAML::ActionPtr action = ramlResource->getAction(RAML::ActionType::GET);
-    if (!action)
-    {
-        OC_LOG(ERROR, TAG, "Resource does not possess the GET request!");
-        return nullptr;
-    }
-
-    RAML::ResponsePtr getResponse = action->getResponse("200");
-    if (!getResponse)
-    {
-        OC_LOG(ERROR, TAG, "Resource does not provide valid GET response!");
-        return nullptr;
-    }
-
-    RAML::RequestResponseBodyPtr responseBody = getResponse->getResponseBody("application/json");
-    if (!responseBody)
-    {
-        OC_LOG(ERROR, TAG, "GET response is not of type \"application/json\" ");
-        return nullptr;
-    }
-
-    // Iterate throgh all resource property and extract information needed for simulating resource
-    RAML::JsonSchemaPtr resourceProperties = responseBody->getSchema()->getProperties();
-    SimulatorResourceModel resModel;
-    for ( auto &propertyElement : resourceProperties->getProperties())
-    {
-        if (!propertyElement.second)
-            continue;
-
-        std::string propName = propertyElement.second->getName();
-
-        // Resource type
-        if ("rt" == propName || "resourceType" == propName)
-        {
-            resourceType = propertyElement.second->getValueString();
-            continue;
-        }
-
-        // Interface type
-        if ("if" == propName)
-        {
-            interfaceType = propertyElement.second->getValueString();
-            continue;
-        }
-
-        // Other Standard properties which should not be part of resource model
-        if ("p" == propName || "n" == propName || "id" == propName)
-        {
-            continue;
-        }
-
-        // Build representation attribute
-        SimulatorResourceModel::Attribute attribute(propName);
-        switch (propertyElement.second->getValueType())
-        {
-            case 0: // Integer
-                {
-                    attribute.setValue(propertyElement.second->getValue<int>());
-
-                    // Convert suppoted values
-                    std::vector<int> allowedValues = propertyElement.second->getAllowedValuesInt();
-                    if (allowedValues.size() > 0)
-                    {
-                        SimulatorResourceModel::AttributeProperty attrProp(allowedValues);
-                        attribute.setProperty(attrProp);
-                    }
-                }
-                break;
-
-            case 1: // Double
-                {
-                    attribute.setValue(propertyElement.second->getValue<double>());
-
-                    // Convert suppoted values
-                    std::vector<double> allowedValues = propertyElement.second->getAllowedValuesDouble();
-                    if (allowedValues.size() > 0)
-                    {
-                        SimulatorResourceModel::AttributeProperty attrProp(allowedValues);
-                        attribute.setProperty(attrProp);
-                    }
-                }
-                break;
-
-            case 2: // Boolean
-                {
-                    attribute.setValue(propertyElement.second->getValue<bool>());
-
-                    std::vector<bool> allowedValues = {true, false};
-                    SimulatorResourceModel::AttributeProperty attrProp(allowedValues);
-                    attribute.setProperty(attrProp);
-                }
-                break;
-
-            case 3: // String
-                {
-                    attribute.setValue(propertyElement.second->getValue<std::string>());
-
-                    // Convert suppoted values
-                    std::vector<std::string> allowedValues = propertyElement.second->getAllowedValuesString();
-                    if (allowedValues.size() > 0)
-                    {
-                        SimulatorResourceModel::AttributeProperty attrProp(allowedValues);
-                        attribute.setProperty(attrProp);
-                    }
-                }
-                break;
-        }
-
-        // Set the range property if its present
-        double min, max;
-        int multipleof;
-        propertyElement.second->getRange(min, max, multipleof);
-        if (min != INT_MIN && max != INT_MAX)
-        {
-            SimulatorResourceModel::AttributeProperty attrProp(min, max);
-            attribute.setProperty(attrProp);
-        }
-
-        // Add the attribute to resource model
-        resModel.add(attribute);
-    }
-
-    // Create simple/collection resource
-    std::shared_ptr<SimulatorResource> simResource;
-    if (interfaceType == "oic.if.ll"
-        || resModel.containsAttribute("links") || resModel.containsAttribute("rts"))
-    {
-        try
-        {
-            std::shared_ptr<SimulatorCollectionResourceImpl> collectionRes(
-                new SimulatorCollectionResourceImpl());
-
-            collectionRes->setName(name);
-            collectionRes->setResourceType(resourceType);
-            if (ResourceURIFactory::getInstance()->isUnique(uri))
-                collectionRes->setURI(uri);
-            else
-                collectionRes->setURI(ResourceURIFactory::getInstance()->constructURI(uri));
-
-            simResource = std::dynamic_pointer_cast<SimulatorResource>(collectionRes);
-        }
-        catch (InvalidArgsException &e) {}
-    }
-    else
-    {
-        try
-        {
-            std::shared_ptr<SimulatorSingleResourceImpl> singleRes(
-                new SimulatorSingleResourceImpl());
-
-            singleRes->setName(name);
-            singleRes->setResourceType(resourceType);
-            if (ResourceURIFactory::getInstance()->isUnique(uri))
-                singleRes->setURI(uri);
-            else
-                singleRes->setURI(ResourceURIFactory::getInstance()->constructURI(uri));
-
-            singleRes->setResourceModel(resModel);
-            simResource = std::dynamic_pointer_cast<SimulatorResource>(singleRes);
-        }
-        catch (InvalidArgsException &e) {}
-    }
-
-    return simResource;
-}
-
-ResourceURIFactory *ResourceURIFactory::getInstance()
-{
-    static ResourceURIFactory s_instance;
-    return &s_instance;
-}
-
-ResourceURIFactory::ResourceURIFactory()
-    : m_id(0) {}
-
-std::string ResourceURIFactory::constructURI(const std::string &uri)
-{
-    std::ostringstream os;
-    os << uri;
-    if (!uri.empty() && '/' != uri[uri.length() - 1])
-        os << '/';
-    os << m_id++;
-    return os.str();
-}
-
-bool ResourceURIFactory::isUnique(const std::string &uri)
-{
-    if (m_uriList.end() == m_uriList.find(uri))
-        return true;
-    else
-        return false;
-}
-
+/******************************************************************\r
+ *\r
+ * Copyright 2015 Samsung Electronics All Rights Reserved.\r
+ *\r
+ *\r
+ *\r
+ * Licensed under the Apache License, Version 2.0 (the "License");\r
+ * you may not use this file except in compliance with the License.\r
+ * You may obtain a copy of the License at\r
+ *\r
+ *      http://www.apache.org/licenses/LICENSE-2.0\r
+ *\r
+ * Unless required by applicable law or agreed to in writing, software\r
+ * distributed under the License is distributed on an "AS IS" BASIS,\r
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
+ * See the License for the specific language governing permissions and\r
+ * limitations under the License.\r
+ *\r
+ ******************************************************************/\r
+\r
+#include "simulator_resource_factory.h"\r
+#include "simulator_single_resource_impl.h"\r
+#include "simulator_collection_resource_impl.h"\r
+#include "RamlParser.h"\r
+#include "simulator_logger.h"\r
+#include "logger.h"\r
+\r
+#define TAG "SIM_RESOURCE_FACTORY"\r
+\r
+SimulatorResourceFactory *SimulatorResourceFactory::getInstance()\r
+{\r
+    static SimulatorResourceFactory s_instance;\r
+    return &s_instance;\r
+}\r
+\r
+std::shared_ptr<SimulatorResource> SimulatorResourceFactory::createResource(\r
+    const std::string &configPath)\r
+{\r
+    // Parse the RAML file\r
+    std::shared_ptr<RAML::RamlParser> ramlParser = std::make_shared<RAML::RamlParser>(configPath);\r
+    RAML::RamlPtr raml = ramlParser->getRamlPtr();\r
+\r
+    // Get the first resource model from RAML\r
+    RAML::RamlResourcePtr ramlResource;\r
+    if (0 == raml->getResources().size()\r
+        || nullptr == (ramlResource = raml->getResources().begin()->second))\r
+    {\r
+        OC_LOG(ERROR, TAG, "Zero resources detected from RAML!");\r
+        return nullptr;\r
+    }\r
+\r
+    return buildResource(ramlResource);\r
+}\r
+\r
+std::vector<std::shared_ptr<SimulatorResource> > SimulatorResourceFactory::createResource(\r
+    const std::string &configPath, unsigned int count)\r
+{\r
+    std::vector<std::shared_ptr<SimulatorResource>> resources;\r
+\r
+    // Parse the RAML file\r
+    std::shared_ptr<RAML::RamlParser> ramlParser = std::make_shared<RAML::RamlParser>(configPath);\r
+    RAML::RamlPtr raml = ramlParser->getRamlPtr();\r
+\r
+    // Get the first resource model from RAML\r
+    RAML::RamlResourcePtr ramlResource;\r
+    if (0 == raml->getResources().size()\r
+        || nullptr == (ramlResource = raml->getResources().begin()->second))\r
+    {\r
+        OC_LOG(ERROR, TAG, "Zero resources detected from RAML!");\r
+        return resources;\r
+    }\r
+\r
+    while (count--)\r
+    {\r
+        std::shared_ptr<SimulatorResource> resource = buildResource(ramlResource);\r
+        if (!resource)\r
+        {\r
+            OC_LOG(ERROR, TAG, "Failed to create resource!");\r
+            return resources;\r
+        }\r
+\r
+        resources.push_back(resource);\r
+    }\r
+\r
+    return resources;\r
+}\r
+\r
+std::shared_ptr<SimulatorSingleResource> SimulatorResourceFactory::createSingleResource(\r
+    const std::string &name, const std::string &uri, const std::string &resourceType)\r
+{\r
+    SimulatorSingleResourceImpl *simpleResource = new SimulatorSingleResourceImpl();\r
+    simpleResource->setName(name);\r
+    simpleResource->setURI(uri);\r
+    simpleResource->setResourceType(resourceType);\r
+    return std::shared_ptr<SimulatorSingleResource>(simpleResource);\r
+}\r
+\r
+std::shared_ptr<SimulatorCollectionResource> SimulatorResourceFactory::createCollectionResource(\r
+    const std::string &name, const std::string &uri, const std::string &resourceType)\r
+{\r
+    SimulatorCollectionResourceImpl *collectionResource = new SimulatorCollectionResourceImpl();\r
+    collectionResource->setName(name);\r
+    collectionResource->setURI(uri);\r
+    collectionResource->setResourceType(resourceType);\r
+    return std::shared_ptr<SimulatorCollectionResource>(collectionResource);\r
+}\r
+\r
+SimulatorResourceModel::Attribute SimulatorResourceFactory::buildAttribute(\r
+    std::shared_ptr<RAML::Properties> propertyElement)\r
+{\r
+    std::string propName = propertyElement->getName();\r
+\r
+    // Build representation attribute\r
+    SimulatorResourceModel::Attribute attribute(propName);\r
+    switch (propertyElement->getVariantType())\r
+    {\r
+        case RAML::VariantType::INT:\r
+            {\r
+                attribute.setValue(propertyElement->getValue<int>());\r
+\r
+                // Convert suppoted values\r
+                std::vector<int> allowedValues = propertyElement->getAllowedValuesInt();\r
+                if (allowedValues.size() > 0)\r
+                {\r
+                    SimulatorResourceModel::AttributeProperty attrProp(allowedValues);\r
+                    attribute.setProperty(attrProp);\r
+                }\r
+            }\r
+            break;\r
+\r
+        case RAML::VariantType::DOUBLE:\r
+            {\r
+                attribute.setValue(propertyElement->getValue<double>());\r
+\r
+                // Convert suppoted values\r
+                std::vector<double> allowedValues = propertyElement->getAllowedValuesDouble();\r
+                if (allowedValues.size() > 0)\r
+                {\r
+                    SimulatorResourceModel::AttributeProperty attrProp(allowedValues);\r
+                    attribute.setProperty(attrProp);\r
+                }\r
+            }\r
+            break;\r
+\r
+        case RAML::VariantType::BOOL:\r
+            {\r
+                attribute.setValue(propertyElement->getValue<bool>());\r
+\r
+                std::vector<bool> allowedValues = {true, false};\r
+                SimulatorResourceModel::AttributeProperty attrProp(allowedValues);\r
+                attribute.setProperty(attrProp);\r
+            }\r
+            break;\r
+\r
+        case RAML::VariantType::STRING:\r
+            {\r
+                attribute.setValue(propertyElement->getValue<std::string>());\r
+\r
+                // Convert suppoted values\r
+                std::vector<std::string> allowedValues = propertyElement->getAllowedValuesString();\r
+                if (allowedValues.size() > 0)\r
+                {\r
+                    SimulatorResourceModel::AttributeProperty attrProp(allowedValues);\r
+                    attribute.setProperty(attrProp);\r
+                }\r
+            }\r
+            break;\r
+    }\r
+\r
+    // Set the range property if its present\r
+    double min, max;\r
+    int multipleof;\r
+    propertyElement->getRange(min, max, multipleof);\r
+    if (min != INT_MIN && max != INT_MAX)\r
+    {\r
+        SimulatorResourceModel::AttributeProperty attrProp(min, max);\r
+        attribute.setProperty(attrProp);\r
+    }\r
+    return attribute;\r
+}\r
+\r
+SimulatorResourceModel SimulatorResourceFactory::buildResourceModel(\r
+    std::shared_ptr<RAML::Items> item)\r
+{\r
+    SimulatorResourceModel itemModel;\r
+    for ( auto &propElement : item->getProperties())\r
+    {\r
+        if (!propElement.second)\r
+            continue;\r
+\r
+        std::string propName = propElement.second->getName();\r
+        if ("rt" == propName || "resourceType" == propName || "if" == propName ||\r
+            "p" == propName || "n" == propName || "id" == propName )\r
+        {\r
+            continue;\r
+        }\r
+\r
+        if ("array" == propElement.second->getType())\r
+        {\r
+            std::vector<SimulatorResourceModel> arrayResModel;\r
+            for ( auto &propertyItem : propElement.second->getItems())\r
+            {\r
+                arrayResModel.push_back(buildResourceModel(propertyItem));\r
+            }\r
+            itemModel.add(propName, arrayResModel);\r
+        }\r
+        else\r
+        {\r
+            itemModel.add(buildAttribute(propElement.second));\r
+        }\r
+    }\r
+    return itemModel;\r
+}\r
+\r
+std::shared_ptr<SimulatorResource> SimulatorResourceFactory::buildResource(\r
+    std::shared_ptr<RAML::RamlResource> ramlResource)\r
+{\r
+    std::string name;\r
+    std::string uri;\r
+    std::string resourceType;\r
+    std::vector<std::string> interfaceType;\r
+\r
+    name = ramlResource->getDisplayName();\r
+    uri = ramlResource->getResourceUri();\r
+\r
+    // Get the resource representation schema from GET response body\r
+    RAML::ActionPtr action = ramlResource->getAction(RAML::ActionType::GET);\r
+    if (!action)\r
+    {\r
+        OC_LOG(ERROR, TAG, "Resource does not possess the GET request!");\r
+        return nullptr;\r
+    }\r
+\r
+    RAML::ResponsePtr getResponse = action->getResponse("200");\r
+    if (!getResponse)\r
+    {\r
+        OC_LOG(ERROR, TAG, "Resource does not provide valid GET response!");\r
+        return nullptr;\r
+    }\r
+\r
+    RAML::RequestResponseBodyPtr responseBody = getResponse->getResponseBody("application/json");\r
+    if (!responseBody)\r
+    {\r
+        OC_LOG(ERROR, TAG, "GET response is not of type \"application/json\" ");\r
+        return nullptr;\r
+    }\r
+\r
+    // Iterate throgh all resource property and extract information needed for simulating resource\r
+    RAML::JsonSchemaPtr resourceProperties = responseBody->getSchema()->getProperties();\r
+    SimulatorResourceModel resModel;\r
+    for ( auto &propertyElement : resourceProperties->getProperties())\r
+    {\r
+        if (!propertyElement.second)\r
+            continue;\r
+\r
+        std::string propName = propertyElement.second->getName();\r
+\r
+        // Resource type\r
+        if ("rt" == propName || "resourceType" == propName)\r
+        {\r
+            resourceType = propertyElement.second->getValueString();\r
+            continue;\r
+        }\r
+\r
+        // Interface type\r
+        if ("if" == propName)\r
+        {\r
+            if ("string" == propertyElement.second->getType())\r
+            {\r
+                interfaceType.push_back(propertyElement.second->getValueString());\r
+            }\r
+            else if ("array" == propertyElement.second->getType())\r
+            {\r
+                for (auto &item : propertyElement.second->getItems())\r
+                {\r
+                    if ("string" == item->getType())\r
+                    {\r
+                        interfaceType = item->getAllowedValuesString();\r
+                        break;\r
+                    }\r
+                }\r
+            }\r
+            continue;\r
+        }\r
+\r
+        // Other Standard properties which should not be part of resource model\r
+        if ("p" == propName || "n" == propName || "id" == propName)\r
+        {\r
+            continue;\r
+        }\r
+\r
+        // Add the attribute to resource model\r
+        if ("array" == propertyElement.second->getType())\r
+        {\r
+            std::vector<SimulatorResourceModel> arrayResModel;\r
+            for ( auto &propertyItem : propertyElement.second->getItems())\r
+            {\r
+                arrayResModel.push_back(buildResourceModel(propertyItem));\r
+            }\r
+            resModel.add(propName, arrayResModel);\r
+        }\r
+        else\r
+        {\r
+            resModel.add(buildAttribute(propertyElement.second));\r
+        }\r
+    }\r
+\r
+    if ("array" == resourceProperties->getType())\r
+    {\r
+        std::vector<SimulatorResourceModel> arrayResModel;\r
+        for ( auto &propertyItem : resourceProperties->getItems())\r
+        {\r
+            arrayResModel.push_back(buildResourceModel(propertyItem));\r
+        }\r
+        resModel.add("links", arrayResModel);\r
+    }\r
+    // Create simple/collection resource\r
+    std::shared_ptr<SimulatorResource> simResource;\r
+    if (resModel.containsAttribute("links"))\r
+    {\r
+        try\r
+        {\r
+            std::shared_ptr<SimulatorCollectionResourceImpl> collectionRes(\r
+                new SimulatorCollectionResourceImpl());\r
+\r
+            collectionRes->setName(name);\r
+            collectionRes->setResourceType(resourceType);\r
+            collectionRes->setInterface(interfaceType);\r
+            if (ResourceURIFactory::getInstance()->isUnique(uri))\r
+                collectionRes->setURI(uri);\r
+            else\r
+                collectionRes->setURI(ResourceURIFactory::getInstance()->constructURI(uri));\r
+\r
+            collectionRes->setResourceModel(resModel);\r
+            simResource = std::dynamic_pointer_cast<SimulatorResource>(collectionRes);\r
+        }\r
+        catch (InvalidArgsException &e) {}\r
+    }\r
+    else\r
+    {\r
+        try\r
+        {\r
+            std::shared_ptr<SimulatorSingleResourceImpl> singleRes(\r
+                new SimulatorSingleResourceImpl());\r
+\r
+            singleRes->setName(name);\r
+            singleRes->setResourceType(resourceType);\r
+            singleRes->setInterface(interfaceType);\r
+            if (ResourceURIFactory::getInstance()->isUnique(uri))\r
+                singleRes->setURI(uri);\r
+            else\r
+                singleRes->setURI(ResourceURIFactory::getInstance()->constructURI(uri));\r
+\r
+            singleRes->setResourceModel(resModel);\r
+            simResource = std::dynamic_pointer_cast<SimulatorResource>(singleRes);\r
+        }\r
+        catch (InvalidArgsException &e) {}\r
+    }\r
+\r
+    return simResource;\r
+}\r
+\r
+ResourceURIFactory *ResourceURIFactory::getInstance()\r
+{\r
+    static ResourceURIFactory s_instance;\r
+    return &s_instance;\r
+}\r
+\r
+ResourceURIFactory::ResourceURIFactory()\r
+    : m_id(0) {}\r
+\r
+std::string ResourceURIFactory::constructURI(const std::string &uri)\r
+{\r
+    std::ostringstream os;\r
+    os << uri;\r
+    if (!uri.empty() && '/' != uri[uri.length() - 1])\r
+        os << '/';\r
+    os << m_id++;\r
+    return os.str();\r
+}\r
+\r
+bool ResourceURIFactory::isUnique(const std::string &uri)\r
+{\r
+    if (m_uriList.end() == m_uriList.find(uri))\r
+        return true;\r
+    else\r
+        return false;\r
+}\r
+\r
old mode 100644 (file)
new mode 100755 (executable)
index 0ab3a01..153eadc
@@ -27,6 +27,8 @@
 namespace RAML
 {
     class RamlResource;
+    class Properties;
+    class Items;
 }
 
 class SimulatorResourceFactory
@@ -84,6 +86,9 @@ class SimulatorResourceFactory
             const std::string &name, const std::string &uri, const std::string &resourceType);
 
     private:
+        SimulatorResourceModel::Attribute buildAttribute(
+            std::shared_ptr<RAML::Properties> propertyElement);
+        SimulatorResourceModel buildResourceModel(std::shared_ptr<RAML::Items> item);
         std::shared_ptr<SimulatorResource> buildResource(
             std::shared_ptr<RAML::RamlResource> ramlResource);
 
old mode 100644 (file)
new mode 100755 (executable)
index e41eac3..3c07f78
@@ -58,6 +58,11 @@ std::vector<std::string> SimulatorSingleResourceImpl::getInterface() const
     return m_interfaces;
 }
 
+void SimulatorSingleResourceImpl::setInterface(const std::vector<std::string> &interfaces)
+{
+    m_interfaces = interfaces;
+}
+
 void SimulatorSingleResourceImpl::setName(const std::string &name)
 {
     VALIDATE_INPUT(name.empty(), "Name is empty!")
old mode 100644 (file)
new mode 100755 (executable)
index 73e3d7c..c54cac9
@@ -35,6 +35,7 @@ class SimulatorSingleResourceImpl : public SimulatorSingleResource
         std::string getURI() const;
         std::string getResourceType() const;
         std::vector<std::string> getInterface() const;
+        void setInterface(const std::vector<std::string> &interfaces);
         void setName(const std::string &name);
         void setURI(const std::string &uri);
         void setResourceType(const std::string &resourceType);