From e77ace694e255a13d302f16be2ddc1c41e5ee5a5 Mon Sep 17 00:00:00 2001
From: Christoph Pohl <christoph.pohl@kit.edu>
Date: Mon, 13 Feb 2023 13:04:35 +0100
Subject: [PATCH] Fix doubling of namespaces in component config

---
 .../PropertyDefinitionVisitors.cpp            | 58 ++++++++-----------
 .../PropertyDefinitionVisitors.h              |  9 +--
 2 files changed, 26 insertions(+), 41 deletions(-)

diff --git a/source/RobotAPI/libraries/aron_component_config/PropertyDefinitionVisitors.cpp b/source/RobotAPI/libraries/aron_component_config/PropertyDefinitionVisitors.cpp
index 8f68b47f1..ee7d67c73 100644
--- a/source/RobotAPI/libraries/aron_component_config/PropertyDefinitionVisitors.cpp
+++ b/source/RobotAPI/libraries/aron_component_config/PropertyDefinitionVisitors.cpp
@@ -54,7 +54,7 @@ namespace armarx::aron::component_config
     {
         INPUT_GUARD(i);
         auto value = data::Int::DynamicCastAndCheck(i);
-        auto name = joinNamespaces(namespaces_) + pathToName(i);
+        auto name = global_namespace_ + pathToName(i);
         property_user_->getProperty(value->getValue(), name);
     }
 
@@ -63,7 +63,7 @@ namespace armarx::aron::component_config
     {
         INPUT_GUARD(f);
         auto value = data::Float::DynamicCastAndCheck(f);
-        auto name = joinNamespaces(namespaces_) + pathToName(f);
+        auto name = global_namespace_ + pathToName(f);
         property_user_->getProperty(value->getValue(), name);
     }
 
@@ -72,7 +72,7 @@ namespace armarx::aron::component_config
     {
         INPUT_GUARD(d);
         auto value = data::Double::DynamicCastAndCheck(d);
-        auto name = joinNamespaces(namespaces_) + pathToName(d);
+        auto name = global_namespace_ + pathToName(d);
         property_user_->getProperty(value->getValue(), name);
     }
 
@@ -81,7 +81,7 @@ namespace armarx::aron::component_config
     {
         INPUT_GUARD(b);
         auto value = data::Bool::DynamicCastAndCheck(b);
-        auto name = joinNamespaces(namespaces_) + pathToName(b);
+        auto name = global_namespace_ + pathToName(b);
         property_user_->getProperty(value->getValue(), name);
     }
 
@@ -90,7 +90,7 @@ namespace armarx::aron::component_config
     {
         INPUT_GUARD(string);
         auto value = data::String::DynamicCastAndCheck(string);
-        auto name = joinNamespaces(namespaces_) + pathToName(string);
+        auto name = global_namespace_ + pathToName(string);
         auto property = property_user_->getProperty<std::string>(name);
         if (not property.getValue().empty())
         {
@@ -107,7 +107,7 @@ namespace armarx::aron::component_config
     {
         ARMARX_TRACE;
         in_list_ = true;
-        const auto& name = joinNamespaces(namespaces_) + pathToName(o);
+        const auto& name = global_namespace_ + pathToName(o);
         const auto& type = type::List::DynamicCast(t)->getAcceptedType()->getDescriptor();
         if (std::find(implementedListDescriptors.begin(), implementedListDescriptors.end(), type) ==
             implementedListDescriptors.end())
@@ -145,7 +145,7 @@ namespace armarx::aron::component_config
     {
         ARMARX_TRACE;
         auto data = data::Int::DynamicCastAndCheck(enumData);
-        auto name = joinNamespaces(namespaces_) + pathToName(enumData);
+        auto name = global_namespace_ + pathToName(enumData);
         property_user_->getProperty(data->getValue(), name);
     }
 
@@ -168,7 +168,7 @@ namespace armarx::aron::component_config
     {
         ARMARX_TRACE;
         in_list_ = true;
-        const auto& name = joinNamespaces(namespaces_) + pathToName(o);
+        const auto& name = global_namespace_ + pathToName(o);
         const auto& type = type::Dict::DynamicCast(t)->getAcceptedType()->getDescriptor();
         if (std::find(implementedListDescriptors.begin(), implementedListDescriptors.end(), type) ==
             implementedListDescriptors.end())
@@ -247,15 +247,10 @@ namespace armarx::aron::component_config
     {
         INPUT_GUARD(i);
         auto t = type::Object::DynamicCastAndCheck(j);
-        namespaces_.emplace_back(t->getObjectNameWithoutNamespace());
-    }
-
-    void
-    PropertyDefinitionGetterVisitor::visitObjectOnExit(std::shared_ptr<data::Variant>& i,
-                                                       const std::shared_ptr<type::Variant>& j)
-    {
-        INPUT_GUARD(i);
-        namespaces_.pop_back();
+        if (global_namespace_.empty())
+        {
+            global_namespace_ = t->getObjectNameWithoutNamespace() + ".";
+        }
     }
 
     PropertyDefinitionSetterVisitor::PropertyDefinitionSetterVisitor(
@@ -268,7 +263,7 @@ namespace armarx::aron::component_config
     PropertyDefinitionSetterVisitor::visitAronVariant(const data::IntPtr& i, const type::IntPtr&)
     {
         INPUT_GUARD(i);
-        auto name = joinNamespaces(namespaces_) + pathToName(i);
+        auto name = global_namespace_ + pathToName(i);
         property_definitions_->defineOptionalProperty<int>(name, i->getValue());
     }
 
@@ -277,7 +272,7 @@ namespace armarx::aron::component_config
                                                       const type::FloatPtr&)
     {
         INPUT_GUARD(f);
-        auto name = joinNamespaces(namespaces_) + pathToName(f);
+        auto name = global_namespace_ + pathToName(f);
         property_definitions_->defineOptionalProperty<float>(name, f->getValue());
     }
 
@@ -286,7 +281,7 @@ namespace armarx::aron::component_config
                                                       const type::DoublePtr&)
     {
         INPUT_GUARD(d);
-        auto name = joinNamespaces(namespaces_) + pathToName(d);
+        auto name = global_namespace_ + pathToName(d);
         property_definitions_->defineOptionalProperty<double>(name, d->getValue());
     }
 
@@ -294,7 +289,7 @@ namespace armarx::aron::component_config
     PropertyDefinitionSetterVisitor::visitAronVariant(const data::BoolPtr& b, const type::BoolPtr&)
     {
         INPUT_GUARD(b);
-        auto name = joinNamespaces(namespaces_) + pathToName(b);
+        auto name = global_namespace_ + pathToName(b);
         property_definitions_->defineOptionalProperty<bool>(name, b->getValue());
     }
 
@@ -303,7 +298,7 @@ namespace armarx::aron::component_config
                                                       const type::StringPtr& type)
     {
         INPUT_GUARD(string);
-        auto name = joinNamespaces(namespaces_) + pathToName(string);
+        auto name = global_namespace_ + pathToName(string);
         property_definitions_->defineOptionalProperty<std::string>(name, string->getValue());
     }
 
@@ -312,7 +307,7 @@ namespace armarx::aron::component_config
                                                       const type::IntEnumPtr& t)
     {
         INPUT_GUARD(i);
-        auto name = joinNamespaces(namespaces_) + pathToName(i);
+        auto name = global_namespace_ + pathToName(i);
         property_definitions_->defineOptionalProperty<int>(name, i->getValue())
             .map(t->getAcceptedValueMap());
     }
@@ -324,7 +319,7 @@ namespace armarx::aron::component_config
         ARMARX_TRACE;
         ARMARX_CHECK_NOT_NULL(l);
         in_list_ = true;
-        const auto& name = joinNamespaces(namespaces_) + pathToName(l);
+        const auto& name = global_namespace_ + pathToName(l);
         const auto& type = t->getAcceptedType()->getDescriptor();
         if (std::find(implementedListDescriptors.begin(), implementedListDescriptors.end(), type) ==
             implementedListDescriptors.end())
@@ -356,7 +351,7 @@ namespace armarx::aron::component_config
     {
         ARMARX_TRACE;
         in_list_ = true;
-        const auto& name = joinNamespaces(namespaces_) + pathToName(d);
+        const auto& name = global_namespace_ + pathToName(d);
         const auto& type = t->getAcceptedType()->getDescriptor();
         if (std::find(implementedListDescriptors.begin(), implementedListDescriptors.end(), type) ==
             implementedListDescriptors.end())
@@ -391,15 +386,10 @@ namespace armarx::aron::component_config
                                                              const type::ObjectPtr& type)
     {
         INPUT_GUARD(obj);
-        namespaces_.emplace_back(type->getObjectNameWithoutNamespace());
-    }
-
-    void
-    PropertyDefinitionSetterVisitor::visitAronVariantOnExit(const data::DictPtr& obj,
-                                                            const type::ObjectPtr& type)
-    {
-        INPUT_GUARD(obj);
-        namespaces_.pop_back();
+        if (global_namespace_.empty())
+        {
+            global_namespace_ = type->getObjectNameWithoutNamespace() + ".";
+        }
     }
 } // namespace armarx::aron::component_config
 
diff --git a/source/RobotAPI/libraries/aron_component_config/PropertyDefinitionVisitors.h b/source/RobotAPI/libraries/aron_component_config/PropertyDefinitionVisitors.h
index 5a22cb245..3d4890414 100644
--- a/source/RobotAPI/libraries/aron_component_config/PropertyDefinitionVisitors.h
+++ b/source/RobotAPI/libraries/aron_component_config/PropertyDefinitionVisitors.h
@@ -59,12 +59,9 @@ namespace armarx::aron::component_config
         void visitAronVariantOnEnter(const data::DictPtr& ptr,
                                      const type::ObjectPtr& objectPtr) override;
 
-        void visitAronVariantOnExit(const data::DictPtr& ptr,
-                                    const type::ObjectPtr& objectPtr) override;
-
     private:
         std::experimental::observer_ptr<PropertyDefinitionContainer> property_definitions_;
-        std::vector<std::string> namespaces_;
+        std::string global_namespace_{""};
         std::atomic<bool> in_list_{false};
     };
 
@@ -108,13 +105,11 @@ namespace armarx::aron::component_config
 
         void visitObjectOnEnter(DataInput& elementData, TypeInput& elementType) override;
 
-        void visitObjectOnExit(DataInput& elementData, TypeInput& elementType) override;
-
         void visitIntEnum(DataInput& elementData, TypeInput& elementType) override;
 
     private:
         std::experimental::observer_ptr<const armarx::PropertyUser> property_user_;
-        std::vector<std::string> namespaces_;
+        std::string global_namespace_{""};
         std::atomic<bool> in_list_;
     };
 
-- 
GitLab