APPLINK-6274: Default values
authorDmitriy Klimenko <DKlimenko@luxoft.com>
Thu, 3 Apr 2014 14:06:18 +0000 (07:06 -0700)
committerJustin Dickow <jjdickow@gmail.com>
Tue, 8 Jul 2014 22:46:50 +0000 (18:46 -0400)
src/components/smart_objects/include/smart_objects/bool_schema_item.h
src/components/smart_objects/include/smart_objects/enum_schema_item.h
src/components/smart_objects/include/smart_objects/number_schema_item.h
src/components/smart_objects/include/smart_objects/schema_item.h
src/components/smart_objects/src/bool_schema_item.cc
src/components/smart_objects/src/object_schema_item.cc
src/components/smart_objects/src/schema_item.cc

index 4479aee..33f6d3f 100644 (file)
@@ -73,6 +73,15 @@ class CBoolSchemaItem : public ISchemaItem {
   virtual bool setDefaultValue(SmartObject& Object);
 
   /**
   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
    *
    * @brief Build smart object by smart schema having copied matched
    *        parameters from pattern smart object
    *
index 15f5c5a..48b1609 100644 (file)
@@ -86,6 +86,15 @@ class TEnumSchemaItem : public ISchemaItem {
   virtual bool setDefaultValue(SmartObject& Object);
 
   /**
   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
    * @brief Apply schema.
    *
    * This implementation checks if enumeration is represented as string
@@ -218,6 +227,19 @@ bool TEnumSchemaItem<EnumType>::setDefaultValue(SmartObject& Object) {
   return result;
 }
 
   return result;
 }
 
+template<typename EnumType>
+bool TEnumSchemaItem<EnumType>::hasDefaultValue(SmartObject& Object) {
+  bool result = false;
+  EnumType value;
+
+  if (true == mDefaultValue.getValue(value)) {
+    Object = static_cast<int32_t>(value);
+    result = true;
+  }
+
+  return result;
+}
+
 // TODO(cpplint): Is this a non-const reference?
 // If so, make const or use a pointer.
 template<typename EnumType>
 // TODO(cpplint): Is this a non-const reference?
 // If so, make const or use a pointer.
 template<typename EnumType>
index eec29fe..5e9ba74 100644 (file)
@@ -89,6 +89,15 @@ class TNumberSchemaItem : public ISchemaItem {
   virtual bool setDefaultValue(SmartObject& Object);
 
   /**
   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
    *
    * @brief Build smart object by smart schema having copied matched
    *        parameters from pattern smart object
    *
@@ -253,6 +262,19 @@ bool TNumberSchemaItem<NumberType>::setDefaultValue(SmartObject& Object) {
 }
 
 template<typename NumberType>
 }
 
 template<typename NumberType>
+bool TNumberSchemaItem<NumberType>::hasDefaultValue(SmartObject& Object) {
+  bool result = false;
+  NumberType value;
+
+  if (true == mDefaultValue.getValue(value)) {
+    Object = value;
+    result = true;
+  }
+
+  return result;
+}
+
+template<typename NumberType>
 void TNumberSchemaItem<NumberType>::BuildObjectBySchema(
     const SmartObject& pattern_object, SmartObject& result_object) {
 
 void TNumberSchemaItem<NumberType>::BuildObjectBySchema(
     const SmartObject& pattern_object, SmartObject& result_object) {
 
index a73ffc6..85b19e5 100644 (file)
@@ -61,6 +61,15 @@ class ISchemaItem {
   virtual bool setDefaultValue(SmartObject& Object);
 
   /**
   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.
    * @brief Apply schema.
    *
    * @param Object Object to apply schema.
index 11d8c66..39f7149 100644 (file)
@@ -57,6 +57,18 @@ bool CBoolSchemaItem::setDefaultValue(SmartObject& Object) {
   return result;
 }
 
   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()) {
 void CBoolSchemaItem::BuildObjectBySchema(const SmartObject& pattern_object,
                                           SmartObject& result_object) {
   if (SmartType_Boolean == pattern_object.getType()) {
index 8bdef53..d541608 100644 (file)
@@ -95,6 +95,24 @@ Errors::eType CObjectSchemaItem::validate(const SmartObject& Object) {
 void CObjectSchemaItem::applySchema(SmartObject& Object) {
   if (SmartType_Map == Object.getType()) {
 
 void CObjectSchemaItem::applySchema(SmartObject& Object) {
   if (SmartType_Map == Object.getType()) {
 
+    SmartObject def_value;
+    const std::set<std::string> objectKeys = Object.enumerate();
+    for (std::map<std::string, CObjectSchemaItem::SMember>::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<std::string, CObjectSchemaItem::SMember>::const_iterator i =
         mMembers.begin(); i != mMembers.end(); ++i) {
       if (Object.keyExists(i->first)) {
     for (std::map<std::string, CObjectSchemaItem::SMember>::const_iterator i =
         mMembers.begin(); i != mMembers.end(); ++i) {
       if (Object.keyExists(i->first)) {
index 6038644..e237341 100644 (file)
@@ -41,6 +41,10 @@ bool ISchemaItem::setDefaultValue(SmartObject& Object) {
   return false;
 }
 
   return false;
 }
 
+bool ISchemaItem::hasDefaultValue(SmartObject& Object) {
+  return false;
+}
+
 void ISchemaItem::applySchema(SmartObject& Object) {
 }
 
 void ISchemaItem::applySchema(SmartObject& Object) {
 }