This is an automated email from the ASF dual-hosted git repository.
phrocker pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/nifi-minifi-cpp.git
The following commit(s) were added to refs/heads/master by this push:
new 398f17b MINIFICPP-877 - Add initializers to ObjectFactories
398f17b is described below
commit 398f17b4bfe1755ed02ae672b741aa2928c0d12a
Author: Daniel Bakai <[email protected]>
AuthorDate: Wed May 22 18:31:18 2019 +0200
MINIFICPP-877 - Add initializers to ObjectFactories
This closes #567.
Signed-off-by: Marc Parisi <[email protected]>
---
extensions/http-curl/HTTPCurlLoader.h | 15 +++++++++++
extensions/http-curl/client/HTTPClient.cpp | 6 -----
extensions/http-curl/client/HTTPClient.h | 21 ---------------
extensions/http-curl/processors/InvokeHTTP.h | 2 --
libminifi/include/core/ClassLoader.h | 40 ++++++++++++++++++++++++++++
libminifi/src/core/ClassLoader.cpp | 9 +++++++
libminifi/test/TestBase.h | 1 +
7 files changed, 65 insertions(+), 29 deletions(-)
diff --git a/extensions/http-curl/HTTPCurlLoader.h
b/extensions/http-curl/HTTPCurlLoader.h
index d01f822..3d24cd4 100644
--- a/extensions/http-curl/HTTPCurlLoader.h
+++ b/extensions/http-curl/HTTPCurlLoader.h
@@ -35,6 +35,17 @@
#include "sitetosite/HTTPProtocol.h"
#include "utils/StringUtils.h"
+class HttpCurlObjectFactoryInitializer : public core::ObjectFactoryInitializer
{
+ public:
+ virtual bool initialize() {
+ return curl_global_init(CURL_GLOBAL_DEFAULT) == CURLE_OK;
+ }
+
+ virtual void deinitialize() {
+ curl_global_cleanup();
+ }
+};
+
class HttpCurlObjectFactory : public core::ObjectFactory {
public:
HttpCurlObjectFactory() {
@@ -80,6 +91,10 @@ class HttpCurlObjectFactory : public core::ObjectFactory {
}
}
+ virtual std::unique_ptr<core::ObjectFactoryInitializer> getInitializer() {
+ return std::unique_ptr<core::ObjectFactoryInitializer>(new
HttpCurlObjectFactoryInitializer());
+ }
+
static bool added;
};
diff --git a/extensions/http-curl/client/HTTPClient.cpp
b/extensions/http-curl/client/HTTPClient.cpp
index 6ef19f2..f2be475 100644
--- a/extensions/http-curl/client/HTTPClient.cpp
+++ b/extensions/http-curl/client/HTTPClient.cpp
@@ -47,8 +47,6 @@ HTTPClient::HTTPClient(const std::string &url, const
std::shared_ptr<minifi::con
keep_alive_probe_(-1),
keep_alive_idle_(-1),
logger_(logging::LoggerFactory<HTTPClient>::getLogger()) {
- HTTPClientInitializer *initializer = HTTPClientInitializer::getInstance();
- initializer->initialize();
http_session_ = curl_easy_init();
}
@@ -69,8 +67,6 @@ HTTPClient::HTTPClient(std::string name, utils::Identifier
uuid)
keep_alive_probe_(-1),
keep_alive_idle_(-1),
logger_(logging::LoggerFactory<HTTPClient>::getLogger()) {
- HTTPClientInitializer *initializer = HTTPClientInitializer::getInstance();
- initializer->initialize();
http_session_ = curl_easy_init();
}
@@ -91,8 +87,6 @@ HTTPClient::HTTPClient()
keep_alive_probe_(-1),
keep_alive_idle_(-1),
logger_(logging::LoggerFactory<HTTPClient>::getLogger()) {
- HTTPClientInitializer *initializer = HTTPClientInitializer::getInstance();
- initializer->initialize();
http_session_ = curl_easy_init();
}
diff --git a/extensions/http-curl/client/HTTPClient.h
b/extensions/http-curl/client/HTTPClient.h
index 84cb1a6..d27a688 100644
--- a/extensions/http-curl/client/HTTPClient.h
+++ b/extensions/http-curl/client/HTTPClient.h
@@ -46,27 +46,6 @@ namespace minifi {
namespace utils {
/**
- * Purpose and Justification: Initializes and cleans up curl once. Cleanup
will only occur at the end of our execution since we are relying on a static
variable.
- */
-class HTTPClientInitializer {
- public:
- static HTTPClientInitializer *getInstance() {
- static HTTPClientInitializer initializer;
- return &initializer;
- }
- void initialize() {
-
- }
- private:
- ~HTTPClientInitializer() {
- curl_global_cleanup();
- }
- HTTPClientInitializer() {
- curl_global_init(CURL_GLOBAL_DEFAULT);
- }
-};
-
-/**
* Purpose and Justification: Pull the basics for an HTTPClient into a self
contained class. Simply provide
* the URL and an SSLContextService ( can be null).
*
diff --git a/extensions/http-curl/processors/InvokeHTTP.h
b/extensions/http-curl/processors/InvokeHTTP.h
index 3da3c75..7c62aa2 100644
--- a/extensions/http-curl/processors/InvokeHTTP.h
+++ b/extensions/http-curl/processors/InvokeHTTP.h
@@ -60,8 +60,6 @@ class InvokeHTTP : public core::Processor {
penalize_no_retry_(false),
disable_peer_verification_(false),
logger_(logging::LoggerFactory<InvokeHTTP>::getLogger()) {
- static utils::HTTPClientInitializer *initializer =
utils::HTTPClientInitializer::getInstance();
- initializer->initialize();
}
// Destructor
virtual ~InvokeHTTP();
diff --git a/libminifi/include/core/ClassLoader.h
b/libminifi/include/core/ClassLoader.h
index ad82e71..41d683e 100644
--- a/libminifi/include/core/ClassLoader.h
+++ b/libminifi/include/core/ClassLoader.h
@@ -21,6 +21,7 @@
#include <mutex>
#include <vector>
#include <map>
+#include <memory>
#include "utils/StringUtils.h"
#ifndef WIN32
#include <dlfcn.h>
@@ -54,6 +55,27 @@ namespace core {
#endif
/**
+ * Class used to provide a global initialization and deinitialization function
for an ObjectFactory.
+ * Calls to instances of all ObjectFactoryInitializers are done under a unique
lock.
+ */
+class ObjectFactoryInitializer {
+ public:
+ virtual ~ObjectFactoryInitializer() {
+ }
+
+ /**
+ * This function is be called before the ObjectFactory is used.
+ * @return whether the initialization was successful. If false, deinitialize
will NOT be called.
+ */
+ virtual bool initialize() = 0;
+
+ /**
+ * This function will be called after the ObjectFactory is not needed
anymore.
+ */
+ virtual void deinitialize() = 0;
+};
+
+/**
* Factory that is used as an interface for
* creating processors from shared objects.
*/
@@ -104,6 +126,13 @@ class ObjectFactory {
}
/**
+ * Returns an initializer for the factory.
+ */
+ virtual std::unique_ptr<ObjectFactoryInitializer> getInitializer() {
+ return nullptr;
+ }
+
+ /**
* Gets the name of the object.
* @return class name of processor
*/
@@ -238,6 +267,9 @@ class ClassLoader {
ClassLoader();
~ClassLoader() {
+ for (auto& initializer : initializers_) {
+ initializer->deinitialize();
+ }
loaded_factories_.clear();
for (auto ptr : dl_handles_) {
dlclose(ptr);
@@ -289,6 +321,12 @@ class ClassLoader {
return;
}
+ auto initializer = factory->getInitializer();
+ if (initializer != nullptr) {
+ initializer->initialize();
+ initializers_.emplace_back(std::move(initializer));
+ }
+
auto canonical_name = factory->getClassName();
auto group_name = factory->getGroupName();
@@ -526,6 +564,8 @@ class ClassLoader {
std::mutex internal_mutex_;
std::vector<void *> dl_handles_;
+
+ std::vector<std::unique_ptr<ObjectFactoryInitializer>> initializers_;
};
template<class T>
diff --git a/libminifi/src/core/ClassLoader.cpp
b/libminifi/src/core/ClassLoader.cpp
index 9c1aa67..c51acaf 100644
--- a/libminifi/src/core/ClassLoader.cpp
+++ b/libminifi/src/core/ClassLoader.cpp
@@ -64,6 +64,15 @@ uint16_t ClassLoader::registerResource(const std::string
&resource, const std::s
std::lock_guard<std::mutex> lock(internal_mutex_);
+ auto initializer = factory->getInitializer();
+ if (initializer != nullptr) {
+ if (!initializer->initialize()) {
+ delete factory;
+ return RESOURCE_FAILURE;
+ }
+ initializers_.emplace_back(std::move(initializer));
+ }
+
for (auto class_name : factory->getClassNames()) {
loaded_factories_[class_name] =
std::unique_ptr<ObjectFactory>(factory->assign(class_name));
}
diff --git a/libminifi/test/TestBase.h b/libminifi/test/TestBase.h
index 04aa3b4..33bf40e 100644
--- a/libminifi/test/TestBase.h
+++ b/libminifi/test/TestBase.h
@@ -256,6 +256,7 @@ class TestController {
TestController()
: log(LogTestController::getInstance()) {
+ core::FlowConfiguration::initialize_static_functions();
minifi::setDefaultDirectory("./");
log.reset();
utils::IdGenerator::getIdGenerator()->initialize(std::make_shared<minifi::Properties>());