From 557762a3602b3561568e2e99f27bb8f7e2ceb685 Mon Sep 17 00:00:00 2001
From: "fabian.peller-konrad@kit.edu" <fabian.peller-konrad@kit.edu>
Date: Wed, 13 Jan 2021 14:30:10 +0100
Subject: [PATCH] added wrapper around export

---
 .../armem/ltm/io/DiskWriter/DiskWriter.h      | 36 ++++++++----
 .../NlohmannJSONDiskWriter.cpp                |  4 +-
 .../NlohmannJSONDiskWriter.h                  |  4 +-
 .../datanavigator/AronDataNavigator.h         | 55 +++++++++++++++++++
 .../datanavigator/AronDictDataNavigator.cpp   |  2 +
 .../datanavigator/AronDictDataNavigator.h     |  2 +-
 .../datanavigator/AronListDataNavigator.cpp   |  2 +
 .../datanavigator/AronListDataNavigator.h     |  2 +-
 .../AronNDArrayDataNavigator.cpp              |  2 +
 .../datanavigator/AronNDArrayDataNavigator.h  |  2 +-
 .../AronPrimitiveDataNavigator.cpp            |  2 +
 .../AronPrimitiveDataNavigator.h              |  2 +-
 12 files changed, 95 insertions(+), 20 deletions(-)

diff --git a/source/RobotAPI/libraries/armem/ltm/io/DiskWriter/DiskWriter.h b/source/RobotAPI/libraries/armem/ltm/io/DiskWriter/DiskWriter.h
index ee8485cc9..4cbd3f01a 100644
--- a/source/RobotAPI/libraries/armem/ltm/io/DiskWriter/DiskWriter.h
+++ b/source/RobotAPI/libraries/armem/ltm/io/DiskWriter/DiskWriter.h
@@ -30,8 +30,8 @@
 
 // ArmarX
 #include <RobotAPI/interface/aron.h>
-#include <RobotAPI/libraries/aron/aroncore/navigators/datanavigator/AronDataNavigator.h>
-#include <RobotAPI/libraries/aron/aroncore/navigators/typenavigator/AronTypeNavigator.h>
+#include <RobotAPI/libraries/aron/aroncore/navigators/datanavigator/AronAllDataNavigators.h>
+#include <RobotAPI/libraries/aron/aroncore/navigators/typenavigator/AronAllTypeNavigators.h>
 #include <RobotAPI/libraries/aron/aroncore/io/AronDataIO/LegacyAronDataWriter/LegacyAronDataWriter.h>
 #include <RobotAPI/libraries/aron/aroncore/io/AronDataIO/AronDataWriter.h>
 //#include <RobotAPI/libraries/aron/aroncore/io/AronTypeIO/
@@ -62,12 +62,12 @@ namespace armarx::armem
                 DiskWriter(const std::string& r) :
                     rootPath(r)
                 {
-                    if(!std::filesystem::exists(rootPath))
+                    if (!std::filesystem::exists(rootPath))
                     {
                         std::filesystem::create_directory(rootPath);
                     }
 
-                    if(!std::filesystem::is_directory(rootPath))
+                    if (!std::filesystem::is_directory(rootPath))
                     {
                         throw LocalException("The Path is not valid. It points to a file instead of a folder!");
                     }
@@ -95,12 +95,13 @@ namespace armarx::armem
                                     for (unsigned int i = 0; i < entitySnapshot->instances.size(); ++i)
                                     {
                                         std::filesystem::path entityElementPath = createEntityElementPath(coreKey, providerKey, entityKey, entityHistoryTimestamp, i);
-                                        if(!entityElementPathExists(entityElementPath))
+                                        if (!entityElementPathExists(entityElementPath))
                                         {
                                             std::ofstream ofs;
                                             ofs.open(entityElementPath);
 
-                                            ofs << getEntityAsString(entitySnapshot->instances[i]);
+
+                                            ofs << getDataAsString(wrapData(entitySnapshot->instances[i]));
                                             ofs.close();
                                         }
                                         // check content if file already existent?
@@ -113,7 +114,20 @@ namespace armarx::armem
                 }
 
             protected:
-                virtual std::string getEntityAsString(const EntityInstancePtr&) = 0;
+                aron::datanavigator::AronDictDataNavigatorPtr wrapData(const EntityInstancePtr& e) const
+                {
+                    aron::datanavigator::AronDictDataNavigatorPtr dataWrapped(new aron::datanavigator::AronDictDataNavigator());
+                    dataWrapped->addElement("instanceData", e->data());
+
+                    aron::datanavigator::AronLongDataNavigatorPtr timeWrapped(new aron::datanavigator::AronLongDataNavigator());
+                    timeWrapped->setValue(Time::now().toMilliSeconds());
+                    dataWrapped->addElement("timeWrapped", timeWrapped);
+
+                    // TODO add more metadata
+                    return dataWrapped;
+                }
+
+                virtual std::string getDataAsString(const aron::datanavigator::AronDictDataNavigatorPtr&) = 0;
 
                 std::filesystem::path createCoreSegmentPath(const std::string& name) const
                 {
@@ -150,7 +164,7 @@ namespace armarx::armem
                 }
                 bool ensureCoreSegmentPathExists(const std::filesystem::path& p) const
                 {
-                    if(!std::filesystem::exists(p))
+                    if (!std::filesystem::exists(p))
                     {
                         return std::filesystem::create_directory(p);
                     }
@@ -170,7 +184,7 @@ namespace armarx::armem
                 }
                 bool ensureProviderSegmentPathExists(const std::filesystem::path& p) const
                 {
-                    if(!std::filesystem::exists(p))
+                    if (!std::filesystem::exists(p))
                     {
                         return std::filesystem::create_directory(p);
                     }
@@ -190,7 +204,7 @@ namespace armarx::armem
                 }
                 bool ensureEntityPathExists(const std::filesystem::path& p) const
                 {
-                    if(!std::filesystem::exists(p))
+                    if (!std::filesystem::exists(p))
                     {
                         return std::filesystem::create_directory(p);
                     }
@@ -210,7 +224,7 @@ namespace armarx::armem
                 }
                 bool ensureTimestampPathExists(const std::filesystem::path& p) const
                 {
-                    if(!std::filesystem::exists(p))
+                    if (!std::filesystem::exists(p))
                     {
                         return std::filesystem::create_directory(p);
                     }
diff --git a/source/RobotAPI/libraries/armem/ltm/io/DiskWriter/NlohmannJSONDiskWriter/NlohmannJSONDiskWriter.cpp b/source/RobotAPI/libraries/armem/ltm/io/DiskWriter/NlohmannJSONDiskWriter/NlohmannJSONDiskWriter.cpp
index 39fc7877e..62ff8d75f 100644
--- a/source/RobotAPI/libraries/armem/ltm/io/DiskWriter/NlohmannJSONDiskWriter/NlohmannJSONDiskWriter.cpp
+++ b/source/RobotAPI/libraries/armem/ltm/io/DiskWriter/NlohmannJSONDiskWriter/NlohmannJSONDiskWriter.cpp
@@ -8,10 +8,8 @@ namespace armarx::armem::ltm::io
     {
     }
 
-    std::string NlohmannJSONDiskWriter::getEntityAsString(const EntityInstancePtr& i)
+    std::string NlohmannJSONDiskWriter::getDataAsString(const aron::datanavigator::AronDictDataNavigatorPtr& aronDataNav)
     {
-        const aron::datanavigator::AronDataNavigatorPtr aronDataNav = i->data();
-
         aron::io::AronDataNlohmannJSONWriter dataWriter;
         aron::io::LegacyAronDataWriter::SetupWriterFromAronDataPtr(dataWriter, aronDataNav->getResult());
         return dataWriter.getResult().dump(4);
diff --git a/source/RobotAPI/libraries/armem/ltm/io/DiskWriter/NlohmannJSONDiskWriter/NlohmannJSONDiskWriter.h b/source/RobotAPI/libraries/armem/ltm/io/DiskWriter/NlohmannJSONDiskWriter/NlohmannJSONDiskWriter.h
index 1daac1f11..c2c2ed9c4 100644
--- a/source/RobotAPI/libraries/armem/ltm/io/DiskWriter/NlohmannJSONDiskWriter/NlohmannJSONDiskWriter.h
+++ b/source/RobotAPI/libraries/armem/ltm/io/DiskWriter/NlohmannJSONDiskWriter/NlohmannJSONDiskWriter.h
@@ -42,13 +42,13 @@ namespace armarx::armem
             typedef std::shared_ptr<NlohmannJSONDiskWriter> NlohmannJSONDiskWriterPtr;
 
             class NlohmannJSONDiskWriter :
-                    virtual public DiskWriter
+                virtual public DiskWriter
             {
             public:
                 NlohmannJSONDiskWriter() = delete;
                 NlohmannJSONDiskWriter(const std::string& rootPath);
 
-                virtual std::string getEntityAsString(const EntityInstancePtr&) override;
+                virtual std::string getDataAsString(const aron::datanavigator::AronDictDataNavigatorPtr&) override;
             };
         }
     }
diff --git a/source/RobotAPI/libraries/aron/aroncore/navigators/datanavigator/AronDataNavigator.h b/source/RobotAPI/libraries/aron/aroncore/navigators/datanavigator/AronDataNavigator.h
index c14fede04..08f001f7e 100644
--- a/source/RobotAPI/libraries/aron/aroncore/navigators/datanavigator/AronDataNavigator.h
+++ b/source/RobotAPI/libraries/aron/aroncore/navigators/datanavigator/AronDataNavigator.h
@@ -86,6 +86,61 @@ namespace armarx
             private:
                 static const AronDataNavigatorFactoryPtr FACTORY;
             };
+
+            class AronContainerDataNavigator;
+            typedef std::shared_ptr<AronContainerDataNavigator> AronContainerDataNavigatorPtr;
+
+            class AronContainerDataNavigator :
+                virtual public AronDataNavigator
+            {
+            public:
+                using PointerType = AronContainerDataNavigatorPtr;
+
+                // constructors
+                AronContainerDataNavigator() =  delete;
+                AronContainerDataNavigator(const AronDataDescriptor& d, const AronPath& p = AronPath()) :
+                    AronDataNavigator(d, p)
+                {
+
+                }
+            };
+
+            class AronComplexDataNavigator;
+            typedef std::shared_ptr<AronComplexDataNavigator> AronComplexDataNavigatorPtr;
+
+            class AronComplexDataNavigator :
+                virtual public AronDataNavigator
+            {
+            public:
+                using PointerType = AronComplexDataNavigatorPtr;
+
+                // constructors
+                AronComplexDataNavigator() =  delete;
+                AronComplexDataNavigator(const AronDataDescriptor& d, const AronPath& p = AronPath()) :
+                    AronDataNavigator(d, p)
+                {
+
+                }
+            };
+
+            class AronPrimitiveDataNavigator;
+            typedef std::shared_ptr<AronPrimitiveDataNavigator> AronPrimitiveDataNavigatorPtr;
+
+            class AronPrimitiveDataNavigator :
+                virtual public AronDataNavigator
+            {
+            public:
+                using PointerType = AronPrimitiveDataNavigatorPtr;
+
+                // constructors
+                AronPrimitiveDataNavigator() =  delete;
+                AronPrimitiveDataNavigator(const AronDataDescriptor& d, const AronPath& p = AronPath()) :
+                    AronDataNavigator(d, p)
+                {
+
+                }
+            };
+
         }
     }
 }
diff --git a/source/RobotAPI/libraries/aron/aroncore/navigators/datanavigator/AronDictDataNavigator.cpp b/source/RobotAPI/libraries/aron/aroncore/navigators/datanavigator/AronDictDataNavigator.cpp
index b72d694a4..43f756bba 100644
--- a/source/RobotAPI/libraries/aron/aroncore/navigators/datanavigator/AronDictDataNavigator.cpp
+++ b/source/RobotAPI/libraries/aron/aroncore/navigators/datanavigator/AronDictDataNavigator.cpp
@@ -40,6 +40,7 @@ namespace armarx
             AronDictDataNavigator::AronDictDataNavigator(const data::AronDictPtr& o, const AronPath& path) :
                 AronNavigator<AronDataDescriptor, data::AronData>::AronNavigator(AronDataDescriptor::eAronDict, path),
                 AronDataNavigator(AronDataDescriptor::eAronDict, path),
+                AronContainerDataNavigator(AronDataDescriptor::eAronDict, path),
                 aron(o)
             {
                 CheckAronPtrForNull("AronDictDataNavigator", "AronDictDataNavigator", getPath(), aron);
@@ -53,6 +54,7 @@ namespace armarx
             AronDictDataNavigator::AronDictDataNavigator(const AronPath& path) :
                 AronNavigator<AronDataDescriptor, data::AronData>::AronNavigator(AronDataDescriptor::eAronDict, path),
                 AronDataNavigator(AronDataDescriptor::eAronDict, path),
+                AronContainerDataNavigator(AronDataDescriptor::eAronDict, path),
                 aron(new data::AronDict())
             {
             }
diff --git a/source/RobotAPI/libraries/aron/aroncore/navigators/datanavigator/AronDictDataNavigator.h b/source/RobotAPI/libraries/aron/aroncore/navigators/datanavigator/AronDictDataNavigator.h
index 3b1124c4c..287718efe 100644
--- a/source/RobotAPI/libraries/aron/aroncore/navigators/datanavigator/AronDictDataNavigator.h
+++ b/source/RobotAPI/libraries/aron/aroncore/navigators/datanavigator/AronDictDataNavigator.h
@@ -42,7 +42,7 @@ namespace armarx
             typedef std::shared_ptr<AronDictDataNavigator> AronDictDataNavigatorPtr;
 
             class AronDictDataNavigator :
-                virtual public AronDataNavigator
+                virtual public AronContainerDataNavigator
             {
             public:
                 using PointerType = AronDictDataNavigatorPtr;
diff --git a/source/RobotAPI/libraries/aron/aroncore/navigators/datanavigator/AronListDataNavigator.cpp b/source/RobotAPI/libraries/aron/aroncore/navigators/datanavigator/AronListDataNavigator.cpp
index c57bea07f..63e084008 100644
--- a/source/RobotAPI/libraries/aron/aroncore/navigators/datanavigator/AronListDataNavigator.cpp
+++ b/source/RobotAPI/libraries/aron/aroncore/navigators/datanavigator/AronListDataNavigator.cpp
@@ -39,6 +39,7 @@ namespace armarx
             AronListDataNavigator::AronListDataNavigator(const data::AronListPtr& l, const AronPath& path) :
                 AronNavigator<AronDataDescriptor, data::AronData>::AronNavigator(AronDataDescriptor::eAronList, path),
                 AronDataNavigator(AronDataDescriptor::eAronList, path),
+                AronContainerDataNavigator(AronDataDescriptor::eAronList, path),
                 aron(l)
             {
                 CheckAronPtrForNull("AronListDataNavigator", "AronListDataNavigator", getPath(), aron);
@@ -53,6 +54,7 @@ namespace armarx
             AronListDataNavigator::AronListDataNavigator(const AronPath& path) :
                 AronNavigator<AronDataDescriptor, data::AronData>::AronNavigator(AronDataDescriptor::eAronList, path),
                 AronDataNavigator(AronDataDescriptor::eAronList, path),
+                AronContainerDataNavigator(AronDataDescriptor::eAronList, path),
                 aron(new data::AronList())
             {
             }
diff --git a/source/RobotAPI/libraries/aron/aroncore/navigators/datanavigator/AronListDataNavigator.h b/source/RobotAPI/libraries/aron/aroncore/navigators/datanavigator/AronListDataNavigator.h
index 87b0b00d6..2a7ea718f 100644
--- a/source/RobotAPI/libraries/aron/aroncore/navigators/datanavigator/AronListDataNavigator.h
+++ b/source/RobotAPI/libraries/aron/aroncore/navigators/datanavigator/AronListDataNavigator.h
@@ -41,7 +41,7 @@ namespace armarx
             typedef std::shared_ptr<AronListDataNavigator> AronListDataNavigatorPtr;
 
             class AronListDataNavigator :
-                virtual public AronDataNavigator
+                virtual public AronContainerDataNavigator
             {
             public:
                 using PointerType = AronListDataNavigatorPtr;
diff --git a/source/RobotAPI/libraries/aron/aroncore/navigators/datanavigator/AronNDArrayDataNavigator.cpp b/source/RobotAPI/libraries/aron/aroncore/navigators/datanavigator/AronNDArrayDataNavigator.cpp
index bd252a0d7..5c748218f 100644
--- a/source/RobotAPI/libraries/aron/aroncore/navigators/datanavigator/AronNDArrayDataNavigator.cpp
+++ b/source/RobotAPI/libraries/aron/aroncore/navigators/datanavigator/AronNDArrayDataNavigator.cpp
@@ -42,6 +42,7 @@ namespace armarx
             AronNDArrayDataNavigator::AronNDArrayDataNavigator(const data::AronNDArrayPtr& o, const AronPath& path) :
                 AronNavigator<AronDataDescriptor, data::AronData>::AronNavigator(AronDataDescriptor::eAronNDArray, path),
                 AronDataNavigator(AronDataDescriptor::eAronNDArray, path),
+                AronComplexDataNavigator(AronDataDescriptor::eAronNDArray, path),
                 aron(o)
             {
                 CheckAronPtrForNull("AronNDArrayDataNavigator", "AronNDArrayDataNavigator", getPath(), aron);
@@ -50,6 +51,7 @@ namespace armarx
             AronNDArrayDataNavigator::AronNDArrayDataNavigator(const AronPath& path) :
                 AronNavigator<AronDataDescriptor, data::AronData>::AronNavigator(AronDataDescriptor::eAronNDArray, path),
                 AronDataNavigator(AronDataDescriptor::eAronNDArray, path),
+                AronComplexDataNavigator(AronDataDescriptor::eAronNDArray, path),
                 aron(new data::AronNDArray())
             {
 
diff --git a/source/RobotAPI/libraries/aron/aroncore/navigators/datanavigator/AronNDArrayDataNavigator.h b/source/RobotAPI/libraries/aron/aroncore/navigators/datanavigator/AronNDArrayDataNavigator.h
index 96a88acf3..3a32dd987 100644
--- a/source/RobotAPI/libraries/aron/aroncore/navigators/datanavigator/AronNDArrayDataNavigator.h
+++ b/source/RobotAPI/libraries/aron/aroncore/navigators/datanavigator/AronNDArrayDataNavigator.h
@@ -41,7 +41,7 @@ namespace armarx
             typedef std::shared_ptr<AronNDArrayDataNavigator> AronNDArrayDataNavigatorPtr;
 
             class AronNDArrayDataNavigator :
-                virtual public AronDataNavigator
+                virtual public AronComplexDataNavigator
             {
             public:
                 using PointerType = AronNDArrayDataNavigatorPtr;
diff --git a/source/RobotAPI/libraries/aron/aroncore/navigators/datanavigator/AronPrimitiveDataNavigator.cpp b/source/RobotAPI/libraries/aron/aroncore/navigators/datanavigator/AronPrimitiveDataNavigator.cpp
index 66b98dcbc..a1c14461a 100644
--- a/source/RobotAPI/libraries/aron/aroncore/navigators/datanavigator/AronPrimitiveDataNavigator.cpp
+++ b/source/RobotAPI/libraries/aron/aroncore/navigators/datanavigator/AronPrimitiveDataNavigator.cpp
@@ -38,6 +38,7 @@ namespace armarx
     Aron##upperType##DataNavigator::Aron##upperType##DataNavigator(const AronPath& path) : \
         AronNavigator<AronDataDescriptor, data::AronData>::AronNavigator(AronDataDescriptor::eAron##upperType, path), \
         AronDataNavigator(AronDataDescriptor::eAron##upperType, path), \
+        AronPrimitiveDataNavigator(AronDataDescriptor::eAron##upperType, path), \
         aron(new data::Aron##upperType()) \
     { \
         aron->value = {}; \
@@ -45,6 +46,7 @@ namespace armarx
     Aron##upperType##DataNavigator::Aron##upperType##DataNavigator(const data::Aron##upperType##Ptr& o, const AronPath& path) : \
         AronNavigator<AronDataDescriptor, data::AronData>::AronNavigator(AronDataDescriptor::eAron##upperType, path), \
         AronDataNavigator(AronDataDescriptor::eAron##upperType, path), \
+        AronPrimitiveDataNavigator(AronDataDescriptor::eAron##upperType, path), \
         aron(o) \
     { \
     } \
diff --git a/source/RobotAPI/libraries/aron/aroncore/navigators/datanavigator/AronPrimitiveDataNavigator.h b/source/RobotAPI/libraries/aron/aroncore/navigators/datanavigator/AronPrimitiveDataNavigator.h
index 10f9fe6dc..2dc5f7a58 100644
--- a/source/RobotAPI/libraries/aron/aroncore/navigators/datanavigator/AronPrimitiveDataNavigator.h
+++ b/source/RobotAPI/libraries/aron/aroncore/navigators/datanavigator/AronPrimitiveDataNavigator.h
@@ -42,7 +42,7 @@ namespace armarx
     typedef std::shared_ptr<Aron##upperType##DataNavigator> Aron##upperType##DataNavigatorPtr; \
     \
     class Aron##upperType##DataNavigator : \
-        virtual public AronDataNavigator \
+        virtual public AronPrimitiveDataNavigator \
     { \
     public: \
         using PointerType = Aron##upperType##DataNavigatorPtr; \
-- 
GitLab