Skip to content
Snippets Groups Projects
SkillManagerComponentPluginUser.cpp 24.4 KiB
Newer Older
#include "SkillManagerComponentPluginUser.h"
Julian Tusch's avatar
Julian Tusch committed

#include <optional>
Benedikt Engel's avatar
Benedikt Engel committed
#include <string>
#include <vector>
Julian Tusch's avatar
Julian Tusch committed

Benedikt Engel's avatar
Benedikt Engel committed
#include <Ice/Exception.h>
Benedikt Engel's avatar
Benedikt Engel committed
#include <Ice/OutputStream.h>
Benedikt Engel's avatar
Benedikt Engel committed
#include <IceUtil/Exception.h>
#include <IceUtil/Optional.h>
Moritz Gleissner's avatar
Moritz Gleissner committed

Moritz Gleissner's avatar
Moritz Gleissner committed
#include <ArmarXCore/core/ManagedIceObject.h>
Benedikt Engel's avatar
Benedikt Engel committed
#include <ArmarXCore/core/exceptions/LocalException.h>
Julian Tusch's avatar
Julian Tusch committed
#include <ArmarXCore/core/logging/Logging.h>
Julian Tusch's avatar
Julian Tusch committed
#include <ArmarXCore/interface/core/time.h>
Julian Tusch's avatar
Julian Tusch committed

Moritz Gleissner's avatar
Moritz Gleissner committed
#include "RobotAPI/libraries/aron/core/data/variant/container/Dict.h"
#include "RobotAPI/libraries/skills/core/FluxioProfile.h"
#include "RobotAPI/libraries/skills/core/FluxioProvider.h"
#include "RobotAPI/libraries/skills/core/FluxioSkill.h"
Benedikt Engel's avatar
Benedikt Engel committed
#include "RobotAPI/libraries/skills/core/error/FluxioErrorMessages.h"
Benedikt Engel's avatar
Benedikt Engel committed
#include "RobotAPI/libraries/skills/core/error/FluxioException.h"
#include "RobotAPI/libraries/skills/manager/SkillManagerComponentPlugin.h"
#include <RobotAPI/interface/aron/Aron.h>
#include <RobotAPI/interface/skills/SkillManagerInterface.h>
#include <RobotAPI/libraries/skills/core/aron/FluxioSkill.aron.generated.h>

namespace armarx
{
    SkillManagerComponentPluginUser::SkillManagerComponentPluginUser()
    {
        addPlugin(plugin);
    }

    void
    SkillManagerComponentPluginUser::addProvider(const skills::manager::dto::ProviderInfo& info,
                                                 const Ice::Current&)
    {
        auto i = skills::ProviderInfo::FromIce(info);
        this->plugin->addProvider(i);
    }

    void
    SkillManagerComponentPluginUser::removeProvider(
        const skills::manager::dto::ProviderID& provider,
        const Ice::Current&)
    {
        auto i = skills::ProviderID::FromIce(provider);
        this->plugin->removeProvider(i);
    }

    skills::manager::dto::SkillStatusUpdate
    SkillManagerComponentPluginUser::executeSkill(
        const skills::manager::dto::SkillExecutionRequest& info,
        const Ice::Current&)
    {
        auto e = skills::SkillExecutionRequest::FromIce(info);
        return this->plugin->executeSkill(e).toManagerIce();
    }

    skills::manager::dto::SkillExecutionID
    SkillManagerComponentPluginUser::executeSkillAsync(
        const skills::manager::dto::SkillExecutionRequest& info,
        const Ice::Current& current)
    {
        auto e = skills::SkillExecutionRequest::FromIce(info);
        return this->plugin->executeSkillAsync(e).toManagerIce();
    }

    skills::provider::dto::ParameterUpdateResult
    SkillManagerComponentPluginUser::updateSkillParameters(
        const skills::manager::dto::SkillExecutionID& info,
        const aron::data::dto::DictPtr& params,
        const Ice::Current& current)
    {
        skills::provider::dto::ParameterUpdateResult ret;
        auto a = armarx::aron::data::Dict::FromAronDictDTO(params);
        auto e = skills::SkillExecutionID::FromIce(info);
        ret.success = this->plugin->updateSkillParameters(e, a);
        return ret;
    }

    skills::provider::dto::AbortSkillResult
    SkillManagerComponentPluginUser::abortSkill(const skills::manager::dto::SkillExecutionID& id,
                                                const Ice::Current& current)
    {
        skills::provider::dto::AbortSkillResult ret;
        auto i = skills::SkillExecutionID::FromIce(id);
        ret.success = this->plugin->abortSkill(i);
        return ret;
    }

    skills::provider::dto::AbortSkillResult
    SkillManagerComponentPluginUser::abortSkillAsync(
        const skills::manager::dto::SkillExecutionID& id,
        const Ice::Current& /*unused*/)
    {
        skills::provider::dto::AbortSkillResult ret;
        auto i = skills::SkillExecutionID::FromIce(id);
        ret.success = this->plugin->abortSkillAsync(i);
        return ret;
    }

    void
    SkillManagerComponentPluginUser::updateStatusForSkill(
        const skills::provider::dto::SkillStatusUpdate& statusUpdate,
        const skills::callback::dto::ProviderID& pid,
        const Ice::Current&)
    {
        (void)statusUpdate;
        (void)pid;
        // If you want to use the status, implement this method!
    }

    skills::manager::dto::SkillDescriptionMap
    SkillManagerComponentPluginUser::getSkillDescriptions(const Ice::Current& current)
    {
        skills::manager::dto::SkillDescriptionMap ret;

        auto m = this->plugin->getSkillDescriptions();

        for (const auto& [k, v] : m)
        {
            ret.insert({k.toManagerIce(), v.toManagerIce()});
        }

        return ret;
    }

    IceUtil::Optional<skills::manager::dto::SkillDescription>
    SkillManagerComponentPluginUser::getSkillDescription(const skills::manager::dto::SkillID& id,
                                                         const Ice::Current& current)
    {
        auto e = skills::SkillID::FromIce(id);
        auto o = this->plugin->getSkillDescription(e);
        if (o.has_value())
        {
            return o->toManagerIce();
        }
        return {};
    }

    IceUtil::Optional<skills::manager::dto::SkillStatusUpdate>
    SkillManagerComponentPluginUser::getSkillExecutionStatus(
        const skills::manager::dto::SkillExecutionID& executionId,
        const Ice::Current& current)
    {
        auto e = skills::SkillExecutionID::FromIce(executionId);
        auto o = this->plugin->getSkillExecutionStatus(e);
        if (o.has_value())
        {
            return o->toManagerIce();
        }
        return {};
    }

    skills::manager::dto::SkillStatusUpdateMap
    SkillManagerComponentPluginUser::getSkillExecutionStatuses(const Ice::Current& current)
    {
        skills::manager::dto::SkillStatusUpdateMap ret;

        auto m = this->plugin->getSkillExecutionStatuses();

        for (const auto& [k, v] : m)
        {
            ret.insert({k.toManagerIce(), v.toManagerIce()});
        }

        return ret;
    }

Julian Tusch's avatar
Julian Tusch committed
    //****************************//
    //** Fluxio related methods **//
    //****************************//
    aron::type::dto::AronObjectPtr
    SkillManagerComponentPluginUser::getTypes(const Ice::Current& current)
    {
Firat Yusuf Duran's avatar
Firat Yusuf Duran committed
        const auto& res = this->plugin->getTypes();
        return res->toAronObjectDTO();
Firat Yusuf Duran's avatar
Firat Yusuf Duran committed
    }

Moritz Gleissner's avatar
Moritz Gleissner committed
    aron::data::dto::DictPtr
    SkillManagerComponentPluginUser::getTestData(const Ice::Current& current)
    {
        aron::data::DictPtr res = make_shared<aron::data::Dict>();
        const auto& execs = this->plugin->fluxioDC.fluxioExecutors;
        for (const auto& [k, v] : execs)
Moritz Gleissner's avatar
Moritz Gleissner committed
        {
            auto data = v->getResultsCopy();
            if (data != nullptr)
            {
                for (const auto& entry : data->getElements())
                {
                    const auto key = k + " (" + entry.first + ")";
                    res->addElement(key, entry.second);
                }
            }
Moritz Gleissner's avatar
Moritz Gleissner committed
        }
        return res->toAronDictDTO();
    }

    IceUtil::Optional<std::string>
    SkillManagerComponentPluginUser::executeFluxioSkill(const std::string& skillId,
                                                        const std::string& profileId,
                                                        const Ice::Current& current)
        const auto& res = this->plugin->executeFluxioSkill(skillId, profileId, "Fluxio");
Benedikt Engel's avatar
Benedikt Engel committed
        if (!res.isSuccess())
Benedikt Engel's avatar
Benedikt Engel committed
            auto e = res.getError();
            e.addToContext(std::nullopt, "SkillManagerComponentPluginUser", __FUNCTION__, __LINE__);
            throw e.toManagerIce();
Moritz Gleissner's avatar
Moritz Gleissner committed
        if (res.getResult() == nullptr)
Moritz Gleissner's avatar
Moritz Gleissner committed
            auto e = res.getError();
            e.addToContext(std::nullopt, "SkillManagerComponentPluginUser", __FUNCTION__, __LINE__);
            throw e.toManagerIce();
Moritz Gleissner's avatar
Moritz Gleissner committed
        return res.getResult()->id;
Julian Tusch's avatar
Julian Tusch committed
    void
    SkillManagerComponentPluginUser::abortFluxioSkill(const std::string& executionId,
                                                      const Ice::Current& current)
Julian Tusch's avatar
Julian Tusch committed
    {
        this->plugin->abortFluxioSkill(executionId);
    }

    IceUtil::Optional<skills::manager::dto::FluxioSkillStatusUpdateList>
    SkillManagerComponentPluginUser::getFluxioSkillExecutionStatus(const std::string& executionId,
                                                                   const Ice::Current& current)
Julian Tusch's avatar
Julian Tusch committed
    {
        auto l = this->plugin->getFluxioSkillExecutionStatus(executionId);
Benedikt Engel's avatar
Benedikt Engel committed
        if (!l.isSuccess())
Julian Tusch's avatar
Julian Tusch committed
        {
            ARMARX_WARNING << "Error getting FluxioSkillExecutionStatus";
Benedikt Engel's avatar
Benedikt Engel committed

            auto e = l.getError();
            e.addToContext(std::nullopt, "SkillManagerComponentPluginUser", __FUNCTION__, __LINE__);
Benedikt Engel's avatar
Benedikt Engel committed
            throw e.toManagerIce();
Julian Tusch's avatar
Julian Tusch committed
        }

        skills::manager::dto::FluxioSkillStatusUpdateList ret;

Benedikt Engel's avatar
Benedikt Engel committed
        for (const auto& s : l.getResult())
Julian Tusch's avatar
Julian Tusch committed
        {
            ret.push_back(s.toManagerIce());
        }

        return ret;
    }

    skills::manager::dto::FluxioSkillList
    SkillManagerComponentPluginUser::getSkillList(const Ice::Current& current)
    {
        skills::manager::dto::FluxioSkillList ret;

        auto l = this->plugin->getSkillList();

Moritz Gleissner's avatar
Moritz Gleissner committed
        if (!l.isSuccess())
Benedikt Engel's avatar
Benedikt Engel committed
            auto e = l.getError();
            e.addToContext(std::nullopt, "SkillManagerComponentPluginUser", __FUNCTION__, __LINE__);
            throw e.toManagerIce();
        }
Benedikt Engel's avatar
Benedikt Engel committed
        for (const auto& s : l.getResult())
            if (s == nullptr)
            {
                ARMARX_WARNING << "Unexpected nullptr!";
                continue;
            }

            const auto& skill = s->toManagerIce();
Julian Tusch's avatar
Julian Tusch committed

            if (!skill.has_value())
            {
                ARMARX_WARNING << "Skill with id " << s->id << " could not be converted";
Julian Tusch's avatar
Julian Tusch committed
                continue;
            }

Julian Tusch's avatar
Julian Tusch committed
            ret.push_back(skill.value());
Julian Tusch's avatar
Julian Tusch committed
        ret.push_back(skills::manager::dto::FluxioSkill{
            .id = "SkillNotFound",
            .name = "SkillNotFound",
            .description = "This skill cannot be found and will throw an error.",
            .timeout = armarx::core::time::dto::Duration(-1),
            .lastChanged = "",
            .executable = false,
            .native = true,
            .skillProviderId = {.id = "test provider", .hint = "test provider"},
            .parameters = {},
            .nodesHasValue = false,
            .nodes = {},
            .edgesHasValue = false,
            .edges = {},
        });

    IceUtil::Optional<skills::manager::dto::FluxioSkill>
Moritz Gleissner's avatar
Moritz Gleissner committed
    SkillManagerComponentPluginUser::getSkill(const std::string& id, const Ice::Current& current)
    {
Benedikt Engel's avatar
Benedikt Engel committed
        auto result = this->plugin->getSkill(id);
Moritz Gleissner's avatar
Moritz Gleissner committed
        {
            auto e = result.getError();
            e.addToContext(std::nullopt, "SkillManagerComponentPluginUser", __FUNCTION__, __LINE__);
            throw e.toManagerIce();
        const auto& skill = result.getResult();
        if (skill == nullptr)
Moritz Gleissner's avatar
Moritz Gleissner committed
        {
            return {};

        const auto& s = skill->toManagerIce();

        if (!s.has_value())
        {
            return {};
        }

        return s.value();
Julian Tusch's avatar
Julian Tusch committed
    bool
    SkillManagerComponentPluginUser::updateSkill(const std::string& userId,
                                                 const skills::manager::dto::FluxioSkill& skill,
Moritz Gleissner's avatar
Moritz Gleissner committed
                                                 const Ice::Current& current)
    {
        std::scoped_lock l(this->plugin->fluxioDC.skillsMutex,
                           this->plugin->fluxioDC.profilesMutex,
                           this->plugin->fluxioDC.providersMutex,
                           this->plugin->fluxioDC.typesMutex);
        auto& skillsMap = this->plugin->fluxioDC.skills;
        auto& providersMap = this->plugin->fluxioDC.providers;
        auto& profilesMap = this->plugin->fluxioDC.profiles;
        auto& typesMap = this->plugin->fluxioDC.types;
        const auto& s = skillsMap.find(skill.id);
Julian Tusch's avatar
Julian Tusch committed
        // Check if the skill exists
        if (s == skillsMap.end())
        {
            ARMARX_WARNING << "Skill with id " << skill.id << " not found";
Julian Tusch's avatar
Julian Tusch committed
            return false;
        }

        // Check if the user has the mutex for the skill
        auto res = this->plugin->getSkillMutex(skill.id, userId);
Julian Tusch's avatar
Julian Tusch committed
        {
            ARMARX_WARNING << "User " << userId << "User does not have Mutex for this Skill"
                           << skill.id;
Benedikt Engel's avatar
Benedikt Engel committed
            auto error = res.getError();
            error.addToContext(skills::error::createErrorMessage(
                                   skills::error::ErrorCode::UserHasNoMutexError, {skill.id}),
                               "SkillManagerComponentPluginUser",
                               __FUNCTION__,
                               __LINE__);
            throw error.toManagerIce();
Julian Tusch's avatar
Julian Tusch committed
        }

        const bool ret =
            s->second.updateFromIce(skill, providersMap, profilesMap, skillsMap, typesMap);
    bool
    SkillManagerComponentPluginUser::updateSkillParameterValues(
        const std::string& userId,
        const std::string& skillId,
        const std::string& parameterId,
        const skills::manager::dto::FluxioValueList& values,
        const Ice::Current& current)
    {
        std::scoped_lock l(this->plugin->fluxioDC.skillsMutex,
                           this->plugin->fluxioDC.profilesMutex);
        auto& skillsMap = this->plugin->fluxioDC.skills;
        auto& profilesMap = this->plugin->fluxioDC.profiles;

        // check if skill exists
        const auto& skill = skillsMap.find(skillId);

        if (skill == skillsMap.end())
        {
            ARMARX_WARNING << "Skill with id " << skillId << " not found";
            return false;
        }

        // Check if the user has the mutex for the skill
        auto res = this->plugin->getSkillMutex(skillId, userId);
        if (!res.isSuccess())
        {
            ARMARX_WARNING << "User " << userId << "User does not have Mutex for this Skill"
                           << skillId;

            auto error = res.getError();
            error.addToContext(skills::error::createErrorMessage(
                                   skills::error::ErrorCode::UserHasNoMutexError, {skillId}),
                               "SkillManagerComponentPluginUser",
                               __FUNCTION__,
                               __LINE__);
            throw error.toManagerIce();
        }

        // check if parameter exists in skill
        const auto& p = skill->second.parameters.find(parameterId);
        if (p == skill->second.parameters.end())
        {
            ARMARX_WARNING << "Parameter with id " << parameterId << " not found in skill with id "
                           << skillId;
            return false;
        }

        // update values of parameter
        p->second.updateValuesFromIce(values, profilesMap);
        return true;
    }

    IceUtil::Optional<skills::manager::dto::FluxioIdentificatorList>
    SkillManagerComponentPluginUser::deleteSkill(const std::string& skillId,
                                                 const std::string& userId,
Julian Tusch's avatar
Julian Tusch committed
                                                 const bool dryRun,
                                                 const Ice::Current& current)
Moritz Gleissner's avatar
Moritz Gleissner committed
    {
        skills::manager::dto::FluxioIdentificatorList ret;
        auto l = this->plugin->deleteSkill(skillId, userId, dryRun);

        if (!l.has_value())
        {
            return {};
        }

        for (const auto& s : l.value())
        {
            if (s == nullptr)
            {
                ARMARX_WARNING << "Unexpected nullptr!";
                continue;
            }
            ret.push_back(s->toFluxioIdentificatorIce());
        }

        return ret;
Moritz Gleissner's avatar
Moritz Gleissner committed
    bool
    SkillManagerComponentPluginUser::getSkillMutex(const std::string& skillId,
                                                   const std::string& userId,
                                                   const Ice::Current& current)
    {
        return this->plugin->getSkillMutex(skillId, userId).getResult(); //
Moritz Gleissner's avatar
Moritz Gleissner committed
    void
    SkillManagerComponentPluginUser::deleteSkillMutex(const std::string& skillId,
                                                      const std::string& userId,
                                                      const Ice::Current& current)
    {
        this->plugin->deleteSkillMutex(skillId, userId);
    }

Moritz Gleissner's avatar
Moritz Gleissner committed
    void
Julian Tusch's avatar
Julian Tusch committed
    SkillManagerComponentPluginUser::removeSkillParameter(const std::string& userId,
                                                          const std::string& skillId,
Moritz Gleissner's avatar
Moritz Gleissner committed
                                                          const std::string& parameterId,
                                                          const Ice::Current& current)
    {
        this->plugin->removeSkillParameter(userId, skillId, parameterId);
    }

    skills::manager::dto::FluxioProfileList
Moritz Gleissner's avatar
Moritz Gleissner committed
    SkillManagerComponentPluginUser::getProfileList(const Ice::Current& current)
    {
        skills::manager::dto::FluxioProfileList ret;

        auto l = this->plugin->getProfileList();

        for (const auto& p : l.getResult())
            if (p == nullptr)
            {
                ARMARX_WARNING << "Unexpected nullptr!";
                continue;
            }
            ret.push_back(p->toManagerIce());
        }

        return ret;
    }

    IceUtil::Optional<skills::manager::dto::FluxioProfile>
Moritz Gleissner's avatar
Moritz Gleissner committed
    SkillManagerComponentPluginUser::getProfile(const std::string& id, const Ice::Current& current)
    {
        auto profile = this->plugin->getProfile(id);
Moritz Gleissner's avatar
Moritz Gleissner committed

Moritz Gleissner's avatar
Moritz Gleissner committed
        {
            auto e = profile.getError();
            e.addToContext(std::nullopt, "SkillManagerComponentPluginUser", __FUNCTION__, __LINE__);
            throw e.toManagerIce();
        return profile.getResult().toManagerIce();
Moritz Gleissner's avatar
Moritz Gleissner committed
    skills::manager::dto::FluxioProfile
    SkillManagerComponentPluginUser::createProfile(
        const skills::manager::dto::FluxioProfile& profile,
        const Ice::Current& current)
    {
        std::unique_lock l(this->plugin->fluxioDC.profilesMutex);
        auto& profilesMap = this->plugin->fluxioDC.profiles;
        l.unlock();
Moritz Gleissner's avatar
Moritz Gleissner committed

        auto ret = this->plugin->createProfile(skills::FluxioProfile::FromIce(profile, profilesMap))
                       .toManagerIce();
        return ret;
Moritz Gleissner's avatar
Moritz Gleissner committed
    void
    SkillManagerComponentPluginUser::updateProfile(
        const skills::manager::dto::FluxioProfile& profile,
        const Ice::Current& current)
    {
        std::unique_lock l(this->plugin->fluxioDC.profilesMutex);
        auto& profilesMap = this->plugin->fluxioDC.profiles;
        l.unlock();
Moritz Gleissner's avatar
Moritz Gleissner committed

Julian Tusch's avatar
Julian Tusch committed
        this->plugin->updateProfile(skills::FluxioProfile::FromIce(profile, profilesMap));
    }

    skills::manager::dto::FluxioProviderList
Moritz Gleissner's avatar
Moritz Gleissner committed
    SkillManagerComponentPluginUser::getProviderList(const Ice::Current& current)
    {
        skills::manager::dto::FluxioProviderList ret;

        auto l = this->plugin->getProviderList();
Benedikt Engel's avatar
Benedikt Engel committed
            auto e = l.getError();
            e.addToContext(std::nullopt, "SkillManagerComponentPluginUser", __FUNCTION__, __LINE__);
            throw e.toManagerIce();
        }
        for (const auto& p : l.getResult())
            if (p == nullptr)
            {
                ARMARX_WARNING << "Unexpected nullptr!";
                continue;
            }
            ret.push_back(p->toManagerIce());
    IceUtil::Optional<skills::manager::dto::FluxioProvider>
Moritz Gleissner's avatar
Moritz Gleissner committed
    SkillManagerComponentPluginUser::getProvider(const std::string& id, const Ice::Current& current)
    {
        auto provider = this->plugin->getProvider(id);

Benedikt Engel's avatar
Benedikt Engel committed
        if (provider.isSuccess())
Moritz Gleissner's avatar
Moritz Gleissner committed
        {
            auto e = provider.getError();
            e.addToContext(std::nullopt, "SkillManagerComponentPluginUser", __FUNCTION__, __LINE__);
            throw e.toManagerIce();
        return provider.getResult().toManagerIce();
    IceUtil::Optional<skills::manager::dto::FluxioSkillList>
Moritz Gleissner's avatar
Moritz Gleissner committed
    SkillManagerComponentPluginUser::getSkillsOfProvider(const std::string& id,
                                                         const Ice::Current& current)
    {
        skills::manager::dto::FluxioSkillList ret;

        auto l = this->plugin->getSkillsOfProvider(id);

Benedikt Engel's avatar
Benedikt Engel committed
        if (!l.isSuccess())
Moritz Gleissner's avatar
Moritz Gleissner committed
        {
            auto error = l.getError();
            error.addToContext(
                std::nullopt, "SkillManagerComponentPluginUser", __FUNCTION__, __LINE__);
            throw error.toManagerIce();
Benedikt Engel's avatar
Benedikt Engel committed
        for (const auto& s : l.getResult())
            if (s == nullptr)
            {
                ARMARX_WARNING << "Unexpected nullptr!";
                continue;
            }

            const auto& skill = s->toManagerIce();
Julian Tusch's avatar
Julian Tusch committed

            if (!skill.has_value())
            {
                ARMARX_WARNING
                    << "SkillManagerComponentPluginUser::getSkillsOfProvider: Skill with id "
                    << s->id << " could not be converted";
Julian Tusch's avatar
Julian Tusch committed
                continue;
            }

Julian Tusch's avatar
Julian Tusch committed
            ret.push_back(skill.value());
    IceUtil::Optional<skills::manager::dto::FluxioSkill>
Moritz Gleissner's avatar
Moritz Gleissner committed
    SkillManagerComponentPluginUser::addSkillToProvider(
        const std::string& userId,
Moritz Gleissner's avatar
Moritz Gleissner committed
        const std::string& providerId,
        const skills::manager::dto::FluxioSkill& skill,
Julian Tusch's avatar
Julian Tusch committed
        const Ice::Current& current)
Moritz Gleissner's avatar
Moritz Gleissner committed
    {
        std::unique_lock skillsLock(this->plugin->fluxioDC.skillsMutex, std::defer_lock);
        std::unique_lock profilesLock(this->plugin->fluxioDC.profilesMutex, std::defer_lock);
        std::unique_lock providersLock(this->plugin->fluxioDC.providersMutex, std::defer_lock);
        std::unique_lock typesLock(this->plugin->fluxioDC.typesMutex, std::defer_lock);
        std::lock(skillsLock, profilesLock, providersLock, typesLock);
        auto& skillsMap = this->plugin->fluxioDC.skills;
        auto& providersMap = this->plugin->fluxioDC.providers;
        auto& profilesMap = this->plugin->fluxioDC.profiles;
        auto& typesMap = this->plugin->fluxioDC.types;
        auto skillBO =
            skills::FluxioSkill::FromIce(skill, providersMap, profilesMap, skillsMap, typesMap);
        if (skillBO == nullptr)
Julian Tusch's avatar
Julian Tusch committed
        {
            ARMARX_WARNING << "Skill with id " << skill.id << " could not be converted";
Benedikt Engel's avatar
Benedikt Engel committed

Julian Tusch's avatar
Julian Tusch committed
            throw skills::error::FluxioException::create(
                skills::error::createErrorMessage(skills::error::ErrorCode::ConverterError,
                                                  {skill.id}),
Julian Tusch's avatar
Julian Tusch committed
                skills::error::FluxioExceptionType::BAD_REQUEST,
                "SkillManagerComponentPluginUser",
                __FUNCTION__,
                __LINE__)
                .toManagerIce();
Julian Tusch's avatar
Julian Tusch committed
        }
        skillsLock.unlock();
        profilesLock.unlock();
        providersLock.unlock();
        typesLock.unlock();
        auto& skillReleased = *skillBO.release();
            this->plugin->addSkillToProvider(userId, providerId, std::move(skillReleased));
Julian Tusch's avatar
Julian Tusch committed
        {
            ARMARX_WARNING << "Skill with id " << skill.id
                           << " could not be added to provider with id " << providerId;

            auto error = res.getError();
            error.addToContext(
                (skills::error::createErrorMessage(skills::error::ErrorCode::AddSkillError,
                                                   {skill.id, providerId})),
                "SkillManagerComponentPluginUser",
                __FUNCTION__,
                __LINE__);
            throw error.toManagerIce();
Julian Tusch's avatar
Julian Tusch committed

        const auto& s = res.getResult();
        if (s == nullptr)
Julian Tusch's avatar
Julian Tusch committed
        {
            ARMARX_WARNING << "Skill with id " << skill.id
                           << " could not be added to provider with id " << providerId;
Julian Tusch's avatar
Julian Tusch committed
            return {};
        }
        const auto& ret = s->toManagerIce();
        if (!ret.has_value())
Julian Tusch's avatar
Julian Tusch committed
        {
            ARMARX_WARNING << "Skill with id " << skill.id << " could not be converted";
            return {};
Julian Tusch's avatar
Julian Tusch committed

        const std::optional<skills::manager::arondto::FluxioSkill> aronSkill =
            s->toAronXml();

        if (!aronSkill.has_value())
        {
            ARMARX_WARNING << "Skill with id " << skill.id << " could not be converted to Aron";
            return {};
        }

        saveSkill(aronSkill.value());

        return ret.value();

    void SkillManagerComponentPluginUser::saveSkill(const skills::manager::arondto::FluxioSkill& skill) {
        // Implemented in derived class
    }

    std::optional<std::vector<skills::manager::arondto::FluxioSkill>> SkillManagerComponentPluginUser::loadSkills() {
        // Implemented in derived class
        return {};
    }