Author: carnold
Date: Mon Mar  6 22:51:03 2006
New Revision: 383802

URL: http://svn.apache.org/viewcvs?rev=383802&view=rev
Log:
Bug LOGCXX-35: Migrate from msxml/libxml2 to apr_xml_parse

Removed:
    logging/log4cxx/trunk/include/log4cxx/helpers/gnomexml.h
    logging/log4cxx/trunk/include/log4cxx/helpers/msxml.h
    logging/log4cxx/trunk/src/gnomexml.cpp
    logging/log4cxx/trunk/src/msxml.cpp
Modified:
    logging/log4cxx/trunk/examples/delayedloop.cpp
    logging/log4cxx/trunk/include/log4cxx/helpers/charsetdecoder.h
    logging/log4cxx/trunk/include/log4cxx/xml/domconfigurator.h
    logging/log4cxx/trunk/simplesocketserver/simplesocketserver.cpp
    logging/log4cxx/trunk/src/Makefile.am
    logging/log4cxx/trunk/src/charsetdecoder.cpp
    logging/log4cxx/trunk/src/domconfigurator.cpp
    logging/log4cxx/trunk/src/optionconverter.cpp
    logging/log4cxx/trunk/tests/src/customlogger/xloggertestcase.cpp
    logging/log4cxx/trunk/tests/src/defaultinit/testcase2.cpp
    logging/log4cxx/trunk/tests/src/defaultinit/testcase4.cpp
    logging/log4cxx/trunk/tests/src/main.cpp
    logging/log4cxx/trunk/tests/src/varia/errorhandlertestcase.cpp
    logging/log4cxx/trunk/tests/src/xml/customleveltestcase.cpp
    logging/log4cxx/trunk/tests/src/xml/domtestcase.cpp

Modified: logging/log4cxx/trunk/examples/delayedloop.cpp
URL: 
http://svn.apache.org/viewcvs/logging/log4cxx/trunk/examples/delayedloop.cpp?rev=383802&r1=383801&r2=383802&view=diff
==============================================================================
--- logging/log4cxx/trunk/examples/delayedloop.cpp (original)
+++ logging/log4cxx/trunk/examples/delayedloop.cpp Mon Mar  6 22:51:03 2006
@@ -61,14 +61,12 @@
 
         static void init(const std::string& configFile)
         {
-#ifdef LOG4CXX_HAVE_XML
                 if(configFile.length() > 4 &&
                      configFile.substr(configFile.length() - 4) == ".xml")
                 {
                         xml::DOMConfigurator::configureAndWatch(configFile, 
3000);
                 }
                 else
-#endif
                 {
                         PropertyConfigurator::configureAndWatch(configFile, 
3000);
                 }

Modified: logging/log4cxx/trunk/include/log4cxx/helpers/charsetdecoder.h
URL: 
http://svn.apache.org/viewcvs/logging/log4cxx/trunk/include/log4cxx/helpers/charsetdecoder.h?rev=383802&r1=383801&r2=383802&view=diff
==============================================================================
--- logging/log4cxx/trunk/include/log4cxx/helpers/charsetdecoder.h (original)
+++ logging/log4cxx/trunk/include/log4cxx/helpers/charsetdecoder.h Mon Mar  6 
22:51:03 2006
@@ -60,6 +60,10 @@
                    */
                   static CharsetDecoderPtr getWideDecoder();
 #endif
+              /**
+               *   Get decoder for UTF-8.
+               */
+                  static CharsetDecoderPtr getUTF8Decoder();
 
               /**
                *  Decodes as many bytes as possible from the given

Modified: logging/log4cxx/trunk/include/log4cxx/xml/domconfigurator.h
URL: 
http://svn.apache.org/viewcvs/logging/log4cxx/trunk/include/log4cxx/xml/domconfigurator.h?rev=383802&r1=383801&r2=383802&view=diff
==============================================================================
--- logging/log4cxx/trunk/include/log4cxx/xml/domconfigurator.h (original)
+++ logging/log4cxx/trunk/include/log4cxx/xml/domconfigurator.h Mon Mar  6 
22:51:03 2006
@@ -27,6 +27,9 @@
 #include <log4cxx/helpers/properties.h>
 #include <log4cxx/spi/configurator.h>
 
+struct apr_xml_doc;
+struct apr_xml_elem;
+
 namespace log4cxx
 {
         class File;
@@ -46,14 +49,6 @@
                 typedef helpers::ObjectPtrT<OptionHandler> OptionHandlerPtr;
         }
 
-        namespace helpers
-        {
-                class XMLDOMDocument;
-                typedef helpers::ObjectPtrT<XMLDOMDocument> XMLDOMDocumentPtr;
-
-                class XMLDOMElement;
-                typedef helpers::ObjectPtrT<XMLDOMElement> XMLDOMElementPtr;
-        }
 
         namespace config
         {
@@ -73,15 +68,6 @@
 
         namespace xml
         {
-                class AppenderMap
-                {
-                public:
-                        AppenderPtr get(const LogString& appenderName);
-                        void put(const LogString& appenderName, AppenderPtr 
appender);
-
-                protected:
-                        std::map<LogString, AppenderPtr> map;
-                };
 
               /**
               Use this class to initialize the log4cxx environment using a DOM 
tree.
@@ -103,77 +89,93 @@
                         virtual public helpers::ObjectImpl
                 {
                 protected:
+                        typedef std::map<LogString, AppenderPtr> AppenderMap;
                         /**
                         Used internally to parse appenders by IDREF name.
                         */
-                        AppenderPtr 
findAppenderByName(helpers::XMLDOMDocumentPtr doc,
-                                const LogString& appenderName);
+                        AppenderPtr findAppenderByName(apr_xml_elem* elem,
+                                const LogString& appenderName,
+                                AppenderMap& appenders);
 
                         /**
                         Used internally to parse appenders by IDREF element.
                         */
                         AppenderPtr findAppenderByReference(
-                                helpers::XMLDOMElementPtr appenderRef);
+                                apr_xml_elem* appenderRef,
+                                apr_xml_doc* doc,
+                                AppenderMap& appenders);
 
                         /**
                         Used internally to parse an appender element.
                         */
-                        AppenderPtr parseAppender(helpers::XMLDOMElementPtr 
appenderElement);
+                        AppenderPtr parseAppender(apr_xml_elem* 
appenderElement,
+                            apr_xml_doc* doc,
+                            AppenderMap& appenders);
 
                         /**
                         Used internally to parse an [EMAIL PROTECTED] 
spi::ErrorHandler ErrorHandler } element.
                         */
-                        void parseErrorHandler(helpers::XMLDOMElementPtr 
element, AppenderPtr appender);
+                        void parseErrorHandler(apr_xml_elem*, 
+                            AppenderPtr& appender,
+                            apr_xml_doc* doc,
+                            AppenderMap& appenders);
 
                         /**
                          Used internally to parse a filter element.
                         */
-                        void parseFilters(helpers::XMLDOMElementPtr element,
+                        void parseFilters(apr_xml_elem* element,
                            std::vector<log4cxx::spi::FilterPtr>& filters);
 
                         /**
                         Used internally to parse a logger element.
                         */
-                        void parseLogger(helpers::XMLDOMElementPtr 
loggerElement);
+                        void parseLogger(apr_xml_elem* loggerElement,
+                            apr_xml_doc* doc,
+                            AppenderMap& appenders);
 
                         /**
                          Used internally to parse the logger factory element.
                         */
-                        void parseLoggerFactory(helpers::XMLDOMElementPtr 
factoryElement);
+                        void parseLoggerFactory(apr_xml_elem* factoryElement);
 
                         /**
                          Used internally to parse the logger factory element.
                         */
-                        log4cxx::rolling::TriggeringPolicyPtr 
parseTriggeringPolicy(helpers::XMLDOMElementPtr factoryElement);
+                        log4cxx::rolling::TriggeringPolicyPtr 
parseTriggeringPolicy(
+                            apr_xml_elem* factoryElement);
 
                         /**
                          Used internally to parse the logger factory element.
                         */
-                        log4cxx::rolling::RollingPolicyPtr 
parseRollingPolicy(helpers::XMLDOMElementPtr factoryElement);
+                        log4cxx::rolling::RollingPolicyPtr parseRollingPolicy(
+                            apr_xml_elem* factoryElement);
 
                         /**
                          Used internally to parse the roor category element.
                         */
-                        void parseRoot(helpers::XMLDOMElementPtr rootElement);
+                        void parseRoot(apr_xml_elem* rootElement, apr_xml_doc* 
doc, AppenderMap& appenders);
 
                         /**
                          Used internally to parse the children of a category 
element.
                         */
-                        void 
parseChildrenOfLoggerElement(helpers::XMLDOMElementPtr catElement,
-                                LoggerPtr logger, bool isRoot);
+                        void parseChildrenOfLoggerElement(
+                                apr_xml_elem* catElement,
+                                LoggerPtr logger, bool isRoot,
+                                apr_xml_doc* doc,
+                                AppenderMap& appenders);
 
                         /**
                          Used internally to parse a layout element.
                         */
-                        LayoutPtr parseLayout(helpers::XMLDOMElementPtr 
layout_element);
+                        LayoutPtr parseLayout(apr_xml_elem* layout_element);
 
                         /**
                          Used internally to parse a level  element.
                         */
-                        void parseLevel(helpers::XMLDOMElementPtr element,
+                        void parseLevel(apr_xml_elem* element,
                                 LoggerPtr logger, bool isRoot);
 
-                        void setParameter(helpers::XMLDOMElementPtr elem,
+                        void setParameter(apr_xml_elem* elem,
                                 config::PropertySetter& propSetter);
 
                         /**
@@ -182,7 +184,9 @@
                          href="docs/log4j.dtd">log4j.dtd</a>.
 
                         */
-                        void parse(helpers::XMLDOMElementPtr element);
+                        void parse(apr_xml_elem* element, 
+                            apr_xml_doc* doc,
+                            AppenderMap& appenders);
 
                 public:
                         DOMConfigurator();
@@ -240,11 +244,11 @@
                                 spi::LoggerRepositoryPtr& repository);
 
                 protected:
+                        static LogString getAttribute(apr_xml_elem*, 
+                            const std::string& attrName); 
                         LogString DOMConfigurator::subst(const LogString& 
value);
 
                 protected:
-                        void * appenderBag;
-
                         helpers::Properties props;
                         spi::LoggerRepositoryPtr repository;
                         spi::LoggerFactoryPtr loggerFactory;
@@ -253,6 +257,7 @@
                         //   prevent assignment or copy statements
                         DOMConfigurator(const DOMConfigurator&);
                         DOMConfigurator& operator=(const DOMConfigurator&);
+
                 };
         }  // namespace xml
 } // namespace log4cxx

Modified: logging/log4cxx/trunk/simplesocketserver/simplesocketserver.cpp
URL: 
http://svn.apache.org/viewcvs/logging/log4cxx/trunk/simplesocketserver/simplesocketserver.cpp?rev=383802&r1=383801&r2=383802&view=diff
==============================================================================
--- logging/log4cxx/trunk/simplesocketserver/simplesocketserver.cpp (original)
+++ logging/log4cxx/trunk/simplesocketserver/simplesocketserver.cpp Mon Mar  6 
22:51:03 2006
@@ -34,9 +34,7 @@
 #include <log4cxx/stream.h>
 
 using namespace log4cxx;
-#ifdef LOG4CXX_HAVE_XML
 using namespace log4cxx::xml;
-#endif
 using namespace log4cxx::net;
 using namespace log4cxx::helpers;
 
@@ -52,7 +50,6 @@
 {
         port = atol(portStr.c_str());
 
-#ifdef LOG4CXX_HAVE_XML
         // tests if configFile ends with ".xml"
         if (configFile.length() > 4 &&
               configFile.substr(configFile.length() -4) == ".xml")
@@ -60,7 +57,6 @@
                 DOMConfigurator::configure(configFile);
         }
         else
-#endif
         {
                 PropertyConfigurator::configure(configFile);
         }

Modified: logging/log4cxx/trunk/src/Makefile.am
URL: 
http://svn.apache.org/viewcvs/logging/log4cxx/trunk/src/Makefile.am?rev=383802&r1=383801&r2=383802&view=diff
==============================================================================
--- logging/log4cxx/trunk/src/Makefile.am (original)
+++ logging/log4cxx/trunk/src/Makefile.am Mon Mar  6 22:51:03 2006
@@ -45,7 +45,6 @@
         fixedwindowrollingpolicy.cpp \
         formattinginfo.cpp \
         fulllocationpatternconverter.cpp \
-        gnomexml.cpp \
         hierarchy.cpp \
         htmllayout.cpp \
         inetaddress.cpp \
@@ -73,7 +72,6 @@
         messagepatternconverter.cpp \
         methodlocationpatternconverter.cpp \
         mdc.cpp \
-        msxml.cpp \
         mutex.cpp \
         nameabbreviator.cpp \
         namepatternconverter.cpp \

Modified: logging/log4cxx/trunk/src/charsetdecoder.cpp
URL: 
http://svn.apache.org/viewcvs/logging/log4cxx/trunk/src/charsetdecoder.cpp?rev=383802&r1=383801&r2=383802&view=diff
==============================================================================
--- logging/log4cxx/trunk/src/charsetdecoder.cpp (original)
+++ logging/log4cxx/trunk/src/charsetdecoder.cpp Mon Mar  6 22:51:03 2006
@@ -444,6 +444,19 @@
     return decoder;
 }
 
+CharsetDecoderPtr CharsetDecoder::getUTF8Decoder() {
+    static CharsetDecoderPtr decoder(new UTF8CharsetDecoder());
+    //
+    //  if invoked after static variable destruction
+    //     (if logging is called in the destructor of a static object)
+    //     then create a new decoder.
+    // 
+    if (decoder == 0) {
+       return new UTF8CharsetDecoder();
+    }
+    return decoder;
+}
+
 #if LOG4CXX_HAS_WCHAR_T
 CharsetDecoder* CharsetDecoder::createWideDecoder() {
 #if LOG4CXX_LOGCHAR_IS_WCHAR

Modified: logging/log4cxx/trunk/src/domconfigurator.cpp
URL: 
http://svn.apache.org/viewcvs/logging/log4cxx/trunk/src/domconfigurator.cpp?rev=383802&r1=383801&r2=383802&view=diff
==============================================================================
--- logging/log4cxx/trunk/src/domconfigurator.cpp (original)
+++ logging/log4cxx/trunk/src/domconfigurator.cpp Mon Mar  6 22:51:03 2006
@@ -15,14 +15,6 @@
  */
 
 #include <log4cxx/private/log4cxx_private.h>
-#ifdef LOG4CXX_HAVE_XML
-
-#if defined(_WIN32)
-#include <windows.h>
-#include <log4cxx/helpers/msxml.h>
-#else
-#include <log4cxx/helpers/gnomexml.h>
-#endif
 
 
 #include <log4cxx/xml/domconfigurator.h>
@@ -49,6 +41,9 @@
 #include <log4cxx/helpers/transcoder.h>
 #include <log4cxx/rolling/rollingfileappender.h>
 #include <log4cxx/rolling/filterbasedtriggeringpolicy.h>
+#include <apr_xml.h>
+#include <log4cxx/helpers/bytebuffer.h>
+#include <log4cxx/helpers/charsetdecoder.h>
 
 using namespace log4cxx;
 using namespace log4cxx::xml;
@@ -57,6 +52,7 @@
 using namespace log4cxx::config;
 using namespace log4cxx::rolling;
 
+
 class XMLWatchdog  : public FileWatchdog
 {
 public:
@@ -75,125 +71,111 @@
         }
 };
 
-AppenderPtr AppenderMap::get(const LogString& appenderName)
-{
-        AppenderPtr appender;
-        std::map<LogString, AppenderPtr>::iterator it;
-        it = map.find(appenderName);
-
-        if (it != map.end())
-        {
-                appender = it->second;
-        }
-
-        return appender;
-}
-
-void AppenderMap::put(const LogString& appenderName, AppenderPtr appender)
-{
-        map.insert(std::map<LogString, AppenderPtr>::value_type(appenderName, 
appender));
-}
 
 IMPLEMENT_LOG4CXX_OBJECT(DOMConfigurator)
 
-#define CONFIGURATION_TAG LOG4CXX_STR("log4j:configuration")
-#define OLD_CONFIGURATION_TAG LOG4CXX_STR("configuration")
-#define APPENDER_TAG LOG4CXX_STR("appender")
-#define APPENDER_REF_TAG LOG4CXX_STR("appender-ref")
-#define PARAM_TAG LOG4CXX_STR("param")
-#define LAYOUT_TAG LOG4CXX_STR("layout")
-#define ROLLING_POLICY_TAG LOG4CXX_STR("rollingPolicy")
-#define TRIGGERING_POLICY_TAG LOG4CXX_STR("triggeringPolicy")
-#define CATEGORY LOG4CXX_STR("category")
-#define LOGGER LOG4CXX_STR("logger")
-#define LOGGER_REF LOG4CXX_STR("logger-ref")
-#define CATEGORY_FACTORY_TAG LOG4CXX_STR("categoryFactory")
-#define NAME_ATTR LOG4CXX_STR("name")
-#define CLASS_ATTR LOG4CXX_STR("class")
-#define VALUE_ATTR LOG4CXX_STR("value")
-#define ROOT_TAG LOG4CXX_STR("root")
-#define ROOT_REF LOG4CXX_STR("root-ref")
-#define LEVEL_TAG LOG4CXX_STR("level")
-#define PRIORITY_TAG LOG4CXX_STR("priority")
-#define FILTER_TAG LOG4CXX_STR("filter")
-#define ERROR_HANDLER_TAG LOG4CXX_STR("errorHandler")
-#define REF_ATTR LOG4CXX_STR("ref")
-#define ADDITIVITY_ATTR LOG4CXX_STR("additivity")
-#define THRESHOLD_ATTR LOG4CXX_STR("threshold")
-#define CONFIG_DEBUG_ATTR LOG4CXX_STR("configDebug")
-#define INTERNAL_DEBUG_ATTR LOG4CXX_STR("debug")
+#define CONFIGURATION_TAG "log4j:configuration"
+#define OLD_CONFIGURATION_TAG "configuration"
+#define APPENDER_TAG "appender"
+#define APPENDER_REF_TAG "appender-ref"
+#define PARAM_TAG "param"
+#define LAYOUT_TAG "layout"
+#define ROLLING_POLICY_TAG "rollingPolicy"
+#define TRIGGERING_POLICY_TAG "triggeringPolicy"
+#define CATEGORY "category"
+#define LOGGER "logger"
+#define LOGGER_REF "logger-ref"
+#define CATEGORY_FACTORY_TAG "categoryFactory"
+#define NAME_ATTR "name"
+#define CLASS_ATTR "class"
+#define VALUE_ATTR "value"
+#define ROOT_TAG "root"
+#define ROOT_REF "root-ref"
+#define LEVEL_TAG "level"
+#define PRIORITY_TAG "priority"
+#define FILTER_TAG "filter"
+#define ERROR_HANDLER_TAG "errorHandler"
+#define REF_ATTR "ref"
+#define ADDITIVITY_ATTR "additivity"
+#define THRESHOLD_ATTR "threshold"
+#define CONFIG_DEBUG_ATTR "configDebug"
+#define INTERNAL_DEBUG_ATTR "debug"
 
 DOMConfigurator::DOMConfigurator()
-   : appenderBag(), props(), repository() {
+   : props(), repository() {
 }
 
+
 /**
 Used internally to parse appenders by IDREF name.
 */
-AppenderPtr DOMConfigurator::findAppenderByName(XMLDOMDocumentPtr doc, const 
LogString& appenderName)
-{
-    AppenderPtr appender = ((AppenderMap *)appenderBag)->get(appenderName);
-
-    if (appender != 0)
-        {
-                return appender;
+AppenderPtr DOMConfigurator::findAppenderByName(apr_xml_elem* element, 
+                                                const LogString& appenderName,
+                                                AppenderMap& appenders) {
+    AppenderPtr appender;
+    std::string tagName(element->name);
+    if (tagName == APPENDER_TAG) {
+        if (appenderName == getAttribute(element, NAME_ATTR)) {
+              appender = parseAppender(element, 0, appenders);
+        }
     }
-        else
-        {
-                XMLDOMElementPtr element = doc->getElementById(APPENDER_TAG, 
appenderName);
-
-                if(element == 0)
-                {
-                        LogLog::error(LOG4CXX_STR("No appender named [")+
-                                appenderName+LOG4CXX_STR("] could be found."));
-                        return 0;
-                }
-                else
-                {
-                        appender = parseAppender(element);
-                        ((AppenderMap *)appenderBag)->put(appenderName, 
appender);
-                        return appender;
-                }
+    if (element->first_child && !appender) {
+         appender = findAppenderByName(element->first_child, appenderName, 
appenders);
+    }
+    if (element->next && !appender) {
+        appender = findAppenderByName(element->next, appenderName, appenders);
     }
+    return appender;
 }
 
 /**
  Used internally to parse appenders by IDREF element.
 */
-AppenderPtr DOMConfigurator::findAppenderByReference(XMLDOMElementPtr 
appenderRef)
+AppenderPtr DOMConfigurator::findAppenderByReference(apr_xml_elem* appenderRef,
+                                                     apr_xml_doc* doc,
+                                                     AppenderMap& appenders)
 {
-        LogString appenderName = subst(appenderRef->getAttribute(REF_ATTR));
-        XMLDOMDocumentPtr doc = appenderRef->getOwnerDocument();
-        return findAppenderByName(doc, appenderName);
+        LogString appenderName(subst(getAttribute(appenderRef, REF_ATTR)));
+        AppenderMap::const_iterator match = appenders.find(appenderName);
+        AppenderPtr appender;
+        if (match != appenders.end()) {
+            appender = match->second;
+        } else if (doc) {
+            appender = findAppenderByName(doc->root, appenderName, appenders);
+            if (appender) {
+                appenders.insert(AppenderMap::value_type(appenderName, 
appender));
+            }
+        }
+        if (!appender) {
+                 LogLog::error(LOG4CXX_STR("No appender named [")+
+                                appenderName+LOG4CXX_STR("] could be found."));
+        }
+        return appender;
 }
 
 /**
 Used internally to parse an appender element.
 */
-AppenderPtr DOMConfigurator::parseAppender(XMLDOMElementPtr appenderElement)
+AppenderPtr DOMConfigurator::parseAppender(apr_xml_elem* appenderElement,
+                                           apr_xml_doc* doc,
+                                           AppenderMap& appenders)
 {
-    LogString className = subst(appenderElement->getAttribute(CLASS_ATTR));
-        LogLog::debug(LOG4CXX_STR("Class name: [") + 
className+LOG4CXX_STR("]"));
+
+    LogString className(subst(getAttribute(appenderElement, CLASS_ATTR)));
+    LogLog::debug(LOG4CXX_STR("Class name: [") + className+LOG4CXX_STR("]"));
     try
         {
                 ObjectPtr instance = 
Loader::loadClass(className).newInstance();
                 AppenderPtr appender = instance;
                 PropertySetter propSetter(appender);
 
-                
appender->setName(subst(appenderElement->getAttribute(NAME_ATTR)));
+                appender->setName(subst(getAttribute(appenderElement, 
NAME_ATTR)));
 
-                XMLDOMNodeListPtr children = appenderElement->getChildNodes();
-                int length = children->getLength();
+                for(apr_xml_elem* currentElement = 
appenderElement->first_child;
+                     currentElement;
+                     currentElement = currentElement->next) {
 
-                for (int loop = 0; loop < length; loop++)
-                {
-                        XMLDOMNodePtr currentNode = children->item(loop);
-
-                        /* We're only interested in Elements */
-                        if (currentNode->getNodeType() == 
XMLDOMNode::ELEMENT_NODE)
-                        {
-                                XMLDOMElementPtr currentElement = currentNode;
-                                LogString tagName = 
currentElement->getTagName();
+                                std::string tagName(currentElement->name);
 
                                 // Parse appender parameters
                                 if (tagName == PARAM_TAG)
@@ -218,7 +200,7 @@
                                 }
                                 else if (tagName == ERROR_HANDLER_TAG)
                                 {
-                                        parseErrorHandler(currentElement, 
appender);
+                                        parseErrorHandler(currentElement, 
appender, doc, appenders);
                                 }
                                 else if (tagName == ROLLING_POLICY_TAG)
                                 {
@@ -238,14 +220,14 @@
                                 }
                                 else if (tagName == APPENDER_REF_TAG)
                                 {
-                                        LogString refName = 
subst(currentElement->getAttribute(REF_ATTR));
+                                        LogString refName = 
subst(getAttribute(currentElement, REF_ATTR));
                                         
if(appender->instanceof(AppenderAttachable::getStaticClass()))
                                         {
                                                 AppenderAttachablePtr aa = 
appender;
                                                 
LogLog::debug(LOG4CXX_STR("Attaching appender named [")+
                                                         refName+LOG4CXX_STR("] 
to appender named [")+
                                                         
appender->getName()+LOG4CXX_STR("]."));
-                                                
aa->addAppender(findAppenderByReference(currentElement));
+                                                
aa->addAppender(findAppenderByReference(currentElement, doc, appenders));
                                         }
                                         else
                                         {
@@ -254,9 +236,8 @@
                                                         LOG4CXX_STR("] which 
does not implement AppenderAttachable."));
                                         }
                                 }
-                        }
                 }
-        Pool p;
+                Pool p;
                 propSetter.activate(p);
                 return appender;
     }
@@ -273,10 +254,13 @@
 /**
 Used internally to parse an [EMAIL PROTECTED] ErrorHandler} element.
 */
-void DOMConfigurator::parseErrorHandler(XMLDOMElementPtr element, AppenderPtr 
appender)
+void DOMConfigurator::parseErrorHandler(apr_xml_elem* element, 
+                                        AppenderPtr& appender,
+                                        apr_xml_doc* doc,
+                                        AppenderMap& appenders)
 {
     ErrorHandlerPtr eh = OptionConverter::instantiateByClassName(
-                subst(element->getAttribute(CLASS_ATTR)),
+                subst(getAttribute(element, CLASS_ATTR)),
                 ErrorHandler::getStaticClass(),
                 0);
 
@@ -285,27 +269,22 @@
                 eh->setAppender(appender);
 
                 PropertySetter propSetter(eh);
-                XMLDOMNodeListPtr children = element->getChildNodes();
-                int length = children->getLength();
 
-                for (int loop = 0; loop < length; loop++)
-                {
-                        XMLDOMNodePtr currentNode = children->item(loop);
-                        if (currentNode->getNodeType() == 
XMLDOMNode::ELEMENT_NODE)
-                        {
-                                XMLDOMElementPtr currentElement = currentNode;
-                                LogString tagName = 
currentElement->getTagName();
+                for (apr_xml_elem* currentElement = element->first_child;
+                     currentElement;
+                     currentElement = currentElement->next) {
+                                std::string tagName(currentElement->name);
                                 if(tagName == PARAM_TAG)
                                 {
                                         setParameter(currentElement, 
propSetter);
                                 }
                                 else if(tagName == APPENDER_REF_TAG)
                                 {
-                                        
eh->setBackupAppender(findAppenderByReference(currentElement));
+                                        
eh->setBackupAppender(findAppenderByReference(currentElement, doc, appenders));
                                 }
                                 else if(tagName == LOGGER_REF)
                                 {
-                                        LogString loggerName = 
currentElement->getAttribute(REF_ATTR);
+                                        LogString 
loggerName(getAttribute(currentElement, REF_ATTR));
                                         LoggerPtr logger = 
repository->getLogger(loggerName, loggerFactory);
                                         eh->setLogger(logger);
                                 }
@@ -314,7 +293,6 @@
                                         LoggerPtr root = 
repository->getRootLogger();
                                         eh->setLogger(root);
                                 }
-                        }
                 }
                 Pool p;
                 propSetter.activate(p);
@@ -325,30 +303,25 @@
 /**
  Used internally to parse a filter element.
 */
-void DOMConfigurator::parseFilters(XMLDOMElementPtr element, 
std::vector<log4cxx::spi::FilterPtr>& filters)
+void DOMConfigurator::parseFilters(apr_xml_elem* element, 
std::vector<log4cxx::spi::FilterPtr>& filters)
 {
-        LogString clazz = subst(element->getAttribute(CLASS_ATTR));
+        LogString clazz = subst(getAttribute(element, CLASS_ATTR));
         FilterPtr filter = OptionConverter::instantiateByClassName(clazz,
                 Filter::getStaticClass(), 0);
 
         if(filter != 0)
         {
                 PropertySetter propSetter(filter);
-                XMLDOMNodeListPtr children = element->getChildNodes();
-                int length = children->getLength();
 
-                for (int loop = 0; loop < length; loop++)
+                for (apr_xml_elem* currentElement = element->first_child;
+                     currentElement;
+                     currentElement = currentElement->next)
                 {
-                        XMLDOMNodePtr currentNode = children->item(loop);
-                        if (currentNode->getNodeType() == 
XMLDOMNode::ELEMENT_NODE)
-                        {
-                                XMLDOMElementPtr currentElement = currentNode;
-                                LogString tagName = 
currentElement->getTagName();
+                                std::string tagName(currentElement->name);
                                 if(tagName == PARAM_TAG)
                                 {
                                         setParameter(currentElement, 
propSetter);
                                 }
-                        }
                 }
                 Pool p;
                 propSetter.activate(p);
@@ -359,10 +332,12 @@
 /**
 Used internally to parse an category element.
 */
-void DOMConfigurator::parseLogger(XMLDOMElementPtr loggerElement)
+void DOMConfigurator::parseLogger(apr_xml_elem* loggerElement, 
+                                  apr_xml_doc* doc,
+                                  AppenderMap& appenders)
 {
         // Create a new org.apache.log4j.Category object from the <category> 
element.
-        LogString loggerName = subst(loggerElement->getAttribute(NAME_ATTR));
+        LogString loggerName = subst(getAttribute(loggerElement, NAME_ATTR));
 
         LogLog::debug(LOG4CXX_STR("Retreiving an instance of Logger."));
         LoggerPtr logger = repository->getLogger(loggerName, loggerFactory);
@@ -372,26 +347,25 @@
         // configuration is in progress.
         synchronized sync(logger->getMutex());
         bool additivity = OptionConverter::toBoolean(
-                subst(loggerElement->getAttribute(ADDITIVITY_ATTR)),
+                subst(getAttribute(loggerElement, ADDITIVITY_ATTR)),
                 true);
 
         LogLog::debug(LOG4CXX_STR("Setting 
[")+logger->getName()+LOG4CXX_STR("] additivity to [")+
                 (additivity ? LogString(LOG4CXX_STR("true")) : 
LogString(LOG4CXX_STR("false")))+LOG4CXX_STR("]."));
         logger->setAdditivity(additivity);
-        parseChildrenOfLoggerElement(loggerElement, logger, false);
+        parseChildrenOfLoggerElement(loggerElement, logger, false, doc, 
appenders);
 }
 
 /**
  Used internally to parse the logger factory element.
 */
-void DOMConfigurator::parseLoggerFactory(XMLDOMElementPtr factoryElement)
+void DOMConfigurator::parseLoggerFactory(apr_xml_elem* factoryElement)
 {
-        LogString className = subst(factoryElement->getAttribute(CLASS_ATTR));
+        LogString className(subst(getAttribute(factoryElement, CLASS_ATTR)));
 
         if(className.empty())
         {
-                LogLog::error(LOG4CXX_STR("Logger Factory tag ") + 
LogString(CLASS_ATTR) +
-                        LOG4CXX_STR(" attribute not found."));
+                LogLog::error(LOG4CXX_STR("Logger Factory tag class attribute 
not found."));
                 LogLog::debug(LOG4CXX_STR("No Category Logger configured."));
         }
         else
@@ -403,22 +377,13 @@
                         0);
                 PropertySetter propSetter(loggerFactory);
 
-                XMLDOMElementPtr currentElement = 0;
-                XMLDOMNodePtr currentNode = 0;
-                XMLDOMNodeListPtr children = factoryElement->getChildNodes();
-                int length = children->getLength();
-
-                for (int loop=0; loop < length; loop++)
-                {
-                        currentNode = children->item(loop);
-                        if (currentNode->getNodeType() == 
XMLDOMNode::ELEMENT_NODE)
-                        {
-                                currentElement = currentNode;
-                                if (currentElement->getTagName() == PARAM_TAG)
-                                {
-                                        setParameter(currentElement, 
propSetter);
-                                }
-                        }
+                for (apr_xml_elem* currentElement = 
factoryElement->first_child;
+                     currentElement;
+                     currentElement = currentElement->next) {
+                     std::string tagName(currentElement->name);
+                     if (tagName == PARAM_TAG) {
+                            setParameter(currentElement, propSetter);
+                    }
                 }
         }
 }
@@ -426,19 +391,20 @@
 /**
  Used internally to parse the roor category element.
 */
-void DOMConfigurator::parseRoot(XMLDOMElementPtr rootElement)
+void DOMConfigurator::parseRoot(apr_xml_elem* rootElement, apr_xml_doc* doc, 
AppenderMap& appenders)
 {
         LoggerPtr root = repository->getRootLogger();
         // category configuration needs to be atomic
         synchronized sync(root->getMutex());
-        parseChildrenOfLoggerElement(rootElement, root, true);
+        parseChildrenOfLoggerElement(rootElement, root, true, doc, appenders);
 }
 
 /**
  Used internally to parse the children of a logger element.
 */
 void DOMConfigurator::parseChildrenOfLoggerElement(
-        XMLDOMElementPtr loggerElement, LoggerPtr logger, bool isRoot)
+        apr_xml_elem* loggerElement, LoggerPtr logger, bool isRoot,
+        apr_xml_doc* doc, AppenderMap& appenders)
 {
 
     PropertySetter propSetter(logger);
@@ -448,22 +414,15 @@
     logger->removeAllAppenders();
 
 
-    XMLDOMNodeListPtr children = loggerElement->getChildNodes();
-    int length = children->getLength();
-
-    for (int loop = 0; loop < length; loop++)
-        {
-                XMLDOMNodePtr currentNode = children->item(loop);
-
-                if (currentNode->getNodeType() == XMLDOMNode::ELEMENT_NODE)
-                {
-                        XMLDOMElementPtr currentElement = currentNode;
-                        LogString tagName = currentElement->getTagName();
+    for (apr_xml_elem* currentElement = loggerElement->first_child;
+         currentElement;
+         currentElement = currentElement->next) {
+                        std::string tagName(currentElement->name);
 
                         if (tagName == APPENDER_REF_TAG)
                         {
-                                AppenderPtr appender = 
findAppenderByReference(currentElement);
-                                LogString refName =  
subst(currentElement->getAttribute(REF_ATTR));
+                                AppenderPtr appender = 
findAppenderByReference(currentElement, doc, appenders);
+                                LogString refName =  
subst(getAttribute(currentElement, REF_ATTR));
                                 if(appender != 0)
                                 {
                                         LogLog::debug(LOG4CXX_STR("Adding 
appender named [")+ refName+
@@ -490,7 +449,6 @@
                         {
                                 setParameter(currentElement, propSetter);
                         }
-                }
     }
     Pool p;
     propSetter.activate(p);
@@ -499,9 +457,9 @@
 /**
  Used internally to parse a layout element.
 */
-LayoutPtr DOMConfigurator::parseLayout (XMLDOMElementPtr layout_element)
+LayoutPtr DOMConfigurator::parseLayout (apr_xml_elem* layout_element)
 {
-        LogString className = subst(layout_element->getAttribute(CLASS_ATTR));
+        LogString className(subst(getAttribute(layout_element, CLASS_ATTR)));
         LogLog::debug(LOG4CXX_STR("Parsing layout of class: 
\"")+className+LOG4CXX_STR("\""));
         try
         {
@@ -509,24 +467,17 @@
                 LayoutPtr layout = instance;
                 PropertySetter propSetter(layout);
 
-                XMLDOMNodeListPtr params  = layout_element->getChildNodes();
-                int length    = params->getLength();
-
-                for (int loop = 0; loop < length; loop++)
-                {
-                        XMLDOMNodePtr currentNode = params->item(loop);
-                        if (currentNode->getNodeType() == 
XMLDOMNode::ELEMENT_NODE)
-                        {
-                                XMLDOMElementPtr currentElement = currentNode;
-                                LogString tagName = 
currentElement->getTagName();
+                for(apr_xml_elem* currentElement = layout_element->first_child;
+                    currentElement;
+                    currentElement = currentElement->next) {
+                                std::string tagName(currentElement->name);
                                 if(tagName == PARAM_TAG)
                                 {
                                         setParameter(currentElement, 
propSetter);
                                 }
-                        }
                 }
 
-        Pool p;
+                Pool p;
                 propSetter.activate(p);
                 return layout;
         }
@@ -541,9 +492,9 @@
 /**
  Used internally to parse a triggering policy
 */
-TriggeringPolicyPtr DOMConfigurator::parseTriggeringPolicy (XMLDOMElementPtr 
layout_element)
+TriggeringPolicyPtr DOMConfigurator::parseTriggeringPolicy (apr_xml_elem* 
layout_element)
 {
-        LogString className = subst(layout_element->getAttribute(CLASS_ATTR));
+        LogString className = subst(getAttribute(layout_element, CLASS_ATTR));
         LogLog::debug(LOG4CXX_STR("Parsing triggering policy of class: 
\"")+className+LOG4CXX_STR("\""));
         try
         {
@@ -551,16 +502,10 @@
                 TriggeringPolicyPtr layout = instance;
                 PropertySetter propSetter(layout);
 
-                XMLDOMNodeListPtr params  = layout_element->getChildNodes();
-                int length    = params->getLength();
-
-                for (int loop = 0; loop < length; loop++)
-                {
-                        XMLDOMNodePtr currentNode = params->item(loop);
-                        if (currentNode->getNodeType() == 
XMLDOMNode::ELEMENT_NODE)
-                        {
-                                XMLDOMElementPtr currentElement = currentNode;
-                                LogString tagName = 
currentElement->getTagName();
+                for (apr_xml_elem* currentElement = 
layout_element->first_child;
+                     currentElement;
+                     currentElement = currentElement->next) {
+                                std::string tagName(currentElement->name);
                                 if(tagName == PARAM_TAG)
                                 {
                                         setParameter(currentElement, 
propSetter);
@@ -577,7 +522,6 @@
                                     }
                                   }
                                 }
-                        }
                 }
 
                 Pool p;
@@ -595,9 +539,9 @@
 /**
  Used internally to parse a triggering policy
 */
-RollingPolicyPtr DOMConfigurator::parseRollingPolicy (XMLDOMElementPtr 
layout_element)
+RollingPolicyPtr DOMConfigurator::parseRollingPolicy (apr_xml_elem* 
layout_element)
 {
-        LogString className = subst(layout_element->getAttribute(CLASS_ATTR));
+        LogString className = subst(getAttribute(layout_element, CLASS_ATTR));
         LogLog::debug(LOG4CXX_STR("Parsing rolling policy of class: 
\"")+className+LOG4CXX_STR("\""));
         try
         {
@@ -605,20 +549,13 @@
                 RollingPolicyPtr layout = instance;
                 PropertySetter propSetter(layout);
 
-                XMLDOMNodeListPtr params  = layout_element->getChildNodes();
-                int length    = params->getLength();
-
-                for (int loop = 0; loop < length; loop++)
-                {
-                        XMLDOMNodePtr currentNode = params->item(loop);
-                        if (currentNode->getNodeType() == 
XMLDOMNode::ELEMENT_NODE)
-                        {
-                                XMLDOMElementPtr currentElement = currentNode;
-                                LogString tagName = 
currentElement->getTagName();
+                for(apr_xml_elem* currentElement = layout_element->first_child;
+                    currentElement;
+                    currentElement = currentElement->next) {
+                                std::string tagName(currentElement->name);
                                 if(tagName == PARAM_TAG)
                                 {
                                         setParameter(currentElement, 
propSetter);
-                                }
                         }
                 }
 
@@ -639,7 +576,7 @@
 /**
  Used internally to parse a level  element.
 */
-void DOMConfigurator::parseLevel(XMLDOMElementPtr element, LoggerPtr logger, 
bool isRoot)
+void DOMConfigurator::parseLevel(apr_xml_elem* element, LoggerPtr logger, bool 
isRoot)
 {
     LogString loggerName = logger->getName();
     if(isRoot)
@@ -647,7 +584,7 @@
                 loggerName = LOG4CXX_STR("root");
     }
 
-    LogString levelStr = subst(element->getAttribute(VALUE_ATTR));
+    LogString levelStr(subst(getAttribute(element, VALUE_ATTR)));
         LogLog::debug(LOG4CXX_STR("Level value for ")+loggerName+LOG4CXX_STR(" 
is [")+levelStr+LOG4CXX_STR("]."));
 
     if (StringHelper::equalsIgnoreCase(levelStr,LOG4CXX_STR("INHERITED"), 
LOG4CXX_STR("inherited"))
@@ -664,7 +601,7 @@
     }
         else
         {
-                LogString className = subst(element->getAttribute(CLASS_ATTR));
+                LogString className(subst(getAttribute(element, CLASS_ATTR)));
 
                 if (className.empty())
                 {
@@ -704,10 +641,10 @@
                 logger->getEffectiveLevel()->toString());
 }
 
-void DOMConfigurator::setParameter(XMLDOMElementPtr elem, PropertySetter& 
propSetter)
+void DOMConfigurator::setParameter(apr_xml_elem* elem, PropertySetter& 
propSetter)
 {
-        LogString name = subst(elem->getAttribute(NAME_ATTR));
-        LogString value = elem->getAttribute(VALUE_ATTR);
+        LogString name(subst(getAttribute(elem, NAME_ATTR)));
+        LogString value(subst(getAttribute(elem, VALUE_ATTR)));
         Pool p;
         value = subst(value);
         propSetter.setProperty(name, value, p);
@@ -717,32 +654,44 @@
 {
        repository->setConfigured(true);
         this->repository = repository;
-        std::basic_ostringstream<logchar> os(LOG4CXX_STR("DOMConfigurator 
configuring file "));
-        os << filename.getName() << LOG4CXX_STR("...");
-        LogLog::debug(os.str());
+        LogString msg(LOG4CXX_STR("DOMConfigurator configuring file "));
+        msg.append(filename.getName());
+        msg.append(LOG4CXX_STR("..."));
+        LogLog::debug(msg);
 
-        appenderBag = new AppenderMap();
         loggerFactory = new DefaultCategoryFactory();
 
-        try
-        {
-#ifdef _WIN32
-                XMLDOMDocumentPtr doc = new MsXMLDOMDocument();
-#else
-                XMLDOMDocumentPtr doc = new GnomeXMLDOMDocument();
-#endif
-                doc->load(filename);
-                parse(doc->getDocumentElement());
-    }
-        catch (Exception& e)
-        {
-                // I know this is miserable..
-        std::basic_ostringstream<logchar> os(LOG4CXX_STR("Could not parse 
input source ["));
-        os << filename.getName() << LOG4CXX_STR("].");
-                LogLog::error(os.str(), e);
-    }
+        Pool p;
+        apr_file_t *fd;
 
-        delete (AppenderMap *)appenderBag;
+        log4cxx_status_t rv = filename.open(&fd, APR_READ, APR_OS_DEFAULT, p);
+        if (rv != APR_SUCCESS) {
+            LogString msg(LOG4CXX_STR("Could not open file ["));
+            msg.append(filename.getName());
+            msg.append(LOG4CXX_STR("]."));
+            LogLog::error(msg);
+        } else {
+            apr_xml_parser *parser;
+            apr_xml_doc *doc;
+            rv = apr_xml_parse_file((apr_pool_t*) p.getAPRPool(), &parser, 
&doc, fd, 2000);
+            if (rv != APR_SUCCESS) {
+                char errbuf[2000];
+                char errbufXML[2000];
+                LogString msg(LOG4CXX_STR("Error parsing file ["));
+                msg.append(filename.getName());
+                msg.append(LOG4CXX_STR("], "));
+                apr_strerror(rv, errbuf, sizeof(errbuf));
+                LOG4CXX_DECODE_CHAR(lerrbuf, errbuf);
+                apr_xml_parser_geterror(parser, errbufXML, sizeof(errbufXML));
+                LOG4CXX_DECODE_CHAR(lerrbufXML, errbufXML);
+                msg.append(lerrbuf);
+                msg.append(lerrbufXML);
+                LogLog::error(msg);
+            } else {
+                AppenderMap appenders;
+                parse(doc->root, doc, appenders);
+            }
+        }
 }
 
 void DOMConfigurator::configure(const std::string& filename)
@@ -780,7 +729,6 @@
         xdog->setDelay(delay);
         xdog->start();
 }
-
 #if LOG4CXX_HAS_WCHAR_T
 void DOMConfigurator::configureAndWatch(const std::wstring& filename, long 
delay)
 {
@@ -797,9 +745,11 @@
  href="doc-files/log4j.dtd">log4j.dtd</a>.
 
 */
-void DOMConfigurator::parse(XMLDOMElementPtr element)
+void DOMConfigurator::parse(apr_xml_elem* element,
+                            apr_xml_doc* doc,
+                            AppenderMap& appenders)
 {
-    LogString rootElementName = element->getTagName();
+    std::string rootElementName(element->name);
 
     if (rootElementName != CONFIGURATION_TAG)
         {
@@ -812,13 +762,12 @@
                 }
                 else
                 {
-                        LogLog::error(LOG4CXX_STR("DOM element is - not a <")+
-                                LogString(CONFIGURATION_TAG)+LOG4CXX_STR("> 
element."));
+                        LogLog::error(LOG4CXX_STR("DOM element is - not a 
<configuration> element."));
                         return;
                 }
     }
 
-    LogString debugAttrib = subst(element->getAttribute(INTERNAL_DEBUG_ATTR));
+    LogString debugAttrib = subst(getAttribute(element, INTERNAL_DEBUG_ATTR));
 
     static const LogString NuLL(LOG4CXX_STR("NULL"));
     LogLog::debug(LOG4CXX_STR("debug attribute= \"") + debugAttrib 
+LOG4CXX_STR("\"."));
@@ -830,67 +779,50 @@
     }
         else
         {
-                LogLog::debug(LOG4CXX_STR("Ignoring ") + 
LogString(INTERNAL_DEBUG_ATTR)
-                        + LOG4CXX_STR(" attribute."));
+                LogLog::debug(LOG4CXX_STR("Ignoring internalDebug 
attribute."));
     }
 
 
-    LogString confDebug = subst(element->getAttribute(CONFIG_DEBUG_ATTR));
+    LogString confDebug = subst(getAttribute(element, CONFIG_DEBUG_ATTR));
     if(!confDebug.empty() && confDebug != NuLL)
         {
-                LogLog::warn(LOG4CXX_STR("The 
\"")+LogString(CONFIG_DEBUG_ATTR)+
-                        LOG4CXX_STR("\" attribute is deprecated."));
-                LogLog::warn(LOG4CXX_STR("Use the 
\"")+LogString(INTERNAL_DEBUG_ATTR)+
-                        LOG4CXX_STR("\" attribute instead."));
+                LogLog::warn(LOG4CXX_STR("The \"configDebug\" attribute is 
deprecated."));
+                LogLog::warn(LOG4CXX_STR("Use the \"internalDebug\" attribute 
instead."));
                 
LogLog::setInternalDebugging(OptionConverter::toBoolean(confDebug, true));
     }
 
-    LogString thresholdStr = subst(element->getAttribute(THRESHOLD_ATTR));
+    LogString thresholdStr = subst(getAttribute(element, THRESHOLD_ATTR));
     LogLog::debug(LOG4CXX_STR("Threshold =\"") + thresholdStr 
+LOG4CXX_STR("\"."));
     if(!thresholdStr.empty() && thresholdStr != NuLL)
         {
                 repository->setThreshold(thresholdStr);
     }
 
-    LogString tagName;
-    XMLDOMElementPtr currentElement;
-    XMLDOMNodePtr currentNode;
-    XMLDOMNodeListPtr children = element->getChildNodes();
-    int length = children->getLength();
-        int loop;
-
-    for (loop = 0; loop < length; loop++)
-        {
-                currentNode = children->item(loop);
-                if (currentNode->getNodeType() == XMLDOMNode::ELEMENT_NODE)
-                {
-                        currentElement = currentNode;
-                        tagName = currentElement->getTagName();
+    apr_xml_elem* currentElement;
+    for(currentElement = element->first_child;
+        currentElement;
+        currentElement = currentElement->next) {
+                        std::string tagName(currentElement->name);
 
                         if (tagName == CATEGORY_FACTORY_TAG)
                         {
                                 parseLoggerFactory(currentElement);
                         }
-                }
     }
 
-    for (loop = 0; loop < length; loop++)
-        {
-                currentNode = children->item(loop);
-                if (currentNode->getNodeType() == XMLDOMNode::ELEMENT_NODE)
-                {
-                        currentElement =  currentNode;
-                        tagName = currentElement->getTagName();
+    for(currentElement = element->first_child;
+        currentElement;
+        currentElement = currentElement->next) {
+                        std::string tagName(currentElement->name);
 
                         if (tagName == CATEGORY || tagName == LOGGER)
                         {
-                                parseLogger(currentElement);
+                                parseLogger(currentElement, doc, appenders);
                         }
                         else if (tagName == ROOT_TAG)
                         {
-                                parseRoot(currentElement);
+                                parseRoot(currentElement, doc, appenders);
                         }
-                }
     }
 }
 
@@ -907,4 +839,17 @@
     }
 }
 
-#endif // LOG4CXX_HAVE_XML
+
+LogString DOMConfigurator::getAttribute(apr_xml_elem* element, 
+                                        const std::string& attrName) {
+    LogString attrValue;
+    for(apr_xml_attr* attr = element->attr;
+        attr;
+        attr = attr->next) {
+        if (attrName == attr->name) {
+            ByteBuffer buf((char*) attr->value, strlen(attr->value));
+            CharsetDecoder::getUTF8Decoder()->decode(buf, attrValue);
+        }
+    }
+    return attrValue;
+}

Modified: logging/log4cxx/trunk/src/optionconverter.cpp
URL: 
http://svn.apache.org/viewcvs/logging/log4cxx/trunk/src/optionconverter.cpp?rev=383802&r1=383801&r2=383802&view=diff
==============================================================================
--- logging/log4cxx/trunk/src/optionconverter.cpp (original)
+++ logging/log4cxx/trunk/src/optionconverter.cpp Mon Mar  6 22:51:03 2006
@@ -362,7 +362,6 @@
         LogString clazz = _clazz;
 
         LogString filename(configFileName.getName());
-#ifdef LOG4CXX_HAVE_XML
         if(clazz.empty() 
                 && filename.length() > 4
                 && StringHelper::equalsIgnoreCase(
@@ -371,7 +370,6 @@
         {
             clazz = log4cxx::xml::DOMConfigurator::getStaticClass().toString();
         }
-#endif
 
         if(!clazz.empty())
         {

Modified: logging/log4cxx/trunk/tests/src/customlogger/xloggertestcase.cpp
URL: 
http://svn.apache.org/viewcvs/logging/log4cxx/trunk/tests/src/customlogger/xloggertestcase.cpp?rev=383802&r1=383801&r2=383802&view=diff
==============================================================================
--- logging/log4cxx/trunk/tests/src/customlogger/xloggertestcase.cpp (original)
+++ logging/log4cxx/trunk/tests/src/customlogger/xloggertestcase.cpp Mon Mar  6 
22:51:03 2006
@@ -17,7 +17,6 @@
 #define LOG4CXX_TEST 1
 #include <log4cxx/private/log4cxx_private.h>
 
-#ifdef LOG4CXX_HAVE_XML
 
 #include <cppunit/TestFixture.h>
 #include <cppunit/extensions/HelperMacros.h>
@@ -101,4 +100,3 @@
 
 CPPUNIT_TEST_SUITE_REGISTRATION(XLoggerTestCase);
 
-#endif //HAVE_XML

Modified: logging/log4cxx/trunk/tests/src/defaultinit/testcase2.cpp
URL: 
http://svn.apache.org/viewcvs/logging/log4cxx/trunk/tests/src/defaultinit/testcase2.cpp?rev=383802&r1=383801&r2=383802&view=diff
==============================================================================
--- logging/log4cxx/trunk/tests/src/defaultinit/testcase2.cpp (original)
+++ logging/log4cxx/trunk/tests/src/defaultinit/testcase2.cpp Mon Mar  6 
22:51:03 2006
@@ -17,7 +17,6 @@
 #define LOG4CXX_TEST 1
 #include <log4cxx/private/log4cxx_private.h>
 
-#ifdef LOG4CXX_HAVE_XML
 
 #include <cppunit/TestFixture.h>
 #include <cppunit/extensions/HelperMacros.h>
@@ -63,4 +62,3 @@
 }
 
 
-#endif //LOG4CXX_HAVE_XML

Modified: logging/log4cxx/trunk/tests/src/defaultinit/testcase4.cpp
URL: 
http://svn.apache.org/viewcvs/logging/log4cxx/trunk/tests/src/defaultinit/testcase4.cpp?rev=383802&r1=383801&r2=383802&view=diff
==============================================================================
--- logging/log4cxx/trunk/tests/src/defaultinit/testcase4.cpp (original)
+++ logging/log4cxx/trunk/tests/src/defaultinit/testcase4.cpp Mon Mar  6 
22:51:03 2006
@@ -17,7 +17,6 @@
 #define LOG4CXX_TEST 1
 #include <log4cxx/private/log4cxx_private.h>
 
-#ifdef LOG4CXX_HAVE_XML
 
 #include <cppunit/TestFixture.h>
 #include <cppunit/extensions/HelperMacros.h>
@@ -63,4 +62,3 @@
    return TestCase4::suite();
 }
 
-#endif //LOG4CXX_HAVE_XML

Modified: logging/log4cxx/trunk/tests/src/main.cpp
URL: 
http://svn.apache.org/viewcvs/logging/log4cxx/trunk/tests/src/main.cpp?rev=383802&r1=383801&r2=383802&view=diff
==============================================================================
--- logging/log4cxx/trunk/tests/src/main.cpp (original)
+++ logging/log4cxx/trunk/tests/src/main.cpp Mon Mar  6 22:51:03 2006
@@ -43,10 +43,8 @@
 extern CPPUNIT_NS::Test* createTestCase1();
 extern CPPUNIT_NS::Test* createTestCase3();
 
-#if LOG4CXX_HAVE_XML
 extern CPPUNIT_NS::Test* createTestCase2();
 extern CPPUNIT_NS::Test* createTestCase4();
-#endif
 
 //
 //  initializing a logger will cause the APR used by log4cxx library to be 
initialized
@@ -90,14 +88,12 @@
                      case '3':
                         runner.addTest(createTestCase3());
                         break;
-#if LOG4CXX_HAVE_XML
                      case '2':
                         runner.addTest(createTestCase2());
                         break;
                      case '4':
                         runner.addTest(createTestCase4());
                         break;
-#endif
                      default:
                         break;
                   }

Modified: logging/log4cxx/trunk/tests/src/varia/errorhandlertestcase.cpp
URL: 
http://svn.apache.org/viewcvs/logging/log4cxx/trunk/tests/src/varia/errorhandlertestcase.cpp?rev=383802&r1=383801&r2=383802&view=diff
==============================================================================
--- logging/log4cxx/trunk/tests/src/varia/errorhandlertestcase.cpp (original)
+++ logging/log4cxx/trunk/tests/src/varia/errorhandlertestcase.cpp Mon Mar  6 
22:51:03 2006
@@ -17,7 +17,6 @@
 #define LOG4CXX_TEST 1
 #include <log4cxx/private/log4cxx_private.h>
 
-#ifdef LOG4CXX_HAVE_XML
 
 #include <cppunit/TestFixture.h>
 #include <cppunit/extensions/HelperMacros.h>
@@ -139,5 +138,3 @@
 const File ErrorHandlerTestCase::TEMP("output/temp");
 const File ErrorHandlerTestCase::FILTERED("output/filtered");
 
-
-#endif //HAVE_XML

Modified: logging/log4cxx/trunk/tests/src/xml/customleveltestcase.cpp
URL: 
http://svn.apache.org/viewcvs/logging/log4cxx/trunk/tests/src/xml/customleveltestcase.cpp?rev=383802&r1=383801&r2=383802&view=diff
==============================================================================
--- logging/log4cxx/trunk/tests/src/xml/customleveltestcase.cpp (original)
+++ logging/log4cxx/trunk/tests/src/xml/customleveltestcase.cpp Mon Mar  6 
22:51:03 2006
@@ -18,7 +18,6 @@
 #include <log4cxx/private/log4cxx_private.h>
 
 
-#ifdef LOG4CXX_HAVE_XML
 
 #include <cppunit/TestFixture.h>
 #include <cppunit/extensions/HelperMacros.h>
@@ -125,5 +124,3 @@
 
 const File CustomLevelTestCase::TEMP("output/temp");
 
-
-#endif //HAVE_XML

Modified: logging/log4cxx/trunk/tests/src/xml/domtestcase.cpp
URL: 
http://svn.apache.org/viewcvs/logging/log4cxx/trunk/tests/src/xml/domtestcase.cpp?rev=383802&r1=383801&r2=383802&view=diff
==============================================================================
--- logging/log4cxx/trunk/tests/src/xml/domtestcase.cpp (original)
+++ logging/log4cxx/trunk/tests/src/xml/domtestcase.cpp Mon Mar  6 22:51:03 2006
@@ -14,7 +14,6 @@
  * limitations under the License.
  */
 
-#ifdef HAVE_XML
 
 #include <cppunit/TestFixture.h>
 #include <cppunit/extensions/HelperMacros.h>
@@ -202,5 +201,3 @@
 const File 
DOMTestCase::FILTERED_A1_2(LOG4CXX_TEST_STR("output/filtered.A1.2"));
 const File 
DOMTestCase::FILTERED_A2_2(LOG4CXX_TEST_STR("output/filtered.A2.2"));
 
-
-#endif //HAVE_XML


Reply via email to