Merge "Error handling added for basyx::object::object_map_t"
diff --git a/sdks/c++/basys.sdk.cc/include/BaSyx/submodel/api_v2/common/ILangStringSet.h b/sdks/c++/basys.sdk.cc/include/BaSyx/submodel/api_v2/common/ILangStringSet.h
index cbf47e6..b68fac7 100644
--- a/sdks/c++/basys.sdk.cc/include/BaSyx/submodel/api_v2/common/ILangStringSet.h
+++ b/sdks/c++/basys.sdk.cc/include/BaSyx/submodel/api_v2/common/ILangStringSet.h
@@ -26,6 +26,8 @@
inline ILangStringSet::~ILangStringSet() = default;
+bool operator==(const api::ILangStringSet & left, const api::ILangStringSet & right);
+
}
}
}
diff --git a/sdks/c++/basys.sdk.cc/include/BaSyx/submodel/api_v2/dataspecification/IDataSpecification.h b/sdks/c++/basys.sdk.cc/include/BaSyx/submodel/api_v2/dataspecification/IDataSpecification.h
index 61bf48d..c84c7c3 100644
--- a/sdks/c++/basys.sdk.cc/include/BaSyx/submodel/api_v2/dataspecification/IDataSpecification.h
+++ b/sdks/c++/basys.sdk.cc/include/BaSyx/submodel/api_v2/dataspecification/IDataSpecification.h
@@ -10,6 +10,11 @@
namespace submodel {
namespace api {
+
+/**
+ * Mandatory members:
+ * DataSpecificationContent
+ */
class IDataSpecification : public virtual IIdentifiable
{
public:
diff --git a/sdks/c++/basys.sdk.cc/include/BaSyx/submodel/api_v2/dataspecification/IDataSpecificationIEC61360.h b/sdks/c++/basys.sdk.cc/include/BaSyx/submodel/api_v2/dataspecification/IDataSpecificationIEC61360.h
index 118d074..a7fbed1 100644
--- a/sdks/c++/basys.sdk.cc/include/BaSyx/submodel/api_v2/dataspecification/IDataSpecificationIEC61360.h
+++ b/sdks/c++/basys.sdk.cc/include/BaSyx/submodel/api_v2/dataspecification/IDataSpecificationIEC61360.h
@@ -26,9 +26,14 @@
virtual std::string * const getUnit() = 0;
virtual IReference * const getUnitId() = 0;
virtual std::string * const getSourceOfDefinition() = 0;
+ virtual std::string * const getSymbol() = 0;
virtual DataTypeIEC61360 getDataType() const = 0;
virtual std::string * const getValueFormat() = 0;
- virtual IReference * const getValueId() = 0;
+/* TODO
+ virtual MISSINGTYPE const getValueList() = 0;
+ virtual MISSINGTYPE const getValueDataType() = 0;
+ */
+ virtual IReference * const getValueId() = 0;
virtual LevelType getLevelType() const = 0;
virtual void setUnit(const std::string & unit) = 0;
diff --git a/sdks/c++/basys.sdk.cc/include/BaSyx/submodel/api_v2/qualifier/IReferable.h b/sdks/c++/basys.sdk.cc/include/BaSyx/submodel/api_v2/qualifier/IReferable.h
index a2de91a..41b9f3b 100644
--- a/sdks/c++/basys.sdk.cc/include/BaSyx/submodel/api_v2/qualifier/IReferable.h
+++ b/sdks/c++/basys.sdk.cc/include/BaSyx/submodel/api_v2/qualifier/IReferable.h
@@ -11,6 +11,11 @@
namespace submodel {
namespace api {
+/**
+ * Mandatory members:
+ * idShort
+ *
+ */
class IReferable
{
public:
diff --git a/sdks/c++/basys.sdk.cc/include/BaSyx/submodel/map_v2/common/LangStringSet.h b/sdks/c++/basys.sdk.cc/include/BaSyx/submodel/map_v2/common/LangStringSet.h
index 7f81841..ce3b07b 100644
--- a/sdks/c++/basys.sdk.cc/include/BaSyx/submodel/map_v2/common/LangStringSet.h
+++ b/sdks/c++/basys.sdk.cc/include/BaSyx/submodel/map_v2/common/LangStringSet.h
@@ -30,12 +30,15 @@
using vab::ElementMap::ElementMap;
LangStringSet();
+ LangStringSet(const ILangStringSet & other);
virtual langCodeSet_t getLanguageCodes() const override;
virtual const std::string & get(const std::string & languageCode) const override;
virtual void add(const std::string & languageCode, const std::string & langString) override;
virtual bool empty() const noexcept override;
+
+ friend bool api::operator==(const api::ILangStringSet & left, const api::ILangStringSet & right);
};
}
diff --git a/sdks/c++/basys.sdk.cc/include/BaSyx/submodel/map_v2/dataspecification/DataSpecification.h b/sdks/c++/basys.sdk.cc/include/BaSyx/submodel/map_v2/dataspecification/DataSpecification.h
new file mode 100644
index 0000000..60d32ca
--- /dev/null
+++ b/sdks/c++/basys.sdk.cc/include/BaSyx/submodel/map_v2/dataspecification/DataSpecification.h
@@ -0,0 +1,34 @@
+#ifndef BASYX_MAP_V2_SDK_DATASPECIFICATION
+#define BASYX_MAP_V2_SDK_DATASPECIFICATION
+
+#include <BaSyx/submodel/api_v2/dataspecification/IDataSpecification.h>
+#include <BaSyx/submodel/map_v2/qualifier/Identifiable.h>
+#include <BaSyx/submodel/map_v2/dataspecification/DataSpecificationContent.h>
+#include <BaSyx/submodel/simple/dataspecification/DataSpecification.h>
+
+#include <BaSyx/vab/ElementMap.h>
+
+namespace basyx {
+namespace submodel {
+namespace map {
+
+class DataSpecification :
+ public api::IDataSpecification,
+ public virtual Identifiable,
+ public virtual vab::ElementMap
+{
+private:
+ DataSpecificationContent * content;
+
+public:
+ DataSpecification(const std::string & idShort, const simple::Identifier & identifier, std::unique_ptr<api::IDataSpecificationContent> content);
+
+ api::IDataSpecificationContent & getContent() override;
+
+ void setContent(std::unique_ptr<api::IDataSpecificationContent> content);
+};
+
+}
+}
+}
+#endif //BASYX_MAP_V2_SDK_DATASPECIFICATION_H
diff --git a/sdks/c++/basys.sdk.cc/include/BaSyx/submodel/map_v2/dataspecification/DataSpecificationContent.h b/sdks/c++/basys.sdk.cc/include/BaSyx/submodel/map_v2/dataspecification/DataSpecificationContent.h
new file mode 100644
index 0000000..cd64864
--- /dev/null
+++ b/sdks/c++/basys.sdk.cc/include/BaSyx/submodel/map_v2/dataspecification/DataSpecificationContent.h
@@ -0,0 +1,20 @@
+#ifndef BASYX_MAP_V2_SDK_DATASPECIFICATIONCONTENT_H
+#define BASYX_MAP_V2_SDK_DATASPECIFICATIONCONTENT_H
+
+#include <BaSyx/submodel/api_v2/dataspecification/IDataSpecificationContent.h>
+
+#include <BaSyx/vab/ElementMap.h>
+
+namespace basyx {
+namespace submodel {
+namespace map {
+
+class DataSpecificationContent
+ : public api::IDataSpecificationContent
+ , public virtual vab::ElementMap
+{};
+
+}
+}
+}
+#endif //BASYX_MAP_V2_SDK_DATASPECIFICATIONCONTENT_H
diff --git a/sdks/c++/basys.sdk.cc/include/BaSyx/submodel/map_v2/dataspecification/DataSpecificationIEC61360.h b/sdks/c++/basys.sdk.cc/include/BaSyx/submodel/map_v2/dataspecification/DataSpecificationIEC61360.h
new file mode 100644
index 0000000..8143509
--- /dev/null
+++ b/sdks/c++/basys.sdk.cc/include/BaSyx/submodel/map_v2/dataspecification/DataSpecificationIEC61360.h
@@ -0,0 +1,81 @@
+#ifndef BASYX_MAP_V2_SDK_DATASPECIFICATIONIEC61360_H
+#define BASYX_MAP_V2_SDK_DATASPECIFICATIONIEC61360_H
+
+#include <BaSyx/submodel/api_v2/dataspecification/IDataSpecificationIEC61360.h>
+
+#include <BaSyx/submodel/map_v2/common/LangStringSet.h>
+#include <BaSyx/submodel/map_v2/reference/Reference.h>
+#include <BaSyx/submodel/map_v2/dataspecification/DataSpecificationContent.h>
+#include <BaSyx/vab/ElementMap.h>
+
+namespace basyx {
+namespace submodel {
+namespace map {
+class DataSpecificationIEC61360
+ : public api::IDataSpecificationIEC61360
+ , public virtual DataSpecificationContent
+ , public virtual vab::ElementMap
+{
+public:
+ struct Path
+ {
+ static constexpr char PreferredName[] = "preferredName";
+ static constexpr char ShortName[] = "shortName";
+ static constexpr char Unit[] = "unit";
+ static constexpr char UnitId[] = "unitId";
+ static constexpr char SourceOfDefinition[] = "sourceOfDefinition";
+ static constexpr char Symbol[] = "symbol";
+ static constexpr char DataType[] = "dataType";
+ static constexpr char Definition[] = "definition";
+ static constexpr char ValueFormat[] = "valueFormat";
+ static constexpr char ValueList[] = "valueList";
+ static constexpr char ValueId[] = "valueId";
+ static constexpr char LevelType[] = "levelType";
+ };
+
+ DataSpecificationIEC61360() = delete;
+ DataSpecificationIEC61360(map::LangStringSet & preferred_name);
+
+ api::ILangStringSet & PreferredName() override;
+ api::ILangStringSet & ShortName() override;
+ api::ILangStringSet & Definition() override;
+
+ std::string * const getUnit() override;
+ api::IReference * const getUnitId() override;
+ std::string * const getSourceOfDefinition() override;
+ std::string * const getSymbol() override;
+ DataTypeIEC61360 getDataType() const override;
+ std::string * const getValueFormat() override;
+ /* TODO
+ MISSINGTYPE const getValueList() override;
+ MISSINGTYPE const getValueDataType() override;
+ */
+ api::IReference * const getValueId() override;
+ LevelType getLevelType() const override;
+
+
+ void setPreferredName(const api::ILangStringSet & preferredName);
+ void setShortName(const api::ILangStringSet & shortName);
+ void setDefinition(const api::ILangStringSet & definition);
+ void setUnit(const std::string & unit) override;
+ void setUnitId(std::unique_ptr<api::IReference> unitId);
+ void setSourceOfDefinition(const std::string & sourceOfDefinition) override;
+ void setSymbol(const std::string & symbol);
+ void setDataType(DataTypeIEC61360 dataType) override;
+ void setValueFormat(const std::string & valueFormat) override;
+ /* TODO
+ void setValueList(const MISSINGTYPE);
+ void setValueDataType(const MISSINGTYPE);
+ */
+ void setValueId(std::unique_ptr<api::IReference> valueId);
+ void setLevelType(LevelType levelType) override;
+
+private:
+ map::LangStringSet preferred_name, short_name, definition;
+ std::unique_ptr<api::IReference> unitId, valueId;
+};
+
+}
+}
+}
+#endif //BASYX_MAP_V2_SDK_DATASPECIFICATIONIEC61360_H
diff --git a/sdks/c++/basys.sdk.cc/include/BaSyx/submodel/simple/common/LangStringSet.h b/sdks/c++/basys.sdk.cc/include/BaSyx/submodel/simple/common/LangStringSet.h
index fa606e8..4003031 100644
--- a/sdks/c++/basys.sdk.cc/include/BaSyx/submodel/simple/common/LangStringSet.h
+++ b/sdks/c++/basys.sdk.cc/include/BaSyx/submodel/simple/common/LangStringSet.h
@@ -29,6 +29,8 @@
const std::string & get(const std::string & languageCode) const override;
void add(const std::string & languageCode, const std::string & langString) override;
bool empty() const noexcept override;
+
+ friend bool api::operator==(const api::ILangStringSet & left, const api::ILangStringSet & right);
};
}
diff --git a/sdks/c++/basys.sdk.cc/include/BaSyx/submodel/simple/identifier/Identifier.h b/sdks/c++/basys.sdk.cc/include/BaSyx/submodel/simple/identifier/Identifier.h
index d342902..bd8fc78 100644
--- a/sdks/c++/basys.sdk.cc/include/BaSyx/submodel/simple/identifier/Identifier.h
+++ b/sdks/c++/basys.sdk.cc/include/BaSyx/submodel/simple/identifier/Identifier.h
@@ -12,7 +12,7 @@
class Identifier
{
public:
- Identifier() = default;
+ Identifier();
Identifier(IdentifierType idType, const std::string & id);
~Identifier() = default;
private:
@@ -25,6 +25,9 @@
public:
IdentifierType getIdType() const;
const std::string & getId() const;
+
+
+ friend bool operator==(const Identifier & left, const Identifier & right);
};
}
diff --git a/sdks/c++/basys.sdk.cc/src/submodel/CMakeLists.txt b/sdks/c++/basys.sdk.cc/src/submodel/CMakeLists.txt
index eeef50e..091d19b 100644
--- a/sdks/c++/basys.sdk.cc/src/submodel/CMakeLists.txt
+++ b/sdks/c++/basys.sdk.cc/src/submodel/CMakeLists.txt
@@ -47,6 +47,8 @@
${CMAKE_CURRENT_SOURCE_DIR}/submodel/map_v2/submodelelement/SubmodelElement.cpp
${CMAKE_CURRENT_SOURCE_DIR}/submodel/map_v2/submodelelement/SubmodelElementFactory.cpp
${CMAKE_CURRENT_SOURCE_DIR}/submodel/map_v2/submodelelement/SubmodelElementCollection.cpp
+ ${CMAKE_CURRENT_SOURCE_DIR}/submodel/map_v2/dataspecification/DataSpecification.cpp
+ ${CMAKE_CURRENT_SOURCE_DIR}/submodel/map_v2/dataspecification/DataSpecificationIEC61360.cpp
${CMAKE_CURRENT_SOURCE_DIR}/submodel/simple/aas/AssetAdministrationShell.cpp
${CMAKE_CURRENT_SOURCE_DIR}/submodel/simple/aas/Asset.cpp
@@ -146,7 +148,6 @@
${BASYX_SUBMODEL_INCLUDE_DIR}/map_v2/submodelelement/SubmodelElementFactory.h
${BASYX_SUBMODEL_INCLUDE_DIR}/map_v2/submodelelement/SubmodelElement.h
${BASYX_SUBMODEL_INCLUDE_DIR}/map_v2/SubModel.h
-
${BASYX_SUBMODEL_INCLUDE_DIR}/simple/aas/AssetAdministrationShell.h
${BASYX_SUBMODEL_INCLUDE_DIR}/simple/aas/Asset.h
${BASYX_SUBMODEL_INCLUDE_DIR}/simple/common/ElementContainer.h
diff --git a/sdks/c++/basys.sdk.cc/src/submodel/submodel/map_v2/common/LangStringSet.cpp b/sdks/c++/basys.sdk.cc/src/submodel/submodel/map_v2/common/LangStringSet.cpp
index 11dd27f..c43bc89 100644
--- a/sdks/c++/basys.sdk.cc/src/submodel/submodel/map_v2/common/LangStringSet.cpp
+++ b/sdks/c++/basys.sdk.cc/src/submodel/submodel/map_v2/common/LangStringSet.cpp
@@ -1,6 +1,10 @@
+#include <algorithm>
+
#include <BaSyx/submodel/map_v2/common/LangStringSet.h>
-using namespace basyx::submodel::map;
+namespace basyx {
+namespace submodel {
+namespace map {
constexpr char LangStringSet::Path::Text[];
constexpr char LangStringSet::Path::Language[];
@@ -8,40 +12,71 @@
std::string empty_string;
LangStringSet::LangStringSet()
- : vab::ElementMap(basyx::object::make_object_list())
+ : vab::ElementMap(basyx::object::make_object_list())
+{};
+
+LangStringSet::LangStringSet(const ILangStringSet & other)
+ : vab::ElementMap(basyx::object::make_object_list())
{
-};
+ auto langCodes = other.getLanguageCodes();
+ for (auto langCode : langCodes)
+ this->add(langCode, other.get(langCode));
+}
LangStringSet::langCodeSet_t LangStringSet::getLanguageCodes() const
{
- return LangStringSet::langCodeSet_t();
-};
+ auto &langStrings = this->map.Get<basyx::object::object_list_t &>();
+ std::vector<std::string> langCodes;
+ std::transform(langStrings.begin(), langStrings.end(), std::back_inserter(langCodes),
+ [](basyx::object langSet) { return langSet.getProperty(Path::Language).GetStringContent(); });
+ return LangStringSet::langCodeSet_t(langCodes.begin(), langCodes.end());
+}
-const std::string & LangStringSet::get(const std::string & languageCode) const
+const std::string &LangStringSet::get(const std::string &languageCode) const
{
- auto & langStrings = this->map.Get<basyx::object::object_list_t&>();
- auto langString = std::find_if(
- langStrings.begin(), langStrings.end(),
- [&languageCode](basyx::object & obj) {
- const auto & langCode = obj.getProperty(Path::Language).Get<std::string&>();
- return langCode == languageCode;
- });
+ auto &langStrings = this->map.Get<basyx::object::object_list_t &>();
+ auto langString = std::find_if(
+ langStrings.begin(), langStrings.end(),
+ [&languageCode](basyx::object &obj) {
+ const auto &langCode = obj.getProperty(Path::Language).Get<std::string &>();
+ return langCode == languageCode;
+ });
- if (langString != langStrings.end())
- return langString->getProperty(Path::Text).Get<std::string&>();
+ if (langString != langStrings.end())
+ return langString->getProperty(Path::Text).Get<std::string &>();
- return empty_string;
-};
+ return empty_string;
+}
-void LangStringSet::add(const std::string & languageCode, const std::string & langString)
+void LangStringSet::add(const std::string &languageCode, const std::string &langString)
{
- auto langStringMap = basyx::object::make_map();
- langStringMap.insertKey(Path::Text, langString);
- langStringMap.insertKey(Path::Language, languageCode);
- this->map.insert(langStringMap);
+ auto langStringMap = basyx::object::make_map();
+ langStringMap.insertKey(Path::Text, langString);
+ langStringMap.insertKey(Path::Language, languageCode);
+ this->map.insert(langStringMap);
};
bool LangStringSet::empty() const noexcept
{
- return this->map.empty();
-};
\ No newline at end of file
+ return this->map.empty();
+};
+}
+
+namespace api {
+bool operator==(const basyx::submodel::api::ILangStringSet &left, const basyx::submodel::api::ILangStringSet &right)
+{
+ auto langCodes = left.getLanguageCodes();
+ if (langCodes.size() != right.getLanguageCodes().size())
+ return false;
+ for (auto langCode : langCodes)
+ {
+ auto leftString = left.get(langCode);
+ if (leftString.compare(right.get(langCode)) != 0)
+ return false;
+ }
+ return true;
+}
+
+}
+}
+}
\ No newline at end of file
diff --git a/sdks/c++/basys.sdk.cc/src/submodel/submodel/map_v2/dataspecification/DataSpecification.cpp b/sdks/c++/basys.sdk.cc/src/submodel/submodel/map_v2/dataspecification/DataSpecification.cpp
new file mode 100644
index 0000000..fcfe30d
--- /dev/null
+++ b/sdks/c++/basys.sdk.cc/src/submodel/submodel/map_v2/dataspecification/DataSpecification.cpp
@@ -0,0 +1,39 @@
+#include <BaSyx/submodel/map_v2/dataspecification/DataSpecification.h>
+#include <BaSyx/vab/ElementMap.h>
+
+namespace basyx {
+namespace submodel {
+namespace map{
+
+using namespace basyx::submodel::api;
+
+DataSpecification::DataSpecification(const std::string & idShort, const simple::Identifier & identifier, std::unique_ptr<api::IDataSpecificationContent> content)
+ : Identifiable(idShort, identifier)
+ , vab::ElementMap()
+{
+ this->setContent(std::move(content));
+}
+
+void DataSpecification::setContent(std::unique_ptr<api::IDataSpecificationContent> content)
+{
+ DataSpecificationContent* dataSpecificationContent;
+ if (content == nullptr)
+ dataSpecificationContent = new DataSpecificationContent();
+ else
+ {
+ dataSpecificationContent = dynamic_cast<DataSpecificationContent*>(content.release());
+ if (!dataSpecificationContent)
+ std::__throw_bad_cast();
+ }
+ this->content = dataSpecificationContent;
+ this->map.insertKey("dataSpecificationContent", dataSpecificationContent->getMap());
+}
+
+api::IDataSpecificationContent& DataSpecification::getContent()
+{
+ return *this->content;
+}
+
+}
+}
+}
diff --git a/sdks/c++/basys.sdk.cc/src/submodel/submodel/map_v2/dataspecification/DataSpecificationContent.cpp b/sdks/c++/basys.sdk.cc/src/submodel/submodel/map_v2/dataspecification/DataSpecificationContent.cpp
new file mode 100644
index 0000000..13cf75b
--- /dev/null
+++ b/sdks/c++/basys.sdk.cc/src/submodel/submodel/map_v2/dataspecification/DataSpecificationContent.cpp
@@ -0,0 +1,16 @@
+#include <BaSyx/submodel/map_v2/ /DataSpecificationContent.h>
+
+
+namespace basyx {
+namespace submodel {
+namespace map {
+
+using namespace basyx::submodel::api;
+
+DataSpecificationContent::DataSpecificationContent()
+ : vab::ElementMap()
+{}
+
+}
+}
+}
diff --git a/sdks/c++/basys.sdk.cc/src/submodel/submodel/map_v2/dataspecification/DataSpecificationIEC61360.cpp b/sdks/c++/basys.sdk.cc/src/submodel/submodel/map_v2/dataspecification/DataSpecificationIEC61360.cpp
new file mode 100644
index 0000000..6408d06
--- /dev/null
+++ b/sdks/c++/basys.sdk.cc/src/submodel/submodel/map_v2/dataspecification/DataSpecificationIEC61360.cpp
@@ -0,0 +1,170 @@
+#include <BaSyx/submodel/map_v2/dataspecification/DataSpecificationIEC61360.h>
+
+
+namespace basyx {
+namespace submodel {
+namespace map {
+using namespace basyx::submodel::api;
+
+constexpr char DataSpecificationIEC61360::Path::PreferredName[];
+constexpr char DataSpecificationIEC61360::Path::ShortName[];
+constexpr char DataSpecificationIEC61360::Path::Unit[];
+constexpr char DataSpecificationIEC61360::Path::UnitId[];
+constexpr char DataSpecificationIEC61360::Path::SourceOfDefinition[];
+constexpr char DataSpecificationIEC61360::Path::Symbol[];
+constexpr char DataSpecificationIEC61360::Path::DataType[];
+constexpr char DataSpecificationIEC61360::Path::Definition[];
+constexpr char DataSpecificationIEC61360::Path::ValueFormat[];
+constexpr char DataSpecificationIEC61360::Path::ValueList[];
+constexpr char DataSpecificationIEC61360::Path::ValueId[];
+constexpr char DataSpecificationIEC61360::Path::LevelType[];
+
+DataSpecificationIEC61360::DataSpecificationIEC61360(map::LangStringSet & preferred_name)
+ : vab::ElementMap{}
+ , preferred_name(preferred_name)
+{
+ this->map.insertKey(Path::PreferredName, this->preferred_name.getMap());
+}
+
+api::ILangStringSet & DataSpecificationIEC61360::PreferredName()
+{
+ return this->preferred_name;
+}
+
+api::ILangStringSet & DataSpecificationIEC61360::ShortName()
+{
+ return this->short_name;
+}
+
+api::ILangStringSet & DataSpecificationIEC61360::Definition()
+{
+ return this->definition;
+}
+
+std::string * const DataSpecificationIEC61360::getUnit()
+{
+ auto unit = this->map.getProperty(Path::Unit);
+ if (unit.IsNull())
+ return nullptr;
+
+ return &unit.Get<std::string&>();
+}
+
+api::IReference * const DataSpecificationIEC61360::getUnitId()
+{
+ return this->unitId.get();
+}
+
+std::string * const DataSpecificationIEC61360::getSourceOfDefinition()
+{
+ auto source_of_definition = this->map.getProperty(Path::SourceOfDefinition);
+ if (source_of_definition.IsNull())
+ return nullptr;
+
+ return &source_of_definition.Get<std::string&>();
+}
+
+std::string *const DataSpecificationIEC61360::getSymbol()
+{
+ auto symbol = this->map.getProperty(Path::Symbol);
+ if (symbol.IsNull())
+ return nullptr;
+
+ return &symbol.Get<std::string&>();
+}
+
+DataTypeIEC61360 DataSpecificationIEC61360::getDataType() const
+{}
+
+std::string * const DataSpecificationIEC61360::getValueFormat()
+{
+ auto value_format = this->map.getProperty(Path::ValueFormat);
+ if (value_format.IsNull())
+ return nullptr;
+
+ return &value_format.Get<std::string&>();
+}
+
+api::IReference * const DataSpecificationIEC61360::getValueId()
+{
+ return this->valueId.get();
+}
+
+LevelType DataSpecificationIEC61360::getLevelType() const
+{
+ throw std::logic_error{"Function not yet implemented."};
+ //return from_string(this->map.getProperty(Path::LevelType));
+}
+
+void DataSpecificationIEC61360::setPreferredName(const api::ILangStringSet & preferredName)
+{
+ this->preferred_name = LangStringSet(preferredName);
+}
+
+void DataSpecificationIEC61360::setShortName(const api::ILangStringSet &shortName)
+{
+ this->short_name = LangStringSet(shortName);
+}
+
+void DataSpecificationIEC61360::setDefinition(const api::ILangStringSet &definition)
+{
+ this->definition = LangStringSet(definition);
+}
+
+void DataSpecificationIEC61360::setUnit(const std::string & unit)
+{
+ this->map.insertKey(Path::Unit, unit);
+}
+
+void DataSpecificationIEC61360::setSourceOfDefinition(const std::string & sourceOfDefinition)
+{
+ this->map.insertKey(Path::SourceOfDefinition, sourceOfDefinition);
+}
+
+void DataSpecificationIEC61360::setDataType(DataTypeIEC61360 dataType)
+{
+ throw std::logic_error{"Function not yet implemented."};
+ //this->map.insertKey(Path::DataType, to_string(dataType));
+}
+
+void DataSpecificationIEC61360::setValueFormat(const std::string & valueFormat)
+{
+ this->map.insertKey(Path::ValueFormat, valueFormat);
+}
+
+void DataSpecificationIEC61360::setUnitId(std::unique_ptr<api::IReference> unit_id)
+{
+ //Assume that map version of DataSpecification only uses map version of Reference
+ this->unitId.reset(unit_id.release());
+ auto unit_id_ptr = dynamic_cast<map::Reference*>(this->unitId.get());
+ if (!unit_id_ptr)
+ std::__throw_bad_cast();
+
+ this->map.insertKey(Path::UnitId, unit_id_ptr->getMap());
+}
+
+void DataSpecificationIEC61360::setSymbol(const std::string &symbol)
+{
+ this->map.insertKey(Path::Symbol, symbol);
+}
+
+void DataSpecificationIEC61360::setValueId(std::unique_ptr<api::IReference> valueId)
+{
+ //Assume that map version of DataSpecification only uses map version of Reference
+ this->valueId = std::move(valueId);
+ auto value_id_ptr = dynamic_cast<map::Reference*>(this->valueId.get());
+ if (!value_id_ptr)
+ std::__throw_bad_cast();
+
+ this->map.insertKey(Path::ValueId, value_id_ptr->getMap());
+}
+
+void DataSpecificationIEC61360::setLevelType(LevelType levelType)
+{
+ throw std::logic_error{"Function not yet implemented."};
+ //this->map.insertKey(Path::LevelType, to_string(levelType));
+}
+
+}
+}
+}
diff --git a/sdks/c++/basys.sdk.cc/src/submodel/submodel/simple/common/LangStringSet.cpp b/sdks/c++/basys.sdk.cc/src/submodel/submodel/simple/common/LangStringSet.cpp
index 53a857e..6e4fe02 100644
--- a/sdks/c++/basys.sdk.cc/src/submodel/submodel/simple/common/LangStringSet.cpp
+++ b/sdks/c++/basys.sdk.cc/src/submodel/submodel/simple/common/LangStringSet.cpp
@@ -1,5 +1,7 @@
#include <BaSyx/submodel/simple/common/LangStringSet.h>
+#include <BaSyx/shared/types.h>
+
namespace basyx {
namespace submodel {
namespace simple {
@@ -17,7 +19,10 @@
LangStringSet::langCodeSet_t LangStringSet::getLanguageCodes() const
{
- return langCodeSet_t();
+ std::vector<std::string> langCodes;
+ for (auto langCode : this->langStrings)
+ langCodes.push_back(langCode.first);
+ return LangStringSet::langCodeSet_t(langCodes.begin(), langCodes.end());
};
diff --git a/sdks/c++/basys.sdk.cc/src/submodel/submodel/simple/identifier/Identifier.cpp b/sdks/c++/basys.sdk.cc/src/submodel/submodel/simple/identifier/Identifier.cpp
index 1398703..398348f 100644
--- a/sdks/c++/basys.sdk.cc/src/submodel/submodel/simple/identifier/Identifier.cpp
+++ b/sdks/c++/basys.sdk.cc/src/submodel/submodel/simple/identifier/Identifier.cpp
@@ -1,36 +1,54 @@
#include <BaSyx/submodel/simple/identifier/Identifier.h>
#include <BaSyx/submodel/api_v2/identifier/IdentifierType.h>
-using namespace basyx::submodel;
-using namespace basyx::submodel::simple;
+namespace basyx {
+namespace submodel {
+namespace simple {
-Identifier::Identifier(IdentifierType idType, const std::string & id)
- : idType(idType)
- , id(id)
+Identifier::Identifier()
+ : idType(IdentifierType::Unknown)
+{}
+
+Identifier::Identifier(IdentifierType idType, const std::string &id)
+ : idType(idType)
+ , id(id)
{
};
-Identifier Identifier::Custom(const std::string & id)
+Identifier Identifier::Custom(const std::string &id)
{
- return Identifier(IdentifierType::Custom, id);
+ return Identifier(IdentifierType::Custom, id);
};
-Identifier Identifier::URI(const std::string & uri)
+Identifier Identifier::URI(const std::string &uri)
{
- return Identifier(IdentifierType::URI, uri);
+ return Identifier(IdentifierType::URI, uri);
};
-Identifier Identifier::IRDI(const std::string & irdi)
+Identifier Identifier::IRDI(const std::string &irdi)
{
- return Identifier(IdentifierType::IRDI, irdi);
+ return Identifier(IdentifierType::IRDI, irdi);
};
IdentifierType Identifier::getIdType() const
{
- return this->idType;
+ return this->idType;
};
-const std::string & Identifier::getId() const
+const std::string &Identifier::getId() const
{
- return this->id;
-};
\ No newline at end of file
+ return this->id;
+};
+
+bool operator==(const Identifier &left, const Identifier &right)
+{
+ if (left.getIdType() == right.getIdType())
+ {
+ return left.getId().compare(right.getId()) == 0;
+ }
+ return false;
+}
+
+}
+}
+}
\ No newline at end of file
diff --git a/sdks/c++/basys.sdk.cc/tests/regression/submodel/CMakeLists.txt b/sdks/c++/basys.sdk.cc/tests/regression/submodel/CMakeLists.txt
index 6fdda7c..4637453 100644
--- a/sdks/c++/basys.sdk.cc/tests/regression/submodel/CMakeLists.txt
+++ b/sdks/c++/basys.sdk.cc/tests/regression/submodel/CMakeLists.txt
@@ -18,7 +18,10 @@
api/qualifier/test_Referable.cpp
api/reference/test_Reference.cpp
map/common/test_ElementContainer.cpp
- map/submodelelement/test_LangStringSet.cpp
+ api/common/test_LangStringSet.cpp
+ map_v2/dataspecification/test_DataSpecification.cpp
+ map_v2/dataspecification/test_DataSpecificationIEC61360.cpp
+ map_v2/identifier/test_Identifier.cpp
)
target_include_directories(${PROJECT_NAME} PUBLIC ${PROJECT_SOURCE_DIR})
diff --git a/sdks/c++/basys.sdk.cc/tests/regression/submodel/api/common/test_LangStringSet.cpp b/sdks/c++/basys.sdk.cc/tests/regression/submodel/api/common/test_LangStringSet.cpp
new file mode 100644
index 0000000..5354444
--- /dev/null
+++ b/sdks/c++/basys.sdk.cc/tests/regression/submodel/api/common/test_LangStringSet.cpp
@@ -0,0 +1,101 @@
+#include <gtest/gtest.h>
+
+#include <BaSyx/submodel/api_v2/common/ILangStringSet.h>
+#include <BaSyx/submodel/map_v2/common/LangStringSet.h>
+#include <BaSyx/submodel/simple/common/LangStringSet.h>
+
+#include <BaSyx/util/util.h>
+
+using namespace basyx::submodel;
+
+using ImplTypes = ::testing::Types<map::LangStringSet, simple::LangStringSet>;
+
+template<class Impl>
+class LangStringTest :public ::testing::Test {
+protected:
+ using impl_t = Impl;
+
+ std::unique_ptr<api::ILangStringSet> langStringSet;
+ std::unique_ptr<api::ILangStringSet> ref_langStringSet;
+protected:
+ void SetUp() override
+ {
+ langStringSet = util::make_unique<Impl>();
+ ref_langStringSet = util::make_unique<Impl>();
+ }
+
+ void TearDown() override
+ { }
+};
+
+TYPED_TEST_CASE(LangStringTest, ImplTypes);
+
+TYPED_TEST(LangStringTest, TestUnknownLangCode)
+{
+ const auto string = this->langStringSet->get("UN");
+
+ ASSERT_TRUE(string.empty());
+}
+
+TYPED_TEST(LangStringTest, Test)
+{
+ constexpr char stringValDe[] = "Das ist ein Test!";
+ constexpr char stringValEn[] = "This is a test!";
+
+ this->langStringSet->add("DE", stringValDe);
+ this->langStringSet->add("EN", stringValEn);
+
+ const auto & deString = this->langStringSet->get("DE");
+ const auto & enString = this->langStringSet->get("EN");
+
+ ASSERT_EQ(deString, stringValDe);
+ ASSERT_EQ(enString, stringValEn);
+};
+
+TYPED_TEST(LangStringTest, TestGetLangCodes)
+{
+ constexpr char stringValDe[] = "Das ist ein Test!";
+ constexpr char stringValEn[] = "This is a test!";
+ constexpr char stringValFr[] = "C'est un test!";
+
+ this->langStringSet->add("DE", stringValDe);
+ this->langStringSet->add("EN", stringValEn);
+ this->langStringSet->add("FR", stringValFr);
+
+ auto lang_codes = this->langStringSet->getLanguageCodes();
+ auto reference_codes = api::ILangStringSet::langCodeSet_t{"DE", "EN", "FR"};
+
+ ASSERT_EQ(lang_codes, reference_codes);
+}
+
+TYPED_TEST(LangStringTest, TestEqualityOperatorEmpty)
+{
+ ASSERT_TRUE(*this->langStringSet == *this->ref_langStringSet);
+}
+
+TYPED_TEST(LangStringTest, TestEqualityOperatorEqual)
+{
+ constexpr char stringValDe[] = "Das ist ein Test!";
+ constexpr char stringValEn[] = "This is a test!";
+
+ this->langStringSet->add("DE", stringValDe);
+ this->langStringSet->add("EN", stringValEn);
+
+ this->ref_langStringSet->add("DE", stringValDe);
+ this->ref_langStringSet->add("EN", stringValEn);
+
+ ASSERT_TRUE(*this->langStringSet == *this->ref_langStringSet);
+}
+
+TYPED_TEST(LangStringTest, TestEqualityOperatorNotEqual)
+{
+ constexpr char stringValDe[] = "Das ist ein Test!";
+ constexpr char stringValEn[] = "This is a test!";
+
+ this->langStringSet->add("DE", stringValDe);
+ this->langStringSet->add("EN", stringValEn);
+
+ this->ref_langStringSet->add("DE", stringValDe);
+
+ ASSERT_FALSE(*this->langStringSet == *this->ref_langStringSet);
+}
diff --git a/sdks/c++/basys.sdk.cc/tests/regression/submodel/map/submodelelement/test_LangStringSet.cpp b/sdks/c++/basys.sdk.cc/tests/regression/submodel/map/submodelelement/test_LangStringSet.cpp
deleted file mode 100644
index 56d0a76..0000000
--- a/sdks/c++/basys.sdk.cc/tests/regression/submodel/map/submodelelement/test_LangStringSet.cpp
+++ /dev/null
@@ -1,50 +0,0 @@
-#include <gtest/gtest.h>
-
-#include <BaSyx/submodel/api_v2/common/ILangStringSet.h>
-#include <BaSyx/submodel/map_v2/common/LangStringSet.h>
-#include <BaSyx/submodel/simple/common/LangStringSet.h>
-
-#include <BaSyx/util/util.h>
-
-using namespace basyx::submodel;
-
-using ImplTypes = ::testing::Types<map::LangStringSet, simple::LangStringSet>;
-
-template<class Impl>
-class LangStringTest :public ::testing::Test {
-protected:
- std::unique_ptr<api::ILangStringSet> langStringSet;
-protected:
- void SetUp() override
- {
- this->langStringSet = util::make_unique<Impl>();
- }
-
- void TearDown() override
- {
- }
-};
-
-TYPED_TEST_CASE(LangStringTest, ImplTypes);
-
-TYPED_TEST(LangStringTest, TestUnknownLangCode)
-{
- const auto string = this->langStringSet->get("UN");
-
- ASSERT_TRUE(string.empty());
-}
-
-TYPED_TEST(LangStringTest, Test)
-{
- constexpr char stringValDe[] = "Das ist ein Test!";
- constexpr char stringValEn[] = "This is a test!";
-
- this->langStringSet->add("DE", stringValDe);
- this->langStringSet->add("EN", stringValEn);
-
- const auto & deString = this->langStringSet->get("DE");
- const auto & enString = this->langStringSet->get("EN");
-
- ASSERT_EQ(deString, stringValDe);
- ASSERT_EQ(enString, stringValEn);
-};
\ No newline at end of file
diff --git a/sdks/c++/basys.sdk.cc/tests/regression/submodel/map_v2/dataspecification/test_DataSpecification.cpp b/sdks/c++/basys.sdk.cc/tests/regression/submodel/map_v2/dataspecification/test_DataSpecification.cpp
new file mode 100644
index 0000000..09114dd
--- /dev/null
+++ b/sdks/c++/basys.sdk.cc/tests/regression/submodel/map_v2/dataspecification/test_DataSpecification.cpp
@@ -0,0 +1,56 @@
+#include <gtest/gtest.h>
+#include <BaSyx/submodel/api_v2/dataspecification/IDataSpecificationContent.h>
+
+#include "BaSyx/submodel/map_v2/dataspecification/DataSpecification.h"
+
+using namespace basyx::submodel::map;
+using namespace basyx::submodel;
+
+class DataSpecificationTest : public ::testing::Test
+{
+protected:
+ void SetUp() override
+ {}
+
+ class DataSpecificationContentMock : public virtual DataSpecificationContent
+ {
+ public:
+ bool isMock()
+ {
+ return true;
+ }
+ };
+
+ class DataSpecificationContentMock2 : public virtual DataSpecificationContent
+ {
+ public:
+ bool isMock2()
+ {
+ return true;
+ }
+ };
+};
+
+TEST_F(DataSpecificationTest, TestConstructor)
+{
+ simple::Identifier id;
+ std::unique_ptr<api::IDataSpecificationContent> content = util::make_unique<DataSpecificationContentMock>();
+ DataSpecification dataSpecification("id", id, std::move(content));
+
+ ASSERT_EQ(dataSpecification.getIdShort(), "id");
+ ASSERT_TRUE(dataSpecification.getIdentification() == id);
+ ASSERT_TRUE((dynamic_cast<DataSpecificationContentMock&>(dataSpecification.getContent())).isMock());
+}
+
+TEST_F(DataSpecificationTest, TestContent)
+{
+ simple::Identifier id;
+ std::unique_ptr<api::IDataSpecificationContent> content = util::make_unique<DataSpecificationContentMock>();
+ DataSpecification dataSpecification("id", id, std::move(content));
+
+ ASSERT_TRUE((dynamic_cast<DataSpecificationContentMock&>(dataSpecification.getContent())).isMock());
+
+ std::unique_ptr<api::IDataSpecificationContent> content2 = util::make_unique<DataSpecificationContentMock2>();
+ dataSpecification.setContent(std::move(content2));
+ ASSERT_TRUE((dynamic_cast<DataSpecificationContentMock2&>(dataSpecification.getContent())).isMock2());
+}
diff --git a/sdks/c++/basys.sdk.cc/tests/regression/submodel/map_v2/dataspecification/test_DataSpecificationIEC61360.cpp b/sdks/c++/basys.sdk.cc/tests/regression/submodel/map_v2/dataspecification/test_DataSpecificationIEC61360.cpp
new file mode 100644
index 0000000..cfffea7
--- /dev/null
+++ b/sdks/c++/basys.sdk.cc/tests/regression/submodel/map_v2/dataspecification/test_DataSpecificationIEC61360.cpp
@@ -0,0 +1,119 @@
+#include <gtest/gtest.h>
+
+#include "BaSyx/submodel/map_v2/dataspecification/DataSpecificationIEC61360.h"
+
+using namespace basyx::submodel::map;
+using namespace basyx::submodel;
+
+class DataSpecificationIEC61360Test : public ::testing::Test
+{
+protected:
+ std::unique_ptr<DataSpecificationIEC61360> data_spec;
+ map::LangStringSet preferred_name;
+ void SetUp() override
+ {
+ preferred_name.add("EN", "TestDataSpecification");
+ this->data_spec = util::make_unique<DataSpecificationIEC61360>(preferred_name);
+ }
+};
+
+TEST_F(DataSpecificationIEC61360Test, TestPreferredName)
+{
+ ASSERT_TRUE(this->data_spec->PreferredName() == this->preferred_name);
+
+ map::LangStringSet new_preferred_name;
+ new_preferred_name.add("EN", "NewTestDataSpecification");
+
+ this->data_spec->setPreferredName(new_preferred_name);
+
+ ASSERT_TRUE(data_spec->PreferredName() == new_preferred_name);
+}
+
+TEST_F(DataSpecificationIEC61360Test, TestShortName)
+{
+ ASSERT_TRUE(this->data_spec->ShortName().empty());
+
+ map::LangStringSet shortName;
+ shortName.add("EN", "TestDataSpec");
+ this->data_spec->setShortName(shortName);
+
+ ASSERT_TRUE(this->data_spec->ShortName() == shortName);
+}
+
+TEST_F(DataSpecificationIEC61360Test, TestDefinition)
+{
+ ASSERT_TRUE(this->data_spec->Definition().empty());
+
+ map::LangStringSet definition;
+ definition.add("EN", "Definition");
+ definition.add("DE", "Definition");
+
+ this->data_spec->setDefinition(definition);
+ ASSERT_TRUE(this->data_spec->Definition() == definition);
+}
+
+TEST_F(DataSpecificationIEC61360Test, TestUnit)
+ {
+ ASSERT_EQ(this->data_spec->getUnit(), nullptr);
+
+ this->data_spec->setUnit("testUnit");
+ ASSERT_EQ(*this->data_spec->getUnit(), std::string("testUnit"));
+}
+
+TEST_F(DataSpecificationIEC61360Test, TestSourceOfDefinition)
+ {
+ ASSERT_EQ(this->data_spec->getSourceOfDefinition(), nullptr);
+
+ this->data_spec->setSourceOfDefinition("testSourceOfDefinition");
+ ASSERT_EQ(*this->data_spec->getSourceOfDefinition(), std::string("testSourceOfDefinition"));
+}
+
+TEST_F(DataSpecificationIEC61360Test, TestSymbol)
+ {
+ ASSERT_EQ(this->data_spec->getSymbol(), nullptr);
+
+ this->data_spec->setSymbol("testSymbol");
+ ASSERT_EQ(*this->data_spec->getSymbol(), std::string("testSymbol"));
+}
+
+TEST_F(DataSpecificationIEC61360Test, TestValueFormat)
+ {
+ ASSERT_EQ(this->data_spec->getValueFormat(), nullptr);
+
+ this->data_spec->setValueFormat("testValueFormat");
+ ASSERT_EQ(*this->data_spec->getValueFormat(), std::string("testValueFormat"));
+}
+/* TODO
+TEST_F(DataSpecificationIEC61360Test, TestDataType)
+{
+ ASSERT_EQ(this->data_spec->getDataType(), DataTypeIEC61360::Unknown);
+
+ this->data_spec->setDataType(DataTypeIEC61360::Rational);
+ ASSERT_EQ(this->data_spec->getDataType(), DataTypeIEC61360::Rational);
+}
+
+TEST_F(DataSpecificationIEC61360Test, TestLevelType)
+{
+ ASSERT_EQ(this->data_spec->getLevelType(), LevelType::Unknown);
+
+ this->data_spec->setLevelType(LevelType::Min);
+ ASSERT_EQ(this->data_spec->getLevelType(), LevelType::Min);
+}*/
+
+TEST_F(DataSpecificationIEC61360Test, TestUnitId)
+{
+ ASSERT_EQ(this->data_spec->getUnitId(), nullptr);
+
+ std::unique_ptr<api::IReference> reference = util::make_unique<map::Reference>();
+ this->data_spec->setUnitId(std::move(reference));
+ ASSERT_NE(this->data_spec->getUnitId(), nullptr);
+}
+
+TEST_F(DataSpecificationIEC61360Test, TestValueId)
+{
+ ASSERT_EQ(this->data_spec->getValueId(), nullptr);
+
+ std::unique_ptr<api::IReference> valueId = util::make_unique<map::Reference>();
+ this->data_spec->setValueId(std::move(valueId));
+ ASSERT_NE(this->data_spec->getValueId(), nullptr);
+}
\ No newline at end of file
diff --git a/sdks/c++/basys.sdk.cc/tests/regression/submodel/map_v2/identifier/test_Identifier.cpp b/sdks/c++/basys.sdk.cc/tests/regression/submodel/map_v2/identifier/test_Identifier.cpp
new file mode 100644
index 0000000..c51cc95
--- /dev/null
+++ b/sdks/c++/basys.sdk.cc/tests/regression/submodel/map_v2/identifier/test_Identifier.cpp
@@ -0,0 +1,23 @@
+#include <gtest/gtest.h>
+
+#include "BaSyx/submodel/map_v2/dataspecification/DataSpecification.h"
+
+using namespace basyx::submodel::map;
+using namespace basyx::submodel;
+
+class IdentifierTest : public ::testing::Test
+{
+protected:
+ void SetUp() override
+ {}
+};
+
+TEST_F(IdentifierTest, TestEqualityOperator_same)
+{
+ simple::Identifier id1(IdentifierType::IRDI, "id");
+ simple::Identifier id2(IdentifierType::IRDI, "id");
+
+ ASSERT_TRUE(id1 == id2);
+}
+
+
diff --git a/sdks/java/basys.sdk/src/main/java/org/eclipse/basyx/vab/directory/memory/InMemoryDirectory.java b/sdks/java/basys.sdk/src/main/java/org/eclipse/basyx/vab/directory/memory/InMemoryDirectory.java
index fc091ab..a3ee350 100644
--- a/sdks/java/basys.sdk/src/main/java/org/eclipse/basyx/vab/directory/memory/InMemoryDirectory.java
+++ b/sdks/java/basys.sdk/src/main/java/org/eclipse/basyx/vab/directory/memory/InMemoryDirectory.java
@@ -4,6 +4,7 @@
import java.util.Map;
import org.eclipse.basyx.vab.directory.api.IVABDirectoryService;
+import org.eclipse.basyx.vab.exception.provider.ResourceNotFoundException;
@@ -52,14 +53,12 @@
return this;
}
-
/**
* Add several mappings to directory
*/
- public void addMappings(Map<String,String> mappings) {
+ public void addMappings(Map<String, String> mappings) {
keyToValue.putAll(mappings);
}
-
/**
* Remove a mapping from directory
@@ -74,6 +73,10 @@
*/
@Override
public String lookup(String id) {
- return (String) keyToValue.get(id);
+ if(keyToValue.containsKey(id)) {
+ return (String) keyToValue.get(id);
+ } else {
+ throw new ResourceNotFoundException("No entry exists for key " + id);
+ }
}
}
diff --git a/sdks/java/basys.sdk/src/main/java/org/eclipse/basyx/vab/directory/restapi/DirectoryModelProvider.java b/sdks/java/basys.sdk/src/main/java/org/eclipse/basyx/vab/directory/restapi/DirectoryModelProvider.java
index 9a76d14..0d06c5c 100644
--- a/sdks/java/basys.sdk/src/main/java/org/eclipse/basyx/vab/directory/restapi/DirectoryModelProvider.java
+++ b/sdks/java/basys.sdk/src/main/java/org/eclipse/basyx/vab/directory/restapi/DirectoryModelProvider.java
@@ -3,7 +3,6 @@
import org.eclipse.basyx.vab.directory.api.IVABDirectoryService;
import org.eclipse.basyx.vab.directory.memory.InMemoryDirectory;
import org.eclipse.basyx.vab.exception.provider.ProviderException;
-import org.eclipse.basyx.vab.exception.provider.ResourceNotFoundException;
import org.eclipse.basyx.vab.modelprovider.VABPathTools;
import org.eclipse.basyx.vab.modelprovider.api.IModelProvider;
@@ -37,12 +36,7 @@
@Override
public Object getModelPropertyValue(String path) throws ProviderException {
path = VABPathTools.stripSlashes(path);
- Object obj = directory.lookup(path);
- if (obj == null) {
- throw new ResourceNotFoundException("Path " + path + " does not exist in the Registry");
- } else {
- return obj;
- }
+ return directory.lookup(path);
}
@Override
diff --git a/sdks/java/basys.sdk/src/test/java/org/eclipse/basyx/testsuite/regression/vab/directory/memory/TestInMemoryDirectory.java b/sdks/java/basys.sdk/src/test/java/org/eclipse/basyx/testsuite/regression/vab/directory/memory/TestInMemoryDirectory.java
new file mode 100644
index 0000000..d918554
--- /dev/null
+++ b/sdks/java/basys.sdk/src/test/java/org/eclipse/basyx/testsuite/regression/vab/directory/memory/TestInMemoryDirectory.java
@@ -0,0 +1,58 @@
+package org.eclipse.basyx.testsuite.regression.vab.directory.memory;
+
+import static org.junit.Assert.assertEquals;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import org.eclipse.basyx.testsuite.regression.vab.directory.proxy.TestDirectory;
+import org.eclipse.basyx.vab.directory.api.IVABDirectoryService;
+import org.eclipse.basyx.vab.directory.memory.InMemoryDirectory;
+import org.junit.Test;
+
+/**
+ * Tests the InMemory directory using the TestDirectory Suite
+ *
+ * @author schnicke, haque
+ *
+ */
+public class TestInMemoryDirectory extends TestDirectory {
+
+ @Override
+ protected IVABDirectoryService getRegistry() {
+ return new InMemoryDirectory();
+ }
+
+ @Test
+ public void testConstructor() {
+ IVABDirectoryService registry = new InMemoryDirectory(getAddedValues());
+ testElementsInMap(registry, getAddedValues());
+ }
+
+ @Test
+ public void testAddMappingMultipleKey() {
+ InMemoryDirectory registry = new InMemoryDirectory();
+ String key3 = "key3";
+ String value3 = "value3";
+ String key4 = "key4";
+ String value4 = "value4";
+ Map<String, String> map = new HashMap<String, String>();
+ map.put(key3, value3);
+ map.put(key4, value4);
+ registry.addMappings(map);
+ testElementsInMap(registry, map);
+ }
+
+ private void testElementsInMap(IVABDirectoryService registry, Map<String, String> map) {
+ for (Map.Entry<String, String> entry : map.entrySet()) {
+ assertEquals(entry.getValue(), registry.lookup(entry.getKey()));
+ }
+ }
+
+ private Map<String, String> getAddedValues() {
+ Map<String, String> map = new HashMap<String, String>();
+ map.put("key1", "value1");
+ map.put("key2", "value2");
+ return map;
+ }
+}
diff --git a/sdks/java/basys.sdk/src/test/java/org/eclipse/basyx/testsuite/regression/vab/directory/proxy/TestDirectory.java b/sdks/java/basys.sdk/src/test/java/org/eclipse/basyx/testsuite/regression/vab/directory/proxy/TestDirectory.java
index 2f53d1c..5f4fabd 100644
--- a/sdks/java/basys.sdk/src/test/java/org/eclipse/basyx/testsuite/regression/vab/directory/proxy/TestDirectory.java
+++ b/sdks/java/basys.sdk/src/test/java/org/eclipse/basyx/testsuite/regression/vab/directory/proxy/TestDirectory.java
@@ -5,9 +5,7 @@
import static org.junit.Assert.fail;
import org.eclipse.basyx.vab.directory.api.IVABDirectoryService;
-import org.eclipse.basyx.vab.directory.proxy.VABDirectoryProxy;
import org.eclipse.basyx.vab.exception.provider.ResourceNotFoundException;
-import org.eclipse.basyx.vab.modelprovider.api.IModelProvider;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
@@ -21,7 +19,7 @@
*/
public abstract class TestDirectory {
// The registry proxy that is used to access the backend
- protected final IVABDirectoryService proxy = new VABDirectoryProxy(getProxyProvider());
+ protected final IVABDirectoryService registry = getRegistry();
// Ids and endpoints for registered elements
protected String elem1 = "elem1";
@@ -35,7 +33,7 @@
* Getter for the tested registry provider. Tests for actual registry provider
* have to realize this method.
*/
- protected abstract IModelProvider getProxyProvider();
+ protected abstract IVABDirectoryService getRegistry();
/**
* During setup of the tests, new entries are created in the registry using a
@@ -44,8 +42,8 @@
@Before
public void setUp() {
// Register Elements
- proxy.addMapping(elem1, endpoint1);
- proxy.addMapping(elem2, endpoint2);
+ registry.addMapping(elem1, endpoint1);
+ registry.addMapping(elem2, endpoint2);
}
/**
@@ -53,8 +51,8 @@
*/
@After
public void tearDown() {
- proxy.removeMapping(elem1);
- proxy.removeMapping(elem2);
+ registry.removeMapping(elem1);
+ registry.removeMapping(elem2);
}
/**
@@ -63,12 +61,12 @@
@Test
public void testGetSingleElement() {
// Retrieve and check the first Element
- String result = proxy.lookup(elem1);
+ String result = registry.lookup(elem1);
assertEquals(endpoint1, result);
// Retrieve and check the second AAS
- result = proxy.lookup(elem2);
+ result = registry.lookup(elem2);
assertEquals(endpoint2, result);
}
@@ -78,31 +76,31 @@
@Test
public void testDeleteCall() {
// After the setup, both Elements should have been inserted to the registry
- assertNotNull(proxy.lookup(elem1));
- assertNotNull(proxy.lookup(elem2));
+ assertNotNull(registry.lookup(elem1));
+ assertNotNull(registry.lookup(elem2));
- proxy.removeMapping(elem2);
+ registry.removeMapping(elem2);
// After elem2 has been deleted, only elem1 should be registered
- assertNotNull(proxy.lookup(elem1));
+ assertNotNull(registry.lookup(elem1));
try {
- proxy.lookup(elem2);
+ registry.lookup(elem2);
fail();
} catch (ResourceNotFoundException e) {
// Expected
}
- proxy.removeMapping(elem1);
+ registry.removeMapping(elem1);
// After elem2 has been deleted, no element should be registered
try {
- proxy.lookup(elem1);
+ registry.lookup(elem1);
fail();
} catch (ResourceNotFoundException e) {
// Expected
}
try {
- proxy.lookup(elem2);
+ registry.lookup(elem2);
fail();
} catch (ResourceNotFoundException e) {
// Expected
diff --git a/sdks/java/basys.sdk/src/test/java/org/eclipse/basyx/testsuite/regression/vab/directory/restapi/TestDirectoryProvider.java b/sdks/java/basys.sdk/src/test/java/org/eclipse/basyx/testsuite/regression/vab/directory/restapi/TestDirectoryProvider.java
index 0a7f440..caaf81a 100644
--- a/sdks/java/basys.sdk/src/test/java/org/eclipse/basyx/testsuite/regression/vab/directory/restapi/TestDirectoryProvider.java
+++ b/sdks/java/basys.sdk/src/test/java/org/eclipse/basyx/testsuite/regression/vab/directory/restapi/TestDirectoryProvider.java
@@ -1,17 +1,22 @@
package org.eclipse.basyx.testsuite.regression.vab.directory.restapi;
import org.eclipse.basyx.testsuite.regression.vab.directory.proxy.TestDirectory;
+import org.eclipse.basyx.vab.directory.api.IVABDirectoryService;
+import org.eclipse.basyx.vab.directory.proxy.VABDirectoryProxy;
import org.eclipse.basyx.vab.directory.restapi.DirectoryModelProvider;
-import org.eclipse.basyx.vab.modelprovider.VABElementProxy;
-import org.eclipse.basyx.vab.modelprovider.api.IModelProvider;
+/**
+ * Tests the directory provider using the TestDirectory Suite
+ *
+ * @author schnicke
+ *
+ */
public class TestDirectoryProvider extends TestDirectory {
@Override
- protected IModelProvider getProxyProvider() {
+ protected IVABDirectoryService getRegistry() {
DirectoryModelProvider provider = new DirectoryModelProvider();
- IModelProvider apiProxy = new VABElementProxy("", provider);
- return apiProxy;
+ return new VABDirectoryProxy(provider);
}
}