28 #include <SimoxUtility/algorithm/string.h>
35 #include <ArmarXCore/interface/observers/VariantContainers.h>
46 std::vector<VariantInfo::LibEntryPtr>
48 const std::string& packagePath,
49 const std::string& packageName)
51 std::vector<LibEntryPtr> libs;
52 if (packagePaths.find(packagePath) != packagePaths.end())
54 ARMARX_DEBUG_S <<
"path '" << packagePath <<
"' already in there.";
58 packagePaths[(packagePath)] = packageName;
61 libNode = libNode.next_sibling(
"Lib"))
64 this->libs.push_back(lib);
69 variantToLibMap.insert(std::make_pair(e->baseTypeName, lib));
70 variantMap.insert(std::make_pair(e->baseTypeName, e));
71 humanNameToVariantMap.insert(std::make_pair(e->humanName, e));
76 proxyMap.insert(std::make_pair(lib->name +
"." + p->memberName, p));
85 std::map<std::string, LibEntryPtr>::const_iterator it =
86 variantToLibMap.find(variantTypeName);
88 if (it == variantToLibMap.end())
103 std::string libName = lib->getName();
106 if (proxy->getMemberName() == proxyTypeName)
117 const Ice::StringSeq& proxyTypeNames)
const
119 Ice::StringSeq result;
124 result.push_back(lib->getName());
130 std::set<VariantInfo::LibEntryPtr>
132 const Ice::StringSeq& proxyTypeNames)
const
134 std::set<VariantInfo::LibEntryPtr> result;
135 for (
auto& var : variantTypeNames)
143 for (
auto& proxy : proxyTypeNames)
157 std::map<std::string, VariantEntryPtr>::const_iterator it =
158 variantMap.find(variantBaseTypeName);
160 if (it == variantMap.end())
166 return it->second->dataTypeName;
173 std::map<std::string, VariantEntryPtr>::const_iterator it =
174 variantMap.find(variantBaseTypeName);
176 if (it == variantMap.end())
185 return e->basic ? e->dataTypeName : e->dataTypeName +
"Ptr";
192 std::map<std::string, VariantEntryPtr>::const_iterator it =
193 variantMap.find(variantBaseTypeName);
195 if (it == variantMap.end())
206 std::vector<VariantInfo::LibEntryPtr>
215 std::map<std::string, ProxyEntryPtr>::const_iterator it = proxyMap.find(proxyId);
217 if (it == proxyMap.end())
230 std::map<std::string, VariantEntryPtr>::const_iterator it =
231 variantMap.find(variantBaseTypeName);
233 if (it == variantMap.end())
246 std::map<std::string, VariantEntryPtr>::const_iterator it =
247 humanNameToVariantMap.find(humanName);
249 if (it == humanNameToVariantMap.end())
263 std::stringstream containers;
264 std::stringstream parenthesis;
266 while (containerInfo->subType)
270 containers <<
"List(";
274 containers <<
"Map(";
282 containerInfo = containerInfo->subType;
292 return containers.str() + entry->humanName + parenthesis.str();
299 std::stringstream containers;
300 std::stringstream parenthesis;
302 while (containerInfo->subType)
304 if (containerInfo->typeId ==
"List")
308 else if (containerInfo->typeId ==
"Map")
318 containerInfo = containerInfo->subType;
328 return containers.str() + entry->baseTypeName + parenthesis.str();
331 const std::map<std::string, std::string>&
340 for (
const auto& p : packagePaths)
342 if (p.second == packageName)
353 std::stringstream ss;
357 ss << e->getName() <<
"\n";
361 ss <<
" " <<
v->getHumanName() <<
": " <<
v->dataTypeName <<
"\n";
366 ss <<
" " << p->getHumanName() <<
": " << p->getIncludePath() <<
"\n";
375 const std::string& rootPackagePath,
384 const std::string cmakePackageName =
385 simox::alg::replace_all(eventuallyNamespacedPackage,
"::",
"_");
389 cmakePackageName, rootPackagePath,
false,
true);
392 <<
"'" << rootPackagePath <<
"'\n";
394 std::filesystem::path variantInfoFile(finder.getDataDir().c_str());
395 variantInfoFile /= cmakePackageName;
396 variantInfoFile /=
"VariantInfo-" + cmakePackageName +
".xml";
398 if (std::filesystem::exists(variantInfoFile))
400 if (!variantInfo->isPackageLoaded(cmakePackageName))
406 variantInfo->readVariantInfo(xmlReader, rootPackagePath, cmakePackageName);
409 catch (std::exception& e)
412 <<
" failed: " << e.what();
418 ARMARX_WARNING_S <<
"VariantInfo File not found for project " << cmakePackageName
419 <<
": " << variantInfoFile.string();
422 if (finder.packageFound())
424 auto depPaths = finder.getDependencyPaths();
426 for (
auto& depPath : depPaths)
428 if (variantInfo->getPackagePaths().find(depPath.second) !=
429 variantInfo->getPackagePaths().end())
434 if (!depPath.first.empty() && !depPath.second.empty())
436 std::string packagePath;
438 if (!depPath.second.empty() && std::filesystem::exists(depPath.second))
440 packagePath = depPath.second;
459 for (std::string package : packages)
466 std::filesystem::path variantInfoFile(finder.getDataDir().c_str());
467 variantInfoFile /= package;
468 variantInfoFile /=
"VariantInfo-" +
package + ".xml";
470 if (std::filesystem::exists(variantInfoFile))
476 std::vector<LibEntryPtr> libs =
477 variantInfo->readVariantInfo(xmlReader, finder.getConfigDir(), package);
479 std::stringstream ss;
482 ss <<
"Lib " << e->getName() <<
"\n";
486 ss <<
" Variant " <<
v->getHumanName() <<
": " <<
v->dataTypeName
492 ss <<
" Proxy " << p->getHumanName() <<
": " << p->getIncludePath()
496 ARMARX_DEBUG_S <<
"VariantInfo for " <<
package << ":\n" << ss.str();
498 catch (std::exception& e)
501 <<
" failed: " << e.what();
506 ARMARX_WARNING_S <<
"VariantInfo File not found for project " <<
package << ": "
507 << variantInfoFile.string();
521 ARMARX_WARNING <<
"Could not find lib for variant " << variantTypeName;
524 ARMARX_INFO_S <<
"Loading lib " << lib->getAbsoluteLibPath();
525 result->load(lib->getAbsoluteLibPath());
526 if (result->isLibraryLoaded())
537 packageName(packageName)
543 includeNode = includeNode.next_sibling(
"VariantFactory"))
545 factoryIncludes.push_back(includeNode.attribute_value(
"include"));
549 variantNode = variantNode.next_sibling(
"Variant"))
552 variants.push_back(entry);
557 if (proxyNode.name() ==
"Proxy" || proxyNode.name() ==
"Topic")
560 proxies.push_back(proxy);
565 std::vector<std::string>
568 return factoryIncludes;
571 std::vector<std::string>
574 auto it = std::find_if(variants.begin(),
577 { return entry->getBaseTypeName() == variantBaseTypeName; });
578 if (it != variants.end() && (*it)->getIncludePath())
580 return {*(*it)->getIncludePath()};
584 return factoryIncludes;
600 throw LocalException() <<
"Could not find package '" << packageName <<
"'!";
604 throw LocalException() <<
"Library path for package '" << packageName <<
"' is empty!";
608 if (!std::filesystem::exists(path))
610 throw LocalException() <<
"Library path '" << path.string() <<
"' does not exist!";
612 return path.string();
621 std::vector<VariantInfo::ProxyEntryPtr>
627 const std::vector<VariantInfo::VariantEntryPtr>&
663 const std::optional<std::string>&
672 std::vector<std::string>& vec)
676 vec.push_back(n.value());
693 readVector(node,
"include", includes);
694 readVector(node,
"library", libraries);
695 readVector(node,
"member", members);
696 readVector(node,
"onInit", onInit);
697 readVector(node,
"onConnect", onConnect);
701 methods.push_back(std::make_pair(n.attribute_value(
"header"), n.value()));
706 stateMethods.push_back(std::make_pair(n.attribute_value(
"header"), n.value()));