From b3e23d6823c5856dc53cdca5c27f9aa47449a5a8 Mon Sep 17 00:00:00 2001 From: Rainer Kartmann <rainer.kartmann@kit.edu> Date: Mon, 30 Aug 2021 18:58:00 +0200 Subject: [PATCH] Refactor Server plugins - support read-only (and non-listening) plugins --- .../RobotAPI/libraries/armem/CMakeLists.txt | 11 +- .../armem/server/ComponentPlugin.cpp | 211 ------------------ .../libraries/armem/server/ComponentPlugin.h | 155 ------------- .../armem/server/forward_declarations.h | 4 + .../RobotAPI/libraries/armem/server/plugins.h | 20 ++ .../libraries/armem/server/plugins/Plugin.cpp | 125 +++++++++++ .../libraries/armem/server/plugins/Plugin.h | 105 +++++++++ .../server/plugins/ReadOnlyPluginUser.cpp | 56 +++++ .../armem/server/plugins/ReadOnlyPluginUser.h | 61 +++++ .../server/plugins/ReadWritePluginUser.cpp | 100 +++++++++ .../server/plugins/ReadWritePluginUser.h | 74 ++++++ 11 files changed, 554 insertions(+), 368 deletions(-) delete mode 100644 source/RobotAPI/libraries/armem/server/ComponentPlugin.cpp delete mode 100644 source/RobotAPI/libraries/armem/server/ComponentPlugin.h create mode 100644 source/RobotAPI/libraries/armem/server/plugins.h create mode 100644 source/RobotAPI/libraries/armem/server/plugins/Plugin.cpp create mode 100644 source/RobotAPI/libraries/armem/server/plugins/Plugin.h create mode 100644 source/RobotAPI/libraries/armem/server/plugins/ReadOnlyPluginUser.cpp create mode 100644 source/RobotAPI/libraries/armem/server/plugins/ReadOnlyPluginUser.h create mode 100644 source/RobotAPI/libraries/armem/server/plugins/ReadWritePluginUser.cpp create mode 100644 source/RobotAPI/libraries/armem/server/plugins/ReadWritePluginUser.h diff --git a/source/RobotAPI/libraries/armem/CMakeLists.txt b/source/RobotAPI/libraries/armem/CMakeLists.txt index 88519c9ba..c524ecd93 100644 --- a/source/RobotAPI/libraries/armem/CMakeLists.txt +++ b/source/RobotAPI/libraries/armem/CMakeLists.txt @@ -80,7 +80,6 @@ set(LIB_FILES server/MemoryToIceAdapter.cpp - server/ComponentPlugin.cpp server/MemoryRemoteGui.cpp server/RemoteGuiAronDataVisitor.cpp @@ -93,6 +92,10 @@ set(LIB_FILES server/wm/ice_conversions.cpp server/wm/detail/MaxHistorySize.cpp + server/plugins/Plugin.cpp + server/plugins/ReadOnlyPluginUser.cpp + server/plugins/ReadWritePluginUser.cpp + server/segment/Segment.cpp server/segment/SpecializedSegment.cpp @@ -188,7 +191,6 @@ set(LIB_HEADERS server.h server/forward_declarations.h - server/ComponentPlugin.h server/MemoryToIceAdapter.h server/MemoryRemoteGui.h server/RemoteGuiAronDataVisitor.h @@ -202,6 +204,11 @@ set(LIB_HEADERS server/wm/ice_conversions.h server/wm/detail/MaxHistorySize.h + server/plugins.h + server/plugins/Plugin.h + server/plugins/ReadOnlyPluginUser.h + server/plugins/ReadWritePluginUser.h + server/segment/Segment.h server/segment/SpecializedSegment.h diff --git a/source/RobotAPI/libraries/armem/server/ComponentPlugin.cpp b/source/RobotAPI/libraries/armem/server/ComponentPlugin.cpp deleted file mode 100644 index cc0d28920..000000000 --- a/source/RobotAPI/libraries/armem/server/ComponentPlugin.cpp +++ /dev/null @@ -1,211 +0,0 @@ -#include "ComponentPlugin.h" - -#include "MemoryToIceAdapter.h" - -#include <RobotAPI/libraries/armem/core/error.h> - -#include <ArmarXCore/core/Component.h> -#include <ArmarXCore/core/exceptions/local/ExpressionException.h> - - -namespace armarx::armem::server::plugins -{ - ComponentPlugin::~ComponentPlugin() = default; - - - ComponentPlugin::ComponentPlugin(ManagedIceObject& parent, std::string prefix) : - armarx::ComponentPlugin(parent, prefix) - { - addPlugin(clientPlugin); - ARMARX_CHECK_NOT_NULL(clientPlugin); - addPluginDependency(clientPlugin); - } - - - void ComponentPlugin::postCreatePropertyDefinitions(PropertyDefinitionsPtr& properties) - { - const std::string prefix = "mem."; - if (not workingMemory.name().empty() - and not properties->hasDefinition(prefix + "MemoryName")) - { - properties->optional(workingMemory.name(), prefix + "MemoryName", "Name of this memory server."); - } - properties->optional(longtermMemoryEnabled, prefix + "ltm.00_enabled"); - - properties->topic(memoryTopic, memoryTopicDefaultName); - } - - - void ComponentPlugin::postOnConnectComponent() - { - ComponentPluginUser& parent = this->parent<ComponentPluginUser>(); - - if (clientPlugin->isMemoryNameSystemEnabled() && parent.memoryNameSystem()) - { - registerMemory(parent); - } - parent.iceAdapter().setMemoryListener(memoryTopic); - - // establishing connection to ltm and mongodb - if (parent.isLongtermMemoryEnabled()) - { - parent.longtermMemoryManager().reload(); - } - } - - - void ComponentPlugin::preOnDisconnectComponent() - { - ComponentPluginUser& parent = this->parent<ComponentPluginUser>(); - if (clientPlugin->isMemoryNameSystemEnabled() and clientPlugin->getMemoryNameSystemProxy()) - { - removeMemory(parent); - } - } - - - void ComponentPlugin::setMemoryName(const std::string& memoryName) - { - workingMemory.name() = memoryName; - longtermMemoryManager.setName(memoryName); - } - - - mns::dto::RegisterServerResult ComponentPlugin::registerMemory(ComponentPluginUser& parent) - { - MemoryID id = MemoryID().withMemoryName(parent.workingMemory().name()); - mns::dto::MemoryServerInterfaces server; - server.reading = ReadingMemoryInterfacePrx::uncheckedCast(parent.getProxy()); - server.writing = WritingMemoryInterfacePrx::uncheckedCast(parent.getProxy()); - - mns::dto::RegisterServerResult result; - try - { - parent.memoryNameSystem().registerServer(id, server); - result.success = true; - ARMARX_DEBUG << "Registered memory server for " << id << " in the Memory Name System (MNS)."; - } - catch (const armem::error::ServerRegistrationOrRemovalFailed& e) - { - result.success = false; - result.errorMessage = e.what(); - ARMARX_WARNING << e.what(); - } - return result; - } - - - mns::dto::RemoveServerResult ComponentPlugin::removeMemory(ComponentPluginUser& parent) - { - MemoryID id = MemoryID().withMemoryName(parent.workingMemory().name()); - - mns::dto::RemoveServerResult result; - try - { - parent.memoryNameSystem().removeServer(id); - result.success = true; - ARMARX_DEBUG << "Removed memory server for " << id << " from the Memory Name System (MNS)."; - } - catch (const armem::error::ServerRegistrationOrRemovalFailed& e) - { - result.success = false; - result.errorMessage = e.what(); - ARMARX_WARNING << e.what(); - } - catch (const Ice::NotRegisteredException&) - { - // It's ok, the MNS is gone. - result.success = false; - result.errorMessage = "Memory Name System is gone."; - } - return result; - } - -} - - -namespace armarx::armem::server -{ - ComponentPluginUser::ComponentPluginUser() - { - addPlugin(plugin); - } - - ComponentPluginUser::~ComponentPluginUser() = default; - - // Set the name of a memory - void ComponentPluginUser::setMemoryName(const std::string& memoryName) - { - plugin->setMemoryName(memoryName); - } - - - // WRITING - data::AddSegmentsResult ComponentPluginUser::addSegments(const data::AddSegmentsInput& input, const Ice::Current&) - { - ARMARX_TRACE; - bool addCoreSegmentOnUsage = false; - return addSegments(input, addCoreSegmentOnUsage); - } - - data::AddSegmentsResult ComponentPluginUser::addSegments(const data::AddSegmentsInput& input, bool addCoreSegments) - { - ARMARX_TRACE; - data::AddSegmentsResult result = iceAdapter().addSegments(input, addCoreSegments); - return result; - } - - - data::CommitResult ComponentPluginUser::commit(const data::Commit& commitIce, const Ice::Current&) - { - ARMARX_TRACE; - return iceAdapter().commit(commitIce); - } - - - // READING - armem::query::data::Result ComponentPluginUser::query(const armem::query::data::Input& input, const Ice::Current&) - { - ARMARX_TRACE; - return iceAdapter().query(input); - } - - - // LTM STORING - data::StoreResult ComponentPluginUser::store(const data::StoreInput& input, const Ice::Current&) - { - ARMARX_TRACE; - return iceAdapter().store(input); - } - - - ComponentPlugin& ComponentPluginUser::memoryServerPlugin() - { - return *plugin; - } - - - wm::Memory& ComponentPluginUser::workingMemory() - { - return plugin->workingMemory; - } - - - MemoryToIceAdapter& ComponentPluginUser::iceAdapter() - { - return plugin->iceAdapter; - } - - - bool ComponentPluginUser::isLongtermMemoryEnabled() - { - return plugin->longtermMemoryEnabled; - } - - - ltm::mongodb::MemoryManager& ComponentPluginUser::longtermMemoryManager() - { - return plugin->longtermMemoryManager; - } - -} diff --git a/source/RobotAPI/libraries/armem/server/ComponentPlugin.h b/source/RobotAPI/libraries/armem/server/ComponentPlugin.h deleted file mode 100644 index f198a23b1..000000000 --- a/source/RobotAPI/libraries/armem/server/ComponentPlugin.h +++ /dev/null @@ -1,155 +0,0 @@ -#pragma once - -#include "MemoryToIceAdapter.h" - -#include <RobotAPI/libraries/armem/core/wm/memory_definitions.h> -#include <RobotAPI/libraries/armem/server/ltm/mongodb/MemoryManager.h> -#include <RobotAPI/libraries/armem/client/plugins/Plugin.h> -#include <RobotAPI/libraries/armem/client/plugins/ListeningPluginUser.h> - -#include <RobotAPI/interface/armem/server/MemoryInterface.h> -#include <RobotAPI/interface/armem/client/MemoryListenerInterface.h> - -#include <ArmarXCore/core/ComponentPlugin.h> - - -namespace armarx::armem::server -{ - class ComponentPluginUser; -} -namespace armarx::armem::server::plugins -{ - - class ComponentPlugin : - public armarx::ComponentPlugin - { - public: - - ComponentPlugin(ManagedIceObject& parent, std::string prefix); - virtual ~ComponentPlugin() override; - - virtual void postCreatePropertyDefinitions(PropertyDefinitionsPtr& properties) override; - - virtual void postOnConnectComponent() override; - virtual void preOnDisconnectComponent() override; - - - public: - - /// Set the name of the wm and the ltm (if enabled). - void setMemoryName(const std::string& memoryName); - - - protected: - - /** - * @brief Register the parent component in the MNS. - * - * Called before onConnect() if MNS is enabled. - */ - mns::dto::RegisterServerResult registerMemory(ComponentPluginUser& parent); - - /** - * @brief Remove the parent component from the MNS. - * - * Called before onDisconnect() if MNS is enabled. - */ - mns::dto::RemoveServerResult removeMemory(ComponentPluginUser& parent); - - - - public: - - // Working Memory - - /// The actual memory. - server::wm::Memory workingMemory; - - /// Helps connecting `memory` to ice. Used to handle Ice callbacks. - MemoryToIceAdapter iceAdapter { &workingMemory, &longtermMemoryManager}; - - - // Working Memory Updates - - std::string memoryTopicDefaultName = "MemoryUpdates"; - client::MemoryListenerInterfacePrx memoryTopic; - - - // Long-Term Memory - - /// Indicates whether to use or not to use the ltm feature. - bool longtermMemoryEnabled = true; - - /// A manager class for the ltm. It internally holds a normal wm instance as a cache. - server::ltm::mongodb::MemoryManager longtermMemoryManager; - - std::string longTermMemoryDatabaseHost; - std::string longTermMemoryDatabaseUser; - std::string longTermMemoryDatabasePassword; - - - private: - - client::plugins::Plugin* clientPlugin; - - }; - -} - - -namespace armarx::armem::server -{ - - /** - * @brief Base class of memory server components. - * - * Implements the server ice interfaces using the ice adapter of the plugin. - */ - class ComponentPluginUser : - virtual public ManagedIceObject - , virtual public MemoryInterface - , virtual public client::plugins::ListeningPluginUser - { - public: - - ComponentPluginUser(); - virtual ~ComponentPluginUser() override; - - /// Set the name of the wm and the ltm (if enabled) - void setMemoryName(const std::string& memoryName); - - - // WritingInterface interface - virtual data::AddSegmentsResult addSegments(const data::AddSegmentsInput& input, const Ice::Current& = Ice::emptyCurrent) override; - data::AddSegmentsResult addSegments(const data::AddSegmentsInput& input, bool addCoreSegments); - - virtual data::CommitResult commit(const data::Commit& commit, const Ice::Current& = Ice::emptyCurrent) override; - - - // ReadingInterface interface - virtual armem::query::data::Result query(const armem::query::data::Input& input, const Ice::Current& = Ice::emptyCurrent) override; - - - // StoringInterface interface - virtual data::StoreResult store(const data::StoreInput&, const Ice::Current& = Ice::emptyCurrent) override; - - - public: - - ComponentPlugin& memoryServerPlugin(); - - server::wm::Memory& workingMemory(); - MemoryToIceAdapter& iceAdapter(); - - bool isLongtermMemoryEnabled(); - server::ltm::mongodb::MemoryManager& longtermMemoryManager(); - - - private: - - plugins::ComponentPlugin* plugin = nullptr; - - }; - - -} diff --git a/source/RobotAPI/libraries/armem/server/forward_declarations.h b/source/RobotAPI/libraries/armem/server/forward_declarations.h index 6872e2584..d65ec0f36 100644 --- a/source/RobotAPI/libraries/armem/server/forward_declarations.h +++ b/source/RobotAPI/libraries/armem/server/forward_declarations.h @@ -16,3 +16,7 @@ namespace armarx::armem::server::wm class CoreSegment; class Memory; } +namespace armarx::armem::server::ltm::mongodb +{ + class MemoryManager; +} diff --git a/source/RobotAPI/libraries/armem/server/plugins.h b/source/RobotAPI/libraries/armem/server/plugins.h new file mode 100644 index 000000000..9f1255994 --- /dev/null +++ b/source/RobotAPI/libraries/armem/server/plugins.h @@ -0,0 +1,20 @@ +#pragma once + +#include "plugins/Plugin.h" +#include "plugins/ReadOnlyPluginUser.h" +#include "plugins/ReadWritePluginUser.h" + + +namespace armarx::armem::server +{ + using plugins::Plugin; + using plugins::ReadOnlyPluginUser; + using plugins::ReadWritePluginUser; +} + +namespace armarx::armem +{ + using ServerPlugin = server::Plugin; + using ReadOnlyServerPluginUser = server::ReadOnlyPluginUser; + using ReadWriteServerPluginUser = server::ReadWritePluginUser; +} diff --git a/source/RobotAPI/libraries/armem/server/plugins/Plugin.cpp b/source/RobotAPI/libraries/armem/server/plugins/Plugin.cpp new file mode 100644 index 000000000..031e8fbdf --- /dev/null +++ b/source/RobotAPI/libraries/armem/server/plugins/Plugin.cpp @@ -0,0 +1,125 @@ +#include "Plugin.h" + +#include <RobotAPI/libraries/armem/core/error.h> +#include <RobotAPI/libraries/armem/client/plugins/Plugin.h> + +#include <ArmarXCore/core/Component.h> +#include <ArmarXCore/core/exceptions/local/ExpressionException.h> + + +namespace armarx::armem::server::plugins +{ + + Plugin::~Plugin() = default; + + + Plugin::Plugin(ManagedIceObject& parent, std::string prefix) : + armarx::ComponentPlugin(parent, prefix) + { + addPlugin(clientPlugin); + ARMARX_CHECK_NOT_NULL(clientPlugin); + addPluginDependency(clientPlugin); + } + + + void Plugin::postCreatePropertyDefinitions(PropertyDefinitionsPtr& properties) + { + const std::string prefix = "mem."; + if (not workingMemory.name().empty() + and not properties->hasDefinition(prefix + "MemoryName")) + { + properties->optional(workingMemory.name(), prefix + "MemoryName", "Name of this memory server."); + } + properties->optional(longtermMemoryEnabled, prefix + "ltm.00_enabled"); + + + // Publish memory updates topic + properties->topic(memoryTopic, memoryTopicDefaultName); + } + + + void Plugin::postOnConnectComponent() + { + Component& parent = this->parent<Component>(); + + if (clientPlugin->isMemoryNameSystemEnabled() and clientPlugin->getMemoryNameSystemClient()) + { + registerServer(parent); + } + iceAdapter.setMemoryListener(memoryTopic); + + // establishing connection to ltm and mongodb + if (longtermMemoryEnabled) + { + longtermMemoryManager.reload(); + } + } + + + void Plugin::preOnDisconnectComponent() + { + if (clientPlugin->isMemoryNameSystemEnabled() and clientPlugin->getMemoryNameSystemClient()) + { + removeServer(); + } + } + + + void Plugin::setMemoryName(const std::string& memoryName) + { + workingMemory.name() = memoryName; + longtermMemoryManager.setName(memoryName); + } + + + mns::dto::RegisterServerResult Plugin::registerServer(armarx::Component& parent) + { + MemoryID id = MemoryID().withMemoryName(workingMemory.name()); + mns::dto::MemoryServerInterfaces server; + server.reading = ReadingMemoryInterfacePrx::uncheckedCast(parent.getProxy()); + server.writing = WritingMemoryInterfacePrx::uncheckedCast(parent.getProxy()); + + mns::dto::RegisterServerResult result; + try + { + clientPlugin->getMemoryNameSystemClient().registerServer(id, server); + result.success = true; + ARMARX_DEBUG << "Registered memory server for " << id << " in the Memory Name System (MNS)."; + } + catch (const armem::error::ServerRegistrationOrRemovalFailed& e) + { + result.success = false; + result.errorMessage = e.what(); + ARMARX_WARNING << e.what(); + } + return result; + } + + + mns::dto::RemoveServerResult Plugin::removeServer() + { + MemoryID id = MemoryID().withMemoryName(workingMemory.name()); + + mns::dto::RemoveServerResult result; + try + { + clientPlugin->getMemoryNameSystemClient().removeServer(id); + result.success = true; + ARMARX_DEBUG << "Removed memory server for " << id << " from the Memory Name System (MNS)."; + } + catch (const armem::error::ServerRegistrationOrRemovalFailed& e) + { + result.success = false; + result.errorMessage = e.what(); + ARMARX_WARNING << e.what(); + } + catch (const Ice::NotRegisteredException&) + { + // It's ok, the MNS is gone. + result.success = false; + result.errorMessage = "Memory Name System is gone."; + } + return result; + } + +} diff --git a/source/RobotAPI/libraries/armem/server/plugins/Plugin.h b/source/RobotAPI/libraries/armem/server/plugins/Plugin.h new file mode 100644 index 000000000..49cc07bb0 --- /dev/null +++ b/source/RobotAPI/libraries/armem/server/plugins/Plugin.h @@ -0,0 +1,105 @@ +#pragma once + +#include <RobotAPI/libraries/armem/server/MemoryToIceAdapter.h> + +#include <RobotAPI/libraries/armem/server/wm/memory_definitions.h> +#include <RobotAPI/libraries/armem/server/ltm/mongodb/MemoryManager.h> + +#include <RobotAPI/interface/armem/client/MemoryListenerInterface.h> +#include <RobotAPI/interface/armem/mns/MemoryNameSystemInterface.h> + +#include <ArmarXCore/core/ComponentPlugin.h> + + +namespace armarx +{ + class Component; +} +namespace armarx::armem::client::plugins +{ + class Plugin; +} + +namespace armarx::armem::server::plugins +{ + + class Plugin : + public armarx::ComponentPlugin + { + public: + + Plugin(ManagedIceObject& parent, std::string prefix); + virtual ~Plugin() override; + + + virtual void postCreatePropertyDefinitions(PropertyDefinitionsPtr& properties) override; + + virtual void postOnConnectComponent() override; + virtual void preOnDisconnectComponent() override; + + + public: + + /// Set the name of the wm and the ltm (if enabled). + void setMemoryName(const std::string& memoryName); + + + protected: + + /** + * @brief Register the parent component in the MNS. + * + * Called before onConnect() if MNS is enabled. + */ + mns::dto::RegisterServerResult registerServer(armarx::Component& parent); + + /** + * @brief Remove the parent component from the MNS. + * + * Called before onDisconnect() if MNS is enabled. + */ + mns::dto::RemoveServerResult removeServer(); + + + + public: + + // Working Memory + + /// The actual memory. + server::wm::Memory workingMemory; + + /// Helps connecting `memory` to ice. Used to handle Ice callbacks. + MemoryToIceAdapter iceAdapter { &workingMemory, &longtermMemoryManager}; + + + // Working Memory Updates (publishing) + + std::string memoryTopicDefaultName = "MemoryUpdates"; + client::MemoryListenerInterfacePrx memoryTopic; + + + // Long-Term Memory + + /// Indicates whether to use or not to use the ltm feature. + bool longtermMemoryEnabled = true; + + /// A manager class for the ltm. It internally holds a normal wm instance as a cache. + server::ltm::mongodb::MemoryManager longtermMemoryManager; + + std::string longTermMemoryDatabaseHost; + std::string longTermMemoryDatabaseUser; + std::string longTermMemoryDatabasePassword; + + + private: + + client::plugins::Plugin* clientPlugin; + + }; +} + +namespace armarx::armem::server +{ + using plugins::Plugin; +} diff --git a/source/RobotAPI/libraries/armem/server/plugins/ReadOnlyPluginUser.cpp b/source/RobotAPI/libraries/armem/server/plugins/ReadOnlyPluginUser.cpp new file mode 100644 index 000000000..b95b94afb --- /dev/null +++ b/source/RobotAPI/libraries/armem/server/plugins/ReadOnlyPluginUser.cpp @@ -0,0 +1,56 @@ +#include "ReadOnlyPluginUser.h" +#include "Plugin.h" + +#include <RobotAPI/libraries/armem/core/error.h> +#include <RobotAPI/libraries/armem/server/MemoryToIceAdapter.h> + +#include <ArmarXCore/core/Component.h> +#include <ArmarXCore/core/exceptions/local/ExpressionException.h> + + + +namespace armarx::armem::server::plugins +{ + + ReadOnlyPluginUser::ReadOnlyPluginUser() + { + addPlugin(plugin); + } + + + ReadOnlyPluginUser::~ReadOnlyPluginUser() + { + } + + + void ReadOnlyPluginUser::setMemoryName(const std::string& memoryName) + { + plugin->setMemoryName(memoryName); + } + + + armem::query::data::Result ReadOnlyPluginUser::query(const armem::query::data::Input& input, const Ice::Current&) + { + ARMARX_TRACE; + return iceAdapter().query(input); + } + + + Plugin& ReadOnlyPluginUser::memoryServerPlugin() + { + return *plugin; + } + + + wm::Memory& ReadOnlyPluginUser::workingMemory() + { + return plugin->workingMemory; + } + + + MemoryToIceAdapter& ReadOnlyPluginUser::iceAdapter() + { + return plugin->iceAdapter; + } + +} diff --git a/source/RobotAPI/libraries/armem/server/plugins/ReadOnlyPluginUser.h b/source/RobotAPI/libraries/armem/server/plugins/ReadOnlyPluginUser.h new file mode 100644 index 000000000..f56d66b0f --- /dev/null +++ b/source/RobotAPI/libraries/armem/server/plugins/ReadOnlyPluginUser.h @@ -0,0 +1,61 @@ +#pragma once + +#include <RobotAPI/libraries/armem/server/forward_declarations.h> + +#include <RobotAPI/libraries/armem/client/plugins/PluginUser.h> +#include <RobotAPI/interface/armem/server/MemoryInterface.h> + +#include <ArmarXCore/core/ManagedIceObject.h> + + +namespace armarx::armem::server::plugins +{ + + class Plugin; + + + /** + * @brief Base class of memory server components. + * + * Implements the server ice interfaces using the ice adapter of the plugin. + */ + class ReadOnlyPluginUser : + virtual public ManagedIceObject + , virtual public ReadingMemoryInterface + , virtual public client::plugins::PluginUser + { + public: + + ReadOnlyPluginUser(); + virtual ~ReadOnlyPluginUser() override; + + + void setMemoryName(const std::string& memoryName); + + + // ReadingInterface interface + virtual armem::query::data::Result query( + const armem::query::data::Input& input, + const Ice::Current& = Ice::emptyCurrent) override; + + + public: + + Plugin& memoryServerPlugin(); + + server::wm::Memory& workingMemory(); + MemoryToIceAdapter& iceAdapter(); + + + private: + + plugins::Plugin* plugin = nullptr; + + }; + +} + +namespace armarx::armem::server +{ + using plugins::ReadOnlyPluginUser; +} diff --git a/source/RobotAPI/libraries/armem/server/plugins/ReadWritePluginUser.cpp b/source/RobotAPI/libraries/armem/server/plugins/ReadWritePluginUser.cpp new file mode 100644 index 000000000..f3da4f3ee --- /dev/null +++ b/source/RobotAPI/libraries/armem/server/plugins/ReadWritePluginUser.cpp @@ -0,0 +1,100 @@ +#include "ReadWritePluginUser.h" +#include "Plugin.h" + +#include <RobotAPI/libraries/armem/core/error.h> +#include <RobotAPI/libraries/armem/server/MemoryToIceAdapter.h> + +#include <ArmarXCore/core/Component.h> +#include <ArmarXCore/core/exceptions/local/ExpressionException.h> + + + +namespace armarx::armem::server::plugins +{ + + ReadWritePluginUser::ReadWritePluginUser() + { + addPlugin(plugin); + } + + + ReadWritePluginUser::~ReadWritePluginUser() + { + } + + + void ReadWritePluginUser::setMemoryName(const std::string& memoryName) + { + plugin->setMemoryName(memoryName); + } + + + // WRITING + data::AddSegmentsResult ReadWritePluginUser::addSegments(const data::AddSegmentsInput& input, const Ice::Current&) + { + ARMARX_TRACE; + bool addCoreSegmentOnUsage = false; + return addSegments(input, addCoreSegmentOnUsage); + } + + data::AddSegmentsResult ReadWritePluginUser::addSegments(const data::AddSegmentsInput& input, bool addCoreSegments) + { + ARMARX_TRACE; + data::AddSegmentsResult result = iceAdapter().addSegments(input, addCoreSegments); + return result; + } + + + data::CommitResult ReadWritePluginUser::commit(const data::Commit& commitIce, const Ice::Current&) + { + ARMARX_TRACE; + return iceAdapter().commit(commitIce); + } + + + // READING + armem::query::data::Result ReadWritePluginUser::query(const armem::query::data::Input& input, const Ice::Current&) + { + ARMARX_TRACE; + return iceAdapter().query(input); + } + + + // LTM STORING + data::StoreResult ReadWritePluginUser::store(const data::StoreInput& input, const Ice::Current&) + { + ARMARX_TRACE; + return iceAdapter().store(input); + } + + + Plugin& ReadWritePluginUser::memoryServerPlugin() + { + return *plugin; + } + + + wm::Memory& ReadWritePluginUser::workingMemory() + { + return plugin->workingMemory; + } + + + MemoryToIceAdapter& ReadWritePluginUser::iceAdapter() + { + return plugin->iceAdapter; + } + + + bool ReadWritePluginUser::isLongtermMemoryEnabled() + { + return plugin->longtermMemoryEnabled; + } + + + ltm::mongodb::MemoryManager& ReadWritePluginUser::longtermMemoryManager() + { + return plugin->longtermMemoryManager; + } + +} diff --git a/source/RobotAPI/libraries/armem/server/plugins/ReadWritePluginUser.h b/source/RobotAPI/libraries/armem/server/plugins/ReadWritePluginUser.h new file mode 100644 index 000000000..673622419 --- /dev/null +++ b/source/RobotAPI/libraries/armem/server/plugins/ReadWritePluginUser.h @@ -0,0 +1,74 @@ +#pragma once + +#include <RobotAPI/libraries/armem/server/forward_declarations.h> + +#include <RobotAPI/libraries/armem/client/plugins/ListeningPluginUser.h> +#include <RobotAPI/interface/armem/server/MemoryInterface.h> + +#include <ArmarXCore/core/ManagedIceObject.h> + + +namespace armarx::armem::server::plugins +{ + + class Plugin; + + + /** + * @brief Base class of memory server components. + * + * Implements the server ice interfaces using the ice adapter of the plugin. + */ + class ReadWritePluginUser : + virtual public ManagedIceObject + , virtual public MemoryInterface + , virtual public client::plugins::ListeningPluginUser + { + public: + + ReadWritePluginUser(); + virtual ~ReadWritePluginUser() override; + + + void setMemoryName(const std::string& memoryName); + + + // WritingInterface interface + virtual data::AddSegmentsResult addSegments(const data::AddSegmentsInput& input, const Ice::Current& = Ice::emptyCurrent) override; + data::AddSegmentsResult addSegments(const data::AddSegmentsInput& input, bool addCoreSegments); + + virtual data::CommitResult commit(const data::Commit& commit, const Ice::Current& = Ice::emptyCurrent) override; + + + // ReadingInterface interface + virtual armem::query::data::Result query(const armem::query::data::Input& input, const Ice::Current& = Ice::emptyCurrent) override; + + + // StoringInterface interface + virtual data::StoreResult store(const data::StoreInput&, const Ice::Current& = Ice::emptyCurrent) override; + + + public: + + Plugin& memoryServerPlugin(); + + server::wm::Memory& workingMemory(); + MemoryToIceAdapter& iceAdapter(); + + bool isLongtermMemoryEnabled(); + server::ltm::mongodb::MemoryManager& longtermMemoryManager(); + + + private: + + plugins::Plugin* plugin = nullptr; + + }; + +} + +namespace armarx::armem::server +{ + using plugins::ReadWritePluginUser; +} + -- GitLab