From 401fa06a61d78235d434c244c2fdb5372feaa605 Mon Sep 17 00:00:00 2001 From: Adam Debreceni Date: Mon, 20 Apr 2026 14:20:35 +0200 Subject: [PATCH 1/4] MINIFICPP-2782 - Remove resources from class loader on extension unload --- .../include/api/core/ProcessorImpl.h | 4 +- libminifi/include/core/extension/Extension.h | 1 + libminifi/src/core/extension/Extension.cpp | 6 ++ .../CApiExtension.cpp | 21 ++++++- .../CMakeLists.txt | 15 +++++ .../CppApiResources.cpp | 45 +++++++++++++++ .../ExtensionLoadingTests.cpp | 57 +++++++++++++++++++ 7 files changed, 146 insertions(+), 3 deletions(-) create mode 100644 libminifi/test/integration/extension-verification-test/CppApiResources.cpp create mode 100644 libminifi/test/integration/extension-verification-test/ExtensionLoadingTests.cpp diff --git a/extension-framework/cpp-extension-lib/include/api/core/ProcessorImpl.h b/extension-framework/cpp-extension-lib/include/api/core/ProcessorImpl.h index 57e13e6f49..a5753b2d3f 100644 --- a/extension-framework/cpp-extension-lib/include/api/core/ProcessorImpl.h +++ b/extension-framework/cpp-extension-lib/include/api/core/ProcessorImpl.h @@ -74,8 +74,8 @@ class ProcessorImpl { static constexpr auto OutputAttributes = std::array{}; std::string getName() const; - utils::Identifier getUUID() const; - utils::SmallString<36> getUUIDStr() const; + minifi::utils::Identifier getUUID() const; + minifi::utils::SmallString<36> getUUIDStr() const; virtual PublishedMetrics calculateMetrics() const {return {};} diff --git a/libminifi/include/core/extension/Extension.h b/libminifi/include/core/extension/Extension.h index 2b0753f799..7f266dd15d 100644 --- a/libminifi/include/core/extension/Extension.h +++ b/libminifi/include/core/extension/Extension.h @@ -40,6 +40,7 @@ class Extension { std::string version; void(*deinit)(void* user_data); void* user_data; + std::vector resources; }; struct Context { diff --git a/libminifi/src/core/extension/Extension.cpp b/libminifi/src/core/extension/Extension.cpp index 1e600d3b51..bceef677bb 100644 --- a/libminifi/src/core/extension/Extension.cpp +++ b/libminifi/src/core/extension/Extension.cpp @@ -39,6 +39,7 @@ #include "minifi-c/minifi-c.h" #include "minifi-cpp/agent/agent_docs.h" #include "utils/RegexUtils.h" +#include "core/ClassLoader.h" namespace org::apache::nifi::minifi::core::extension { @@ -116,6 +117,11 @@ Extension::~Extension() { if (info_ && info_->deinit) { info_->deinit(info_->user_data); } + if (info_) { + for (auto& resource_name : info_->resources) { + core::ClassLoader::getDefaultClassLoader().getClassLoader(info_->name).unregisterClass(resource_name); + } + } unload(); const std::string bundle_name = info_ ? info_->name : library_name_; diff --git a/libminifi/test/integration/extension-verification-test/CApiExtension.cpp b/libminifi/test/integration/extension-verification-test/CApiExtension.cpp index eb66d4e1b5..2b2b981ae8 100644 --- a/libminifi/test/integration/extension-verification-test/CApiExtension.cpp +++ b/libminifi/test/integration/extension-verification-test/CApiExtension.cpp @@ -18,12 +18,28 @@ #include "api/core/Resource.h" #include "api/utils/minifi-c-utils.h" +#include "api/core/ProcessorImpl.h" #define MKSOC(x) #x #define MAKESTRING(x) MKSOC(x) // NOLINT(cppcoreguidelines-macro-usage) namespace minifi = org::apache::nifi::minifi; +class DummyCProcessor : public minifi::api::core::ProcessorImpl { + public: + using ProcessorImpl::ProcessorImpl; + + static constexpr const char* Description = "C processor that does nothing"; + + static constexpr auto Relationships = std::array{}; + static constexpr auto Properties = std::array{}; + static constexpr auto OutputAttributes = std::array{}; + static constexpr bool SupportsDynamicProperties = false; + static constexpr bool SupportsDynamicRelationships = false; + static constexpr minifi::core::annotation::Input InputRequirement = minifi::core::annotation::Input::INPUT_ALLOWED; + static constexpr bool IsSingleThreaded = true; +}; + CEXTENSIONAPI const uint32_t MinifiApiVersion = MINIFI_TEST_API_VERSION; CEXTENSIONAPI void MinifiInitExtension(MinifiExtensionContext* extension_context) { @@ -33,5 +49,8 @@ CEXTENSIONAPI void MinifiInitExtension(MinifiExtensionContext* extension_context .deinit = nullptr, .user_data = nullptr }; - MinifiRegisterExtension(extension_context, &extension_definition); + auto extension = MinifiRegisterExtension(extension_context, &extension_definition); + minifi::api::core::useProcessorClassDescription([&] (const MinifiProcessorClassDefinition& description) { + MinifiRegisterProcessor(extension, &description); + }); } diff --git a/libminifi/test/integration/extension-verification-test/CMakeLists.txt b/libminifi/test/integration/extension-verification-test/CMakeLists.txt index e38accb0ea..116ce1206b 100644 --- a/libminifi/test/integration/extension-verification-test/CMakeLists.txt +++ b/libminifi/test/integration/extension-verification-test/CMakeLists.txt @@ -85,3 +85,18 @@ create_loading_test_extension(test-extension-loading-missing-init InvalidMissing create_loading_test_extension(test-extension-loading-create-not-called CreateNotCalled.cpp) target_link_libraries(test-extension-loading-create-not-called minifi-cpp-extension-lib) target_compile_definitions(test-extension-loading-create-not-called PRIVATE MINIFI_TEST_API_VERSION=10) + +### Extension Loading Tests +add_minifi_executable(ExtensionLoadingTests ExtensionLoadingTests.cpp) +createIntegrationTests(ExtensionLoadingTests) +target_link_libraries(ExtensionLoadingTests core-minifi Catch2WithMain Threads::Threads) +add_test(NAME ExtensionLoadingTests COMMAND ExtensionLoadingTests) + + +create_loading_test_extension(test-extension-loading-cpp-resources CppApiResources.cpp) +add_dependencies(ExtensionLoadingTests test-extension-loading-cpp-resources) +target_link_libraries(test-extension-loading-cpp-resources PRIVATE ${LIBMINIFI}) +target_include_directories(test-extension-loading-cpp-resources BEFORE PRIVATE "${CMAKE_SOURCE_DIR}/libminifi/test/libtest/") + +create_c_test_extension(c-resources 10) +add_dependencies(ExtensionLoadingTests test-extension-loading-c-resources) diff --git a/libminifi/test/integration/extension-verification-test/CppApiResources.cpp b/libminifi/test/integration/extension-verification-test/CppApiResources.cpp new file mode 100644 index 0000000000..7cee1b1d22 --- /dev/null +++ b/libminifi/test/integration/extension-verification-test/CppApiResources.cpp @@ -0,0 +1,45 @@ +/** +* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include +#include "utils/ExtensionInitUtils.h" +#include "core/AbstractProcessor.h" +#include "core/Resource.h" +#include "unit/DummyProcessor.h" + +#define MKSOC(x) #x +#define MAKESTRING(x) MKSOC(x) // NOLINT(cppcoreguidelines-macro-usage) + +namespace minifi = org::apache::nifi::minifi; + +namespace org::apache::nifi::minifi::test { +REGISTER_RESOURCE(DummyProcessor, Processor); +} // org::apache::nifi::minifi::test + + +extern "C" void MinifiInitCppExtension(MinifiExtension* extension, MinifiConfig* /*config*/) { + MinifiExtensionCreateInfo ext_create_info{ + .name = minifi::utils::toStringView(MAKESTRING(MODULE_NAME)), + .version = minifi::utils::toStringView("1.0.0"), + .deinit = nullptr, + .user_data = nullptr, + .processors_count = 0, + .processors_ptr = nullptr + }; + minifi::utils::MinifiCreateCppExtension(extension, &ext_create_info); +} diff --git a/libminifi/test/integration/extension-verification-test/ExtensionLoadingTests.cpp b/libminifi/test/integration/extension-verification-test/ExtensionLoadingTests.cpp new file mode 100644 index 0000000000..6b7a8e6415 --- /dev/null +++ b/libminifi/test/integration/extension-verification-test/ExtensionLoadingTests.cpp @@ -0,0 +1,57 @@ +/** +* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#define CUSTOM_EXTENSION_INIT + +#include "unit/TestBase.h" +#include "unit/Catch.h" +#include "unit/TestUtils.h" +#include "core/extension/ExtensionManager.h" +#include "core/extension/ApiVersion.h" +#include "core/ClassLoader.h" + +namespace minifi = org::apache::nifi::minifi; + +class ExtensionLoadingTestController { + public: + explicit ExtensionLoadingTestController(std::string pattern): extension_manager_{[&] () { + LogTestController::getInstance().clear(); + LogTestController::getInstance().setTrace(); + LogTestController::getInstance().setTrace(); + minifi::core::extension::test_setAgentApiVersion(10); + minifi::core::extension::test_setMinSupportedApiVersion(5); + auto config = minifi::Configure::create(); + config->set(minifi::Configuration::nifi_extension_path, pattern); + return config; + }()} {} + + std::optional extension_manager_; +}; + +TEST_CASE("Loading an extension makes the processors available") { + CHECK_FALSE(core::ClassLoader::getDefaultClassLoader().instantiate("DummyProcessor", "dummy")); + CHECK_FALSE(core::ClassLoader::getDefaultClassLoader().instantiate("DummyCProcessor", "dummy")); + { + ExtensionLoadingTestController controller{"*test-extension-loading-cpp-resources*,*test-extension-loading-c-resources*"}; + CHECK(core::ClassLoader::getDefaultClassLoader().instantiate("DummyProcessor", "dummy")); + CHECK(core::ClassLoader::getDefaultClassLoader().instantiate("DummyCProcessor", "dummy")); + } + CHECK_FALSE(core::ClassLoader::getDefaultClassLoader().instantiate("DummyProcessor", "dummy")); + CHECK_FALSE(core::ClassLoader::getDefaultClassLoader().instantiate("DummyCProcessor", "dummy")); +} + From b0d36060304f4d2dd8cb403d339408d9a14359ff Mon Sep 17 00:00:00 2001 From: Adam Debreceni Date: Thu, 23 Apr 2026 13:22:48 +0200 Subject: [PATCH 2/4] MINIFICPP-2782 - Rebase fix --- libminifi/include/core/extension/Extension.h | 6 +++++- libminifi/src/core/extension/Extension.cpp | 2 +- libminifi/src/minifi-c.cpp | 4 +++- .../extension-verification-test/CppApiResources.cpp | 10 ++++------ .../ExtensionLoadingTests.cpp | 3 ++- 5 files changed, 15 insertions(+), 10 deletions(-) diff --git a/libminifi/include/core/extension/Extension.h b/libminifi/include/core/extension/Extension.h index 7f266dd15d..ef8d86e909 100644 --- a/libminifi/include/core/extension/Extension.h +++ b/libminifi/include/core/extension/Extension.h @@ -40,7 +40,6 @@ class Extension { std::string version; void(*deinit)(void* user_data); void* user_data; - std::vector resources; }; struct Context { @@ -63,6 +62,10 @@ class Extension { return info_; } + void addResource(std::string resource_name) { + resources_.push_back(std::move(resource_name)); + } + private: #ifdef WIN32 std::map resource_mapping_; @@ -86,6 +89,7 @@ class Extension { gsl::owner handle_ = nullptr; std::optional info_; + std::vector resources_; uint32_t api_version_{0}; const std::shared_ptr logger_; diff --git a/libminifi/src/core/extension/Extension.cpp b/libminifi/src/core/extension/Extension.cpp index bceef677bb..1520861eed 100644 --- a/libminifi/src/core/extension/Extension.cpp +++ b/libminifi/src/core/extension/Extension.cpp @@ -118,7 +118,7 @@ Extension::~Extension() { info_->deinit(info_->user_data); } if (info_) { - for (auto& resource_name : info_->resources) { + for (auto& resource_name : resources_) { core::ClassLoader::getDefaultClassLoader().getClassLoader(info_->name).unregisterClass(resource_name); } } diff --git a/libminifi/src/minifi-c.cpp b/libminifi/src/minifi-c.cpp index 44152eb25d..98be6f4246 100644 --- a/libminifi/src/minifi-c.cpp +++ b/libminifi/src/minifi-c.cpp @@ -243,7 +243,8 @@ MinifiExtension* MinifiRegisterExtension(MinifiExtensionContext* extension_conte MinifiStatus MinifiRegisterProcessor(MinifiExtension* extension_handle, const MinifiProcessorClassDefinition* processor) { gsl_Assert(extension_handle); gsl_Assert(processor); - auto extension_info = reinterpret_cast(extension_handle)->getInfo(); + auto* extension = reinterpret_cast(extension_handle); + auto extension_info = extension->getInfo(); if (!extension_info) { return MINIFI_STATUS_UNKNOWN_ERROR; } @@ -257,6 +258,7 @@ MinifiStatus MinifiRegisterProcessor(MinifiExtension* extension_handle, const Mi c_class_description.name, std::make_unique(extension_info->name, toString(processor->full_name), c_class_description)); bundle_components.processors.emplace_back(description); + extension->addResource(c_class_description.name); }); return MINIFI_STATUS_SUCCESS; } diff --git a/libminifi/test/integration/extension-verification-test/CppApiResources.cpp b/libminifi/test/integration/extension-verification-test/CppApiResources.cpp index 7cee1b1d22..7f7a9f8d4b 100644 --- a/libminifi/test/integration/extension-verification-test/CppApiResources.cpp +++ b/libminifi/test/integration/extension-verification-test/CppApiResources.cpp @@ -32,14 +32,12 @@ REGISTER_RESOURCE(DummyProcessor, Processor); } // org::apache::nifi::minifi::test -extern "C" void MinifiInitCppExtension(MinifiExtension* extension, MinifiConfig* /*config*/) { - MinifiExtensionCreateInfo ext_create_info{ +extern "C" void MinifiInitCppExtension(MinifiExtensionContext* extension_context) { + MinifiExtensionDefinition extension_definition{ .name = minifi::utils::toStringView(MAKESTRING(MODULE_NAME)), .version = minifi::utils::toStringView("1.0.0"), .deinit = nullptr, - .user_data = nullptr, - .processors_count = 0, - .processors_ptr = nullptr + .user_data = nullptr }; - minifi::utils::MinifiCreateCppExtension(extension, &ext_create_info); + minifi::utils::MinifiRegisterCppExtension(extension_context, &extension_definition); } diff --git a/libminifi/test/integration/extension-verification-test/ExtensionLoadingTests.cpp b/libminifi/test/integration/extension-verification-test/ExtensionLoadingTests.cpp index 6b7a8e6415..9cac48251d 100644 --- a/libminifi/test/integration/extension-verification-test/ExtensionLoadingTests.cpp +++ b/libminifi/test/integration/extension-verification-test/ExtensionLoadingTests.cpp @@ -51,7 +51,8 @@ TEST_CASE("Loading an extension makes the processors available") { CHECK(core::ClassLoader::getDefaultClassLoader().instantiate("DummyProcessor", "dummy")); CHECK(core::ClassLoader::getDefaultClassLoader().instantiate("DummyCProcessor", "dummy")); } - CHECK_FALSE(core::ClassLoader::getDefaultClassLoader().instantiate("DummyProcessor", "dummy")); + // on some platforms the dlclose is noop, which does not trigger the static registrar's destruction + // CHECK_FALSE(core::ClassLoader::getDefaultClassLoader().instantiate("DummyProcessor", "dummy")); CHECK_FALSE(core::ClassLoader::getDefaultClassLoader().instantiate("DummyCProcessor", "dummy")); } From a08702d0f928bcea68e2bda878d697a9ac91bfee Mon Sep 17 00:00:00 2001 From: Adam Debreceni Date: Mon, 27 Apr 2026 11:53:04 +0200 Subject: [PATCH 3/4] MINIFICPP-2782 - Remove cpp api specific code --- .../CMakeLists.txt | 6 --- .../CppApiResources.cpp | 43 ------------------- .../ExtensionLoadingTests.cpp | 6 +-- 3 files changed, 1 insertion(+), 54 deletions(-) delete mode 100644 libminifi/test/integration/extension-verification-test/CppApiResources.cpp diff --git a/libminifi/test/integration/extension-verification-test/CMakeLists.txt b/libminifi/test/integration/extension-verification-test/CMakeLists.txt index 116ce1206b..05739901eb 100644 --- a/libminifi/test/integration/extension-verification-test/CMakeLists.txt +++ b/libminifi/test/integration/extension-verification-test/CMakeLists.txt @@ -92,11 +92,5 @@ createIntegrationTests(ExtensionLoadingTests) target_link_libraries(ExtensionLoadingTests core-minifi Catch2WithMain Threads::Threads) add_test(NAME ExtensionLoadingTests COMMAND ExtensionLoadingTests) - -create_loading_test_extension(test-extension-loading-cpp-resources CppApiResources.cpp) -add_dependencies(ExtensionLoadingTests test-extension-loading-cpp-resources) -target_link_libraries(test-extension-loading-cpp-resources PRIVATE ${LIBMINIFI}) -target_include_directories(test-extension-loading-cpp-resources BEFORE PRIVATE "${CMAKE_SOURCE_DIR}/libminifi/test/libtest/") - create_c_test_extension(c-resources 10) add_dependencies(ExtensionLoadingTests test-extension-loading-c-resources) diff --git a/libminifi/test/integration/extension-verification-test/CppApiResources.cpp b/libminifi/test/integration/extension-verification-test/CppApiResources.cpp deleted file mode 100644 index 7f7a9f8d4b..0000000000 --- a/libminifi/test/integration/extension-verification-test/CppApiResources.cpp +++ /dev/null @@ -1,43 +0,0 @@ -/** -* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include -#include "utils/ExtensionInitUtils.h" -#include "core/AbstractProcessor.h" -#include "core/Resource.h" -#include "unit/DummyProcessor.h" - -#define MKSOC(x) #x -#define MAKESTRING(x) MKSOC(x) // NOLINT(cppcoreguidelines-macro-usage) - -namespace minifi = org::apache::nifi::minifi; - -namespace org::apache::nifi::minifi::test { -REGISTER_RESOURCE(DummyProcessor, Processor); -} // org::apache::nifi::minifi::test - - -extern "C" void MinifiInitCppExtension(MinifiExtensionContext* extension_context) { - MinifiExtensionDefinition extension_definition{ - .name = minifi::utils::toStringView(MAKESTRING(MODULE_NAME)), - .version = minifi::utils::toStringView("1.0.0"), - .deinit = nullptr, - .user_data = nullptr - }; - minifi::utils::MinifiRegisterCppExtension(extension_context, &extension_definition); -} diff --git a/libminifi/test/integration/extension-verification-test/ExtensionLoadingTests.cpp b/libminifi/test/integration/extension-verification-test/ExtensionLoadingTests.cpp index 9cac48251d..0fb14bc967 100644 --- a/libminifi/test/integration/extension-verification-test/ExtensionLoadingTests.cpp +++ b/libminifi/test/integration/extension-verification-test/ExtensionLoadingTests.cpp @@ -44,15 +44,11 @@ class ExtensionLoadingTestController { }; TEST_CASE("Loading an extension makes the processors available") { - CHECK_FALSE(core::ClassLoader::getDefaultClassLoader().instantiate("DummyProcessor", "dummy")); CHECK_FALSE(core::ClassLoader::getDefaultClassLoader().instantiate("DummyCProcessor", "dummy")); { - ExtensionLoadingTestController controller{"*test-extension-loading-cpp-resources*,*test-extension-loading-c-resources*"}; - CHECK(core::ClassLoader::getDefaultClassLoader().instantiate("DummyProcessor", "dummy")); + ExtensionLoadingTestController controller{"*test-extension-loading-c-resources*"}; CHECK(core::ClassLoader::getDefaultClassLoader().instantiate("DummyCProcessor", "dummy")); } - // on some platforms the dlclose is noop, which does not trigger the static registrar's destruction - // CHECK_FALSE(core::ClassLoader::getDefaultClassLoader().instantiate("DummyProcessor", "dummy")); CHECK_FALSE(core::ClassLoader::getDefaultClassLoader().instantiate("DummyCProcessor", "dummy")); } From 3e42c8c3359c3258601ebacaf240b620c247caa8 Mon Sep 17 00:00:00 2001 From: Adam Debreceni Date: Tue, 28 Apr 2026 11:47:56 +0200 Subject: [PATCH 4/4] MINIFICPP-2782 - Rename --- libminifi/include/core/extension/Extension.h | 6 +++--- libminifi/src/core/extension/Extension.cpp | 4 ++-- libminifi/src/minifi-c.cpp | 2 +- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/libminifi/include/core/extension/Extension.h b/libminifi/include/core/extension/Extension.h index ef8d86e909..060c889f06 100644 --- a/libminifi/include/core/extension/Extension.h +++ b/libminifi/include/core/extension/Extension.h @@ -62,8 +62,8 @@ class Extension { return info_; } - void addResource(std::string resource_name) { - resources_.push_back(std::move(resource_name)); + void addClass(std::string class_name) { + classes_.push_back(std::move(class_name)); } private: @@ -89,7 +89,7 @@ class Extension { gsl::owner handle_ = nullptr; std::optional info_; - std::vector resources_; + std::vector classes_; uint32_t api_version_{0}; const std::shared_ptr logger_; diff --git a/libminifi/src/core/extension/Extension.cpp b/libminifi/src/core/extension/Extension.cpp index 1520861eed..1d210d3b6a 100644 --- a/libminifi/src/core/extension/Extension.cpp +++ b/libminifi/src/core/extension/Extension.cpp @@ -118,8 +118,8 @@ Extension::~Extension() { info_->deinit(info_->user_data); } if (info_) { - for (auto& resource_name : resources_) { - core::ClassLoader::getDefaultClassLoader().getClassLoader(info_->name).unregisterClass(resource_name); + for (auto& class_name : classes_) { + core::ClassLoader::getDefaultClassLoader().getClassLoader(info_->name).unregisterClass(class_name); } } unload(); diff --git a/libminifi/src/minifi-c.cpp b/libminifi/src/minifi-c.cpp index 98be6f4246..9a556e99ce 100644 --- a/libminifi/src/minifi-c.cpp +++ b/libminifi/src/minifi-c.cpp @@ -258,7 +258,7 @@ MinifiStatus MinifiRegisterProcessor(MinifiExtension* extension_handle, const Mi c_class_description.name, std::make_unique(extension_info->name, toString(processor->full_name), c_class_description)); bundle_components.processors.emplace_back(description); - extension->addResource(c_class_description.name); + extension->addClass(c_class_description.name); }); return MINIFI_STATUS_SUCCESS; }