This is an automated email from the ASF dual-hosted git repository.

martinzink pushed a commit to branch MINIFICPP-2584-apache
in repository https://gitbox.apache.org/repos/asf/nifi-minifi-cpp.git

commit f4d23937045f73b8e2016f71b4dc5334a16a2b47
Author: Martin Zink <[email protected]>
AuthorDate: Tue Jul 15 21:52:36 2025 +0200

    remove LocationsImpl.h
---
 controller/MiNiFiController.cpp                    |   7 +-
 .../tests/ExpressionLanguageTests.cpp              |   1 -
 extensions/python/PythonCreator.h                  |  38 ++++----
 .../rocksdb-repos/DatabaseContentRepository.cpp    |  16 ++--
 extensions/rocksdb-repos/FlowFileRepository.cpp    |  12 +--
 .../controllers/RocksDbStateStorage.cpp            |   9 +-
 .../rocksdb-repos/tests/ContentSessionTests.cpp    |   1 -
 .../tests/DBContentRepositoryTests.cpp             |  12 ---
 extensions/rocksdb-repos/tests/EncryptionTests.cpp |   1 -
 extensions/rocksdb-repos/tests/RepoTests.cpp       |  14 ---
 extensions/rocksdb-repos/tests/SwapTests.cpp       |   1 -
 extensions/sftp/tests/ListSFTPTests.cpp            |   6 --
 .../tests/unit/TailFileTests.cpp                   |   1 -
 libminifi/include/properties/Configure.h           |   5 -
 libminifi/include/properties/LocationsImpl.h       | 103 ---------------------
 libminifi/src/Configure.cpp                        |   9 --
 libminifi/src/core/extension/ExtensionManager.cpp  |  13 +--
 libminifi/src/utils/file/AssetManager.cpp          |  11 +--
 libminifi/test/integration/AlertTests.cpp          |   1 -
 libminifi/test/integration/C2DebugBundleTest.cpp   |   1 -
 .../test/integration/C2PropertiesUpdateTests.cpp   |   1 -
 libminifi/test/libtest/unit/TestBase.cpp           |   1 -
 .../test/persistence-tests/PersistenceTests.cpp    |   2 -
 libminifi/test/unit/DecryptorTests.cpp             |   1 -
 libminifi/test/unit/LogMetricsPublisherTests.cpp   |   1 -
 libminifi/test/unit/ProcessSessionTests.cpp        |   1 -
 .../include/minifi-cpp/properties/Configure.h      |   3 -
 .../include/minifi-cpp/properties/Locations.h      |  37 --------
 minifi_main/Fips.cpp                               |  21 +++--
 minifi_main/Fips.h                                 |   3 +-
 minifi_main/MainHelper.cpp                         |  36 ++++++-
 minifi_main/MainHelper.h                           |  22 ++---
 minifi_main/MiNiFiMain.cpp                         |  26 +++---
 utils/include/utils/Locations.h                    |  42 +++++++++
 34 files changed, 158 insertions(+), 301 deletions(-)

diff --git a/controller/MiNiFiController.cpp b/controller/MiNiFiController.cpp
index 643ec6951..a14ba8e0a 100644
--- a/controller/MiNiFiController.cpp
+++ b/controller/MiNiFiController.cpp
@@ -97,11 +97,10 @@ int main(int argc, char **argv) {
   }
 
   const auto configuration = std::make_shared<minifi::ConfigureImpl>();
-  configuration->setLocations(locations);
-  configuration->loadConfigureFile(locations->getPropertiesPath());
+  configuration->loadConfigureFile(locations->properties_path_);
 
-  const auto log_properties = 
std::make_shared<minifi::core::logging::LoggerProperties>(locations->getLogsDirs());
-  log_properties->loadConfigureFile(locations->getLogPropertiesPath(), 
"nifi.log.");
+  const auto log_properties = 
std::make_shared<minifi::core::logging::LoggerProperties>(locations->logs_dir_);
+  log_properties->loadConfigureFile(locations->log_properties_path_, 
"nifi.log.");
 
   
minifi::core::logging::LoggerConfiguration::getConfiguration().initialize(log_properties);
 
diff --git a/extensions/expression-language/tests/ExpressionLanguageTests.cpp 
b/extensions/expression-language/tests/ExpressionLanguageTests.cpp
index 007f23134..d2a915a84 100644
--- a/extensions/expression-language/tests/ExpressionLanguageTests.cpp
+++ b/extensions/expression-language/tests/ExpressionLanguageTests.cpp
@@ -193,7 +193,6 @@ TEST_CASE("GetFile PutFile dynamic attribute", 
"[expressionLanguageTestGetFilePu
   
LogTestController::getInstance().setTrace<minifi::processors::UpdateAttribute>();
 
   auto conf = std::make_shared<minifi::ConfigureImpl>();
-  
conf->setLocations(minifi::LocationsImpl::createFromMinifiHome(testController.createTempDirectory()));
 
   conf->set("nifi.my.own.property", "custom_value");
 
diff --git a/extensions/python/PythonCreator.h 
b/extensions/python/PythonCreator.h
index a6a38e7ea..b10d767f0 100644
--- a/extensions/python/PythonCreator.h
+++ b/extensions/python/PythonCreator.h
@@ -18,26 +18,28 @@
 
 #pragma once
 
-#include <vector>
 #include <algorithm>
-#include <string>
-#include <memory>
 #include <filesystem>
-#include "core/Core.h"
-#include "core/logging/LoggerFactory.h"
-#include "core/Resource.h"
+#include <memory>
+#include <string>
+#include <vector>
+
 #include "ExecutePythonProcessor.h"
 #include "PythonConfigState.h"
+#include "PythonDependencyInstaller.h"
 #include "PythonObjectFactory.h"
+#include "core/Core.h"
+#include "core/Resource.h"
+#include "core/logging/LoggerFactory.h"
 #include "minifi-cpp/agent/agent_version.h"
 #include "minifi-cpp/agent/build_description.h"
-#include "utils/file/FileUtils.h"
-#include "utils/StringUtils.h"
 #include "range/v3/algorithm.hpp"
-#include "utils/file/FilePattern.h"
 #include "range/v3/view/filter.hpp"
-#include "PythonDependencyInstaller.h"
-#include "utils/file/PathUtils.h"
+#include "utils/Environment.h"
+#include "utils/Locations.h"
+#include "utils/StringUtils.h"
+#include "utils/file/FilePattern.h"
+#include "utils/file/FileUtils.h"
 
 namespace org::apache::nifi::minifi::extensions::python {
 
@@ -162,19 +164,13 @@ class PythonCreator : public 
minifi::core::CoreComponentImpl {
   }
 
   std::filesystem::path getPythonLibPath(const std::shared_ptr<Configure>& 
configuration) {
-    constexpr std::string_view DEFAULT_EXTENSION_PATH = "../extensions/*";
     const std::string pattern = [&] {
-      if (const auto opt_pattern = 
configuration->get(minifi::Configuration::nifi_extension_path)) {
+      if (const auto opt_pattern = 
configuration->get(Configuration::nifi_extension_path)) {
         return *opt_pattern;
       };
-
-      if (const auto locations = configuration->getLocations()) {
-        logger_->log_warn("No extension path is provided in properties, using 
default : '{}'", locations->getDefaultExtensionsPattern());
-        return std::string(locations->getDefaultExtensionsPattern());
-      };
-
-      logger_->log_error("No extension path is provided in properties and 
locations is empty, using hard-coded default: '{}'", DEFAULT_EXTENSION_PATH);
-      return std::string(DEFAULT_EXTENSION_PATH);
+      const auto default_extension_path = utils::getDefaultExtensionsPattern();
+      logger_->log_warn("No extension path is provided in properties, using 
default: '{}'", default_extension_path);
+      return default_extension_path;
     }();
     const auto candidates = 
utils::file::match(utils::file::FilePattern(pattern, [&] (std::string_view 
subpattern, std::string_view error_msg) {
       logger_->log_error("Error in subpattern '{}': {}", subpattern, 
error_msg);
diff --git a/extensions/rocksdb-repos/DatabaseContentRepository.cpp 
b/extensions/rocksdb-repos/DatabaseContentRepository.cpp
index 5829601ab..6bfa6cefa 100644
--- a/extensions/rocksdb-repos/DatabaseContentRepository.cpp
+++ b/extensions/rocksdb-repos/DatabaseContentRepository.cpp
@@ -17,26 +17,26 @@
 
 #include "DatabaseContentRepository.h"
 
+#include <cinttypes>
 #include <memory>
 #include <string>
 #include <utility>
 #include <vector>
-#include <cinttypes>
 
-#include "encryption/RocksDbEncryptionProvider.h"
-#include "RocksDbStream.h"
-#include "utils/gsl.h"
 #include "Exception.h"
-#include "database/RocksDbUtils.h"
-#include "database/StringAppender.h"
+#include "RocksDbStream.h"
 #include "core/Resource.h"
 #include "core/TypedValues.h"
+#include "database/RocksDbUtils.h"
+#include "database/StringAppender.h"
+#include "encryption/RocksDbEncryptionProvider.h"
+#include "utils/Locations.h"
+#include "utils/gsl.h"
 
 namespace org::apache::nifi::minifi::core::repository {
 
 bool DatabaseContentRepository::initialize(const 
std::shared_ptr<minifi::Configure> &configuration) {
-  const auto locations = configuration->getLocations();
-  const auto working_dir = locations ? locations->getWorkingDir() : 
std::filesystem::current_path();  // TODO(mzink)
+  const auto working_dir = utils::getMinifiDir();
 
   std::string value;
   if 
(configuration->get(Configure::nifi_dbcontent_repository_directory_default, 
value) && !value.empty()) {
diff --git a/extensions/rocksdb-repos/FlowFileRepository.cpp 
b/extensions/rocksdb-repos/FlowFileRepository.cpp
index 346a512d6..a37bc2751 100644
--- a/extensions/rocksdb-repos/FlowFileRepository.cpp
+++ b/extensions/rocksdb-repos/FlowFileRepository.cpp
@@ -24,13 +24,14 @@
 #include <utility>
 #include <vector>
 
+#include "FlowFileRecord.h"
+#include "core/Resource.h"
+#include "core/TypedValues.h"
 #include "rocksdb/options.h"
 #include "rocksdb/slice.h"
-#include "utils/gsl.h"
-#include "core/Resource.h"
+#include "utils/Locations.h"
 #include "utils/OptionalUtils.h"
-#include "core/TypedValues.h"
-#include "FlowFileRecord.h"
+#include "utils/gsl.h"
 
 using namespace std::literals::chrono_literals;
 
@@ -210,8 +211,7 @@ bool FlowFileRepository::initialize(const 
std::shared_ptr<Configure> &configure)
 
   setCompactionPeriod(configure);
 
-  const auto locations = configure->getLocations();
-  const auto working_dir = locations ? locations->getWorkingDir() : 
std::filesystem::current_path();  // TODO(mzink)
+  const auto working_dir = utils::getMinifiDir();
 
   const auto encrypted_env = 
createEncryptingEnv(utils::crypto::EncryptionManager{working_dir}, 
DbEncryptionOptions{directory_, ENCRYPTION_KEY_NAME});
   logger_->log_info("Using {} FlowFileRepository", encrypted_env ? "encrypted" 
: "plaintext");
diff --git a/extensions/rocksdb-repos/controllers/RocksDbStateStorage.cpp 
b/extensions/rocksdb-repos/controllers/RocksDbStateStorage.cpp
index 58496ef50..26956e480 100644
--- a/extensions/rocksdb-repos/controllers/RocksDbStateStorage.cpp
+++ b/extensions/rocksdb-repos/controllers/RocksDbStateStorage.cpp
@@ -15,14 +15,16 @@
  * limitations under the License.
  */
 
+#include "RocksDbStateStorage.h"
+
 #include <cinttypes>
 #include <fstream>
 #include <utility>
 
-#include "RocksDbStateStorage.h"
 #include "../encryption/RocksDbEncryptionProvider.h"
-#include "utils/StringUtils.h"
 #include "core/Resource.h"
+#include "utils/Locations.h"
+#include "utils/StringUtils.h"
 
 namespace org::apache::nifi::minifi::controllers {
 
@@ -61,8 +63,7 @@ void RocksDbStateStorage::onEnable() {
   db_.reset();
 
 
-  const auto locations = configuration_->getLocations();
-  const auto working_dir = locations ? locations->getWorkingDir() : 
std::filesystem::current_path();  // TODO(mzink)
+  const auto working_dir = utils::getMinifiDir();
 
   auto encrypted_env = 
createEncryptingEnv(utils::crypto::EncryptionManager{working_dir}, 
core::repository::DbEncryptionOptions{directory_, ENCRYPTION_KEY_NAME});
   if (!encrypted_env) {
diff --git a/extensions/rocksdb-repos/tests/ContentSessionTests.cpp 
b/extensions/rocksdb-repos/tests/ContentSessionTests.cpp
index 03922bbc6..1c33b14e8 100644
--- a/extensions/rocksdb-repos/tests/ContentSessionTests.cpp
+++ b/extensions/rocksdb-repos/tests/ContentSessionTests.cpp
@@ -37,7 +37,6 @@ class ContentSessionController : public TestController {
       : contentRepository(std::make_shared<ContentRepositoryClass>()) {
     auto contentRepoPath = createTempDirectory();
     auto config = std::make_shared<minifi::ConfigureImpl>();
-    
config->setLocations(minifi::LocationsImpl::createFromMinifiHome(contentRepoPath));
     
config->set(minifi::Configure::nifi_dbcontent_repository_directory_default, 
contentRepoPath.string());
     contentRepository->initialize(config);
   }
diff --git a/extensions/rocksdb-repos/tests/DBContentRepositoryTests.cpp 
b/extensions/rocksdb-repos/tests/DBContentRepositoryTests.cpp
index 3a6b657be..7fc19ca4d 100644
--- a/extensions/rocksdb-repos/tests/DBContentRepositoryTests.cpp
+++ b/extensions/rocksdb-repos/tests/DBContentRepositoryTests.cpp
@@ -44,7 +44,6 @@ TEST_CASE("Write Claim", "[TestDBCR1]") {
   auto content_repo = std::make_shared<TestDatabaseContentRepository>();
 
   auto configuration = 
std::make_shared<org::apache::nifi::minifi::ConfigureImpl>();
-  
configuration->setLocations(minifi::LocationsImpl::createFromMinifiHome(dir));
   
configuration->set(minifi::Configure::nifi_dbcontent_repository_directory_default,
 dir.string());
   REQUIRE(content_repo->initialize(configuration));
 
@@ -67,7 +66,6 @@ TEST_CASE("Write Claim", "[TestDBCR1]") {
   content_repo = std::make_shared<TestDatabaseContentRepository>();
 
   configuration = std::make_shared<org::apache::nifi::minifi::ConfigureImpl>();
-  
configuration->setLocations(minifi::LocationsImpl::createFromMinifiHome(dir));
   
configuration->set(minifi::Configure::nifi_dbcontent_repository_directory_default,
 dir.string());
   REQUIRE(content_repo->initialize(configuration));
 
@@ -92,7 +90,6 @@ TEST_CASE("Delete Claim", "[TestDBCR2]") {
   auto content_repo = std::make_shared<TestDatabaseContentRepository>();
 
   auto configuration = 
std::make_shared<org::apache::nifi::minifi::ConfigureImpl>();
-  
configuration->setLocations(minifi::LocationsImpl::createFromMinifiHome(dir));
   
configuration->set(minifi::Configure::nifi_dbcontent_repository_directory_default,
 dir.string());
   REQUIRE(content_repo->initialize(configuration));
 
@@ -112,7 +109,6 @@ TEST_CASE("Delete Claim", "[TestDBCR2]") {
   content_repo = std::make_shared<TestDatabaseContentRepository>();
 
   configuration = std::make_shared<org::apache::nifi::minifi::ConfigureImpl>();
-  
configuration->setLocations(minifi::LocationsImpl::createFromMinifiHome(dir));
   
configuration->set(minifi::Configure::nifi_dbcontent_repository_directory_default,
 dir.string());
 
   std::string readstr;
@@ -151,7 +147,6 @@ TEST_CASE("Append Claim", "[TestDBCR1]") {
   auto content_repo = std::make_shared<TestDatabaseContentRepository>();
 
   auto configuration = 
std::make_shared<org::apache::nifi::minifi::ConfigureImpl>();
-  
configuration->setLocations(minifi::LocationsImpl::createFromMinifiHome(dir));
   
configuration->set(minifi::Configure::nifi_dbcontent_repository_directory_default,
 dir.string());
   REQUIRE(content_repo->initialize(configuration));
 
@@ -193,7 +188,6 @@ TEST_CASE("Test Empty Claim", "[TestDBCR3]") {
   auto content_repo = std::make_shared<TestDatabaseContentRepository>();
 
   auto configuration = 
std::make_shared<org::apache::nifi::minifi::ConfigureImpl>();
-  
configuration->setLocations(minifi::LocationsImpl::createFromMinifiHome(dir));
   
configuration->set(minifi::Configure::nifi_dbcontent_repository_directory_default,
 dir.string());
   REQUIRE(content_repo->initialize(configuration));
 
@@ -212,7 +206,6 @@ TEST_CASE("Test Empty Claim", "[TestDBCR3]") {
   content_repo = std::make_shared<TestDatabaseContentRepository>();
 
   configuration = std::make_shared<org::apache::nifi::minifi::ConfigureImpl>();
-  
configuration->setLocations(minifi::LocationsImpl::createFromMinifiHome(dir));
   
configuration->set(minifi::Configure::nifi_dbcontent_repository_directory_default,
 dir.string());
   REQUIRE(content_repo->initialize(configuration));
 
@@ -230,7 +223,6 @@ TEST_CASE("Delete NonExistent Claim", "[TestDBCR4]") {
   auto content_repo = std::make_shared<TestDatabaseContentRepository>();
 
   auto configuration = 
std::make_shared<org::apache::nifi::minifi::ConfigureImpl>();
-  
configuration->setLocations(minifi::LocationsImpl::createFromMinifiHome(dir));
   
configuration->set(minifi::Configure::nifi_dbcontent_repository_directory_default,
 dir.string());
   REQUIRE(content_repo->initialize(configuration));
 
@@ -250,7 +242,6 @@ TEST_CASE("Delete NonExistent Claim", "[TestDBCR4]") {
   content_repo = std::make_shared<TestDatabaseContentRepository>();
 
   configuration = std::make_shared<org::apache::nifi::minifi::ConfigureImpl>();
-  
configuration->setLocations(minifi::LocationsImpl::createFromMinifiHome(dir));
   
configuration->set(minifi::Configure::nifi_dbcontent_repository_directory_default,
 dir.string());
   REQUIRE(content_repo->initialize(configuration));
 
@@ -272,7 +263,6 @@ TEST_CASE("Delete Remove Count Claim", "[TestDBCR5]") {
   auto content_repo = std::make_shared<TestDatabaseContentRepository>();
 
   auto configuration = 
std::make_shared<org::apache::nifi::minifi::ConfigureImpl>();
-  
configuration->setLocations(minifi::LocationsImpl::createFromMinifiHome(dir));
   
configuration->set(minifi::Configure::nifi_dbcontent_repository_directory_default,
 dir.string());
   REQUIRE(content_repo->initialize(configuration));
 
@@ -292,7 +282,6 @@ TEST_CASE("Delete Remove Count Claim", "[TestDBCR5]") {
   content_repo = std::make_shared<TestDatabaseContentRepository>();
 
   configuration = std::make_shared<org::apache::nifi::minifi::ConfigureImpl>();
-  
configuration->setLocations(minifi::LocationsImpl::createFromMinifiHome(dir));
   
configuration->set(minifi::Configure::nifi_dbcontent_repository_directory_default,
 dir.string());
   REQUIRE(content_repo->initialize(configuration));
 
@@ -345,7 +334,6 @@ TEST_CASE("DBContentRepository can clear orphan entries") {
   TestController testController;
   auto dir = testController.createTempDirectory();
   auto configuration = 
std::make_shared<org::apache::nifi::minifi::ConfigureImpl>();
-  
configuration->setLocations(minifi::LocationsImpl::createFromMinifiHome(dir));
   
configuration->set(minifi::Configure::nifi_dbcontent_repository_directory_default,
 dir.string());
   {
     auto content_repo = 
std::make_shared<core::repository::DatabaseContentRepository>();
diff --git a/extensions/rocksdb-repos/tests/EncryptionTests.cpp 
b/extensions/rocksdb-repos/tests/EncryptionTests.cpp
index 7bb21b60d..754d12bd4 100644
--- a/extensions/rocksdb-repos/tests/EncryptionTests.cpp
+++ b/extensions/rocksdb-repos/tests/EncryptionTests.cpp
@@ -35,7 +35,6 @@ class FFRepoFixture : public TestController {
     home_ = createTempDirectory();
     repo_dir_ = home_ / "flowfile_repo";
     config_ = std::make_shared<minifi::ConfigureImpl>();
-    config_->setLocations(minifi::LocationsImpl::createFromMinifiHome(home_));
     container_ = std::make_unique<minifi::ConnectionImpl>(nullptr, nullptr, 
"container");
     content_repo_ = 
std::make_shared<core::repository::VolatileContentRepository>();
     content_repo_->initialize(config_);
diff --git a/extensions/rocksdb-repos/tests/RepoTests.cpp 
b/extensions/rocksdb-repos/tests/RepoTests.cpp
index 1d6d5c931..0523ff7d0 100644
--- a/extensions/rocksdb-repos/tests/RepoTests.cpp
+++ b/extensions/rocksdb-repos/tests/RepoTests.cpp
@@ -76,7 +76,6 @@ TEST_CASE("Test Repo Empty Value Attribute", "[TestFFR1]") {
   const auto repository = 
std::make_shared<core::repository::FlowFileRepository>("ff", dir.string(), 0ms, 
0, 1ms);
 
   const auto configuration = std::make_shared<minifi::ConfigureImpl>();
-  
configuration->setLocations(minifi::LocationsImpl::createFromMinifiHome(dir));
   repository->initialize(configuration);
 
   std::shared_ptr<core::ContentRepository> content_repo = 
std::make_shared<core::repository::VolatileContentRepository>();
@@ -98,7 +97,6 @@ TEST_CASE("Test Repo Empty Key Attribute ", "[TestFFR2]") {
   const auto repository = 
std::make_shared<core::repository::FlowFileRepository>("ff", dir.string(), 0ms, 
0, 1ms);
 
   const auto configuration = std::make_shared<minifi::ConfigureImpl>();
-  
configuration->setLocations(minifi::LocationsImpl::createFromMinifiHome(dir));
   repository->initialize(configuration);
   std::shared_ptr<core::ContentRepository> content_repo = 
std::make_shared<core::repository::VolatileContentRepository>();
   const auto file = std::make_shared<minifi::FlowFileRecordImpl>();
@@ -121,7 +119,6 @@ TEST_CASE("Test Repo Key Attribute Verify ", "[TestFFR3]") {
   const auto repository = 
std::make_shared<core::repository::FlowFileRepository>("ff", dir.string(), 0ms, 
0, 1ms);
 
   const auto configuration = std::make_shared<minifi::ConfigureImpl>();
-  
configuration->setLocations(minifi::LocationsImpl::createFromMinifiHome(dir));
   repository->initialize(configuration);
 
   std::shared_ptr<core::ContentRepository> content_repo = 
std::make_shared<core::repository::VolatileContentRepository>();
@@ -178,7 +175,6 @@ TEST_CASE("Test Delete Content ", "[TestFFR4]") {
   std::shared_ptr<core::ContentRepository> content_repo = 
std::make_shared<core::repository::FileSystemRepository>();
 
   const auto configuration = std::make_shared<minifi::ConfigureImpl>();
-  
configuration->setLocations(minifi::LocationsImpl::createFromMinifiHome(dir));
   repository->initialize(configuration);
 
   repository->loadComponent(content_repo);
@@ -229,7 +225,6 @@ TEST_CASE("Test Validate Checkpoint ", "[TestFFR5]") {
   std::shared_ptr<core::ContentRepository> content_repo = 
std::make_shared<core::repository::FileSystemRepository>();
 
   const auto configuration = std::make_shared<minifi::ConfigureImpl>();
-  
configuration->setLocations(minifi::LocationsImpl::createFromMinifiHome(dir));
   repository->initialize(configuration);
 
   repository->loadComponent(content_repo);
@@ -281,7 +276,6 @@ TEST_CASE("Test FlowFile Restore", "[TestFFR6]") {
   auto dir = testController.createTempDirectory();
 
   auto config = std::make_shared<minifi::ConfigureImpl>();
-  config->setLocations(minifi::LocationsImpl::createFromMinifiHome(dir));
   config->set(minifi::Configure::nifi_dbcontent_repository_directory_default, 
(dir / "content_repository").string());
   config->set(minifi::Configure::nifi_flowfile_repository_directory_default, 
(dir / "flowfile_repository").string());
 
@@ -382,7 +376,6 @@ TEST_CASE("Flush deleted flowfiles before shutdown", 
"[TestFFR7]") {
   const auto dir = testController.createTempDirectory();
 
   const auto config = std::make_shared<minifi::ConfigureImpl>();
-  config->setLocations(minifi::LocationsImpl::createFromMinifiHome(dir));
   config->set(minifi::Configure::nifi_flowfile_repository_directory_default, 
(dir / "flowfile_repository").string());
 
   const auto content_repo = 
std::make_shared<core::repository::VolatileContentRepository>();
@@ -460,7 +453,6 @@ TEST_CASE("FlowFileRepository triggers content repo orphan 
clear") {
   auto content_dir = testController.createTempDirectory();
 
   auto config = std::make_shared<minifi::ConfigureImpl>();
-  config->setLocations(minifi::LocationsImpl::createFromMinifiHome(home_dir));
   config->set(minifi::Configure::nifi_flowfile_repository_directory_default, 
ff_dir.string());
   config->set(minifi::Configure::nifi_dbcontent_repository_directory_default, 
content_dir.string());
 
@@ -495,7 +487,6 @@ TEST_CASE("FlowFileRepository synchronously pushes existing 
flow files") {
   const auto content_dir = testController.createTempDirectory();
 
   const auto config = std::make_shared<minifi::ConfigureImpl>();
-  config->setLocations(minifi::LocationsImpl::createFromMinifiHome(home_dir));
   config->set(minifi::Configure::nifi_flowfile_repository_directory_default, 
ff_dir.string());
   config->set(minifi::Configure::nifi_dbcontent_repository_directory_default, 
content_dir.string());
 
@@ -577,7 +568,6 @@ TEST_CASE("Test getting flow file repository size 
properties", "[TestGettingRepo
     expected_max_repo_size = 7;
   }
   auto configuration = std::make_shared<minifi::ConfigureImpl>();
-  
configuration->setLocations(minifi::LocationsImpl::createFromMinifiHome(dir));
   repository->initialize(configuration);
 
   auto flow_file = std::make_shared<minifi::FlowFileRecordImpl>();
@@ -626,7 +616,6 @@ TEST_CASE("Test getting noop repository size properties", 
"[TestGettingRepositor
   const auto repository = minifi::core::createRepository("NoOpRepository", 
"ff");
 
   const auto configuration = std::make_shared<minifi::ConfigureImpl>();
-  
configuration->setLocations(minifi::LocationsImpl::createFromMinifiHome(dir));
   repository->initialize(configuration);
 
   const auto flow_file = std::make_shared<minifi::FlowFileRecordImpl>();
@@ -654,7 +643,6 @@ TEST_CASE("Test getting content repository size 
properties", "[TestGettingReposi
 
   const auto content_repo_dir = testController.createTempDirectory();
   const auto configuration = std::make_shared<minifi::ConfigureImpl>();
-  
configuration->setLocations(minifi::LocationsImpl::createFromMinifiHome(dir));
   
configuration->set(minifi::Configure::nifi_dbcontent_repository_directory_default,
 content_repo_dir.string());
   std::string content = "content";
   
configuration->set(minifi::Configure::nifi_volatile_repository_options_content_max_bytes,
 std::to_string(content.size()));
@@ -747,7 +735,6 @@ TEST_CASE("Flow file repositories can be stopped", 
"[TestRepoIsRunning]") {
   }
 
   const auto configuration = std::make_shared<minifi::ConfigureImpl>();
-  
configuration->setLocations(minifi::LocationsImpl::createFromMinifiHome(dir));
   repository->initialize(configuration);
 
   REQUIRE(!repository->isRunning());
@@ -810,7 +797,6 @@ TEST_CASE("FlowFileRepository can filter out too small 
contents") {
   const auto content_dir = testController.createTempDirectory();
 
   auto config = std::make_shared<minifi::ConfigureImpl>();
-  
config->setLocations(minifi::LocationsImpl::createFromMinifiHome(minifi_home));
   config->set(minifi::Configure::nifi_flowfile_repository_directory_default, 
ff_dir.string());
   config->set(minifi::Configure::nifi_dbcontent_repository_directory_default, 
content_dir.string());
 
diff --git a/extensions/rocksdb-repos/tests/SwapTests.cpp 
b/extensions/rocksdb-repos/tests/SwapTests.cpp
index 71eda4d6b..7043351ed 100644
--- a/extensions/rocksdb-repos/tests/SwapTests.cpp
+++ b/extensions/rocksdb-repos/tests/SwapTests.cpp
@@ -84,7 +84,6 @@ TEST_CASE("Connection will on-demand swap flow files") {
   auto dir = testController.createTempDirectory();
 
   auto config = std::make_shared<minifi::ConfigureImpl>();
-  config->setLocations(minifi::LocationsImpl::createFromMinifiHome(dir));
   config->set(minifi::Configure::nifi_dbcontent_repository_directory_default, 
(dir / "content_repository").string());
   config->set(minifi::Configure::nifi_flowfile_repository_directory_default, 
(dir / "flowfile_repository").string());
 
diff --git a/extensions/sftp/tests/ListSFTPTests.cpp 
b/extensions/sftp/tests/ListSFTPTests.cpp
index 01f65fc29..3d8072c00 100644
--- a/extensions/sftp/tests/ListSFTPTests.cpp
+++ b/extensions/sftp/tests/ListSFTPTests.cpp
@@ -74,9 +74,6 @@ class ListSFTPTestsFixture {
     sftp_server = std::make_unique<SFTPTestServer>(working_directory);
     REQUIRE(true == sftp_server->start());
 
-    if (configuration) {
-      
configuration->setLocations(minifi::LocationsImpl::createFromMinifiHome(working_directory));
-    }
     // Build MiNiFi processing graph
     createPlan(nullptr, configuration);
   }
@@ -95,9 +92,6 @@ class ListSFTPTestsFixture {
     list_sftp = nullptr;
     plan.reset();
 
-    if (configuration) {
-      
configuration->setLocations(minifi::LocationsImpl::createFromMinifiHome(working_directory));
-    }
     plan = testController.createPlan(configuration, state_dir);
     if (list_sftp_uuid == nullptr) {
       list_sftp = plan->addProcessor(
diff --git a/extensions/standard-processors/tests/unit/TailFileTests.cpp 
b/extensions/standard-processors/tests/unit/TailFileTests.cpp
index 9cc7e9b19..0d8cdfadb 100644
--- a/extensions/standard-processors/tests/unit/TailFileTests.cpp
+++ b/extensions/standard-processors/tests/unit/TailFileTests.cpp
@@ -1056,7 +1056,6 @@ TEST_CASE("TailFile finds and finishes the renamed file 
and continues with the n
 
   // use persistent state storage that defaults to rocksDB, not volatile
   const auto configuration = std::make_shared<minifi::ConfigureImpl>();
-  
configuration->setLocations(minifi::LocationsImpl::createFromMinifiHome(log_dir));
   {
     auto test_plan = testController.createPlan(configuration, state_dir);
     auto tail_file = test_plan->addProcessor("TailFile", tail_file_uuid, 
"Tail", {success_relationship});
diff --git a/libminifi/include/properties/Configure.h 
b/libminifi/include/properties/Configure.h
index 249fc53b2..cf8df66b2 100644
--- a/libminifi/include/properties/Configure.h
+++ b/libminifi/include/properties/Configure.h
@@ -21,7 +21,6 @@
 #include <string>
 #include <utility>
 
-#include "LocationsImpl.h"
 #include "core/logging/LoggerProperties.h"
 #include "minifi-cpp/core/AgentIdentificationProvider.h"
 #include "minifi-cpp/properties/Configure.h"
@@ -54,9 +53,6 @@ class ConfigureImpl : public ConfigurationImpl, public 
virtual core::AgentIdenti
   void set(const std::string& key, const std::string& value, 
PropertyChangeLifetime lifetime) override;
   bool commitChanges() override;
 
-  [[nodiscard]] std::shared_ptr<const Locations> getLocations() const override;
-  void setLocations(std::shared_ptr<const Locations> locations) override;
-
  private:
   // WARNING! a test utility
   void setLoggerProperties(std::shared_ptr<core::logging::LoggerProperties> 
new_properties) {
@@ -69,7 +65,6 @@ class ConfigureImpl : public ConfigurationImpl, public 
virtual core::AgentIdenti
   mutable std::mutex fallback_identifier_mutex_;
   std::string fallback_identifier_;
   std::atomic_bool logger_properties_changed_{false};
-  std::shared_ptr<const Locations> locations_;
   std::shared_ptr<core::logging::LoggerProperties> logger_properties_;
 };
 
diff --git a/libminifi/include/properties/LocationsImpl.h 
b/libminifi/include/properties/LocationsImpl.h
deleted file mode 100644
index 5f602e11f..000000000
--- a/libminifi/include/properties/LocationsImpl.h
+++ /dev/null
@@ -1,103 +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.
- */
-#pragma once
-
-#include "minifi-cpp/properties/Locations.h"
-#include "Defaults.h"
-#include "fmt/format.h"
-
-namespace org::apache::nifi::minifi {
-class LocationsImpl final : public Locations {
-  struct M {
-    std::filesystem::path working_dir_;
-    std::filesystem::path lock_path_;
-    std::filesystem::path log_properties_path_;
-    std::filesystem::path uid_properties_path_;
-    std::filesystem::path properties_path_;
-    std::filesystem::path logs_dir_;
-    std::filesystem::path fips_bin_path_;
-    std::filesystem::path fips_conf_path_;
-    std::string extensions_pattern_;
-  } m;
-
-  explicit LocationsImpl(M m) : m(std::move(m)) {}
-
- public:
-  static std::shared_ptr<LocationsImpl> createFromMinifiHome(const 
std::filesystem::path& minifi_home) {
-    return std::shared_ptr<LocationsImpl>(new LocationsImpl(M{
-      .working_dir_ = minifi_home,
-      .lock_path_ = minifi_home / "LOCK",
-      .log_properties_path_ = minifi_home / DEFAULT_LOG_PROPERTIES_FILE,
-      .uid_properties_path_ = minifi_home / DEFAULT_UID_PROPERTIES_FILE,
-      .properties_path_ = minifi_home / DEFAULT_NIFI_PROPERTIES_FILE,
-      .logs_dir_ = minifi_home / "logs",
-      .fips_bin_path_ = minifi_home / "fips",
-      .fips_conf_path_ = minifi_home / "fips",
-      .extensions_pattern_ = "../extensions/*"
-    }));
-  }
-
-  static std::shared_ptr<LocationsImpl> createForFHS() {
-    return std::shared_ptr<LocationsImpl>(new LocationsImpl(M{
-        .working_dir_ = "/var/lib/nifi-minifi-cpp",
-        .lock_path_ = "/var/lib/nifi-minifi-cpp/LOCK",
-        .log_properties_path_ = "/etc/nifi-minifi-cpp/minifi-log.properties",
-        .uid_properties_path_ = "/etc/nifi-minifi-cpp/minifi-uid.properties",
-        .properties_path_ = "/etc/nifi-minifi-cpp/minifi.properties",
-        .logs_dir_ = "/var/log/nifi-minifi-cpp",
-        .fips_bin_path_ = "/usr/lib64/nifi-minifi-cpp/fips",
-        .fips_conf_path_ = "/etc/nifi-minifi-cpp/fips",
-        .extensions_pattern_ = "/usr/lib64/nifi-minifi-cpp/extensions/*"
-    }));
-  }
-
-  [[nodiscard]] const std::filesystem::path& getWorkingDir() const override { 
return m.working_dir_; }
-  [[nodiscard]] const std::filesystem::path& getLockPath() const override { 
return m.lock_path_; }
-  [[nodiscard]] const std::filesystem::path& getLogPropertiesPath() const 
override { return m.log_properties_path_; }
-  [[nodiscard]] const std::filesystem::path& getUidPropertiesPath() const 
override { return m.uid_properties_path_; }
-  [[nodiscard]] const std::filesystem::path& getPropertiesPath() const 
override { return m.properties_path_; }
-  [[nodiscard]] const std::filesystem::path& getFipsBinPath() const override { 
return m.fips_bin_path_; }
-  [[nodiscard]] const std::filesystem::path& getFipsConfPath() const override 
{ return m.fips_conf_path_; }
-  [[nodiscard]] const std::filesystem::path& getLogsDirs() const override { 
return m.logs_dir_; }
-  [[nodiscard]] std::string_view getDefaultExtensionsPattern() const override 
{ return m.extensions_pattern_; }
-
-  [[nodiscard]] std::string toString() const override {
-    return fmt::format(
-      R"(
-Locations {{
-  working dir: "{}",
-  lock path: "{}",
-  log properties path: "{}",
-  uid properties path: "{}",
-  properties path: "{}",
-  fips bin path: "{}",
-  fips conf path: "{}",
-  logs dir: "{}",
-  extensions pattern: "{}"
-}})",
-      getWorkingDir().string(),
-      getLockPath().string(),
-      getLogPropertiesPath().string(),
-      getUidPropertiesPath().string(),
-      getPropertiesPath().string(),
-      getFipsBinPath().string(),
-      getFipsConfPath().string(),
-      getLogsDirs().string(),
-      getDefaultExtensionsPattern());
-  }
-};
-}  // namespace org::apache::nifi::minifi
diff --git a/libminifi/src/Configure.cpp b/libminifi/src/Configure.cpp
index 922a59e22..3e895735e 100644
--- a/libminifi/src/Configure.cpp
+++ b/libminifi/src/Configure.cpp
@@ -135,15 +135,6 @@ bool ConfigureImpl::commitChanges() {
   return success;
 }
 
-std::shared_ptr<const Locations> ConfigureImpl::getLocations() const {
-  return locations_;
-}
-
-void ConfigureImpl::setLocations(std::shared_ptr<const Locations> locations) {
-  locations_ = std::move(locations);
-}
-
-
 gsl::not_null<std::shared_ptr<Configure>> Configure::create() {
   return 
gsl::make_not_null<std::shared_ptr<Configure>>(std::make_shared<ConfigureImpl>());
 }
diff --git a/libminifi/src/core/extension/ExtensionManager.cpp 
b/libminifi/src/core/extension/ExtensionManager.cpp
index 05e2f73ab..9ea19f015 100644
--- a/libminifi/src/core/extension/ExtensionManager.cpp
+++ b/libminifi/src/core/extension/ExtensionManager.cpp
@@ -26,6 +26,7 @@
 #include "agent/agent_version.h"
 #include "core/extension/Utils.h"
 #include "properties/Configuration.h"
+#include "utils/Locations.h"
 
 namespace org::apache::nifi::minifi::core::extension {
 
@@ -49,8 +50,6 @@ ExtensionManager& ExtensionManager::get() {
   return ExtensionManagerImpl::get();
 }
 
-constexpr std::string_view DEFAULT_EXTENSION_PATH = "../extensions/*";
-
 bool ExtensionManagerImpl::initialize(const std::shared_ptr<Configure>& 
config) {
   static bool initialized = ([&] {
     logger_->log_trace("Initializing extensions");
@@ -69,13 +68,9 @@ bool ExtensionManagerImpl::initialize(const 
std::shared_ptr<Configure>& config)
         return *opt_pattern;
       };
 
-      if (const auto locations = config->getLocations()) {
-        logger_->log_warn("No extension path is provided in properties, using 
default : '{}'", locations->getDefaultExtensionsPattern());
-        return std::string(locations->getDefaultExtensionsPattern());
-      };
-
-      logger_->log_error("No extension path is provided in properties and 
locations is empty, using hard-coded default: '{}'", DEFAULT_EXTENSION_PATH);
-      return std::string(DEFAULT_EXTENSION_PATH);
+      auto default_extension_path = utils::getDefaultExtensionsPattern();
+      logger_->log_warn("No extension path is provided in properties, using 
default: '{}'", default_extension_path);
+      return default_extension_path;
     }();
 
     auto candidates = utils::file::match(utils::file::FilePattern(pattern, [&] 
(std::string_view subpattern, std::string_view error_msg) {
diff --git a/libminifi/src/utils/file/AssetManager.cpp 
b/libminifi/src/utils/file/AssetManager.cpp
index 039078135..024362508 100644
--- a/libminifi/src/utils/file/AssetManager.cpp
+++ b/libminifi/src/utils/file/AssetManager.cpp
@@ -16,11 +16,13 @@
  */
 
 #include "utils/file/AssetManager.h"
-#include "utils/file/FileUtils.h"
+
+#include "core/logging/LoggerFactory.h"
 #include "rapidjson/document.h"
 #include "rapidjson/writer.h"
-#include "core/logging/LoggerFactory.h"
 #include "utils/Hash.h"
+#include "utils/Locations.h"
+#include "utils/file/FileUtils.h"
 
 #undef GetObject  // windows.h #defines GetObject = GetObjectA or GetObjectW, 
which conflicts with rapidjson
 
@@ -30,10 +32,7 @@ std::filesystem::path getRootFromConfigure(const Configure& 
configuration) {
   if (auto nifi_asset_directory = 
configuration.get(Configure::nifi_asset_directory)) {
     return *nifi_asset_directory;
   }
-  if (const auto locations = configuration.getLocations()) {
-    return locations->getWorkingDir() / "asset";
-  }
-  return std::filesystem::path("") / "asset";
+  return utils::getMinifiDir() / "asset";
 }
 
 AssetManager::AssetManager(const Configure& configuration)
diff --git a/libminifi/test/integration/AlertTests.cpp 
b/libminifi/test/integration/AlertTests.cpp
index 8530053b4..b972d4b8a 100644
--- a/libminifi/test/integration/AlertTests.cpp
+++ b/libminifi/test/integration/AlertTests.cpp
@@ -80,7 +80,6 @@ TEST_CASE("Alert system forwards logs") {
   AlertHandler handler(agent_id);
   harness.setUrl("http://localhost:0/api/alerts";, &handler);
   
harness.getConfiguration()->set(minifi::Configuration::nifi_c2_agent_identifier,
 agent_id);
-  
harness.getConfiguration()->setLocations(minifi::LocationsImpl::createFromMinifiHome(dir.getPath()));
 
   auto log_props = std::make_shared<logging::LoggerProperties>(dir.getPath() / 
"logs");
   log_props->set("appender.alert1", "alert");
diff --git a/libminifi/test/integration/C2DebugBundleTest.cpp 
b/libminifi/test/integration/C2DebugBundleTest.cpp
index ab742d6d0..3e9f1a606 100644
--- a/libminifi/test/integration/C2DebugBundleTest.cpp
+++ b/libminifi/test/integration/C2DebugBundleTest.cpp
@@ -189,7 +189,6 @@ TEST_CASE("C2DebugBundleTest", "[c2test]") {
     return true;
   });
 
-  
harness.getConfiguration()->setLocations(minifi::LocationsImpl::createFromMinifiHome(home_dir.string()));
   harness.getConfiguration()->loadConfigureFile(home_dir / 
"conf/minifi.properties");
   harness.setUrl("http://localhost:0/heartbeat";, &heartbeat_handler);
   harness.setUrl("http://localhost:0/acknowledge";, &ack_handler);
diff --git a/libminifi/test/integration/C2PropertiesUpdateTests.cpp 
b/libminifi/test/integration/C2PropertiesUpdateTests.cpp
index 6e7076f57..7600c8428 100644
--- a/libminifi/test/integration/C2PropertiesUpdateTests.cpp
+++ b/libminifi/test/integration/C2PropertiesUpdateTests.cpp
@@ -212,7 +212,6 @@ TEST_CASE("C2PropertiesUpdateTests", "[c2test]") {
     }
   });
 
-  
harness.getConfiguration()->setLocations(minifi::LocationsImpl::createFromMinifiHome(home_dir.string()));
   harness.getConfiguration()->loadConfigureFile(home_dir / 
"conf/minifi.properties");
   ConfigTestAccessor::call_setLoggerProperties(harness.getConfiguration(), 
logger_properties);
 
diff --git a/libminifi/test/libtest/unit/TestBase.cpp 
b/libminifi/test/libtest/unit/TestBase.cpp
index 15527c79e..9d494fa96 100644
--- a/libminifi/test/libtest/unit/TestBase.cpp
+++ b/libminifi/test/libtest/unit/TestBase.cpp
@@ -717,7 +717,6 @@ TestController::TestController()
 std::shared_ptr<TestPlan> TestController::createPlan(PlanConfig config) {
   if (!config.configuration) {
     config.configuration = minifi::Configure::create();
-    
config.configuration->setLocations(minifi::LocationsImpl::createFromMinifiHome(createTempDirectory()));
     
config.configuration->set(minifi::Configure::nifi_state_storage_local_class_name,
 "VolatileMapStateStorage");
     
config.configuration->set(minifi::Configure::nifi_dbcontent_repository_directory_default,
 createTempDirectory().string());
   }
diff --git a/libminifi/test/persistence-tests/PersistenceTests.cpp 
b/libminifi/test/persistence-tests/PersistenceTests.cpp
index c96f888ca..7e986dba5 100644
--- a/libminifi/test/persistence-tests/PersistenceTests.cpp
+++ b/libminifi/test/persistence-tests/PersistenceTests.cpp
@@ -172,7 +172,6 @@ TEST_CASE("Processors Can Store FlowFiles", "[TestP1]") {
   auto dir = testController.createTempDirectory();
 
   auto config = std::make_shared<minifi::ConfigureImpl>();
-  config->setLocations(minifi::LocationsImpl::createFromMinifiHome(dir));
   config->set(minifi::Configure::nifi_dbcontent_repository_directory_default, 
(dir / "content_repository").string());
   config->set(minifi::Configure::nifi_flowfile_repository_directory_default, 
(dir / "flowfile_repository").string());
 
@@ -286,7 +285,6 @@ TEST_CASE("Persisted flowFiles are updated on 
modification", "[TestP1]") {
   auto dir = testController.createTempDirectory();
 
   auto config = std::make_shared<minifi::ConfigureImpl>();
-  config->setLocations(minifi::LocationsImpl::createFromMinifiHome(dir));
   config->set(minifi::Configure::nifi_dbcontent_repository_directory_default, 
(dir / "content_repository").string());
   config->set(minifi::Configure::nifi_flowfile_repository_directory_default, 
(dir / "flowfile_repository").string());
   config->set(minifi::Configure::nifi_dbcontent_repository_purge_period, "0 
s");
diff --git a/libminifi/test/unit/DecryptorTests.cpp 
b/libminifi/test/unit/DecryptorTests.cpp
index dc1531e28..1c4c44217 100644
--- a/libminifi/test/unit/DecryptorTests.cpp
+++ b/libminifi/test/unit/DecryptorTests.cpp
@@ -90,7 +90,6 @@ TEST_CASE("Decryptor can decrypt a configuration file", 
"[decryptSensitiveProper
 
   minifi::ConfigureImpl configuration{decryptor};
   std::filesystem::path resources_dir{TEST_RESOURCES};
-  
configuration.setLocations(minifi::LocationsImpl::createFromMinifiHome(resources_dir));
   configuration.loadConfigureFile(resources_dir / 
"encrypted.minifi.properties");
   REQUIRE_FALSE(configuration.getConfiguredKeys().empty());
 
diff --git a/libminifi/test/unit/LogMetricsPublisherTests.cpp 
b/libminifi/test/unit/LogMetricsPublisherTests.cpp
index 557595ac8..252300b75 100644
--- a/libminifi/test/unit/LogMetricsPublisherTests.cpp
+++ b/libminifi/test/unit/LogMetricsPublisherTests.cpp
@@ -39,7 +39,6 @@ class LogPublisherTestFixture {
       
response_node_loader_(std::make_shared<state::response::ResponseNodeLoaderImpl>(configuration_,
         
std::vector<std::shared_ptr<core::RepositoryMetricsSource>>{provenance_repo_, 
flow_file_repo_}, nullptr)),
       publisher_("LogMetricsPublisher") {
-    
configuration_->setLocations(minifi::LocationsImpl::createFromMinifiHome(temp_directory_.getPath()));
     provenance_repo_->initialize(configuration_);
     flow_file_repo_->initialize(configuration_);
   }
diff --git a/libminifi/test/unit/ProcessSessionTests.cpp 
b/libminifi/test/unit/ProcessSessionTests.cpp
index 212630677..8585f6456 100644
--- a/libminifi/test/unit/ProcessSessionTests.cpp
+++ b/libminifi/test/unit/ProcessSessionTests.cpp
@@ -146,7 +146,6 @@ class TestVolatileFlowFileRepository : public 
core::repository::VolatileFlowFile
 TEST_CASE("ProcessSession::commit avoids dangling ResourceClaims when using 
VolatileFlowFileRepository", "[incrementbefore]") {
   TempDirectory tmp_dir;
   auto configuration = std::make_shared<minifi::ConfigureImpl>();
-  
configuration->setLocations(minifi::LocationsImpl::createFromMinifiHome(tmp_dir.getPath()));
   
configuration->set(minifi::Configure::nifi_volatile_repository_options_flowfile_max_count,
 "2");
   auto ff_repo = std::make_shared<TestVolatileFlowFileRepository>("flowfile");
   Fixture fixture({
diff --git a/minifi-api/include/minifi-cpp/properties/Configure.h 
b/minifi-api/include/minifi-cpp/properties/Configure.h
index 945bab143..ac05b42db 100644
--- a/minifi-api/include/minifi-cpp/properties/Configure.h
+++ b/minifi-api/include/minifi-cpp/properties/Configure.h
@@ -22,7 +22,6 @@
 #include <utility>
 
 #include "Configuration.h"
-#include "Locations.h"
 #include "minifi-cpp/core/AgentIdentificationProvider.h"
 #include "utils/gsl.h"
 
@@ -45,8 +44,6 @@ class Configure : public virtual Configuration, public 
virtual core::AgentIdenti
   using Configuration::set;
   void set(const std::string& key, const std::string& value, 
PropertyChangeLifetime lifetime) override = 0;
   bool commitChanges() override = 0;
-  [[nodiscard]] virtual std::shared_ptr<const Locations> getLocations() const 
= 0;
-  virtual void setLocations(std::shared_ptr<const Locations>) = 0;
 
   static gsl::not_null<std::shared_ptr<Configure>> create();
 };
diff --git a/minifi-api/include/minifi-cpp/properties/Locations.h 
b/minifi-api/include/minifi-cpp/properties/Locations.h
deleted file mode 100644
index 3643d36cb..000000000
--- a/minifi-api/include/minifi-cpp/properties/Locations.h
+++ /dev/null
@@ -1,37 +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.
- */
-#pragma once
-
-#include <filesystem>
-
-namespace org::apache::nifi::minifi {
-class Locations {
-public:
-  virtual ~Locations() = default;
-  [[nodiscard]] virtual const std::filesystem::path& getWorkingDir() const = 0;
-  [[nodiscard]] virtual const std::filesystem::path& getLockPath() const = 0;
-  [[nodiscard]] virtual const std::filesystem::path& getLogPropertiesPath() 
const = 0;
-  [[nodiscard]] virtual const std::filesystem::path& getUidPropertiesPath() 
const = 0;
-  [[nodiscard]] virtual const std::filesystem::path& getPropertiesPath() const 
= 0;
-  [[nodiscard]] virtual const std::filesystem::path& getFipsBinPath() const = 
0;
-  [[nodiscard]] virtual const std::filesystem::path& getFipsConfPath() const = 
0;
-  [[nodiscard]] virtual const std::filesystem::path& getLogsDirs() const = 0;
-  [[nodiscard]] virtual std::string_view getDefaultExtensionsPattern() const = 
0;
-
-  [[nodiscard]] virtual std::string toString() const = 0;
-};
-}  // namespace org::apache::nifi::minifi
diff --git a/minifi_main/Fips.cpp b/minifi_main/Fips.cpp
index 084754a56..cb81d32d1 100644
--- a/minifi_main/Fips.cpp
+++ b/minifi_main/Fips.cpp
@@ -16,15 +16,18 @@
  */
 #include "Fips.h"
 
-#include <fstream>
+#include <openssl/err.h>
+#include <openssl/evp.h>
+#include <openssl/provider.h>
+
 #include <algorithm>
+#include <fstream>
 #include <string>
-#include <openssl/provider.h>
-#include <openssl/evp.h>
-#include <openssl/err.h>
+
+#include "MainHelper.h"
 #include "utils/Environment.h"
-#include "utils/StringUtils.h"
 #include "utils/OptionalUtils.h"
+#include "utils/StringUtils.h"
 
 namespace org::apache::nifi::minifi::fips {
 
@@ -73,8 +76,8 @@ bool substituteFipsDirVariable(const std::filesystem::path& 
file_path, const std
 }
 
 bool generateFipsModuleConfig(const Locations& locations, const 
std::shared_ptr<core::logging::Logger>& logger) {
-  const auto& fips_bin_path = locations.getFipsBinPath();
-  const auto& fips_conf_path = locations.getFipsConfPath();
+  const auto& fips_bin_path = locations.fips_bin_path_;
+  const auto& fips_conf_path = locations.fips_conf_path_;
   std::filesystem::path output_file(fips_conf_path / "fipsmodule.cnf");
   logger->log_info("fipsmodule.cnf was not found, trying to run fipsinstall 
command to generate the file");
 
@@ -93,8 +96,8 @@ bool generateFipsModuleConfig(const Locations& locations, 
const std::shared_ptr<
 }  // namespace
 
 void initializeFipsMode(const std::shared_ptr<minifi::Configure>& configure, 
const Locations& locations, const std::shared_ptr<core::logging::Logger>& 
logger) {
-  const auto& fips_bin_path = locations.getFipsBinPath();
-  const auto& fips_conf_path = locations.getFipsConfPath();
+  const auto& fips_bin_path = locations.fips_bin_path_;
+  const auto& fips_conf_path = locations.fips_conf_path_;
   if (!(configure->get(minifi::Configure::nifi_openssl_fips_support_enable) | 
utils::andThen(utils::string::toBool)).value_or(false)) {
     logger->log_info("FIPS mode is disabled. FIPS configs and modules will NOT 
be loaded.");
     return;
diff --git a/minifi_main/Fips.h b/minifi_main/Fips.h
index e4a560c81..084ea85d4 100644
--- a/minifi_main/Fips.h
+++ b/minifi_main/Fips.h
@@ -18,9 +18,10 @@
 
 #include <filesystem>
 #include <memory>
+
+#include "MainHelper.h"
 #include "core/logging/Logger.h"
 #include "minifi-cpp/properties/Configure.h"
-#include "minifi-cpp/properties/Locations.h"
 
 namespace org::apache::nifi::minifi::fips {
 
diff --git a/minifi_main/MainHelper.cpp b/minifi_main/MainHelper.cpp
index 1b0d4d07b..552ebdafb 100644
--- a/minifi_main/MainHelper.cpp
+++ b/minifi_main/MainHelper.cpp
@@ -112,18 +112,44 @@ std::filesystem::path determineMinifiHome(const 
std::shared_ptr<logging::Logger>
   return minifi_home;
 }
 
-std::shared_ptr<minifi::Locations> determineLocations(const 
std::shared_ptr<logging::Logger>& logger) {
+Locations getFromMinifiHome(const std::filesystem::path& minifi_home) {
+  return {
+    .working_dir_ = minifi_home,
+    .lock_path_ = minifi_home / "LOCK",
+    .log_properties_path_ = minifi_home / DEFAULT_LOG_PROPERTIES_FILE,
+    .uid_properties_path_ = minifi_home / DEFAULT_UID_PROPERTIES_FILE,
+    .properties_path_ = minifi_home / DEFAULT_NIFI_PROPERTIES_FILE,
+    .logs_dir_ = minifi_home / "logs",
+    .fips_bin_path_ = minifi_home / "fips",
+    .fips_conf_path_ = minifi_home / "fips",
+  };
+}
+
+Locations getFromFHS() {
+  return {
+      .working_dir_ = "/var/lib/nifi-minifi-cpp",
+      .lock_path_ = "/var/lib/nifi-minifi-cpp/LOCK",
+      .log_properties_path_ = "/etc/nifi-minifi-cpp/minifi-log.properties",
+      .uid_properties_path_ = "/etc/nifi-minifi-cpp/minifi-uid.properties",
+      .properties_path_ = "/etc/nifi-minifi-cpp/minifi.properties",
+      .logs_dir_ = "/var/log/nifi-minifi-cpp",
+      .fips_bin_path_ = "/usr/lib64/nifi-minifi-cpp/fips",
+      .fips_conf_path_ = "/etc/nifi-minifi-cpp/fips"
+  };
+}
+
+std::optional<Locations> determineLocations(const 
std::shared_ptr<logging::Logger>& logger) {
   if (const auto minifi_home_env = 
utils::Environment::getEnvironmentVariable(MINIFI_HOME_ENV_KEY)) {
     if (minifi_home_env == "FHS") {
-      return minifi::LocationsImpl::createForFHS();
+      return getFromFHS();
     }
   }
   if (const auto executable_path = utils::file::get_executable_path(); 
executable_path.parent_path() == "/usr/bin") {
-    return minifi::LocationsImpl::createForFHS();
+    return getFromFHS();
   }
   const auto minifi_home = determineMinifiHome(logger);
   if (minifi_home.empty()) {
-    return nullptr;
+    return std::nullopt;
   }
-  return minifi::LocationsImpl::createFromMinifiHome(minifi_home);
+  return getFromMinifiHome(minifi_home);
 }
diff --git a/minifi_main/MainHelper.h b/minifi_main/MainHelper.h
index c584eae11..457a58ea4 100644
--- a/minifi_main/MainHelper.h
+++ b/minifi_main/MainHelper.h
@@ -52,25 +52,25 @@ extern "C" {
 #endif
 #endif
 
-/**
- * Validates a MINIFI_HOME value.
- * @param home_path
- * @return true if home_path represents a valid MINIFI_HOME
- */
-bool validHome(const std::string &home_path);
+struct Locations {
+  std::filesystem::path working_dir_;
+  std::filesystem::path lock_path_;
+  std::filesystem::path log_properties_path_;
+  std::filesystem::path uid_properties_path_;
+  std::filesystem::path properties_path_;
+  std::filesystem::path logs_dir_;
+  std::filesystem::path fips_bin_path_;
+  std::filesystem::path fips_conf_path_;
+};
 
 /**
  * Configures the logger to log everything to syslog/Windows Event Log, and 
for the minimum log level to INFO
  */
 void setSyslogLogger();
 
-/**
- * Determines the full path of MINIFI_HOME
- * @return MINIFI_HOME on success, empty string on failure
- */
 std::filesystem::path determineMinifiHome(const 
std::shared_ptr<org::apache::nifi::minifi::core::logging::Logger>& logger);
 
-std::shared_ptr<org::apache::nifi::minifi::Locations> determineLocations(const 
std::shared_ptr<org::apache::nifi::minifi::core::logging::Logger>& logger);
+std::optional<Locations> determineLocations(const 
std::shared_ptr<org::apache::nifi::minifi::core::logging::Logger>& logger);
 
 
 #endif /* MAIN_MAINHELPER_H_ */
diff --git a/minifi_main/MiNiFiMain.cpp b/minifi_main/MiNiFiMain.cpp
index 9d19527cb..6c0ef97b0 100644
--- a/minifi_main/MiNiFiMain.cpp
+++ b/minifi_main/MiNiFiMain.cpp
@@ -65,7 +65,6 @@
 #include "core/state/MetricsPublisherStore.h"
 #include "core/state/nodes/ResponseNodeLoader.h"
 #include "properties/Decryptor.h"
-#include "properties/LocationsImpl.h"
 #include "utils/Environment.h"
 #include "utils/FileMutex.h"
 #include "utils/file/AssetManager.h"
@@ -273,19 +272,19 @@ int main(int argc, char **argv) {
     return -1;
   }
 
-  utils::FileMutex minifi_home_mtx(locations->getLockPath());
+  utils::FileMutex minifi_home_mtx(locations->lock_path_);
   std::unique_lock minifi_home_lock(minifi_home_mtx, std::defer_lock);
   try {
     minifi_home_lock.lock();
   } catch (const std::exception& ex) {
-    logger->log_error("Could not acquire LOCK '{}', maybe another minifi 
instance is running: {}", locations->getLockPath(), ex.what());
+    logger->log_error("Could not acquire LOCK '{}', maybe another minifi 
instance is running: {}", locations->lock_path_, ex.what());
     std::exit(1);
   }
   // chdir to MINIFI_HOME
   std::error_code current_path_error;
-  std::filesystem::current_path(locations->getWorkingDir(), 
current_path_error);
+  std::filesystem::current_path(locations->working_dir_, current_path_error);
   if (current_path_error) {
-    logger->log_error("Failed to change working directory to {}", 
locations->getWorkingDir());
+    logger->log_error("Failed to change working directory to {}", 
locations->working_dir_);
     return -1;
   }
 
@@ -310,19 +309,19 @@ int main(int argc, char **argv) {
     std::string nifi_configuration_class_name = "adaptiveconfiguration";
     std::string content_repo_class = "filesystemrepository";
 
-    auto log_properties = 
std::make_shared<core::logging::LoggerProperties>(locations->getLogsDirs());
-    log_properties->loadConfigureFile(locations->getLogPropertiesPath(), 
"nifi.log.");
+    auto log_properties = 
std::make_shared<core::logging::LoggerProperties>(locations->log_properties_path_);
+    log_properties->loadConfigureFile(locations->log_properties_path_, 
"nifi.log.");
 
     logger_configuration.initialize(log_properties);
 
     std::shared_ptr<minifi::Properties> uid_properties = 
std::make_shared<minifi::PropertiesImpl>("UID properties");
-    uid_properties->loadConfigureFile(locations->getUidPropertiesPath());
+    uid_properties->loadConfigureFile(locations->uid_properties_path_);
     utils::IdGenerator::getIdGenerator()->initialize(uid_properties);
 
     // Make a record of minifi home in the configured log file.
-    logger->log_info("MiNiFi Locations={}", locations->toString());
+    //logger->log_info("MiNiFi Locations={}", locations->toString()); 
TODO(mzink)
 
-    auto decryptor = minifi::Decryptor::create(locations->getWorkingDir());
+    auto decryptor = minifi::Decryptor::create(locations->working_dir_);
     if (decryptor) {
       logger->log_info("Found encryption key, will decrypt sensitive 
properties in the configuration");
     } else {
@@ -330,8 +329,7 @@ int main(int argc, char **argv) {
     }
 
     const std::shared_ptr<minifi::Configure> configure = 
std::make_shared<minifi::ConfigureImpl>(std::move(decryptor), 
std::move(log_properties));
-    configure->setLocations(locations);
-    configure->loadConfigureFile(locations->getPropertiesPath());
+    configure->loadConfigureFile(locations->properties_path_);
     overridePropertiesFromCommandLine(argument_parser, configure);
 
     minifi::fips::initializeFipsMode(configure, *locations, logger);
@@ -391,7 +389,7 @@ int main(int argc, char **argv) {
 
     auto filesystem = std::make_shared<utils::file::FileSystem>(
         should_encrypt_flow_config,
-        utils::crypto::EncryptionProvider::create(locations->getWorkingDir()));
+        utils::crypto::EncryptionProvider::create(locations->working_dir_));
 
     auto asset_manager = 
std::make_unique<utils::file::AssetManager>(*configure);
     auto bulletin_store = std::make_unique<core::BulletinStore>(*configure);
@@ -403,7 +401,7 @@ int main(int argc, char **argv) {
           .configuration = configure,
           .path = 
configure->get(minifi::Configure::nifi_flow_configuration_file),
           .filesystem = filesystem,
-          .sensitive_values_encryptor = 
utils::crypto::EncryptionProvider::createSensitivePropertiesEncryptor(locations->getWorkingDir()),
+          .sensitive_values_encryptor = 
utils::crypto::EncryptionProvider::createSensitivePropertiesEncryptor(locations->working_dir_),
           .asset_manager = asset_manager.get(),
           .bulletin_store = bulletin_store.get()
       }, nifi_configuration_class_name);
diff --git a/utils/include/utils/Locations.h b/utils/include/utils/Locations.h
new file mode 100644
index 000000000..0f54e5d76
--- /dev/null
+++ b/utils/include/utils/Locations.h
@@ -0,0 +1,42 @@
+/**
+* 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.
+ */
+#pragma once
+
+#include <filesystem>
+
+#include "Environment.h"
+#include "file/FileUtils.h"
+
+constexpr std::string_view MINIFI_HOME_ENV_KEY = "MINIFI_HOME";
+
+namespace org::apache::nifi::minifi::utils {
+inline std::string getDefaultExtensionsPattern() {
+  constexpr std::string_view DEFAULT_EXTENSION_PATH = "../extensions/*";
+  constexpr std::string_view DEFAULT_EXTENSION_PATH_RPM = 
"/usr/lib64/nifi-minifi-cpp/extensions/*";
+  if (Environment::getEnvironmentVariable(MINIFI_HOME_ENV_KEY.data()) == "FHS" 
|| file::get_executable_path().parent_path() == "/usr/bin") {
+    return std::string(DEFAULT_EXTENSION_PATH_RPM);
+  }
+  return std::string(DEFAULT_EXTENSION_PATH);
+}
+
+inline std::filesystem::path getMinifiDir() {
+  if (Environment::getEnvironmentVariable(MINIFI_HOME_ENV_KEY.data()) == "FHS" 
|| file::get_executable_path().parent_path() == "/usr/bin") {
+    return "/var/lib/nifi-minifi-cpp";
+  }
+  return 
Environment::getEnvironmentVariable(MINIFI_HOME_ENV_KEY.data()).value_or("");
+}
+}  // org::apache::nifi::minifi::utils
\ No newline at end of file

Reply via email to