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>());

Reply via email to