From 04bce89fb74fb29c6e00f0fc49589cbd4b85dd00 Mon Sep 17 00:00:00 2001
From: Rainer Kartmann <rainer.kartmann@kit.edu>
Date: Thu, 19 Aug 2021 11:35:44 +0200
Subject: [PATCH] Use MemoryIDs instead of strings

---
 .../GraphImportExport/GraphImportExport.cpp   | 66 +++++++++----------
 .../GraphImportExport/GraphImportExport.h     | 19 +++---
 source/armarx/navigation/graph/CMakeLists.txt |  1 +
 source/armarx/navigation/graph/constants.cpp  |  4 +-
 source/armarx/navigation/graph/constants.h    |  4 +-
 .../armarx/navigation/location/CMakeLists.txt |  3 +
 .../armarx/navigation/location/constants.cpp  |  4 +-
 source/armarx/navigation/location/constants.h |  4 +-
 8 files changed, 56 insertions(+), 49 deletions(-)

diff --git a/source/armarx/navigation/components/GraphImportExport/GraphImportExport.cpp b/source/armarx/navigation/components/GraphImportExport/GraphImportExport.cpp
index 14b6704b..96a69c23 100644
--- a/source/armarx/navigation/components/GraphImportExport/GraphImportExport.cpp
+++ b/source/armarx/navigation/components/GraphImportExport/GraphImportExport.cpp
@@ -26,6 +26,7 @@
 
 #include <armarx/navigation/location/aron/Location.aron.generated.h>
 #include <armarx/navigation/location/constants.h>
+#include <armarx/navigation/graph/Writer.h>
 
 #include <armarx/navigation/graph/aron/Graph.aron.generated.h>
 #include <armarx/navigation/graph/constants.h>
@@ -50,9 +51,8 @@ namespace armarx::nav
 
     GraphImportExport::GraphImportExport()
     {
-        properties.memoryName = "Navigation";
-        properties.locationCoreSegmentName = loc::coreSegmentName;
-        properties.graphCoreSegmentName = graph::coreSegmentName;
+        properties.locationCoreSegmentID = loc::coreSegmentID;
+        properties.graphCoreSegmentID = graph::coreSegmentID;
     }
 
 
@@ -83,7 +83,9 @@ namespace armarx::nav
         {
             proxies.graphSegment = proxies.priorKnowledge->getGraphSegment();
         }
-        proxies.navigationWriter = memoryNameSystem.useWriter(armem::MemoryID(properties.memoryName));
+        proxies.locationWriter = memoryNameSystem.useWriter(properties.locationCoreSegmentID);
+        proxies.graphWriter = memoryNameSystem.useWriter(properties.graphCoreSegmentID);
+
 
         // Setup and start the remote GUI.
         refreshScenes();
@@ -183,11 +185,11 @@ namespace armarx::nav
 
         if (tab.locationsClearArMemButton.wasClicked())
         {
-            clearArMemProviderSegment(getLocationProviderSegmentID());
+            clearArMemProviderSegment(proxies.locationWriter, getLocationProviderSegmentID());
         }
         if (tab.graphClearArMemButton.wasClicked())
         {
-            clearArMemProviderSegment(getGraphProviderSegmentID());
+            clearArMemProviderSegment(proxies.graphWriter, getGraphProviderSegmentID());
         }
     }
 
@@ -199,21 +201,6 @@ namespace armarx::nav
     }
 
 
-    void GraphImportExport::clearArMemProviderSegment(const armem::MemoryID& providerSegmentID)
-    {
-        const bool clearWhenExists = true;
-        auto result = proxies.navigationWriter.addSegment(providerSegmentID, clearWhenExists);
-        if (result.success)
-        {
-            ARMARX_IMPORTANT << "Cleared ArMem provider segment " << providerSegmentID << ".";
-        }
-        else
-        {
-            ARMARX_WARNING << result.errorMessage;
-        }
-    }
-
-
     void GraphImportExport::locationsMemoryxToArmem(const std::string& sceneName)
     {
         const armem::Time time = armem::Time::now();
@@ -260,7 +247,7 @@ namespace armarx::nav
 
         if (not tab.dryRun.getValue())
         {
-            armem::CommitResult result = proxies.navigationWriter.commit(commit);
+            armem::CommitResult result = proxies.locationWriter.commit(commit);
             if (result.allSuccess())
             {
                 ARMARX_IMPORTANT << "Successfully exported " << result.results.size() << " locations from MemoryX to ArMem.";
@@ -289,11 +276,6 @@ namespace armarx::nav
         memoryx::GraphNodeBaseList graphNodes = proxies.graphSegment->getNodesByScene(sceneName);
         nav::graph::Graph graph = toArmemGraph(graphNodes);
 
-        // Build ARON Graph
-        nav::graph::arondto::Graph aron;
-        toAron(aron, graph);
-
-
         if (tab.visuEnabled.getValue())
         {
             nav::graph::GraphVisu visu;
@@ -304,6 +286,9 @@ namespace armarx::nav
             arviz.commit(layer);
         }
 
+        // Build ARON Graph
+        nav::graph::arondto::Graph aron;
+        toAron(aron, graph);
 
         // Build commit
         const armem::Time time = armem::Time::now();
@@ -314,7 +299,7 @@ namespace armarx::nav
 
         if (not tab.dryRun.getValue())
         {
-            armem::EntityUpdateResult result = proxies.navigationWriter.commit(update);
+            armem::EntityUpdateResult result = proxies.graphWriter.commit(update);
             if (result.success)
             {
                 ARMARX_IMPORTANT << "Successfully exported graph '" << sceneName << "' from MemoryX to ArMem.";
@@ -338,20 +323,33 @@ namespace armarx::nav
     }
 
 
+    void GraphImportExport::clearArMemProviderSegment(armem::client::Writer& writer, const armem::MemoryID& providerSegmentID)
+    {
+        const bool clearWhenExists = true;
+        auto result = writer.addSegment(providerSegmentID, clearWhenExists);
+        if (result.success)
+        {
+            ARMARX_IMPORTANT << "Cleared ArMem provider segment " << providerSegmentID << ".";
+        }
+        else
+        {
+            ARMARX_WARNING << result.errorMessage;
+        }
+    }
+
+
     armem::MemoryID GraphImportExport::getLocationProviderSegmentID()
     {
-        return armem::MemoryID(properties.memoryName,
-                               properties.locationCoreSegmentName,
-                               tab.providerSegmentLine.getValue());
+        return properties.locationCoreSegmentID.withProviderSegmentName(tab.providerSegmentLine.getValue());
     }
 
+
     armem::MemoryID GraphImportExport::getGraphProviderSegmentID()
     {
-        return armem::MemoryID(properties.memoryName,
-                               properties.graphCoreSegmentName,
-                               tab.providerSegmentLine.getValue());
+        return properties.graphCoreSegmentID.withProviderSegmentName(tab.providerSegmentLine.getValue());
     }
 
+
     nav::graph::Graph GraphImportExport::toArmemGraph(const memoryx::GraphNodeBaseList& graphNodes)
     {
         nav::graph::Graph graph;
diff --git a/source/armarx/navigation/components/GraphImportExport/GraphImportExport.h b/source/armarx/navigation/components/GraphImportExport/GraphImportExport.h
index efd4aed1..949ad673 100644
--- a/source/armarx/navigation/components/GraphImportExport/GraphImportExport.h
+++ b/source/armarx/navigation/components/GraphImportExport/GraphImportExport.h
@@ -24,12 +24,13 @@
 
 #include <armarx/navigation/graph/forward_declarations.h>
 
-#include <MemoryX/interface/components/PriorKnowledgeInterface.h>
+#include <MemoryX/interface/memorytypes/MemoryEntities.h>
 #include <MemoryX/interface/memorytypes/MemorySegments.h>
+#include <MemoryX/interface/components/PriorKnowledgeInterface.h>
 #include <MemoryX/interface/components/GraphNodePoseResolverInterface.h>
-#include <MemoryX/interface/memorytypes/MemoryEntities.h>
 
-#include <RobotAPI/libraries/armem/client/ComponentPlugin.h>
+#include <RobotAPI/libraries/armem/client/MemoryNameSystemComponentPlugin.h>
+#include <RobotAPI/libraries/armem/client/Writer.h>
 #include <RobotAPI/libraries/RobotAPIComponentPlugins/ArVizComponentPlugin.h>
 
 #include <ArmarXGui/libraries/ArmarXGuiComponentPlugins/LightweightRemoteGuiComponentPlugin.h>
@@ -57,7 +58,7 @@ namespace armarx::nav
         , virtual public armarx::DebugObserverComponentPluginUser
         , virtual public armarx::LightweightRemoteGuiComponentPluginUser
         , virtual public armarx::ArVizComponentPluginUser
-        , virtual public armarx::armem::client::ComponentPluginUser
+        , virtual public armarx::armem::client::MemoryNameSystemComponentPluginUser
     {
     public:
 
@@ -105,7 +106,7 @@ namespace armarx::nav
         void graphMemoryxToArmem(const std::string& sceneName);
         void graphArmemToMemoryx(const std::string& sceneName);
 
-        void clearArMemProviderSegment(const armem::MemoryID& providerSegmentID);
+        void clearArMemProviderSegment(armem::client::Writer& writer, const armem::MemoryID& providerSegmentID);
 
         armem::MemoryID getLocationProviderSegmentID();
         armem::MemoryID getGraphProviderSegmentID();
@@ -121,7 +122,8 @@ namespace armarx::nav
             memoryx::GraphNodePoseResolverInterfacePrx graphNodePoseResolver;
             memoryx::GraphMemorySegmentBasePrx graphSegment;
 
-            armem::client::Writer navigationWriter;
+            armem::client::Writer locationWriter;
+            armem::client::Writer graphWriter;
         };
         Proxies proxies;
 
@@ -129,9 +131,8 @@ namespace armarx::nav
         /// Properties shown in the Scenario GUI.
         struct Properties
         {
-            std::string memoryName;
-            std::string locationCoreSegmentName;
-            std::string graphCoreSegmentName;
+            armem::MemoryID locationCoreSegmentID;
+            armem::MemoryID graphCoreSegmentID;
         };
         Properties properties;
 
diff --git a/source/armarx/navigation/graph/CMakeLists.txt b/source/armarx/navigation/graph/CMakeLists.txt
index 530fe93e..a53eb52b 100644
--- a/source/armarx/navigation/graph/CMakeLists.txt
+++ b/source/armarx/navigation/graph/CMakeLists.txt
@@ -12,6 +12,7 @@ armarx_add_library(
 
         # RobotAPI
         aron
+        armem
 
     SOURCES
         constants.cpp
diff --git a/source/armarx/navigation/graph/constants.cpp b/source/armarx/navigation/graph/constants.cpp
index 543952ee..f862be9c 100644
--- a/source/armarx/navigation/graph/constants.cpp
+++ b/source/armarx/navigation/graph/constants.cpp
@@ -1,9 +1,11 @@
 #include "constants.h"
 
+#include <RobotAPI/libraries/armem/core/MemoryID.h>
+
 
 namespace armarx::nav
 {
 
-    const std::string graph::coreSegmentName = "Graph";
+    const armem::MemoryID graph::coreSegmentID { "Navigation", "Graph" };
 
 }
diff --git a/source/armarx/navigation/graph/constants.h b/source/armarx/navigation/graph/constants.h
index 7e518c7e..ccb1cc7e 100644
--- a/source/armarx/navigation/graph/constants.h
+++ b/source/armarx/navigation/graph/constants.h
@@ -21,12 +21,12 @@
 
 #pragma once
 
-#include <string>
+#include <RobotAPI/libraries/armem/core/forward_declarations.h>
 
 
 namespace armarx::nav::graph
 {
 
-    extern const std::string coreSegmentName;
+    extern const armem::MemoryID coreSegmentID;
 
 }
diff --git a/source/armarx/navigation/location/CMakeLists.txt b/source/armarx/navigation/location/CMakeLists.txt
index a23eb4a2..675377bd 100644
--- a/source/armarx/navigation/location/CMakeLists.txt
+++ b/source/armarx/navigation/location/CMakeLists.txt
@@ -9,6 +9,9 @@ armarx_add_library(
         ArmarXCoreInterfaces 
         ArmarXCore
         # ${ProjectName}Libraries
+
+        armem
+
     SOURCES
         constants.cpp
     HEADERS
diff --git a/source/armarx/navigation/location/constants.cpp b/source/armarx/navigation/location/constants.cpp
index 4a9a4ca4..33b2bc98 100644
--- a/source/armarx/navigation/location/constants.cpp
+++ b/source/armarx/navigation/location/constants.cpp
@@ -1,9 +1,11 @@
 #include "constants.h"
 
+#include <RobotAPI/libraries/armem/core/MemoryID.h>
+
 
 namespace armarx::nav
 {
 
-    const std::string loc::coreSegmentName = "Location";
+    const armem::MemoryID loc::coreSegmentID  { "Navigation", "Location" };
 
 }
diff --git a/source/armarx/navigation/location/constants.h b/source/armarx/navigation/location/constants.h
index 31d558d0..ac5f34ef 100644
--- a/source/armarx/navigation/location/constants.h
+++ b/source/armarx/navigation/location/constants.h
@@ -21,12 +21,12 @@
 
 #pragma once
 
-#include <string>
+#include <RobotAPI/libraries/armem/core/forward_declarations.h>
 
 
 namespace armarx::nav::loc
 {
 
-    extern const std::string coreSegmentName;
+    extern const armem::MemoryID coreSegmentID;
 
 }
-- 
GitLab