logback-dev
Threads by month
- ----- 2026 -----
- July
- June
- May
- April
- March
- February
- January
- ----- 2025 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2024 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2023 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2022 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2021 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2020 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2019 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2018 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2017 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2016 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2015 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2014 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2013 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2012 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2011 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2010 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2009 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2008 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2007 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2006 -----
- December
- November
- October
- September
- August
- July
- June
- May
- 9940 discussions
Add MDC Level Filtering
-----------------------
Key: LBCLASSIC-53
URL: http://jira.qos.ch/browse/LBCLASSIC-53
Project: logback-classic
Issue Type: New Feature
Environment: All
Reporter: Ralph Goers
Assignee: Logback dev list
Attachments: MDCLevelFilter.zip
The company I work for is an Application Service Provider. Requests to the same software running in a single JVM might be on behalf of any one of these companies. In addition, our middle tier contains services that my be called from several different products and are run on behalf of a user of one of these companies. Operationally, we require the ability to be able to filter based on company, product, possibly the end user or several other criteria.
The TurboFilter provided allows individual values for keys in the MDC to be associated with a logging level. So if the MDC contains a key for the company the TurboFilter can be configured with the name of the company and the corresponding logging level. So if CompanyA's level is set to debug while the default level is error, only debug events for CompanyA will be passed on.
--
This message is automatically generated by JIRA.
-
If you think it was sent incorrectly contact one of the administrators: http://jira.qos.ch/secure/Administrators.jspa
-
For more information on JIRA, see: http://www.atlassian.com/software/jira
4
10
svn commit: r1879 - logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/joran
by noreply.ceki@qos.ch 27 Oct '08
by noreply.ceki@qos.ch 27 Oct '08
27 Oct '08
Author: ceki
Date: Mon Oct 27 19:17:16 2008
New Revision: 1879
Modified:
logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/joran/PackageTest.java
Log:
- JoranConfiguratorTest is a JUnit4 test. Adapt accordingly.
Modified: logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/joran/PackageTest.java
==============================================================================
--- logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/joran/PackageTest.java (original)
+++ logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/joran/PackageTest.java Mon Oct 27 19:17:16 2008
@@ -15,7 +15,7 @@
public static Test suite() {
TestSuite suite = new TestSuite();
- suite.addTestSuite(JoranConfiguratorTest.class);
+ suite.addTest(new JUnit4TestAdapter(JoranConfiguratorTest.class));
suite.addTestSuite(EvaluatorJoranTest.class);
return suite;
}
1
0
svn commit: r1878 - in logback/trunk/logback-classic/src: main/java/ch/qos/logback/classic/turbo test/input/joran test/java/ch/qos/logback/classic/joran
by noreply.ceki@qos.ch 27 Oct '08
by noreply.ceki@qos.ch 27 Oct '08
27 Oct '08
Author: ceki
Date: Mon Oct 27 19:09:28 2008
New Revision: 1878
Added:
logback/trunk/logback-classic/src/test/input/joran/turboDynamicThreshold2.xml
Modified:
logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/turbo/DynamicThresholdFilter.java
logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/turbo/MDCFilter.java
logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/turbo/MDCValueLevelPair.java
logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/turbo/MarkerFilter.java
logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/turbo/MatchingFilter.java
logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/turbo/TurboFilter.java
logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/joran/JoranConfiguratorTest.java
Log:
Related to LBCLASSIC-53
- In DynamicThresholdFilter, renamed the OnMatch as OnHigherOrEquals,
and OnMismatch as OnLower, while the new names may not be perfect,
I think they are better than the old ones.
- updated javadocs
- added copyright notice
Modified: logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/turbo/DynamicThresholdFilter.java
==============================================================================
--- logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/turbo/DynamicThresholdFilter.java (original)
+++ logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/turbo/DynamicThresholdFilter.java Mon Oct 27 19:09:28 2008
@@ -10,60 +10,136 @@
import java.util.HashMap;
/**
- * This filter will allow you to associate threshold levels to values found
- * in the MDC. The threshold/value associations are looked up in MDC using
- * a key. This key can be any value specified by the user.
- *
- * <p>TO BE DISCUSSED...
- *
- * <p>This provides very efficient course grained filtering based on things like a
- * product name or a company name that would be associated with requests as they
- * are being processed.
+ * This filter allows for efficient course grained filtering based on criteria
+ * such as product name or company name that would be associated with requests
+ * as they are processed.
*
- * The example configuration below illustrates how debug logging could be
- * enabled for only individual users.
+ * <p> This filter will allow you to associate threshold levels to a key put in
+ * the MDC. This key can be any value specified by the user. Furthermore, you
+ * can pass MDC value and level threshold associations, which are then looked up
+ * to find the level threshold to apply to the current logging request. If no
+ * level threshold could be found, then a 'default' value specified by the user
+ * is applied. We call this value 'levelAssociatedWithMDCValue'.
+ *
+ * <p> If 'levelAssociatedWithMDCValue' is higher or equal to the level of the
+ * current logger request, the
+ * {@link #decide(Marker, Logger, Level, String, Object[], Throwable) decide()}
+ * method returns the value of {@link #getOnHigherOrEqual() onHigherOrEqual},
+ * if it is lower then the value of {@link #getOnLower() onLower} is returned.
+ * Both 'onHigherOrEqual' and 'onLower' can be set by the user. By default,
+ * 'onHigherOrEqual' is set to NEUTRAL and 'onLower' is set to DENY. Thus, if
+ * the current logger request's level is lower than
+ * 'levelAssociatedWithMDCValue', then the request is denied, and if it is
+ * higher or equal, then this filter decides NEUTRAL letting subsequent filters
+ * to make the decision on the fate of the logging request.
+ *
+ * <p> The example below illustrates how logging could be enabled for only
+ * individual users. In this example all events for logger names matching
+ * "com.mycompany" will be logged if they are for 'user1' and at a level higher
+ * than equals to DEBUG, and for 'user2' if they are at a level higher than or
+ * equal to TRACE, and for other users only if they are at level ERROR or
+ * higher. Events issued by loggers other than "com.mycompany" will only be
+ * logged if they are at level ERROR or higher since that is all the root logger
+ * allows.
+ *
+ * <pre>
+ * <configuration>
+ * <appender name="STDOUT"
+ * class="ch.qos.logback.core.ConsoleAppender">
+ * <layout class="ch.qos.logback.classic.PatternLayout">
+ * <Pattern>TEST %d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</Pattern>
+ * </layout>
+ * </appender>
+ *
+ * <turboFilter class="ch.qos.logback.classic.turbo.DynamicThresholdFilter">
+ * <Key>userId</Key>
+ * <DefaultTheshold>ERROR</DefaultTheshold>
+ * <MDCValueLevelPair>
+ * <value>user1</value>
+ * <level>DEBUG</level>
+ * </MDCValueLevelPair>
+ * <MDCValueLevelPair>
+ * <value>user2</value>
+ * <level>TRACE</level>
+ * </MDCValueLevelPair>
+ * </turboFilter>
+ *
+ * <logger name="com.mycompany" level="TRACE"/>
+ *
+ * <root level="ERROR" >
+ * <appender-ref ref="STDOUT" />
+ * </root>
+ * </configuration>
+ * </pre>
+ *
+ * In the next configuration events from user1 and user2 will be logged
+ * regardless of the logger levels. Events for other users and records without a
+ * userid in the MDC will be logged if they are ERROR level messages. With this
+ * configuration, the root level is never checked since DynamicThresholdFilter
+ * will either accept or deny all records.
*
* <pre>
- * <turboFilter class="ch.qos.logback.classic.turbo.DynamicThresholdFilter">
- * <Key>userId</Key>
- * <DefaultTheshold>ERROR</DefaultTheshold>
- * <MDCValueLevelPair>
- * <value>user1</value>
- * <level>DEBUG</level>
- * </MDCValueLevelPair>
- * <MDCValueLevelPair>
- * <value>user2</value>
- * <level>TRACE</level>
- * </MDCValueLevelPair>
- * </turboFilter>
+ * <configuration>
+ * <appender name="STDOUT"
+ * class="ch.qos.logback.core.ConsoleAppender">
+ * <layout class="ch.qos.logback.classic.PatternLayout">
+ * <Pattern>TEST %d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</Pattern>
+ * </layout>
+ * </appender>
+ *
+ * <turboFilter class="ch.qos.logback.classic.turbo.DynamicThresholdFilter">
+ * <Key>userId</Key>
+ * <DefaultTheshold>ERROR</DefaultTheshold>
+ * <OnHigherOrEqual>ACCEPT</OnHigherOrEqual>
+ * <OnLower>DENY</OnLower>
+ * <MDCValueLevelPair>
+ * <value>user1</value>
+ * <level>TRACE</level>
+ * </MDCValueLevelPair>
+ * <MDCValueLevelPair>
+ * <value>user2</value>
+ * <level>TRACE</level>
+ * </MDCValueLevelPair>
+ * </turboFilter>
+ *
+ * <root level="DEBUG" >
+ * <appender-ref ref="STDOUT" />
+ * </root>
+ * </configuration>
* </pre>
*
* @author Raplh Goers
- * @author Ceki Gulcu
+ * @author Ceki Gülcü
*/
public class DynamicThresholdFilter extends TurboFilter {
private Map<String, Level> valueLevelMap = new HashMap<String, Level>();
private Level defaultThreshold = Level.ERROR;
private String key;
+ private FilterReply onHigherOrEqual = FilterReply.NEUTRAL;
+ private FilterReply onLower = FilterReply.DENY;
+
/**
- * The MDC key that will be filtered against
+ * Get the MDC key whose value will be used as a level threshold
*
- * @param key
- * The name of the key.
+ * @return the name of the MDC key.
+ */
+ public String getKey() {
+ return this.key;
+ }
+
+ /**
+ * @see setKey
*/
public void setKey(String key) {
this.key = key;
}
/**
+ * Get the default threshold value when the MDC key is not set.
*
- * @return The name of the key being filtered
+ * @return the default threshold value in the absence of a set MDC key
*/
- public String getKey() {
- return this.key;
- }
-
public Level getDefaultThreshold() {
return defaultThreshold;
}
@@ -73,6 +149,34 @@
}
/**
+ * Get the FilterReply when the effective level is higher or equal to the
+ * level of current logging request
+ *
+ * @return FilterReply
+ */
+ public FilterReply getOnHigherOrEqual() {
+ return onHigherOrEqual;
+ }
+
+ public void setOnHigherOrEqual(FilterReply onHigherOrEqual) {
+ this.onHigherOrEqual = onHigherOrEqual;
+ }
+
+ /**
+ * Get the FilterReply when the effective level is lower than the level of
+ * current logging request
+ *
+ * @return FilterReply
+ */
+ public FilterReply getOnLower() {
+ return onLower;
+ }
+
+ public void setOnLower(FilterReply onLower) {
+ this.onLower = onLower;
+ }
+
+ /**
* Add a new MDCValuePair
*/
public void addMDCValueLevelPair(MDCValueLevelPair mdcValueLevelPair) {
@@ -96,6 +200,15 @@
}
/**
+ * This method first finds the MDC value for 'key'. It then finds the level
+ * threshold associated with this MDC value from the list of MDCValueLevelPair
+ * passed to this filter. This value is stored in a variable called
+ * 'levelAssociatedWithMDCValue'. If it null, then it is set to the
+ *
+ * @{link #defaultThreshold} value.
+ *
+ * If no such value exists, then
+ *
*
* @param marker
* @param logger
@@ -103,16 +216,18 @@
* @param s
* @param objects
* @param throwable
- * @return
+ *
+ * @return FilterReply - this filter's decision
*/
@Override
public FilterReply decide(Marker marker, Logger logger, Level level,
String s, Object[] objects, Throwable throwable) {
+
String mdcValue = MDC.get(this.key);
- if(!isStarted()) {
+ if (!isStarted()) {
return FilterReply.NEUTRAL;
}
-
+
Level levelAssociatedWithMDCValue = null;
if (mdcValue != null) {
levelAssociatedWithMDCValue = valueLevelMap.get(mdcValue);
@@ -121,9 +236,9 @@
levelAssociatedWithMDCValue = defaultThreshold;
}
if (level.isGreaterOrEqual(levelAssociatedWithMDCValue)) {
- return FilterReply.NEUTRAL;
+ return onHigherOrEqual;
} else {
- return FilterReply.DENY;
+ return onLower;
}
}
}
Modified: logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/turbo/MDCFilter.java
==============================================================================
--- logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/turbo/MDCFilter.java (original)
+++ logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/turbo/MDCFilter.java Mon Oct 27 19:09:28 2008
@@ -1,3 +1,12 @@
+/**
+ * Logback: the generic, reliable, fast and flexible logging framework.
+ *
+ * Copyright (C) 2000-2008, QOS.ch
+ *
+ * This library is free software, you can redistribute it and/or modify it under
+ * the terms of the GNU Lesser General Public License as published by the Free
+ * Software Foundation.
+ */
package ch.qos.logback.classic.turbo;
import org.slf4j.MDC;
@@ -10,18 +19,21 @@
/**
* This class allows output for a given MDC value.
*
+ * <p>
* When the given value is identified by this TubroFilter,
* the reply is based on the OnMatch option.
* The information is taken from the MDC. For this TurboFilter to work,
* one must set the key that will be used to
* access the information in the MDC.
*
+ * <p>
* To allow output for the value, set the OnMatch option
* to ACCEPT. To disable output for the given value, set
* the OnMatch option to DENY.
*
+ * <p>
* By default, values of the OnMatch and OnMisMatch
- * options are NEUTRAL.
+ * options are set to NEUTRAL.
*
*
* @author Ceki Gülcü
Modified: logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/turbo/MDCValueLevelPair.java
==============================================================================
--- logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/turbo/MDCValueLevelPair.java (original)
+++ logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/turbo/MDCValueLevelPair.java Mon Oct 27 19:09:28 2008
@@ -1,3 +1,12 @@
+/**
+ * Logback: the generic, reliable, fast and flexible logging framework.
+ *
+ * Copyright (C) 2000-2008, QOS.ch
+ *
+ * This library is free software, you can redistribute it and/or modify it under
+ * the terms of the GNU Lesser General Public License as published by the Free
+ * Software Foundation.
+ */
package ch.qos.logback.classic.turbo;
import ch.qos.logback.classic.Level;
@@ -7,7 +16,7 @@
* Bean pairing an MDC value with a log level.
*
* @author Raplh Goers
- * @author Ceki Gulcu
+ * @author Ceki Gülcü
*/
public class MDCValueLevelPair {
private String value;
Modified: logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/turbo/MarkerFilter.java
==============================================================================
--- logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/turbo/MarkerFilter.java (original)
+++ logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/turbo/MarkerFilter.java Mon Oct 27 19:09:28 2008
@@ -1,3 +1,12 @@
+/**
+ * Logback: the generic, reliable, fast and flexible logging framework.
+ *
+ * Copyright (C) 2000-2008, QOS.ch
+ *
+ * This library is free software, you can redistribute it and/or modify it under
+ * the terms of the GNU Lesser General Public License as published by the Free
+ * Software Foundation.
+ */
package ch.qos.logback.classic.turbo;
import org.slf4j.Marker;
@@ -13,11 +22,11 @@
*/
public class MarkerFilter extends MatchingFilter {
- Marker marker2Match;
+ Marker markerToMatch;
@Override
public void start() {
- if(marker2Match != null) {
+ if(markerToMatch != null) {
super.start();
} else {
addError("The marker property must be set for ["+getName()+"]");
@@ -34,7 +43,7 @@
return onMismatch;
}
- if(marker2Match.contains(marker)) {
+ if(markerToMatch.contains(marker)) {
return onMatch;
} else {
return onMismatch;
@@ -44,11 +53,11 @@
/**
* The marker to match in the event.
*
- * @param marker2Match
+ * @param markerToMatch
*/
public void setMarker(String markerStr) {
if(markerStr != null) {
- this.marker2Match = MarkerFactory.getMarker(markerStr);
+ this.markerToMatch = MarkerFactory.getMarker(markerStr);
}
}
}
Modified: logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/turbo/MatchingFilter.java
==============================================================================
--- logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/turbo/MatchingFilter.java (original)
+++ logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/turbo/MatchingFilter.java Mon Oct 27 19:09:28 2008
@@ -1,3 +1,12 @@
+/**
+ * Logback: the generic, reliable, fast and flexible logging framework.
+ *
+ * Copyright (C) 2000-2008, QOS.ch
+ *
+ * This library is free software, you can redistribute it and/or modify it under
+ * the terms of the GNU Lesser General Public License as published by the Free
+ * Software Foundation.
+ */
package ch.qos.logback.classic.turbo;
import ch.qos.logback.core.spi.FilterReply;
Modified: logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/turbo/TurboFilter.java
==============================================================================
--- logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/turbo/TurboFilter.java (original)
+++ logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/turbo/TurboFilter.java Mon Oct 27 19:09:28 2008
@@ -1,3 +1,12 @@
+/**
+ * Logback: the generic, reliable, fast and flexible logging framework.
+ *
+ * Copyright (C) 2000-2008, QOS.ch
+ *
+ * This library is free software, you can redistribute it and/or modify it under
+ * the terms of the GNU Lesser General Public License as published by the Free
+ * Software Foundation.
+ */
package ch.qos.logback.classic.turbo;
import org.slf4j.Marker;
Added: logback/trunk/logback-classic/src/test/input/joran/turboDynamicThreshold2.xml
==============================================================================
--- (empty file)
+++ logback/trunk/logback-classic/src/test/input/joran/turboDynamicThreshold2.xml Mon Oct 27 19:09:28 2008
@@ -0,0 +1,32 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE configuration>
+
+<configuration>
+
+ <turboFilter
+ class="ch.qos.logback.classic.turbo.DynamicThresholdFilter">
+ <Key>userId</Key>
+ <DefaultThreshold>ERROR</DefaultThreshold>
+ <OnMatch>ACCEPT</OnMatch>
+ <OnMismatch>DENY</OnMismatch>
+ <MDCValueLevelPair>
+ <value>user1</value>
+ <level>DEBUG</level>
+ </MDCValueLevelPair>
+ <MDCValueLevelPair>
+ <value>user2</value>
+ <level>TRACE</level>
+ </MDCValueLevelPair>
+
+ </turboFilter>
+
+
+ <appender name="LIST"
+ class="ch.qos.logback.core.read.ListAppender">
+ </appender>
+
+ <root>
+ <level value="DEBUG" />
+ <appender-ref ref="LIST" />
+ </root>
+</configuration>
Modified: logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/joran/JoranConfiguratorTest.java
==============================================================================
--- logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/joran/JoranConfiguratorTest.java (original)
+++ logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/joran/JoranConfiguratorTest.java Mon Oct 27 19:09:28 2008
@@ -1,16 +1,19 @@
/**
- * LOGBack: the generic, reliable, fast and flexible logging framework.
- *
- * Copyright (C) 1999-2006, QOS.ch
- *
- * This library is free software, you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public License as
- * published by the Free Software Foundation.
+ * Logback: the generic, reliable, fast and flexible logging framework.
+ *
+ * Copyright (C) 2000-2008, QOS.ch
+ *
+ * This library is free software, you can redistribute it and/or modify it under
+ * the terms of the GNU Lesser General Public License as published by the Free
+ * Software Foundation.
*/
package ch.qos.logback.classic.joran;
-import junit.framework.TestCase;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertTrue;
+import org.junit.Test;
import org.slf4j.MDC;
import ch.qos.logback.classic.Level;
@@ -26,20 +29,22 @@
import ch.qos.logback.core.read.ListAppender;
import ch.qos.logback.core.util.StatusPrinter;
-public class JoranConfiguratorTest extends TestCase {
+public class JoranConfiguratorTest {
- public JoranConfiguratorTest(String name) {
- super(name);
- }
-
- public void testSimpleList() throws JoranException {
+ LoggerContext loggerContext = new LoggerContext();
+ Logger logger = loggerContext.getLogger(this.getClass().getName());
+ Logger root = loggerContext.getLogger(LoggerContext.ROOT_NAME);
+
+ void configure(String file) throws JoranException {
JoranConfigurator jc = new JoranConfigurator();
- LoggerContext loggerContext = new LoggerContext();
jc.setContext(loggerContext);
- jc.doConfigure(TeztConstants.TEST_DIR_PREFIX + "input/joran/simpleList.xml");
+ jc.doConfigure(file);
+ }
+
+ @Test
+ public void testSimpleList() throws JoranException {
+ configure(TeztConstants.TEST_DIR_PREFIX + "input/joran/simpleList.xml");
- //StatusPrinter.print(loggerContext.getStatusManager());
-
Logger logger = loggerContext.getLogger(this.getClass().getName());
Logger root = loggerContext.getLogger(LoggerContext.ROOT_NAME);
ListAppender listAppender = (ListAppender) root.getAppender("LIST");
@@ -50,158 +55,152 @@
LoggingEvent le = (LoggingEvent) listAppender.list.get(0);
assertEquals(msg, le.getMessage());
}
-
- public void testLevel() throws JoranException {
- JoranConfigurator jc = new JoranConfigurator();
- LoggerContext loggerContext = new LoggerContext();
- jc.setContext(loggerContext);
- jc.doConfigure(TeztConstants.TEST_DIR_PREFIX + "input/joran/simpleLevel.xml");
- Logger logger = loggerContext.getLogger(this.getClass().getName());
- Logger root = loggerContext.getLogger(LoggerContext.ROOT_NAME);
+ @Test
+ public void testLevel() throws JoranException {
+ configure(TeztConstants.TEST_DIR_PREFIX + "input/joran/simpleLevel.xml");
ListAppender listAppender = (ListAppender) root.getAppender("LIST");
assertEquals(0, listAppender.list.size());
String msg = "hello world";
logger.debug(msg);
assertEquals(0, listAppender.list.size());
}
-
+
+ @Test
public void testStatusListener() throws JoranException {
- JoranConfigurator jc = new JoranConfigurator();
- LoggerContext loggerContext = new LoggerContext();
- jc.setContext(loggerContext);
- jc.doConfigure(TeztConstants.TEST_DIR_PREFIX + "input/joran/statusListener.xml");
-
+ configure(TeztConstants.TEST_DIR_PREFIX + "input/joran/statusListener.xml");
+
StatusPrinter.print(loggerContext);
}
-
+
+ @Test
public void testEval() throws JoranException {
- JoranConfigurator jc = new JoranConfigurator();
- LoggerContext loggerContext = new LoggerContext();
- jc.setContext(loggerContext);
- jc.doConfigure(TeztConstants.TEST_DIR_PREFIX + "input/joran/callerData.xml");
+ configure(TeztConstants.TEST_DIR_PREFIX + "input/joran/callerData.xml");
- //StatusPrinter.print(loggerContext);
-
- Logger logger = loggerContext.getLogger(this.getClass().getName());
String msg = "hello world";
logger.debug("toto");
logger.debug(msg);
-
- StringListAppender slAppender = (StringListAppender) loggerContext.getLogger("root").getAppender("STR_LIST");
+
+ StringListAppender slAppender = (StringListAppender) loggerContext
+ .getLogger("root").getAppender("STR_LIST");
assertNotNull(slAppender);
assertEquals(2, slAppender.strList.size());
assertTrue(slAppender.strList.get(0).contains(" DEBUG - toto"));
-
+
String str1 = slAppender.strList.get(1);
assertTrue(str1.contains("Caller+0"));
assertTrue(str1.contains(" DEBUG - hello world"));
}
-
+
+ @Test
public void testTurboFilter() throws JoranException {
- //Although this test uses turbo filters, it only checks
- //that Joran can see the xml element and create
- //and place the relevant object correctly.
- JoranConfigurator jc = new JoranConfigurator();
- LoggerContext loggerContext = new LoggerContext();
- jc.setContext(loggerContext);
- jc.doConfigure(TeztConstants.TEST_DIR_PREFIX + "input/joran/turbo.xml");
+ // Although this test uses turbo filters, it only checks
+ // that Joran can see the xml element and create
+ // and place the relevant object correctly.
+ configure(TeztConstants.TEST_DIR_PREFIX + "input/joran/turbo.xml");
- //StatusPrinter.print(loggerContext.getStatusManager());
-
TurboFilter filter = loggerContext.getFirstTurboFilter();
assertTrue(filter instanceof NOPTurboFilter);
}
-
+
+ @Test
public void testTurboFilterWithStringList() throws JoranException {
- //Although this test uses turbo filters, it only checks
- //that Joran can see <user> elements, and behave correctly
- //that is call the addUser method and pass the correct values
- //to that method.
- JoranConfigurator jc = new JoranConfigurator();
- LoggerContext loggerContext = new LoggerContext();
- jc.setContext(loggerContext);
- jc.doConfigure(TeztConstants.TEST_DIR_PREFIX + "input/joran/turbo2.xml");
+ // Although this test uses turbo filters, it only checks
+ // that Joran can see <user> elements, and behave correctly
+ // that is call the addUser method and pass the correct values
+ // to that method.
+ configure(TeztConstants.TEST_DIR_PREFIX + "input/joran/turbo2.xml");
+
+ // StatusPrinter.print(loggerContext.getStatusManager());
- //StatusPrinter.print(loggerContext.getStatusManager());
-
TurboFilter filter = loggerContext.getFirstTurboFilter();
assertTrue(filter instanceof DebugUsersTurboFilter);
- DebugUsersTurboFilter dutf = (DebugUsersTurboFilter)filter;
+ DebugUsersTurboFilter dutf = (DebugUsersTurboFilter) filter;
assertEquals(2, dutf.getUsers().size());
}
-
+ @Test
public void testLevelFilter() throws JoranException {
- JoranConfigurator jc = new JoranConfigurator();
- LoggerContext loggerContext = new LoggerContext();
- jc.setContext(loggerContext);
- jc.doConfigure(TeztConstants.TEST_DIR_PREFIX
- + "input/joran/levelFilter.xml");
+ configure(TeztConstants.TEST_DIR_PREFIX + "input/joran/levelFilter.xml");
StatusPrinter.print(loggerContext);
- Logger logger = loggerContext.getLogger(this.getClass().getName());
logger.warn("hello");
logger.error("to be ignored");
-
+
@SuppressWarnings("unchecked")
- ListAppender<LoggingEvent> listAppender = (ListAppender) loggerContext
- .getLogger("root").getAppender("LIST");
-
+ ListAppender<LoggingEvent> listAppender = (ListAppender) root
+ .getAppender("LIST");
+
assertNotNull(listAppender);
assertEquals(1, listAppender.list.size());
LoggingEvent back = listAppender.list.get(0);
assertEquals(Level.WARN, back.getLevel());
assertEquals("hello", back.getMessage());
}
-
+
+ @Test
public void testEvaluatorFilter() throws JoranException {
- JoranConfigurator jc = new JoranConfigurator();
- LoggerContext loggerContext = new LoggerContext();
- jc.setContext(loggerContext);
- jc.doConfigure(TeztConstants.TEST_DIR_PREFIX
- + "input/joran/evaluatorFilter.xml");
+ configure(TeztConstants.TEST_DIR_PREFIX + "input/joran/evaluatorFilter.xml");
StatusPrinter.print(loggerContext);
- Logger logger = loggerContext.getLogger(this.getClass().getName());
logger.warn("hello");
logger.error("to be ignored");
-
+
@SuppressWarnings("unchecked")
- ListAppender<LoggingEvent> listAppender = (ListAppender) loggerContext
- .getLogger("root").getAppender("LIST");
-
+ ListAppender<LoggingEvent> listAppender = (ListAppender) root
+ .getAppender("LIST");
+
assertNotNull(listAppender);
assertEquals(1, listAppender.list.size());
LoggingEvent back = listAppender.list.get(0);
assertEquals(Level.WARN, back.getLevel());
assertEquals("hello", back.getMessage());
}
-
- public void testTurboDynamicThreshold() throws JoranException {
- JoranConfigurator jc = new JoranConfigurator();
- LoggerContext loggerContext = new LoggerContext();
- jc.setContext(loggerContext);
- jc.doConfigure(TeztConstants.TEST_DIR_PREFIX + "input/joran/turboDynamicThreshold.xml");
- StatusPrinter.print(loggerContext.getStatusManager());
-
- Logger logger = loggerContext.getLogger(this.getClass().getName());
- Logger root = loggerContext.getLogger(LoggerContext.ROOT_NAME);
+ @Test
+ public void testTurboDynamicThreshold() throws JoranException {
+ configure(TeztConstants.TEST_DIR_PREFIX
+ + "input/joran/turboDynamicThreshold.xml");
+
ListAppender listAppender = (ListAppender) root.getAppender("LIST");
assertEquals(0, listAppender.list.size());
-
+
// this one should be denied
MDC.put("userId", "user1");
logger.debug("hello user1");
// this one should log
MDC.put("userId", "user2");
- logger.debug("hello user2");
-
+ logger.debug("hello user2");
+
assertEquals(1, listAppender.list.size());
LoggingEvent le = (LoggingEvent) listAppender.list.get(0);
assertEquals("hello user2", le.getMessage());
}
+
+ @Test
+ public void testTurboDynamicThreshold2() throws JoranException {
+ configure(TeztConstants.TEST_DIR_PREFIX
+ + "input/joran/turboDynamicThreshold2.xml");
+
+ ListAppender listAppender = (ListAppender) root.getAppender("LIST");
+ assertEquals(0, listAppender.list.size());
+
+ // this one should log
+ MDC.put("userId", "user1");
+ logger.debug("hello user1");
+ // this one should log
+ MDC.put("userId", "user2");
+ logger.debug("hello user2");
+ // this one should fail
+ MDC.put("userId", "user3");
+ logger.debug("hello user3");
+
+ assertEquals(2, listAppender.list.size());
+ LoggingEvent le = (LoggingEvent) listAppender.list.get(0);
+ assertEquals("hello user1", le.getMessage());
+ le = (LoggingEvent) listAppender.list.get(1);
+ assertEquals("hello user2", le.getMessage());
+ }
}
1
0
Author: ceki
Date: Mon Oct 27 16:59:19 2008
New Revision: 1877
Modified:
logback/trunk/codeStyle.xml
Log:
Don't allow formatting within <pre> and <html> in javadocs
Modified: logback/trunk/codeStyle.xml
==============================================================================
--- logback/trunk/codeStyle.xml (original)
+++ logback/trunk/codeStyle.xml Mon Oct 27 16:59:19 2008
@@ -1,251 +1,264 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<profiles version="10">
-<profile name="logbackCodeStyle" version="10">
-<setting id="org.eclipse.jdt.core.formatter.align_type_members_on_columns" value="false"/>
-<setting id="org.eclipse.jdt.core.formatter.alignment_for_arguments_in_allocation_expression" value="16"/>
-<setting id="org.eclipse.jdt.core.formatter.alignment_for_arguments_in_enum_constant" value="16"/>
-<setting id="org.eclipse.jdt.core.formatter.alignment_for_arguments_in_explicit_constructor_call" value="16"/>
-<setting id="org.eclipse.jdt.core.formatter.alignment_for_arguments_in_method_invocation" value="16"/>
-<setting id="org.eclipse.jdt.core.formatter.alignment_for_arguments_in_qualified_allocation_expression" value="16"/>
-<setting id="org.eclipse.jdt.core.formatter.alignment_for_assignment" value="0"/>
-<setting id="org.eclipse.jdt.core.formatter.alignment_for_binary_expression" value="16"/>
-<setting id="org.eclipse.jdt.core.formatter.alignment_for_compact_if" value="16"/>
-<setting id="org.eclipse.jdt.core.formatter.alignment_for_conditional_expression" value="80"/>
-<setting id="org.eclipse.jdt.core.formatter.alignment_for_enum_constants" value="0"/>
-<setting id="org.eclipse.jdt.core.formatter.alignment_for_expressions_in_array_initializer" value="16"/>
-<setting id="org.eclipse.jdt.core.formatter.alignment_for_multiple_fields" value="16"/>
-<setting id="org.eclipse.jdt.core.formatter.alignment_for_parameters_in_constructor_declaration" value="16"/>
-<setting id="org.eclipse.jdt.core.formatter.alignment_for_parameters_in_method_declaration" value="16"/>
-<setting id="org.eclipse.jdt.core.formatter.alignment_for_selector_in_method_invocation" value="16"/>
-<setting id="org.eclipse.jdt.core.formatter.alignment_for_superclass_in_type_declaration" value="16"/>
-<setting id="org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_enum_declaration" value="16"/>
-<setting id="org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_type_declaration" value="16"/>
-<setting id="org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_constructor_declaration" value="16"/>
-<setting id="org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_method_declaration" value="16"/>
-<setting id="org.eclipse.jdt.core.formatter.blank_lines_after_imports" value="1"/>
-<setting id="org.eclipse.jdt.core.formatter.blank_lines_after_package" value="1"/>
-<setting id="org.eclipse.jdt.core.formatter.blank_lines_before_field" value="0"/>
-<setting id="org.eclipse.jdt.core.formatter.blank_lines_before_first_class_body_declaration" value="0"/>
-<setting id="org.eclipse.jdt.core.formatter.blank_lines_before_imports" value="1"/>
-<setting id="org.eclipse.jdt.core.formatter.blank_lines_before_member_type" value="1"/>
-<setting id="org.eclipse.jdt.core.formatter.blank_lines_before_method" value="1"/>
-<setting id="org.eclipse.jdt.core.formatter.blank_lines_before_new_chunk" value="1"/>
-<setting id="org.eclipse.jdt.core.formatter.blank_lines_before_package" value="0"/>
-<setting id="org.eclipse.jdt.core.formatter.blank_lines_between_type_declarations" value="1"/>
-<setting id="org.eclipse.jdt.core.formatter.brace_position_for_annotation_type_declaration" value="end_of_line"/>
-<setting id="org.eclipse.jdt.core.formatter.brace_position_for_anonymous_type_declaration" value="end_of_line"/>
-<setting id="org.eclipse.jdt.core.formatter.brace_position_for_array_initializer" value="end_of_line"/>
-<setting id="org.eclipse.jdt.core.formatter.brace_position_for_block" value="end_of_line"/>
-<setting id="org.eclipse.jdt.core.formatter.brace_position_for_block_in_case" value="end_of_line"/>
-<setting id="org.eclipse.jdt.core.formatter.brace_position_for_constructor_declaration" value="end_of_line"/>
-<setting id="org.eclipse.jdt.core.formatter.brace_position_for_enum_constant" value="end_of_line"/>
-<setting id="org.eclipse.jdt.core.formatter.brace_position_for_enum_declaration" value="end_of_line"/>
-<setting id="org.eclipse.jdt.core.formatter.brace_position_for_method_declaration" value="end_of_line"/>
-<setting id="org.eclipse.jdt.core.formatter.brace_position_for_switch" value="end_of_line"/>
-<setting id="org.eclipse.jdt.core.formatter.brace_position_for_type_declaration" value="end_of_line"/>
-<setting id="org.eclipse.jdt.core.formatter.comment.clear_blank_lines" value="false"/>
-<setting id="org.eclipse.jdt.core.formatter.comment.format_comments" value="true"/>
-<setting id="org.eclipse.jdt.core.formatter.comment.format_header" value="false"/>
-<setting id="org.eclipse.jdt.core.formatter.comment.format_html" value="true"/>
-<setting id="org.eclipse.jdt.core.formatter.comment.format_source_code" value="true"/>
-<setting id="org.eclipse.jdt.core.formatter.comment.indent_parameter_description" value="true"/>
-<setting id="org.eclipse.jdt.core.formatter.comment.indent_root_tags" value="true"/>
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<profiles version="11">
+<profile kind="CodeFormatterProfile" name="slf4jCodeStyle" version="11">
<setting id="org.eclipse.jdt.core.formatter.comment.insert_new_line_before_root_tags" value="insert"/>
-<setting id="org.eclipse.jdt.core.formatter.comment.insert_new_line_for_parameter" value="insert"/>
-<setting id="org.eclipse.jdt.core.formatter.comment.line_length" value="80"/>
-<setting id="org.eclipse.jdt.core.formatter.compact_else_if" value="true"/>
-<setting id="org.eclipse.jdt.core.formatter.continuation_indentation" value="2"/>
-<setting id="org.eclipse.jdt.core.formatter.continuation_indentation_for_array_initializer" value="2"/>
-<setting id="org.eclipse.jdt.core.formatter.format_guardian_clause_on_one_line" value="false"/>
-<setting id="org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_annotation_declaration_header" value="true"/>
-<setting id="org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_constant_header" value="true"/>
-<setting id="org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_declaration_header" value="true"/>
-<setting id="org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_type_header" value="true"/>
-<setting id="org.eclipse.jdt.core.formatter.indent_breaks_compare_to_cases" value="true"/>
-<setting id="org.eclipse.jdt.core.formatter.indent_empty_lines" value="false"/>
-<setting id="org.eclipse.jdt.core.formatter.indent_statements_compare_to_block" value="true"/>
-<setting id="org.eclipse.jdt.core.formatter.indent_statements_compare_to_body" value="true"/>
-<setting id="org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_cases" value="true"/>
-<setting id="org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_switch" value="false"/>
-<setting id="org.eclipse.jdt.core.formatter.indentation.size" value="8"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_new_line_after_annotation" value="insert"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_new_line_after_opening_brace_in_array_initializer" value="do not insert"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_new_line_at_end_of_file_if_missing" value="do not insert"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_new_line_before_catch_in_try_statement" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_annotation" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_parameters" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_type_declaration" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_arguments" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.brace_position_for_anonymous_type_declaration" value="end_of_line"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_colon_in_case" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_brace_in_array_initializer" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_new_line_in_empty_annotation_declaration" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_new_line_before_closing_brace_in_array_initializer" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_annotation" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.blank_lines_before_field" value="0"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_while" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_annotation_type_member_declaration" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_new_line_before_else_in_if_statement" value="do not insert"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_new_line_before_finally_in_try_statement" value="do not insert"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_new_line_before_while_in_do_statement" value="do not insert"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_new_line_in_empty_annotation_declaration" value="insert"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_new_line_in_empty_anonymous_type_declaration" value="insert"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_new_line_in_empty_block" value="insert"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_constant" value="insert"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_declaration" value="insert"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_new_line_in_empty_method_body" value="insert"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_new_line_in_empty_type_declaration" value="insert"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_space_after_and_in_type_parameter" value="insert"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_space_after_assignment_operator" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_prefix_operator" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.keep_else_statement_on_same_line" value="false"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_ellipsis" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.comment.insert_new_line_for_parameter" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_annotation_type_declaration" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.indent_breaks_compare_to_cases" value="true"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation" value="do not insert"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation_type_declaration" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.alignment_for_multiple_fields" value="16"/>
+<setting id="org.eclipse.jdt.core.formatter.alignment_for_expressions_in_array_initializer" value="16"/>
+<setting id="org.eclipse.jdt.core.formatter.alignment_for_conditional_expression" value="80"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_for" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_binary_operator" value="insert"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_arguments" value="insert"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_parameters" value="insert"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_space_after_closing_brace_in_block" value="insert"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_space_after_closing_paren_in_cast" value="insert"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_space_after_colon_in_assert" value="insert"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_space_after_colon_in_case" value="insert"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_space_after_colon_in_conditional" value="insert"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_space_after_colon_in_for" value="insert"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_space_after_colon_in_labeled_statement" value="insert"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_allocation_expression" value="insert"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_annotation" value="insert"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_array_initializer" value="insert"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_parameters" value="insert"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_throws" value="insert"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_constant_arguments" value="insert"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_declarations" value="insert"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_explicitconstructorcall_arguments" value="insert"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_increments" value="insert"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_inits" value="insert"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_parameters" value="insert"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_throws" value="insert"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_invocation_arguments" value="insert"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_field_declarations" value="insert"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_local_declarations" value="insert"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_parameterized_type_reference" value="insert"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_superinterfaces" value="insert"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_arguments" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_question_in_wildcard" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.brace_position_for_array_initializer" value="end_of_line"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_enum_constant" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_new_line_before_finally_in_try_statement" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_new_line_before_catch_in_try_statement" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_while" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.blank_lines_after_package" value="1"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_parameters" value="insert"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_space_after_ellipsis" value="insert"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_parameterized_type_reference" value="do not insert"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_arguments" value="do not insert"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_parameters" value="do not insert"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_brace_in_array_initializer" value="insert"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_allocation_expression" value="do not insert"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_reference" value="do not insert"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_annotation" value="do not insert"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_cast" value="do not insert"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_catch" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.continuation_indentation" value="2"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_postfix_operator" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.alignment_for_arguments_in_method_invocation" value="16"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_arguments" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_superinterfaces" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.blank_lines_before_new_chunk" value="1"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_binary_operator" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.blank_lines_before_package" value="0"/>
+<setting id="org.eclipse.jdt.core.compiler.source" value="1.5"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_constant_arguments" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_constructor_declaration" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_arguments" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.comment.format_line_comments" value="true"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_declarations" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_block" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.alignment_for_arguments_in_explicit_constructor_call" value="16"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_invocation_arguments" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.blank_lines_before_member_type" value="1"/>
+<setting id="org.eclipse.jdt.core.formatter.align_type_members_on_columns" value="false"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_enum_constant" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_for" value="do not insert"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_if" value="do not insert"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_declaration" value="do not insert"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_invocation" value="do not insert"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_parenthesized_expression" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_method_declaration" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.alignment_for_selector_in_method_invocation" value="16"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_switch" value="do not insert"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_synchronized" value="do not insert"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_while" value="do not insert"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_space_after_postfix_operator" value="do not insert"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_space_after_prefix_operator" value="do not insert"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_space_after_question_in_conditional" value="insert"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_space_after_question_in_wildcard" value="do not insert"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_for" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_unary_operator" value="do not insert"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_space_before_and_in_type_parameter" value="insert"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_space_before_assignment_operator" value="insert"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_space_before_at_in_annotation_type_declaration" value="insert"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_space_before_binary_operator" value="insert"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_parameterized_type_reference" value="do not insert"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_arguments" value="do not insert"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_parameters" value="do not insert"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_brace_in_array_initializer" value="insert"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_allocation_expression" value="do not insert"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_reference" value="do not insert"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_annotation" value="do not insert"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_cast" value="do not insert"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_catch" value="do not insert"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_constructor_declaration" value="do not insert"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_enum_constant" value="do not insert"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_for" value="do not insert"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_if" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_colon_in_case" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.comment.indent_parameter_description" value="true"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_declaration" value="do not insert"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_invocation" value="do not insert"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_parenthesized_expression" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_switch" value="do not insert"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_synchronized" value="do not insert"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_while" value="do not insert"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_space_before_colon_in_assert" value="insert"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_space_before_colon_in_case" value="do not insert"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_space_before_colon_in_conditional" value="insert"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_space_before_colon_in_default" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_declaration" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_new_line_after_annotation" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_parameters" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_new_line_in_empty_type_declaration" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_block_comment" value="false"/>
+<setting id="org.eclipse.jdt.core.formatter.lineSplit" value="80"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_if" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_between_brackets_in_array_type_reference" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_parenthesized_expression" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_explicitconstructorcall_arguments" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_constructor_declaration" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.blank_lines_before_first_class_body_declaration" value="0"/>
+<setting id="org.eclipse.jdt.core.formatter.indentation.size" value="8"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_declaration" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_enum_constant" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.alignment_for_superclass_in_type_declaration" value="16"/>
+<setting id="org.eclipse.jdt.core.formatter.alignment_for_assignment" value="0"/>
+<setting id="org.eclipse.jdt.core.compiler.problem.assertIdentifier" value="error"/>
+<setting id="org.eclipse.jdt.core.formatter.tabulation.char" value="space"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_parameters" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_prefix_operator" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.indent_statements_compare_to_body" value="true"/>
+<setting id="org.eclipse.jdt.core.formatter.blank_lines_before_method" value="1"/>
+<setting id="org.eclipse.jdt.core.formatter.format_guardian_clause_on_one_line" value="false"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_colon_in_for" value="insert"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_space_before_colon_in_labeled_statement" value="do not insert"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_allocation_expression" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_cast" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.alignment_for_parameters_in_constructor_declaration" value="16"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_colon_in_labeled_statement" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.brace_position_for_annotation_type_declaration" value="end_of_line"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_new_line_in_empty_method_body" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_invocation" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_allocation_expression" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_constant" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_annotation" value="do not insert"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_array_initializer" value="do not insert"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_parameters" value="do not insert"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_throws" value="do not insert"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_constant_arguments" value="do not insert"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_declarations" value="do not insert"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_explicitconstructorcall_arguments" value="do not insert"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_increments" value="do not insert"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_inits" value="do not insert"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_parameters" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation_type_declaration" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_throws" value="do not insert"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_invocation_arguments" value="do not insert"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_field_declarations" value="do not insert"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_local_declarations" value="do not insert"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_parameterized_type_reference" value="do not insert"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_superinterfaces" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_if" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.brace_position_for_switch" value="end_of_line"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_throws" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_return" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_question_in_conditional" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_question_in_wildcard" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_allocation_expression" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_throw" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_arguments" value="do not insert"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_parameters" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.compiler.problem.enumIdentifier" value="error"/>
+<setting id="org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_switch" value="false"/>
+<setting id="org.eclipse.jdt.core.formatter.brace_position_for_block" value="end_of_line"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_ellipsis" value="do not insert"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_parameterized_type_reference" value="do not insert"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_arguments" value="do not insert"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_parameters" value="do not insert"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_annotation_type_declaration" value="insert"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_anonymous_type_declaration" value="insert"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_array_initializer" value="insert"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_block" value="insert"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_constructor_declaration" value="insert"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_constant" value="insert"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_declaration" value="insert"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_method_declaration" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_inits" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.brace_position_for_method_declaration" value="end_of_line"/>
+<setting id="org.eclipse.jdt.core.formatter.compact_else_if" value="true"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_array_initializer" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_increments" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_reference" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.brace_position_for_enum_constant" value="end_of_line"/>
+<setting id="org.eclipse.jdt.core.formatter.comment.indent_root_tags" value="true"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_declarations" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_explicitconstructorcall_arguments" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_switch" value="insert"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_type_declaration" value="insert"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_allocation_expression" value="do not insert"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_reference" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_superinterfaces" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_parameters" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_allocation_expression" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.tabulation.size" value="2"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_type_reference" value="do not insert"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation" value="do not insert"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation_type_member_declaration" value="do not insert"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_catch" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_new_line_after_opening_brace_in_array_initializer" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_closing_brace_in_block" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_reference" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_constant" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_arguments" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_constructor_declaration" value="do not insert"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_enum_constant" value="do not insert"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_for" value="insert"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_if" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_if" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_throws" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_javadoc_comment" value="false"/>
+<setting id="org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_constructor_declaration" value="16"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_assignment_operator" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_assignment_operator" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.indent_empty_lines" value="false"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_synchronized" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_closing_paren_in_cast" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_parameters" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.brace_position_for_block_in_case" value="end_of_line"/>
+<setting id="org.eclipse.jdt.core.formatter.number_of_empty_lines_to_preserve" value="1"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_declaration" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_catch" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_constructor_declaration" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_invocation" value="do not insert"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_parenthesized_expression" value="do not insert"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_switch" value="insert"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_synchronized" value="insert"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_while" value="insert"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_return" value="insert"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_space_before_postfix_operator" value="do not insert"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_space_before_prefix_operator" value="do not insert"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_space_before_question_in_conditional" value="insert"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_space_before_question_in_wildcard" value="do not insert"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_space_before_semicolon" value="do not insert"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_for" value="do not insert"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_space_before_unary_operator" value="do not insert"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_space_between_brackets_in_array_type_reference" value="do not insert"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_space_between_empty_braces_in_array_initializer" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_reference" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_and_in_type_parameter" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.alignment_for_arguments_in_qualified_allocation_expression" value="16"/>
+<setting id="org.eclipse.jdt.core.compiler.compliance" value="1.5"/>
+<setting id="org.eclipse.jdt.core.formatter.continuation_indentation_for_array_initializer" value="2"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_between_empty_brackets_in_array_allocation_expression" value="do not insert"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_annotation_type_member_declaration" value="do not insert"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_constructor_declaration" value="do not insert"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_enum_constant" value="do not insert"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_declaration" value="do not insert"/>
-<setting id="org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_invocation" value="do not insert"/>
-<setting id="org.eclipse.jdt.core.formatter.keep_else_statement_on_same_line" value="false"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_at_in_annotation_type_declaration" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.alignment_for_arguments_in_allocation_expression" value="16"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_cast" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_unary_operator" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_parameterized_type_reference" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_anonymous_type_declaration" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.keep_empty_array_initializer_on_one_line" value="false"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_declaration" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.keep_imple_if_on_one_line" value="false"/>
-<setting id="org.eclipse.jdt.core.formatter.keep_then_statement_on_same_line" value="false"/>
-<setting id="org.eclipse.jdt.core.formatter.lineSplit" value="80"/>
-<setting id="org.eclipse.jdt.core.formatter.number_of_blank_lines_at_beginning_of_method_body" value="0"/>
-<setting id="org.eclipse.jdt.core.formatter.number_of_empty_lines_to_preserve" value="1"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_parameters" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_parameters" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_new_line_at_end_of_file_if_missing" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_colon_in_for" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_colon_in_labeled_statement" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_type_declaration" value="16"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_parameterized_type_reference" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.alignment_for_binary_expression" value="16"/>
+<setting id="org.eclipse.jdt.core.formatter.brace_position_for_enum_declaration" value="end_of_line"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_while" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.put_empty_statement_on_new_line" value="true"/>
-<setting id="org.eclipse.jdt.core.formatter.tabulation.char" value="space"/>
-<setting id="org.eclipse.jdt.core.formatter.tabulation.size" value="2"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_parameters" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_invocation" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_new_line_before_while_in_do_statement" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.alignment_for_arguments_in_enum_constant" value="16"/>
+<setting id="org.eclipse.jdt.core.formatter.comment.format_javadoc_comments" value="true"/>
+<setting id="org.eclipse.jdt.core.formatter.comment.line_length" value="80"/>
+<setting id="org.eclipse.jdt.core.formatter.blank_lines_between_import_groups" value="1"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_constant_arguments" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_semicolon" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.brace_position_for_constructor_declaration" value="end_of_line"/>
+<setting id="org.eclipse.jdt.core.formatter.number_of_blank_lines_at_beginning_of_method_body" value="0"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_colon_in_conditional" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_type_header" value="true"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation_type_member_declaration" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.wrap_before_binary_operator" value="true"/>
+<setting id="org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_declaration_header" value="true"/>
+<setting id="org.eclipse.jdt.core.formatter.blank_lines_between_type_declarations" value="1"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_synchronized" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.indent_statements_compare_to_block" value="true"/>
+<setting id="org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_enum_declaration" value="16"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_question_in_conditional" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_field_declarations" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.alignment_for_compact_if" value="16"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_inits" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_cases" value="true"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_array_initializer" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_colon_in_default" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_and_in_type_parameter" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_constructor_declaration" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_colon_in_assert" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.blank_lines_before_imports" value="1"/>
+<setting id="org.eclipse.jdt.core.formatter.comment.format_html" value="false"/>
+<setting id="org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_method_declaration" value="16"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_parameters" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_allocation_expression" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_new_line_in_empty_anonymous_type_declaration" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_colon_in_conditional" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_parameterized_type_reference" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_for" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_postfix_operator" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.comment.format_source_code" value="false"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_synchronized" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_allocation_expression" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_throws" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.alignment_for_parameters_in_method_declaration" value="16"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_brace_in_array_initializer" value="insert"/>
+<setting id="org.eclipse.jdt.core.compiler.codegen.targetPlatform" value="1.5"/>
<setting id="org.eclipse.jdt.core.formatter.use_tabs_only_for_leading_indentations" value="false"/>
+<setting id="org.eclipse.jdt.core.formatter.comment.format_header" value="false"/>
+<setting id="org.eclipse.jdt.core.formatter.comment.format_block_comments" value="true"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_enum_constant" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.alignment_for_enum_constants" value="0"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_new_line_in_empty_block" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_annotation_declaration_header" value="true"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_parenthesized_expression" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_parenthesized_expression" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_catch" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_local_declarations" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_switch" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_increments" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_invocation" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_colon_in_assert" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.brace_position_for_type_declaration" value="end_of_line"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_array_initializer" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_between_empty_braces_in_array_initializer" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_declaration" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_for" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_catch" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_parameterized_type_reference" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_field_declarations" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_annotation" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_parameterized_type_reference" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_invocation_arguments" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.blank_lines_after_imports" value="1"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_local_declarations" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_constant_header" value="true"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_for" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.never_indent_line_comments_on_first_column" value="false"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_arguments" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.never_indent_block_comments_on_first_column" value="false"/>
+<setting id="org.eclipse.jdt.core.formatter.keep_then_statement_on_same_line" value="false"/>
</profile>
</profiles>
1
0
[ http://jira.qos.ch/browse/LBGENERAL-4?page=com.atlassian.jira.plugin.system… ]
Ceki Gulcu closed LBGENERAL-4.
------------------------------
Fix Version/s: 0.9.10
Resolution: Won't Fix
A stupid sounding idea. (It's my idea and I'll call it stupid if I want to).
> Config simulator
> ----------------
>
> Key: LBGENERAL-4
> URL: http://jira.qos.ch/browse/LBGENERAL-4
> Project: logback-general
> Issue Type: Improvement
> Components: build-structure
> Affects Versions: unspecified
> Environment: Operating System: Windows
> Platform: PC
> Reporter: Ceki Gulcu
> Assignee: Logback dev list
> Priority: Minor
> Fix For: 0.9.10
>
>
> It would be nive if we could have a small web-application to which we could hand a config file. This web-app would configure a LoggerContext and hand us the results via statii. Just need to be carefull not to allow users to clobber our system.
--
This message is automatically generated by JIRA.
-
If you think it was sent incorrectly contact one of the administrators: http://jira.qos.ch/secure/Administrators.jspa
-
For more information on JIRA, see: http://www.atlassian.com/software/jira
1
0
[ http://jira.qos.ch/browse/LBCORE-50?page=com.atlassian.jira.plugin.system.i… ]
Ceki Gulcu resolved LBCORE-50.
------------------------------
Resolution: Duplicate
> FlushableAppender
> -----------------
>
> Key: LBCORE-50
> URL: http://jira.qos.ch/browse/LBCORE-50
> Project: logback-core
> Issue Type: Improvement
> Components: Appender
> Affects Versions: unspecified
> Environment: Operating System: Linux
> Platform: PC
> Reporter: Bruno Navert
> Assignee: Logback dev list
> Priority: Minor
>
> Have appender implement the java.io.Flushable interface, or a logback-specific interface if preferred, so that we can call Appender.flush() to manually flush the appender's writer. Not all appenders would have this, only those that implement Flushable.
> This would be useful in the context where buffered IO is used, but we still want to ensure a flush is made at specific intervals. For instance, in development I create a Spring bean that listens to application events, and force-flushes logback after each http request has been processed by my application, ensuring that I always see all the error logs when something fails.
> I have accomplished by subclassing RollingFileAppender to implement Flushable, quite simply like this:
> public void flush() throws IOException
> {
> writer.flush();
> }
--
This message is automatically generated by JIRA.
-
If you think it was sent incorrectly contact one of the administrators: http://jira.qos.ch/secure/Administrators.jspa
-
For more information on JIRA, see: http://www.atlassian.com/software/jira
1
0
FlushableAppender
-----------------
Key: LBCORE-57
URL: http://jira.qos.ch/browse/LBCORE-57
Project: logback-core
Issue Type: Improvement
Components: Appender
Affects Versions: 0.9.9
Reporter: Bruno Navert
Assignee: Logback dev list
Priority: Minor
Attachments: FlushableAppender.java
Create a FlushableAppender interface for appenders that can be manually flushed (only relevant if bufferingIO is enabled)
Interface can simply extend Appender and java.io.Flushable
--
This message is automatically generated by JIRA.
-
If you think it was sent incorrectly contact one of the administrators: http://jira.qos.ch/secure/Administrators.jspa
-
For more information on JIRA, see: http://www.atlassian.com/software/jira
2
5
svn commit: r1876 - in logback/trunk/logback-classic/src: main/java/org/slf4j/impl test/java/ch/qos/logback/classic test/java/org/slf4j test/java/org/slf4j/impl
by noreply.ceki@qos.ch 27 Oct '08
by noreply.ceki@qos.ch 27 Oct '08
27 Oct '08
Author: ceki
Date: Mon Oct 27 15:41:52 2008
New Revision: 1876
Added:
logback/trunk/logback-classic/src/main/java/org/slf4j/impl/CopyOnInheritThreadLocal.java
logback/trunk/logback-classic/src/test/java/org/slf4j/
logback/trunk/logback-classic/src/test/java/org/slf4j/impl/
logback/trunk/logback-classic/src/test/java/org/slf4j/impl/LogbackMDCAdapterTest.java
logback/trunk/logback-classic/src/test/java/org/slf4j/impl/PackageTest.java
Modified:
logback/trunk/logback-classic/src/main/java/org/slf4j/impl/LogbackMDCAdapter.java
logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/AllClassicTest.java
Log:
- making sure that LogbackMDCAdapter actually copies its hash map.
Strictly speaking, there is no need for copy-on-spawn because every
change in the MDC already results in a copy of the hash map. Nevertheless,
this change makes it easier for readers of the code to follow it.
An external observer should not be able to tell the difference between the old and
the new code.
Added: logback/trunk/logback-classic/src/main/java/org/slf4j/impl/CopyOnInheritThreadLocal.java
==============================================================================
--- (empty file)
+++ logback/trunk/logback-classic/src/main/java/org/slf4j/impl/CopyOnInheritThreadLocal.java Mon Oct 27 15:41:52 2008
@@ -0,0 +1,24 @@
+package org.slf4j.impl;
+
+import java.util.HashMap;
+
+/**
+ * This class extends InheritableThreadLocal so that children threads get a copy
+ * of the parent's hashmap.
+ *
+ * @author Ceki Gülcü
+ */
+public class CopyOnInheritThreadLocal extends
+ InheritableThreadLocal<HashMap<String, String>> {
+
+ /**
+ * Child threads should get a copy of the parent's hashmap.
+ */
+ @Override
+ protected HashMap<String, String> childValue(
+ HashMap<String, String> parentValue) {
+ HashMap<String, String> hm = new HashMap<String, String>(parentValue);
+ return hm;
+ }
+
+}
Modified: logback/trunk/logback-classic/src/main/java/org/slf4j/impl/LogbackMDCAdapter.java
==============================================================================
--- logback/trunk/logback-classic/src/main/java/org/slf4j/impl/LogbackMDCAdapter.java (original)
+++ logback/trunk/logback-classic/src/main/java/org/slf4j/impl/LogbackMDCAdapter.java Mon Oct 27 15:41:52 2008
@@ -24,7 +24,9 @@
*/
public class LogbackMDCAdapter implements MDCAdapter {
- private final InheritableThreadLocal<HashMap<String, String>> inheritableThreadLocal = new InheritableThreadLocal<HashMap<String, String>>();
+ //final CopyOnInheritThreadLocal copyOnInheritThreadLocal = new CopyOnInheritThreadLocal();
+
+ final CopyOnInheritThreadLocal copyOnInheritThreadLocal = new CopyOnInheritThreadLocal();
LogbackMDCAdapter() {
}
@@ -45,21 +47,21 @@
* logback component to see the latest changes.
*
* @throws IllegalArgumentException
- * in case the "key" parameter is null
+ * in case the "key" parameter is null
*/
public void put(String key, String val) throws IllegalArgumentException {
if (key == null) {
throw new IllegalArgumentException("key cannot be null");
}
- HashMap<String, String> oldMap = inheritableThreadLocal.get();
+ HashMap<String, String> oldMap = copyOnInheritThreadLocal.get();
HashMap<String, String> newMap = new HashMap<String, String>();
if (oldMap != null) {
newMap.putAll(oldMap);
}
// the newMap replaces the old one for serialisation's sake
- inheritableThreadLocal.set(newMap);
+ copyOnInheritThreadLocal.set(newMap);
newMap.put(key, val);
}
@@ -70,7 +72,7 @@
* This method has no side effects.
*/
public String get(String key) {
- HashMap<String, String> hashMap = inheritableThreadLocal.get();
+ HashMap<String, String> hashMap = copyOnInheritThreadLocal.get();
if ((hashMap != null) && (key != null)) {
return hashMap.get(key);
@@ -89,14 +91,14 @@
* logback component to see the latest changes.
*/
public void remove(String key) {
- HashMap<String, String> oldMap = inheritableThreadLocal.get();
+ HashMap<String, String> oldMap = copyOnInheritThreadLocal.get();
HashMap<String, String> newMap = new HashMap<String, String>();
if (oldMap != null) {
newMap.putAll(oldMap);
}
// the newMap replaces the old one for serialisation's sake
- inheritableThreadLocal.set(newMap);
+ copyOnInheritThreadLocal.set(newMap);
newMap.remove(key);
}
@@ -104,11 +106,11 @@
* Clear all entries in the MDC.
*/
public void clear() {
- HashMap<String, String> hashMap = inheritableThreadLocal.get();
+ HashMap<String, String> hashMap = copyOnInheritThreadLocal.get();
if (hashMap != null) {
hashMap.clear();
- inheritableThreadLocal.remove();
+ copyOnInheritThreadLocal.remove();
}
}
@@ -117,15 +119,15 @@
* internally.
*/
public Map<String, String> getPropertyMap() {
- return inheritableThreadLocal.get();
+ return copyOnInheritThreadLocal.get();
}
/**
- * Return a copy of the current thread's context map.
- * Returned value may be null.
+ * Return a copy of the current thread's context map. Returned value may be
+ * null.
*/
public Map getCopyOfContextMap() {
- HashMap<String, String> hashMap = inheritableThreadLocal.get();
+ HashMap<String, String> hashMap = copyOnInheritThreadLocal.get();
if (hashMap == null) {
return null;
} else {
@@ -133,13 +135,12 @@
}
}
-
/**
* Returns the keys in the MDC as a {@link Set}. The returned value can be
* null.
*/
public Set<String> getKeys() {
- HashMap<String, String> hashMap = inheritableThreadLocal.get();
+ HashMap<String, String> hashMap = copyOnInheritThreadLocal.get();
if (hashMap != null) {
return hashMap.keySet();
@@ -148,17 +149,16 @@
}
}
-
- @SuppressWarnings("unchecked")
+ @SuppressWarnings("unchecked")
public void setContextMap(Map contextMap) {
- HashMap<String, String> oldMap = inheritableThreadLocal.get();
+ HashMap<String, String> oldMap = copyOnInheritThreadLocal.get();
HashMap<String, String> newMap = new HashMap<String, String>();
newMap.putAll(contextMap);
// the newMap replaces the old one for serialisation's sake
- inheritableThreadLocal.set(newMap);
-
+ copyOnInheritThreadLocal.set(newMap);
+
// hints for the garbage collector
oldMap.clear();
oldMap = null;
Modified: logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/AllClassicTest.java
==============================================================================
--- logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/AllClassicTest.java (original)
+++ logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/AllClassicTest.java Mon Oct 27 15:41:52 2008
@@ -17,7 +17,8 @@
public static Test suite() {
TestSuite suite = new TestSuite();
-
+
+ suite.addTest(org.slf4j.impl.PackageTest.suite());
suite.addTest(ch.qos.logback.classic.PackageTest.suite());
suite.addTest(ch.qos.logback.classic.control.PackageTest.suite());
suite.addTest(ch.qos.logback.classic.joran.PackageTest.suite());
Added: logback/trunk/logback-classic/src/test/java/org/slf4j/impl/LogbackMDCAdapterTest.java
==============================================================================
--- (empty file)
+++ logback/trunk/logback-classic/src/test/java/org/slf4j/impl/LogbackMDCAdapterTest.java Mon Oct 27 15:41:52 2008
@@ -0,0 +1,82 @@
+/**
+ * Logback: the generic, reliable, fast and flexible logging framework.
+ *
+ * Copyright (C) 2000-2008, QOS.ch
+ *
+ * This library is free software, you can redistribute it and/or modify it under
+ * the terms of the GNU Lesser General Public License as published by the Free
+ * Software Foundation.
+ */
+package org.slf4j.impl;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertNull;
+import static org.junit.Assert.assertTrue;
+
+import java.util.HashMap;
+import java.util.Random;
+
+import org.junit.Test;
+import org.slf4j.MDC;
+
+public class LogbackMDCAdapterTest {
+
+ final static String A_SUFFIX = "A_SUFFIX";
+
+ int diff = new Random().nextInt();
+
+ /**
+ * Test that LogbackMDCAdapter copies its hashmap when a child
+ * thread inherits it.
+ *
+ * @throws InterruptedException
+ */
+ @Test
+ public void copyOnInheritence() throws InterruptedException {
+ String mdcKey = "x" + diff;
+ String otherMDCKey = "o" + diff;
+ MDC.put(mdcKey, mdcKey + A_SUFFIX);
+
+ HashMap<String, String> parentHM = getHM();
+
+ MyThread myThread = new MyThread(mdcKey, otherMDCKey);
+ myThread.start();
+ myThread.join();
+
+ assertNull(MDC.get(otherMDCKey));
+ assertTrue(myThread.successul);
+ assertTrue(parentHM != myThread.childHM);
+ }
+
+ class MyThread extends Thread {
+
+ String mdcKey;
+ String otherMDCKey;
+ boolean successul;
+ HashMap<String, String> childHM;
+
+ MyThread(String mdcKey, String otherMDCKey) {
+ this.mdcKey = mdcKey;
+ this.otherMDCKey = otherMDCKey;
+ }
+
+ @Override
+ public void run() {
+ childHM = getHM();
+
+ MDC.put(otherMDCKey, otherMDCKey + A_SUFFIX);
+ assertNotNull(MDC.get(mdcKey));
+ assertEquals(mdcKey + A_SUFFIX, MDC.get(mdcKey));
+ assertEquals(otherMDCKey + A_SUFFIX, MDC.get(otherMDCKey));
+ successul = true;
+ }
+ }
+
+ HashMap<String, String> getHM() {
+ LogbackMDCAdapter lma = (LogbackMDCAdapter) MDC.getMDCAdapter();
+ CopyOnInheritThreadLocal copyOnInheritThreadLocal = lma.copyOnInheritThreadLocal;
+ return copyOnInheritThreadLocal.get();
+
+ }
+}
Added: logback/trunk/logback-classic/src/test/java/org/slf4j/impl/PackageTest.java
==============================================================================
--- (empty file)
+++ logback/trunk/logback-classic/src/test/java/org/slf4j/impl/PackageTest.java Mon Oct 27 15:41:52 2008
@@ -0,0 +1,21 @@
+/**
+ * Logback: the generic, reliable, fast and flexible logging framework.
+ *
+ * Copyright (C) 2000-2008, QOS.ch
+ *
+ * This library is free software, you can redistribute it and/or modify it under
+ * the terms of the GNU Lesser General Public License as published by the Free
+ * Software Foundation.
+ */
+package org.slf4j.impl;
+
+import junit.framework.*;
+
+public class PackageTest extends TestCase {
+
+ public static Test suite() {
+ TestSuite suite = new TestSuite();
+ suite.addTest(new JUnit4TestAdapter(LogbackMDCAdapterTest.class));
+ return suite;
+ }
+}
\ No newline at end of file
1
0
Author: ceki
Date: Wed Oct 22 22:50:47 2008
New Revision: 1860
Added:
logback/trunk/logback-classic/src/test/input/integration/
logback/trunk/logback-classic/src/test/input/integration/db/
logback/trunk/logback-classic/src/test/input/integration/db/mysql-with-driver.xml
logback/trunk/logback-classic/src/test/input/integration/db/oracle10g-with-driver.xml
logback/trunk/logback-classic/src/test/input/integration/db/oracle11g-with-driver.xml
logback/trunk/logback-classic/src/test/input/integration/db/postgresql-with-driver.xml
logback/trunk/logback-classic/src/test/input/integration/db/sqlserver-with-driver.xml
logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/db/DBAppenderIntegrationTest.java
logback/trunk/logback-core/src/main/java/ch/qos/logback/core/db/dialect/SQLDialectCode.java
Modified:
logback/trunk/logback-access/src/main/java/ch/qos/logback/access/db/DBAppender.java
logback/trunk/logback-classic/pom.xml
logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/db/DBAppender.java
logback/trunk/logback-core/src/main/java/ch/qos/logback/core/db/ConnectionSource.java
logback/trunk/logback-core/src/main/java/ch/qos/logback/core/db/ConnectionSourceBase.java
logback/trunk/logback-core/src/main/java/ch/qos/logback/core/db/DBAppenderBase.java
logback/trunk/logback-core/src/main/java/ch/qos/logback/core/db/DataSourceConnectionSource.java
logback/trunk/logback-core/src/main/java/ch/qos/logback/core/db/dialect/DBUtil.java
logback/trunk/logback-core/src/main/java/ch/qos/logback/core/db/dialect/HSQLDBDialect.java
logback/trunk/logback-core/src/main/java/ch/qos/logback/core/db/dialect/SQLDialect.java
logback/trunk/logback-examples/pom.xml
logback/trunk/logback-examples/src/main/java/chapter4/mail/ (props changed)
logback/trunk/logback-site/src/site/pages/manual/appenders.html
Log:
Related to LBCORE-15
- minor refactoring in DBAppender and related classes
- As suggested by John Gibson in LBCORE-15, we now use the prepareStatement method of
Connection which takes the sql statement followed by the autogenerateed key columnNames
(of type String[])
This change is compatible with JDBC drivers of SQLServer and MySQL, as well as Oracle.
JDBC drivers not supporting getGeneratedKeys are not affected by this change.
- added integration tests which are active only on my machine, namely, Orion. This avoids other
developers from having to install Oracle, MySQL, Postgres and SQL Server just for the
logback tests to pass.
- similar tests on logback-access to follow.
Modified: logback/trunk/logback-access/src/main/java/ch/qos/logback/access/db/DBAppender.java
==============================================================================
--- logback/trunk/logback-access/src/main/java/ch/qos/logback/access/db/DBAppender.java (original)
+++ logback/trunk/logback-access/src/main/java/ch/qos/logback/access/db/DBAppender.java Wed Oct 22 22:50:47 2008
@@ -79,7 +79,7 @@
}
if (insertHeaders) {
- int eventId = getEventId(insertStatement, connection);
+ int eventId = selectEventId(insertStatement, connection);
addRequestHeaders(event, connection, eventId);
}
}
Modified: logback/trunk/logback-classic/pom.xml
==============================================================================
--- logback/trunk/logback-classic/pom.xml (original)
+++ logback/trunk/logback-classic/pom.xml Wed Oct 22 22:50:47 2008
@@ -171,8 +171,46 @@
</configuration>
</plugin>
</plugins>
+ </build>
+ <profiles>
+
+ <profile>
+ <!-- Integration tests require the host-orion profile -->
+ <id>host-orion</id>
+
+ <dependencies>
+ <dependency>
+ <groupId>mysql</groupId>
+ <artifactId>mysql-connector-java</artifactId>
+ <version>5.0.8</version>
+ <scope>test</scope>
+ </dependency>
- </build>
+ <dependency>
+ <groupId>postgresql</groupId>
+ <artifactId>postgresql</artifactId>
+ <version>8.2-507.jdbc3</version>
+ </dependency>
+
+ <!-- locally installed artifact -->
+ <dependency>
+ <groupId>com.microsoft.sqlserver</groupId>
+ <artifactId>sqljdbc</artifactId>
+ <version>2.0</version>
+ <scope>test</scope>
+ </dependency>
+ <!-- locally installed artifact -->
+ <dependency>
+ <groupId>com.oracle</groupId>
+ <artifactId>ojdbc14</artifactId>
+ <version>10.2.0.1</version>
+ <scope>test</scope>
+ </dependency>
+ </dependencies>
+
+ </profile>
+
+ </profiles>
</project>
\ No newline at end of file
Modified: logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/db/DBAppender.java
==============================================================================
--- logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/db/DBAppender.java (original)
+++ logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/db/DBAppender.java Wed Oct 22 22:50:47 2008
@@ -56,11 +56,11 @@
sql.append("caller_line) ");
sql.append(" VALUES (?, ?, ? ,?, ?, ?, ?, ?, ?,?)");
insertSQL = sql.toString();
- //
- // PreparedStatement.getGeneratedKeys added in JDK 1.4
- //
+
+ // PreparedStatement.getGeneratedKeys() method was added in JDK 1.4
Method getGeneratedKeysMethod;
try {
+ // the
getGeneratedKeysMethod = PreparedStatement.class.getMethod(
"getGeneratedKeys", (Class[]) null);
} catch (Exception ex) {
@@ -77,16 +77,16 @@
PreparedStatement insertStatement) throws Throwable {
LoggingEvent event = (LoggingEvent) eventObject;
- addLoggingEvent(insertStatement, event);
- // This is very expensive... should we do it every time?
- addCallerData(insertStatement, event.getCallerData());
+ bindLoggingEventWithInsertStatement(insertStatement, event);
+ // This is expensive... should we do it every time?
+ bindCallerDataWithPreparedStatement(insertStatement, event.getCallerData());
int updateCount = insertStatement.executeUpdate();
if (updateCount != 1) {
addWarn("Failed to insert loggingEvent");
}
- int eventId = getEventId(insertStatement, connection);
+ int eventId = selectEventId(insertStatement, connection);
Map<String, String> mergedMap = mergePropertyMaps(event);
insertProperties(mergedMap, connection, eventId);
@@ -96,7 +96,7 @@
}
}
- void addLoggingEvent(PreparedStatement stmt, LoggingEvent event)
+ void bindLoggingEventWithInsertStatement(PreparedStatement stmt, LoggingEvent event)
throws SQLException {
stmt.setLong(1, event.getTimeStamp());
stmt.setString(2, event.getFormattedMessage());
@@ -106,7 +106,7 @@
stmt.setShort(6, DBHelper.computeReferenceMask(event));
}
- void addCallerData(PreparedStatement stmt, CallerData[] callerDataArray)
+ void bindCallerDataWithPreparedStatement(PreparedStatement stmt, CallerData[] callerDataArray)
throws SQLException {
CallerData callerData = callerDataArray[0];
if (callerData != null) {
Added: logback/trunk/logback-classic/src/test/input/integration/db/mysql-with-driver.xml
==============================================================================
--- (empty file)
+++ logback/trunk/logback-classic/src/test/input/integration/db/mysql-with-driver.xml Wed Oct 22 22:50:47 2008
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+
+<configuration>
+
+ <appender name="DB" class="ch.qos.logback.classic.db.DBAppender">
+ <connectionSource class="ch.qos.logback.core.db.DriverManagerConnectionSource">
+ <driverClass>com.mysql.jdbc.Driver</driverClass>
+ <url>jdbc:mysql://localhost:3306/logback</url>
+ <user>root</user>
+ <password></password>
+ </connectionSource>
+ </appender>
+
+ <root>
+ <level value="debug" />
+ <appender-ref ref="DB" />
+ </root>
+</configuration>
Added: logback/trunk/logback-classic/src/test/input/integration/db/oracle10g-with-driver.xml
==============================================================================
--- (empty file)
+++ logback/trunk/logback-classic/src/test/input/integration/db/oracle10g-with-driver.xml Wed Oct 22 22:50:47 2008
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+
+<configuration>
+
+ <appender name="DB" class="ch.qos.logback.classic.db.DBAppender">
+ <connectionSource class="ch.qos.logback.core.db.DriverManagerConnectionSource">
+ <driverClass>oracle.jdbc.OracleDriver</driverClass>
+ <url>jdbc:oracle:thin:@localhost:1522:xe</url>
+ <user>hr</user>
+ <password>hr</password>
+ </connectionSource>
+ </appender>
+
+ <root>
+ <level value="debug" />
+ <appender-ref ref="DB" />
+ </root>
+</configuration>
Added: logback/trunk/logback-classic/src/test/input/integration/db/oracle11g-with-driver.xml
==============================================================================
--- (empty file)
+++ logback/trunk/logback-classic/src/test/input/integration/db/oracle11g-with-driver.xml Wed Oct 22 22:50:47 2008
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+
+<configuration>
+
+ <appender name="DB" class="ch.qos.logback.classic.db.DBAppender">
+ <connectionSource class="ch.qos.logback.core.db.DriverManagerConnectionSource">
+ <driverClass>oracle.jdbc.OracleDriver</driverClass>
+ <url>jdbc:oracle:thin:@localhost:1521:orcl</url>
+ <user>SCOTT</user>
+ <password>SCOTT</password>
+ </connectionSource>
+ </appender>
+
+ <root>
+ <level value="debug" />
+ <appender-ref ref="DB" />
+ </root>
+</configuration>
Added: logback/trunk/logback-classic/src/test/input/integration/db/postgresql-with-driver.xml
==============================================================================
--- (empty file)
+++ logback/trunk/logback-classic/src/test/input/integration/db/postgresql-with-driver.xml Wed Oct 22 22:50:47 2008
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+
+<configuration>
+
+ <appender name="DB" class="ch.qos.logback.classic.db.DBAppender">
+ <connectionSource class="ch.qos.logback.core.db.DriverManagerConnectionSource">
+ <driverClass>org.postgresql.Driver</driverClass>
+ <url>jdbc:postgresql://192.168.1.5:5432/test</url>
+ <user>logback</user>
+ <password>logback</password>
+ </connectionSource>
+ </appender>
+
+ <root>
+ <level value="debug" />
+ <appender-ref ref="DB" />
+ </root>
+</configuration>
Added: logback/trunk/logback-classic/src/test/input/integration/db/sqlserver-with-driver.xml
==============================================================================
--- (empty file)
+++ logback/trunk/logback-classic/src/test/input/integration/db/sqlserver-with-driver.xml Wed Oct 22 22:50:47 2008
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+
+<configuration>
+
+ <appender name="DB" class="ch.qos.logback.classic.db.DBAppender">
+ <connectionSource class="ch.qos.logback.core.db.DriverManagerConnectionSource">
+ <driverClass>com.microsoft.sqlserver.jdbc.SQLServerDriver</driverClass>
+ <url>jdbc:sqlserver://localhost:1987;databaseName=logback;</url>
+ <user>logback</user>
+ <password>logback</password>
+ </connectionSource>
+ </appender>
+
+ <root>
+ <level value="debug" />
+ <appender-ref ref="DB" />
+ </root>
+</configuration>
Added: logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/db/DBAppenderIntegrationTest.java
==============================================================================
--- (empty file)
+++ logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/db/DBAppenderIntegrationTest.java Wed Oct 22 22:50:47 2008
@@ -0,0 +1,126 @@
+package ch.qos.logback.classic.db;
+
+import static org.junit.Assert.assertEquals;
+
+import java.net.InetAddress;
+import java.util.Random;
+
+import org.junit.After;
+import org.junit.AfterClass;
+import org.junit.Before;
+import org.junit.BeforeClass;
+import org.junit.Ignore;
+import org.junit.Test;
+import org.slf4j.Logger;
+import org.slf4j.MDC;
+
+import ch.qos.logback.classic.LoggerContext;
+import ch.qos.logback.classic.joran.JoranConfigurator;
+import ch.qos.logback.core.joran.spi.JoranException;
+import ch.qos.logback.core.status.Status;
+import ch.qos.logback.core.util.StatusPrinter;
+
+public class DBAppenderIntegrationTest {
+
+ static String LOCAL_HOST_NAME;
+ static String[] CONFORMING_HOST_LIST = new String[] { "Orion" };
+
+ int diff = new Random(System.nanoTime()).nextInt(10000);
+ LoggerContext lc = new LoggerContext();
+
+ @BeforeClass
+ public static void setUpBeforeClass() throws Exception {
+ InetAddress localhostIA = InetAddress.getLocalHost();
+ LOCAL_HOST_NAME = localhostIA.getHostName();
+ }
+
+ @AfterClass
+ public static void tearDownAfterClass() throws Exception {
+ }
+
+ @Before
+ public void setUp() throws Exception {
+ lc.setName("lc"+diff);
+ }
+
+ @After
+ public void tearDown() throws Exception {
+ lc.shutdownAndReset();
+ }
+
+ public void doTest(String configFile) throws JoranException {
+ JoranConfigurator configurator = new JoranConfigurator();
+ configurator.setContext(lc);
+ configurator.doConfigure(configFile);
+
+ Logger logger = lc.getLogger(DBAppenderIntegrationTest.class);
+
+ MDC.put("userid", "user" + diff);
+ int runLength = 5;
+ for (int i = 1; i <= runLength; i++) {
+ logger.debug("This is a debug message. Message number: " + i);
+ }
+ logger.error("At last an error.", new Exception("Just testing"));
+
+ // check that there were no errors
+ StatusPrinter.print(lc);
+ assertEquals(Status.INFO, lc.getStatusManager().getLevel());
+
+ }
+
+ static boolean isConformingHost() {
+ for (String conformingHost : CONFORMING_HOST_LIST) {
+ if (conformingHost.equalsIgnoreCase(LOCAL_HOST_NAME)) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ @Test
+ public void sqlserver() throws Exception {
+ // perform test only on conforming hosts
+ if (!isConformingHost()) {
+ return;
+ }
+ doTest("src/test/input/integration/db/sqlserver-with-driver.xml");
+ }
+
+ @Test
+ public void oracle10g() throws Exception {
+ // perform test only on conforming hosts
+ if (!isConformingHost()) {
+ return;
+ }
+ doTest("src/test/input/integration/db/oracle10g-with-driver.xml");
+ }
+
+ @Test
+ @Ignore
+ public void oracle11g() throws Exception {
+ // perform test only on conforming hosts
+ if (!isConformingHost()) {
+ return;
+ }
+ doTest("src/test/input/integration/db/oracle11g-with-driver.xml");
+ }
+
+ @Test
+ public void mysql() throws Exception {
+ // perform test only on conforming hosts
+ if (!isConformingHost()) {
+ return;
+ }
+ doTest("src/test/input/integration/db/mysql-with-driver.xml");
+ }
+
+ @Test
+ public void postgres() throws Exception {
+ // perform test only on conforming hosts
+ if (!isConformingHost()) {
+ return;
+ }
+ doTest("src/test/input/integration/db/postgresql-with-driver.xml");
+ }
+
+}
Modified: logback/trunk/logback-core/src/main/java/ch/qos/logback/core/db/ConnectionSource.java
==============================================================================
--- logback/trunk/logback-core/src/main/java/ch/qos/logback/core/db/ConnectionSource.java (original)
+++ logback/trunk/logback-core/src/main/java/ch/qos/logback/core/db/ConnectionSource.java Wed Oct 22 22:50:47 2008
@@ -12,6 +12,7 @@
import java.sql.Connection;
import java.sql.SQLException;
+import ch.qos.logback.core.db.dialect.SQLDialectCode;
import ch.qos.logback.core.spi.LifeCycle;
@@ -27,12 +28,6 @@
*/
public interface ConnectionSource extends LifeCycle {
- final int UNKNOWN_DIALECT = 0;
- final int POSTGRES_DIALECT = 1;
- final int MYSQL_DIALECT = 2;
- final int ORACLE_DIALECT = 3;
- final int MSSQL_DIALECT = 4;
- final int HSQL_DIALECT = 5;
/**
* Obtain a {@link java.sql.Connection} for use. The client is
* responsible for closing the {@link java.sql.Connection} when it is no
@@ -48,7 +43,7 @@
* dialect is not needed if the JDBC driver supports the getGeneratedKeys
* method.
*/
- int getSQLDialectCode();
+ SQLDialectCode getSQLDialectCode();
/**
* If the connection supports the JDBC 3.0 getGeneratedKeys method, then
Modified: logback/trunk/logback-core/src/main/java/ch/qos/logback/core/db/ConnectionSourceBase.java
==============================================================================
--- logback/trunk/logback-core/src/main/java/ch/qos/logback/core/db/ConnectionSourceBase.java (original)
+++ logback/trunk/logback-core/src/main/java/ch/qos/logback/core/db/ConnectionSourceBase.java Wed Oct 22 22:50:47 2008
@@ -14,6 +14,7 @@
import java.sql.SQLException;
import ch.qos.logback.core.db.dialect.DBUtil;
+import ch.qos.logback.core.db.dialect.SQLDialectCode;
import ch.qos.logback.core.spi.ContextAwareBase;
@@ -28,7 +29,7 @@
private String password = null;
// initially we have an unkonw dialect
- private int dialectCode = UNKNOWN_DIALECT;
+ private SQLDialectCode dialectCode = SQLDialectCode.UNKNOWN_DIALECT;
private boolean supportsGetGeneratedKeys = false;
private boolean supportsBatchUpdates = false;
@@ -50,6 +51,10 @@
supportsGetGeneratedKeys = util.supportsGetGeneratedKeys(meta);
supportsBatchUpdates = util.supportsBatchUpdates(meta);
dialectCode = DBUtil.discoverSQLDialect(meta);
+ System.out.println("Driver name="+meta.getDriverName());
+ System.out.println("Driver version="+meta.getDriverVersion());
+ System.out.println("supportsGetGeneratedKeys="+supportsGetGeneratedKeys);
+
} catch (SQLException se) {
addWarn("Could not discover the dialect to use.", se);
}
@@ -62,7 +67,7 @@
return supportsGetGeneratedKeys;
}
- public final int getSQLDialectCode() {
+ public final SQLDialectCode getSQLDialectCode() {
return dialectCode;
}
Modified: logback/trunk/logback-core/src/main/java/ch/qos/logback/core/db/DBAppenderBase.java
==============================================================================
--- logback/trunk/logback-core/src/main/java/ch/qos/logback/core/db/DBAppenderBase.java (original)
+++ logback/trunk/logback-core/src/main/java/ch/qos/logback/core/db/DBAppenderBase.java Wed Oct 22 22:50:47 2008
@@ -35,8 +35,9 @@
protected SQLDialect sqlDialect;
protected abstract Method getGeneratedKeysMethod();
+
protected abstract String getInsertSQL();
-
+
@Override
public void start() {
@@ -45,6 +46,7 @@
"DBAppender cannot function without a connection source");
}
+ System.out.println(connectionSource.supportsGetGeneratedKeys());
sqlDialect = DBUtil
.getDialectFromCode(connectionSource.getSQLDialectCode());
if (getGeneratedKeysMethod() != null) {
@@ -71,7 +73,7 @@
/**
* @param connectionSource
- * The connectionSource to set.
+ * The connectionSource to set.
*/
public void setConnectionSource(ConnectionSource connectionSource) {
this.connectionSource = connectionSource;
@@ -83,10 +85,13 @@
try {
connection = connectionSource.getConnection();
connection.setAutoCommit(false);
-
- PreparedStatement insertStatement = connection
- .prepareStatement(getInsertSQL());
-
+ PreparedStatement insertStatement;
+ if (cnxSupportsGetGeneratedKeys) {
+ insertStatement = connection.prepareStatement(getInsertSQL(),
+ new String[] {"EVENT_ID"});
+ } else {
+ insertStatement = connection.prepareStatement(getInsertSQL());
+ }
subAppend(eventObject, connection, insertStatement);
// we no longer need the insertStatement
@@ -94,7 +99,6 @@
insertStatement.close();
insertStatement = null;
}
-
connection.commit();
} catch (Throwable sqle) {
addError("problem appending event", sqle);
@@ -106,7 +110,7 @@
protected abstract void subAppend(Object eventObject, Connection connection,
PreparedStatement statement) throws Throwable;
- protected int getEventId(PreparedStatement insertStatement,
+ protected int selectEventId(PreparedStatement insertStatement,
Connection connection) throws SQLException, InvocationTargetException {
ResultSet rs = null;
Statement idStatement = null;
@@ -139,8 +143,7 @@
}
// A ResultSet cursor is initially positioned before the first row;
- // the
- // first call to the method next makes the first row the current row
+ // the first call to the method next makes the first row the current row
rs.next();
int eventId = rs.getInt(1);
Modified: logback/trunk/logback-core/src/main/java/ch/qos/logback/core/db/DataSourceConnectionSource.java
==============================================================================
--- logback/trunk/logback-core/src/main/java/ch/qos/logback/core/db/DataSourceConnectionSource.java (original)
+++ logback/trunk/logback-core/src/main/java/ch/qos/logback/core/db/DataSourceConnectionSource.java Wed Oct 22 22:50:47 2008
@@ -15,6 +15,8 @@
import javax.sql.DataSource;
+import ch.qos.logback.core.db.dialect.SQLDialectCode;
+
/**
* The DataSourceConnectionSource is an implementation of
* {@link ConnectionSource} that obtains the Connection in the recommended JDBC
@@ -47,7 +49,7 @@
discoverConnnectionProperties();
}
if (!supportsGetGeneratedKeys()
- && getSQLDialectCode() == ConnectionSource.UNKNOWN_DIALECT) {
+ && getSQLDialectCode() == SQLDialectCode.UNKNOWN_DIALECT) {
addWarn("Connection does not support GetGeneratedKey method and could not discover the dialect.");
}
}
Modified: logback/trunk/logback-core/src/main/java/ch/qos/logback/core/db/dialect/DBUtil.java
==============================================================================
--- logback/trunk/logback-core/src/main/java/ch/qos/logback/core/db/dialect/DBUtil.java (original)
+++ logback/trunk/logback-core/src/main/java/ch/qos/logback/core/db/dialect/DBUtil.java Wed Oct 22 22:50:47 2008
@@ -12,7 +12,6 @@
import java.sql.DatabaseMetaData;
import java.sql.SQLException;
-import ch.qos.logback.core.db.ConnectionSource;
import ch.qos.logback.core.spi.ContextAwareBase;
/**
@@ -28,25 +27,25 @@
private static final String MSSQL_PART = "microsoft";
private static final String HSQL_PART = "hsql";
- public static int discoverSQLDialect(DatabaseMetaData meta) {
- int dialectCode = 0;
+ public static SQLDialectCode discoverSQLDialect(DatabaseMetaData meta) {
+ SQLDialectCode dialectCode = SQLDialectCode.UNKNOWN_DIALECT;
try {
String dbName = meta.getDatabaseProductName().toLowerCase();
if (dbName.indexOf(POSTGRES_PART) != -1) {
- return ConnectionSource.POSTGRES_DIALECT;
+ return SQLDialectCode.POSTGRES_DIALECT;
} else if (dbName.indexOf(MYSQL_PART) != -1) {
- return ConnectionSource.MYSQL_DIALECT;
+ return SQLDialectCode.MYSQL_DIALECT;
} else if (dbName.indexOf(ORACLE_PART) != -1) {
- return ConnectionSource.ORACLE_DIALECT;
+ return SQLDialectCode.ORACLE_DIALECT;
} else if (dbName.indexOf(MSSQL_PART) != -1) {
- return ConnectionSource.MSSQL_DIALECT;
+ return SQLDialectCode.MSSQL_DIALECT;
} else if (dbName.indexOf(HSQL_PART) != -1) {
- return ConnectionSource.HSQL_DIALECT;
+ return SQLDialectCode.HSQL_DIALECT;
} else {
- return ConnectionSource.UNKNOWN_DIALECT;
+ return SQLDialectCode.UNKNOWN_DIALECT;
}
} catch (SQLException sqle) {
// we can't do much here
@@ -55,27 +54,27 @@
return dialectCode;
}
- public static SQLDialect getDialectFromCode(int dialectCode) {
+ public static SQLDialect getDialectFromCode(SQLDialectCode sqlDialectType) {
SQLDialect sqlDialect = null;
- switch (dialectCode) {
- case ConnectionSource.POSTGRES_DIALECT:
+ switch (sqlDialectType) {
+ case POSTGRES_DIALECT:
sqlDialect = new PostgreSQLDialect();
break;
- case ConnectionSource.MYSQL_DIALECT:
+ case MYSQL_DIALECT:
sqlDialect = new MySQLDialect();
break;
- case ConnectionSource.ORACLE_DIALECT:
+ case ORACLE_DIALECT:
sqlDialect = new OracleDialect();
break;
- case ConnectionSource.MSSQL_DIALECT:
+ case MSSQL_DIALECT:
sqlDialect = new MsSQLDialect();
break;
- case ConnectionSource.HSQL_DIALECT:
+ case HSQL_DIALECT:
sqlDialect = new HSQLDBDialect();
break;
Modified: logback/trunk/logback-core/src/main/java/ch/qos/logback/core/db/dialect/HSQLDBDialect.java
==============================================================================
--- logback/trunk/logback-core/src/main/java/ch/qos/logback/core/db/dialect/HSQLDBDialect.java (original)
+++ logback/trunk/logback-core/src/main/java/ch/qos/logback/core/db/dialect/HSQLDBDialect.java Wed Oct 22 22:50:47 2008
@@ -7,17 +7,18 @@
* the terms of the GNU Lesser General Public License as published by the Free
* Software Foundation.
*/
-package ch.qos.logback.core.db.dialect;
+package ch.qos.logback.core.db.dialect;
-/**
- * The HSQLDB dialect.
+/**
+ * The HSQLDB dialect.
*
* @author Ceki Gülcü
-*/
-public class HSQLDBDialect implements SQLDialect {
- public static final String SELECT_CURRVAL = "CALL IDENTITY()";
+ */
+public class HSQLDBDialect implements SQLDialect {
+ public static final String SELECT_CURRVAL = "CALL IDENTITY()";
- public String getSelectInsertId() {
- return SELECT_CURRVAL;
- }
+ public String getSelectInsertId() {
+ return SELECT_CURRVAL;
+ }
+
}
Modified: logback/trunk/logback-core/src/main/java/ch/qos/logback/core/db/dialect/SQLDialect.java
==============================================================================
--- logback/trunk/logback-core/src/main/java/ch/qos/logback/core/db/dialect/SQLDialect.java (original)
+++ logback/trunk/logback-core/src/main/java/ch/qos/logback/core/db/dialect/SQLDialect.java Wed Oct 22 22:50:47 2008
@@ -10,11 +10,9 @@
package ch.qos.logback.core.db.dialect;
/**
- * @author ceki
+ * @author Ceki Gücü
*
*/
public interface SQLDialect {
-
public String getSelectInsertId();
-
}
Added: logback/trunk/logback-core/src/main/java/ch/qos/logback/core/db/dialect/SQLDialectCode.java
==============================================================================
--- (empty file)
+++ logback/trunk/logback-core/src/main/java/ch/qos/logback/core/db/dialect/SQLDialectCode.java Wed Oct 22 22:50:47 2008
@@ -0,0 +1,10 @@
+package ch.qos.logback.core.db.dialect;
+
+public enum SQLDialectCode {
+ UNKNOWN_DIALECT,
+ POSTGRES_DIALECT,
+ MYSQL_DIALECT,
+ ORACLE_DIALECT,
+ MSSQL_DIALECT,
+ HSQL_DIALECT;
+}
Modified: logback/trunk/logback-examples/pom.xml
==============================================================================
--- logback/trunk/logback-examples/pom.xml (original)
+++ logback/trunk/logback-examples/pom.xml Wed Oct 22 22:50:47 2008
@@ -101,5 +101,4 @@
</plugin>
</plugins>
</build>
-
</project>
\ No newline at end of file
Modified: logback/trunk/logback-site/src/site/pages/manual/appenders.html
==============================================================================
--- logback/trunk/logback-site/src/site/pages/manual/appenders.html (original)
+++ logback/trunk/logback-site/src/site/pages/manual/appenders.html Wed Oct 22 22:50:47 2008
@@ -2299,8 +2299,9 @@
</p>
- <a name="DBAppender"></a>
- <h3>DBAppender</h3>
+ <h3>
+ <a name="DBAppender" href="#DBAppender">DBAppender</a>
+ </h3>
<p>The <a
href="../xref/ch/qos/logback/classic/db/DBAppender.html"><code>DBAppender</code></a>
@@ -2322,79 +2323,88 @@
to us, we will gladly include missing scripts in future releases.
</p>
- <p>
- If your JDBC driver supports the
- <code>getGeneratedKeys</code> method introduced in
- JDBC 3.0 specification, then no more steps are required, excluding usual
- configuration.
- </p>
- <p>
- Otherwise, there must be an <code>SQLDialect</code> appropriate for your
- database system. Currently, we have dialects for PostgreSQL,
- MySQL, Oracle and MsSQL. As mentioned previously, an
- <code>SQLDialect</code> is required only if the JDBC driver for your
- database system does not support the <code>getGeneratedKeys</code>
- method.
+ <p>If your JDBC driver supports the <code>getGeneratedKeys</code>
+ method introduced in JDBC 3.0 specification, assuming you have
+ created the appropriate database tables as mentioned above, then
+ no more steps are required, excluding usual logback configuration.
</p>
- <p>
- The table below summarizes the database types and their support of the
- <code>getGeneratedKeys()</code> method.
+ <p>Otherwise, there must be an <code>SQLDialect</code> appropriate
+ for your database system. Currently, we have dialects for
+ PostgreSQL, MySQL, Oracle and MS SQL Server. </p>
+
+ <p>The table below summarizes the database types and their support
+ of the <code>getGeneratedKeys()</code> method.
</p>
<table class="bodyTable" border="1" cellpadding="4">
<tr class="a">
<th>RDBMS</th>
- <th>
+ <th>tested version(s)
+ </th>
+ <th>tested JDBC driver version(s)
+ </th>
+ <th>
supports
<br />
<code>getGeneratedKeys()</code>
method
- </th>
- <th>
- specific
- <br />
- SQLDialect support
- </th>
+ </th>
</tr>
- <tr class="b">
- <td>PostgreSQL</td>
- <td>NO</td>
- <td>present and used</td>
- </tr>
- <tr class="a">
- <td>MySQL</td>
- <td>YES</td>
- <td>present, but not actually needed or used</td>
+
+ <tr >
+ <td>DB2</td>
+ <td>untested</td>
+ <td>untested</td>
+ <td>unknown</td>
</tr>
- <tr class="b">
- <td>Oracle</td>
- <td>YES</td>
- <td>present, but not actually needed or used</td>
+
+ <tr class="alt">
+ <td>HSQL</td>
+ <td>1.8.0.7</td>
+ <td>-</td>
+ <td>NO</td>
</tr>
- <tr class="a">
- <td>DB2</td>
+
+ <tr >
+ <td>Microsoft SQL Server</td>
+ <td>2005</td>
+ <td>2.0.1008.2 (sqljdbc.jar)</td>
<td>YES</td>
- <td>not present, and not needed or used</td>
</tr>
- <tr class="b">
- <td>MsSQL</td>
+
+ <tr class="alt">
+ <td>MySQL</td>
+ <td>5.0.22</td>
+ <td>5.0.8 (mysql-connector.jar)</td>
<td>YES</td>
- <td>not present, and not needed or used</td>
</tr>
- <tr class="a">
- <td>HSQL</td>
+
+ <tr>
+ <td>PostgreSQL</td>
+ <td>
+ </td>
+ <td>
+ </td>
<td>NO</td>
- <td>present and used</td>
</tr>
+
+ <tr >
+ <td>Oracle</td>
+ <td>10g</td>
+ <td>10.2.0.1 (ojdbc14.jar)</td>
+ <td>YES (10.2.0.1)</td>
+ </tr>
+
+
+
</table>
- <p>
- Experiments show that writing a single event
- into the database takes approximately 10 milliseconds, on a
- "standard" PC. If pooled connections are used, this figure
- drops to around 1 milliseconds. Note that most JDBC drivers
- already ship with connection pooling support.
+ <p>Experiments show that writing a single event into the database
+ takes approximately 10 milliseconds, on a "standard" PC. If pooled
+ connections are used, this figure drops to around 1
+ milliseconds. Note that most JDBC drivers already ship with
+ connection pooling support.
</p>
<p>
3
2
svn commit: r1875 - logback/trunk/logback-site/src/site/pages/manual
by noreply.ceki@qos.ch 27 Oct '08
by noreply.ceki@qos.ch 27 Oct '08
27 Oct '08
Author: ceki
Date: Mon Oct 27 13:15:05 2008
New Revision: 1875
Modified:
logback/trunk/logback-site/src/site/pages/manual/mdc.html
Log:
- minor rewording in the docs
Modified: logback/trunk/logback-site/src/site/pages/manual/mdc.html
==============================================================================
--- logback/trunk/logback-site/src/site/pages/manual/mdc.html (original)
+++ logback/trunk/logback-site/src/site/pages/manual/mdc.html Mon Oct 27 13:15:05 2008
@@ -51,10 +51,11 @@
</p>
<p>To uniquely stamp each request, the user puts contextual
- information into the <code><a
- href="http://www.slf4j.org/api/org/slf4j/MDC.html">MDC</a></code>,
- the abbreviation of Mapped Diagnostic Context. The salient parts
- of the MDC class is shown below.
+ information into the <code>MDC</code>, the abbreviation of Mapped
+ Diagnostic Context. The salient parts of the MDC class are shown
+ below. Please refer to the <a
+ href="http://www.slf4j.org/api/org/slf4j/MDC.html">MDC
+ javadocs</a> for a complete list of methods.
</p>
<div class="source"><pre>package org.slf4j;
@@ -75,18 +76,17 @@
}</pre></div>
<p>The <code>MDC</code> class contains only static methods. It
- lets the developer place information in a <em>diagnostic
- context</em> that can be subsequently retrieved by certain
- logback components. The <code>MDC</code> manages contextual
- information on a <em>per thread basis</em>. A child thread *
- automatically inherits a <em>copy</em> of the mapped diagnostic
- context of * its parent. Typically, while starting to service a
- new client request, the developer will insert pertinent
- contextual information, such as the client id, client's IP
- address, request parameters etc. into the
- <code>MDC</code>. Logback components, if appropriately
- configured, will automatically include this information in each
- log entry.
+ lets the developer place information in a <em>diagnostic
+ context</em> that can be subsequently retrieved by certain logback
+ components. The <code>MDC</code> manages contextual information on
+ a <em>per thread basis</em>. A child thread automatically
+ inherits a <em>copy</em> of the mapped diagnostic context of its
+ parent. Typically, while starting to service a new client request,
+ the developer will insert pertinent contextual information, such
+ as the client id, client's IP address, request parameters
+ etc. into the <code>MDC</code>. Logback components, if
+ appropriately configured, will automatically include this
+ information in each log entry.
</p>
<p>
1
0