carnold     2005/01/11 21:12:16

  Modified:    src      domconfigurator.cpp gnomexml.cpp
                        simpledateformat.cpp
  Log:
  DOMConfigurtor restoration: Linux pass
  
  Revision  Changes    Path
  1.20      +752 -752  logging-log4cxx/src/domconfigurator.cpp
  
  Index: domconfigurator.cpp
  ===================================================================
  RCS file: /home/cvs/logging-log4cxx/src/domconfigurator.cpp,v
  retrieving revision 1.19
  retrieving revision 1.20
  diff -u -r1.19 -r1.20
  --- domconfigurator.cpp       12 Jan 2005 04:37:12 -0000      1.19
  +++ domconfigurator.cpp       12 Jan 2005 05:12:16 -0000      1.20
  @@ -1,786 +1,786 @@
  -/*
  - * Copyright 2003-2005 The Apache Software Foundation.
  - *
  - * Licensed 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.
  - */
  -
  -#include <log4cxx/portability.h>
  -
  -#ifdef LOG4CXX_HAVE_XML
  +/*
  + * Copyright 2003-2005 The Apache Software Foundation.
  + *
  + * Licensed 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.
  + */
  +
  +#include <log4cxx/portability.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>
  -#include <log4cxx/appender.h>
  -#include <log4cxx/layout.h>
  -#include <log4cxx/logger.h>
  -#include <log4cxx/logmanager.h>
  -#include <log4cxx/level.h>
  -#include <log4cxx/spi/filter.h>
  -#include <log4cxx/helpers/loglog.h>
  -#include <log4cxx/helpers/stringhelper.h>
  -#include <log4cxx/helpers/loader.h>
  -#include <log4cxx/helpers/optionconverter.h>
  -#include <log4cxx/config/propertysetter.h>
  -#include <log4cxx/spi/errorhandler.h>
  -#include <log4cxx/spi/loggerfactory.h>
  -#include <log4cxx/defaultcategoryfactory.h>
  -#include <log4cxx/helpers/filewatchdog.h>
  +#else
  +#include <log4cxx/helpers/gnomexml.h>
  +#endif
  +
  +
  +#include <log4cxx/xml/domconfigurator.h>
  +#include <log4cxx/appender.h>
  +#include <log4cxx/layout.h>
  +#include <log4cxx/logger.h>
  +#include <log4cxx/logmanager.h>
  +#include <log4cxx/level.h>
  +#include <log4cxx/spi/filter.h>
  +#include <log4cxx/helpers/loglog.h>
  +#include <log4cxx/helpers/stringhelper.h>
  +#include <log4cxx/helpers/loader.h>
  +#include <log4cxx/helpers/optionconverter.h>
  +#include <log4cxx/config/propertysetter.h>
  +#include <log4cxx/spi/errorhandler.h>
  +#include <log4cxx/spi/loggerfactory.h>
  +#include <log4cxx/defaultcategoryfactory.h>
  +#include <log4cxx/helpers/filewatchdog.h>
   #include <log4cxx/helpers/synchronized.h>
  -#include <log4cxx/spi/loggerrepository.h>
  +#include <log4cxx/spi/loggerrepository.h>
   #include <log4cxx/spi/loggingevent.h>
   #include <log4cxx/helpers/pool.h>
   #include <sstream>
  -#include <log4cxx/helpers/transcoder.h>
  -
  -using namespace log4cxx;
  -using namespace log4cxx::xml;
  -using namespace log4cxx::helpers;
  -using namespace log4cxx::spi;
  -using namespace log4cxx::config;
  -
  -class XMLWatchdog  : public FileWatchdog
  -{
  -public:
  -     XMLWatchdog(const LogString& filename) : FileWatchdog(filename)
  -     {
  -     }
  -
  -     /**
  -     Call DOMConfigurator#doConfigure with the
  -     <code>filename</code> to reconfigure log4cxx.
  -     */
  -     void doOnChange()
  -     {
  -             DOMConfigurator().doConfigure(file,
  -                     LogManager::getLoggerRepository());
  -     }
  -};
  -
  -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 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")
  -
  -DOMConfigurator::DOMConfigurator()
  -   : appenderBag(), 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;
  -    }
  -     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;
  -             }
  -    }
  -}
  -
  -/**
  - Used internally to parse appenders by IDREF element.
  -*/
  -AppenderPtr DOMConfigurator::findAppenderByReference(XMLDOMElementPtr 
appenderRef)
  -{
  -     LogString appenderName = subst(appenderRef->getAttribute(REF_ATTR));
  -     XMLDOMDocumentPtr doc = appenderRef->getOwnerDocument();
  -     return findAppenderByName(doc, appenderName);
  -}
  -
  -/**
  -Used internally to parse an appender element.
  -*/
  -AppenderPtr DOMConfigurator::parseAppender(XMLDOMElementPtr appenderElement)
  -{
  -    LogString className = subst(appenderElement->getAttribute(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)));
  -
  -             XMLDOMNodeListPtr children = appenderElement->getChildNodes();
  -             int length = children->getLength();
  -
  -             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();
  -
  -                             // Parse appender parameters
  -                             if (tagName == PARAM_TAG)
  -                             {
  -                                     setParameter(currentElement, 
propSetter);
  -                             }
  -                             // Set appender layout
  -                             else if (tagName == LAYOUT_TAG)
  -                             {
  -                                     
appender->setLayout(parseLayout(currentElement));
  -                             }
  -                             // Add filters
  -                             else if (tagName == FILTER_TAG)
  -                             {
  -                                     parseFilters(currentElement, appender);
  -                             }
  -                             else if (tagName == ERROR_HANDLER_TAG)
  -                             {
  -                                     parseErrorHandler(currentElement, 
appender);
  -                             }
  -                             else if (tagName == APPENDER_REF_TAG)
  -                             {
  -                                     LogString refName = 
subst(currentElement->getAttribute(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));
  -                                     }
  -                                     else
  -                                     {
  -                                             
LogLog::error(LOG4CXX_STR("Requesting attachment of appender named [")+
  -                                                     refName+ LOG4CXX_STR("] 
to appender named [")+ appender->getName()+
  -                                                     LOG4CXX_STR("] which 
does not implement AppenderAttachable."));
  -                                     }
  -                             }
  -                     }
  -             }
  -        Pool p;
  -             propSetter.activate(p);
  -             return appender;
  -    }
  -    /* Yes, it's ugly.  But all of these exceptions point to the same
  -     problem: we can't create an Appender */
  -    catch (Exception& oops)
  -     {
  -             LogLog::error(LOG4CXX_STR("Could not create an Appender. 
Reported error follows."),
  -                     oops);
  -             return 0;
  -    }
  -}
  -
  -/**
  -Used internally to parse an [EMAIL PROTECTED] ErrorHandler} element.
  -*/
  -void DOMConfigurator::parseErrorHandler(XMLDOMElementPtr element, 
AppenderPtr appender)
  -{
  -    ErrorHandlerPtr eh = OptionConverter::instantiateByClassName(
  -             subst(element->getAttribute(CLASS_ATTR)),
  -             ErrorHandler::getStaticClass(),
  -             0);
  -
  -    if(eh != 0)
  -     {
  -             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();
  -                             if(tagName == PARAM_TAG)
  -                             {
  -                                     setParameter(currentElement, 
propSetter);
  -                             }
  -                             else if(tagName == APPENDER_REF_TAG)
  -                             {
  -                                     
eh->setBackupAppender(findAppenderByReference(currentElement));
  -                             }
  -                             else if(tagName == LOGGER_REF)
  -                             {
  -                                     LogString loggerName = 
currentElement->getAttribute(REF_ATTR);
  -                                     LoggerPtr logger = 
repository->getLogger(loggerName, loggerFactory);
  -                                     eh->setLogger(logger);
  -                             }
  -                             else if(tagName == ROOT_REF)
  -                             {
  -                                     LoggerPtr root = 
repository->getRootLogger();
  -                                     eh->setLogger(root);
  -                             }
  -                     }
  -             }
  -        Pool p;
  -             propSetter.activate(p);
  -             appender->setErrorHandler(eh);
  -    }
  -}
  -
  -/**
  - Used internally to parse a filter element.
  -*/
  -void DOMConfigurator::parseFilters(XMLDOMElementPtr element, AppenderPtr 
appender)
  -{
  -     LogString clazz = subst(element->getAttribute(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++)
  -             {
  -                     XMLDOMNodePtr currentNode = children->item(loop);
  -                     if (currentNode->getNodeType() == 
XMLDOMNode::ELEMENT_NODE)
  -                     {
  -                             XMLDOMElementPtr currentElement = currentNode;
  -                             LogString tagName = 
currentElement->getTagName();
  -                             if(tagName == PARAM_TAG)
  -                             {
  -                                     setParameter(currentElement, 
propSetter);
  -                             }
  -                     }
  -             }
  -        Pool p;
  -             propSetter.activate(p);
  -             LogLog::debug(LOG4CXX_STR("Adding filter of type 
[")+filter->getClass().toString()
  -                     +LOG4CXX_STR("] to appender named 
[")+appender->getName()+LOG4CXX_STR("]."));
  -             appender->addFilter(filter);
  -     }
  -}
  -
  -/**
  -Used internally to parse an category element.
  -*/
  -void DOMConfigurator::parseLogger(XMLDOMElementPtr loggerElement)
  -{
  -     // Create a new org.apache.log4j.Category object from the <category> 
element.
  -     LogString loggerName = subst(loggerElement->getAttribute(NAME_ATTR));
  -
  -     LogLog::debug(LOG4CXX_STR("Retreiving an instance of Logger."));
  -     LoggerPtr logger = repository->getLogger(loggerName, loggerFactory);
  -
  -     // Setting up a category needs to be an atomic operation, in order
  -     // to protect potential log operations while category
  -     // configuration is in progress.
  -     synchronized sync(logger->getMutex());
  -     bool additivity = OptionConverter::toBoolean(
  -             subst(loggerElement->getAttribute(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);
  -}
  -
  -/**
  - Used internally to parse the logger factory element.
  -*/
  -void DOMConfigurator::parseLoggerFactory(XMLDOMElementPtr factoryElement)
  -{
  -     LogString className = subst(factoryElement->getAttribute(CLASS_ATTR));
  -
  -     if(className.empty())
  -     {
  -             LogLog::error(LOG4CXX_STR("Logger Factory tag ") + 
LogString(CLASS_ATTR) +
  -                     LOG4CXX_STR(" attribute not found."));
  -             LogLog::debug(LOG4CXX_STR("No Category Logger configured."));
  -     }
  -     else
  -     {
  -             LogLog::debug(LOG4CXX_STR("Desired logger factory: 
[")+className+LOG4CXX_STR("]"));
  -             loggerFactory = OptionConverter::instantiateByClassName(
  -                     className,
  -                     LoggerFactory::getStaticClass(),
  -                     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);
  -                             }
  -                     }
  -             }
  -     }
  -}
  -
  -/**
  - Used internally to parse the roor category element.
  -*/
  -void DOMConfigurator::parseRoot(XMLDOMElementPtr rootElement)
  -{
  -     LoggerPtr root = repository->getRootLogger();
  -     // category configuration needs to be atomic
  -     synchronized sync(root->getMutex());
  -     parseChildrenOfLoggerElement(rootElement, root, true);
  -}
  -
  -/**
  - Used internally to parse the children of a logger element.
  -*/
  -void DOMConfigurator::parseChildrenOfLoggerElement(
  -     XMLDOMElementPtr loggerElement, LoggerPtr logger, bool isRoot)
  -{
  -
  -    PropertySetter propSetter(logger);
  -
  -    // Remove all existing appenders from logger. They will be
  -    // reconstructed if need be.
  -    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();
  -
  -                     if (tagName == APPENDER_REF_TAG)
  -                     {
  -                             AppenderPtr appender = 
findAppenderByReference(currentElement);
  -                             LogString refName =  
subst(currentElement->getAttribute(REF_ATTR));
  -                             if(appender != 0)
  -                             {
  -                                     LogLog::debug(LOG4CXX_STR("Adding 
appender named [")+ refName+
  -                                     LOG4CXX_STR("] to logger 
[")+logger->getName()+LOG4CXX_STR("]."));
  -                             }
  -                             else
  -                             {
  -                                     LogLog::debug(LOG4CXX_STR("Appender 
named [")+ refName +
  -                                             LOG4CXX_STR("] not found."));
  -                             }
  -
  -                             logger->addAppender(appender);
  -
  -                     }
  -                     else if(tagName == LEVEL_TAG)
  -                     {
  -                             parseLevel(currentElement, logger, isRoot);
  -                     }
  -                     else if(tagName == PRIORITY_TAG)
  -                     {
  -                             parseLevel(currentElement, logger, isRoot);
  -                     }
  -                     else if(tagName == PARAM_TAG)
  -                     {
  -                             setParameter(currentElement, propSetter);
  -                     }
  -             }
  -    }
  -    Pool p;
  -    propSetter.activate(p);
  -}
  -
  -/**
  - Used internally to parse a layout element.
  -*/
  -LayoutPtr DOMConfigurator::parseLayout (XMLDOMElementPtr layout_element)
  -{
  -     LogString className = subst(layout_element->getAttribute(CLASS_ATTR));
  -     LogLog::debug(LOG4CXX_STR("Parsing layout of class: 
\"")+className+LOG4CXX_STR("\""));
  -     try
  -     {
  -             ObjectPtr instance = Loader::loadClass(className).newInstance();
  -             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();
  -                             if(tagName == PARAM_TAG)
  -                             {
  -                                     setParameter(currentElement, 
propSetter);
  -                             }
  -                     }
  -             }
  -
  -        Pool p;
  -             propSetter.activate(p);
  -             return layout;
  -     }
  -     catch (Exception& oops)
  -     {
  -             LogLog::error(LOG4CXX_STR("Could not create the Layout. 
Reported error follows."),
  -                     oops);
  -             return 0;
  -     }
  -}
  -
  -/**
  - Used internally to parse a level  element.
  -*/
  -void DOMConfigurator::parseLevel(XMLDOMElementPtr element, LoggerPtr logger, 
bool isRoot)
  -{
  -    LogString loggerName = logger->getName();
  -    if(isRoot)
  -     {
  -             loggerName = LOG4CXX_STR("root");
  -    }
  -
  -    LogString levelStr = subst(element->getAttribute(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")) 
  -        || StringHelper::equalsIgnoreCase(levelStr, LOG4CXX_STR("NULL"), 
LOG4CXX_STR("null")))
  -     {
  -             if(isRoot)
  -             {
  -                     LogLog::error(LOG4CXX_STR("Root level cannot be 
inherited. Ignoring directive."));
  -             }
  -             else
  -             {
  -                     logger->setLevel(0);
  -             }
  -    }
  -     else
  -     {
  -             LogString className = subst(element->getAttribute(CLASS_ATTR));
  -
  -             if (className.empty())
  -             {
  -                     logger->setLevel(OptionConverter::toLevel(levelStr, 
Level::getDebug()));
  -             }
  -             else
  -             {
  -                     LogLog::debug(LOG4CXX_STR("Desired Level sub-class: [") 
+ className + LOG4CXX_STR("]"));
  -
  -                     try
  -                     {
  -                             Level::LevelClass& levelClass =
  -                                     
(Level::LevelClass&)Loader::loadClass(className);
  -                             LevelPtr level = levelClass.toLevel(levelStr);
  -                             logger->setLevel(level);
  -                     }
  -                     catch (Exception& oops)
  -                     {
  -                             LogLog::error(
  -                                     LOG4CXX_STR("Could not create level [") 
+ levelStr +
  -                                     LOG4CXX_STR("]. Reported error 
follows."),
  -                                     oops);
  -
  -                             return;
  -                     }
  -                     catch (...)
  -                     {
  -                             LogLog::error(
  -                                     LOG4CXX_STR("Could not create level [") 
+ levelStr);
  -
  -                             return;
  -                     }
  -             }
  -    }
  -
  -     LogLog::debug(loggerName + LOG4CXX_STR(" level set to ") +
  -             logger->getEffectiveLevel()->toString());
  -}
  -
  -void DOMConfigurator::setParameter(XMLDOMElementPtr elem, PropertySetter& 
propSetter)
  -{
  -     LogString name = subst(elem->getAttribute(NAME_ATTR));
  -     LogString value = elem->getAttribute(VALUE_ATTR);
  -    Pool p;
  -     value = subst(OptionConverter::convertSpecialChars(value));     
propSetter.setProperty(name, value, p);
  -}
  -
  -void DOMConfigurator::doConfigure(const File& filename, 
spi::LoggerRepositoryPtr& repository)
  -{
  -     this->repository = repository;
  +#include <log4cxx/helpers/transcoder.h>
  +
  +using namespace log4cxx;
  +using namespace log4cxx::xml;
  +using namespace log4cxx::helpers;
  +using namespace log4cxx::spi;
  +using namespace log4cxx::config;
  +
  +class XMLWatchdog  : public FileWatchdog
  +{
  +public:
  +        XMLWatchdog(const LogString& filename) : FileWatchdog(filename)
  +        {
  +        }
  +
  +        /**
  +        Call DOMConfigurator#doConfigure with the
  +        <code>filename</code> to reconfigure log4cxx.
  +        */
  +        void doOnChange()
  +        {
  +                DOMConfigurator().doConfigure(file,
  +                        LogManager::getLoggerRepository());
  +        }
  +};
  +
  +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 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")
  +
  +DOMConfigurator::DOMConfigurator()
  +   : appenderBag(), 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;
  +    }
  +        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;
  +                }
  +    }
  +}
  +
  +/**
  + Used internally to parse appenders by IDREF element.
  +*/
  +AppenderPtr DOMConfigurator::findAppenderByReference(XMLDOMElementPtr 
appenderRef)
  +{
  +        LogString appenderName = subst(appenderRef->getAttribute(REF_ATTR));
  +        XMLDOMDocumentPtr doc = appenderRef->getOwnerDocument();
  +        return findAppenderByName(doc, appenderName);
  +}
  +
  +/**
  +Used internally to parse an appender element.
  +*/
  +AppenderPtr DOMConfigurator::parseAppender(XMLDOMElementPtr appenderElement)
  +{
  +    LogString className = subst(appenderElement->getAttribute(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)));
  +
  +                XMLDOMNodeListPtr children = 
appenderElement->getChildNodes();
  +                int length = children->getLength();
  +
  +                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();
  +
  +                                // Parse appender parameters
  +                                if (tagName == PARAM_TAG)
  +                                {
  +                                        setParameter(currentElement, 
propSetter);
  +                                }
  +                                // Set appender layout
  +                                else if (tagName == LAYOUT_TAG)
  +                                {
  +                                        
appender->setLayout(parseLayout(currentElement));
  +                                }
  +                                // Add filters
  +                                else if (tagName == FILTER_TAG)
  +                                {
  +                                        parseFilters(currentElement, 
appender);
  +                                }
  +                                else if (tagName == ERROR_HANDLER_TAG)
  +                                {
  +                                        parseErrorHandler(currentElement, 
appender);
  +                                }
  +                                else if (tagName == APPENDER_REF_TAG)
  +                                {
  +                                        LogString refName = 
subst(currentElement->getAttribute(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));
  +                                        }
  +                                        else
  +                                        {
  +                                                
LogLog::error(LOG4CXX_STR("Requesting attachment of appender named [")+
  +                                                        refName+ 
LOG4CXX_STR("] to appender named [")+ appender->getName()+
  +                                                        LOG4CXX_STR("] which 
does not implement AppenderAttachable."));
  +                                        }
  +                                }
  +                        }
  +                }
  +        Pool p;
  +                propSetter.activate(p);
  +                return appender;
  +    }
  +    /* Yes, it's ugly.  But all of these exceptions point to the same
  +        problem: we can't create an Appender */
  +    catch (Exception& oops)
  +        {
  +                LogLog::error(LOG4CXX_STR("Could not create an Appender. 
Reported error follows."),
  +                        oops);
  +                return 0;
  +    }
  +}
  +
  +/**
  +Used internally to parse an [EMAIL PROTECTED] ErrorHandler} element.
  +*/
  +void DOMConfigurator::parseErrorHandler(XMLDOMElementPtr element, 
AppenderPtr appender)
  +{
  +    ErrorHandlerPtr eh = OptionConverter::instantiateByClassName(
  +                subst(element->getAttribute(CLASS_ATTR)),
  +                ErrorHandler::getStaticClass(),
  +                0);
  +
  +    if(eh != 0)
  +        {
  +                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();
  +                                if(tagName == PARAM_TAG)
  +                                {
  +                                        setParameter(currentElement, 
propSetter);
  +                                }
  +                                else if(tagName == APPENDER_REF_TAG)
  +                                {
  +                                        
eh->setBackupAppender(findAppenderByReference(currentElement));
  +                                }
  +                                else if(tagName == LOGGER_REF)
  +                                {
  +                                        LogString loggerName = 
currentElement->getAttribute(REF_ATTR);
  +                                        LoggerPtr logger = 
repository->getLogger(loggerName, loggerFactory);
  +                                        eh->setLogger(logger);
  +                                }
  +                                else if(tagName == ROOT_REF)
  +                                {
  +                                        LoggerPtr root = 
repository->getRootLogger();
  +                                        eh->setLogger(root);
  +                                }
  +                        }
  +                }
  +        Pool p;
  +                propSetter.activate(p);
  +                appender->setErrorHandler(eh);
  +    }
  +}
  +
  +/**
  + Used internally to parse a filter element.
  +*/
  +void DOMConfigurator::parseFilters(XMLDOMElementPtr element, AppenderPtr 
appender)
  +{
  +        LogString clazz = subst(element->getAttribute(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++)
  +                {
  +                        XMLDOMNodePtr currentNode = children->item(loop);
  +                        if (currentNode->getNodeType() == 
XMLDOMNode::ELEMENT_NODE)
  +                        {
  +                                XMLDOMElementPtr currentElement = 
currentNode;
  +                                LogString tagName = 
currentElement->getTagName();
  +                                if(tagName == PARAM_TAG)
  +                                {
  +                                        setParameter(currentElement, 
propSetter);
  +                                }
  +                        }
  +                }
  +        Pool p;
  +                propSetter.activate(p);
  +                LogLog::debug(LOG4CXX_STR("Adding filter of type 
[")+filter->getClass().toString()
  +                        +LOG4CXX_STR("] to appender named 
[")+appender->getName()+LOG4CXX_STR("]."));
  +                appender->addFilter(filter);
  +        }
  +}
  +
  +/**
  +Used internally to parse an category element.
  +*/
  +void DOMConfigurator::parseLogger(XMLDOMElementPtr loggerElement)
  +{
  +        // Create a new org.apache.log4j.Category object from the <category> 
element.
  +        LogString loggerName = subst(loggerElement->getAttribute(NAME_ATTR));
  +
  +        LogLog::debug(LOG4CXX_STR("Retreiving an instance of Logger."));
  +        LoggerPtr logger = repository->getLogger(loggerName, loggerFactory);
  +
  +        // Setting up a category needs to be an atomic operation, in order
  +        // to protect potential log operations while category
  +        // configuration is in progress.
  +        synchronized sync(logger->getMutex());
  +        bool additivity = OptionConverter::toBoolean(
  +                subst(loggerElement->getAttribute(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);
  +}
  +
  +/**
  + Used internally to parse the logger factory element.
  +*/
  +void DOMConfigurator::parseLoggerFactory(XMLDOMElementPtr factoryElement)
  +{
  +        LogString className = 
subst(factoryElement->getAttribute(CLASS_ATTR));
  +
  +        if(className.empty())
  +        {
  +                LogLog::error(LOG4CXX_STR("Logger Factory tag ") + 
LogString(CLASS_ATTR) +
  +                        LOG4CXX_STR(" attribute not found."));
  +                LogLog::debug(LOG4CXX_STR("No Category Logger configured."));
  +        }
  +        else
  +        {
  +                LogLog::debug(LOG4CXX_STR("Desired logger factory: 
[")+className+LOG4CXX_STR("]"));
  +                loggerFactory = OptionConverter::instantiateByClassName(
  +                        className,
  +                        LoggerFactory::getStaticClass(),
  +                        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);
  +                                }
  +                        }
  +                }
  +        }
  +}
  +
  +/**
  + Used internally to parse the roor category element.
  +*/
  +void DOMConfigurator::parseRoot(XMLDOMElementPtr rootElement)
  +{
  +        LoggerPtr root = repository->getRootLogger();
  +        // category configuration needs to be atomic
  +        synchronized sync(root->getMutex());
  +        parseChildrenOfLoggerElement(rootElement, root, true);
  +}
  +
  +/**
  + Used internally to parse the children of a logger element.
  +*/
  +void DOMConfigurator::parseChildrenOfLoggerElement(
  +        XMLDOMElementPtr loggerElement, LoggerPtr logger, bool isRoot)
  +{
  +
  +    PropertySetter propSetter(logger);
  +
  +    // Remove all existing appenders from logger. They will be
  +    // reconstructed if need be.
  +    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();
  +
  +                        if (tagName == APPENDER_REF_TAG)
  +                        {
  +                                AppenderPtr appender = 
findAppenderByReference(currentElement);
  +                                LogString refName =  
subst(currentElement->getAttribute(REF_ATTR));
  +                                if(appender != 0)
  +                                {
  +                                        LogLog::debug(LOG4CXX_STR("Adding 
appender named [")+ refName+
  +                                        LOG4CXX_STR("] to logger 
[")+logger->getName()+LOG4CXX_STR("]."));
  +                                }
  +                                else
  +                                {
  +                                        LogLog::debug(LOG4CXX_STR("Appender 
named [")+ refName +
  +                                                LOG4CXX_STR("] not found."));
  +                                }
  +
  +                                logger->addAppender(appender);
  +
  +                        }
  +                        else if(tagName == LEVEL_TAG)
  +                        {
  +                                parseLevel(currentElement, logger, isRoot);
  +                        }
  +                        else if(tagName == PRIORITY_TAG)
  +                        {
  +                                parseLevel(currentElement, logger, isRoot);
  +                        }
  +                        else if(tagName == PARAM_TAG)
  +                        {
  +                                setParameter(currentElement, propSetter);
  +                        }
  +                }
  +    }
  +    Pool p;
  +    propSetter.activate(p);
  +}
  +
  +/**
  + Used internally to parse a layout element.
  +*/
  +LayoutPtr DOMConfigurator::parseLayout (XMLDOMElementPtr layout_element)
  +{
  +        LogString className = 
subst(layout_element->getAttribute(CLASS_ATTR));
  +        LogLog::debug(LOG4CXX_STR("Parsing layout of class: 
\"")+className+LOG4CXX_STR("\""));
  +        try
  +        {
  +                ObjectPtr instance = 
Loader::loadClass(className).newInstance();
  +                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();
  +                                if(tagName == PARAM_TAG)
  +                                {
  +                                        setParameter(currentElement, 
propSetter);
  +                                }
  +                        }
  +                }
  +
  +        Pool p;
  +                propSetter.activate(p);
  +                return layout;
  +        }
  +        catch (Exception& oops)
  +        {
  +                LogLog::error(LOG4CXX_STR("Could not create the Layout. 
Reported error follows."),
  +                        oops);
  +                return 0;
  +        }
  +}
  +
  +/**
  + Used internally to parse a level  element.
  +*/
  +void DOMConfigurator::parseLevel(XMLDOMElementPtr element, LoggerPtr logger, 
bool isRoot)
  +{
  +    LogString loggerName = logger->getName();
  +    if(isRoot)
  +        {
  +                loggerName = LOG4CXX_STR("root");
  +    }
  +
  +    LogString levelStr = subst(element->getAttribute(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"))
  +        || StringHelper::equalsIgnoreCase(levelStr, LOG4CXX_STR("NULL"), 
LOG4CXX_STR("null")))
  +        {
  +                if(isRoot)
  +                {
  +                        LogLog::error(LOG4CXX_STR("Root level cannot be 
inherited. Ignoring directive."));
  +                }
  +                else
  +                {
  +                        logger->setLevel(0);
  +                }
  +    }
  +        else
  +        {
  +                LogString className = 
subst(element->getAttribute(CLASS_ATTR));
  +
  +                if (className.empty())
  +                {
  +                        logger->setLevel(OptionConverter::toLevel(levelStr, 
Level::getDebug()));
  +                }
  +                else
  +                {
  +                        LogLog::debug(LOG4CXX_STR("Desired Level sub-class: 
[") + className + LOG4CXX_STR("]"));
  +
  +                        try
  +                        {
  +                                Level::LevelClass& levelClass =
  +                                        
(Level::LevelClass&)Loader::loadClass(className);
  +                                LevelPtr level = 
levelClass.toLevel(levelStr);
  +                                logger->setLevel(level);
  +                        }
  +                        catch (Exception& oops)
  +                        {
  +                                LogLog::error(
  +                                        LOG4CXX_STR("Could not create level 
[") + levelStr +
  +                                        LOG4CXX_STR("]. Reported error 
follows."),
  +                                        oops);
  +
  +                                return;
  +                        }
  +                        catch (...)
  +                        {
  +                                LogLog::error(
  +                                        LOG4CXX_STR("Could not create level 
[") + levelStr);
  +
  +                                return;
  +                        }
  +                }
  +    }
  +
  +        LogLog::debug(loggerName + LOG4CXX_STR(" level set to ") +
  +                logger->getEffectiveLevel()->toString());
  +}
  +
  +void DOMConfigurator::setParameter(XMLDOMElementPtr elem, PropertySetter& 
propSetter)
  +{
  +        LogString name = subst(elem->getAttribute(NAME_ATTR));
  +        LogString value = elem->getAttribute(VALUE_ATTR);
  +    Pool p;
  +        value = subst(OptionConverter::convertSpecialChars(value));  
propSetter.setProperty(name, value, p);
  +}
  +
  +void DOMConfigurator::doConfigure(const File& filename, 
spi::LoggerRepositoryPtr& repository)
  +{
  +        this->repository = repository;
       std::wostringstream os(L"DOMConfigurator configuring file ");
  -    os << filename.getName() << L"...";
  -     LogLog::debug(os.str());
  -
  -     appenderBag = new AppenderMap();
  -     loggerFactory = new DefaultCategoryFactory();
  -
  -     try
  -     {
  -#ifdef _WIN32
  -             XMLDOMDocumentPtr doc = new MsXMLDOMDocument();
  +    os << filename.getName() << L"...";
  +        LogLog::debug(os.str());
  +
  +        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..
  +                XMLDOMDocumentPtr doc = new GnomeXMLDOMDocument();
  +#endif
  +                doc->load(filename);
  +                parse(doc->getDocumentElement());
  +    }
  +        catch (Exception& e)
  +        {
  +                // I know this is miserable..
           std::wostringstream os(L"Could not parse input source [");
  -        os << filename.getName() << L"].";
  -             LogLog::error(os.str(), e);
  -    }
  -
  -     delete (AppenderMap *)appenderBag;
  -}
  -
  -void DOMConfigurator::configure(const std::string& filename)
  +        os << filename.getName() << L"].";
  +                LogLog::error(os.str(), e);
  +    }
  +
  +        delete (AppenderMap *)appenderBag;
  +}
  +
  +void DOMConfigurator::configure(const std::string& filename)
   {
       LogString fn;
  -    Transcoder::decode(filename, fn);
  -     DOMConfigurator().doConfigure(fn, LogManager::getLoggerRepository());
  -}
  +    Transcoder::decode(filename, fn);
  +        DOMConfigurator().doConfigure(fn, LogManager::getLoggerRepository());
  +}
   
   void DOMConfigurator::configure(const std::wstring& filename)
   {
       LogString fn;
       Transcoder::decode(filename, fn);
  -     DOMConfigurator().doConfigure(fn, LogManager::getLoggerRepository());
  +        DOMConfigurator().doConfigure(fn, LogManager::getLoggerRepository());
   }
  -
  -void DOMConfigurator::configureAndWatch(const std::string& filename)
  -{
  +
  +void DOMConfigurator::configureAndWatch(const std::string& filename)
  +{
       LogString fn;
       Transcoder::decode(filename, fn);
  -     configureAndWatch(fn, FileWatchdog::DEFAULT_DELAY);
  -}
  +        configureAndWatch(fn, FileWatchdog::DEFAULT_DELAY);
  +}
   
   void DOMConfigurator::configureAndWatch(const std::wstring& filename)
   {
       LogString fn;
       Transcoder::decode(filename, fn);
  -     configureAndWatch(fn, FileWatchdog::DEFAULT_DELAY);
  +        configureAndWatch(fn, FileWatchdog::DEFAULT_DELAY);
   }
  -
  -void DOMConfigurator::configureAndWatch(const std::string& filename, long 
delay)
  +
  +void DOMConfigurator::configureAndWatch(const std::string& filename, long 
delay)
   {
       LogString fn;
  -    Transcoder::decode(filename, fn);
  -     XMLWatchdog * xdog = new XMLWatchdog(fn);
  -     xdog->setDelay(delay);
  -     xdog->start();
  -}
  +    Transcoder::decode(filename, fn);
  +        XMLWatchdog * xdog = new XMLWatchdog(fn);
  +        xdog->setDelay(delay);
  +        xdog->start();
  +}
   
   void DOMConfigurator::configureAndWatch(const std::wstring& filename, long 
delay)
   {
       LogString fn;
       Transcoder::decode(filename, fn);
  -     XMLWatchdog * xdog = new XMLWatchdog(fn);
  -     xdog->setDelay(delay);
  -     xdog->start();
  -}
  -
  -/**
  - Used internally to configure the log4j framework by parsing a DOM
  - tree of XML elements based on <a
  - href="doc-files/log4j.dtd">log4j.dtd</a>.
  -
  -*/
  -void DOMConfigurator::parse(XMLDOMElementPtr element)
  -{
  -    LogString rootElementName = element->getTagName();
  -
  -    if (rootElementName != CONFIGURATION_TAG)
  -     {
  -             if(rootElementName == OLD_CONFIGURATION_TAG)
  -             {
  -                     //LogLog::warn(LOG4CXX_STR("The 
<")+String(OLD_CONFIGURATION_TAG)+
  -                     //      LOG4CXX_STR("> element has been deprecated."));
  -                     //LogLog::warn(LOG4CXX_STR("Use the 
<")+String(CONFIGURATION_TAG)+
  -                     //      LOG4CXX_STR("> element instead."));
  -             }
  -             else
  -             {
  -                     LogLog::error(LOG4CXX_STR("DOM element is - not a <")+
  -                             LogString(CONFIGURATION_TAG)+LOG4CXX_STR("> 
element."));
  -                     return;
  -             }
  -    }
  -
  -    LogString debugAttrib = 
subst(element->getAttribute(INTERNAL_DEBUG_ATTR));
  -
  -    static const LogString NuLL(LOG4CXX_STR("NULL"));
  -    LogLog::debug(LOG4CXX_STR("debug attribute= \"") + debugAttrib 
+LOG4CXX_STR("\"."));
  -    // if the log4j.dtd is not specified in the XML file, then the
  -    // "debug" attribute is returned as the empty string.
  -    if(!debugAttrib.empty() && debugAttrib != NuLL)
  -     {
  -             
LogLog::setInternalDebugging(OptionConverter::toBoolean(debugAttrib, true));
  -    }
  -     else
  -     {
  -             LogLog::debug(LOG4CXX_STR("Ignoring ") + 
LogString(INTERNAL_DEBUG_ATTR)
  -                     + LOG4CXX_STR(" attribute."));
  -    }
  -
  -
  -    LogString confDebug = subst(element->getAttribute(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::setInternalDebugging(OptionConverter::toBoolean(confDebug, true));
  -    }
  -
  -    LogString thresholdStr = subst(element->getAttribute(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();
  -
  -                     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();
  -
  -                     if (tagName == CATEGORY || tagName == LOGGER)
  -                     {
  -                             parseLogger(currentElement);
  -                     }
  -                     else if (tagName == ROOT_TAG)
  -                     {
  -                             parseRoot(currentElement);
  -                     }
  -             }
  -    }
  -}
  -
  -LogString DOMConfigurator::subst(const LogString& value)
  -{
  -    try
  -     {
  -             return OptionConverter::substVars(value, props);
  -    }
  -     catch(IllegalArgumentException& e)
  -     {
  -             LogLog::warn(LOG4CXX_STR("Could not perform variable 
substitution."), e);
  -             return value;
  -    }
  -}
  -
  -#endif // LOG4CXX_HAVE_XML
  +        XMLWatchdog * xdog = new XMLWatchdog(fn);
  +        xdog->setDelay(delay);
  +        xdog->start();
  +}
  +
  +/**
  + Used internally to configure the log4j framework by parsing a DOM
  + tree of XML elements based on <a
  + href="doc-files/log4j.dtd">log4j.dtd</a>.
  +
  +*/
  +void DOMConfigurator::parse(XMLDOMElementPtr element)
  +{
  +    LogString rootElementName = element->getTagName();
  +
  +    if (rootElementName != CONFIGURATION_TAG)
  +        {
  +                if(rootElementName == OLD_CONFIGURATION_TAG)
  +                {
  +                        //LogLog::warn(LOG4CXX_STR("The 
<")+String(OLD_CONFIGURATION_TAG)+
  +                        //   LOG4CXX_STR("> element has been deprecated."));
  +                        //LogLog::warn(LOG4CXX_STR("Use the 
<")+String(CONFIGURATION_TAG)+
  +                        //   LOG4CXX_STR("> element instead."));
  +                }
  +                else
  +                {
  +                        LogLog::error(LOG4CXX_STR("DOM element is - not a 
<")+
  +                                LogString(CONFIGURATION_TAG)+LOG4CXX_STR("> 
element."));
  +                        return;
  +                }
  +    }
  +
  +    LogString debugAttrib = 
subst(element->getAttribute(INTERNAL_DEBUG_ATTR));
  +
  +    static const LogString NuLL(LOG4CXX_STR("NULL"));
  +    LogLog::debug(LOG4CXX_STR("debug attribute= \"") + debugAttrib 
+LOG4CXX_STR("\"."));
  +    // if the log4j.dtd is not specified in the XML file, then the
  +    // "debug" attribute is returned as the empty string.
  +    if(!debugAttrib.empty() && debugAttrib != NuLL)
  +        {
  +                
LogLog::setInternalDebugging(OptionConverter::toBoolean(debugAttrib, true));
  +    }
  +        else
  +        {
  +                LogLog::debug(LOG4CXX_STR("Ignoring ") + 
LogString(INTERNAL_DEBUG_ATTR)
  +                        + LOG4CXX_STR(" attribute."));
  +    }
  +
  +
  +    LogString confDebug = subst(element->getAttribute(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::setInternalDebugging(OptionConverter::toBoolean(confDebug, true));
  +    }
  +
  +    LogString thresholdStr = subst(element->getAttribute(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();
  +
  +                        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();
  +
  +                        if (tagName == CATEGORY || tagName == LOGGER)
  +                        {
  +                                parseLogger(currentElement);
  +                        }
  +                        else if (tagName == ROOT_TAG)
  +                        {
  +                                parseRoot(currentElement);
  +                        }
  +                }
  +    }
  +}
  +
  +LogString DOMConfigurator::subst(const LogString& value)
  +{
  +    try
  +        {
  +                return OptionConverter::substVars(value, props);
  +    }
  +        catch(IllegalArgumentException& e)
  +        {
  +                LogLog::warn(LOG4CXX_STR("Could not perform variable 
substitution."), e);
  +                return value;
  +    }
  +}
  +
  +#endif // LOG4CXX_HAVE_XML
  
  
  
  1.6       +149 -133  logging-log4cxx/src/gnomexml.cpp
  
  Index: gnomexml.cpp
  ===================================================================
  RCS file: /home/cvs/logging-log4cxx/src/gnomexml.cpp,v
  retrieving revision 1.5
  retrieving revision 1.6
  diff -u -r1.5 -r1.6
  --- gnomexml.cpp      13 Aug 2004 12:27:48 -0000      1.5
  +++ gnomexml.cpp      12 Jan 2005 05:12:16 -0000      1.6
  @@ -1,25 +1,27 @@
   /*
    * Copyright 2003,2004 The Apache Software Foundation.
  - * 
  + *
    * Licensed 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.
    */
  - 
  +
   #include <log4cxx/portability.h>
   
  -#ifdef LOG4CXX_HAVE_LIBXML2
  +#if !defined(_WIN32)
   
   #include <log4cxx/helpers/gnomexml.h>
   #include <log4cxx/helpers/loglog.h>
  +#include <log4cxx/helpers/transcoder.h>
  +#include <log4cxx/file.h>
   
   using namespace log4cxx;
   using namespace log4cxx::helpers;
  @@ -38,14 +40,14 @@
   
   XMLDOMNodeListPtr GnomeXMLDOMNode::getChildNodes()
   {
  -     if (node == 0) throw DOMException();
  -     return new GnomeXMLDOMNodeList(node->children);
  +        if (node == 0) throw DOMException();
  +        return new GnomeXMLDOMNodeList(node->children);
   }
   
   XMLDOMDocumentPtr GnomeXMLDOMNode::getOwnerDocument()
   {
  -     if (node == 0) throw DOMException();
  -     return new GnomeXMLDOMDocument(node->doc);
  +        if (node == 0) throw DOMException();
  +        return new GnomeXMLDOMDocument(node->doc);
   }
   
   // GnomeXMLDOMDocument
  @@ -62,89 +64,97 @@
   
   GnomeXMLDOMDocument::~GnomeXMLDOMDocument()
   {
  -     if (ownDocument)
  -     {
  -             ::xmlFreeDoc(document);
  -     }
  +        if (ownDocument)
  +        {
  +                ::xmlFreeDoc(document);
  +        }
   }
   
   XMLDOMNodeListPtr GnomeXMLDOMDocument::getChildNodes()
   {
  -     if (document == 0) throw DOMException();
  -     return new GnomeXMLDOMNodeList(::xmlDocGetRootElement(document));
  +        if (document == 0) throw DOMException();
  +        return new GnomeXMLDOMNodeList(::xmlDocGetRootElement(document));
   }
   
   XMLDOMDocumentPtr GnomeXMLDOMDocument::getOwnerDocument()
   {
  -     return this;
  +        return this;
   }
   
  -void GnomeXMLDOMDocument::load(const String& fileName)
  +void GnomeXMLDOMDocument::load(const File& fileName)
   {
  -     if (document != 0)
  -     {
  -             if (ownDocument)
  -             {
  -                     ::xmlFreeDoc(document);
  -             }
  -             document = 0;
  -     }
  -
  -     USES_CONVERSION;
  -     document = ::xmlParseFile(T2A(fileName.c_str()));
  -
  -     if (document == 0)
  -     {
  -             LogLog::error(_T("Could not open [")+fileName+_T("]."));
  -     }
  -     else
  -     {
  -             ownDocument = true;
  -     }
  +        if (document != 0)
  +        {
  +                if (ownDocument)
  +                {
  +                        ::xmlFreeDoc(document);
  +                }
  +                document = 0;
  +        }
  +
  +        std::string fn;
  +        Transcoder::encode(fileName.getName(), fn);
  +        document = ::xmlParseFile(fn.c_str());
  +
  +        if (document == 0)
  +        {
  +                LogLog::error(LogString(LOG4CXX_STR("Could not open [")) +
  +                   fileName.getName() + LOG4CXX_STR("]."));
  +        }
  +        else
  +        {
  +                ownDocument = true;
  +        }
   }
   
   XMLDOMElementPtr GnomeXMLDOMDocument::getDocumentElement()
   {
  -     if (document == 0) throw DOMException();
  -     xmlNodePtr element = ::xmlDocGetRootElement(document);
  -     return new GnomeXMLDOMElement(element);
  -}
  -
  -XMLDOMElementPtr GnomeXMLDOMDocument::getElementById(const String& tagName, 
const String& elementId)
  -{
  -     if (document == 0) throw DOMException();
  -     USES_CONVERSION;
  -     xmlNodePtr node = ::xmlDocGetRootElement(document);
  -
  -     while (node != 0)
  -     {
  -             if (node->type == XML_ELEMENT_NODE
  -                     && tagName == A2T((char *)node->name))
  -             {
  -                     char * attributeValue = (char *)xmlGetProp(
  -                             node, (const xmlChar *)"name");
  -                     if (attributeValue != 0
  -                             && elementId == A2T(attributeValue))
  -                     {
  -                             return new GnomeXMLDOMElement(node);
  -                     }
  -             }
  -
  -             if (node->children != 0)
  -             {
  -                     node = node->children;
  -             }
  -             else if (node->next != 0)
  -             {
  -                     node = node->next;
  -             }
  -             else
  -             {
  -                     node = node->parent->next;
  -             }
  -     }
  +        if (document == 0) throw DOMException();
  +        xmlNodePtr element = ::xmlDocGetRootElement(document);
  +        return new GnomeXMLDOMElement(element);
  +}
  +
  +XMLDOMElementPtr GnomeXMLDOMDocument::getElementById(const LogString& 
tagName,
  +   const LogString& elementId)
  +{
  +        if (document == 0) throw DOMException();
  +        xmlNodePtr node = ::xmlDocGetRootElement(document);
  +
  +        std::string elemId;
  +        Transcoder::encode(elementId, elemId);
  +
  +        std::string tag;
  +        Transcoder::encode(tagName, tag);
  +
  +        while (node != 0)
  +        {
  +                if (node->type == XML_ELEMENT_NODE
  +                        && tag == (const char*) node->name)
  +                {
  +                        char * attributeValue = (char *)xmlGetProp(
  +                                node, (const xmlChar *)"name");
  +                        if (attributeValue != 0
  +                                && elemId == attributeValue)
  +                        {
  +                                return new GnomeXMLDOMElement(node);
  +                        }
  +                }
  +
  +                if (node->children != 0)
  +                {
  +                        node = node->children;
  +                }
  +                else if (node->next != 0)
  +                {
  +                        node = node->next;
  +                }
  +                else
  +                {
  +                        node = node->parent->next;
  +                }
  +        }
   
  -     return 0;
  +        return 0;
   }
   
   // GnomeXMLDOMElement
  @@ -155,33 +165,39 @@
   
   XMLDOMNodeListPtr GnomeXMLDOMElement::getChildNodes()
   {
  -     if (element == 0) throw DOMException();
  -     return new GnomeXMLDOMNodeList(element->children);
  +        if (element == 0) throw DOMException();
  +        return new GnomeXMLDOMNodeList(element->children);
   }
   
   XMLDOMDocumentPtr GnomeXMLDOMElement::getOwnerDocument()
   {
  -     if (element == 0) throw DOMException();
  -     return new GnomeXMLDOMDocument(element->doc);
  +        if (element == 0) throw DOMException();
  +        return new GnomeXMLDOMDocument(element->doc);
   }
   
  -String GnomeXMLDOMElement::getTagName()
  +LogString GnomeXMLDOMElement::getTagName()
   {
  -     if (element == 0) throw DOMException();
  -     USES_CONVERSION;
  -     return A2T((char *)element->name);
  +        if (element == 0) throw DOMException();
  +        LogString tagname;
  +        Transcoder::decode((const char*) element->name, tagname);
  +        return tagname;
   }
   
  -String GnomeXMLDOMElement::getAttribute(const String& name)
  +LogString GnomeXMLDOMElement::getAttribute(const LogString& name)
   {
  -     if (element == 0) throw DOMException();
  -     USES_CONVERSION;
  -     char * attributeValue = (char *)xmlGetProp(
  -             element, (const xmlChar *)T2A(name.c_str()));
  -     return (attributeValue == 0) ? String() : A2T(attributeValue);
  +        if (element == 0) throw DOMException();
  +        std::string nm;
  +        Transcoder::encode(name, nm);
  +        char * attributeValue = (char *)xmlGetProp(
  +                element, (const xmlChar*) nm.c_str());
  +        LogString retval;
  +        if (attributeValue != 0) {
  +           Transcoder::decode((const char*) attributeValue, retval);
  +        }
  +        return retval;
   }
   
  -// GnomeXMLDOMNodeList       
  +// GnomeXMLDOMNodeList
   GnomeXMLDOMNodeList::GnomeXMLDOMNodeList(xmlNodePtr firstChild)
   : firstChild(firstChild), currentChild(firstChild), currentIndex(0)
   {
  @@ -189,54 +205,54 @@
   
   int GnomeXMLDOMNodeList::getLength()
   {
  -     xmlNodePtr child = firstChild;
  -     int length = 0;
  -     while (child != 0)
  -     {
  -             child = child->next;
  -             length++;
  -     }
  +        xmlNodePtr child = firstChild;
  +        int length = 0;
  +        while (child != 0)
  +        {
  +                child = child->next;
  +                length++;
  +        }
   
  -     return length;
  +        return length;
   }
   
   XMLDOMNodePtr GnomeXMLDOMNodeList::item(int index)
   {
  -     xmlNodePtr child = 0;
  +        xmlNodePtr child = 0;
   
  -     if (index == currentIndex)
  -     {
  -             child = currentChild;
  -     }
  -     else
  -     {
  -             child = firstChild;
  -             int n = 0;
  -             while (child != 0 && n < index)
  -             {
  -                     child = child->next;
  -                     n++;
  -             }
  -     }
  -
  -     currentIndex = index + 1;
  -     currentChild = child ? child->next : 0;
  -
  -     if (child != 0)
  -     {
  -             if (child->type == XML_ELEMENT_NODE)
  -             {
  -                     return new GnomeXMLDOMElement(child);
  -             }
  -             else
  -             {
  -                     return new GnomeXMLDOMNode(child);
  -             }
  -     }
  -     else
  -     {
  -             return 0;
  -     }
  +        if (index == currentIndex)
  +        {
  +                child = currentChild;
  +        }
  +        else
  +        {
  +                child = firstChild;
  +                int n = 0;
  +                while (child != 0 && n < index)
  +                {
  +                        child = child->next;
  +                        n++;
  +                }
  +        }
  +
  +        currentIndex = index + 1;
  +        currentChild = child ? child->next : 0;
  +
  +        if (child != 0)
  +        {
  +                if (child->type == XML_ELEMENT_NODE)
  +                {
  +                        return new GnomeXMLDOMElement(child);
  +                }
  +                else
  +                {
  +                        return new GnomeXMLDOMNode(child);
  +                }
  +        }
  +        else
  +        {
  +                return 0;
  +        }
   }
   
   #endif // LOG4CXX_HAVE_LIBXML2
  
  
  
  1.10      +1 -1      logging-log4cxx/src/simpledateformat.cpp
  
  Index: simpledateformat.cpp
  ===================================================================
  RCS file: /home/cvs/logging-log4cxx/src/simpledateformat.cpp,v
  retrieving revision 1.9
  retrieving revision 1.10
  diff -u -r1.9 -r1.10
  --- simpledateformat.cpp      9 Jan 2005 00:16:01 -0000       1.9
  +++ simpledateformat.cpp      12 Jan 2005 05:12:16 -0000      1.10
  @@ -42,7 +42,7 @@
                                                             
std::basic_ostream<wchar_t>& buffer,
                                                             const tm* time,
                                                             const char spec) {
  -#if _MSC_VER < 1300
  +#if defined(_MSC_VER) && _MSC_VER < 1300
                   _USE(locale, TimePutFacet).put(buffer,
                                    buffer, time, spec);
   #else
  
  
  

Reply via email to