summaryrefslogtreecommitdiff
path: root/src/components/smart_objects/include
diff options
context:
space:
mode:
authorJacob Keeler <jacob.keeler@livioradio.com>2017-05-04 12:18:40 -0400
committerJacob Keeler <jacob.keeler@livioradio.com>2017-05-04 12:18:40 -0400
commit884e897941a600c11b7fcfa3d8cf59ce15eb3571 (patch)
tree1d5b0d1abbdcdd7c2661a59b3c10b6110fbf53a3 /src/components/smart_objects/include
parentdc9732721e1690159fb56e0b5f5e9d643c9a9d44 (diff)
downloadsdl_core-884e897941a600c11b7fcfa3d8cf59ce15eb3571.tar.gz
Invalid data responses now return useful error messages in `info` field
Diffstat (limited to 'src/components/smart_objects/include')
-rw-r--r--src/components/smart_objects/include/smart_objects/always_false_schema_item.h3
-rw-r--r--src/components/smart_objects/include/smart_objects/always_true_schema_item.h3
-rw-r--r--src/components/smart_objects/include/smart_objects/array_schema_item.h3
-rw-r--r--src/components/smart_objects/include/smart_objects/default_shema_item.h20
-rw-r--r--src/components/smart_objects/include/smart_objects/enum_schema_item.h26
-rw-r--r--src/components/smart_objects/include/smart_objects/number_schema_item.h31
-rw-r--r--src/components/smart_objects/include/smart_objects/object_schema_item.h3
-rw-r--r--src/components/smart_objects/include/smart_objects/schema_item.h3
-rw-r--r--src/components/smart_objects/include/smart_objects/smart_object.h52
-rw-r--r--src/components/smart_objects/include/smart_objects/smart_schema.h3
-rw-r--r--src/components/smart_objects/include/smart_objects/string_schema_item.h3
11 files changed, 134 insertions, 16 deletions
diff --git a/src/components/smart_objects/include/smart_objects/always_false_schema_item.h b/src/components/smart_objects/include/smart_objects/always_false_schema_item.h
index dfbf4ba43e..6e62be6f2d 100644
--- a/src/components/smart_objects/include/smart_objects/always_false_schema_item.h
+++ b/src/components/smart_objects/include/smart_objects/always_false_schema_item.h
@@ -53,7 +53,8 @@ class CAlwaysFalseSchemaItem : public ISchemaItem {
* @param Object Object to validate.
* @return Errors::ERROR
**/
- Errors::eType validate(const SmartObject& Object) OVERRIDE;
+ Errors::eType validate(const SmartObject& Object,
+ std::string& errorMessage) OVERRIDE;
private:
CAlwaysFalseSchemaItem();
diff --git a/src/components/smart_objects/include/smart_objects/always_true_schema_item.h b/src/components/smart_objects/include/smart_objects/always_true_schema_item.h
index 3dd598d7bd..54e8bc9baa 100644
--- a/src/components/smart_objects/include/smart_objects/always_true_schema_item.h
+++ b/src/components/smart_objects/include/smart_objects/always_true_schema_item.h
@@ -53,7 +53,8 @@ class CAlwaysTrueSchemaItem : public ISchemaItem {
* @param Object Object to validate.
* @return NsSmartObjects::Errors::eType
**/
- Errors::eType validate(const SmartObject& Object) OVERRIDE;
+ Errors::eType validate(const SmartObject& Object,
+ std::string& errorMessage) OVERRIDE;
private:
CAlwaysTrueSchemaItem();
diff --git a/src/components/smart_objects/include/smart_objects/array_schema_item.h b/src/components/smart_objects/include/smart_objects/array_schema_item.h
index 0d3a651d56..c8057d6ca1 100644
--- a/src/components/smart_objects/include/smart_objects/array_schema_item.h
+++ b/src/components/smart_objects/include/smart_objects/array_schema_item.h
@@ -69,7 +69,8 @@ class CArraySchemaItem : public ISchemaItem {
*
* @return NsSmartObjects::Errors::eType
**/
- Errors::eType validate(const SmartObject& Object) OVERRIDE;
+ Errors::eType validate(const SmartObject& Object,
+ std::string& errorMessage) OVERRIDE;
/**
* @brief Apply schema.
diff --git a/src/components/smart_objects/include/smart_objects/default_shema_item.h b/src/components/smart_objects/include/smart_objects/default_shema_item.h
index 857354a4e6..6bac513b16 100644
--- a/src/components/smart_objects/include/smart_objects/default_shema_item.h
+++ b/src/components/smart_objects/include/smart_objects/default_shema_item.h
@@ -54,7 +54,8 @@ class CDefaultSchemaItem : public ISchemaItem {
* @param Object Object to validate.
* @return NsSmartObjects::Errors::eType
**/
- Errors::eType validate(const SmartObject& Object) OVERRIDE;
+ Errors::eType validate(const SmartObject& Object,
+ std::string& errorMessage) OVERRIDE;
/**
* @brief Set default value to an object.
@@ -98,9 +99,20 @@ CDefaultSchemaItem<Type>::CDefaultSchemaItem(const ParameterType& DefaultValue)
: mDefaultValue(DefaultValue) {}
template <typename Type>
-Errors::eType CDefaultSchemaItem<Type>::validate(const SmartObject& Object) {
- return (getSmartType() == Object.getType()) ? Errors::OK
- : Errors::INVALID_VALUE;
+Errors::eType CDefaultSchemaItem<Type>::validate(const SmartObject& Object,
+ std::string& errorMessage) {
+ if (getSmartType() != Object.getType()) {
+ if (!Object.getKey().empty()) {
+ errorMessage.assign("Validation failed for \"" + Object.getKey() +
+ "\". ");
+ }
+ errorMessage += "Incorrect type, expected: " +
+ SmartObject::typeToString(getSmartType()) + ", got: " +
+ SmartObject::typeToString(Object.getType());
+ return Errors::INVALID_VALUE;
+ } else {
+ return Errors::OK;
+ }
}
template <typename Type>
diff --git a/src/components/smart_objects/include/smart_objects/enum_schema_item.h b/src/components/smart_objects/include/smart_objects/enum_schema_item.h
index a0d6d94017..6f77856c45 100644
--- a/src/components/smart_objects/include/smart_objects/enum_schema_item.h
+++ b/src/components/smart_objects/include/smart_objects/enum_schema_item.h
@@ -69,7 +69,8 @@ class TEnumSchemaItem : public CDefaultSchemaItem<EnumType> {
* @param Object Object to validate.
* @return NsSmartObjects::Errors::eType
**/
- Errors::eType validate(const SmartObject& Object) OVERRIDE;
+ Errors::eType validate(const SmartObject& Object,
+ std::string& errorMessage) OVERRIDE;
/**
* @brief Apply schema.
* This implementation checks if enumeration is represented as string
@@ -206,12 +207,33 @@ utils::SharedPtr<TEnumSchemaItem<EnumType> > TEnumSchemaItem<EnumType>::create(
}
template <typename EnumType>
-Errors::eType TEnumSchemaItem<EnumType>::validate(const SmartObject& Object) {
+Errors::eType TEnumSchemaItem<EnumType>::validate(const SmartObject& Object,
+ std::string& errorMessage) {
if (SmartType_Integer != Object.getType()) {
+ if (!Object.getKey().empty()) {
+ errorMessage.assign("Validation failed for \"" + Object.getKey() +
+ "\". ");
+ }
+
+ if (SmartType_String == Object.getType()) {
+ errorMessage += "Invalid enum value: " + Object.asString();
+ } else {
+ errorMessage += "Incorrect type, expected: " +
+ SmartObject::typeToString(SmartType_Integer) +
+ " (enum), got: " +
+ SmartObject::typeToString(Object.getType());
+ }
return Errors::INVALID_VALUE;
}
if (mAllowedElements.find(static_cast<EnumType>(Object.asInt())) ==
mAllowedElements.end()) {
+ if (!Object.getKey().empty()) {
+ errorMessage.assign("Validation failed for \"" + Object.getKey() +
+ "\". ");
+ }
+ std::stringstream stream;
+ stream << "Invalid enum value: " << Object.asInt();
+ errorMessage += stream.str();
return Errors::OUT_OF_RANGE;
}
return Errors::OK;
diff --git a/src/components/smart_objects/include/smart_objects/number_schema_item.h b/src/components/smart_objects/include/smart_objects/number_schema_item.h
index 01d6c08daa..70e75938ed 100644
--- a/src/components/smart_objects/include/smart_objects/number_schema_item.h
+++ b/src/components/smart_objects/include/smart_objects/number_schema_item.h
@@ -69,7 +69,8 @@ class TNumberSchemaItem : public CDefaultSchemaItem<NumberType> {
* @param Object Object to validate.
* @return NsSmartObjects::Errors::eType
**/
- Errors::eType validate(const SmartObject& Object) OVERRIDE;
+ Errors::eType validate(const SmartObject& Object,
+ std::string& errorMessage) OVERRIDE;
private:
/**
@@ -127,8 +128,18 @@ bool TNumberSchemaItem<NumberType>::isValidNumberType(SmartType type) {
template <typename NumberType>
Errors::eType TNumberSchemaItem<NumberType>::validate(
- const SmartObject& Object) {
+ const SmartObject& Object, std::string& errorMessage) {
if (!isValidNumberType(Object.getType())) {
+ if (!Object.getKey().empty()) {
+ errorMessage.assign("Validation failed for \"" + Object.getKey() +
+ "\". ");
+ }
+ SmartType expectedType = (typeid(double) == typeid(Object.getType()))
+ ? SmartType_Double
+ : SmartType_Integer;
+ errorMessage += "Incorrect type, expected: " +
+ SmartObject::typeToString(expectedType) + ", got: " +
+ SmartObject::typeToString(Object.getType());
return Errors::INVALID_VALUE;
}
NumberType value(0);
@@ -148,10 +159,26 @@ Errors::eType TNumberSchemaItem<NumberType>::validate(
NumberType rangeLimit;
if (mMinValue.getValue(rangeLimit) && (value < rangeLimit)) {
+ if (!Object.getKey().empty()) {
+ errorMessage.assign("Validation failed for \"" + Object.getKey() +
+ "\". ");
+ }
+ std::stringstream stream;
+ stream << "Value too small, got: " << value
+ << ", minimum allowed: " << rangeLimit;
+ errorMessage += stream.str();
return Errors::OUT_OF_RANGE;
}
if (mMaxValue.getValue(rangeLimit) && (value > rangeLimit)) {
+ if (!Object.getKey().empty()) {
+ errorMessage.assign("Validation failed for \"" + Object.getKey() +
+ "\". ");
+ }
+ std::stringstream stream;
+ stream << "Value too large, got: " << value
+ << ", maximum allowed: " << rangeLimit;
+ errorMessage += stream.str();
return Errors::OUT_OF_RANGE;
}
return Errors::OK;
diff --git a/src/components/smart_objects/include/smart_objects/object_schema_item.h b/src/components/smart_objects/include/smart_objects/object_schema_item.h
index 549166e723..781f6a729c 100644
--- a/src/components/smart_objects/include/smart_objects/object_schema_item.h
+++ b/src/components/smart_objects/include/smart_objects/object_schema_item.h
@@ -88,7 +88,8 @@ class CObjectSchemaItem : public ISchemaItem {
* @param Object Object to validate.
* @return NsSmartObjects::Errors::eType
**/
- Errors::eType validate(const SmartObject& Object) OVERRIDE;
+ Errors::eType validate(const SmartObject& Object,
+ std::string& errorMessage) OVERRIDE;
/**
* @brief Apply schema.
* @param Object Object to apply schema.
diff --git a/src/components/smart_objects/include/smart_objects/schema_item.h b/src/components/smart_objects/include/smart_objects/schema_item.h
index 08610f244e..c1737417db 100644
--- a/src/components/smart_objects/include/smart_objects/schema_item.h
+++ b/src/components/smart_objects/include/smart_objects/schema_item.h
@@ -53,7 +53,8 @@ class ISchemaItem {
*
* @return NsSmartObjects::Errors::eType
**/
- virtual Errors::eType validate(const SmartObject& Object);
+ virtual Errors::eType validate(const SmartObject& Object,
+ std::string& errorMessage);
/**
* @brief Set default value to an object.
diff --git a/src/components/smart_objects/include/smart_objects/smart_object.h b/src/components/smart_objects/include/smart_objects/smart_object.h
index 98e58fffd1..95d52209f7 100644
--- a/src/components/smart_objects/include/smart_objects/smart_object.h
+++ b/src/components/smart_objects/include/smart_objects/smart_object.h
@@ -674,7 +674,7 @@ class SmartObject FINAL {
*
* @return Result of validation.
*/
- Errors::eType validate();
+ Errors::eType validate(std::string& errorMessage);
/**
* @brief Sets new schema
@@ -699,6 +699,21 @@ class SmartObject FINAL {
SmartType getType() const;
/**
+ * @brief Sets new key for this object
+ *
+ * @param std::string New key sequesnce
+ * @return void
+ **/
+ void setKey(const std::string& NewKey);
+
+ /**
+ * @brief Returns current object type
+ *
+ * @return std::string
+ **/
+ std::string getKey() const;
+
+ /**
* @brief Returns length of object
*
* If object has type string, array or map then method returns corresponded
@@ -727,6 +742,35 @@ class SmartObject FINAL {
return !(*this == Other);
}
+ static std::string typeToString(SmartType type) {
+ switch (type) {
+ case SmartType_Null:
+ return "Null";
+ case SmartType_Boolean:
+ return "Boolean";
+ case SmartType_Integer:
+ return "Integer";
+ case SmartType_Character:
+ return "Character";
+ case SmartType_String:
+ return "String";
+ case SmartType_Double:
+ return "Double";
+ case SmartType_Map:
+ return "Object";
+ case SmartType_Array:
+ return "Array";
+ case SmartType_Binary:
+ return "Binary_Data";
+ case SmartType_UInteger:
+ return "Unsigned_Integer";
+ case SmartType_Invalid:
+ return "Invalid_Type";
+ default:
+ return "Unknown_Type";
+ }
+ }
+
protected:
static std::string OperatorToTransform(const SmartMap::value_type& pair);
/**
@@ -976,6 +1020,12 @@ class SmartObject FINAL {
* @brief Validation schema, attached to the object
**/
CSmartSchema m_schema;
+
+ /**
+ * @brief Key sequence that describes where the current object is within an
+ *object structure, for debugging purposes
+ **/
+ std::string* m_key;
};
/**
diff --git a/src/components/smart_objects/include/smart_objects/smart_schema.h b/src/components/smart_objects/include/smart_objects/smart_schema.h
index 52dfa12004..3fd67053ae 100644
--- a/src/components/smart_objects/include/smart_objects/smart_schema.h
+++ b/src/components/smart_objects/include/smart_objects/smart_schema.h
@@ -67,7 +67,8 @@ class CSmartSchema FINAL {
*
* @return Result of validation.
*/
- Errors::eType validate(const SmartObject& Object) const;
+ Errors::eType validate(const SmartObject& Object,
+ std::string& errorMessage) const;
/**
* @brief Set new root schema item.
diff --git a/src/components/smart_objects/include/smart_objects/string_schema_item.h b/src/components/smart_objects/include/smart_objects/string_schema_item.h
index 7fad8491a5..20d8040e29 100644
--- a/src/components/smart_objects/include/smart_objects/string_schema_item.h
+++ b/src/components/smart_objects/include/smart_objects/string_schema_item.h
@@ -66,7 +66,8 @@ class CStringSchemaItem : public CDefaultSchemaItem<std::string> {
* @param Object Object to validate.
* @return NsSmartObjects::Errors::eType
**/
- Errors::eType validate(const SmartObject& Object) OVERRIDE;
+ Errors::eType validate(const SmartObject& Object,
+ std::string& errorMessage) OVERRIDE;
private:
/**