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"))
551 VariantEntryPtr entry(new VariantEntry(variantNode));
552 variants.push_back(entry);
557 if (proxyNode.name() ==
"Proxy" || proxyNode.name() ==
"Topic")
559 ProxyEntryPtr proxy(new ProxyEntry(proxyNode));
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()));
for(;yybottom<=yytop;yybottom++)
static CMakePackageFinderCache GlobalCache
The CMakePackageFinder class provides an interface to the CMake Package finder capabilities.
std::string getLibraryPaths() const
Returns the library paths seperated by semi-colons.
bool packageFound() const
Returns whether or not this package was found with cmake.
The DynamicLibrary class provides a mechanism to load libraries at runtime.
static std::string GetSharedLibraryFileExtension()
RapidXmlReaderNode first_node(const char *name=nullptr) const
std::vector< RapidXmlReaderNode > nodes(const char *name=nullptr) const
bool has_attribute(const char *attrName) const
std::string attribute_value(const char *attrName) const
bool attribute_as_optional_bool(const char *name, const std::string &trueValue, const std::string &falseValue, bool defaultValue) const
std::string attribute_value_or_default(const char *attrName, const std::string &defaultValue) const
static RapidXmlReaderPtr FromFile(const std::string &path)
static std::string getTypePrefix()
static std::string getTypePrefix()
static ContainerTypePtr FromString(const std::string &typeStr)
std::vector< std::string > getVariantIncludes(const std::string &variantBaseTypeName) const
Returns a list of includes for a specific variant (usually only one).
std::vector< ProxyEntryPtr > getProxies() const
LibEntry(RapidXmlReaderNode node, const std::string &packageName)
std::string getAbsoluteLibPath() const
std::string getPackageName() const
std::string getName() const
std::vector< std::string > getFactoryIncludes() const
const std::vector< VariantEntryPtr > & getVariants() const
ProxyEntry(RapidXmlReaderNode node)
const std::string & getBaseTypeName() const
const std::string & getDataTypeName() const
const std::string & getHumanName() const
const std::optional< std::string > & getIncludePath() const
VariantEntry(RapidXmlReaderNode node)
std::vector< LibEntryPtr > readVariantInfo(RapidXmlReaderPtr reader, const std::string &packagePath, const std::string &packageName)
static VariantInfoPtr ReadInfoFilesRecursive(const std::string &rootPackageName, const std::string &rootPackagePath, bool showErrors, VariantInfoPtr variantInfo=VariantInfoPtr())
const std::map< std::string, std::string > & getPackagePaths() const
armarx::DynamicLibraryPtr loadLibraryOfVariant(std::string variantTypeName) const
bool isPackageLoaded(const std::string packageName) const
VariantEntryPtr getVariantByName(std::string variantBaseTypeName)
LibEntryPtr findLibByVariant(std::string variantTypeName) const
ProxyEntryPtr getProxyEntry(std::string proxyId)
VariantEntryPtr getVariantByHumanName(std::string humanName)
static VariantInfoPtr ReadInfoFiles(const std::vector< std::string > &packages, bool showErrors=true, bool throwOnError=true)
Ice::StringSeq findLibNames(const Ice::StringSeq &variantTypeNames, const Ice::StringSeq &proxyTypeNames={}) const
std::vector< LibEntryPtr > getLibs() const
std::string getReturnTypeName(std::string variantBaseTypeName)
std::shared_ptr< LibEntry > LibEntryPtr
std::shared_ptr< VariantEntry > VariantEntryPtr
std::string getDataTypeName(std::string variantBaseTypeName)
std::string getDebugInfo() const
LibEntryPtr findLibByProxy(std::string proxyTypeName) const
std::string getNestedHumanNameFromBaseName(std::string variantBaseTypeName)
bool isBasic(std::string variantBaseTypeName)
std::set< LibEntryPtr > findLibs(const Ice::StringSeq &variantTypeNames, const Ice::StringSeq &proxyTypeNames={}) const
std::string getNestedBaseNameFromHumanName(std::string humanName)
std::shared_ptr< ProxyEntry > ProxyEntryPtr
#define ARMARX_CHECK_EXPRESSION(expression)
This macro evaluates the expression and if it turns out to be false it will throw an ExpressionExcept...
#define ARMARX_DEBUG_S
The logging level for output that is only interesting while debugging.
#define ARMARX_ERROR_S
The logging level for unexpected behaviour, that must be fixed.
#define ARMARX_WARNING
The logging level for unexpected behaviour, but not a serious problem.
#define ARMARX_WARNING_S
The logging level for unexpected behaviour, but not a serious problem.
This file offers overloads of toIce() and fromIce() functions for STL container types.
std::shared_ptr< RapidXmlReader > RapidXmlReaderPtr
std::shared_ptr< VariantInfo > VariantInfoPtr
std::shared_ptr< DynamicLibrary > DynamicLibraryPtr