carnold     2005/02/10 17:04:36

  Modified:    include/log4cxx fileappender.h
               src      domconfigurator.cpp fileappender.cpp
                        patternlayout.cpp
               tests/src fileappendertestcase.cpp fileappendertestcase.h
                        rollingfileappendertestcase.cpp
               tests/src/xml domtestcase.cpp
  Added:       tests/input/xml DOMTestCase2.xml DOMTestCase3.xml
               tests/witness dom.A1.2 dom.A2.2
  Log:
  LOGCXX-22: Backslashes in filenames in XML mistreated
  
  Revision  Changes    Path
  1.21      +3 -1      logging-log4cxx/include/log4cxx/fileappender.h
  
  Index: fileappender.h
  ===================================================================
  RCS file: /home/cvs/logging-log4cxx/include/log4cxx/fileappender.h,v
  retrieving revision 1.20
  retrieving revision 1.21
  diff -u -r1.20 -r1.21
  --- fileappender.h    26 Dec 2004 07:31:52 -0000      1.20
  +++ fileappender.h    11 Feb 2005 01:04:36 -0000      1.21
  @@ -1,5 +1,5 @@
   /*
  - * Copyright 2003,2004 The Apache Software Foundation.
  + * 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.
  @@ -221,6 +221,8 @@
           FileAppender(const FileAppender&);
           FileAppender& operator=(const FileAppender&);
   
  +        void stripDoubleBackslashes(LogString& name);
  +
           }; // class FileAppender
   }  // namespace log4cxx
   
  
  
  
  1.21      +5 -4      logging-log4cxx/src/domconfigurator.cpp
  
  Index: domconfigurator.cpp
  ===================================================================
  RCS file: /home/cvs/logging-log4cxx/src/domconfigurator.cpp,v
  retrieving revision 1.20
  retrieving revision 1.21
  diff -u -r1.20 -r1.21
  --- domconfigurator.cpp       12 Jan 2005 05:12:16 -0000      1.20
  +++ domconfigurator.cpp       11 Feb 2005 01:04:36 -0000      1.21
  @@ -586,15 +586,16 @@
   {
           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);
  +        Pool p;
  +        value = subst(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"...";
  +        std::wostringstream os(L"DOMConfigurator configuring file ");
  +        os << filename.getName() << L"...";
           LogLog::debug(os.str());
   
           appenderBag = new AppenderMap();
  
  
  
  1.21      +14 -1     logging-log4cxx/src/fileappender.cpp
  
  Index: fileappender.cpp
  ===================================================================
  RCS file: /home/cvs/logging-log4cxx/src/fileappender.cpp,v
  retrieving revision 1.20
  retrieving revision 1.21
  diff -u -r1.20 -r1.21
  --- fileappender.cpp  10 Feb 2005 08:41:59 -0000      1.20
  +++ fileappender.cpp  11 Feb 2005 01:04:36 -0000      1.21
  @@ -111,7 +111,9 @@
           if (StringHelper::equalsIgnoreCase(option, LOG4CXX_STR("FILE"), 
LOG4CXX_STR("file"))
                   || StringHelper::equalsIgnoreCase(option, 
LOG4CXX_STR("FILENAME"), LOG4CXX_STR("filename")))
           {
  -                fileName = value;
  +                LogString tmpValue(value);
  +                stripDoubleBackslashes(tmpValue);
  +                fileName = tmpValue;
           }
           else if (StringHelper::equalsIgnoreCase(option, 
LOG4CXX_STR("APPEND"), LOG4CXX_STR("append")))
           {
  @@ -177,3 +179,14 @@
   }
   
   
  +
  +void FileAppender::stripDoubleBackslashes(LogString& name) {
  +    logchar backslash = LOG4CXX_STR('\\');
  +    for(LogString::size_type i = name.find(backslash);
  +        i != LogString::npos;
  +        i = name.find(backslash, i + 1)) {
  +            if (i + 1 < name.length() && name[i + 1] == backslash) {
  +                name.erase(i, 1);
  +            }
  +    }
  +}
  \ No newline at end of file
  
  
  
  1.14      +4 -3      logging-log4cxx/src/patternlayout.cpp
  
  Index: patternlayout.cpp
  ===================================================================
  RCS file: /home/cvs/logging-log4cxx/src/patternlayout.cpp,v
  retrieving revision 1.13
  retrieving revision 1.14
  diff -u -r1.13 -r1.14
  --- patternlayout.cpp 26 Dec 2004 07:31:53 -0000      1.13
  +++ patternlayout.cpp 11 Feb 2005 01:04:36 -0000      1.14
  @@ -1,5 +1,5 @@
   /*
  - * Copyright 2003,2004 The Apache Software Foundation.
  + * 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.
  @@ -19,6 +19,7 @@
   #include <log4cxx/helpers/patternconverter.h>
   #include <log4cxx/helpers/stringhelper.h>
   #include <log4cxx/helpers/pool.h>
  +#include <log4cxx/helpers/optionconverter.h>
   
   using namespace log4cxx;
   using namespace log4cxx::helpers;
  @@ -47,7 +48,7 @@
   
   void PatternLayout::setConversionPattern(const LogString& conversionPattern)
   {
  -    pattern = conversionPattern;
  +    pattern = OptionConverter::convertSpecialChars(conversionPattern);
       Pool pool;
       activateOptions(pool);
   }
  @@ -76,7 +77,7 @@
                  LOG4CXX_STR("CONVERSIONPATTERN"),
                  LOG4CXX_STR("conversionpattern")))
           {
  -                pattern = value;
  +                setConversionPattern(value);
           }
           else if (StringHelper::equalsIgnoreCase(option,
                  LOG4CXX_STR("TIMEZONE"),
  
  
  
  1.1                  logging-log4cxx/tests/input/xml/DOMTestCase2.xml
  
  Index: DOMTestCase2.xml
  ===================================================================
  <?xml version="1.0" encoding="UTF-8" ?>
  <!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
  
  <log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/";>
    <appender name="A1" class="org.apache.log4j.FileAppender">
      
      <param name="File"   value="output\temp.A1.2" />
      <param name="Append" value="false" />         
      
      <layout class="org.apache.log4j.PatternLayout">
        <param name="ConversionPattern" value="%-5p %c{2} - %m%n"/>
      </layout>     
    </appender>
    
    <appender name="A2" class="org.apache.log4j.FileAppender">
      <param name="File" value="output\temp.A2.2" />
      <param name="Append" value="false" />
      <layout class="org.apache.log4j.TTCCLayout">
        <param name="DateFormat" value="ISO8601" />
      </layout>         
    </appender>
    
    <logger name="org.apache.log4j.xml">
      <level value="debug" />
      <appender-ref ref="A1" />
    </logger>
    
    <root>
      <priority value ="debug" />
      <appender-ref ref="A1" />
      <appender-ref ref="A2" />
    </root>
    
  </log4j:configuration>
  
  
  
  1.1                  logging-log4cxx/tests/input/xml/DOMTestCase3.xml
  
  Index: DOMTestCase3.xml
  ===================================================================
  <?xml version="1.0" encoding="UTF-8" ?>
  <!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
  
  <log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/";>
    <appender name="A1" class="org.apache.log4j.FileAppender">
      
      <param name="File"   value="e:\tmp\temp.A1" />
      <param name="Append" value="false" />         
      
      <layout class="org.apache.log4j.PatternLayout">
        <param name="ConversionPattern" value="%-5p %c{2} - %m%n"/>
      </layout>     
    </appender>
    
    <root>
      <priority value ="debug" />
      <appender-ref ref="A1" />
    </root>
    
  </log4j:configuration>
  
  
  
  1.2       +39 -2     logging-log4cxx/tests/src/fileappendertestcase.cpp
  
  Index: fileappendertestcase.cpp
  ===================================================================
  RCS file: /home/cvs/logging-log4cxx/tests/src/fileappendertestcase.cpp,v
  retrieving revision 1.1
  retrieving revision 1.2
  diff -u -r1.1 -r1.2
  --- fileappendertestcase.cpp  22 Oct 2004 07:47:59 -0000      1.1
  +++ fileappendertestcase.cpp  11 Feb 2005 01:04:36 -0000      1.2
  @@ -18,11 +18,48 @@
   #include <cppunit/extensions/HelperMacros.h>
   #include <log4cxx/helpers/objectptr.h>
   #include <log4cxx/fileappender.h>
  -
  +#include "insertwide.h"
   
   using namespace log4cxx;
   using namespace log4cxx::helpers;
   
  -WriterAppender* FileAppenderTestCase::createWriterAppender() const {
  +WriterAppender* FileAppenderAbstractTestCase::createWriterAppender() const {
       return createFileAppender();
   }
  +
  +
  +/**
  +   Unit tests of log4cxx::FileAppender
  + */
  +class FileAppenderTestCase : public FileAppenderAbstractTestCase
  +{
  +     CPPUNIT_TEST_SUITE(FileAppenderTestCase);
  +                //
  +                //    tests inherited from AppenderSkeletonTestCase
  +                //
  +                CPPUNIT_TEST(testDefaultThreshold);
  +                CPPUNIT_TEST(testSetOptionThreshold);
  +
  +                //  tests defined here
  +                CPPUNIT_TEST(testSetDoubleBackslashes);
  +
  +     CPPUNIT_TEST_SUITE_END();
  +
  +
  +
  +
  +public:
  +
  +        FileAppender* createFileAppender() const {
  +          return new log4cxx::FileAppender();
  +        }
  +
  +        void testSetDoubleBackslashes() {
  +            FileAppender appender;
  +            appender.setOption(LOG4CXX_STR("FILE"), 
LOG4CXX_STR("output\\\\temp"));
  +            const File& file = appender.getFile();
  +            CPPUNIT_ASSERT_EQUAL((LogString) LOG4CXX_STR("output\\temp"), 
file.getName()); 
  +        }
  +};
  +
  +CPPUNIT_TEST_SUITE_REGISTRATION(FileAppenderTestCase);
  
  
  
  1.2       +1 -1      logging-log4cxx/tests/src/fileappendertestcase.h
  
  Index: fileappendertestcase.h
  ===================================================================
  RCS file: /home/cvs/logging-log4cxx/tests/src/fileappendertestcase.h,v
  retrieving revision 1.1
  retrieving revision 1.2
  diff -u -r1.1 -r1.2
  --- fileappendertestcase.h    22 Oct 2004 07:47:59 -0000      1.1
  +++ fileappendertestcase.h    11 Feb 2005 01:04:36 -0000      1.2
  @@ -23,7 +23,7 @@
      An abstract set of tests for inclusion in concrete
      appender test case
    */
  -class FileAppenderTestCase : public WriterAppenderTestCase
  +class FileAppenderAbstractTestCase : public WriterAppenderTestCase
   {
   
   public:
  
  
  
  1.2       +1 -1      logging-log4cxx/tests/src/rollingfileappendertestcase.cpp
  
  Index: rollingfileappendertestcase.cpp
  ===================================================================
  RCS file: 
/home/cvs/logging-log4cxx/tests/src/rollingfileappendertestcase.cpp,v
  retrieving revision 1.1
  retrieving revision 1.2
  diff -u -r1.1 -r1.2
  --- rollingfileappendertestcase.cpp   22 Oct 2004 07:47:59 -0000      1.1
  +++ rollingfileappendertestcase.cpp   11 Feb 2005 01:04:36 -0000      1.2
  @@ -25,7 +25,7 @@
   /**
      Unit tests of log4cxx::RollingFileAppender
    */
  -class RollingFileAppenderTestCase : public FileAppenderTestCase
  +class RollingFileAppenderTestCase : public FileAppenderAbstractTestCase
   {
        CPPUNIT_TEST_SUITE(RollingFileAppenderTestCase);
                   //
  
  
  
  1.10      +100 -41   logging-log4cxx/tests/src/xml/domtestcase.cpp
  
  Index: domtestcase.cpp
  ===================================================================
  RCS file: /home/cvs/logging-log4cxx/tests/src/xml/domtestcase.cpp,v
  retrieving revision 1.9
  retrieving revision 1.10
  diff -u -r1.9 -r1.10
  --- domtestcase.cpp   29 Jan 2005 23:44:54 -0000      1.9
  +++ domtestcase.cpp   11 Feb 2005 01:04:36 -0000      1.10
  @@ -32,6 +32,9 @@
   #include "../util/transformer.h"
   #include <iostream>
   #include <log4cxx/file.h>
  +#include <log4cxx/fileappender.h>
  +#include <apr_pools.h>
  +#include <apr_file_io.h>
   
   #define LOG4CXX_TEST_STR(x) L##x
   
  @@ -52,6 +55,8 @@
   {
           CPPUNIT_TEST_SUITE(DOMTestCase);
                   CPPUNIT_TEST(test1);
  +                CPPUNIT_TEST(test2);
  +                CPPUNIT_TEST(test3);
           CPPUNIT_TEST_SUITE_END();
   
           LoggerPtr root;
  @@ -61,6 +66,10 @@
           static const File TEMP_A2;
           static const File FILTERED_A1;
           static const File FILTERED_A2;
  +        static const File TEMP_A1_2;
  +        static const File TEMP_A2_2;
  +        static const File FILTERED_A1_2;
  +        static const File FILTERED_A2_2;
   
   public:
           void setUp()
  @@ -73,47 +82,92 @@
           {
                   root->getLoggerRepository()->resetConfiguration();
           }
  -
  -        void test1()
  -        {
  -                
DOMConfigurator::configure(LOG4CXX_TEST_STR("input/xml/DOMTestCase1.xml"));
  -                common();
  -
  -                ControlFilter cf1;
  -                cf1 << TEST1_1A_PAT << TEST1_1B_PAT;
  -
  -                ControlFilter cf2;
  -                cf2 << TEST1_2_PAT;
  -
  -                ThreadFilter threadFilter;
  -                ISO8601Filter iso8601Filter;
  -
  -                std::vector<Filter *> filters1;
  -                filters1.push_back(&cf1);
  -
  -                std::vector<Filter *> filters2;
  -                filters2.push_back(&cf2);
  -                filters2.push_back(&threadFilter);
  -                filters2.push_back(&iso8601Filter);
  -
  -                try
  -                {
  -                        Transformer::transform(TEMP_A1, FILTERED_A1, 
filters1);
  -                        Transformer::transform(TEMP_A2, FILTERED_A2, 
filters2);
  -                }
  -                catch(UnexpectedFormatException& e)
  -                {
  -                    std::cout << "UnexpectedFormatException :" << e.what() 
<< std::endl;
  -                        throw;
  -                }
  -
  -                const File witness1(L"witness/dom.A1.1");
  -                const File witness2(L"witness/dom.A2.1");
  -                //   TODO: A1 doesn't contain duplicate entries
  -                //
  -                //                
CPPUNIT_ASSERT(Compare::compare(FILTERED_A1, witness1));
  -                CPPUNIT_ASSERT(Compare::compare(FILTERED_A2, witness2));
  -        }
  +
  +
  +        void test1() {
  +                
DOMConfigurator::configure(LOG4CXX_TEST_STR("input/xml/DOMTestCase1.xml"));
  +                common();
  +
  +                ControlFilter cf1;
  +                cf1 << TEST1_1A_PAT << TEST1_1B_PAT;
  +
  +                ControlFilter cf2;
  +                cf2 << TEST1_2_PAT;
  +
  +                ThreadFilter threadFilter;
  +                ISO8601Filter iso8601Filter;
  +
  +                std::vector<Filter *> filters1;
  +                filters1.push_back(&cf1);
  +
  +                std::vector<Filter *> filters2;
  +                filters2.push_back(&cf2);
  +                filters2.push_back(&threadFilter);
  +                filters2.push_back(&iso8601Filter);
  +
  +                try
  +                {
  +                        Transformer::transform(TEMP_A1, FILTERED_A1, 
filters1);
  +                        Transformer::transform(TEMP_A2, FILTERED_A2, 
filters2);
  +                }
  +                catch(UnexpectedFormatException& e)
  +                {
  +                    std::cout << "UnexpectedFormatException :" << e.what() 
<< std::endl;
  +                        throw;
  +                }
  +
  +                const File witness1(L"witness/dom.A1.1");
  +                const File witness2(L"witness/dom.A2.1");
  +                //   TODO: A1 doesn't contain duplicate entries
  +                //
  +                //                
CPPUNIT_ASSERT(Compare::compare(FILTERED_A1, witness1));
  +                CPPUNIT_ASSERT(Compare::compare(FILTERED_A2, witness2));
  +        }
  +
  +        //
  +        //   Same test but backslashes instead of forward
  +        //
  +        void test2() {
  +                
DOMConfigurator::configure(LOG4CXX_TEST_STR("input\\xml\\DOMTestCase2.xml"));
  +                common();
  +
  +                ThreadFilter threadFilter;
  +                ISO8601Filter iso8601Filter;
  +
  +                std::vector<Filter *> filters1;
  +
  +                std::vector<Filter *> filters2;
  +                filters2.push_back(&threadFilter);
  +                filters2.push_back(&iso8601Filter);
  +
  +                try
  +                {
  +                        Transformer::transform(TEMP_A1_2, FILTERED_A1_2, 
filters1);
  +                        Transformer::transform(TEMP_A2_2, FILTERED_A2_2, 
filters2);
  +                }
  +                catch(UnexpectedFormatException& e)
  +                {
  +                    std::cout << "UnexpectedFormatException :" << e.what() 
<< std::endl;
  +                        throw;
  +                }
  +
  +                const File witness1(L"witness/dom.A1.2");
  +                const File witness2(L"witness/dom.A2.2");
  +                //   TODO: A1 doesn't contain duplicate entries
  +                //
  +                //                
CPPUNIT_ASSERT(Compare::compare(FILTERED_A1, witness1));
  +                CPPUNIT_ASSERT(Compare::compare(FILTERED_A2, witness2));
  +        }
  +
  +        void test3() {
  +                
DOMConfigurator::configure(LOG4CXX_STR("input/xml/DOMTestCase3.xml"));
  +                LoggerPtr root(Logger::getRootLogger());
  +                FileAppenderPtr 
appender(root->getAppender(LOG4CXX_STR("A1")));
  +                File file(appender->getFile());
  +                std::string osname(file.getOSName());
  +                CPPUNIT_ASSERT_EQUAL((std::string) "e:\\tmp\\temp.A1", 
osname);
  +        }
  +
   
           void common()
           {
  @@ -153,6 +207,11 @@
   const File DOMTestCase::TEMP_A2(L"output/temp.A2");
   const File DOMTestCase::FILTERED_A1(L"output/filtered.A1");
   const File DOMTestCase::FILTERED_A2(L"output/filtered.A2");
  +
  +const File DOMTestCase::TEMP_A1_2(L"output/temp.A1.2");
  +const File DOMTestCase::TEMP_A2_2(L"output/temp.A2.2");
  +const File DOMTestCase::FILTERED_A1_2(L"output/filtered.A1.2");
  +const File DOMTestCase::FILTERED_A2_2(L"output/filtered.A2.2");
   
   
   #endif //HAVE_XML
  
  
  
  1.1                  logging-log4cxx/tests/witness/dom.A1.2
  
  Index: dom.A1.2
  ===================================================================
  DEBUG xml.DOMTestCase - Message 0
  DEBUG xml.DOMTestCase - Message 0
  DEBUG root - Message 0
  INFO  xml.DOMTestCase - Message 1
  INFO  xml.DOMTestCase - Message 1
  INFO  root - Message 1
  WARN  xml.DOMTestCase - Message 2
  WARN  xml.DOMTestCase - Message 2
  WARN  root - Message 2
  ERROR xml.DOMTestCase - Message 3
  ERROR xml.DOMTestCase - Message 3
  ERROR root - Message 3
  FATAL xml.DOMTestCase - Message 4
  FATAL xml.DOMTestCase - Message 4
  FATAL root - Message 4
  
  
  
  1.1                  logging-log4cxx/tests/witness/dom.A2.2
  
  Index: dom.A2.2
  ===================================================================
   [main] DEBUG org.apache.log4j.xml.DOMTestCase - Message 0
   [main] DEBUG root - Message 0
   [main] INFO org.apache.log4j.xml.DOMTestCase - Message 1
   [main] INFO root - Message 1
   [main] WARN org.apache.log4j.xml.DOMTestCase - Message 2
   [main] WARN root - Message 2
   [main] ERROR org.apache.log4j.xml.DOMTestCase - Message 3
   [main] ERROR root - Message 3
   [main] FATAL org.apache.log4j.xml.DOMTestCase - Message 4
   [main] FATAL root - Message 4
  
  
  

Reply via email to