184 const std::string & base_package,
const std::string & base_class,
const std::set<std::string> & exclude_packages,
185 const std::map<std::string, std::string> & reserved_names)
187 std::map<std::string, std::vector<std::string>> packages_for_class_name;
188 const std::set<std::string> packages =
190 for (
const auto & package : packages) {
191 auto single_package_loader =
192 pluginlib::ClassLoader<BaseT>(base_package, base_class,
"", {
getPluginXMLPath(package)});
193 for (
const auto & class_name : single_package_loader.getDeclaredClasses()) {
194 packages_for_class_name[class_name].push_back(package);
199 for (
const auto & [class_name, package] : reserved_names) {
200 packages_for_class_name[class_name].push_back(package +
"(Build package)");
204 std::vector<std::string> error_details;
205 for (
const auto & [class_name, packages] : packages_for_class_name) {
206 if (packages.size() > 1) {
207 error_details.push_back(
208 "- Class '" + class_name +
"' found in packages ['" + auto_apms_util::join(packages,
"', '") +
"'].");
211 if (!error_details.empty()) {
212 throw exceptions::ResourceError(
213 "Ambiguous class names found! PluginClassLoader (Base: '" + base_class +
214 "') created with makeUnambiguousPluginClassLoader() won't register resources from packages "
215 "that use already existing lookup names. Found the following duplicates:\n" +
216 auto_apms_util::join(error_details,
"\n"));
218 return {base_package, base_class, exclude_packages};