This is an automated email from the ASF dual-hosted git repository. adebreceni pushed a commit to branch minifi-api-reduced in repository https://gitbox.apache.org/repos/asf/nifi-minifi-cpp.git
commit b4645cbb4e042853b99abf66cc5490cab6b972cb Author: Adam Debreceni <[email protected]> AuthorDate: Thu Jul 3 10:32:14 2025 +0200 Provide the correct name on processor construction --- core-framework/include/core/ClassLoader.h | 6 ++++++ libminifi/include/core/FlowConfiguration.h | 3 +-- libminifi/include/processors/ProcessorUtils.h | 6 +++--- libminifi/src/core/ClassLoader.cpp | 20 ++++++++++++++++++++ libminifi/src/core/FlowConfiguration.cpp | 15 +++------------ libminifi/src/core/flow/StructuredConfiguration.cpp | 2 +- minifi-api/include/minifi-cpp/core/ClassLoader.h | 5 +++++ 7 files changed, 39 insertions(+), 18 deletions(-) diff --git a/core-framework/include/core/ClassLoader.h b/core-framework/include/core/ClassLoader.h index fc6cba043..26915db5b 100644 --- a/core-framework/include/core/ClassLoader.h +++ b/core-framework/include/core/ClassLoader.h @@ -44,5 +44,11 @@ T *ClassLoader::instantiateRaw(const std::string &class_name, const std::string })); } +template<class T> +std::unique_ptr<T> ClassLoader::instantiate(const std::string &class_name, const std::string &name, const utils::Identifier &uuid) { + return utils::dynamic_unique_cast<T>(instantiate(class_name, name, uuid, [] (CoreComponent* obj) -> bool { + return dynamic_cast<T*>(obj) != nullptr; + })); +} } // namespace org::apache::nifi::minifi::core diff --git a/libminifi/include/core/FlowConfiguration.h b/libminifi/include/core/FlowConfiguration.h index 1145601f2..8d83efcaf 100644 --- a/libminifi/include/core/FlowConfiguration.h +++ b/libminifi/include/core/FlowConfiguration.h @@ -84,8 +84,7 @@ class FlowConfiguration : public CoreComponentImpl { ~FlowConfiguration() override; // Create Processor (Node/Input/Output Port) based on the name - std::unique_ptr<core::Processor> createProcessor(const std::string &name, const utils::Identifier &uuid); - std::unique_ptr<core::Processor> createProcessor(const std::string &name, const std::string &fullname, const utils::Identifier &uuid); + std::unique_ptr<core::Processor> createProcessor(const std::string &class_short, const std::string &fullclass, const std::string &name, const utils::Identifier &uuid); // Create Root Processor Group static std::unique_ptr<core::ProcessGroup> createRootProcessGroup(const std::string &name, const utils::Identifier &uuid, int version); diff --git a/libminifi/include/processors/ProcessorUtils.h b/libminifi/include/processors/ProcessorUtils.h index fe4c8fc8a..7f5452e78 100644 --- a/libminifi/include/processors/ProcessorUtils.h +++ b/libminifi/include/processors/ProcessorUtils.h @@ -36,10 +36,10 @@ class ProcessorUtils { * @param canonicalName full class name ( canonical name ) * @param uuid uuid object for the processor */ - static inline std::unique_ptr<core::Processor> createProcessor(const std::string &class_short_name, const std::string &canonicalName, const utils::Identifier &uuid) { - auto ptr = core::ClassLoader::getDefaultClassLoader().instantiate(class_short_name, uuid); + static inline std::unique_ptr<core::Processor> createProcessor(const std::string &class_short_name, const std::string &canonicalName, const std::string &name, const utils::Identifier &uuid) { + auto ptr = core::ClassLoader::getDefaultClassLoader().instantiate(class_short_name, name, uuid); if (ptr == nullptr) { - ptr = core::ClassLoader::getDefaultClassLoader().instantiate(canonicalName, uuid); + ptr = core::ClassLoader::getDefaultClassLoader().instantiate(canonicalName, name, uuid); } if (ptr == nullptr) { return nullptr; diff --git a/libminifi/src/core/ClassLoader.cpp b/libminifi/src/core/ClassLoader.cpp index b7076b369..c46c75e36 100644 --- a/libminifi/src/core/ClassLoader.cpp +++ b/libminifi/src/core/ClassLoader.cpp @@ -50,6 +50,8 @@ class ClassLoaderImpl : public ClassLoader { [[nodiscard]] std::unique_ptr<CoreComponent> instantiate(const std::string &class_name, const utils::Identifier &uuid, std::function<bool(CoreComponent*)> filter) override; + [[nodiscard]] std::unique_ptr<CoreComponent> instantiate(const std::string &class_name, const std::string &name, const utils::Identifier &uuid, std::function<bool(CoreComponent*)> filter) override; + [[nodiscard]] CoreComponent* instantiateRaw(const std::string &class_name, const std::string &name, std::function<bool(CoreComponent*)> filter) override; ~ClassLoaderImpl() override = default; @@ -200,6 +202,24 @@ std::unique_ptr<CoreComponent> ClassLoaderImpl::instantiate(const std::string &c return nullptr; } +std::unique_ptr<CoreComponent> ClassLoaderImpl::instantiate(const std::string &class_name, const std::string &name, const utils::Identifier &uuid, std::function<bool(CoreComponent*)> filter) { + std::lock_guard<std::mutex> lock(internal_mutex_); + // allow subsequent classes to override functionality (like ProcessContextBuilder) + for (auto& child_loader : class_loaders_) { + if (auto result = child_loader.second.instantiate(class_name, name, uuid, filter)) { + return result; + } + } + auto factory_entry = loaded_factories_.find(class_name); + if (factory_entry != loaded_factories_.end()) { + auto obj = factory_entry->second->create(name, uuid); + if (filter(obj.get())) { + return obj; + } + } + return nullptr; +} + CoreComponent* ClassLoaderImpl::instantiateRaw(const std::string &class_name, const std::string &name, std::function<bool(CoreComponent*)> filter) { std::lock_guard<std::mutex> lock(internal_mutex_); // allow subsequent classes to override functionality (like ProcessContextBuilder) diff --git a/libminifi/src/core/FlowConfiguration.cpp b/libminifi/src/core/FlowConfiguration.cpp index 2e1659dc8..d2c21ee9c 100644 --- a/libminifi/src/core/FlowConfiguration.cpp +++ b/libminifi/src/core/FlowConfiguration.cpp @@ -71,19 +71,10 @@ FlowConfiguration::~FlowConfiguration() { } } -std::unique_ptr<core::Processor> FlowConfiguration::createProcessor(const std::string &name, const utils::Identifier &uuid) { - auto processor = minifi::processors::ProcessorUtils::createProcessor(name, name, uuid); +std::unique_ptr<core::Processor> FlowConfiguration::createProcessor(const std::string &class_short, const std::string &fullclass, const std::string &name, const utils::Identifier &uuid) { + auto processor = minifi::processors::ProcessorUtils::createProcessor(class_short, fullclass, name, uuid); if (nullptr == processor) { - logger_->log_error("No Processor defined for {}", name); - return nullptr; - } - return processor; -} - -std::unique_ptr<core::Processor> FlowConfiguration::createProcessor(const std::string &name, const std::string &fullname, const utils::Identifier &uuid) { - auto processor = minifi::processors::ProcessorUtils::createProcessor(name, fullname, uuid); - if (nullptr == processor) { - logger_->log_error("No Processor defined for {}", fullname); + logger_->log_error("No Processor defined for {}", fullclass); return nullptr; } return processor; diff --git a/libminifi/src/core/flow/StructuredConfiguration.cpp b/libminifi/src/core/flow/StructuredConfiguration.cpp index 667aa3205..55411616d 100644 --- a/libminifi/src/core/flow/StructuredConfiguration.cpp +++ b/libminifi/src/core/flow/StructuredConfiguration.cpp @@ -328,7 +328,7 @@ void StructuredConfiguration::parseProcessorNode(const Node& processors_node, co logger_->log_debug("parseProcessorNode: class => [{}]", procCfg.javaClass); // Determine the processor name only from the Java class - processor = createProcessor(utils::string::partAfterLastOccurrenceOf(procCfg.javaClass, '.'), procCfg.javaClass, uuid); + processor = createProcessor(utils::string::partAfterLastOccurrenceOf(procCfg.javaClass, '.'), procCfg.javaClass, procCfg.name, uuid); if (!processor) { logger_->log_error("Could not create a processor {} with id {}", procCfg.name, procCfg.id); throw std::invalid_argument("Could not create processor " + procCfg.name); diff --git a/minifi-api/include/minifi-cpp/core/ClassLoader.h b/minifi-api/include/minifi-cpp/core/ClassLoader.h index 72fa03319..56e031f39 100644 --- a/minifi-api/include/minifi-cpp/core/ClassLoader.h +++ b/minifi-api/include/minifi-cpp/core/ClassLoader.h @@ -75,6 +75,8 @@ class ClassLoader { [[nodiscard]] virtual std::unique_ptr<CoreComponent> instantiate(const std::string &class_name, const utils::Identifier &uuid, std::function<bool(CoreComponent*)> filter) = 0; + [[nodiscard]] virtual std::unique_ptr<CoreComponent> instantiate(const std::string &class_name, const std::string &name, const utils::Identifier &uuid, std::function<bool(CoreComponent*)> filter) = 0; + [[nodiscard]] virtual CoreComponent* instantiateRaw(const std::string &class_name, const std::string &name, std::function<bool(CoreComponent*)> filter) = 0; /** @@ -103,6 +105,9 @@ class ClassLoader { */ template<class T = CoreComponent> [[nodiscard]] T *instantiateRaw(const std::string &class_name, const std::string &name); + + template<class T = CoreComponent> + [[nodiscard]] std::unique_ptr<T> instantiate(const std::string &class_name, const std::string &name, const utils::Identifier &uuid); }; } // namespace org::apache::nifi::minifi::core
