From 78bce7212ed4f06758b8048a33fa2b4d518f4d5d Mon Sep 17 00:00:00 2001
From: "Christian R. G. Dreher" <c.dreher@kit.edu>
Date: Fri, 8 Jan 2021 13:29:26 +0100
Subject: [PATCH] refactor: Restructure client code, add combined plugins and
 reader/writer plugins

---
 .../ArMemExampleClient/ArMemExampleClient.cpp |  5 +-
 .../ArMemExampleClient/ArMemExampleClient.h   | 16 +++---
 .../ArMemMemoryViewerWidgetController.cpp     |  2 +-
 .../ArMemMemoryViewerWidgetController.h       |  4 +-
 source/RobotAPI/interface/armem.ice           |  2 +-
 .../RobotAPI/libraries/armem/CMakeLists.txt   | 16 ++++--
 .../armem/client/ComponentPlugin.cpp          | 14 +++++
 .../libraries/armem/client/ComponentPlugin.h  | 35 ++++++++++++
 .../client/MemoryClientComponentPlugin.cpp    | 26 ---------
 .../client/MemoryClientComponentPlugin.h      | 55 -------------------
 .../client/{MemoryReader.cpp => Reader.cpp}   | 16 +++---
 .../armem/client/{MemoryReader.h => Reader.h} |  4 +-
 .../armem/client/ReaderComponentPlugin.cpp    | 21 +++++++
 .../armem/client/ReaderComponentPlugin.h      | 51 +++++++++++++++++
 .../client/{MemoryWriter.cpp => Writer.cpp}   | 14 ++---
 .../armem/client/{MemoryWriter.h => Writer.h} |  4 +-
 .../armem/client/WriterComponentPlugin.cpp    | 21 +++++++
 .../armem/client/WriterComponentPlugin.h      | 51 +++++++++++++++++
 18 files changed, 235 insertions(+), 122 deletions(-)
 create mode 100644 source/RobotAPI/libraries/armem/client/ComponentPlugin.cpp
 create mode 100644 source/RobotAPI/libraries/armem/client/ComponentPlugin.h
 delete mode 100644 source/RobotAPI/libraries/armem/client/MemoryClientComponentPlugin.cpp
 delete mode 100644 source/RobotAPI/libraries/armem/client/MemoryClientComponentPlugin.h
 rename source/RobotAPI/libraries/armem/client/{MemoryReader.cpp => Reader.cpp} (79%)
 rename source/RobotAPI/libraries/armem/client/{MemoryReader.h => Reader.h} (91%)
 create mode 100644 source/RobotAPI/libraries/armem/client/ReaderComponentPlugin.cpp
 create mode 100644 source/RobotAPI/libraries/armem/client/ReaderComponentPlugin.h
 rename source/RobotAPI/libraries/armem/client/{MemoryWriter.cpp => Writer.cpp} (77%)
 rename source/RobotAPI/libraries/armem/client/{MemoryWriter.h => Writer.h} (91%)
 create mode 100644 source/RobotAPI/libraries/armem/client/WriterComponentPlugin.cpp
 create mode 100644 source/RobotAPI/libraries/armem/client/WriterComponentPlugin.h

diff --git a/source/RobotAPI/components/armem/ArMemExampleClient/ArMemExampleClient.cpp b/source/RobotAPI/components/armem/ArMemExampleClient/ArMemExampleClient.cpp
index c591b97c9..0172f1375 100644
--- a/source/RobotAPI/components/armem/ArMemExampleClient/ArMemExampleClient.cpp
+++ b/source/RobotAPI/components/armem/ArMemExampleClient/ArMemExampleClient.cpp
@@ -28,7 +28,6 @@
 #include <RobotAPI/interface/aron.h>
 
 #include <RobotAPI/libraries/armem/component/MemoryRemoteGui.h>
-#include <RobotAPI/libraries/armem/client/MemoryWriter.h>
 #include <RobotAPI/libraries/armem/memory/ice_conversions.h>
 
 #include <RobotAPI/components/armem/ArMemExampleMemory/aron/Primitive.aron.generated.h>
@@ -111,7 +110,7 @@ namespace armarx
             providerID = armem::MemoryID::fromString(result.segmentID);
         }
 
-        armem::MemoryWriter writer(memory);
+        armem::Writer writer(memory);
 
         armem::MemoryID entityID = providerID;
         entityID.entityName = "example_entity";
@@ -280,7 +279,7 @@ namespace armarx
     }
 
 
-    bool ArMemExampleClient::primitives(armem::MemoryWriter& writer)
+    bool ArMemExampleClient::primitives(armem::Writer& writer)
     {
         ARMARX_IMPORTANT << "Adding segment " << "Primitive" << "/" << getName();
 
diff --git a/source/RobotAPI/components/armem/ArMemExampleClient/ArMemExampleClient.h b/source/RobotAPI/components/armem/ArMemExampleClient/ArMemExampleClient.h
index af51519fd..2c97cd15a 100644
--- a/source/RobotAPI/components/armem/ArMemExampleClient/ArMemExampleClient.h
+++ b/source/RobotAPI/components/armem/ArMemExampleClient/ArMemExampleClient.h
@@ -20,21 +20,20 @@
  *             GNU General Public License
  */
 
+
 #pragma once
 
 
+// ArmarX
 #include <ArmarXCore/core/Component.h>
-
 #include <ArmarXCore/interface/observers/ObserverInterface.h>
-
 #include <ArmarXGui/libraries/ArmarXGuiComponentPlugins/LightweightRemoteGuiComponentPlugin.h>
 
-// #include <RobotAPI/libraries/RobotAPIComponentPlugins/ArVizComponentPlugin.h>
-
+// RobotAPI
+//#include <RobotAPI/libraries/RobotAPIComponentPlugins/ArVizComponentPlugin.h>
 #include <RobotAPI/interface/armem/MemoryInterface.h>
 #include <RobotAPI/interface/armem/MemoryNameSystemInterface.h>
-
-#include <RobotAPI/libraries/armem/client/MemoryClientComponentPlugin.h>
+#include <RobotAPI/libraries/armem/client/ComponentPlugin.h>
 #include <RobotAPI/libraries/armem/memory/Memory.h>
 
 
@@ -52,7 +51,6 @@ namespace armarx
     };
 
 
-
     /**
      * @defgroup Component-ArMemExampleClient ArMemExampleClient
      * @ingroup RobotAPI-Components
@@ -66,7 +64,7 @@ namespace armarx
      */
     class ArMemExampleClient :
         virtual public armarx::Component
-        , virtual public armarx::armem::MemoryClientComponentPluginUser
+        , virtual public armarx::armem::client::ComponentPluginUser
         , virtual public LightweightRemoteGuiComponentPluginUser
     {
     public:
@@ -101,7 +99,7 @@ namespace armarx
 
     private:
         // Examples
-        bool primitives(armem::MemoryWriter& writer);
+        bool primitives(armem::Writer& writer);
 
 
     private:
diff --git a/source/RobotAPI/gui-plugins/ArMemMemoryViewer/ArMemMemoryViewerWidgetController.cpp b/source/RobotAPI/gui-plugins/ArMemMemoryViewer/ArMemMemoryViewerWidgetController.cpp
index fcd59af30..f121e160a 100644
--- a/source/RobotAPI/gui-plugins/ArMemMemoryViewer/ArMemMemoryViewerWidgetController.cpp
+++ b/source/RobotAPI/gui-plugins/ArMemMemoryViewer/ArMemMemoryViewerWidgetController.cpp
@@ -142,7 +142,7 @@ namespace armarx
         if (memoryName.size() > 0)
         {
             getProxy(memory, memoryName);
-            memoryReader = armem::MemoryReader(memory);
+            memoryReader = armem::Reader(memory);
         }
         // DebugObserver is optional (check for null on every call)
         if (!debugObserverName.empty())
diff --git a/source/RobotAPI/gui-plugins/ArMemMemoryViewer/ArMemMemoryViewerWidgetController.h b/source/RobotAPI/gui-plugins/ArMemMemoryViewer/ArMemMemoryViewerWidgetController.h
index 36d618adb..aad49aecd 100644
--- a/source/RobotAPI/gui-plugins/ArMemMemoryViewer/ArMemMemoryViewerWidgetController.h
+++ b/source/RobotAPI/gui-plugins/ArMemMemoryViewer/ArMemMemoryViewerWidgetController.h
@@ -33,7 +33,7 @@
 #include <ArmarXCore/core/system/ImportExportComponent.h>
 
 #include <RobotAPI/interface/armem/MemoryInterface.h>
-#include <RobotAPI/libraries/armem/client/MemoryReader.h>
+#include <RobotAPI/libraries/armem/client/Reader.h>
 #include <RobotAPI/libraries/armem_gui/InstanceTreeWidget.h>
 #include <RobotAPI/libraries/armem_gui/MemoryQueryWidget.h>
 #include <RobotAPI/libraries/armem_gui/MemoryTreeWidget.h>
@@ -126,7 +126,7 @@ namespace armarx
 
         std::string memoryName;
         armem::MemoryInterfacePrx memory;
-        armem::MemoryReader memoryReader;
+        armem::Reader memoryReader;
 
         armem::MemoryPtr memoryData;
 
diff --git a/source/RobotAPI/interface/armem.ice b/source/RobotAPI/interface/armem.ice
index 9777fd79d..a01037e52 100644
--- a/source/RobotAPI/interface/armem.ice
+++ b/source/RobotAPI/interface/armem.ice
@@ -3,7 +3,7 @@
 #include <RobotAPI/interface/armem/ReadingInterface.ice>
 #include <RobotAPI/interface/armem/WritingInterface.ice>
 #include <RobotAPI/interface/armem/MemoryInterface.ice>
-#include <RobotAPI/interface/armem/MemoryListenerInterface.h>
+#include <RobotAPI/interface/armem/MemoryListenerInterface.ice>
 
 
 module armarx
diff --git a/source/RobotAPI/libraries/armem/CMakeLists.txt b/source/RobotAPI/libraries/armem/CMakeLists.txt
index da280dd43..d3505babc 100644
--- a/source/RobotAPI/libraries/armem/CMakeLists.txt
+++ b/source/RobotAPI/libraries/armem/CMakeLists.txt
@@ -40,9 +40,11 @@ set(LIB_FILES
     mns/MemoryNameSystemClientPlugin.cpp
     mns/MemoryNameSystemComponentPlugin.cpp
 
-    client/MemoryWriter.cpp
-    client/MemoryReader.cpp
-    client/MemoryClientComponentPlugin.cpp
+    client/ComponentPlugin.cpp
+    client/Reader.cpp
+    client/ReaderComponentPlugin.cpp
+    client/Writer.cpp
+    client/WriterComponentPlugin.cpp
 
     component/IceMemory.cpp
     component/MemoryComponentPlugin.cpp
@@ -83,9 +85,11 @@ set(LIB_HEADERS
     mns/MemoryNameSystemClientPlugin.h
     mns/MemoryNameSystemComponentPlugin.h
 
-    client/MemoryWriter.h
-    client/MemoryReader.h
-    client/MemoryClientComponentPlugin.h
+    client/ComponentPlugin.h
+    client/Reader.h
+    client/ReaderComponentPlugin.h
+    client/Writer.h
+    client/WriterComponentPlugin.h
 
     component/IceMemory.h
     component/MemoryComponentPlugin.h
diff --git a/source/RobotAPI/libraries/armem/client/ComponentPlugin.cpp b/source/RobotAPI/libraries/armem/client/ComponentPlugin.cpp
new file mode 100644
index 000000000..e49e46c15
--- /dev/null
+++ b/source/RobotAPI/libraries/armem/client/ComponentPlugin.cpp
@@ -0,0 +1,14 @@
+#include <RobotAPI/libraries/armem/client/ComponentPlugin.h>
+
+
+// ArmarX
+#include <ArmarXCore/core/exceptions/local/ExpressionException.h>
+
+// RobotAPI
+#include <RobotAPI/libraries/armem/error.h>
+
+
+armarx::armem::client::ComponentPluginUser::ComponentPluginUser()
+{
+    // pass
+}
diff --git a/source/RobotAPI/libraries/armem/client/ComponentPlugin.h b/source/RobotAPI/libraries/armem/client/ComponentPlugin.h
new file mode 100644
index 000000000..da3dc0f5b
--- /dev/null
+++ b/source/RobotAPI/libraries/armem/client/ComponentPlugin.h
@@ -0,0 +1,35 @@
+#pragma once
+
+
+// STD/STL
+#include <mutex>
+
+// ArmarX
+#include <ArmarXCore/core/Component.h>
+
+// RobotAPI
+#include <RobotAPI/interface/armem/MemoryInterface.h>
+#include <RobotAPI/interface/armem/MemoryNameSystemInterface.h>
+#include <RobotAPI/libraries/armem/client/ReaderComponentPlugin.h>
+#include <RobotAPI/libraries/armem/client/WriterComponentPlugin.h>
+#include <RobotAPI/libraries/armem/mns/MemoryNameSystemClientPlugin.h>
+
+
+namespace armarx::armem::client
+{
+
+    /**
+     * @brief Utility for connecting a Memory to Ice.
+     */
+    class ComponentPluginUser :
+        virtual public ReaderComponentPluginUser,
+        virtual public WriterComponentPluginUser
+    {
+
+    public:
+
+        ComponentPluginUser();
+
+    };
+
+}
diff --git a/source/RobotAPI/libraries/armem/client/MemoryClientComponentPlugin.cpp b/source/RobotAPI/libraries/armem/client/MemoryClientComponentPlugin.cpp
deleted file mode 100644
index 1d480535c..000000000
--- a/source/RobotAPI/libraries/armem/client/MemoryClientComponentPlugin.cpp
+++ /dev/null
@@ -1,26 +0,0 @@
-#include "MemoryClientComponentPlugin.h"
-
-#include <ArmarXCore/core/exceptions/local/ExpressionException.h>
-
-#include "../error.h"
-
-
-namespace armarx::armem::plugins
-{
-
-    MemoryClientComponentPlugin::~MemoryClientComponentPlugin()
-    {
-    }
-
-}
-
-
-namespace armarx::armem
-{
-
-    MemoryClientComponentPluginUser::MemoryClientComponentPluginUser()
-    {
-        addPlugin(plugin);
-    }
-
-}
diff --git a/source/RobotAPI/libraries/armem/client/MemoryClientComponentPlugin.h b/source/RobotAPI/libraries/armem/client/MemoryClientComponentPlugin.h
deleted file mode 100644
index 318c08c4c..000000000
--- a/source/RobotAPI/libraries/armem/client/MemoryClientComponentPlugin.h
+++ /dev/null
@@ -1,55 +0,0 @@
-#pragma once
-
-#include <mutex>
-
-#include <ArmarXCore/core/Component.h>
-
-#include <RobotAPI/interface/armem/MemoryInterface.h>
-#include <RobotAPI/interface/armem/MemoryNameSystemInterface.h>
-
-#include "../mns/MemoryNameSystemClientPlugin.h"
-#include "MemoryReader.h"
-#include "MemoryWriter.h"
-
-
-
-namespace armarx::armem::plugins
-{
-
-    class MemoryClientComponentPlugin : public MemoryNameSystemClientPlugin
-    {
-    public:
-
-        using MemoryNameSystemClientPlugin::MemoryNameSystemClientPlugin;
-        virtual ~MemoryClientComponentPlugin() override;
-
-
-    };
-
-}
-
-
-namespace armarx::armem
-{
-
-    /**
-     * @brief Utility for connecting a Memory to Ice.
-     */
-    class MemoryClientComponentPluginUser :
-        virtual public ManagedIceObject
-        , virtual public plugins::MemoryNameSystemClientPluginUser
-    {
-    public:
-
-        MemoryClientComponentPluginUser();
-
-
-    private:
-
-        armem::plugins::MemoryClientComponentPlugin* plugin = nullptr;
-
-
-    };
-
-
-}
diff --git a/source/RobotAPI/libraries/armem/client/MemoryReader.cpp b/source/RobotAPI/libraries/armem/client/Reader.cpp
similarity index 79%
rename from source/RobotAPI/libraries/armem/client/MemoryReader.cpp
rename to source/RobotAPI/libraries/armem/client/Reader.cpp
index c14180fd4..068b910cb 100644
--- a/source/RobotAPI/libraries/armem/client/MemoryReader.cpp
+++ b/source/RobotAPI/libraries/armem/client/Reader.cpp
@@ -1,4 +1,4 @@
-#include "MemoryReader.h"
+#include "Reader.h"
 
 #include <ArmarXCore/core/logging/Logging.h>
 
@@ -8,12 +8,12 @@
 namespace armarx::armem
 {
 
-    MemoryReader::MemoryReader(ReadingInterfacePrx memory) : memory(memory)
+    Reader::Reader(ReadingInterfacePrx memory) : memory(memory)
     {
     }
 
 
-    MemoryPtr MemoryReader::getLatestSnapshots()
+    MemoryPtr Reader::getLatestSnapshots()
     {
         armem::query::EntityQueryPtr entityQuery = new armem::query::entity::Single();
         armem::query::ProviderSegmentQueryPtr providerQuery = new armem::query::provider::All({entityQuery});
@@ -23,7 +23,7 @@ namespace armarx::armem
         return queryToCpp(memoryQuery);
     }
 
-    MemoryPtr MemoryReader::getAllData()
+    MemoryPtr Reader::getAllData()
     {
         armem::query::EntityQueryPtr entityQuery = new armem::query::entity::All();
         armem::query::ProviderSegmentQueryPtr providerQuery = new armem::query::provider::All({entityQuery});
@@ -33,12 +33,12 @@ namespace armarx::armem
         return queryToCpp(memoryQuery);
     }
 
-    data::MemoryPtr MemoryReader::query(query::MemoryQueryPtr query)
+    data::MemoryPtr Reader::query(query::MemoryQueryPtr query)
     {
         return this->query(query::MemoryQuerySeq{query});
     }
 
-    data::MemoryPtr MemoryReader::query(query::MemoryQuerySeq queries)
+    data::MemoryPtr Reader::query(query::MemoryQuerySeq queries)
     {
         try
         {
@@ -59,12 +59,12 @@ namespace armarx::armem
         return nullptr;
     }
 
-    MemoryPtr MemoryReader::queryToCpp(query::MemoryQueryPtr query)
+    MemoryPtr Reader::queryToCpp(query::MemoryQueryPtr query)
     {
         return armem::fromIce<armem::MemoryPtr>(this->query(query));
     }
 
-    MemoryPtr MemoryReader::queryToCpp(query::MemoryQuerySeq queries)
+    MemoryPtr Reader::queryToCpp(query::MemoryQuerySeq queries)
     {
         return armem::fromIce<armem::MemoryPtr>(this->query(queries));
     }
diff --git a/source/RobotAPI/libraries/armem/client/MemoryReader.h b/source/RobotAPI/libraries/armem/client/Reader.h
similarity index 91%
rename from source/RobotAPI/libraries/armem/client/MemoryReader.h
rename to source/RobotAPI/libraries/armem/client/Reader.h
index 240c2a3ef..3198671f3 100644
--- a/source/RobotAPI/libraries/armem/client/MemoryReader.h
+++ b/source/RobotAPI/libraries/armem/client/Reader.h
@@ -12,7 +12,7 @@ namespace armarx::armem
     /**
      * @brief Helps sending data to a memory.
      */
-    class MemoryReader
+    class Reader
     {
     public:
 
@@ -20,7 +20,7 @@ namespace armarx::armem
          * @brief Construct a memory reader.
          * @param memory The memory proxy.
          */
-        MemoryReader(ReadingInterfacePrx memory = nullptr);
+        Reader(ReadingInterfacePrx memory = nullptr);
 
 
         MemoryPtr getLatestSnapshots();
diff --git a/source/RobotAPI/libraries/armem/client/ReaderComponentPlugin.cpp b/source/RobotAPI/libraries/armem/client/ReaderComponentPlugin.cpp
new file mode 100644
index 000000000..0d9bd7d76
--- /dev/null
+++ b/source/RobotAPI/libraries/armem/client/ReaderComponentPlugin.cpp
@@ -0,0 +1,21 @@
+#include <RobotAPI/libraries/armem/client/ReaderComponentPlugin.h>
+
+
+// ArmarX
+#include <ArmarXCore/core/exceptions/local/ExpressionException.h>
+
+// RobotAPI
+#include <RobotAPI/libraries/armem/error.h>
+
+
+armarx::armem::client::ReaderComponentPlugin::~ReaderComponentPlugin()
+{
+    // pass
+}
+
+
+armarx::armem::client::ReaderComponentPluginUser::ReaderComponentPluginUser() :
+    memoryReader{nullptr}
+{
+    addPlugin(plugin);
+}
diff --git a/source/RobotAPI/libraries/armem/client/ReaderComponentPlugin.h b/source/RobotAPI/libraries/armem/client/ReaderComponentPlugin.h
new file mode 100644
index 000000000..b67727b5a
--- /dev/null
+++ b/source/RobotAPI/libraries/armem/client/ReaderComponentPlugin.h
@@ -0,0 +1,51 @@
+#pragma once
+
+
+// STD/STL
+#include <mutex>
+
+// ArmarX
+#include <ArmarXCore/core/Component.h>
+
+// RobotAPI
+#include <RobotAPI/interface/armem/MemoryInterface.h>
+#include <RobotAPI/interface/armem/MemoryNameSystemInterface.h>
+#include <RobotAPI/libraries/armem/client/Reader.h>
+#include <RobotAPI/libraries/armem/mns/MemoryNameSystemClientPlugin.h>
+
+
+namespace armarx::armem::client
+{
+
+    class ReaderComponentPlugin :
+        public plugins::MemoryNameSystemClientPlugin
+    {
+
+    public:
+
+        using plugins::MemoryNameSystemClientPlugin::MemoryNameSystemClientPlugin;
+        virtual ~ReaderComponentPlugin() override;
+
+    };
+
+
+    class ReaderComponentPluginUser :
+        virtual public ManagedIceObject,
+        virtual public plugins::MemoryNameSystemClientPluginUser
+    {
+
+    public:
+
+        ReaderComponentPluginUser();
+
+    protected:
+
+        Reader memoryReader;
+
+    private:
+
+        ReaderComponentPlugin* plugin = nullptr;
+
+    };
+
+}
diff --git a/source/RobotAPI/libraries/armem/client/MemoryWriter.cpp b/source/RobotAPI/libraries/armem/client/Writer.cpp
similarity index 77%
rename from source/RobotAPI/libraries/armem/client/MemoryWriter.cpp
rename to source/RobotAPI/libraries/armem/client/Writer.cpp
index 03025a45d..3d9fb1b81 100644
--- a/source/RobotAPI/libraries/armem/client/MemoryWriter.cpp
+++ b/source/RobotAPI/libraries/armem/client/Writer.cpp
@@ -1,4 +1,4 @@
-#include "MemoryWriter.h"
+#include "Writer.h"
 
 #include <ArmarXCore/core/exceptions/local/ExpressionException.h>
 
@@ -8,11 +8,11 @@
 namespace armarx::armem
 {
 
-    MemoryWriter::MemoryWriter(WritingInterfacePrx memory) : memory(memory)
+    Writer::Writer(WritingInterfacePrx memory) : memory(memory)
     {
     }
 
-    data::AddSegmentResult MemoryWriter::addSegment(const std::string& coreSegmentName, const std::string& providerSegmentName)
+    data::AddSegmentResult Writer::addSegment(const std::string& coreSegmentName, const std::string& providerSegmentName)
     {
         data::AddSegmentInput input;
         input.coreSegmentName = coreSegmentName;
@@ -20,14 +20,14 @@ namespace armarx::armem
         return addSegment(input);
     }
 
-    data::AddSegmentResult MemoryWriter::addSegment(const data::AddSegmentInput& input)
+    data::AddSegmentResult Writer::addSegment(const data::AddSegmentInput& input)
     {
         data::AddSegmentsResult results = addSegments({input});
         ARMARX_CHECK_EQUAL(results.size(), 1);
         return results.at(0);
     }
 
-    data::AddSegmentsResult MemoryWriter::addSegments(const data::AddSegmentsInput& inputs)
+    data::AddSegmentsResult Writer::addSegments(const data::AddSegmentsInput& inputs)
     {
         ARMARX_CHECK_NOT_NULL(memory);
         data::AddSegmentsResult results = memory->addSegments(inputs);
@@ -36,7 +36,7 @@ namespace armarx::armem
     }
 
 
-    CommitResult MemoryWriter::commit(Commit commit)
+    CommitResult Writer::commit(Commit commit)
     {
         ARMARX_CHECK_NOT_NULL(memory);
 
@@ -74,7 +74,7 @@ namespace armarx::armem
     }
 
 
-    EntityUpdateResult MemoryWriter::commit(const EntityUpdate& update)
+    EntityUpdateResult Writer::commit(const EntityUpdate& update)
     {
         armem::Commit commit;
         commit.updates.push_back(update);
diff --git a/source/RobotAPI/libraries/armem/client/MemoryWriter.h b/source/RobotAPI/libraries/armem/client/Writer.h
similarity index 91%
rename from source/RobotAPI/libraries/armem/client/MemoryWriter.h
rename to source/RobotAPI/libraries/armem/client/Writer.h
index eda2d506e..f2f493d4a 100644
--- a/source/RobotAPI/libraries/armem/client/MemoryWriter.h
+++ b/source/RobotAPI/libraries/armem/client/Writer.h
@@ -11,7 +11,7 @@ namespace armarx::armem
     /**
      * @brief Helps sending data to a memory.
      */
-    class MemoryWriter
+    class Writer
     {
     public:
 
@@ -19,7 +19,7 @@ namespace armarx::armem
          * @brief Construct a memory writer.
          * @param memory The memory proxy.
          */
-        MemoryWriter(WritingInterfacePrx memory = nullptr);
+        Writer(WritingInterfacePrx memory = nullptr);
 
 
         data::AddSegmentResult addSegment(const std::string& coreSegmentName, const std::string& providerSegmentName);
diff --git a/source/RobotAPI/libraries/armem/client/WriterComponentPlugin.cpp b/source/RobotAPI/libraries/armem/client/WriterComponentPlugin.cpp
new file mode 100644
index 000000000..3a4885596
--- /dev/null
+++ b/source/RobotAPI/libraries/armem/client/WriterComponentPlugin.cpp
@@ -0,0 +1,21 @@
+#include <RobotAPI/libraries/armem/client/WriterComponentPlugin.h>
+
+
+// ArmarX
+#include <ArmarXCore/core/exceptions/local/ExpressionException.h>
+
+// RobotAPI
+#include <RobotAPI/libraries/armem/error.h>
+
+
+armarx::armem::client::WriterComponentPlugin::~WriterComponentPlugin()
+{
+    // pass
+}
+
+
+armarx::armem::client::WriterComponentPluginUser::WriterComponentPluginUser() :
+    memoryWriter{nullptr}
+{
+    addPlugin(plugin);
+}
diff --git a/source/RobotAPI/libraries/armem/client/WriterComponentPlugin.h b/source/RobotAPI/libraries/armem/client/WriterComponentPlugin.h
new file mode 100644
index 000000000..179f3227c
--- /dev/null
+++ b/source/RobotAPI/libraries/armem/client/WriterComponentPlugin.h
@@ -0,0 +1,51 @@
+#pragma once
+
+
+// STD/STL
+#include <mutex>
+
+// ArmarX
+#include <ArmarXCore/core/Component.h>
+
+// RobotAPI
+#include <RobotAPI/interface/armem/MemoryInterface.h>
+#include <RobotAPI/interface/armem/MemoryNameSystemInterface.h>
+#include <RobotAPI/libraries/armem/client/Writer.h>
+#include <RobotAPI/libraries/armem/mns/MemoryNameSystemClientPlugin.h>
+
+
+namespace armarx::armem::client
+{
+
+    class WriterComponentPlugin :
+        public plugins::MemoryNameSystemClientPlugin
+    {
+
+    public:
+
+        using plugins::MemoryNameSystemClientPlugin::MemoryNameSystemClientPlugin;
+        virtual ~WriterComponentPlugin() override;
+
+    };
+
+
+    class WriterComponentPluginUser :
+        virtual public ManagedIceObject,
+        virtual public plugins::MemoryNameSystemClientPluginUser
+    {
+
+    public:
+
+        WriterComponentPluginUser();
+
+    protected:
+
+        Writer memoryWriter;
+
+    private:
+
+        WriterComponentPlugin* plugin = nullptr;
+
+    };
+
+}
-- 
GitLab