/*
 * 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.
 */

#ifndef _LOG4CXX_XML_DOM_CONFIGURATOR_H
#define _LOG4CXX_XML_DOM_CONFIGURATOR_H

#if defined(_MSC_VER)
	#pragma warning (push)
	#pragma warning ( disable: 4231 4251 4275 4786 )
#endif



#include <log4cxx/logstring.h>
#include <map>
#include <log4cxx/appender.h>
#include <log4cxx/layout.h>
#include <log4cxx/logger.h>
#include <log4cxx/helpers/properties.h>
#include <log4cxx/spi/configurator.h>
#include <log4cxx/helpers/charsetdecoder.h>
#include <log4cxx/spi/filter.h>
#include <log4cxx/rolling/triggeringpolicy.h>
#include <log4cxx/rolling/rollingpolicy.h>
#include <log4cxx/file.h>
#include <log4cxx/config/propertysetter.h>

extern "C" {
	struct apr_xml_doc;
	struct apr_xml_elem;
}

namespace log4cxx
{

namespace xml
{
class XMLWatchdog;

/**
Use this class to initialize the log4cxx environment using a DOM tree.

<p>Sometimes it is useful to see how log4cxx is reading configuration
files. You can enable log4cxx internal logging by setting the
<code>debug</code> attribute in the
<code>log4cxx</code> element. As in
<pre>
        &lt;log4j:configuration <b>debug="true"</b> xmlns:log4j="http://jakarta.apache.org/log4j/">
        ...
        &lt;/log4j:configuration>
</pre>

<p>There are sample XML files included in the package.
*/
class LOG4CXX_EXPORT DOMConfigurator :
	virtual public spi::Configurator,
	virtual public helpers::ObjectImpl
{
	protected:
		typedef std::map<LogString, AppenderPtr> AppenderMap;
		/**
		Used internally to parse appenders by IDREF name.
		*/
		AppenderPtr findAppenderByName(
			log4cxx::helpers::Pool& p,
			log4cxx::helpers::CharsetDecoderPtr& utf8Decoder,
			apr_xml_elem* elem,
			apr_xml_doc* doc,
			const LogString& appenderName,
			AppenderMap& appenders);

		/**
		Used internally to parse appenders by IDREF element.
		*/
		AppenderPtr findAppenderByReference(
			log4cxx::helpers::Pool& p,
			log4cxx::helpers::CharsetDecoderPtr& utf8Decoder,
			apr_xml_elem* appenderRef,
			apr_xml_doc* doc,
			AppenderMap& appenders);

		/**
		Used internally to parse an appender element.
		*/
		AppenderPtr parseAppender(
			log4cxx::helpers::Pool& p,
			log4cxx::helpers::CharsetDecoderPtr& utf8Decoder,
			apr_xml_elem* appenderElement,
			apr_xml_doc* doc,
			AppenderMap& appenders);

		/**
		Used internally to parse an {@link spi::ErrorHandler ErrorHandler } element.
		*/
		void parseErrorHandler(
			log4cxx::helpers::Pool& p,
			log4cxx::helpers::CharsetDecoderPtr& utf8Decoder,
			apr_xml_elem* element,
			AppenderPtr& appender,
			apr_xml_doc* doc,
			AppenderMap& appenders);

		/**
		 Used internally to parse a filter element.
		*/
		void parseFilters(
			log4cxx::helpers::Pool& p,
			log4cxx::helpers::CharsetDecoderPtr& utf8Decoder,
			apr_xml_elem* element,
			std::vector<log4cxx::spi::FilterPtr>& filters);

		/**
		Used internally to parse a logger element.
		*/
		void parseLogger(
			log4cxx::helpers::Pool& p,
			log4cxx::helpers::CharsetDecoderPtr& utf8Decoder,
			apr_xml_elem* loggerElement,
			apr_xml_doc* doc,
			AppenderMap& appenders);

		/**
		 Used internally to parse the logger factory element.
		*/
		void parseLoggerFactory(
			log4cxx::helpers::Pool& p,
			log4cxx::helpers::CharsetDecoderPtr& utf8Decoder,
			apr_xml_elem* factoryElement);

		/**
		 Used internally to parse the logger factory element.
		*/
		log4cxx::helpers::ObjectPtr parseTriggeringPolicy(
			log4cxx::helpers::Pool& p,
			log4cxx::helpers::CharsetDecoderPtr& utf8Decoder,
			apr_xml_elem* factoryElement);

		/**
		 Used internally to parse the logger factory element.
		*/
		log4cxx::rolling::RollingPolicyPtr parseRollingPolicy(
			log4cxx::helpers::Pool& p,
			log4cxx::helpers::CharsetDecoderPtr& utf8Decoder,
			apr_xml_elem* factoryElement);

		/**
		 Used internally to parse the root logger element.
		*/
		void parseRoot(log4cxx::helpers::Pool& p,
			log4cxx::helpers::CharsetDecoderPtr& utf8Decoder,
			apr_xml_elem* rootElement, apr_xml_doc* doc, AppenderMap& appenders);

		/**
		 Used internally to parse the children of a logger element.
		*/
		void parseChildrenOfLoggerElement(
			log4cxx::helpers::Pool& p,
			log4cxx::helpers::CharsetDecoderPtr& utf8Decoder,
			apr_xml_elem* catElement,
			LoggerPtr logger, bool isRoot,
			apr_xml_doc* doc,
			AppenderMap& appenders);

		/**
		 Used internally to parse a layout element.
		*/
		LayoutPtr parseLayout(
			log4cxx::helpers::Pool& p,
			log4cxx::helpers::CharsetDecoderPtr& utf8Decoder,
			apr_xml_elem* layout_element);

		/**
		 Used internally to parse a level  element.
		*/
		void parseLevel(
			log4cxx::helpers::Pool& p,
			log4cxx::helpers::CharsetDecoderPtr& utf8Decoder,
			apr_xml_elem* element,
			LoggerPtr logger, bool isRoot);

		void setParameter(
			log4cxx::helpers::Pool& p,
			log4cxx::helpers::CharsetDecoderPtr& utf8Decoder,
			apr_xml_elem* elem,
			log4cxx::config::PropertySetter& propSetter);

		/**
		 Used internally to configure the log4cxx framework from
		 an in-memory representation of an XML document.
		*/
		void parse(
			log4cxx::helpers::Pool& p,
			log4cxx::helpers::CharsetDecoderPtr& utf8Decoder,
			apr_xml_elem* element,
			apr_xml_doc* doc,
			AppenderMap& appenders);

	public:
		DOMConfigurator();

		DECLARE_LOG4CXX_OBJECT(DOMConfigurator)
		BEGIN_LOG4CXX_CAST_MAP()
		LOG4CXX_CAST_ENTRY(spi::Configurator)
		END_LOG4CXX_CAST_MAP()

		DOMConfigurator(log4cxx::helpers::Pool& p);

		void addRef() const;
		void releaseRef() const;

		/**
		A static version of #doConfigure.
		*/
		static void configure(const std::string& filename);
#if LOG4CXX_WCHAR_T_API
		static void configure(const std::wstring& filename);
#endif
#if LOG4CXX_UNICHAR_API
		static void configure(const std::basic_string<UniChar>& filename);
#endif
#if LOG4CXX_CFSTRING_API
		static void configure(const CFStringRef& filename);
#endif
		/**
		Like #configureAndWatch(const std::string& configFilename, long delay)
		except that the default delay as defined by
		log4cxx::helpers::FileWatchdog#DEFAULT_DELAY is used.
		@param configFilename A log4j configuration file in XML format.
		*/
		static void configureAndWatch(const std::string& configFilename);
#if LOG4CXX_WCHAR_T_API
		static void configureAndWatch(const std::wstring& configFilename);
#endif
#if LOG4CXX_UNICHAR_API
		static void configureAndWatch(const std::basic_string<UniChar>& configFilename);
#endif
#if LOG4CXX_CFSTRING_API
		static void configureAndWatch(const CFStringRef& configFilename);
#endif
		/**
		Read the configuration file <code>configFilename</code> if it
		exists. Moreover, a thread will be created that will periodically
		check if <code>configFilename</code> has been created or
		modified. The period is determined by the <code>delay</code>
		argument. If a change or file creation is detected, then
		<code>configFilename</code> is read to configure log4cxx.

		@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,
			long delay);
#if LOG4CXX_WCHAR_T_API
		static void configureAndWatch(const std::wstring& configFilename,
			long delay);
#endif
#if LOG4CXX_UNICHAR_API
		static void configureAndWatch(const std::basic_string<UniChar>& configFilename,
			long delay);
#endif
#if LOG4CXX_CFSTRING_API
		static void configureAndWatch(const CFStringRef& configFilename,
			long delay);
#endif

		/**
		Interpret the XML file pointed by <code>filename</code> and set up
		log4cxx accordingly.
		<p>The configuration is done relative to the hierarchy parameter.
		@param filename The file to parse.
		@param repository The hierarchy to operation upon.
		*/
		void doConfigure(const File& filename,
			spi::LoggerRepositoryPtr& repository);

	protected:
		static LogString getAttribute(
			log4cxx::helpers::CharsetDecoderPtr& utf8Decoder,
			apr_xml_elem*,
			const std::string& attrName);

		LogString subst(const LogString& value);

	protected:
		helpers::Properties props;
		spi::LoggerRepositoryPtr repository;
		spi::LoggerFactoryPtr loggerFactory;

	private:
		//   prevent assignment or copy statements
		DOMConfigurator(const DOMConfigurator&);
		DOMConfigurator& operator=(const DOMConfigurator&);
		static XMLWatchdog* xdog;
};
LOG4CXX_PTR_DEF(DOMConfigurator);
}  // namespace xml
} // namespace log4cxx

#if defined(_MSC_VER)
	#pragma warning (pop)
#endif

#endif // _LOG4CXX_XML_DOM_CONFIGURATOR_H
