From f93b6f7ed097191364e208866f3d21c3aec54bef Mon Sep 17 00:00:00 2001
From: Rainer Kartmann <rainer.kartmann@kit.edu>
Date: Mon, 30 Aug 2021 18:57:38 +0200
Subject: [PATCH] Only subscribe memory updates when using ListeningPlugin

Signed-off-by: Rainer Kartmann <rainer.kartmann@kit.edu>
---
 .../RobotAPI/libraries/armem/CMakeLists.txt   |  8 +++++
 .../armem/client/MemoryNameSystem.cpp         |  8 ++++-
 .../armem/client/plugins/ListeningPlugin.cpp  | 21 ++++++++++++++
 .../armem/client/plugins/ListeningPlugin.h    | 29 +++++++++++++++++++
 .../client/plugins/ListeningPluginUser.cpp    |  3 ++
 .../client/plugins/ListeningPluginUser.h      | 12 ++++++--
 .../libraries/armem/client/plugins/Plugin.cpp | 15 ++++------
 .../libraries/armem/client/plugins/Plugin.h   |  1 +
 8 files changed, 85 insertions(+), 12 deletions(-)
 create mode 100644 source/RobotAPI/libraries/armem/client/plugins/ListeningPlugin.cpp
 create mode 100644 source/RobotAPI/libraries/armem/client/plugins/ListeningPlugin.h

diff --git a/source/RobotAPI/libraries/armem/CMakeLists.txt b/source/RobotAPI/libraries/armem/CMakeLists.txt
index 32c3b9b94..88519c9ba 100644
--- a/source/RobotAPI/libraries/armem/CMakeLists.txt
+++ b/source/RobotAPI/libraries/armem/CMakeLists.txt
@@ -60,11 +60,13 @@ set(LIB_FILES
     core/error/ArMemError.cpp
     core/error/mns.cpp
 
+
     client/MemoryNameSystem.cpp
     client/Reader.cpp
     client/Writer.cpp
 
     client/plugins/ListeningPluginUser.cpp
+    client/plugins/ListeningPlugin.cpp
     client/plugins/PluginUser.cpp
     client/plugins/Plugin.cpp
 
@@ -76,6 +78,7 @@ set(LIB_FILES
     client/query/Builder.cpp
     client/query/selectors.cpp
 
+
     server/MemoryToIceAdapter.cpp
     server/ComponentPlugin.cpp
     server/MemoryRemoteGui.cpp
@@ -102,6 +105,7 @@ set(LIB_FILES
     server/query_proc/ltm.cpp
     server/query_proc/wm.cpp
 
+
     mns/MemoryNameSystem.cpp
     mns/Registry.cpp
     mns/plugins/Plugin.cpp
@@ -155,6 +159,7 @@ set(LIB_HEADERS
     core/wm/visitor/Visitor.h
     core/wm/visitor/FunctionalVisitor.h
 
+
     client.h
     client/forward_declarations.h
     client/MemoryNameSystem.h
@@ -163,6 +168,7 @@ set(LIB_HEADERS
 
     client/plugins.h
     client/plugins/ListeningPluginUser.h
+    client/plugins/ListeningPlugin.h
     client/plugins/PluginUser.h
     client/plugins/Plugin.h
 
@@ -178,6 +184,7 @@ set(LIB_HEADERS
     client/util/SimpleReaderBase.h
     client/util/SimpleWriterBase.h
 
+
     server.h
     server/forward_declarations.h
 
@@ -210,6 +217,7 @@ set(LIB_HEADERS
     server/query_proc/ltm.h
     server/query_proc/wm.h
 
+
     mns.h
     mns/MemoryNameSystem.h
     mns/Registry.h
diff --git a/source/RobotAPI/libraries/armem/client/MemoryNameSystem.cpp b/source/RobotAPI/libraries/armem/client/MemoryNameSystem.cpp
index 4dcb3d624..121b29248 100644
--- a/source/RobotAPI/libraries/armem/client/MemoryNameSystem.cpp
+++ b/source/RobotAPI/libraries/armem/client/MemoryNameSystem.cpp
@@ -9,6 +9,8 @@
 
 #include <SimoxUtility/algorithm/string/string_tools.h>
 
+
+
 namespace armarx::armem::client
 {
 
@@ -190,6 +192,7 @@ namespace armarx::armem::client
     }
 
 
+
     template <class ClientT>
     std::map<std::string, ClientT>
     MemoryNameSystem::_getAllClients(auto&& getProxyFn) const
@@ -197,7 +200,10 @@ namespace armarx::armem::client
         std::map<std::string, ClientT> result;
         for (const auto& [name, server] : servers)
         {
-            result[name] = ClientT(getProxyFn(server));
+            if (auto proxy = getProxyFn(server))
+            {
+                result[name] = ClientT(proxy);
+            }
         }
         return result;
     }
diff --git a/source/RobotAPI/libraries/armem/client/plugins/ListeningPlugin.cpp b/source/RobotAPI/libraries/armem/client/plugins/ListeningPlugin.cpp
new file mode 100644
index 000000000..463c6443e
--- /dev/null
+++ b/source/RobotAPI/libraries/armem/client/plugins/ListeningPlugin.cpp
@@ -0,0 +1,21 @@
+#include "ListeningPlugin.h"
+
+#include <RobotAPI/interface/armem/client/MemoryListenerInterface.h>
+
+#include <ArmarXCore/core/application/properties/PropertyDefinitionContainer.h>
+
+
+namespace armarx::armem::client::plugins
+{
+
+    ListeningPlugin::~ListeningPlugin()
+    {}
+
+
+    void ListeningPlugin::postCreatePropertyDefinitions(armarx::PropertyDefinitionsPtr& properties)
+    {
+        // Subscribe topics by single servers, use this as a prefix.
+        properties->topic<MemoryListenerInterface>("MemoryUpdates");
+    }
+
+}
diff --git a/source/RobotAPI/libraries/armem/client/plugins/ListeningPlugin.h b/source/RobotAPI/libraries/armem/client/plugins/ListeningPlugin.h
new file mode 100644
index 000000000..80aac20c6
--- /dev/null
+++ b/source/RobotAPI/libraries/armem/client/plugins/ListeningPlugin.h
@@ -0,0 +1,29 @@
+#pragma once
+
+#include <ArmarXCore/core/ComponentPlugin.h>
+
+
+namespace armarx::armem::client::plugins
+{
+
+    /**
+     * @brief Subscribes the memory updates topic.
+     *
+     * When using this plugin, the component needs to implement the
+     * `MemoryListenerInterface`.
+     *
+     * @see MemoryListenerInterface
+     */
+    class ListeningPlugin :
+        public armarx::ComponentPlugin
+    {
+    public:
+
+        using ComponentPlugin::ComponentPlugin;
+        virtual ~ListeningPlugin() override;
+
+        virtual void postCreatePropertyDefinitions(armarx::PropertyDefinitionsPtr& properties) override;
+
+    };
+
+}
diff --git a/source/RobotAPI/libraries/armem/client/plugins/ListeningPluginUser.cpp b/source/RobotAPI/libraries/armem/client/plugins/ListeningPluginUser.cpp
index 3b3027a38..3a40a9ffe 100644
--- a/source/RobotAPI/libraries/armem/client/plugins/ListeningPluginUser.cpp
+++ b/source/RobotAPI/libraries/armem/client/plugins/ListeningPluginUser.cpp
@@ -1,5 +1,7 @@
 #include "ListeningPluginUser.h"
 
+#include "ListeningPlugin.h"
+
 #include <RobotAPI/libraries/armem/client/MemoryNameSystem.h>
 
 
@@ -8,6 +10,7 @@ namespace armarx::armem::client::plugins
 
     ListeningPluginUser::ListeningPluginUser()
     {
+        addPlugin(listeningPlugin);
     }
 
 
diff --git a/source/RobotAPI/libraries/armem/client/plugins/ListeningPluginUser.h b/source/RobotAPI/libraries/armem/client/plugins/ListeningPluginUser.h
index dd80b88e6..20b124d5d 100644
--- a/source/RobotAPI/libraries/armem/client/plugins/ListeningPluginUser.h
+++ b/source/RobotAPI/libraries/armem/client/plugins/ListeningPluginUser.h
@@ -9,6 +9,8 @@
 
 namespace armarx::armem::client::plugins
 {
+    class ListeningPlugin;
+
 
     /**
      * @brief A memory name system client which listens to the memory updates
@@ -27,8 +29,14 @@ namespace armarx::armem::client::plugins
 
 
         // MemoryListenerInterface
-        virtual void memoryUpdated(const std::vector<data::MemoryID>& updatedSnapshotIDs,
-                                   const Ice::Current&) override;
+        virtual void
+        memoryUpdated(const std::vector<data::MemoryID>& updatedSnapshotIDs,
+                      const Ice::Current&) override;
+
+
+    private:
+
+        ListeningPlugin* listeningPlugin = nullptr;
 
     };
 
diff --git a/source/RobotAPI/libraries/armem/client/plugins/Plugin.cpp b/source/RobotAPI/libraries/armem/client/plugins/Plugin.cpp
index e31d2d0e5..74cf798f6 100644
--- a/source/RobotAPI/libraries/armem/client/plugins/Plugin.cpp
+++ b/source/RobotAPI/libraries/armem/client/plugins/Plugin.cpp
@@ -1,18 +1,18 @@
 #include "Plugin.h"
 
-#include <ArmarXCore/core/Component.h>
-#include <ArmarXCore/core/exceptions/local/ExpressionException.h>
-
 #include <RobotAPI/libraries/armem/core/error.h>
 #include <RobotAPI/libraries/armem/core/ice_conversions.h>
 
+#include <ArmarXCore/core/Component.h>
+#include <ArmarXCore/core/exceptions/local/ExpressionException.h>
+#include <ArmarXCore/core/logging/Logging.h>
 
 
 namespace armarx::armem::client::plugins
 {
 
     Plugin::Plugin(
-            ManagedIceObject& parent, std::string pre) :
+        ManagedIceObject& parent, std::string pre) :
         ComponentPlugin(parent, pre)
     {
     }
@@ -24,14 +24,14 @@ namespace armarx::armem::client::plugins
 
     void Plugin::postCreatePropertyDefinitions(armarx::PropertyDefinitionsPtr& properties)
     {
-        if (!properties->hasDefinition(makePropertyName(PROPERTY_MNS_NAME_NAME)))
+        if (not properties->hasDefinition(makePropertyName(PROPERTY_MNS_NAME_NAME)))
         {
             properties->defineOptionalProperty<std::string>(
                 makePropertyName(PROPERTY_MNS_NAME_NAME),
                 memoryNameSystemName,
                 "Name of the Memory Name System (MNS) component.");
         }
-        if (!properties->hasDefinition(makePropertyName(PROPERTY_MNS_ENABLED_NAME)))
+        if (not properties->hasDefinition(makePropertyName(PROPERTY_MNS_ENABLED_NAME)))
         {
             properties->defineOptionalProperty<bool>(
                 makePropertyName(PROPERTY_MNS_ENABLED_NAME),
@@ -39,9 +39,6 @@ namespace armarx::armem::client::plugins
                 "Whether to use (and depend on) the Memory Name System (MNS)."
                 "\nSet to false to use this memory as a stand-alone.");
         }
-
-        // Subscribe topics by single servers, use this as a prefix.
-        properties->topic<MemoryListenerInterface>("MemoryUpdates");
     }
 
 
diff --git a/source/RobotAPI/libraries/armem/client/plugins/Plugin.h b/source/RobotAPI/libraries/armem/client/plugins/Plugin.h
index 550f893bf..eff9134fd 100644
--- a/source/RobotAPI/libraries/armem/client/plugins/Plugin.h
+++ b/source/RobotAPI/libraries/armem/client/plugins/Plugin.h
@@ -25,6 +25,7 @@ namespace armarx::armem::client::plugins
         Plugin(ManagedIceObject& parent, std::string pre);
         virtual ~Plugin() override;
 
+
         void postCreatePropertyDefinitions(PropertyDefinitionsPtr& properties) override;
 
         void preOnInitComponent() override;
-- 
GitLab