From b812fc57f2d7c0c930ae41203d2390db38e1ba08 Mon Sep 17 00:00:00 2001 From: Dmitriy Klimenko Date: Thu, 3 Apr 2014 07:06:18 -0700 Subject: [PATCH] APPLINK-6274: Default values --- .../include/smart_objects/bool_schema_item.h | 9 +++++++++ .../include/smart_objects/enum_schema_item.h | 22 ++++++++++++++++++++++ .../include/smart_objects/number_schema_item.h | 22 ++++++++++++++++++++++ .../include/smart_objects/schema_item.h | 9 +++++++++ .../smart_objects/src/bool_schema_item.cc | 12 ++++++++++++ .../smart_objects/src/object_schema_item.cc | 18 ++++++++++++++++++ src/components/smart_objects/src/schema_item.cc | 4 ++++ 7 files changed, 96 insertions(+) diff --git a/src/components/smart_objects/include/smart_objects/bool_schema_item.h b/src/components/smart_objects/include/smart_objects/bool_schema_item.h index 4479aee..33f6d3f 100644 --- a/src/components/smart_objects/include/smart_objects/bool_schema_item.h +++ b/src/components/smart_objects/include/smart_objects/bool_schema_item.h @@ -73,6 +73,15 @@ class CBoolSchemaItem : public ISchemaItem { virtual bool setDefaultValue(SmartObject& Object); /** + * @brief Check if object has default value. + * + * @param Object Object to set default value. + * + * @return true if default value was successfully set, false otherwise. + **/ + virtual bool hasDefaultValue(SmartObject& Object); + + /** * @brief Build smart object by smart schema having copied matched * parameters from pattern smart object * 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 15f5c5a..48b1609 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 @@ -86,6 +86,15 @@ class TEnumSchemaItem : public ISchemaItem { virtual bool setDefaultValue(SmartObject& Object); /** + * @brief Check if object has default value. + * + * @param Object Object to set default value. + * + * @return true if default value was successfully set, false otherwise. + **/ + virtual bool hasDefaultValue(SmartObject& Object); + + /** * @brief Apply schema. * * This implementation checks if enumeration is represented as string @@ -218,6 +227,19 @@ bool TEnumSchemaItem::setDefaultValue(SmartObject& Object) { return result; } +template +bool TEnumSchemaItem::hasDefaultValue(SmartObject& Object) { + bool result = false; + EnumType value; + + if (true == mDefaultValue.getValue(value)) { + Object = static_cast(value); + result = true; + } + + return result; +} + // TODO(cpplint): Is this a non-const reference? // If so, make const or use a pointer. template 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 eec29fe..5e9ba74 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 @@ -89,6 +89,15 @@ class TNumberSchemaItem : public ISchemaItem { virtual bool setDefaultValue(SmartObject& Object); /** + * @brief Check if object has default value. + * + * @param Object Object to set default value. + * + * @return true if default value was successfully set, false otherwise. + **/ + virtual bool hasDefaultValue(SmartObject& Object); + + /** * @brief Build smart object by smart schema having copied matched * parameters from pattern smart object * @@ -253,6 +262,19 @@ bool TNumberSchemaItem::setDefaultValue(SmartObject& Object) { } template +bool TNumberSchemaItem::hasDefaultValue(SmartObject& Object) { + bool result = false; + NumberType value; + + if (true == mDefaultValue.getValue(value)) { + Object = value; + result = true; + } + + return result; +} + +template void TNumberSchemaItem::BuildObjectBySchema( const SmartObject& pattern_object, SmartObject& result_object) { 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 a73ffc6..85b19e5 100644 --- a/src/components/smart_objects/include/smart_objects/schema_item.h +++ b/src/components/smart_objects/include/smart_objects/schema_item.h @@ -61,6 +61,15 @@ class ISchemaItem { virtual bool setDefaultValue(SmartObject& Object); /** + * @brief Check if object has default value. + * + * @param Object Object to set default value. + * + * @return true if default value was successfully set, false otherwise. + **/ + virtual bool hasDefaultValue(SmartObject& Object); + + /** * @brief Apply schema. * * @param Object Object to apply schema. diff --git a/src/components/smart_objects/src/bool_schema_item.cc b/src/components/smart_objects/src/bool_schema_item.cc index 11d8c66..39f7149 100644 --- a/src/components/smart_objects/src/bool_schema_item.cc +++ b/src/components/smart_objects/src/bool_schema_item.cc @@ -57,6 +57,18 @@ bool CBoolSchemaItem::setDefaultValue(SmartObject& Object) { return result; } +bool CBoolSchemaItem::hasDefaultValue(SmartObject& Object) { + bool result = false; + bool value = false; + + if (true == mDefaultValue.getValue(value)) { + Object = value; + result = true; + } + + return result; +} + void CBoolSchemaItem::BuildObjectBySchema(const SmartObject& pattern_object, SmartObject& result_object) { if (SmartType_Boolean == pattern_object.getType()) { diff --git a/src/components/smart_objects/src/object_schema_item.cc b/src/components/smart_objects/src/object_schema_item.cc index 8bdef53..d541608 100644 --- a/src/components/smart_objects/src/object_schema_item.cc +++ b/src/components/smart_objects/src/object_schema_item.cc @@ -95,6 +95,24 @@ Errors::eType CObjectSchemaItem::validate(const SmartObject& Object) { void CObjectSchemaItem::applySchema(SmartObject& Object) { if (SmartType_Map == Object.getType()) { + SmartObject def_value; + const std::set objectKeys = Object.enumerate(); + for (std::map::const_iterator i = + mMembers.begin(); i != mMembers.end(); ++i) { + if ((objectKeys.end() == objectKeys.find(i->first)) && + (true == i->second.mSchemaItem->hasDefaultValue(def_value))) { + // create default value + Object[i->first] = SmartObject(def_value.getType()); + if (SmartType_Boolean == def_value.getType()) { + Object[i->first] = def_value.asBool(); + } else if (SmartType_Integer == def_value.getType()) { + Object[i->first] = def_value.asUInt(); + } else if (SmartType_Double == def_value.getType()) { + Object[i->first] = def_value.asDouble(); + } + } + } + for (std::map::const_iterator i = mMembers.begin(); i != mMembers.end(); ++i) { if (Object.keyExists(i->first)) { diff --git a/src/components/smart_objects/src/schema_item.cc b/src/components/smart_objects/src/schema_item.cc index 6038644..e237341 100644 --- a/src/components/smart_objects/src/schema_item.cc +++ b/src/components/smart_objects/src/schema_item.cc @@ -41,6 +41,10 @@ bool ISchemaItem::setDefaultValue(SmartObject& Object) { return false; } +bool ISchemaItem::hasDefaultValue(SmartObject& Object) { + return false; +} + void ISchemaItem::applySchema(SmartObject& Object) { } -- 2.7.4