*\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
}\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
+ m_additionalProperties = (jsonAdditionalProperties->type == cJSON_True);\r
else\r
- m_additionalProperties = cJSON_True;\r
+ m_additionalProperties = true;\r
\r
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
{\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
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
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
+ if (propertyType->type == cJSON_String)\r
{\r
attType = propertyType->valuestring;\r
- property->setType(attType);\r
}\r
- else if (propertyType->type == 5)\r
+ else if (propertyType->type == cJSON_Array)\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
- {\r
- property->setValue((std::string)defaultValue->valuestring);\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
+ cJSON *defaultValue = cJSON_GetObjectItem(childProperties, "default");\r
+ if (defaultValue)\r
{\r
- property->setValue((bool)false);\r
+ readDefaultValue(defaultValue, property, attType);\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 == cJSON_String)\r
+ {\r
+ property->setValue((std::string)defaultValue->valuestring);\r
+ }\r
+ else if (defaultValue->type == cJSON_Number)\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 == cJSON_True)\r
+ {\r
+ property->setValue((bool)true);\r
+ }\r
+ else if (defaultValue->type == cJSON_False)\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) == cJSON_String)\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) == cJSON_Number)\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) == cJSON_True)\r
+ || ((cJSON_GetArrayItem(allowedvalues, 0)->type) == cJSON_False))\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 != cJSON_False)\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
{\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
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
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 == cJSON_Array)\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 = false, addItems = false;\r
+ if (itemsMax)\r
{\r
cJSON *exclusiveMax = cJSON_GetObjectItem(childProperties, "exclusiveMaximum");\r
if (exclusiveMax)\r
{\r
if (exclusiveMax->type == cJSON_True)\r
- property->setMax( --(Max->valuedouble));\r
+ max = --(itemsMax->valueint);\r
else\r
- property->setMax(Max->valuedouble);\r
+ max = itemsMax->valueint;\r
}\r
else\r
- property->setMax(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->setMin( ++(Min->valuedouble));\r
+ min = ++(itemsMin->valueint);\r
else\r
- property->setMin(Min->valuedouble);\r
+ min = itemsMin->valueint;\r
}\r
else\r
- property->setMin(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 == cJSON_True);\r
}\r
-\r
+ cJSON *additionalItems = cJSON_GetObjectItem(childProperties, "additionalItems");\r
+ if (additionalItems)\r
+ {\r
+ addItems = (additionalItems->type == cJSON_True);\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 ¶m)\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 ¶m)\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 ¶m)\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 (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
- if (cJSON_GetArrayItem(allowedvalues, idx)->type)\r
- allwdValues.push_back(true);\r
- else\r
- allwdValues.push_back(false);\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 ¶m)\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