Imported Upstream version 1.1.0
[platform/upstream/iotivity.git] / service / simulator / ramlparser / raml / jsonSchemaParser / JsonSchema.cpp
index 67968e2..826e67d 100755 (executable)
  *\r
  ******************************************************************/\r
 \r
-#include "JsonSchema.h"\r
-using namespace std;\r
+/**\r
+ * @file   JsonSchema.cpp\r
+ *\r
+ * @brief   This file reads data from Json Schema.\r
+ */\r
 \r
+#include "JsonSchema.h"\r
+#include <iostream>\r
 namespace RAML\r
 {\r
 \r
@@ -78,26 +83,11 @@ namespace RAML
         }\r
         if (m_type == "array")\r
         {\r
-            cJSON *jsonItems = cJSON_GetObjectItem(m_cjson, "items");\r
-            if (jsonItems)\r
-            {\r
-                if (jsonItems->type == 5)\r
-                {\r
-                    int item_size = cJSON_GetArraySize(jsonItems);\r
-                    int item_index = 0;\r
-                    do\r
-                    {\r
-                        cJSON *item = cJSON_GetArrayItem(jsonItems, item_index);\r
-                        setItem(readItems(item));\r
-                    }\r
-                    while ( ++item_index < item_size);\r
-                }\r
-                else\r
-                {\r
-                    setItem(readItems(jsonItems));\r
-                }\r
-            }\r
+            PropertiesPtr property = std::make_shared<Properties>("array");\r
+            readArray(m_cjson, property);\r
+            addProperty("array" , property);\r
         }\r
+\r
         cJSON *jsonAdditionalProperties = cJSON_GetObjectItem(m_cjson, "additionalProperties");\r
         if (jsonAdditionalProperties)\r
             m_additionalProperties = jsonAdditionalProperties->type;\r
@@ -107,12 +97,37 @@ namespace RAML
         cJSON *jsonReference = cJSON_GetObjectItem(m_cjson, "$ref");\r
         if (jsonReference)\r
         {\r
-            readJsonRef(jsonReference);\r
+            JsonParameters param;\r
+            readJsonRef(jsonReference, param);\r
+\r
+            for (auto it : param.getProperties())\r
+            {\r
+                addProperty(it.first, it.second);\r
+            }\r
+            for ( auto it : param.getRequired())\r
+            {\r
+                setRequiredValue(it);\r
+            }\r
+            if (m_type.empty())\r
+                m_type = param.getType();\r
         }\r
         cJSON *jsonAllOf = cJSON_GetObjectItem(m_cjson, "allOf");\r
         if (jsonAllOf)\r
         {\r
-            readAllOf(jsonAllOf);\r
+            JsonParameters param;\r
+\r
+            readAllOf(jsonAllOf, param);\r
+\r
+            for (auto it : param.getProperties())\r
+            {\r
+                addProperty(it.first, it.second);\r
+            }\r
+            for ( auto it : param.getRequired())\r
+            {\r
+                setRequiredValue(it);\r
+            }\r
+            if (m_type.empty())\r
+                m_type = param.getType();\r
         }\r
         cJSON *jsonRequiredValues = cJSON_GetObjectItem(m_cjson, "required");\r
         if (jsonRequiredValues)\r
@@ -136,6 +151,12 @@ namespace RAML
         {\r
             std::string type = defType->valuestring;\r
             definition->setType(type);\r
+            if (type == "array")\r
+            {\r
+                PropertiesPtr property = std::make_shared<Properties>("array");\r
+                readArray(childDefinitions, property);\r
+                definition->addProperty("array" , property);\r
+            }\r
         }\r
         cJSON *defProperties = cJSON_GetObjectItem(childDefinitions, "properties");\r
         if (defProperties)\r
@@ -162,12 +183,36 @@ namespace RAML
         cJSON *defReference = cJSON_GetObjectItem(childDefinitions, "$ref");\r
         if (defReference)\r
         {\r
-            readDefRef(defReference, definition);\r
+            JsonParameters param;\r
+            readJsonRef(defReference, param);\r
+\r
+            for (auto it : param.getProperties())\r
+            {\r
+                definition->addProperty(it.first, it.second);\r
+            }\r
+            for ( auto it : param.getRequired())\r
+            {\r
+                definition->setRequiredValue(it);\r
+            }\r
+            if (definition->getType().empty())\r
+                definition->setType(param.getType());\r
         }\r
         cJSON *defAllOf = cJSON_GetObjectItem(childDefinitions, "allOf");\r
         if (defAllOf)\r
         {\r
-            readDefAllOf(defAllOf, definition);\r
+            JsonParameters param;\r
+            readAllOf(defAllOf, param);\r
+\r
+            for (auto it : param.getProperties())\r
+            {\r
+                definition->addProperty(it.first, it.second);\r
+            }\r
+            for ( auto it : param.getRequired())\r
+            {\r
+                definition->setRequiredValue(it);\r
+            }\r
+            if (definition->getType().empty())\r
+                definition->setType(param.getType());\r
         }\r
         return definition;\r
     }\r
@@ -182,106 +227,125 @@ namespace RAML
             property->setDescription(propertyDescription->valuestring);\r
         }\r
         cJSON *propertyType = cJSON_GetObjectItem(childProperties, "type");\r
+        std::string attType;\r
         if (propertyType)\r
         {\r
-            std::string attType;\r
             if (propertyType->type == 4)\r
             {\r
                 attType = propertyType->valuestring;\r
-                property->setType(attType);\r
             }\r
             else if (propertyType->type == 5)\r
             {\r
                 attType = cJSON_GetArrayItem(propertyType, 0)->valuestring;\r
-                property->setType(attType);\r
             }\r
-            readValues(childProperties, property, attType);\r
         }\r
-        cJSON *defaultValue = cJSON_GetObjectItem(childProperties, "default");\r
-        if (defaultValue)\r
+        if (!(attType == "array") && !(attType == "object"))\r
         {\r
-            if (defaultValue->type == 4)\r
+            cJSON *defaultValue = cJSON_GetObjectItem(childProperties, "default");\r
+            if (defaultValue)\r
             {\r
-                property->setValue((std::string)defaultValue->valuestring);\r
+                readDefaultValue(defaultValue, property, attType);\r
             }\r
-            else if (defaultValue->type == 3)\r
-            {\r
-                if (property->getType() == "number")\r
-                    property->setValue((double)defaultValue->valuedouble);\r
-                else\r
-                    property->setValue((int)defaultValue->valueint );\r
-            }\r
-            else if (defaultValue->type == 1)\r
-            {\r
-                property->setValue((bool)true);\r
-            }\r
-            else if (defaultValue->type == 0)\r
-            {\r
-                property->setValue((bool)false);\r
-            }\r
-\r
         }\r
+        readValues(childProperties, property, attType);\r
         cJSON *allowedvalues = cJSON_GetObjectItem(childProperties, "enum");\r
         if (allowedvalues)\r
         {\r
-            if ((cJSON_GetArrayItem(allowedvalues, 0)->type) == 4)\r
+            readAllowedValues(allowedvalues, property, attType);\r
+        }\r
+        property->setTypeString(attType);\r
+        return property;\r
+    }\r
+\r
+    void JsonSchema::readDefaultValue(cJSON *defaultValue,  PropertiesPtr &property,\r
+                                      const std::string &attType)\r
+    {\r
+        if (defaultValue->type == 4)\r
+        {\r
+            property->setValue((std::string)defaultValue->valuestring);\r
+        }\r
+        else if (defaultValue->type == 3)\r
+        {\r
+            if (attType == "number")\r
+                property->setValue((double)defaultValue->valuedouble);\r
+            else\r
+                property->setValue((int)defaultValue->valueint );\r
+        }\r
+        else if (defaultValue->type == 1)\r
+        {\r
+            property->setValue((bool)true);\r
+        }\r
+        else if (defaultValue->type == 0)\r
+        {\r
+            property->setValue((bool)false);\r
+        }\r
+    }\r
+\r
+    void JsonSchema::readAllowedValues(cJSON *allowedvalues,  PropertiesPtr &property,\r
+                                       std::string &attType)\r
+    {\r
+        if ((cJSON_GetArrayItem(allowedvalues, 0)->type) == 4)\r
+        {\r
+            int size = cJSON_GetArraySize(allowedvalues);\r
+            int idx = 0;\r
+            std::vector<std::string> allwdValues;\r
+            do\r
             {\r
-                int size = cJSON_GetArraySize(allowedvalues);\r
-                int idx = 0;\r
-                std::vector<std::string> allwdValues;\r
-                do\r
-                {\r
-                    allwdValues.push_back(cJSON_GetArrayItem(allowedvalues, idx)->valuestring);\r
-                }\r
-                while ( ++idx < size);\r
-                property->setAllowedValues(allwdValues);\r
+                allwdValues.push_back(cJSON_GetArrayItem(allowedvalues, idx)->valuestring);\r
             }\r
-            else if ((cJSON_GetArrayItem(allowedvalues, 0)->type) == 3)\r
+            while ( ++idx < size);\r
+            property->setValueProperty(std::make_shared<ValueProperty>(allwdValues));\r
+            if (attType.empty())\r
+                attType = "string";\r
+        }\r
+        else if ((cJSON_GetArrayItem(allowedvalues, 0)->type) == 3)\r
+        {\r
+            int size = cJSON_GetArraySize(allowedvalues);\r
+            int idx = 0;\r
+            if (attType == "number")\r
             {\r
-                int size = cJSON_GetArraySize(allowedvalues);\r
-                int idx = 0;\r
-                if (property->getType() == "number")\r
-                {\r
-                    std::vector<double> allwdValues;\r
-                    do\r
-                    {\r
-                        allwdValues.push_back(cJSON_GetArrayItem(allowedvalues, idx)->valuedouble);\r
-                    }\r
-                    while ( ++idx < size);\r
-                    property->setAllowedValues(allwdValues);\r
-                }\r
-                else\r
+                std::vector<double> allwdValues;\r
+                do\r
                 {\r
-                    std::vector<int> allwdValues;\r
-                    do\r
-                    {\r
-                        allwdValues.push_back(cJSON_GetArrayItem(allowedvalues, idx)->valueint);\r
-                    }\r
-                    while ( ++idx < size);\r
-                    property->setAllowedValues(allwdValues);\r
+                    allwdValues.push_back(cJSON_GetArrayItem(allowedvalues, idx)->valuedouble);\r
                 }\r
+                while ( ++idx < size);\r
+                property->setValueProperty(std::make_shared<ValueProperty>(allwdValues));\r
             }\r
-            else if (((cJSON_GetArrayItem(allowedvalues, 0)->type) == 1)\r
-                     || ((cJSON_GetArrayItem(allowedvalues, 0)->type) == 0))\r
+            else\r
             {\r
-                int size = cJSON_GetArraySize(allowedvalues);\r
-                int idx = 0;\r
-                std::vector<bool> allwdValues;\r
+                std::vector<int> allwdValues;\r
                 do\r
                 {\r
-                    if (cJSON_GetArrayItem(allowedvalues, idx)->type)\r
-                        allwdValues.push_back(true);\r
-                    else\r
-                        allwdValues.push_back(false);\r
+                    allwdValues.push_back(cJSON_GetArrayItem(allowedvalues, idx)->valueint);\r
                 }\r
                 while ( ++idx < size);\r
-                property->setAllowedValues(allwdValues);\r
+                property->setValueProperty(std::make_shared<ValueProperty>(allwdValues));\r
+                if (attType.empty())\r
+                    attType = "integer";\r
             }\r
         }\r
-        return property;\r
+        else if (((cJSON_GetArrayItem(allowedvalues, 0)->type) == 1)\r
+                 || ((cJSON_GetArrayItem(allowedvalues, 0)->type) == 0))\r
+        {\r
+            int size = cJSON_GetArraySize(allowedvalues);\r
+            int idx = 0;\r
+            std::vector<bool> allwdValues;\r
+            do\r
+            {\r
+                if (cJSON_GetArrayItem(allowedvalues, idx)->type)\r
+                    allwdValues.push_back(true);\r
+                else\r
+                    allwdValues.push_back(false);\r
+            }\r
+            while ( ++idx < size);\r
+            property->setValueProperty(std::make_shared<ValueProperty>(allwdValues));\r
+            if (attType.empty())\r
+                attType = "boolean";\r
+        }\r
     }\r
 \r
-    void JsonSchema::readValues(cJSON *childProperties,  PropertiesPtr property ,\r
+    void JsonSchema::readValues(cJSON *childProperties,  PropertiesPtr &property ,\r
                                 const std::string &attType)\r
     {\r
         if (attType == "string")\r
@@ -292,31 +356,36 @@ namespace RAML
         {\r
             readInteger(childProperties, property);\r
         }\r
+        else if (attType == "number")\r
+        {\r
+            readDouble(childProperties, property);\r
+        }\r
         else if (attType == "array")\r
         {\r
             readArray(childProperties, property);\r
         }\r
-        else if (attType == "number")\r
+        else if (attType == "object")\r
         {\r
-            readDouble(childProperties, property);\r
+            readObject(childProperties, property);\r
         }\r
     }\r
 \r
-    void JsonSchema::readString(cJSON *childProperties, PropertiesPtr property)\r
+    void JsonSchema::readString(cJSON *childProperties, PropertiesPtr &property)\r
     {\r
         cJSON *stringMax = cJSON_GetObjectItem(childProperties, "maxLength");\r
+        int min = INT_MIN, max = INT_MAX;\r
         if (stringMax)\r
         {\r
             cJSON *exclusiveMax = cJSON_GetObjectItem(childProperties, "exclusiveMaximum");\r
             if (exclusiveMax)\r
             {\r
                 if (exclusiveMax->type == cJSON_True)\r
-                    property->setMax (--(stringMax->valueint));\r
+                    max = --(stringMax->valueint);\r
                 else\r
-                    property->setMax(stringMax->valueint);\r
+                    max = stringMax->valueint;\r
             }\r
             else\r
-                property->setMax(stringMax->valueint);\r
+                max = stringMax->valueint;\r
         }\r
         cJSON *stringMin = cJSON_GetObjectItem(childProperties, "minLength");\r
         if (stringMin)\r
@@ -325,109 +394,89 @@ namespace RAML
             if (exclusiveMin)\r
             {\r
                 if (exclusiveMin->type == cJSON_True)\r
-                    property->setMin( ++(stringMin->valueint));\r
+                    min = ++(stringMin->valueint);\r
                 else\r
-                    property->setMin(stringMin->valueint);\r
+                    min = stringMin->valueint;\r
             }\r
             else\r
-                property->setMin(stringMin->valueint);\r
+                min = stringMin->valueint;\r
         }\r
+        if (min != INT_MIN || max != INT_MAX)\r
+            property->setValueProperty(std::make_shared<ValueProperty>(min, max, 0));\r
+\r
         cJSON *stringFormat = cJSON_GetObjectItem(childProperties, "format");\r
         if (stringFormat)\r
         {\r
-            property->setFormat(stringFormat->valuestring);\r
+            property->setValueProperty(std::make_shared<ValueProperty>\r
+                                       (ValueProperty::Type::FORMAT, (stringFormat->valuestring)));\r
         }\r
+\r
         cJSON *stringPattern = cJSON_GetObjectItem(childProperties, "pattern");\r
         if (stringPattern)\r
         {\r
-            property->setPattern(stringPattern->valuestring);\r
+            property->setValueProperty(std::make_shared<ValueProperty>\r
+                                       (ValueProperty::Type::PATTERN, (stringPattern->valuestring)));\r
         }\r
     }\r
 \r
-    void JsonSchema::readArray(cJSON *childProperties,  PropertiesPtr property)\r
+    void JsonSchema::readInteger(cJSON *childProperties,  PropertiesPtr &property)\r
     {\r
-        cJSON *itemValues = cJSON_GetObjectItem(childProperties, "items");\r
-        if (itemValues)\r
-        {\r
-            if (itemValues->type == 5)\r
-            {\r
-                int item_size = cJSON_GetArraySize(itemValues);\r
-                int item_index = 0;\r
-                do\r
-                {\r
-                    cJSON *item = cJSON_GetArrayItem(itemValues, item_index);\r
-                    property->setItem(readItems(item));\r
-                }\r
-                while ( ++item_index < item_size);\r
-            }\r
-            else\r
-            {\r
-                property->setItem(readItems(itemValues));\r
-            }\r
-        }\r
-        cJSON *itemsMax = cJSON_GetObjectItem(childProperties, "maxItems");\r
-        if (itemsMax)\r
+        cJSON *Max = cJSON_GetObjectItem(childProperties, "maximum");\r
+        int min = INT_MIN, max = INT_MAX, multipleOf = INT_MAX;\r
+        if (Max)\r
         {\r
             cJSON *exclusiveMax = cJSON_GetObjectItem(childProperties, "exclusiveMaximum");\r
             if (exclusiveMax)\r
             {\r
                 if (exclusiveMax->type == cJSON_True)\r
-                    property->setMax( --(itemsMax->valueint));\r
+                    max = --(Max->valueint);\r
                 else\r
-                    property->setMax(itemsMax->valueint);\r
+                    max = Max->valueint;\r
             }\r
             else\r
-                property->setMax(itemsMax->valueint);\r
+                max = Max->valueint;\r
         }\r
-        cJSON *itemsMin = cJSON_GetObjectItem(childProperties, "minLength");\r
-        if (itemsMin)\r
+        cJSON *Min = cJSON_GetObjectItem(childProperties, "minimum");\r
+        if (Min)\r
         {\r
             cJSON *exclusiveMin = cJSON_GetObjectItem(childProperties, "exclusiveMinimum");\r
             if (exclusiveMin)\r
             {\r
                 if (exclusiveMin->type == cJSON_True)\r
-                    property->setMin( ++(itemsMin->valueint));\r
+                    min = ++(Min->valueint);\r
                 else\r
-                    property->setMin(itemsMin->valueint);\r
+                    min = Min->valueint;\r
             }\r
             else\r
-                property->setMin(itemsMin->valueint);\r
-        }\r
-        cJSON *uniqueItems = cJSON_GetObjectItem(childProperties, "uniqueItems");\r
-        if (uniqueItems)\r
-        {\r
-            property->setUnique(uniqueItems->type);\r
-        }\r
-        else\r
-        {\r
-            property->setUnique(cJSON_True);\r
+                min = Min->valueint;\r
         }\r
-        cJSON *additionalItems = cJSON_GetObjectItem(childProperties, "additionalItems");\r
-        if (additionalItems)\r
-        {\r
-            property->setAdditionalItems(additionalItems->type);\r
-        }\r
-        else\r
+        cJSON *MultipleOff = cJSON_GetObjectItem(childProperties, "multipleOf");\r
+        if (MultipleOff)\r
         {\r
-            property->setAdditionalItems(cJSON_True);\r
+            multipleOf = MultipleOff->valueint;\r
         }\r
+        if (min != INT_MIN || max != INT_MAX)\r
+            property->setValueProperty(std::make_shared<ValueProperty>(min, max, multipleOf));\r
+\r
     }\r
 \r
-    void JsonSchema::readInteger(cJSON *childProperties,  PropertiesPtr property)\r
+    void JsonSchema::readDouble(cJSON *childProperties,  PropertiesPtr &property)\r
     {\r
         cJSON *Max = cJSON_GetObjectItem(childProperties, "maximum");\r
+        double min = INT_MIN, max = INT_MAX;\r
+        int multipleOf = INT_MAX;\r
         if (Max)\r
         {\r
             cJSON *exclusiveMax = cJSON_GetObjectItem(childProperties, "exclusiveMaximum");\r
             if (exclusiveMax)\r
             {\r
                 if (exclusiveMax->type == cJSON_True)\r
-                    property->setMax( --(Max->valueint));\r
+                    max = --(Max->valuedouble);\r
                 else\r
-                    property->setMax(Max->valueint);\r
+                    max = Max->valuedouble;\r
             }\r
             else\r
-                property->setMax(Max->valueint);\r
+                max = Max->valuedouble;\r
         }\r
         cJSON *Min = cJSON_GetObjectItem(childProperties, "minimum");\r
         if (Min)\r
@@ -436,423 +485,395 @@ namespace RAML
             if (exclusiveMin)\r
             {\r
                 if (exclusiveMin->type == cJSON_True)\r
-                    property->setMin( ++(Min->valueint));\r
+                    min = ++(Min->valuedouble);\r
                 else\r
-                    property->setMin(Min->valueint);\r
+                    min = Min->valuedouble;\r
             }\r
             else\r
-                property->setMin(Min->valueint);\r
+                min = Min->valuedouble;\r
         }\r
-        cJSON *multipleOf = cJSON_GetObjectItem(childProperties, "multipleOf");\r
-        if (multipleOf)\r
+\r
+        cJSON *MultipleOff = cJSON_GetObjectItem(childProperties, "multipleOf");\r
+        if (MultipleOff)\r
         {\r
-            property->setMultipleOf(multipleOf->valueint);\r
+            multipleOf = MultipleOff->valueint;\r
         }\r
+        if (min != INT_MIN || max != INT_MAX)\r
+            property->setValueProperty(std::make_shared<ValueProperty>(min, max, multipleOf));\r
 \r
     }\r
 \r
-    void JsonSchema::readDouble(cJSON *childProperties,  PropertiesPtr property)\r
+    void JsonSchema::readArray(cJSON *childProperties,  PropertiesPtr &property)\r
     {\r
-        cJSON *Max = cJSON_GetObjectItem(childProperties, "maximum");\r
-        if (Max)\r
+        cJSON *itemValues = cJSON_GetObjectItem(childProperties, "items");\r
+        if (itemValues)\r
+        {\r
+            if (itemValues->type == 5)\r
+            {\r
+                //int item_size = cJSON_GetArraySize(itemValues);\r
+                int item_index = 0;\r
+                //do\r
+                //{\r
+                cJSON *item = cJSON_GetArrayItem(itemValues, item_index);\r
+                readItems(item, property);\r
+                //break;\r
+                //}\r
+                //while ( ++item_index < item_size);\r
+            }\r
+            else\r
+            {\r
+                readItems(itemValues, property);\r
+            }\r
+        }\r
+        cJSON *itemsMax = cJSON_GetObjectItem(childProperties, "maxItems");\r
+        int min = INT_MIN, max = INT_MAX;\r
+        bool unique = cJSON_False, addItems = cJSON_False;\r
+        if (itemsMax)\r
         {\r
             cJSON *exclusiveMax = cJSON_GetObjectItem(childProperties, "exclusiveMaximum");\r
             if (exclusiveMax)\r
             {\r
                 if (exclusiveMax->type == cJSON_True)\r
-                    property->setMaxDouble( --(Max->valuedouble));\r
+                    max = --(itemsMax->valueint);\r
                 else\r
-                    property->setMaxDouble(Max->valuedouble);\r
+                    max = itemsMax->valueint;\r
             }\r
             else\r
-                property->setMaxDouble(Max->valuedouble);\r
+                max = itemsMax->valueint;\r
         }\r
-        cJSON *Min = cJSON_GetObjectItem(childProperties, "minimum");\r
-        if (Min)\r
+        cJSON *itemsMin = cJSON_GetObjectItem(childProperties, "minItems");\r
+        if (itemsMin)\r
         {\r
             cJSON *exclusiveMin = cJSON_GetObjectItem(childProperties, "exclusiveMinimum");\r
             if (exclusiveMin)\r
             {\r
                 if (exclusiveMin->type == cJSON_True)\r
-                    property->setMinDouble( ++(Min->valuedouble));\r
+                    min = ++(itemsMin->valueint);\r
                 else\r
-                    property->setMinDouble(Min->valuedouble);\r
+                    min = itemsMin->valueint;\r
             }\r
             else\r
-                property->setMinDouble(Min->valuedouble);\r
+                min = itemsMin->valueint;\r
         }\r
-        cJSON *multipleOf = cJSON_GetObjectItem(childProperties, "multipleOf");\r
-        if (multipleOf)\r
+        cJSON *uniqueItems = cJSON_GetObjectItem(childProperties, "uniqueItems");\r
+        if (uniqueItems)\r
         {\r
-            property->setMultipleOf(multipleOf->valueint);\r
+            unique = uniqueItems->type;\r
         }\r
-\r
+        cJSON *additionalItems = cJSON_GetObjectItem(childProperties, "additionalItems");\r
+        if (additionalItems)\r
+        {\r
+            addItems = additionalItems->type;\r
+        }\r
+        property->setValueProperty(std::make_shared<ValueProperty>\r
+                                   (ValueProperty::Type::ARRAY, min, max, unique, addItems));\r
     }\r
 \r
-    DefinitionsPtr JsonSchema::readRef(std::string m_ref)\r
+    void JsonSchema::readItems(cJSON *item, PropertiesPtr &property)\r
     {\r
-        std::string delimiter1 = "#";\r
-        std::string delimiter2 = "/";\r
-        std::string fileName;\r
-        if (! m_ref.empty())\r
+        std::string type;\r
+        JsonParameters param;\r
+        cJSON *itemType = cJSON_GetObjectItem(item, "type");\r
+        if (itemType)\r
         {\r
-            std::size_t pos = m_ref.find(delimiter1);\r
-            if ( (pos = m_ref.find(delimiter1)) != std::string::npos)\r
-            {\r
-                fileName = m_ref.substr(0, pos);\r
-                m_ref.erase(0, pos);\r
-            }\r
-            m_ref.erase(0, delimiter1 .length());\r
-            std::string defName;\r
+            type = itemType->valuestring;\r
+        }\r
 \r
-            if (! m_ref.empty())\r
+        cJSON *itemAllOf = cJSON_GetObjectItem(item, "allOf");\r
+        if (itemAllOf)\r
+        {\r
+            readAllOf(itemAllOf , param);\r
+        }\r
+        else\r
+        {\r
+            cJSON *itemOneOf = cJSON_GetObjectItem(item, "oneOf");\r
+            if (itemOneOf)\r
             {\r
-                m_ref.erase(0, delimiter2 .length());\r
-                std::string keyName;\r
-                if ( (pos = m_ref.find(delimiter2)) != std::string::npos)\r
-                {\r
-                    keyName = m_ref.substr(0, pos);\r
-                    m_ref.erase(0, pos + delimiter2.length());\r
-                    if (keyName == "definitions")\r
-                    {\r
-                        if ( (pos = m_ref.find(delimiter2)) != std::string::npos)\r
-                        {\r
-                            defName = m_ref.substr(0, pos);\r
-                        }\r
-                        else if (! m_ref.empty())\r
-                        {\r
-                            defName = m_ref;\r
-                        }\r
-                    }\r
-                }\r
+                readAllOf(itemOneOf , param);\r
             }\r
-            if (!fileName.empty())\r
+        }\r
+\r
+        cJSON *itemReference = cJSON_GetObjectItem(item, "$ref");\r
+        if (itemReference)\r
+        {\r
+            readJsonRef(itemReference , param);\r
+        }\r
+\r
+        if (type == "object")\r
+        {\r
+            cJSON *itemProperties = cJSON_GetObjectItem(item, "properties");\r
+            if (itemProperties)\r
             {\r
-                if (!(defName.empty()))\r
+                cJSON *childProperties = itemProperties->child;\r
+                std::vector<Properties> propertyVector;\r
+                while (childProperties)\r
                 {\r
-                    cJSON *m_json = m_includeResolver->readToJson(fileName);\r
-                    JsonSchemaPtr Refparser = std::make_shared<JsonSchema>(m_json, m_includeResolver);\r
-                    DefinitionsPtr definition = Refparser->getDefinition(defName);\r
-                    if (definition == nullptr)\r
-                        throw JsonException("Definition Name Incorrect");\r
-                    return definition;\r
+                    std::string attName = childProperties->string;\r
+                    PropertiesPtr prop = std::make_shared<Properties>(attName);\r
+                    readProp(childProperties, attName);\r
+                    propertyVector.push_back(*prop);\r
+                    childProperties = childProperties->next;\r
                 }\r
+                property->setValue(propertyVector);\r
             }\r
-            else\r
+\r
+            cJSON *itemRequiredValues = cJSON_GetObjectItem(item, "required");\r
+            if (itemRequiredValues)\r
             {\r
-                if (!(defName.empty()))\r
+                int size = cJSON_GetArraySize(itemRequiredValues);\r
+                int index = 0;\r
+                do\r
                 {\r
-                    if (getDefinition(defName) == nullptr)\r
-                        throw JsonException("Definition Name Incorrect");\r
-                    return getDefinition(defName);\r
+                    property->setRequiredValue(cJSON_GetArrayItem(itemRequiredValues, index)->valuestring);\r
                 }\r
+                while ( ++index < size);\r
             }\r
         }\r
-        throw JsonException("Definition Name Empty");\r
-        return nullptr;\r
-    }\r
-    void JsonSchema::readAllOf(cJSON *allofValues)\r
-    {\r
-        int size = cJSON_GetArraySize(allofValues);\r
-        int index = 0;\r
-        do\r
+\r
+        else if (param.getType() == "object")\r
         {\r
-            cJSON *childAllOf = cJSON_GetArrayItem(allofValues, index);\r
-            cJSON *jsonReference = cJSON_GetObjectItem(childAllOf, "$ref");\r
-            if (jsonReference)\r
+            std::vector<Properties> propertyVector;\r
+            for (auto prop : param.getProperties())\r
             {\r
-                readJsonRef(jsonReference );\r
+                propertyVector.push_back(*(prop.second));\r
             }\r
-            cJSON *jsonRequiredValues = cJSON_GetObjectItem(childAllOf, "required");\r
-            if (jsonRequiredValues)\r
+            property->setValue(propertyVector);\r
+\r
+            for (auto req : param.getRequired())\r
             {\r
-                int len = cJSON_GetArraySize(jsonRequiredValues);\r
-                int idx = 0;\r
-                do\r
-                {\r
-                    setRequiredValue(cJSON_GetArrayItem(jsonRequiredValues, idx)->valuestring);\r
-                }\r
-                while ( ++idx < len);\r
+                property->setRequiredValue(req);\r
             }\r
         }\r
-        while ( ++index < size);\r
-    }\r
-    void JsonSchema::readJsonRef(cJSON *jsonReference)\r
-    {\r
-        std::string m_ref = jsonReference->valuestring;\r
-        std::map<std::string, PropertiesPtr > properties;\r
-        std::vector<std::string> required;\r
-\r
-        std::string web = "http://";\r
-        std::string delimiter = "#";\r
-        std::size_t pos = m_ref.find(web);\r
-\r
-        if (pos == std::string::npos)   // If Web Link Is GIVEN TO READ\r
+        else\r
         {\r
-            pos = m_ref.find(delimiter);\r
-            if ( pos ==  (m_ref.length() - 1) )\r
-            {\r
-                std::string fileName = m_ref.substr(0, pos);\r
-                cJSON *m_json = m_includeResolver->readToJson(fileName);\r
-                JsonSchemaPtr Refparser = std::make_shared<JsonSchema>(m_json, m_includeResolver);\r
+            PropertiesPtr prop = std::make_shared<Properties>("property");\r
 \r
-                properties = Refparser->getProperties();\r
-                required = Refparser->getRequiredValues();\r
-            }\r
-            else\r
+            cJSON *defaultValue = cJSON_GetObjectItem(item, "default");\r
+            if (defaultValue)\r
             {\r
-                DefinitionsPtr definition = readRef(m_ref);\r
-                properties = definition->getProperties();\r
-                required = definition->getRequiredValues();\r
+                readDefaultValue(defaultValue, prop, type);\r
             }\r
-            for ( auto it : properties)\r
+            cJSON *allowedvalues = cJSON_GetObjectItem(item, "enum");\r
+            if (allowedvalues)\r
             {\r
-                std:: string name = it.first;\r
-                addProperty(name, it.second);\r
+                readAllowedValues(allowedvalues, prop, type);\r
             }\r
-            for (auto it : required )\r
-            {\r
-                setRequiredValue(it);\r
-            }\r
-\r
+            readValues(item, prop, type);\r
+            prop->setTypeString(type);\r
+            property->setValue(*prop);\r
         }\r
     }\r
-    void JsonSchema::readDefAllOf(cJSON *allofValues, DefinitionsPtr definition)\r
+\r
+    void JsonSchema::readObject(cJSON *childProperties,  PropertiesPtr &property)\r
     {\r
-        int size = cJSON_GetArraySize(allofValues);\r
-        int index = 0;\r
-        do\r
+        property->setTypeString("object");\r
+\r
+        cJSON *subProperties = cJSON_GetObjectItem(childProperties, "properties");\r
+        cJSON *itemRequiredValues = cJSON_GetObjectItem(childProperties, "required");\r
+        if (subProperties)\r
         {\r
-            cJSON *childAllOf = cJSON_GetArrayItem(allofValues, index);\r
-            cJSON *defReference = cJSON_GetObjectItem(childAllOf, "$ref");\r
-            if (defReference)\r
+            cJSON *childProperties = subProperties->child;\r
+            std::vector<Properties> propertyVector;\r
+            while (childProperties)\r
             {\r
-                readDefRef(defReference , definition);\r
+                std::string attName = childProperties->string;\r
+                PropertiesPtr prop = std::make_shared<Properties>(attName);\r
+                readProp(childProperties, attName);\r
+                propertyVector.push_back(*prop);\r
+                childProperties = childProperties->next;\r
             }\r
-            cJSON *defRequiredValues = cJSON_GetObjectItem(allofValues, "required");\r
-            if (defRequiredValues)\r
+            property->setValue(propertyVector);\r
+            if (itemRequiredValues)\r
             {\r
-                int len = cJSON_GetArraySize(defRequiredValues);\r
-                int idx = 0;\r
+                int size = cJSON_GetArraySize(itemRequiredValues);\r
+                int index = 0;\r
                 do\r
                 {\r
-                    definition->setRequiredValue(cJSON_GetArrayItem(defRequiredValues, idx)->valuestring);\r
+                    property->setRequiredValue(cJSON_GetArrayItem(itemRequiredValues, index)->valuestring);\r
                 }\r
-                while ( ++idx < len);\r
+                while ( ++index < size);\r
             }\r
         }\r
-        while ( ++index < size);\r
-    }\r
-    void JsonSchema::readDefRef(cJSON *defReference, DefinitionsPtr definition)\r
-    {\r
-        std::string m_ref = defReference->valuestring;\r
-        std::map<std::string, PropertiesPtr > properties;\r
-        std::vector<std::string> required;\r
-        std::string type;\r
-\r
-        std::string web = "http://";\r
-        std::string delimiter = "#";\r
-        std::size_t pos = m_ref.find(web);\r
-\r
-        if (pos == std::string::npos)   // If Web Link Is GIVEN TO READ\r
+        else\r
         {\r
-            pos = m_ref.find(delimiter);\r
-            if ( pos ==  (m_ref.length() - 1) )\r
-            {\r
-                std::string fileName = m_ref.substr(0, pos);\r
-                cJSON *m_json = m_includeResolver->readToJson(fileName);\r
-                JsonSchemaPtr Refparser = std::make_shared<JsonSchema>(m_json, m_includeResolver);\r
+            JsonParameters param;\r
 \r
-                properties = Refparser->getProperties();\r
-                required = Refparser->getRequiredValues();\r
-                type =    Refparser->getType();\r
-            }\r
-            else\r
+            cJSON *itemAllOf = cJSON_GetObjectItem(childProperties, "allOf");\r
+            if (itemAllOf)\r
             {\r
-                DefinitionsPtr definitionRef = readRef(m_ref);\r
-                properties = definitionRef->getProperties();\r
-                required = definitionRef->getRequiredValues();\r
-                type =    definitionRef->getType();\r
+                readAllOf(itemAllOf , param);\r
             }\r
-            for (auto it : properties)\r
+            cJSON *itemReference = cJSON_GetObjectItem(childProperties, "$ref");\r
+            if (itemReference)\r
             {\r
-                definition->addProperty(it.first, it.second);\r
+                readJsonRef(itemReference , param);\r
             }\r
-            for ( auto it : required)\r
+\r
+            if (param.getType() == "object")\r
             {\r
-                definition->setRequiredValue(it);\r
+                std::vector<Properties> propertyVector;\r
+                for (auto prop : param.getProperties())\r
+                {\r
+                    propertyVector.push_back(*(prop.second));\r
+                }\r
+                property->setValue(propertyVector);\r
+\r
+                for (auto req : param.getRequired())\r
+                {\r
+                    property->setRequiredValue(req);\r
+                }\r
             }\r
-            definition->setType(type);\r
         }\r
     }\r
-    ItemsPtr JsonSchema::readItems(cJSON *item)\r
+\r
+    void JsonSchema::readFile(std::string &fileName ,  JsonParameters &param)\r
     {\r
-        ItemsPtr newItem = std::make_shared<Items>();\r
-        cJSON *itemType = cJSON_GetObjectItem(item, "type");\r
-        if (itemType)\r
-        {\r
-            std::string type = itemType->valuestring;\r
-            newItem->setType(type);\r
-        }\r
+        std::string name = fileName;\r
+        std::transform(name.begin(), name.end(), name.begin(), ::tolower);\r
+        if (name.compare("oic.baseresource.json") == 0)\r
+            return;\r
+\r
+        cJSON *json = m_includeResolver->readToJson(fileName);\r
+        JsonSchemaPtr Refparser = std::make_shared<JsonSchema>(json, m_includeResolver);\r
 \r
-        cJSON *itemProperties = cJSON_GetObjectItem(item, "properties");\r
-        if (itemProperties)\r
+        param.addProperties(Refparser->getProperties());\r
+        param.addRequired(Refparser->getRequiredValues());\r
+        param.setType(Refparser->getType());\r
+    }\r
+\r
+    void JsonSchema::readFile(std::string &fileName , std::string &defName ,  JsonParameters &param)\r
+    {\r
+        std::string name = fileName;\r
+        std::transform(name.begin(), name.end(), name.begin(), ::tolower);\r
+        if (name.compare("oic.baseresource.json") == 0)\r
+            return;\r
+\r
+        cJSON *json = m_includeResolver->readToJson(fileName);\r
+        JsonSchemaPtr Refparser = std::make_shared<JsonSchema>(json, m_includeResolver);\r
+\r
+        DefinitionsPtr definition = Refparser->getDefinition(defName);\r
+        if (definition == nullptr)\r
+            throw JsonException("Definition Name Incorrect");\r
+\r
+        param.addProperties(definition->getProperties());\r
+        param.addRequired(definition->getRequiredValues());\r
+        param.setType(definition->getType());\r
+    }\r
+\r
+    void JsonSchema::readRef(std::string ref ,  JsonParameters &param)\r
+    {\r
+        std::string delimiter1 = "#";\r
+        std::string delimiter2 = "/";\r
+        std::string fileName;\r
+        if (! ref.empty())\r
         {\r
-            cJSON *childProperties = itemProperties->child;\r
-            while (childProperties)\r
+            std::size_t pos = std::string::npos;\r
+            if ( (pos = ref.find(delimiter1)) != std::string::npos)\r
             {\r
-                std::string attName = childProperties->string;\r
-\r
-                newItem->addProperty(attName, readProp(childProperties, attName));\r
-                childProperties = childProperties->next;\r
+                fileName = ref.substr(0, pos);\r
+                ref.erase(0, pos);\r
             }\r
-        }\r
+            ref.erase(0, delimiter1 .length());\r
+            std::string defName;\r
 \r
-        cJSON *allowedvalues = cJSON_GetObjectItem(item, "enum");\r
-        if (allowedvalues)\r
-        {\r
-            if ((cJSON_GetArrayItem(allowedvalues, 0)->type) == 4)\r
+            if (! ref.empty())\r
             {\r
-                int size = cJSON_GetArraySize(allowedvalues);\r
-                int idx = 0;\r
-                std::vector<std::string> allwdValues;\r
-                do\r
+                ref.erase(0, delimiter2 .length());\r
+                std::string keyName;\r
+                if ( (pos = ref.find(delimiter2)) != std::string::npos)\r
                 {\r
-                    allwdValues.push_back(cJSON_GetArrayItem(allowedvalues, idx)->valuestring);\r
+                    keyName = ref.substr(0, pos);\r
+                    ref.erase(0, pos + delimiter2.length());\r
+                    if (keyName == "definitions")\r
+                    {\r
+                        if ( (pos = ref.find(delimiter2)) != std::string::npos)\r
+                        {\r
+                            defName = ref.substr(0, pos);\r
+                        }\r
+                        else if (! ref.empty())\r
+                        {\r
+                            defName = ref;\r
+                        }\r
+                    }\r
                 }\r
-                while ( ++idx < size);\r
-                newItem->setAllowedValues(allwdValues);\r
             }\r
-            else if ((cJSON_GetArrayItem(allowedvalues, 0)->type) == 3)\r
+            if (!fileName.empty())\r
             {\r
-                int size = cJSON_GetArraySize(allowedvalues);\r
-                int idx = 0;\r
-                if (newItem->getType() == "number")\r
+                if (!(defName.empty()))\r
                 {\r
-                    std::vector<double> allwdValues;\r
-                    do\r
-                    {\r
-                        allwdValues.push_back(cJSON_GetArrayItem(allowedvalues, idx)->valuedouble);\r
-                    }\r
-                    while ( ++idx < size);\r
-                    newItem->setAllowedValues(allwdValues);\r
+                    readFile(fileName, defName, param);\r
                 }\r
                 else\r
                 {\r
-                    std::vector<int> allwdValues;\r
-                    do\r
-                    {\r
-                        allwdValues.push_back(cJSON_GetArrayItem(allowedvalues, idx)->valueint);\r
-                    }\r
-                    while ( ++idx < size);\r
-                    newItem->setAllowedValues(allwdValues);\r
+                    throw JsonException("Definition Name Empty");\r
                 }\r
             }\r
-            else if (((cJSON_GetArrayItem(allowedvalues, 0)->type) == 1)\r
-                     || ((cJSON_GetArrayItem(allowedvalues, 0)->type) == 0))\r
+            else\r
             {\r
-                int size = cJSON_GetArraySize(allowedvalues);\r
-                int idx = 0;\r
-                std::vector<bool> allwdValues;\r
-                do\r
+                if (!(defName.empty()))\r
                 {\r
-                    if (cJSON_GetArrayItem(allowedvalues, idx)->type)\r
-                        allwdValues.push_back(true);\r
-                    else\r
-                        allwdValues.push_back(false);\r
+                    if (getDefinition(defName) == nullptr)\r
+                        throw JsonException("Definition Name Incorrect");\r
+                    param.addProperties(getDefinition(defName)->getProperties());\r
+                    param.addRequired(getDefinition(defName)->getRequiredValues());\r
+                    param.setType(getDefinition(defName)->getType());\r
+                }\r
+                else\r
+                {\r
+                    throw JsonException("Definition Name Empty");\r
                 }\r
-                while ( ++idx < size);\r
-                newItem->setAllowedValues(allwdValues);\r
-            }\r
-        }\r
-        cJSON *itemRequiredValues = cJSON_GetObjectItem(item, "required");\r
-        if (itemRequiredValues)\r
-        {\r
-            int size = cJSON_GetArraySize(itemRequiredValues);\r
-            int index = 0;\r
-            do\r
-            {\r
-                newItem->setRequiredValue(cJSON_GetArrayItem(itemRequiredValues, index)->valuestring);\r
             }\r
-            while ( ++index < size);\r
         }\r
-        cJSON *itemReference = cJSON_GetObjectItem(item, "$ref");\r
-        if (itemReference)\r
-        {\r
-            readItemRef(itemReference , newItem);\r
-        }\r
-        cJSON *itemAllOf = cJSON_GetObjectItem(item, "allOf");\r
-        if (itemAllOf)\r
-        {\r
-            readItemAllOf(itemAllOf , newItem);\r
-        }\r
-        return newItem;\r
     }\r
 \r
-    void JsonSchema::readItemRef(cJSON *itemReference, ItemsPtr item)\r
+    void JsonSchema::readJsonRef(cJSON *jsonReference , JsonParameters &param)\r
     {\r
-        std::string m_ref = itemReference->valuestring;\r
-        std::map<std::string, PropertiesPtr > properties;\r
-        std::vector<std::string> required;\r
-        std::string type;\r
+        std::string ref = jsonReference->valuestring;\r
 \r
         std::string web = "http://";\r
         std::string delimiter = "#";\r
-        std::size_t pos = m_ref.find(web);\r
+        std::size_t pos = ref.find(web);\r
 \r
         if (pos == std::string::npos)   // If Web Link Is GIVEN TO READ\r
         {\r
-            pos = m_ref.find(delimiter);\r
-            if ( pos ==  (m_ref.length() - 1 ) )\r
+            pos = ref.find(delimiter);\r
+            if ( pos ==  (ref.length() - 1) )\r
             {\r
-                std::string fileName = m_ref.substr(0, pos);\r
-                cJSON *m_json = m_includeResolver->readToJson(fileName);\r
-                JsonSchemaPtr Refparser = std::make_shared<JsonSchema>(m_json, m_includeResolver);\r
-\r
-                properties = Refparser->getProperties();\r
-                required = Refparser->getRequiredValues();\r
-                type =    Refparser->getType();\r
+                std::string fileName = ref.substr(0, pos);\r
+                readFile(fileName, param);\r
             }\r
             else\r
             {\r
-                DefinitionsPtr definitionRef = readRef(m_ref);\r
-                properties = definitionRef->getProperties();\r
-                required = definitionRef->getRequiredValues();\r
-                type =    definitionRef->getType();\r
-            }\r
-            for ( auto it : properties)\r
-            {\r
-                std:: string name = it.first;\r
-                item->addProperty(name, it.second);\r
-            }\r
-            for ( auto it : required)\r
-            {\r
-                item->setRequiredValue(it);\r
+                readRef(ref, param);\r
             }\r
-            item->setType(type);\r
         }\r
     }\r
 \r
-    void JsonSchema::readItemAllOf(cJSON *allofValues, ItemsPtr item)\r
+    void JsonSchema::readAllOf(cJSON *allofValues ,  JsonParameters &allParams)\r
     {\r
         int size = cJSON_GetArraySize(allofValues);\r
         int index = 0;\r
         do\r
         {\r
+            JsonParameters param;\r
+\r
             cJSON *childAllOf = cJSON_GetArrayItem(allofValues, index);\r
-            cJSON *itemReference = cJSON_GetObjectItem(childAllOf, "$ref");\r
-            if (itemReference)\r
+            cJSON *jsonReference = cJSON_GetObjectItem(childAllOf, "$ref");\r
+            if (jsonReference)\r
             {\r
-                readItemRef(itemReference, item);\r
+                readJsonRef(jsonReference, param);\r
+                allParams.addProperties(param.getProperties());\r
+                allParams.addRequired(param.getRequired());\r
+                allParams.setType(param.getType());\r
             }\r
-            cJSON *itemRequiredValues = cJSON_GetObjectItem(allofValues, "required");\r
-            if (itemRequiredValues)\r
+            cJSON *jsonRequiredValues = cJSON_GetObjectItem(childAllOf, "required");\r
+            if (jsonRequiredValues)\r
             {\r
-                int len = cJSON_GetArraySize(itemRequiredValues);\r
+                int len = cJSON_GetArraySize(jsonRequiredValues);\r
                 int idx = 0;\r
                 do\r
                 {\r
-                    item->setRequiredValue(cJSON_GetArrayItem(itemRequiredValues, idx)->valuestring);\r
+                    allParams.addRequired(cJSON_GetArrayItem(jsonRequiredValues, idx)->valuestring);\r
                 }\r
                 while ( ++idx < len);\r
             }\r