summaryrefslogtreecommitdiff
path: root/src/components/smart_objects
diff options
context:
space:
mode:
Diffstat (limited to 'src/components/smart_objects')
-rw-r--r--src/components/smart_objects/include/smart_objects/object_schema_item.h100
-rw-r--r--src/components/smart_objects/include/smart_objects/schema_item.h13
-rw-r--r--src/components/smart_objects/include/smart_objects/smart_schema.h7
-rw-r--r--src/components/smart_objects/src/object_schema_item.cc46
-rw-r--r--src/components/smart_objects/src/smart_schema.cc4
-rw-r--r--src/components/smart_objects/test/CObjectSchemaItem_test.cc62
-rw-r--r--src/components/smart_objects/test/SmartObjectConvertionTime_test.cc57
7 files changed, 162 insertions, 127 deletions
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 7f51ae5678..ee42b36620 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
@@ -45,55 +45,57 @@
namespace ns_smart_device_link {
namespace ns_smart_objects {
+
/**
- * @brief Object schema item.
+ * @brief Object member.
**/
-class CObjectSchemaItem : public ISchemaItem {
- public:
+struct SMember {
/**
- * @brief Object member.
+ * @brief Default constructor.
+ **/
+ SMember();
+ /**
+ * @brief Constructor.
+ * @param SchemaItem Member schema item.
+ * @param IsMandatory true if member is mandatory, false
+ * otherwise. Defaults to true.
**/
- struct SMember {
- /**
- * @brief Default constructor.
- **/
- SMember();
- /**
- * @brief Constructor.
- * @param SchemaItem Member schema item.
- * @param IsMandatory true if member is mandatory, false
- * otherwise. Defaults to true.
- **/
- SMember(const ISchemaItemPtr SchemaItem,
- const bool IsMandatory = true,
- const std::string& Since = "",
- const std::string& Until = "",
- const bool IsDeprecated = false,
- const bool IsRemoved = false,
- const std::vector<CObjectSchemaItem::SMember>& history_vector = {});
- /**
- * @brief Checks the version a parameter was removed (until)
- * If the mobile's msg version is greater than or
- **/
- bool CheckHistoryFieldVersion(
- const utils::SemanticVersion& MessageVersion) const;
+ SMember(const ISchemaItemPtr SchemaItem,
+ const bool IsMandatory = true,
+ const std::string& Since = "",
+ const std::string& Until = "",
+ const bool IsDeprecated = false,
+ const bool IsRemoved = false,
+ const std::vector<SMember>& history_vector = {});
+ /**
+ * @brief Checks the version a parameter was removed (until)
+ * If the mobile's msg version is greater than or
+ **/
+ bool CheckHistoryFieldVersion(
+ const utils::SemanticVersion& MessageVersion) const;
+
+ /**
+ * @brief Member schema item.
+ **/
+ ISchemaItemPtr mSchemaItem;
+ /**
+ * @brief true if member is mandatory, false otherwise.
+ **/
+ bool mIsMandatory;
+ boost::optional<utils::SemanticVersion> mSince;
+ boost::optional<utils::SemanticVersion> mUntil;
+ bool mIsDeprecated;
+ bool mIsRemoved;
+ std::vector<SMember> mHistoryVector;
+};
+typedef std::map<std::string, SMember> Members;
- /**
- * @brief Member schema item.
- **/
- ISchemaItemPtr mSchemaItem;
- /**
- * @brief true if member is mandatory, false otherwise.
- **/
- bool mIsMandatory;
- boost::optional<utils::SemanticVersion> mSince;
- boost::optional<utils::SemanticVersion> mUntil;
- bool mIsDeprecated;
- bool mIsRemoved;
- std::vector<CObjectSchemaItem::SMember> mHistoryVector;
- };
- typedef std::map<std::string, SMember> Members;
+/**
+ * @brief Object schema item.
+ **/
+class CObjectSchemaItem : public ISchemaItem {
+ public:
/**
* @brief Create a new schema item.
*
@@ -153,6 +155,12 @@ class CObjectSchemaItem : public ISchemaItem {
*/
size_t GetMemberSize() OVERRIDE;
+ boost::optional<SMember&> GetMemberSchemaItem(
+ const std::string& member_key) OVERRIDE;
+
+ void AddMemberSchemaItem(const std::string& member_key,
+ SMember& member) OVERRIDE;
+
protected:
/**
* @brief Constructor.
@@ -173,14 +181,14 @@ class CObjectSchemaItem : public ISchemaItem {
* @param member Schema member
* @param MmessageVersion Semantic Version of mobile message.
**/
- const CObjectSchemaItem::SMember& GetCorrectMember(
- const SMember& member, const utils::SemanticVersion& messageVersion);
+ const SMember& GetCorrectMember(const SMember& member,
+ const utils::SemanticVersion& messageVersion);
/**
* @brief Map of member name to SMember structure describing the object
*member.
**/
- const Members mMembers;
+ Members mMembers;
DISALLOW_COPY_AND_ASSIGN(CObjectSchemaItem);
};
} // namespace ns_smart_objects
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 fa5f6d3adc..9c29e66f36 100644
--- a/src/components/smart_objects/include/smart_objects/schema_item.h
+++ b/src/components/smart_objects/include/smart_objects/schema_item.h
@@ -40,12 +40,14 @@
#include <memory>
#include <vector>
+#include "boost/optional/optional.hpp"
#include "utils/macro.h"
#include "utils/semantic_version.h"
namespace ns_smart_device_link {
namespace ns_smart_objects {
class SmartObject;
+class SMember;
/**
* @brief Base schema item.
@@ -123,6 +125,17 @@ class ISchemaItem {
virtual void BuildObjectBySchema(const SmartObject& pattern_object,
SmartObject& result_object);
+ virtual boost::optional<SMember&> GetMemberSchemaItem(
+ const std::string& member_key) {
+ UNUSED(member_key);
+ return boost::optional<SMember&>();
+ }
+
+ virtual void AddMemberSchemaItem(const std::string& member_key,
+ SMember& member) {
+ UNUSED(member_key);
+ UNUSED(member);
+ }
/**
* @brief Get value param, depends of children
*
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 936f49c11e..8cbafa53b2 100644
--- a/src/components/smart_objects/include/smart_objects/smart_schema.h
+++ b/src/components/smart_objects/include/smart_objects/smart_schema.h
@@ -86,6 +86,13 @@ class CSmartSchema FINAL {
void setSchemaItem(const ISchemaItemPtr SchemaItem);
/**
+ * @brief Set new root schema item.
+ *
+ * @param SchemaItem Root schema item.
+ */
+ ISchemaItemPtr getSchemaItem();
+
+ /**
* @brief Apply schema.
*
* @param Object Object to apply schema.
diff --git a/src/components/smart_objects/src/object_schema_item.cc b/src/components/smart_objects/src/object_schema_item.cc
index be1c73fb85..01e4ec46e0 100644
--- a/src/components/smart_objects/src/object_schema_item.cc
+++ b/src/components/smart_objects/src/object_schema_item.cc
@@ -44,20 +44,19 @@ const char app_id[] = "appID";
namespace ns_smart_device_link {
namespace ns_smart_objects {
-CObjectSchemaItem::SMember::SMember()
+SMember::SMember()
: mSchemaItem(CAlwaysFalseSchemaItem::create())
, mIsMandatory(true)
, mIsDeprecated(false)
, mIsRemoved(false) {}
-CObjectSchemaItem::SMember::SMember(
- const ISchemaItemPtr SchemaItem,
- const bool IsMandatory,
- const std::string& Since,
- const std::string& Until,
- const bool IsDeprecated,
- const bool IsRemoved,
- const std::vector<CObjectSchemaItem::SMember>& history_vector)
+SMember::SMember(const ISchemaItemPtr SchemaItem,
+ const bool IsMandatory,
+ const std::string& Since,
+ const std::string& Until,
+ const bool IsDeprecated,
+ const bool IsRemoved,
+ const std::vector<SMember>& history_vector)
: mSchemaItem(SchemaItem), mIsMandatory(IsMandatory) {
if (Since.size() > 0) {
utils::SemanticVersion since_struct(Since);
@@ -76,7 +75,7 @@ CObjectSchemaItem::SMember::SMember(
mHistoryVector = history_vector;
}
-bool CObjectSchemaItem::SMember::CheckHistoryFieldVersion(
+bool SMember::CheckHistoryFieldVersion(
const utils::SemanticVersion& MessageVersion) const {
if (MessageVersion.isValid()) {
if (mSince != boost::none) {
@@ -153,6 +152,7 @@ errors::eType CObjectSchemaItem::validate(
}
object_keys.erase(key_it);
}
+
return errors::OK;
}
@@ -169,10 +169,10 @@ void CObjectSchemaItem::applySchema(
}
SmartObject default_value;
- for (Members::const_iterator it = mMembers.begin(); it != mMembers.end();
- ++it) {
- const std::string& key = it->first;
- const SMember& member = it->second;
+
+ for (const auto& item : mMembers) {
+ const std::string& key = item.first;
+ const SMember& member = item.second;
if (!Object.keyExists(key)) {
if (member.mSchemaItem->setDefaultValue(default_value)) {
Object[key] = default_value;
@@ -201,7 +201,6 @@ void CObjectSchemaItem::unapplySchema(SmartObject& Object,
Object.erase(key);
}
}
-
for (Members::const_iterator it = mMembers.begin(); it != mMembers.end();
++it) {
const std::string& key = it->first;
@@ -232,6 +231,21 @@ size_t CObjectSchemaItem::GetMemberSize() {
return mMembers.size();
}
+boost::optional<SMember&> CObjectSchemaItem::GetMemberSchemaItem(
+ const std::string& member_key) {
+ auto it = mMembers.find(member_key);
+
+ if (it != mMembers.end()) {
+ return boost::optional<SMember&>(it->second);
+ }
+ return boost::optional<SMember&>();
+}
+
+void CObjectSchemaItem::AddMemberSchemaItem(const std::string& member_key,
+ SMember& member) {
+ mMembers[member_key] = member;
+}
+
CObjectSchemaItem::CObjectSchemaItem(const Members& members)
: mMembers(members) {}
@@ -260,7 +274,7 @@ void CObjectSchemaItem::RemoveFakeParams(
}
}
-const CObjectSchemaItem::SMember& CObjectSchemaItem::GetCorrectMember(
+const SMember& CObjectSchemaItem::GetCorrectMember(
const SMember& member, const utils::SemanticVersion& messageVersion) {
// Check if member is the correct version
if (member.CheckHistoryFieldVersion(messageVersion)) {
diff --git a/src/components/smart_objects/src/smart_schema.cc b/src/components/smart_objects/src/smart_schema.cc
index 4ab5e5ff23..6107d19266 100644
--- a/src/components/smart_objects/src/smart_schema.cc
+++ b/src/components/smart_objects/src/smart_schema.cc
@@ -53,6 +53,10 @@ void CSmartSchema::setSchemaItem(const ISchemaItemPtr schemaItem) {
mSchemaItem = schemaItem;
}
+ISchemaItemPtr CSmartSchema::getSchemaItem() {
+ return mSchemaItem;
+}
+
void CSmartSchema::applySchema(SmartObject& Object,
const bool remove_unknown_parameters,
const utils::SemanticVersion& MessageVersion) {
diff --git a/src/components/smart_objects/test/CObjectSchemaItem_test.cc b/src/components/smart_objects/test/CObjectSchemaItem_test.cc
index 51085040c5..8a7d09f31e 100644
--- a/src/components/smart_objects/test/CObjectSchemaItem_test.cc
+++ b/src/components/smart_objects/test/CObjectSchemaItem_test.cc
@@ -117,28 +117,27 @@ class ObjectSchemaItemTest : public ::testing::Test {
resultCode_values.insert(ResultType::GENERIC_ERROR);
resultCode_values.insert(ResultType::DISALLOWED);
- CObjectSchemaItem::Members paramsMembersMap;
- paramsMembersMap[S_FUNCTION_ID] = CObjectSchemaItem::SMember(
+ Members paramsMembersMap;
+ paramsMembersMap[S_FUNCTION_ID] = SMember(
TEnumSchemaItem<FunctionID::eType>::create(function_values), true);
paramsMembersMap[S_CORRELATION_ID] =
- CObjectSchemaItem::SMember(TNumberSchemaItem<int>::create(), true);
- paramsMembersMap[S_PROTOCOL_VERSION] = CObjectSchemaItem::SMember(
- TNumberSchemaItem<int>::create(TSchemaItemParameter<int>(1),
- TSchemaItemParameter<int>(2)),
- true);
-
- CObjectSchemaItem::Members schemaMembersMap;
- schemaMembersMap[Keys::RESULT_CODE] = CObjectSchemaItem::SMember(
+ SMember(TNumberSchemaItem<int>::create(), true);
+ paramsMembersMap[S_PROTOCOL_VERSION] =
+ SMember(TNumberSchemaItem<int>::create(TSchemaItemParameter<int>(1),
+ TSchemaItemParameter<int>(2)),
+ true);
+
+ Members schemaMembersMap;
+ schemaMembersMap[Keys::RESULT_CODE] = SMember(
TEnumSchemaItem<ResultType::eType>::create(resultCode_values), false);
- schemaMembersMap[Keys::INFO] = CObjectSchemaItem::SMember(
- CStringSchemaItem::create(TSchemaItemParameter<size_t>(0),
- TSchemaItemParameter<size_t>(10)),
- false);
- schemaMembersMap[Keys::SUCCESS] =
- CObjectSchemaItem::SMember(CBoolSchemaItem::create(), false);
+ schemaMembersMap[Keys::INFO] =
+ SMember(CStringSchemaItem::create(TSchemaItemParameter<size_t>(0),
+ TSchemaItemParameter<size_t>(10)),
+ false);
+ schemaMembersMap[Keys::SUCCESS] = SMember(CBoolSchemaItem::create(), false);
// Create fake param that has breaking history changes
- std::vector<CObjectSchemaItem::SMember> fake_param_history_vector;
+ std::vector<SMember> fake_param_history_vector;
std::shared_ptr<ISchemaItem> fake_param_SchemaItem =
CArraySchemaItem::create(
@@ -156,22 +155,21 @@ class ObjectSchemaItemTest : public ::testing::Test {
TSchemaItemParameter<size_t>(1),
TSchemaItemParameter<size_t>(100));
- fake_param_history_vector.push_back(CObjectSchemaItem::SMember(
+ fake_param_history_vector.push_back(SMember(
fake_param_history_v1_SchemaItem, true, "", "4.5.0", false, false));
- schemaMembersMap["fakeParam"] =
- CObjectSchemaItem::SMember(fake_param_SchemaItem,
- false,
- "4.5.0",
- "",
- false,
- false,
- fake_param_history_vector);
-
- CObjectSchemaItem::Members rootMembersMap;
- rootMembersMap[S_PARAMS] = CObjectSchemaItem::SMember(
- CObjectSchemaItem::create(paramsMembersMap), true);
- rootMembersMap[S_MSG_PARAMS] = CObjectSchemaItem::SMember(
- CObjectSchemaItem::create(schemaMembersMap), true);
+ schemaMembersMap["fakeParam"] = SMember(fake_param_SchemaItem,
+ false,
+ "4.5.0",
+ "",
+ false,
+ false,
+ fake_param_history_vector);
+
+ Members rootMembersMap;
+ rootMembersMap[S_PARAMS] =
+ SMember(CObjectSchemaItem::create(paramsMembersMap), true);
+ rootMembersMap[S_MSG_PARAMS] =
+ SMember(CObjectSchemaItem::create(schemaMembersMap), true);
schema_item = CObjectSchemaItem::create(rootMembersMap);
}
diff --git a/src/components/smart_objects/test/SmartObjectConvertionTime_test.cc b/src/components/smart_objects/test/SmartObjectConvertionTime_test.cc
index edcb09c604..555239c489 100644
--- a/src/components/smart_objects/test/SmartObjectConvertionTime_test.cc
+++ b/src/components/smart_objects/test/SmartObjectConvertionTime_test.cc
@@ -252,21 +252,20 @@ class SmartObjectConvertionTimeTest : public ::testing::Test {
TEnumSchemaItem<MessageTypeTest::eType>::create(
messageType_allowedEnumSubsetValues);
- CObjectSchemaItem::Members paramsMembersMap;
+ Members paramsMembersMap;
paramsMembersMap
[ns_smart_device_link::ns_json_handler::strings::S_FUNCTION_ID] =
- CObjectSchemaItem::SMember(functionId_SchemaItem, true);
+ SMember(functionId_SchemaItem, true);
paramsMembersMap
[ns_smart_device_link::ns_json_handler::strings::S_MESSAGE_TYPE] =
- CObjectSchemaItem::SMember(messageType_SchemaItem, true);
+ SMember(messageType_SchemaItem, true);
paramsMembersMap
[ns_smart_device_link::ns_json_handler::strings::S_CORRELATION_ID] =
- CObjectSchemaItem::SMember(TNumberSchemaItem<int>::create(), true);
+ SMember(TNumberSchemaItem<int>::create(), true);
- std::map<std::string, CObjectSchemaItem::SMember> rootMembersMap;
+ std::map<std::string, SMember> rootMembersMap;
rootMembersMap[ns_smart_device_link::ns_json_handler::strings::S_PARAMS] =
- CObjectSchemaItem::SMember(CObjectSchemaItem::create(paramsMembersMap),
- true);
+ SMember(CObjectSchemaItem::create(paramsMembersMap), true);
return CSmartSchema(CObjectSchemaItem::create(rootMembersMap));
}
@@ -318,51 +317,43 @@ class SmartObjectConvertionTimeTest : public ::testing::Test {
TSchemaItemParameter<int>(2000000000),
TSchemaItemParameter<int>());
- std::map<std::string, CObjectSchemaItem::SMember> schemaMembersMap;
+ std::map<std::string, SMember> schemaMembersMap;
- schemaMembersMap["success"] =
- CObjectSchemaItem::SMember(success_SchemaItem, true);
- schemaMembersMap["resultCode"] =
- CObjectSchemaItem::SMember(resultCode_SchemaItem, true);
- schemaMembersMap["info"] =
- CObjectSchemaItem::SMember(info_SchemaItem, false);
- schemaMembersMap["tryAgainTime"] =
- CObjectSchemaItem::SMember(tryAgainTime_SchemaItem, true);
+ schemaMembersMap["success"] = SMember(success_SchemaItem, true);
+ schemaMembersMap["resultCode"] = SMember(resultCode_SchemaItem, true);
+ schemaMembersMap["info"] = SMember(info_SchemaItem, false);
+ schemaMembersMap["tryAgainTime"] = SMember(tryAgainTime_SchemaItem, true);
- std::map<std::string, CObjectSchemaItem::SMember> paramsMembersMap;
+ std::map<std::string, SMember> paramsMembersMap;
paramsMembersMap
[ns_smart_device_link::ns_json_handler::strings::S_FUNCTION_ID] =
- CObjectSchemaItem::SMember(
- TEnumSchemaItem<FunctionIdTest::eType>::create(
- functionId_allowedEnumSubsetValues),
- true);
+ SMember(TEnumSchemaItem<FunctionIdTest::eType>::create(
+ functionId_allowedEnumSubsetValues),
+ true);
paramsMembersMap
[ns_smart_device_link::ns_json_handler::strings::S_MESSAGE_TYPE] =
- CObjectSchemaItem::SMember(
- TEnumSchemaItem<MessageTypeTest::eType>::create(
- messageType_allowedEnumSubsetValues),
- true);
+ SMember(TEnumSchemaItem<MessageTypeTest::eType>::create(
+ messageType_allowedEnumSubsetValues),
+ true);
paramsMembersMap
[ns_smart_device_link::ns_json_handler::strings::S_CORRELATION_ID] =
- CObjectSchemaItem::SMember(TNumberSchemaItem<int>::create(), true);
+ SMember(TNumberSchemaItem<int>::create(), true);
paramsMembersMap
[ns_smart_device_link::ns_json_handler::strings::S_PROTOCOL_VERSION] =
- CObjectSchemaItem::SMember(
+ SMember(
TNumberSchemaItem<int>::create(TSchemaItemParameter<int>(1),
TSchemaItemParameter<int>(2)),
true);
paramsMembersMap
[ns_smart_device_link::ns_json_handler::strings::S_PROTOCOL_TYPE] =
- CObjectSchemaItem::SMember(TNumberSchemaItem<int>::create(), true);
+ SMember(TNumberSchemaItem<int>::create(), true);
- std::map<std::string, CObjectSchemaItem::SMember> rootMembersMap;
+ std::map<std::string, SMember> rootMembersMap;
rootMembersMap
[ns_smart_device_link::ns_json_handler::strings::S_MSG_PARAMS] =
- CObjectSchemaItem::SMember(
- CObjectSchemaItem::create(schemaMembersMap), true);
+ SMember(CObjectSchemaItem::create(schemaMembersMap), true);
rootMembersMap[ns_smart_device_link::ns_json_handler::strings::S_PARAMS] =
- CObjectSchemaItem::SMember(CObjectSchemaItem::create(paramsMembersMap),
- true);
+ SMember(CObjectSchemaItem::create(paramsMembersMap), true);
return CSmartSchema(CObjectSchemaItem::create(rootMembersMap));
}
};