You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@logging.apache.org by rm...@apache.org on 2022/12/23 00:32:45 UTC

[logging-log4cxx] 01/01: LOGCXX-573 Give the user feedback if things are configured

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

rmiddleton pushed a commit to branch LOGCXX-573
in repository https://gitbox.apache.org/repos/asf/logging-log4cxx.git

commit 6200525a3174e6451487f9fa9c3175a96df14a42
Author: Robert Middleton <ro...@rm5248.com>
AuthorDate: Thu Dec 22 19:32:26 2022 -0500

    LOGCXX-573 Give the user feedback if things are configured
---
 src/main/cpp/domconfigurator.cpp                | 70 ++++++++++++++++---------
 src/main/cpp/propertyconfigurator.cpp           | 30 +++++++----
 src/main/include/log4cxx/propertyconfigurator.h | 12 ++---
 src/main/include/log4cxx/spi/configurator.h     |  8 ++-
 src/main/include/log4cxx/xml/domconfigurator.h  | 26 ++++-----
 5 files changed, 90 insertions(+), 56 deletions(-)

diff --git a/src/main/cpp/domconfigurator.cpp b/src/main/cpp/domconfigurator.cpp
index 68b154b2..360b9bfb 100644
--- a/src/main/cpp/domconfigurator.cpp
+++ b/src/main/cpp/domconfigurator.cpp
@@ -778,7 +778,7 @@ void DOMConfigurator::setParameter(log4cxx::helpers::Pool& p,
 	propSetter.setProperty(name, value, p);
 }
 
-void DOMConfigurator::doConfigure(const File& filename, spi::LoggerRepositoryPtr repository1)
+spi::ConfigurationStatus DOMConfigurator::doConfigure(const File& filename, spi::LoggerRepositoryPtr repository1)
 {
 	repository1->setConfigured(true);
 	m_priv->repository = repository1;
@@ -804,6 +804,7 @@ void DOMConfigurator::doConfigure(const File& filename, spi::LoggerRepositoryPtr
 		msg2.append(LOG4CXX_STR("]. "));
 		msg2.append(io.what());
 		LogLog::error(msg2);
+		return spi::ConfigurationStatus::NotConfigured;
 	}
 	else
 	{
@@ -835,6 +836,7 @@ void DOMConfigurator::doConfigure(const File& filename, spi::LoggerRepositoryPtr
 			}
 
 			LogLog::error(msg2);
+			return spi::ConfigurationStatus::NotConfigured;
 		}
 		else
 		{
@@ -843,66 +845,68 @@ void DOMConfigurator::doConfigure(const File& filename, spi::LoggerRepositoryPtr
 			parse(p, utf8Decoder, doc->root, doc, appenders);
 		}
 	}
+
+	return spi::ConfigurationStatus::Configured;
 }
 
-void DOMConfigurator::configure(const std::string& filename)
+spi::ConfigurationStatus DOMConfigurator::configure(const std::string& filename)
 {
 	File file(filename);
-	DOMConfigurator().doConfigure(file, LogManager::getLoggerRepository());
+	return DOMConfigurator().doConfigure(file, LogManager::getLoggerRepository());
 }
 
 #if LOG4CXX_WCHAR_T_API
-void DOMConfigurator::configure(const std::wstring& filename)
+spi::ConfigurationStatus DOMConfigurator::configure(const std::wstring& filename)
 {
 	File file(filename);
-	DOMConfigurator().doConfigure(file, LogManager::getLoggerRepository());
+	return DOMConfigurator().doConfigure(file, LogManager::getLoggerRepository());
 }
 #endif
 
 #if LOG4CXX_UNICHAR_API
-void DOMConfigurator::configure(const std::basic_string<UniChar>& filename)
+spi::ConfigurationStatus DOMConfigurator::configure(const std::basic_string<UniChar>& filename)
 {
 	File file(filename);
-	DOMConfigurator().doConfigure(file, LogManager::getLoggerRepository());
+	return DOMConfigurator().doConfigure(file, LogManager::getLoggerRepository());
 }
 #endif
 
 #if LOG4CXX_CFSTRING_API
-void DOMConfigurator::configure(const CFStringRef& filename)
+spi::ConfigurationStatus DOMConfigurator::configure(const CFStringRef& filename)
 {
 	File file(filename);
-	DOMConfigurator().doConfigure(file, LogManager::getLoggerRepository());
+	return DOMConfigurator().doConfigure(file, LogManager::getLoggerRepository());
 }
 #endif
 
 
-void DOMConfigurator::configureAndWatch(const std::string& filename)
+spi::ConfigurationStatus DOMConfigurator::configureAndWatch(const std::string& filename)
 {
-	configureAndWatch(filename, FileWatchdog::DEFAULT_DELAY);
+	return configureAndWatch(filename, FileWatchdog::DEFAULT_DELAY);
 }
 
 #if LOG4CXX_WCHAR_T_API
-void DOMConfigurator::configureAndWatch(const std::wstring& filename)
+spi::ConfigurationStatus DOMConfigurator::configureAndWatch(const std::wstring& filename)
 {
-	configureAndWatch(filename, FileWatchdog::DEFAULT_DELAY);
+	return configureAndWatch(filename, FileWatchdog::DEFAULT_DELAY);
 }
 #endif
 
 #if LOG4CXX_UNICHAR_API
-void DOMConfigurator::configureAndWatch(const std::basic_string<UniChar>& filename)
+spi::ConfigurationStatus DOMConfigurator::configureAndWatch(const std::basic_string<UniChar>& filename)
 {
-	configureAndWatch(filename, FileWatchdog::DEFAULT_DELAY);
+	return configureAndWatch(filename, FileWatchdog::DEFAULT_DELAY);
 }
 #endif
 
 #if LOG4CXX_CFSTRING_API
-void DOMConfigurator::configureAndWatch(const CFStringRef& filename)
+spi::ConfigurationStatus DOMConfigurator::configureAndWatch(const CFStringRef& filename)
 {
-	configureAndWatch(filename, FileWatchdog::DEFAULT_DELAY);
+	return configureAndWatch(filename, FileWatchdog::DEFAULT_DELAY);
 }
 #endif
 
-void DOMConfigurator::configureAndWatch(const std::string& filename, long delay)
+spi::ConfigurationStatus DOMConfigurator::configureAndWatch(const std::string& filename, long delay)
 {
 	File file(filename);
 #if APR_HAS_THREADS
@@ -913,17 +917,21 @@ void DOMConfigurator::configureAndWatch(const std::string& filename, long delay)
 		delete xdog;
 	}
 
+	spi::ConfigurationStatus status = DOMConfigurator().doConfigure(file, LogManager::getLoggerRepository());
+
 	xdog = new XMLWatchdog(file);
 	APRInitializer::registerCleanup(xdog);
 	xdog->setDelay(delay);
 	xdog->start();
+
+	return status;
 #else
-	DOMConfigurator().doConfigure(file, LogManager::getLoggerRepository());
+	return DOMConfigurator().doConfigure(file, LogManager::getLoggerRepository());
 #endif
 }
 
 #if LOG4CXX_WCHAR_T_API
-void DOMConfigurator::configureAndWatch(const std::wstring& filename, long delay)
+spi::ConfigurationStatus DOMConfigurator::configureAndWatch(const std::wstring& filename, long delay)
 {
 	File file(filename);
 #if APR_HAS_THREADS
@@ -934,18 +942,22 @@ void DOMConfigurator::configureAndWatch(const std::wstring& filename, long delay
 		delete xdog;
 	}
 
+	spi::ConfigurationStatus status = DOMConfigurator().doConfigure(file, LogManager::getLoggerRepository());
+
 	xdog = new XMLWatchdog(file);
 	APRInitializer::registerCleanup(xdog);
 	xdog->setDelay(delay);
 	xdog->start();
+
+	return status;
 #else
-	DOMConfigurator().doConfigure(file, LogManager::getLoggerRepository());
+	return DOMConfigurator().doConfigure(file, LogManager::getLoggerRepository());
 #endif
 }
 #endif
 
 #if LOG4CXX_UNICHAR_API
-void DOMConfigurator::configureAndWatch(const std::basic_string<UniChar>& filename, long delay)
+spi::ConfigurationStatus DOMConfigurator::configureAndWatch(const std::basic_string<UniChar>& filename, long delay)
 {
 	File file(filename);
 #if APR_HAS_THREADS
@@ -956,18 +968,22 @@ void DOMConfigurator::configureAndWatch(const std::basic_string<UniChar>& filena
 		delete xdog;
 	}
 
+	spi::ConfigurationStatus status = DOMConfigurator().doConfigure(file, LogManager::getLoggerRepository());
+
 	xdog = new XMLWatchdog(file);
 	APRInitializer::registerCleanup(xdog);
 	xdog->setDelay(delay);
 	xdog->start();
+
+	return status;
 #else
-	DOMConfigurator().doConfigure(file, LogManager::getLoggerRepository());
+	return DOMConfigurator().doConfigure(file, LogManager::getLoggerRepository());
 #endif
 }
 #endif
 
 #if LOG4CXX_CFSTRING_API
-void DOMConfigurator::configureAndWatch(const CFStringRef& filename, long delay)
+spi::ConfigurationStatus DOMConfigurator::configureAndWatch(const CFStringRef& filename, long delay)
 {
 	File file(filename);
 #if APR_HAS_THREADS
@@ -978,12 +994,16 @@ void DOMConfigurator::configureAndWatch(const CFStringRef& filename, long delay)
 		delete xdog;
 	}
 
+	spi::ConfigurationStatus status = DOMConfigurator().doConfigure(file, LogManager::getLoggerRepository());
+
 	xdog = new XMLWatchdog(file);
 	APRInitializer::registerCleanup(xdog);
 	xdog->setDelay(delay);
 	xdog->start();
+
+	return status;
 #else
-	DOMConfigurator().doConfigure(file, LogManager::getLoggerRepository());
+	return DOMConfigurator().doConfigure(file, LogManager::getLoggerRepository());
 #endif
 }
 #endif
diff --git a/src/main/cpp/propertyconfigurator.cpp b/src/main/cpp/propertyconfigurator.cpp
index 2034c310..2ece4d1a 100644
--- a/src/main/cpp/propertyconfigurator.cpp
+++ b/src/main/cpp/propertyconfigurator.cpp
@@ -89,7 +89,7 @@ PropertyConfigurator::~PropertyConfigurator()
 	delete registry;
 }
 
-void PropertyConfigurator::doConfigure(const File& configFileName,
+spi::ConfigurationStatus PropertyConfigurator::doConfigure(const File& configFileName,
 	spi::LoggerRepositoryPtr hierarchy)
 {
 	hierarchy->setConfigured(true);
@@ -105,7 +105,7 @@ void PropertyConfigurator::doConfigure(const File& configFileName,
 	{
 		LogLog::error(((LogString) LOG4CXX_STR("Could not read configuration file ["))
 			+ configFileName.getPath() + LOG4CXX_STR("].") + ": " + ex.what());
-		return;
+		return spi::ConfigurationStatus::NotConfigured;
 	}
 
 	try
@@ -113,34 +113,36 @@ void PropertyConfigurator::doConfigure(const File& configFileName,
 		LogString debugMsg = LOG4CXX_STR("Loading configuration file [")
 				+ configFileName.getPath() + LOG4CXX_STR("].");
 		LogLog::debug(debugMsg);
-		doConfigure(props, hierarchy);
+		return doConfigure(props, hierarchy);
 	}
 	catch (const std::exception& ex)
 	{
 		LogLog::error(((LogString) LOG4CXX_STR("Could not parse configuration file ["))
 			+ configFileName.getPath() + LOG4CXX_STR("]."), ex);
 	}
+
+	return spi::ConfigurationStatus::NotConfigured;
 }
 
-void PropertyConfigurator::configure(const File& configFilename)
+spi::ConfigurationStatus PropertyConfigurator::configure(const File& configFilename)
 {
-	PropertyConfigurator().doConfigure(configFilename, LogManager::getLoggerRepository());
+	return PropertyConfigurator().doConfigure(configFilename, LogManager::getLoggerRepository());
 }
 
-void PropertyConfigurator::configure(helpers::Properties& properties)
+spi::ConfigurationStatus PropertyConfigurator::configure(helpers::Properties& properties)
 {
-	PropertyConfigurator().doConfigure(properties, LogManager::getLoggerRepository());
+	return PropertyConfigurator().doConfigure(properties, LogManager::getLoggerRepository());
 }
 
 #if APR_HAS_THREADS
-void PropertyConfigurator::configureAndWatch(const File& configFilename)
+spi::ConfigurationStatus PropertyConfigurator::configureAndWatch(const File& configFilename)
 {
-	configureAndWatch(configFilename, FileWatchdog::DEFAULT_DELAY);
+	return configureAndWatch(configFilename, FileWatchdog::DEFAULT_DELAY);
 }
 
 
 
-void PropertyConfigurator::configureAndWatch(
+spi::ConfigurationStatus PropertyConfigurator::configureAndWatch(
 	const File& configFilename, long delay)
 {
 	if (pdog)
@@ -149,14 +151,18 @@ void PropertyConfigurator::configureAndWatch(
 		delete pdog;
 	}
 
+	spi::ConfigurationStatus stat = PropertyConfigurator().doConfigure(configFilename, LogManager::getLoggerRepository());
+
 	pdog = new PropertyWatchdog(configFilename);
 	APRInitializer::registerCleanup(pdog);
 	pdog->setDelay(delay);
 	pdog->start();
+
+	return stat;
 }
 #endif
 
-void PropertyConfigurator::doConfigure(helpers::Properties& properties,
+spi::ConfigurationStatus PropertyConfigurator::doConfigure(helpers::Properties& properties,
 	spi::LoggerRepositoryPtr hierarchy)
 {
 	hierarchy->setConfigured(true);
@@ -209,6 +215,8 @@ void PropertyConfigurator::doConfigure(helpers::Properties& properties,
 	// We don't want to hold references to appenders preventing their
 	// destruction.
 	registry->clear();
+
+	return spi::ConfigurationStatus::Configured;
 }
 
 void PropertyConfigurator::configureLoggerFactory(helpers::Properties& props)
diff --git a/src/main/include/log4cxx/propertyconfigurator.h b/src/main/include/log4cxx/propertyconfigurator.h
index 416df08a..675a69d1 100644
--- a/src/main/include/log4cxx/propertyconfigurator.h
+++ b/src/main/include/log4cxx/propertyconfigurator.h
@@ -282,13 +282,13 @@ class LOG4CXX_EXPORT PropertyConfigurator :
 		configuration information is stored.
 		@param hierarchy The hierarchy to operation upon.
 		*/
-		void doConfigure(const File& configFileName,
+		spi::ConfigurationStatus doConfigure(const File& configFileName,
 			spi::LoggerRepositoryPtr hierarchy) override;
 
 		/**
 		Read configuration options from file <code>configFilename</code>.
 		*/
-		static void configure(const File& configFilename);
+		static spi::ConfigurationStatus configure(const File& configFilename);
 
 		/**
 		Like {@link #configureAndWatch(const File& configFilename, long delay)}
@@ -297,7 +297,7 @@ class LOG4CXX_EXPORT PropertyConfigurator :
 		is used.
 		@param configFilename A file in key=value format.
 		*/
-		static void configureAndWatch(const File& configFilename);
+		static spi::ConfigurationStatus configureAndWatch(const File& configFilename);
 
 		/**
 		Read the configuration file <code>configFilename</code> if it
@@ -310,7 +310,7 @@ class LOG4CXX_EXPORT PropertyConfigurator :
 		@param configFilename A file in key=value format.
 		@param delay The delay in milliseconds to wait between each check.
 		*/
-		static void configureAndWatch(const File& configFilename,
+		static spi::ConfigurationStatus configureAndWatch(const File& configFilename,
 			long delay);
 
 		/**
@@ -318,14 +318,14 @@ class LOG4CXX_EXPORT PropertyConfigurator :
 		See {@link PropertyConfigurator#doConfigure doConfigure}
 		for the expected format.
 		*/
-		static void configure(helpers::Properties& properties);
+		static spi::ConfigurationStatus configure(helpers::Properties& properties);
 
 		/**
 		Read configuration options from <code>properties</code>.
 		See {@link PropertyConfigurator#doConfigure doConfigure}
 		for the expected format.
 		*/
-		void doConfigure(helpers::Properties& properties,
+		spi::ConfigurationStatus doConfigure(helpers::Properties& properties,
 			spi::LoggerRepositoryPtr hierarchy);
 
 		// --------------------------------------------------------------------------
diff --git a/src/main/include/log4cxx/spi/configurator.h b/src/main/include/log4cxx/spi/configurator.h
index 144d0680..68881cea 100644
--- a/src/main/include/log4cxx/spi/configurator.h
+++ b/src/main/include/log4cxx/spi/configurator.h
@@ -26,6 +26,12 @@ class File;
 
 namespace spi
 {
+
+enum class ConfigurationStatus{
+	Configured,
+	NotConfigured,
+};
+
 /**
 Implemented by classes capable of configuring log4j using a URL.
 */
@@ -43,7 +49,7 @@ class LOG4CXX_EXPORT Configurator : virtual public helpers::Object
 		@param configFileName The file to parse
 		@param repository The hierarchy to operation upon.
 		*/
-		virtual void doConfigure(const File& configFileName,
+		virtual ConfigurationStatus doConfigure(const File& configFileName,
 			spi::LoggerRepositoryPtr repository) = 0;
 
 	protected:
diff --git a/src/main/include/log4cxx/xml/domconfigurator.h b/src/main/include/log4cxx/xml/domconfigurator.h
index 7f1bddfc..e4336c63 100644
--- a/src/main/include/log4cxx/xml/domconfigurator.h
+++ b/src/main/include/log4cxx/xml/domconfigurator.h
@@ -218,15 +218,15 @@ class LOG4CXX_EXPORT DOMConfigurator :
 		/**
 		A static version of #doConfigure.
 		*/
-		static void configure(const std::string& filename);
+		static spi::ConfigurationStatus configure(const std::string& filename);
 #if LOG4CXX_WCHAR_T_API
-		static void configure(const std::wstring& filename);
+		static spi::ConfigurationStatus configure(const std::wstring& filename);
 #endif
 #if LOG4CXX_UNICHAR_API
-		static void configure(const std::basic_string<UniChar>& filename);
+		static spi::ConfigurationStatus configure(const std::basic_string<UniChar>& filename);
 #endif
 #if LOG4CXX_CFSTRING_API
-		static void configure(const CFStringRef& filename);
+		static spi::ConfigurationStatus configure(const CFStringRef& filename);
 #endif
 		/**
 		Like #configureAndWatch(const std::string& configFilename, long delay)
@@ -234,15 +234,15 @@ class LOG4CXX_EXPORT DOMConfigurator :
 		log4cxx::helpers::FileWatchdog#DEFAULT_DELAY is used.
 		@param configFilename A log4j configuration file in XML format.
 		*/
-		static void configureAndWatch(const std::string& configFilename);
+		static spi::ConfigurationStatus configureAndWatch(const std::string& configFilename);
 #if LOG4CXX_WCHAR_T_API
-		static void configureAndWatch(const std::wstring& configFilename);
+		static spi::ConfigurationStatus configureAndWatch(const std::wstring& configFilename);
 #endif
 #if LOG4CXX_UNICHAR_API
-		static void configureAndWatch(const std::basic_string<UniChar>& configFilename);
+		static spi::ConfigurationStatus configureAndWatch(const std::basic_string<UniChar>& configFilename);
 #endif
 #if LOG4CXX_CFSTRING_API
-		static void configureAndWatch(const CFStringRef& configFilename);
+		static spi::ConfigurationStatus configureAndWatch(const CFStringRef& configFilename);
 #endif
 		/**
 		Read the configuration file <code>configFilename</code> if it
@@ -255,18 +255,18 @@ class LOG4CXX_EXPORT DOMConfigurator :
 		@param configFilename A log4j configuration file in XML format.
 		@param delay The delay in milliseconds to wait between each check.
 		*/
-		static void configureAndWatch(const std::string& configFilename,
+		static spi::ConfigurationStatus configureAndWatch(const std::string& configFilename,
 			long delay);
 #if LOG4CXX_WCHAR_T_API
-		static void configureAndWatch(const std::wstring& configFilename,
+		static spi::ConfigurationStatus configureAndWatch(const std::wstring& configFilename,
 			long delay);
 #endif
 #if LOG4CXX_UNICHAR_API
-		static void configureAndWatch(const std::basic_string<UniChar>& configFilename,
+		static spi::ConfigurationStatus configureAndWatch(const std::basic_string<UniChar>& configFilename,
 			long delay);
 #endif
 #if LOG4CXX_CFSTRING_API
-		static void configureAndWatch(const CFStringRef& configFilename,
+		static spi::ConfigurationStatus configureAndWatch(const CFStringRef& configFilename,
 			long delay);
 #endif
 
@@ -277,7 +277,7 @@ class LOG4CXX_EXPORT DOMConfigurator :
 		@param filename The file to parse.
 		@param repository The hierarchy to operation upon.
 		*/
-		void doConfigure(const File& filename,
+		spi::ConfigurationStatus doConfigure(const File& filename,
 			spi::LoggerRepositoryPtr repository) override;
 
 	protected: