Author: ceki Date: Tue Jun 3 21:40:50 2008 New Revision: 1042 Modified: slf4j/trunk/jul-to-slf4j/src/main/java/org/slf4j/bridge/SLF4JBridgeHandler.java slf4j/trunk/slf4j-api/pom.xml slf4j/trunk/slf4j-api/src/main/java/org/slf4j/MDC.java slf4j/trunk/slf4j-api/src/main/java/org/slf4j/helpers/BasicMDCAdapter.java slf4j/trunk/slf4j-api/src/main/java/org/slf4j/helpers/NOPMakerAdapter.java slf4j/trunk/slf4j-api/src/main/java/org/slf4j/spi/MDCAdapter.java slf4j/trunk/slf4j-log4j12/src/main/java/org/slf4j/impl/Log4jMDCAdapter.java slf4j/trunk/slf4j-log4j12/src/test/java/org/slf4j/InvocationTest.java
Log: - added the setContextMap(Map) method to MDCAdapter interface as well as the MDC class as requested in bug 84. - minor changes to SLF4JBridgeHandler - added clirr plugin to slf4j-api module Modified: slf4j/trunk/jul-to-slf4j/src/main/java/org/slf4j/bridge/SLF4JBridgeHandler.java ============================================================================== --- slf4j/trunk/jul-to-slf4j/src/main/java/org/slf4j/bridge/SLF4JBridgeHandler.java (original) +++ slf4j/trunk/jul-to-slf4j/src/main/java/org/slf4j/bridge/SLF4JBridgeHandler.java Tue Jun 3 21:40:50 2008 @@ -44,7 +44,32 @@ // Based on http://bugzilla.slf4j.org/show_bug.cgi?id=38 /** - * JUL bridge/router for SLF4J. + * Bridge/route all JUL log records to the SLF4J API. + * + * <p>Essentially, the idea is to install on the root logger an instance of + * SLF4JBridgeHandler as the sole JUL handler in the system. Subsequently, the + * SLF4JBridgeHandler instance will redirect all JUL log records are redirected to + * the SLF4J API based on the following mapping of levels: + * + * <pre> + * FINEST -> TRACE + * FINER -> DEBUG + * FINE -> DEBUG + * INFO -> INFO + * WARNING -> WARN + * SEVER -> ERROR + * </pre> + * + * Usage: + * + * <pre> + * // once during initialization time of your application + * SLF4JHandler.install(handler); + * + * // usual pattern: get a Logger and then log a message + * java.util.logging.Logger julLogger = java.util.logging.Logger.getLogger("org.wombat"); + * julLogger.fine("hello world"); // this will get redirected to SLF4J + * </pre> * * @author Christian Stein * @author Joern Huxhorn @@ -118,7 +143,7 @@ return LoggerFactory.getLogger(name); } - public void callLocationAwareLogger(LocationAwareLogger lal, LogRecord record) { + protected void callLocationAwareLogger(LocationAwareLogger lal, LogRecord record) { int julLevelValue = record.getLevel().intValue(); int slf4jLevel; @@ -136,7 +161,7 @@ lal.log(null, FQCN, slf4jLevel, record.getMessage(), record.getThrown()); } - public void callPlainSLF4JLogger(Logger slf4jLogger, LogRecord record) { + protected void callPlainSLF4JLogger(Logger slf4jLogger, LogRecord record) { int julLevelValue = record.getLevel().intValue(); if (julLevelValue <= TRACE_LEVEL_THRESHOLD) { slf4jLogger.trace(record.getMessage(), record.getThrown()); @@ -165,9 +190,7 @@ * ignored and is not published. */ public void publish(LogRecord record) { - /* - * Silently ignore null records. - */ + // Silently ignore null records. if (record == null) { return; } @@ -183,5 +206,4 @@ callPlainSLF4JLogger(slf4jLogger, record); } } - } Modified: slf4j/trunk/slf4j-api/pom.xml ============================================================================== --- slf4j/trunk/slf4j-api/pom.xml (original) +++ slf4j/trunk/slf4j-api/pom.xml Tue Jun 3 21:40:50 2008 @@ -20,10 +20,9 @@ <dependencies> - </dependencies> + </dependencies> <build> - <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> @@ -86,7 +85,17 @@ </plugins> </build> - - + + <reporting> + <plugins> + <plugin> + <groupId>org.codehaus.mojo</groupId> + <artifactId>clirr-maven-plugin</artifactId> + <configuration> + <comparisonVersion>1.5.0</comparisonVersion> + </configuration> + </plugin> + </plugins> + </reporting> </project> \ No newline at end of file Modified: slf4j/trunk/slf4j-api/src/main/java/org/slf4j/MDC.java ============================================================================== --- slf4j/trunk/slf4j-api/src/main/java/org/slf4j/MDC.java (original) +++ slf4j/trunk/slf4j-api/src/main/java/org/slf4j/MDC.java Tue Jun 3 21:40:50 2008 @@ -175,6 +175,23 @@ } return mdcAdapter.getCopyOfContextMap(); } + + /** + * Set the current thread's context map by first clearing any existing + * map and then copying the map passed as parameter. The context map passed + * as parameter must only contain keys and values of type String. + * + * @param contextMap must contain only keys and values of type String + * @since 1.5.1 + */ + public static void setContextMap(Map contextMap) { + if (mdcAdapter == null) { + throw new IllegalStateException("MDCAdapter cannot be null. See also " + + NULL_MDCA_URL); + } + mdcAdapter.setContextMap(contextMap); + } + /** * Returns the MDCAdapter instance currently in use. Modified: slf4j/trunk/slf4j-api/src/main/java/org/slf4j/helpers/BasicMDCAdapter.java ============================================================================== --- slf4j/trunk/slf4j-api/src/main/java/org/slf4j/helpers/BasicMDCAdapter.java (original) +++ slf4j/trunk/slf4j-api/src/main/java/org/slf4j/helpers/BasicMDCAdapter.java Tue Jun 3 21:40:50 2008 @@ -131,4 +131,15 @@ } } + public void setContextMap(Map contextMap) { + HashMap hashMap = (HashMap) inheritableThreadLocal.get(); + if (hashMap != null) { + hashMap.clear(); + hashMap.putAll(contextMap); + } else { + hashMap = new HashMap(contextMap); + inheritableThreadLocal.set(hashMap); + } + } + } Modified: slf4j/trunk/slf4j-api/src/main/java/org/slf4j/helpers/NOPMakerAdapter.java ============================================================================== --- slf4j/trunk/slf4j-api/src/main/java/org/slf4j/helpers/NOPMakerAdapter.java (original) +++ slf4j/trunk/slf4j-api/src/main/java/org/slf4j/helpers/NOPMakerAdapter.java Tue Jun 3 21:40:50 2008 @@ -32,4 +32,8 @@ return null; } + public void setContextMap(Map contextMap) { + // NOP + } + } Modified: slf4j/trunk/slf4j-api/src/main/java/org/slf4j/spi/MDCAdapter.java ============================================================================== --- slf4j/trunk/slf4j-api/src/main/java/org/slf4j/spi/MDCAdapter.java (original) +++ slf4j/trunk/slf4j-api/src/main/java/org/slf4j/spi/MDCAdapter.java Tue Jun 3 21:40:50 2008 @@ -77,4 +77,15 @@ * @since 1.5.1 */ public Map getCopyOfContextMap(); + + /** + * Set the current thread's context map by first clearing any existing + * map and then copying the map passed as parameter. The context map + * parameter must only contain keys and values of type String. + * + * @param contextMap must contain only keys and values of type String + * + * @since 1.5.1 + */ + public void setContextMap(Map contextMap); } Modified: slf4j/trunk/slf4j-log4j12/src/main/java/org/slf4j/impl/Log4jMDCAdapter.java ============================================================================== --- slf4j/trunk/slf4j-log4j12/src/main/java/org/slf4j/impl/Log4jMDCAdapter.java (original) +++ slf4j/trunk/slf4j-log4j12/src/main/java/org/slf4j/impl/Log4jMDCAdapter.java Tue Jun 3 21:40:50 2008 @@ -1,6 +1,7 @@ package org.slf4j.impl; import java.util.HashMap; +import java.util.Iterator; import java.util.Map; import org.slf4j.spi.MDCAdapter; @@ -47,5 +48,17 @@ } } - + public void setContextMap(Map contextMap) { + Map old = org.apache.log4j.MDC.getContext(); + if(old == null) { + Iterator entrySetIterator = contextMap.entrySet().iterator(); + while(entrySetIterator.hasNext()) { + Map.Entry mapEntry = (Map.Entry) entrySetIterator.next(); + org.apache.log4j.MDC.put((String) mapEntry.getKey(), mapEntry.getValue()); + } + } else { + old.clear(); + old.putAll(contextMap); + } + } } Modified: slf4j/trunk/slf4j-log4j12/src/test/java/org/slf4j/InvocationTest.java ============================================================================== --- slf4j/trunk/slf4j-log4j12/src/test/java/org/slf4j/InvocationTest.java (original) +++ slf4j/trunk/slf4j-log4j12/src/test/java/org/slf4j/InvocationTest.java Tue Jun 3 21:40:50 2008 @@ -33,6 +33,9 @@ package org.slf4j; +import java.util.HashMap; +import java.util.Map; + import org.apache.log4j.spi.LoggingEvent; import junit.framework.TestCase; @@ -163,4 +166,18 @@ } catch (IllegalArgumentException e) { } } + + public void testMDCContextMapValues() { + Map map = new HashMap(); + map.put("ka", "va"); + map.put("kb", "vb"); + + MDC.put("k", "v"); + assertEquals("v", MDC.get("k")); + MDC.setContextMap(map); + assertNull(MDC.get("k")); + assertEquals("va", MDC.get("ka")); + assertEquals("vb", MDC.get("kb")); + } + } _______________________________________________ dev mailing list dev@slf4j.org http://www.slf4j.org/mailman/listinfo/dev