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

Reply via email to