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