Repository: nifi-minifi-cpp
Updated Branches:
  refs/heads/master a6e503451 -> 95e676a2b


MINIFICPP-383: Implement env variable replacement and set the default for repos 
to prefix with MINIFI_HOME

This closes #257.

Signed-off-by: Bin Qiu <[email protected]>


Project: http://git-wip-us.apache.org/repos/asf/nifi-minifi-cpp/repo
Commit: http://git-wip-us.apache.org/repos/asf/nifi-minifi-cpp/commit/95e676a2
Tree: http://git-wip-us.apache.org/repos/asf/nifi-minifi-cpp/tree/95e676a2
Diff: http://git-wip-us.apache.org/repos/asf/nifi-minifi-cpp/diff/95e676a2

Branch: refs/heads/master
Commit: 95e676a2b871f4baf6cfab4312753549e2d43ed6
Parents: a6e5034
Author: Marc Parisi <[email protected]>
Authored: Fri Feb 2 12:24:32 2018 -0500
Committer: Bin Qiu <[email protected]>
Committed: Thu Feb 8 15:45:53 2018 -0800

----------------------------------------------------------------------
 README.md                                       | 11 +++-
 conf/minifi.properties                          |  4 +-
 .../rocksdb-repos/DatabaseContentRepository.cpp |  2 +-
 .../rocksdb-repos/DatabaseContentRepository.h   |  1 -
 libminifi/include/ResourceClaim.h               |  6 +-
 libminifi/include/core/ContentRepository.h      |  6 ++
 libminifi/include/core/StreamManager.h          |  2 +
 libminifi/include/utils/StringUtils.h           | 39 ++++++++++++-
 libminifi/include/utils/file/FileUtils.h        | 23 ++++++++
 libminifi/src/FlowController.cpp                | 17 ------
 libminifi/src/Properties.cpp                    |  1 +
 libminifi/src/ResourceClaim.cpp                 |  6 +-
 .../core/repository/FileSystemRepository.cpp    |  9 +++
 .../rocksdb-tests/DBContentRepositoryTests.cpp  | 18 +++---
 libminifi/test/unit/StringUtilsTests.cpp        | 61 ++++++++++++++++++--
 main/MiNiFiMain.cpp                             | 14 ++++-
 16 files changed, 179 insertions(+), 41 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/nifi-minifi-cpp/blob/95e676a2/README.md
----------------------------------------------------------------------
diff --git a/README.md b/README.md
index 4bb0b6f..1eb2d08 100644
--- a/README.md
+++ b/README.md
@@ -494,7 +494,16 @@ 
https://cwiki.apache.org/confluence/display/MINIFI/C2+Design+Proposal
        c2.agent.heartbeat.reporter.class=RESTReciver
        
        
-            
+### Configuring Repository storage locations
+Persistent repositories, such as the Flow File repository, use a configurable 
path to store data. 
+The repository locations and their defaults are defined below. By default the 
MINIFI_HOME env
+variable is used. If this is not specified we extrapolate the path and use the 
root installation
+folder. You may specify your own path in place of these defaults. 
+     
+     in minifi.properties
+     
nifi.provenance.repository.directory.default=${MINIFI_HOME}/provenance_repository
+     
nifi.flowfile.repository.directory.default=${MINIFI_HOME}/flowfile_repository
+        
nifi.database.content.repository.directory.default=${MINIFI_HOME}/content_repository
 
 ### Configuring Volatile and NO-OP Repositories
 Each of the repositories can be configured to be volatile ( state kept in 
memory and flushed

http://git-wip-us.apache.org/repos/asf/nifi-minifi-cpp/blob/95e676a2/conf/minifi.properties
----------------------------------------------------------------------
diff --git a/conf/minifi.properties b/conf/minifi.properties
index 6668754..cb80fae 100644
--- a/conf/minifi.properties
+++ b/conf/minifi.properties
@@ -20,9 +20,11 @@ nifi.administrative.yield.duration=30 sec
 # If a component has no work to do (is "bored"), how long should we wait 
before checking again for work?
 nifi.bored.yield.duration=10 millis
 # Provenance Repository #
-nifi.provenance.repository.directory.default=./provenance_repository
+nifi.provenance.repository.directory.default=${MINIFI_HOME}/provenance_repository
 nifi.provenance.repository.max.storage.time=1 MIN
 nifi.provenance.repository.max.storage.size=1 MB
+nifi.flowfile.repository.directory.default=${MINIFI_HOME}/flowfile_repository
+nifi.database.content.repository.directory.default=${MINIFI_HOME}/content_repository
 #nifi.remote.input.secure=true
 nifi.https.need.ClientAuth=true
 nifi.https.client.certificate=./conf/client.pem

http://git-wip-us.apache.org/repos/asf/nifi-minifi-cpp/blob/95e676a2/extensions/rocksdb-repos/DatabaseContentRepository.cpp
----------------------------------------------------------------------
diff --git a/extensions/rocksdb-repos/DatabaseContentRepository.cpp 
b/extensions/rocksdb-repos/DatabaseContentRepository.cpp
index 40b2124..5842bf2 100644
--- a/extensions/rocksdb-repos/DatabaseContentRepository.cpp
+++ b/extensions/rocksdb-repos/DatabaseContentRepository.cpp
@@ -34,7 +34,7 @@ bool DatabaseContentRepository::initialize(const 
std::shared_ptr<minifi::Configu
   if 
(configuration->get(Configure::nifi_dbcontent_repository_directory_default, 
value)) {
     directory_ = value;
   } else {
-    directory_ = "dbcontentrepository";
+    directory_ = configuration->getHome() + "/dbcontentrepository";
   }
   rocksdb::Options options;
   options.create_if_missing = true;

http://git-wip-us.apache.org/repos/asf/nifi-minifi-cpp/blob/95e676a2/extensions/rocksdb-repos/DatabaseContentRepository.h
----------------------------------------------------------------------
diff --git a/extensions/rocksdb-repos/DatabaseContentRepository.h 
b/extensions/rocksdb-repos/DatabaseContentRepository.h
index 3c21e04..d469569 100644
--- a/extensions/rocksdb-repos/DatabaseContentRepository.h
+++ b/extensions/rocksdb-repos/DatabaseContentRepository.h
@@ -117,7 +117,6 @@ class DatabaseContentRepository : public 
core::ContentRepository, public core::C
 
  private:
   bool is_valid_;
-  std::string directory_;
   rocksdb::DB* db_;
   std::shared_ptr<logging::Logger> logger_;
 };

http://git-wip-us.apache.org/repos/asf/nifi-minifi-cpp/blob/95e676a2/libminifi/include/ResourceClaim.h
----------------------------------------------------------------------
diff --git a/libminifi/include/ResourceClaim.h 
b/libminifi/include/ResourceClaim.h
index b788416..8cae8fc 100644
--- a/libminifi/include/ResourceClaim.h
+++ b/libminifi/include/ResourceClaim.h
@@ -54,9 +54,11 @@ class ResourceClaim : public 
std::enable_shared_from_this<ResourceClaim> {
   /*!
    * Create a new resource claim
    */
-  ResourceClaim(std::shared_ptr<core::StreamManager<ResourceClaim>> 
claim_manager, const std::string contentDirectory = default_directory_path);
+  //explicit ResourceClaim(std::shared_ptr<core::StreamManager<ResourceClaim>> 
claim_manager, const std::string contentDirectory);
 
-  ResourceClaim(const std::string path, 
std::shared_ptr<core::StreamManager<ResourceClaim>> claim_manager, bool deleted 
= false);
+  explicit ResourceClaim(std::shared_ptr<core::StreamManager<ResourceClaim>> 
claim_manager);
+
+  explicit ResourceClaim(const std::string path, 
std::shared_ptr<core::StreamManager<ResourceClaim>> claim_manager, bool deleted 
= false);
   // Destructor
   ~ResourceClaim() {
   }

http://git-wip-us.apache.org/repos/asf/nifi-minifi-cpp/blob/95e676a2/libminifi/include/core/ContentRepository.h
----------------------------------------------------------------------
diff --git a/libminifi/include/core/ContentRepository.h 
b/libminifi/include/core/ContentRepository.h
index 87ac757..51d2765 100644
--- a/libminifi/include/core/ContentRepository.h
+++ b/libminifi/include/core/ContentRepository.h
@@ -46,6 +46,10 @@ class ContentRepository : public 
StreamManager<minifi::ResourceClaim> {
    */
   virtual bool initialize(const std::shared_ptr<Configure> &configure) = 0;
 
+  virtual std::string getStoragePath() {
+    return directory_;
+  }
+
   /**
    * Stops this repository.
    */
@@ -106,6 +110,8 @@ class ContentRepository : public 
StreamManager<minifi::ResourceClaim> {
 
  protected:
 
+  std::string directory_;
+
   std::mutex count_map_mutex_;
 
   std::map<std::string, uint32_t> count_map_;

http://git-wip-us.apache.org/repos/asf/nifi-minifi-cpp/blob/95e676a2/libminifi/include/core/StreamManager.h
----------------------------------------------------------------------
diff --git a/libminifi/include/core/StreamManager.h 
b/libminifi/include/core/StreamManager.h
index b6d0f0a..5de9dbe 100644
--- a/libminifi/include/core/StreamManager.h
+++ b/libminifi/include/core/StreamManager.h
@@ -41,6 +41,8 @@ class StreamManager {
 
   }
 
+  virtual std::string getStoragePath() = 0;
+
   /**
    * Create a write stream using the streamId as a reference.
    * @param streamId stream identifier

http://git-wip-us.apache.org/repos/asf/nifi-minifi-cpp/blob/95e676a2/libminifi/include/utils/StringUtils.h
----------------------------------------------------------------------
diff --git a/libminifi/include/utils/StringUtils.h 
b/libminifi/include/utils/StringUtils.h
index ddd8307..fc8139d 100644
--- a/libminifi/include/utils/StringUtils.h
+++ b/libminifi/include/utils/StringUtils.h
@@ -16,7 +16,7 @@
  */
 #ifndef LIBMINIFI_INCLUDE_IO_STRINGUTILS_H_
 #define LIBMINIFI_INCLUDE_IO_STRINGUTILS_H_
-
+#include <iostream>
 #include <algorithm>
 #include <sstream>
 #include <vector>
@@ -149,6 +149,43 @@ class StringUtils {
 
   }
 
+  static std::string replaceEnvironmentVariables(std::string& original_string) 
{
+    int32_t beg_seq = 0;
+    int32_t end_seq = 0;
+    std::string source_string = original_string;
+    do {
+      beg_seq = source_string.find("${", beg_seq);
+      if (beg_seq > 0 && source_string.at(beg_seq - 1) == '\\') {
+        beg_seq += 2;
+        continue;
+      }
+      if (beg_seq < 0)
+        break;
+      end_seq = source_string.find("}", beg_seq + 2);
+      if (end_seq < 0)
+        break;
+      if (end_seq - (beg_seq + 2) < 0) {
+        beg_seq += 2;
+        continue;
+      }
+      const std::string env_field = source_string.substr(beg_seq + 2, end_seq 
- (beg_seq + 2));
+      const std::string env_field_wrapped = source_string.substr(beg_seq, 
end_seq + 1);
+      if (env_field.empty()) {
+        continue;
+      }
+      const auto strVal = std::getenv(env_field.c_str());
+      std::string env_value;
+      if (strVal != nullptr)
+        env_value = strVal;
+      source_string = replaceAll(source_string, env_field_wrapped, env_value);
+      beg_seq = 0;  // restart
+    } while (beg_seq >= 0);
+
+    source_string = replaceAll(source_string, "\\$", "$");
+
+    return source_string;
+  }
+
   static std::string& replaceAll(std::string& source_string, const std::string 
&from_string, const std::string &to_string) {
     std::size_t loc = 0;
     std::size_t lastFound;

http://git-wip-us.apache.org/repos/asf/nifi-minifi-cpp/blob/95e676a2/libminifi/include/utils/file/FileUtils.h
----------------------------------------------------------------------
diff --git a/libminifi/include/utils/file/FileUtils.h 
b/libminifi/include/utils/file/FileUtils.h
index 2011d7e..fd14e3e 100644
--- a/libminifi/include/utils/file/FileUtils.h
+++ b/libminifi/include/utils/file/FileUtils.h
@@ -21,6 +21,8 @@
 #include <boost/filesystem.hpp>
 #else
 #include <cstdlib>
+#include <sys/stat.h>
+#include <dirent.h>
 #endif
 #include <cstdio>
 #include <unistd.h>
@@ -57,6 +59,27 @@ class FileUtils {
     return 0;
   }
 
+  static int create_dir(const std::string &path, bool create = true) {
+#ifdef BOOST_VERSION
+    boost::filesystem::path dir(path);
+    if(boost::filesystem::create_directory(dir))
+    {
+      return 0;
+    }
+    else
+    {
+      return -1;
+    }
+#else
+    struct stat dir_stat;
+    if (stat(path.c_str(), &dir_stat)) {
+      mkdir(path.c_str(), 0700);
+    }
+    return 0;
+#endif
+    return -1;
+  }
+
 };
 
 } /* namespace file */

http://git-wip-us.apache.org/repos/asf/nifi-minifi-cpp/blob/95e676a2/libminifi/src/FlowController.cpp
----------------------------------------------------------------------
diff --git a/libminifi/src/FlowController.cpp b/libminifi/src/FlowController.cpp
index e6118e6..e810e0c 100644
--- a/libminifi/src/FlowController.cpp
+++ b/libminifi/src/FlowController.cpp
@@ -137,23 +137,6 @@ void FlowController::initializePaths(const std::string 
&adjustedFilename) {
   configuration_filename_ = pathString;
   logger_->log_info("FlowController NiFi Configuration file %s", pathString);
 
-  // Create the content repo directory if needed
-  struct stat contentDirStat;
-
-  minifi::setDefaultDirectory(DEFAULT_CONTENT_DIRECTORY);
-
-  if (stat(minifi::default_directory_path.c_str(), &contentDirStat) != -1 && 
S_ISDIR(contentDirStat.st_mode)) {
-    path = realpath(minifi::default_directory_path.c_str(), full_path);
-    logger_->log_info("FlowController content directory %s", full_path);
-  } else {
-    if (mkdir(minifi::default_directory_path.c_str(), 0777) == -1) {
-      logger_->log_error("FlowController content directory creation failed");
-      exit(1);
-    }
-  }
-
-  std::string clientAuthStr;
-
   if (!path) {
     logger_->log_error("Could not locate path from provided configuration file 
name (%s).  Exiting.", full_path);
     exit(1);

http://git-wip-us.apache.org/repos/asf/nifi-minifi-cpp/blob/95e676a2/libminifi/src/Properties.cpp
----------------------------------------------------------------------
diff --git a/libminifi/src/Properties.cpp b/libminifi/src/Properties.cpp
index abebfbb..cb3b752 100644
--- a/libminifi/src/Properties.cpp
+++ b/libminifi/src/Properties.cpp
@@ -86,6 +86,7 @@ void Properties::parseConfigureFileLine(char *buf) {
   }
 
   std::string value = equal;
+  value = 
org::apache::nifi::minifi::utils::StringUtils::replaceEnvironmentVariables(value);
   key = org::apache::nifi::minifi::utils::StringUtils::trimRight(key);
   value = org::apache::nifi::minifi::utils::StringUtils::trimRight(value);
   set(key, value);

http://git-wip-us.apache.org/repos/asf/nifi-minifi-cpp/blob/95e676a2/libminifi/src/ResourceClaim.cpp
----------------------------------------------------------------------
diff --git a/libminifi/src/ResourceClaim.cpp b/libminifi/src/ResourceClaim.cpp
index 783a108..609ca20 100644
--- a/libminifi/src/ResourceClaim.cpp
+++ b/libminifi/src/ResourceClaim.cpp
@@ -41,10 +41,14 @@ void setDefaultDirectory(std::string path) {
   default_directory_path = path;
 }
 
-ResourceClaim::ResourceClaim(std::shared_ptr<core::StreamManager<ResourceClaim>>
 claim_manager, const std::string contentDirectory)
+ResourceClaim::ResourceClaim(std::shared_ptr<core::StreamManager<ResourceClaim>>
 claim_manager)
     : claim_manager_(claim_manager),
       deleted_(false),
       logger_(logging::LoggerFactory<ResourceClaim>::getLogger()) {
+  auto contentDirectory = claim_manager_->getStoragePath();
+  if (contentDirectory.empty())
+    contentDirectory = default_directory_path;
+
   // Create the full content path for the content
   _contentFullPath = contentDirectory + "/" + 
non_repeating_string_generator_.generate();
   logger_->log_debug("Resource Claim created %s", _contentFullPath);

http://git-wip-us.apache.org/repos/asf/nifi-minifi-cpp/blob/95e676a2/libminifi/src/core/repository/FileSystemRepository.cpp
----------------------------------------------------------------------
diff --git a/libminifi/src/core/repository/FileSystemRepository.cpp 
b/libminifi/src/core/repository/FileSystemRepository.cpp
index 4945b31..c0f1694 100644
--- a/libminifi/src/core/repository/FileSystemRepository.cpp
+++ b/libminifi/src/core/repository/FileSystemRepository.cpp
@@ -18,7 +18,9 @@
 
 #include "core/repository/FileSystemRepository.h"
 #include <memory>
+#include <string>
 #include "io/FileStream.h"
+#include "utils/file/FileUtils.h"
 
 namespace org {
 namespace apache {
@@ -28,6 +30,13 @@ namespace core {
 namespace repository {
 
 bool FileSystemRepository::initialize(const std::shared_ptr<minifi::Configure> 
&configuration) {
+  std::string value;
+  if 
(configuration->get(Configure::nifi_dbcontent_repository_directory_default, 
value)) {
+    directory_ = value;
+  } else {
+    directory_ = configuration->getHome() + "/contentrepository";
+  }
+  utils::file::FileUtils::create_dir(directory_);
   return true;
 }
 void FileSystemRepository::stop() {

http://git-wip-us.apache.org/repos/asf/nifi-minifi-cpp/blob/95e676a2/libminifi/test/rocksdb-tests/DBContentRepositoryTests.cpp
----------------------------------------------------------------------
diff --git a/libminifi/test/rocksdb-tests/DBContentRepositoryTests.cpp 
b/libminifi/test/rocksdb-tests/DBContentRepositoryTests.cpp
index 0dc2a3d..15fb81d 100644
--- a/libminifi/test/rocksdb-tests/DBContentRepositoryTests.cpp
+++ b/libminifi/test/rocksdb-tests/DBContentRepositoryTests.cpp
@@ -36,7 +36,7 @@ TEST_CASE("Write Claim", "[TestDBCR1]") {
   REQUIRE(true == content_repo->initialize(configuration));
 
 
-  auto claim = std::make_shared<minifi::ResourceClaim>(content_repo, dir);
+  auto claim = std::make_shared<minifi::ResourceClaim>(content_repo);
   auto stream = content_repo->write(claim);
 
   stream->writeUTF("well hello there");
@@ -77,7 +77,7 @@ TEST_CASE("Delete Claim", "[TestDBCR2]") {
   REQUIRE(true == content_repo->initialize(configuration));
 
 
-  auto claim = std::make_shared<minifi::ResourceClaim>(content_repo, dir);
+  auto claim = std::make_shared<minifi::ResourceClaim>(content_repo);
   auto stream = content_repo->write(claim);
 
   stream->writeUTF("well hello there");
@@ -115,7 +115,7 @@ TEST_CASE("Test Empty Claim", "[TestDBCR3]") {
   
configuration->set(minifi::Configure::nifi_dbcontent_repository_directory_default,
 dir);
   REQUIRE(true == content_repo->initialize(configuration));
 
-  auto claim = std::make_shared<minifi::ResourceClaim>(content_repo, dir);
+  auto claim = std::make_shared<minifi::ResourceClaim>(content_repo);
   auto stream = content_repo->write(claim);
 
   // we're writing nothing to the stream.
@@ -152,7 +152,7 @@ TEST_CASE("Test Null Claim", "[TestDBCR4]") {
   REQUIRE(true == content_repo->initialize(configuration));
 
 
-  auto claim = std::make_shared<minifi::ResourceClaim>(content_repo, dir);
+  auto claim = std::make_shared<minifi::ResourceClaim>(content_repo);
   auto stream = content_repo->write(nullptr);
 
   REQUIRE(stream == nullptr);
@@ -172,7 +172,7 @@ TEST_CASE("Delete Null Claim", "[TestDBCR5]") {
   
configuration->set(minifi::Configure::nifi_dbcontent_repository_directory_default,
 dir);
   REQUIRE(true == content_repo->initialize(configuration));
 
-  auto claim = std::make_shared<minifi::ResourceClaim>(content_repo, dir);
+  auto claim = std::make_shared<minifi::ResourceClaim>(content_repo);
   auto stream = content_repo->write(claim);
 
   stream->writeUTF("well hello there");
@@ -212,8 +212,8 @@ TEST_CASE("Delete NonExistent Claim", "[TestDBCR5]") {
   
configuration->set(minifi::Configure::nifi_dbcontent_repository_directory_default,
 dir);
   REQUIRE(true == content_repo->initialize(configuration));
 
-  auto claim = std::make_shared<minifi::ResourceClaim>(content_repo, dir);
-  auto claim2 = std::make_shared<minifi::ResourceClaim>(content_repo, dir);
+  auto claim = std::make_shared<minifi::ResourceClaim>(content_repo);
+  auto claim2 = std::make_shared<minifi::ResourceClaim>(content_repo);
   auto stream = content_repo->write(claim);
 
   stream->writeUTF("well hello there");
@@ -254,8 +254,8 @@ TEST_CASE("Delete Remove Count Claim", "[TestDBCR6]") {
   
configuration->set(minifi::Configure::nifi_dbcontent_repository_directory_default,
 dir);
   REQUIRE(true == content_repo->initialize(configuration));
 
-  auto claim = std::make_shared<minifi::ResourceClaim>(content_repo, dir);
-  auto claim2 = std::make_shared<minifi::ResourceClaim>(content_repo, dir);
+  auto claim = std::make_shared<minifi::ResourceClaim>(content_repo);
+  auto claim2 = std::make_shared<minifi::ResourceClaim>(content_repo);
   auto stream = content_repo->write(claim);
 
   stream->writeUTF("well hello there");

http://git-wip-us.apache.org/repos/asf/nifi-minifi-cpp/blob/95e676a2/libminifi/test/unit/StringUtilsTests.cpp
----------------------------------------------------------------------
diff --git a/libminifi/test/unit/StringUtilsTests.cpp 
b/libminifi/test/unit/StringUtilsTests.cpp
index c4e839b..3abf339 100644
--- a/libminifi/test/unit/StringUtilsTests.cpp
+++ b/libminifi/test/unit/StringUtilsTests.cpp
@@ -18,27 +18,78 @@
 
 #include <string>
 #include <vector>
-
+#include <cstdlib>
 #include "../TestBase.h"
 #include "core/Core.h"
 #include "utils/StringUtils.h"
 
+using org::apache::nifi::minifi::utils::StringUtils;
+
 TEST_CASE("TestStringUtils::split", "[test split no delimiter]") {
   std::vector<std::string> expected = { "hello" };
-  REQUIRE(expected == 
org::apache::nifi::minifi::utils::StringUtils::split("hello", ","));
+  REQUIRE(expected == StringUtils::split("hello", ","));
 }
 
 TEST_CASE("TestStringUtils::split2", "[test split single delimiter]") {
   std::vector<std::string> expected = { "hello", "world" };
-  REQUIRE(expected == 
org::apache::nifi::minifi::utils::StringUtils::split("hello world", " "));
+  REQUIRE(expected == StringUtils::split("hello world", " "));
 }
 
 TEST_CASE("TestStringUtils::split3", "[test split multiple delimiter]") {
   std::vector<std::string> expected = { "hello", "world", "I'm", "a", "unit", 
"test" };
-  REQUIRE(expected == 
org::apache::nifi::minifi::utils::StringUtils::split("hello world I'm a unit 
test", " "));
+  REQUIRE(expected == StringUtils::split("hello world I'm a unit test", " "));
 }
 
 TEST_CASE("TestStringUtils::split4", "[test split classname]") {
   std::vector<std::string> expected = { "org", "apache", "nifi", "minifi", 
"utils", "StringUtils" };
-  REQUIRE(expected == 
org::apache::nifi::minifi::utils::StringUtils::split(org::apache::nifi::minifi::core::getClassName<org::apache::nifi::minifi::utils::StringUtils>(),
 "::"));
+  REQUIRE(expected == 
StringUtils::split(org::apache::nifi::minifi::core::getClassName<org::apache::nifi::minifi::utils::StringUtils>(),
 "::"));
+}
+
+TEST_CASE("TestStringUtils::testEnv1", "[test split classname]") {
+  std::string test_string = "hello world ${blahblahnamenamenotexist}";
+
+  setenv("blahblahnamenamenotexist", "computer", 0);
+
+  std::string expected = "hello world computer";
+
+  REQUIRE(expected == StringUtils::replaceEnvironmentVariables(test_string));
+}
+
+TEST_CASE("TestStringUtils::testEnv2", "[test split classname]") {
+  std::string test_string = "hello world ${blahblahnamenamenotexist";
+
+  setenv("blahblahnamenamenotexist", "computer", 0);
+
+  std::string expected = "hello world ${blahblahnamenamenotexist";
+
+  REQUIRE(expected == StringUtils::replaceEnvironmentVariables(test_string));
+}
+
+TEST_CASE("TestStringUtils::testEnv3", "[test split classname]") {
+  std::string test_string = "hello world $${blahblahnamenamenotexist}";
+
+  setenv("blahblahnamenamenotexist", "computer", 0);
+
+  std::string expected = "hello world $computer";
+
+  REQUIRE(expected == StringUtils::replaceEnvironmentVariables(test_string));
+}
+
+TEST_CASE("TestStringUtils::testEnv4", "[test split classname]") {
+  std::string test_string = "hello world \\${blahblahnamenamenotexist}";
+
+  setenv("blahblahnamenamenotexist", "computer", 0);
+
+  std::string expected = "hello world ${blahblahnamenamenotexist}";
+
+  REQUIRE(expected == StringUtils::replaceEnvironmentVariables(test_string));
+}
+
+TEST_CASE("TestStringUtils::testEnv5", "[test split classname]") {
+  // can't use blahblahnamenamenotexist because the setenv in other functions 
may have already set it
+  std::string test_string = "hello world ${blahblahnamenamenotexist2}";
+
+  std::string expected = "hello world ";
+
+  REQUIRE(expected == StringUtils::replaceEnvironmentVariables(test_string));
 }

http://git-wip-us.apache.org/repos/asf/nifi-minifi-cpp/blob/95e676a2/main/MiNiFiMain.cpp
----------------------------------------------------------------------
diff --git a/main/MiNiFiMain.cpp b/main/MiNiFiMain.cpp
index 780c4c9..6a669fe 100644
--- a/main/MiNiFiMain.cpp
+++ b/main/MiNiFiMain.cpp
@@ -19,6 +19,7 @@
  */
 #include <fcntl.h>
 #include <stdio.h>
+#include <cstdlib>
 #include <semaphore.h>
 #include <signal.h>
 #include <vector>
@@ -27,7 +28,7 @@
 #include <unistd.h>
 #include <yaml-cpp/yaml.h>
 #include <iostream>
-
+#include "ResourceClaim.h"
 #include "core/Core.h"
 
 #include "core/FlowConfiguration.h"
@@ -101,6 +102,9 @@ int main(int argc, char **argv) {
       getcwd(cwd, PATH_MAX);
       minifiHome = cwd;
     }
+
+    logger->log_debug("Setting %s to %s", MINIFI_HOME_ENV_KEY, minifiHome);
+    setenv(MINIFI_HOME_ENV_KEY, minifiHome.c_str(), 0);
   }
 
   if (!validHome(minifiHome)) {
@@ -110,7 +114,7 @@ int main(int argc, char **argv) {
   }
 
   if (signal(SIGINT, sigHandler) == SIG_ERR || signal(SIGTERM, sigHandler) == 
SIG_ERR || signal(SIGPIPE, SIG_IGN) == SIG_ERR) {
-    std::cerr << "Cannot install signal handler" <<  std::endl;
+    std::cerr << "Cannot install signal handler" << std::endl;
     return -1;
   }
 
@@ -161,6 +165,12 @@ int main(int argc, char **argv) {
 
   content_repo->initialize(configure);
 
+  std::string content_repo_path;
+  if 
(configure->get(minifi::Configure::nifi_dbcontent_repository_directory_default, 
content_repo_path)){
+    std::cout << "setting default dir to " << content_repo_path<< std::endl;
+    minifi::setDefaultDirectory(content_repo_path);
+  }
+
   configure->get(minifi::Configure::nifi_configuration_class_name, 
nifi_configuration_class_name);
 
   std::shared_ptr<minifi::io::StreamFactory> stream_factory = 
std::make_shared<minifi::io::StreamFactory>(configure);

Reply via email to