From aebb6ae37887d8083f5fa5aeed0580413b26a5ec Mon Sep 17 00:00:00 2001
From: Firat Yusuf Duran <uzivy@student.kit.edu>
Date: Fri, 13 Sep 2024 21:56:30 +0200
Subject: [PATCH] skillID/Description to FluxioSkill conversion changed

- Conversion made it's own method
- Conversion only run once on addition of provider
- Loading of composite skills from provider still needs to be thought out
---
 .../manager/SkillManagerComponentPlugin.cpp   | 35 +++++++++++++------
 .../manager/SkillManagerComponentPlugin.h     |  2 ++
 .../SkillManagerComponentPluginUser.cpp       | 12 +++++++
 3 files changed, 38 insertions(+), 11 deletions(-)

diff --git a/source/RobotAPI/libraries/skills/manager/SkillManagerComponentPlugin.cpp b/source/RobotAPI/libraries/skills/manager/SkillManagerComponentPlugin.cpp
index a31c15b7c..acec36d35 100644
--- a/source/RobotAPI/libraries/skills/manager/SkillManagerComponentPlugin.cpp
+++ b/source/RobotAPI/libraries/skills/manager/SkillManagerComponentPlugin.cpp
@@ -42,6 +42,7 @@
 #include "RobotAPI/libraries/skills/core/FluxioSubSkillNode.h"
 #include "RobotAPI/libraries/skills/core/FluxioTypeIdentificator.h"
 #include "RobotAPI/libraries/skills/core/FluxioValue.h"
+#include "RobotAPI/libraries/skills/core/SkillDescription.h"
 #include "RobotAPI/libraries/skills/core/error/FluxioErrorMessages.h"
 #include "RobotAPI/libraries/skills/core/error/FluxioException.h"
 #include "RobotAPI/libraries/skills/core/executor/FluxioCompositeExecutor.h"
@@ -158,6 +159,12 @@ namespace armarx::plugins
                         << "Overwriting the old provider info.";
             skillProviderMap[providerInfo.providerId] = providerInfo.providerInterface;
         }
+
+        for (const auto& [skillID, skillDesc] : providerInfo.providedSkills)
+        {
+            descriptionIdToFluxioSkill(skillID, skillDesc);
+            ARMARX_INFO << "Adding skill '" << skillID.skillName << "as FluxioSkill.";
+        }
     }
 
     void
@@ -945,14 +952,16 @@ namespace armarx::plugins
         return generator(str);
     }
 
-    skills::Result<std::vector<std::experimental::observer_ptr<const skills::FluxioSkill>>,
-                   skills::error::FluxioException>
-    SkillManagerComponentPlugin::getSkillList()
+    /**
+    * @brief Converts the old skill structure to the new FluxioSkill structure.
+    * @param skillId The id of the skill.
+    * @param skillDescription The description of the skill.
+    */
+    void
+    SkillManagerComponentPlugin::descriptionIdToFluxioSkill(
+        skills::SkillID skillId,
+        skills::SkillDescription skillDescription)
     {
-        std::map<skills::SkillID, skills::SkillDescription> skillDescriptions =
-            getSkillDescriptions();
-
-        for (const auto& [skillId, skillDescription] : skillDescriptions)
         {
             // generate skill id (idempotent)
             const auto& providerId = createUuidWithString(skillId.providerId->providerName);
@@ -963,7 +972,7 @@ namespace armarx::plugins
             if (skillsEntry != fluxioDC.skills.end())
             {
                 skillsLock.unlock();
-                continue;
+                return;
             }
 
             skills::FluxioSkill s;
@@ -994,7 +1003,7 @@ namespace armarx::plugins
                                    << skillId.providerId->providerName << "'. Skill: '" << s.name
                                    << " with id: '" << s.id << "' will not be added.";
                     skillsLock.unlock();
-                    continue;
+                    return;
                 }
                 const auto p = res.getResult(); // TODO: nullptr check
                 s.skillProviderPtr = p;
@@ -1007,7 +1016,7 @@ namespace armarx::plugins
                                << s.id << "' will not be added.";
                 typesLock.unlock();
                 skillsLock.unlock();
-                continue;
+                return;
             }
             typesLock.unlock();
             const auto& eventType = eventTypeIt->second->getMemberType("Event");
@@ -1109,8 +1118,12 @@ namespace armarx::plugins
             fluxioDC.skills.emplace(s.id, std::move(s));
             skillsLock.unlock();
         }
+    }
 
-
+    skills::Result<std::vector<std::experimental::observer_ptr<const skills::FluxioSkill>>,
+                   skills::error::FluxioException>
+    SkillManagerComponentPlugin::getSkillList()
+    {
         return {convertMapValuesToObserverVector(fluxioDC.skills)};
     }
 
diff --git a/source/RobotAPI/libraries/skills/manager/SkillManagerComponentPlugin.h b/source/RobotAPI/libraries/skills/manager/SkillManagerComponentPlugin.h
index 320627aa4..c7ccdfa10 100644
--- a/source/RobotAPI/libraries/skills/manager/SkillManagerComponentPlugin.h
+++ b/source/RobotAPI/libraries/skills/manager/SkillManagerComponentPlugin.h
@@ -219,6 +219,8 @@ namespace armarx::plugins
                                      const std::string& userId,
                                      const std::string& skillId);
 
+        void descriptionIdToFluxioSkill(skills::SkillID skillId, skills::SkillDescription skillDescription);
+
         friend class armarx::SkillManagerComponentPluginUser;
     };
 } // namespace armarx::plugins
diff --git a/source/RobotAPI/libraries/skills/manager/SkillManagerComponentPluginUser.cpp b/source/RobotAPI/libraries/skills/manager/SkillManagerComponentPluginUser.cpp
index e5c7edd46..f948e8d51 100644
--- a/source/RobotAPI/libraries/skills/manager/SkillManagerComponentPluginUser.cpp
+++ b/source/RobotAPI/libraries/skills/manager/SkillManagerComponentPluginUser.cpp
@@ -40,6 +40,18 @@ namespace armarx
     {
         auto i = skills::ProviderInfo::FromIce(info);
         this->plugin->addProvider(i);
+        std::optional<std::vector<skills::manager::arondto::FluxioSkill>> opt =
+            loadCompositeSkillsOfProvider(info.providerId.providerName);
+
+        if (!opt.has_value()) {
+            ARMARX_ERROR << "Failed to load composite skills for provider " << info.providerId.providerName;
+            return;
+        }
+
+        for (const auto& skill : opt.value())
+        {
+            // TODO: Implement a proper way to load all skills from memory without breaking dependencies etc.
+        }
     }
 
     void
-- 
GitLab