3 #include <SimoxUtility/algorithm/string/string_tools.h>
37 mns::dto::GetAllRegisteredServersResult result;
40 result = mns->getAllRegisteredServers();
42 catch (
const Ice::NotRegisteredException& e)
49 for (
const auto& [name, server] : result.servers)
51 auto [it, inserted] = servers.try_emplace(name, server);
59 auto foo = [](
auto& oldProxy,
const auto& newProxy)
65 catch (
const Ice::Exception& e)
75 if (oldProxy->ice_getIdentity() != newProxy->ice_getIdentity())
81 catch (
const Ice::Exception&)
87 foo(it->second.reading, server.reading);
88 foo(it->second.writing, server.writing);
89 foo(it->second.prediction, server.prediction);
90 foo(it->second.actions, server.actions);
91 foo(it->second.configuration, server.configuration);
92 foo(it->second.loading, server.loading);
93 foo(it->second.readingLtm, server.readingLtm);
97 for (
auto it = servers.begin(); it != servers.end();)
99 if (result.servers.count(it->first) == 0)
101 it = servers.erase(it);
115 mns::dto::MemoryServerInterfaces
129 mns::dto::MemoryServerInterfaces
139 mns::dto::WaitForServerInput
input;
144 mns::dto::WaitForServerResult result = mns->waitForServer(
input);
148 return result.server;
152 throw error::CouldNotResolveMemoryServer(
memoryID, result.errorMessage);
157 mns::dto::MemoryServerInterfaces
161 <<
"Owning component not set when using a memory server. \n"
162 <<
"When calling `armem::mns::MemoryNameSystem::useServer()`, the owning component "
164 <<
"receive the dependency to the memory server must be set beforehand. \n\n"
165 <<
"Use `armem::mns::MemoryNameSystem::setComponent()` or pass the component on "
167 <<
"before calling useServer().";
168 return useServer(
memoryID, *component);
171 mns::dto::MemoryServerInterfaces
172 MemoryNameSystem::useServer(
const MemoryID&
memoryID, ManagedIceObject& component)
174 mns::dto::MemoryServerInterfaces server = waitForServer(
memoryID);
177 component.usingProxy(server.reading->ice_getIdentity().name);
181 mns::dto::MemoryServerInterfaces
182 MemoryNameSystem::useServer(
const std::string&
memoryName)
187 mns::dto::MemoryServerInterfaces
188 MemoryNameSystem::useServer(
const std::string&
memoryName, ManagedIceObject& component)
230 return Loader(server.loading);
237 return Loader(server.loading);
244 return Loader(server.loading);
263 return Reader(server.reading, server.prediction, server.readingLtm);
270 return Reader(server.reading, server.prediction, server.readingLtm);
277 return Reader(server.reading, server.prediction, server.readingLtm);
292 template <
class ClientT>
293 std::map<std::string, ClientT>
294 MemoryNameSystem::_getAllClients(ClientFactory<ClientT>&& factory)
const
296 std::map<std::string, ClientT> result;
297 for (
const auto& [name, server] : servers)
299 if (std::optional<ClientT> client = factory(server))
301 result[name] = client.value();
307 std::optional<Configurator>
310 if (
auto config = server.configuration)
318 std::optional<Loader>
321 if (
auto load = server.loading)
329 std::optional<Reader>
332 if (
auto read = server.reading)
334 if (
auto predict = server.prediction)
336 if (
auto readLtm = server.readingLtm)
351 std::optional<Writer>
354 if (
auto write = server.writing)
361 std::map<std::string, Loader>
372 std::map<std::string, Loader>
378 std::map<std::string, Configurator>
389 std::map<std::string, Configurator>
395 std::map<std::string, Reader>
406 std::map<std::string, Reader>
442 std::map<std::string, Writer>
452 std::map<std::string, Writer>
458 std::optional<wm::EntityInstance>
462 if (result.size() > 0)
464 return result.begin()->second;
472 std::map<MemoryID, wm::EntityInstance>
475 std::stringstream errors;
476 int errorCounter = 0;
478 std::map<std::string, std::vector<MemoryID>> idsPerMemory;
479 for (
const auto&
id : ids)
481 idsPerMemory[
id.memoryName].push_back(
id);
484 std::map<MemoryID, wm::EntityInstance> result;
485 for (
const auto& [
memoryName, ids] : idsPerMemory)
495 if (
id.hasInstanceIndex())
499 else if (
id.hasTimestamp())
503 else if (
id.hasEntityName())
510 std::stringstream ss;
511 ss <<
"MemoryNameSystem::" << __FUNCTION__
512 <<
"requires IDs to be entity, snapshot or instance IDs,"
513 <<
"but ID has no entity name.";
519 errors <<
"\n#" << ++errorCounter <<
"\n"
520 <<
"Failed to retrieve " <<
id <<
" from query result: \n"
527 errors <<
"\n# " << ++errorCounter <<
"\n"
528 <<
"Failed to query '" <<
memoryName <<
"': \n"
533 if (errors.str().size() > 0)
535 ARMARX_INFO <<
"MemoryNameSystem::" << __FUNCTION__
536 <<
": The following errors may affect your result: "
538 << errors.str() <<
"\n\n"
539 <<
"When querying entity instances: \n- "
540 << simox::alg::join(simox::alg::multi_to_string(ids),
"\n- ");
548 mns::dto::MemoryServerInterfaces server)
550 mns::dto::RegisterServerInput
input;
552 input.server = server;
553 ARMARX_CHECK(server.reading or server.writing or server.configuration or server.loading or server.readingLtm)
554 <<
VAROUT(server.reading) <<
" | "
555 <<
VAROUT(server.writing) <<
" | "
556 <<
VAROUT(server.configuration) <<
" | "
557 <<
VAROUT(server.loading) <<
" | "
558 <<
VAROUT(server.readingLtm);
561 mns::dto::RegisterServerResult result = mns->registerServer(
input);
565 "register",
memoryID, result.errorMessage);
572 mns::dto::RemoveServerInput
input;
576 mns::dto::RemoveServerResult result = mns->removeServer(
input);
583 mns::MemoryNameSystemInterfacePrx