You are viewing a plain text version of this content. The canonical link for it is here.
Posted to log4j-dev@logging.apache.org by rg...@apache.org on 2011/05/22 09:30:45 UTC

svn commit: r1125875 - in /logging/log4j/branches/BRANCH_2_0_EXPERIMENTAL/rgoers: ./ log4j12-api/src/main/java/org/apache/log4j/ log4j2-api/src/main/java/org/apache/logging/log4j/spi/ log4j2-api/src/test/java/org/apache/logging/log4j/ log4j2-core/src/m...

Author: rgoers
Date: Sun May 22 07:30:44 2011
New Revision: 1125875

URL: http://svn.apache.org/viewvc?rev=1125875&view=rev
Log:
Add support for Commons Logging. Cause SLF4J and JCL adapters to share  base Logger Context

Added:
    logging/log4j/branches/BRANCH_2_0_EXPERIMENTAL/rgoers/log4j2-api/src/main/java/org/apache/logging/log4j/spi/AbstractLoggerWrapper.java
    logging/log4j/branches/BRANCH_2_0_EXPERIMENTAL/rgoers/log4j2-api/src/main/java/org/apache/logging/log4j/spi/LoggerFactory.java
      - copied, changed from r1074871, logging/log4j/branches/BRANCH_2_0_EXPERIMENTAL/rgoers/log4j2-core/src/main/java/org/apache/logging/log4j/core/LoggerFactory.java
    logging/log4j/branches/BRANCH_2_0_EXPERIMENTAL/rgoers/log4j2-jcl/
    logging/log4j/branches/BRANCH_2_0_EXPERIMENTAL/rgoers/log4j2-jcl/log4j2-jcl.iml
    logging/log4j/branches/BRANCH_2_0_EXPERIMENTAL/rgoers/log4j2-jcl/pom.xml
    logging/log4j/branches/BRANCH_2_0_EXPERIMENTAL/rgoers/log4j2-jcl/src/
    logging/log4j/branches/BRANCH_2_0_EXPERIMENTAL/rgoers/log4j2-jcl/src/main/
    logging/log4j/branches/BRANCH_2_0_EXPERIMENTAL/rgoers/log4j2-jcl/src/main/java/
    logging/log4j/branches/BRANCH_2_0_EXPERIMENTAL/rgoers/log4j2-jcl/src/main/java/org/
    logging/log4j/branches/BRANCH_2_0_EXPERIMENTAL/rgoers/log4j2-jcl/src/main/java/org/apache/
    logging/log4j/branches/BRANCH_2_0_EXPERIMENTAL/rgoers/log4j2-jcl/src/main/java/org/apache/logging/
    logging/log4j/branches/BRANCH_2_0_EXPERIMENTAL/rgoers/log4j2-jcl/src/main/java/org/apache/logging/log4j/
    logging/log4j/branches/BRANCH_2_0_EXPERIMENTAL/rgoers/log4j2-jcl/src/main/java/org/apache/logging/log4j/jcl/
    logging/log4j/branches/BRANCH_2_0_EXPERIMENTAL/rgoers/log4j2-jcl/src/main/java/org/apache/logging/log4j/jcl/Log4JLog.java
    logging/log4j/branches/BRANCH_2_0_EXPERIMENTAL/rgoers/log4j2-jcl/src/main/java/org/apache/logging/log4j/jcl/LogFactoryImpl.java
    logging/log4j/branches/BRANCH_2_0_EXPERIMENTAL/rgoers/log4j2-jcl/src/main/resources/
    logging/log4j/branches/BRANCH_2_0_EXPERIMENTAL/rgoers/log4j2-jcl/src/main/resources/META-INF/
    logging/log4j/branches/BRANCH_2_0_EXPERIMENTAL/rgoers/log4j2-jcl/src/main/resources/META-INF/services/
    logging/log4j/branches/BRANCH_2_0_EXPERIMENTAL/rgoers/log4j2-jcl/src/main/resources/META-INF/services/org.apache.commons.logging.LogFactory
    logging/log4j/branches/BRANCH_2_0_EXPERIMENTAL/rgoers/log4j2-jcl/src/test/
    logging/log4j/branches/BRANCH_2_0_EXPERIMENTAL/rgoers/log4j2-jcl/src/test/java/
    logging/log4j/branches/BRANCH_2_0_EXPERIMENTAL/rgoers/log4j2-jcl/src/test/java/org/
    logging/log4j/branches/BRANCH_2_0_EXPERIMENTAL/rgoers/log4j2-jcl/src/test/java/org/apache/
    logging/log4j/branches/BRANCH_2_0_EXPERIMENTAL/rgoers/log4j2-jcl/src/test/java/org/apache/logging/
    logging/log4j/branches/BRANCH_2_0_EXPERIMENTAL/rgoers/log4j2-jcl/src/test/java/org/apache/logging/log4j/
    logging/log4j/branches/BRANCH_2_0_EXPERIMENTAL/rgoers/log4j2-jcl/src/test/java/org/apache/logging/log4j/jcl/
    logging/log4j/branches/BRANCH_2_0_EXPERIMENTAL/rgoers/log4j2-jcl/src/test/java/org/apache/logging/log4j/jcl/LoggerTest.java
    logging/log4j/branches/BRANCH_2_0_EXPERIMENTAL/rgoers/log4j2-jcl/src/test/resources/
    logging/log4j/branches/BRANCH_2_0_EXPERIMENTAL/rgoers/log4j2-jcl/src/test/resources/log4j-test1.xml
    logging/log4j/branches/BRANCH_2_0_EXPERIMENTAL/rgoers/slf4j-impl/src/main/java/org/apache/logging/slf4j/
    logging/log4j/branches/BRANCH_2_0_EXPERIMENTAL/rgoers/slf4j-impl/src/main/java/org/apache/logging/slf4j/SLF4JLoggingException.java
      - copied, changed from r1074871, logging/log4j/branches/BRANCH_2_0_EXPERIMENTAL/rgoers/log4j2-core/src/main/java/org/apache/logging/log4j/core/LoggingException.java
    logging/log4j/branches/BRANCH_2_0_EXPERIMENTAL/rgoers/slf4j-impl/src/main/java/org/slf4j/impl/SLF4JLogger.java
Removed:
    logging/log4j/branches/BRANCH_2_0_EXPERIMENTAL/rgoers/log4j2-core/src/main/java/org/apache/logging/log4j/core/LoggerFactory.java
    logging/log4j/branches/BRANCH_2_0_EXPERIMENTAL/rgoers/slf4j-impl/src/main/java/org/slf4j/impl/Log4JLogger.java
Modified:
    logging/log4j/branches/BRANCH_2_0_EXPERIMENTAL/rgoers/log4j12-api/src/main/java/org/apache/log4j/Category.java
    logging/log4j/branches/BRANCH_2_0_EXPERIMENTAL/rgoers/log4j2-api/src/main/java/org/apache/logging/log4j/spi/LoggerContext.java
    logging/log4j/branches/BRANCH_2_0_EXPERIMENTAL/rgoers/log4j2-api/src/test/java/org/apache/logging/log4j/SimpleLoggerContext.java
    logging/log4j/branches/BRANCH_2_0_EXPERIMENTAL/rgoers/log4j2-core/src/main/java/org/apache/logging/log4j/core/LoggerContext.java
    logging/log4j/branches/BRANCH_2_0_EXPERIMENTAL/rgoers/log4j2-core/src/main/java/org/apache/logging/log4j/core/appender/ListAppender.java
    logging/log4j/branches/BRANCH_2_0_EXPERIMENTAL/rgoers/pom.xml
    logging/log4j/branches/BRANCH_2_0_EXPERIMENTAL/rgoers/slf4j-impl/src/main/java/org/slf4j/helpers/Log4JLoggerFactory.java
    logging/log4j/branches/BRANCH_2_0_EXPERIMENTAL/rgoers/slf4j-impl/src/test/java/org/apache/logging/slf4j/LoggerTest.java
    logging/log4j/branches/BRANCH_2_0_EXPERIMENTAL/rgoers/slf4j-impl/src/test/resources/log4j-test1.xml

Modified: logging/log4j/branches/BRANCH_2_0_EXPERIMENTAL/rgoers/log4j12-api/src/main/java/org/apache/log4j/Category.java
URL: http://svn.apache.org/viewvc/logging/log4j/branches/BRANCH_2_0_EXPERIMENTAL/rgoers/log4j12-api/src/main/java/org/apache/log4j/Category.java?rev=1125875&r1=1125874&r2=1125875&view=diff
==============================================================================
--- logging/log4j/branches/BRANCH_2_0_EXPERIMENTAL/rgoers/log4j12-api/src/main/java/org/apache/log4j/Category.java (original)
+++ logging/log4j/branches/BRANCH_2_0_EXPERIMENTAL/rgoers/log4j12-api/src/main/java/org/apache/log4j/Category.java Sun May 22 07:30:44 2011
@@ -19,8 +19,6 @@ package org.apache.log4j;
 
 import org.apache.logging.log4j.Marker;
 import org.apache.logging.log4j.core.LoggerContext;
-import org.apache.logging.log4j.core.LoggerFactory;
-import org.apache.logging.log4j.core.config.plugins.PluginManager;
 import org.apache.logging.log4j.core.helpers.NameUtil;
 import org.apache.logging.log4j.message.LocalizedMessage;
 import org.apache.logging.log4j.message.Message;
@@ -267,7 +265,7 @@ public class Category {
         }
     }
 
-    protected LoggerFactory getFactory() {
+    protected org.apache.logging.log4j.spi.LoggerFactory getFactory() {
         return FACTORY;
     }
 
@@ -278,7 +276,7 @@ public class Category {
         }
     }
 
-    private static class CategoryFactory implements LoggerFactory {
+    private static class CategoryFactory implements org.apache.logging.log4j.spi.LoggerFactory<LoggerContext> {
 
         public org.apache.logging.log4j.core.Logger newInstance(LoggerContext ctx, String name) {
             return new CategoryLogger(ctx, name);

Added: logging/log4j/branches/BRANCH_2_0_EXPERIMENTAL/rgoers/log4j2-api/src/main/java/org/apache/logging/log4j/spi/AbstractLoggerWrapper.java
URL: http://svn.apache.org/viewvc/logging/log4j/branches/BRANCH_2_0_EXPERIMENTAL/rgoers/log4j2-api/src/main/java/org/apache/logging/log4j/spi/AbstractLoggerWrapper.java?rev=1125875&view=auto
==============================================================================
--- logging/log4j/branches/BRANCH_2_0_EXPERIMENTAL/rgoers/log4j2-api/src/main/java/org/apache/logging/log4j/spi/AbstractLoggerWrapper.java (added)
+++ logging/log4j/branches/BRANCH_2_0_EXPERIMENTAL/rgoers/log4j2-api/src/main/java/org/apache/logging/log4j/spi/AbstractLoggerWrapper.java Sun May 22 07:30:44 2011
@@ -0,0 +1,81 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache license, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the license for the specific language governing permissions and
+ * limitations under the license.
+ */
+package org.apache.logging.log4j.spi;
+
+import org.apache.logging.log4j.Level;
+import org.apache.logging.log4j.Marker;
+import org.apache.logging.log4j.message.Message;
+
+/**
+ * Wrapper class that exposes the protected AbstractLogger methods to support wrapped loggers.
+ */
+public class AbstractLoggerWrapper extends AbstractLogger {
+
+    protected final AbstractLogger logger;
+    protected final String name;
+
+    public AbstractLoggerWrapper(AbstractLogger logger, String name) {
+        this.logger = logger;
+        this.name = name;
+    }
+
+    @Override
+    public void log(Marker marker, String fqcn, Level level, Message data, Throwable t) {
+        logger.log(marker, fqcn, level, data, t);
+    }
+
+    @Override
+    public boolean isEnabled(Level level, Marker marker, String data) {
+        return logger.isEnabled(level, marker, data);
+    }
+
+    @Override
+    public boolean isEnabled(Level level, Marker marker, String data, Throwable t) {
+        return logger.isEnabled(level, marker, data, t);
+    }
+
+    @Override
+    public boolean isEnabled(Level level, Marker marker, String data, Object p1) {
+        return logger.isEnabled(level, marker, data, p1);
+    }
+
+    @Override
+    public boolean isEnabled(Level level, Marker marker, String data, Object p1, Object p2) {
+        return logger.isEnabled(level, marker, data, p1, p2);
+    }
+
+    @Override
+    public boolean isEnabled(Level level, Marker marker, String data, Object p1, Object p2, Object p3) {
+        return logger.isEnabled(level, marker, data, p1, p2, p3);
+    }
+
+    @Override
+    public boolean isEnabled(Level level, Marker marker, String data, Object p1, Object p2, Object p3,
+                                Object... params) {
+        return logger.isEnabled(level, marker, data, p2, p2, p3, params);
+    }
+
+    @Override
+    public boolean isEnabled(Level level, Marker marker, Object data, Throwable t) {
+        return logger.isEnabled(level, marker, data, t);
+    }
+
+    @Override
+    public boolean isEnabled(Level level, Marker marker, Message data, Throwable t) {
+        return logger.isEnabled(level, marker, data, t);
+    }
+}

Modified: logging/log4j/branches/BRANCH_2_0_EXPERIMENTAL/rgoers/log4j2-api/src/main/java/org/apache/logging/log4j/spi/LoggerContext.java
URL: http://svn.apache.org/viewvc/logging/log4j/branches/BRANCH_2_0_EXPERIMENTAL/rgoers/log4j2-api/src/main/java/org/apache/logging/log4j/spi/LoggerContext.java?rev=1125875&r1=1125874&r2=1125875&view=diff
==============================================================================
--- logging/log4j/branches/BRANCH_2_0_EXPERIMENTAL/rgoers/log4j2-api/src/main/java/org/apache/logging/log4j/spi/LoggerContext.java (original)
+++ logging/log4j/branches/BRANCH_2_0_EXPERIMENTAL/rgoers/log4j2-api/src/main/java/org/apache/logging/log4j/spi/LoggerContext.java Sun May 22 07:30:44 2011
@@ -9,6 +9,8 @@ public interface LoggerContext {
 
     Logger getLogger(String name);
 
+    Logger getLogger(LoggerFactory factory, String name);
+
     boolean hasLogger(String name);
 
     Object getExternalContext();

Copied: logging/log4j/branches/BRANCH_2_0_EXPERIMENTAL/rgoers/log4j2-api/src/main/java/org/apache/logging/log4j/spi/LoggerFactory.java (from r1074871, logging/log4j/branches/BRANCH_2_0_EXPERIMENTAL/rgoers/log4j2-core/src/main/java/org/apache/logging/log4j/core/LoggerFactory.java)
URL: http://svn.apache.org/viewvc/logging/log4j/branches/BRANCH_2_0_EXPERIMENTAL/rgoers/log4j2-api/src/main/java/org/apache/logging/log4j/spi/LoggerFactory.java?p2=logging/log4j/branches/BRANCH_2_0_EXPERIMENTAL/rgoers/log4j2-api/src/main/java/org/apache/logging/log4j/spi/LoggerFactory.java&p1=logging/log4j/branches/BRANCH_2_0_EXPERIMENTAL/rgoers/log4j2-core/src/main/java/org/apache/logging/log4j/core/LoggerFactory.java&r1=1074871&r2=1125875&rev=1125875&view=diff
==============================================================================
--- logging/log4j/branches/BRANCH_2_0_EXPERIMENTAL/rgoers/log4j2-core/src/main/java/org/apache/logging/log4j/core/LoggerFactory.java (original)
+++ logging/log4j/branches/BRANCH_2_0_EXPERIMENTAL/rgoers/log4j2-api/src/main/java/org/apache/logging/log4j/spi/LoggerFactory.java Sun May 22 07:30:44 2011
@@ -1,9 +1,11 @@
-package org.apache.logging.log4j.core;
+package org.apache.logging.log4j.spi;
+
+import org.apache.logging.log4j.Logger;
 
 /**
  *
  */
-public interface LoggerFactory {
+public interface LoggerFactory<C extends LoggerContext> {
 
-    Logger newInstance(LoggerContext ctx, String name);
+    Logger newInstance(C ctx, String name);
 }

Modified: logging/log4j/branches/BRANCH_2_0_EXPERIMENTAL/rgoers/log4j2-api/src/test/java/org/apache/logging/log4j/SimpleLoggerContext.java
URL: http://svn.apache.org/viewvc/logging/log4j/branches/BRANCH_2_0_EXPERIMENTAL/rgoers/log4j2-api/src/test/java/org/apache/logging/log4j/SimpleLoggerContext.java?rev=1125875&r1=1125874&r2=1125875&view=diff
==============================================================================
--- logging/log4j/branches/BRANCH_2_0_EXPERIMENTAL/rgoers/log4j2-api/src/test/java/org/apache/logging/log4j/SimpleLoggerContext.java (original)
+++ logging/log4j/branches/BRANCH_2_0_EXPERIMENTAL/rgoers/log4j2-api/src/test/java/org/apache/logging/log4j/SimpleLoggerContext.java Sun May 22 07:30:44 2011
@@ -17,6 +17,7 @@
 package org.apache.logging.log4j;
 
 import org.apache.logging.log4j.spi.LoggerContext;
+import org.apache.logging.log4j.spi.LoggerFactory;
 
 /**
  *
@@ -35,4 +36,8 @@ public class SimpleLoggerContext impleme
     public Object getExternalContext() {
         return null;
     }
+
+    public Logger getLogger(LoggerFactory factory, String name) {
+        return factory.newInstance(this, name);
+    }
 }

Modified: logging/log4j/branches/BRANCH_2_0_EXPERIMENTAL/rgoers/log4j2-core/src/main/java/org/apache/logging/log4j/core/LoggerContext.java
URL: http://svn.apache.org/viewvc/logging/log4j/branches/BRANCH_2_0_EXPERIMENTAL/rgoers/log4j2-core/src/main/java/org/apache/logging/log4j/core/LoggerContext.java?rev=1125875&r1=1125874&r2=1125875&view=diff
==============================================================================
--- logging/log4j/branches/BRANCH_2_0_EXPERIMENTAL/rgoers/log4j2-core/src/main/java/org/apache/logging/log4j/core/LoggerContext.java (original)
+++ logging/log4j/branches/BRANCH_2_0_EXPERIMENTAL/rgoers/log4j2-core/src/main/java/org/apache/logging/log4j/core/LoggerContext.java Sun May 22 07:30:44 2011
@@ -18,9 +18,8 @@ package org.apache.logging.log4j.core;
 
 import org.apache.logging.log4j.core.config.Configuration;
 import org.apache.logging.log4j.core.config.ConfigurationFactory;
-import org.apache.logging.log4j.core.config.DefaultConfiguration;
-import org.apache.logging.log4j.core.config.XMLConfiguration;
 import org.apache.logging.log4j.internal.StatusLogger;
+import org.apache.logging.log4j.spi.LoggerFactory;
 
 import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.ConcurrentMap;
@@ -42,7 +41,7 @@ public class LoggerContext implements or
 
     private static StatusLogger logger = StatusLogger.getLogger();
 
-    private static final LoggerFactory FACTORY = new Factory();
+    private static final LoggerFactory<LoggerContext> FACTORY = new Factory();
 
     private Object externalContext = null;
 
@@ -68,7 +67,7 @@ public class LoggerContext implements or
             return logger;
         }
 
-        logger = factory.newInstance(this, name);
+        logger = (Logger) factory.newInstance(this, name);
         Logger prev = loggers.putIfAbsent(name, logger);
         return prev == null ? logger : prev;
     }
@@ -128,7 +127,7 @@ public class LoggerContext implements or
         }
     }
 
-    private static class Factory implements LoggerFactory {
+    private static class Factory implements LoggerFactory<LoggerContext> {
 
         public Logger newInstance(LoggerContext ctx, String name) {
             return new Logger(ctx, name);

Modified: logging/log4j/branches/BRANCH_2_0_EXPERIMENTAL/rgoers/log4j2-core/src/main/java/org/apache/logging/log4j/core/appender/ListAppender.java
URL: http://svn.apache.org/viewvc/logging/log4j/branches/BRANCH_2_0_EXPERIMENTAL/rgoers/log4j2-core/src/main/java/org/apache/logging/log4j/core/appender/ListAppender.java?rev=1125875&r1=1125874&r2=1125875&view=diff
==============================================================================
--- logging/log4j/branches/BRANCH_2_0_EXPERIMENTAL/rgoers/log4j2-core/src/main/java/org/apache/logging/log4j/core/appender/ListAppender.java (original)
+++ logging/log4j/branches/BRANCH_2_0_EXPERIMENTAL/rgoers/log4j2-core/src/main/java/org/apache/logging/log4j/core/appender/ListAppender.java Sun May 22 07:30:44 2011
@@ -17,6 +17,7 @@
 package org.apache.logging.log4j.core.appender;
 
 import org.apache.logging.log4j.core.Filter;
+import org.apache.logging.log4j.core.Layout;
 import org.apache.logging.log4j.core.LogEvent;
 import org.apache.logging.log4j.core.config.plugins.Plugin;
 import org.apache.logging.log4j.core.config.plugins.PluginAttr;
@@ -37,28 +38,41 @@ public class ListAppender extends Append
 
     private List<LogEvent> events = new ArrayList<LogEvent>();
 
+    private List<String> messages = new ArrayList<String>();
+
     public ListAppender(String name) {
         super(name, null, null);
     }
 
-    public ListAppender(String name, Filters filters) {
-        super(name, filters, null);
+    public ListAppender(String name, Filters filters, Layout layout) {
+        super(name, filters, layout);
     }
 
     public synchronized void append(LogEvent event) {
-        events.add(event);
+        Layout layout = getLayout();
+        if (layout == null) {
+            events.add(event);
+        } else {
+            messages.add(new String(layout.format(event)));
+        }
     }
 
     public synchronized void clear() {
         events.clear();
+        messages.clear();
     }
 
     public synchronized List<LogEvent> getEvents() {
         return Collections.unmodifiableList(events);
     }
 
+    public synchronized List<String> getMessages() {
+        return Collections.unmodifiableList(messages);
+    }
+
     @PluginFactory
     public static ListAppender createAppender(@PluginAttr("name") String name,
+                                              @PluginElement("layout") Layout layout,
                                               @PluginElement("filters") Filters filters) {
 
         if (name == null) {
@@ -66,6 +80,6 @@ public class ListAppender extends Append
             return null;
         }
 
-        return new ListAppender(name, filters);
+        return new ListAppender(name, filters, layout);
     }
 }

Added: logging/log4j/branches/BRANCH_2_0_EXPERIMENTAL/rgoers/log4j2-jcl/log4j2-jcl.iml
URL: http://svn.apache.org/viewvc/logging/log4j/branches/BRANCH_2_0_EXPERIMENTAL/rgoers/log4j2-jcl/log4j2-jcl.iml?rev=1125875&view=auto
==============================================================================
--- logging/log4j/branches/BRANCH_2_0_EXPERIMENTAL/rgoers/log4j2-jcl/log4j2-jcl.iml (added)
+++ logging/log4j/branches/BRANCH_2_0_EXPERIMENTAL/rgoers/log4j2-jcl/log4j2-jcl.iml Sun May 22 07:30:44 2011
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<module org.jetbrains.idea.maven.project.MavenProjectsManager.isMavenModule="true" type="JAVA_MODULE" version="4">
+  <component name="NewModuleRootManager" LANGUAGE_LEVEL="JDK_1_5" inherit-compiler-output="false">
+    <output url="file://$MODULE_DIR$/target/classes" />
+    <output-test url="file://$MODULE_DIR$/target/test-classes" />
+    <exclude-output />
+    <content url="file://$MODULE_DIR$">
+      <sourceFolder url="file://$MODULE_DIR$/src/main/java" isTestSource="false" />
+      <sourceFolder url="file://$MODULE_DIR$/src/test/java" isTestSource="true" />
+      <excludeFolder url="file://$MODULE_DIR$/target" />
+    </content>
+    <orderEntry type="inheritedJdk" />
+    <orderEntry type="sourceFolder" forTests="false" />
+    <orderEntry type="library" scope="TEST" name="Maven: junit:junit:4.3.1" level="project" />
+    <orderEntry type="library" name="Maven: commons-logging:commons-logging:1.1.1" level="project" />
+    <orderEntry type="module" module-name="log4j2-core" />
+    <orderEntry type="module" module-name="log4j2-api" />
+  </component>
+</module>
+

Added: logging/log4j/branches/BRANCH_2_0_EXPERIMENTAL/rgoers/log4j2-jcl/pom.xml
URL: http://svn.apache.org/viewvc/logging/log4j/branches/BRANCH_2_0_EXPERIMENTAL/rgoers/log4j2-jcl/pom.xml?rev=1125875&view=auto
==============================================================================
--- logging/log4j/branches/BRANCH_2_0_EXPERIMENTAL/rgoers/log4j2-jcl/pom.xml (added)
+++ logging/log4j/branches/BRANCH_2_0_EXPERIMENTAL/rgoers/log4j2-jcl/pom.xml Sun May 22 07:30:44 2011
@@ -0,0 +1,39 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <parent>
+    <artifactId>log4j2-rgoers</artifactId>
+    <groupId>org.apache.logging</groupId>
+    <version>1.99.0-SNAPSHOT</version>
+  </parent>
+  <modelVersion>4.0.0</modelVersion>
+
+  <groupId>org.apache.logging</groupId>
+  <artifactId>log4j2-jcl</artifactId>
+  <version>1.99.0-SNAPSHOT</version>
+  <packaging>jar</packaging>
+  <name>Log4J2 Commons Logging</name>
+  <description>Log4j2 Commons Logging Adapter</description>
+  <url>http://logging.apache.org/log4j/experimental</url>
+
+  <dependencies>
+     <dependency>
+      <groupId>junit</groupId>
+      <artifactId>junit</artifactId>
+      <version>4.3.1</version>
+      <scope>test</scope>
+    </dependency>
+    <dependency>
+      <groupId>commons-logging</groupId>
+      <artifactId>commons-logging</artifactId>
+      <version>1.1.1</version>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.logging</groupId>
+      <artifactId>log4j2-core</artifactId>
+    </dependency>
+  </dependencies>
+
+
+</project>
\ No newline at end of file

Added: logging/log4j/branches/BRANCH_2_0_EXPERIMENTAL/rgoers/log4j2-jcl/src/main/java/org/apache/logging/log4j/jcl/Log4JLog.java
URL: http://svn.apache.org/viewvc/logging/log4j/branches/BRANCH_2_0_EXPERIMENTAL/rgoers/log4j2-jcl/src/main/java/org/apache/logging/log4j/jcl/Log4JLog.java?rev=1125875&view=auto
==============================================================================
--- logging/log4j/branches/BRANCH_2_0_EXPERIMENTAL/rgoers/log4j2-jcl/src/main/java/org/apache/logging/log4j/jcl/Log4JLog.java (added)
+++ logging/log4j/branches/BRANCH_2_0_EXPERIMENTAL/rgoers/log4j2-jcl/src/main/java/org/apache/logging/log4j/jcl/Log4JLog.java Sun May 22 07:30:44 2011
@@ -0,0 +1,31 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache license, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the license for the specific language governing permissions and
+ * limitations under the license.
+ */
+package org.apache.logging.log4j.jcl;
+
+import org.apache.commons.logging.Log;
+import org.apache.logging.log4j.spi.AbstractLogger;
+import org.apache.logging.log4j.spi.AbstractLoggerWrapper;
+
+/**
+ *
+ */
+public class Log4JLog extends AbstractLoggerWrapper implements Log {
+
+    public Log4JLog(AbstractLogger logger, String name) {
+        super(logger, name);
+    }
+}

Added: logging/log4j/branches/BRANCH_2_0_EXPERIMENTAL/rgoers/log4j2-jcl/src/main/java/org/apache/logging/log4j/jcl/LogFactoryImpl.java
URL: http://svn.apache.org/viewvc/logging/log4j/branches/BRANCH_2_0_EXPERIMENTAL/rgoers/log4j2-jcl/src/main/java/org/apache/logging/log4j/jcl/LogFactoryImpl.java?rev=1125875&view=auto
==============================================================================
--- logging/log4j/branches/BRANCH_2_0_EXPERIMENTAL/rgoers/log4j2-jcl/src/main/java/org/apache/logging/log4j/jcl/LogFactoryImpl.java (added)
+++ logging/log4j/branches/BRANCH_2_0_EXPERIMENTAL/rgoers/log4j2-jcl/src/main/java/org/apache/logging/log4j/jcl/LogFactoryImpl.java Sun May 22 07:30:44 2011
@@ -0,0 +1,92 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache license, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the license for the specific language governing permissions and
+ * limitations under the license.
+ */
+package org.apache.logging.log4j.jcl;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogConfigurationException;
+import org.apache.commons.logging.LogFactory;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.spi.AbstractLogger;
+import org.apache.logging.log4j.spi.LoggerContext;
+
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.ConcurrentMap;
+
+/**
+ *
+ */
+public class LogFactoryImpl extends LogFactory {
+
+    private static LoggerContext context = LogManager.getContext();
+
+    private ConcurrentMap<String, Log> loggers = new ConcurrentHashMap<String, Log>();
+
+    private ConcurrentMap<String, Object> attributes = new ConcurrentHashMap<String, Object>();
+
+    public static LoggerContext getContext() {
+        return context;
+    }
+
+    public Log getInstance(String name) throws LogConfigurationException {
+        if (loggers.containsKey(name)) {
+            return loggers.get(name);
+        }
+        org.apache.logging.log4j.Logger logger = context.getLogger(name);
+        if (logger instanceof AbstractLogger) {
+            loggers.putIfAbsent(name, new Log4JLog((AbstractLogger) logger, name));
+            return loggers.get(name);
+        }
+        throw new LogConfigurationException("SLF4J Adapter requires base logging system to extend Log4J AbstractLogger");
+    }
+
+    @Override
+    public Object getAttribute(String name) {
+        return attributes.get(name);
+    }
+
+    @Override
+    public String[] getAttributeNames() {
+        return attributes.keySet().toArray(new String[attributes.size()]);
+    }
+
+    @Override
+    public Log getInstance(Class clazz) throws LogConfigurationException {
+        return getInstance(clazz.getName());
+    }
+
+    /**
+     * This method is supposed to clear all loggers. In this implementation it will clear all the logger
+     * wrappers but the loggers managed by the underlying logger context will not be.
+     */
+    @Override
+    public void release() {
+        loggers.clear();
+    }
+
+    @Override
+    public void removeAttribute(String name) {
+        attributes.remove(name);
+    }
+
+    @Override
+    public void setAttribute(String name, Object value) {
+        attributes.put(name, value);
+    }
+
+
+
+}

Added: logging/log4j/branches/BRANCH_2_0_EXPERIMENTAL/rgoers/log4j2-jcl/src/main/resources/META-INF/services/org.apache.commons.logging.LogFactory
URL: http://svn.apache.org/viewvc/logging/log4j/branches/BRANCH_2_0_EXPERIMENTAL/rgoers/log4j2-jcl/src/main/resources/META-INF/services/org.apache.commons.logging.LogFactory?rev=1125875&view=auto
==============================================================================
--- logging/log4j/branches/BRANCH_2_0_EXPERIMENTAL/rgoers/log4j2-jcl/src/main/resources/META-INF/services/org.apache.commons.logging.LogFactory (added)
+++ logging/log4j/branches/BRANCH_2_0_EXPERIMENTAL/rgoers/log4j2-jcl/src/main/resources/META-INF/services/org.apache.commons.logging.LogFactory Sun May 22 07:30:44 2011
@@ -0,0 +1 @@
+org.apache.logging.log4j.jcl.LogFactoryImpl
\ No newline at end of file

Added: logging/log4j/branches/BRANCH_2_0_EXPERIMENTAL/rgoers/log4j2-jcl/src/test/java/org/apache/logging/log4j/jcl/LoggerTest.java
URL: http://svn.apache.org/viewvc/logging/log4j/branches/BRANCH_2_0_EXPERIMENTAL/rgoers/log4j2-jcl/src/test/java/org/apache/logging/log4j/jcl/LoggerTest.java?rev=1125875&view=auto
==============================================================================
--- logging/log4j/branches/BRANCH_2_0_EXPERIMENTAL/rgoers/log4j2-jcl/src/test/java/org/apache/logging/log4j/jcl/LoggerTest.java (added)
+++ logging/log4j/branches/BRANCH_2_0_EXPERIMENTAL/rgoers/log4j2-jcl/src/test/java/org/apache/logging/log4j/jcl/LoggerTest.java Sun May 22 07:30:44 2011
@@ -0,0 +1,85 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache license, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the license for the specific language governing permissions and
+ * limitations under the license.
+ */
+package org.apache.logging.log4j.jcl;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.apache.logging.log4j.core.Appender;
+import org.apache.logging.log4j.core.LoggerContext;
+import org.apache.logging.log4j.core.appender.ListAppender;
+import org.apache.logging.log4j.core.config.Configuration;
+import org.apache.logging.log4j.core.config.XMLConfigurationFactory;
+import org.apache.logging.log4j.internal.StatusLogger;
+import org.junit.AfterClass;
+import org.junit.BeforeClass;
+import org.junit.Test;
+
+import java.util.List;
+import java.util.Map;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertTrue;
+
+/**
+ *
+ */
+public class LoggerTest {
+
+    private static final String CONFIG = "log4j-test1.xml";
+
+    @BeforeClass
+    public static void setupClass() {
+        System.setProperty(XMLConfigurationFactory.CONFIGURATION_FILE_PROPERTY, CONFIG);
+        LoggerContext ctx = (LoggerContext) LogFactoryImpl.getContext();
+        Configuration config = ctx.getConfiguration();
+    }
+
+    @AfterClass
+    public static void cleanupClass() {
+        System.clearProperty(XMLConfigurationFactory.CONFIGURATION_FILE_PROPERTY);
+        LoggerContext ctx = (LoggerContext) LogFactoryImpl.getContext();
+        ctx.reconfigure();
+        StatusLogger.getLogger().reset();
+    }
+
+    Log logger = LogFactory.getLog("LoggerTest");
+
+    @Test
+    public void testLog() {
+        logger.debug("Test message");
+        verify("List", "o.a.l.l.j.LoggerTest Test message MDC{}\n");
+        logger.debug("Exception: " , new NullPointerException("Test"));
+        verify("List", "o.a.l.l.j.LoggerTest Exception:  MDC{}\n");
+        logger.info("Info Message");
+        verify("List", "o.a.l.l.j.LoggerTest Info Message MDC{}\n");
+    }
+
+    private void verify(String name, String expected) {
+        LoggerContext ctx = (LoggerContext) LogFactoryImpl.getContext();
+        Map<String, Appender> list = ctx.getConfiguration().getAppenders();
+        Appender listApp = list.get(name);
+        assertNotNull("Missing Appender", listApp);
+        assertTrue("Not a ListAppender", listApp instanceof ListAppender);
+        List<String> events = ((ListAppender) listApp).getMessages();
+        assertTrue("Incorrect number of messages. Expected 1 Actual " + events.size(), events.size()== 1);
+        String actual = events.get(0);
+        assertEquals("Incorrect message. Expected " + expected + ". Actual " + actual, expected, actual);
+        ((ListAppender) listApp).clear();
+    }
+
+}

Added: logging/log4j/branches/BRANCH_2_0_EXPERIMENTAL/rgoers/log4j2-jcl/src/test/resources/log4j-test1.xml
URL: http://svn.apache.org/viewvc/logging/log4j/branches/BRANCH_2_0_EXPERIMENTAL/rgoers/log4j2-jcl/src/test/resources/log4j-test1.xml?rev=1125875&view=auto
==============================================================================
--- logging/log4j/branches/BRANCH_2_0_EXPERIMENTAL/rgoers/log4j2-jcl/src/test/resources/log4j-test1.xml (added)
+++ logging/log4j/branches/BRANCH_2_0_EXPERIMENTAL/rgoers/log4j2-jcl/src/test/resources/log4j-test1.xml Sun May 22 07:30:44 2011
@@ -0,0 +1,41 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<configuration packages="" status="debug" name="LoggerTest">
+  <properties>
+    <property name="filename">target/test.log</property>
+  </properties>
+  <filters>
+    <Threshold level="trace"/>
+  </filters>
+
+  <appenders>
+    <List name="EventLogger">
+      <PatternLayout pattern="%C{1.} %m%n"/>
+    </List>
+    <Console name="STDOUT">
+      <PatternLayout pattern="%C{1.} %m MDC%X%n"/>
+    </Console>
+    <File name="File" fileName="${filename}">
+      <PatternLayout>
+        <pattern>%d %p %C{1.} [%t] %m%n</pattern>
+      </PatternLayout>
+    </File>
+    <List name="List">
+      <PatternLayout pattern="%C{1.} %m MDC%X%n"/>
+    </List>
+  </appenders>
+
+  <loggers>
+    <logger name="EventLogger" level="info" additivity="false">
+      <appender-ref ref="EventLogger"/>
+    </logger>>
+
+    <logger name="org.apache.logging.log4j.test2" level="debug" additivity="false">
+      <appender-ref ref="File"/>
+    </logger>>
+
+    <root level="trace">
+      <appender-ref ref="List"/>
+    </root>
+  </loggers>
+
+</configuration>
\ No newline at end of file

Modified: logging/log4j/branches/BRANCH_2_0_EXPERIMENTAL/rgoers/pom.xml
URL: http://svn.apache.org/viewvc/logging/log4j/branches/BRANCH_2_0_EXPERIMENTAL/rgoers/pom.xml?rev=1125875&r1=1125874&r2=1125875&view=diff
==============================================================================
--- logging/log4j/branches/BRANCH_2_0_EXPERIMENTAL/rgoers/pom.xml (original)
+++ logging/log4j/branches/BRANCH_2_0_EXPERIMENTAL/rgoers/pom.xml Sun May 22 07:30:44 2011
@@ -209,5 +209,6 @@
     <module>log4j12-api</module>
     <module>log4j2-core</module>
     <module>slf4j-impl</module>
+    <module>log4j2-jcl</module>
   </modules>
 </project>

Copied: logging/log4j/branches/BRANCH_2_0_EXPERIMENTAL/rgoers/slf4j-impl/src/main/java/org/apache/logging/slf4j/SLF4JLoggingException.java (from r1074871, logging/log4j/branches/BRANCH_2_0_EXPERIMENTAL/rgoers/log4j2-core/src/main/java/org/apache/logging/log4j/core/LoggingException.java)
URL: http://svn.apache.org/viewvc/logging/log4j/branches/BRANCH_2_0_EXPERIMENTAL/rgoers/slf4j-impl/src/main/java/org/apache/logging/slf4j/SLF4JLoggingException.java?p2=logging/log4j/branches/BRANCH_2_0_EXPERIMENTAL/rgoers/slf4j-impl/src/main/java/org/apache/logging/slf4j/SLF4JLoggingException.java&p1=logging/log4j/branches/BRANCH_2_0_EXPERIMENTAL/rgoers/log4j2-core/src/main/java/org/apache/logging/log4j/core/LoggingException.java&r1=1074871&r2=1125875&rev=1125875&view=diff
==============================================================================
--- logging/log4j/branches/BRANCH_2_0_EXPERIMENTAL/rgoers/log4j2-core/src/main/java/org/apache/logging/log4j/core/LoggingException.java (original)
+++ logging/log4j/branches/BRANCH_2_0_EXPERIMENTAL/rgoers/slf4j-impl/src/main/java/org/apache/logging/slf4j/SLF4JLoggingException.java Sun May 22 07:30:44 2011
@@ -14,26 +14,23 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.logging.log4j.core;
+package org.apache.logging.slf4j;
 
 /**
- * Exception thrown when a exception occurs while logging.  In most cases exceptions will be handled
- * within Log4j but certain Appenders may be configured to allow exceptions to propagate to the
- * application. This is a RuntimeException so that the exception may be thrown in those cases without
- * requiring all Logger methods be contained with try/catch blocks.
+ * Exception thrown when the SLF4J apapter encounters a problem.
  *
  */
-public class LoggingException extends RuntimeException {
+public class SLF4JLoggingException extends RuntimeException {
 
-    public LoggingException(String msg) {
+    public SLF4JLoggingException(String msg) {
         super(msg);
     }
 
-    public LoggingException(String msg, Exception ex) {
+    public SLF4JLoggingException(String msg, Exception ex) {
         super(msg, ex);
     }
 
-    public LoggingException(Exception ex) {
+    public SLF4JLoggingException(Exception ex) {
         super(ex);
     }
 }

Modified: logging/log4j/branches/BRANCH_2_0_EXPERIMENTAL/rgoers/slf4j-impl/src/main/java/org/slf4j/helpers/Log4JLoggerFactory.java
URL: http://svn.apache.org/viewvc/logging/log4j/branches/BRANCH_2_0_EXPERIMENTAL/rgoers/slf4j-impl/src/main/java/org/slf4j/helpers/Log4JLoggerFactory.java?rev=1125875&r1=1125874&r2=1125875&view=diff
==============================================================================
--- logging/log4j/branches/BRANCH_2_0_EXPERIMENTAL/rgoers/slf4j-impl/src/main/java/org/slf4j/helpers/Log4JLoggerFactory.java (original)
+++ logging/log4j/branches/BRANCH_2_0_EXPERIMENTAL/rgoers/slf4j-impl/src/main/java/org/slf4j/helpers/Log4JLoggerFactory.java Sun May 22 07:30:44 2011
@@ -16,42 +16,39 @@
  */
 package org.slf4j.helpers;
 
-import org.apache.logging.log4j.core.LoggerContext;
-import org.apache.logging.log4j.core.LoggerFactory;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.spi.AbstractLogger;
+import org.apache.logging.log4j.spi.LoggerContext;
+import org.apache.logging.slf4j.SLF4JLoggingException;
 import org.slf4j.ILoggerFactory;
 import org.slf4j.Logger;
-import org.slf4j.impl.Log4JLogger;
+import org.slf4j.impl.SLF4JLogger;
+
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.ConcurrentMap;
 
 /**
  *
  */
 public class Log4JLoggerFactory implements ILoggerFactory {
 
-    private static LoggerContext ctx = new Log4JContext();
+    private static LoggerContext context = LogManager.getContext();
 
-    public Logger getLogger(String s) {
-        return (Logger) ctx.getLogger(s);
-    }
+    private ConcurrentMap<String, Logger> loggers = new ConcurrentHashMap<String, Logger>();
 
     public static LoggerContext getContext() {
-        return ctx;    
+        return context;
     }
 
-    private static class Log4JContext extends LoggerContext {
-
-        private static LoggerFactory loggerFactory = new Factory();
-
-        @Override
-        public org.apache.logging.log4j.core.Logger getLogger(String name) {
-            return getLogger(loggerFactory, name);
+    public Logger getLogger(String name) {
+        if (loggers.containsKey(name)) {
+            return loggers.get(name);
         }
-
-    }
-
-    private static class Factory implements LoggerFactory {
-
-        public org.apache.logging.log4j.core.Logger newInstance(LoggerContext ctx, String name) {
-            return new Log4JLogger(ctx, name);
+        org.apache.logging.log4j.Logger logger = context.getLogger(name);
+        if (logger instanceof AbstractLogger) {
+            loggers.putIfAbsent(name, new SLF4JLogger((AbstractLogger) logger, name));
+            return loggers.get(name);
         }
+        throw new SLF4JLoggingException("SLF4J Adapter requires base logging system to extend Log4J AbstractLogger");
     }
 }

Added: logging/log4j/branches/BRANCH_2_0_EXPERIMENTAL/rgoers/slf4j-impl/src/main/java/org/slf4j/impl/SLF4JLogger.java
URL: http://svn.apache.org/viewvc/logging/log4j/branches/BRANCH_2_0_EXPERIMENTAL/rgoers/slf4j-impl/src/main/java/org/slf4j/impl/SLF4JLogger.java?rev=1125875&view=auto
==============================================================================
--- logging/log4j/branches/BRANCH_2_0_EXPERIMENTAL/rgoers/slf4j-impl/src/main/java/org/slf4j/impl/SLF4JLogger.java (added)
+++ logging/log4j/branches/BRANCH_2_0_EXPERIMENTAL/rgoers/slf4j-impl/src/main/java/org/slf4j/impl/SLF4JLogger.java Sun May 22 07:30:44 2011
@@ -0,0 +1,372 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache license, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the license for the specific language governing permissions and
+ * limitations under the license.
+ */
+package org.slf4j.impl;
+
+import org.apache.logging.log4j.Level;
+import org.apache.logging.log4j.message.Message;
+import org.apache.logging.log4j.message.ParameterizedMessage;
+import org.apache.logging.log4j.message.SimpleMessage;
+import org.apache.logging.log4j.message.StructuredDataMessage;
+import org.apache.logging.log4j.spi.AbstractLogger;
+import org.apache.logging.log4j.spi.AbstractLoggerWrapper;
+import org.slf4j.Marker;
+import org.slf4j.MarkerFactory;
+import org.slf4j.ext.EventData;
+import org.slf4j.spi.LocationAwareLogger;
+
+import java.util.Map;
+
+/**
+ *
+ */
+public class SLF4JLogger extends AbstractLoggerWrapper implements LocationAwareLogger {
+
+    private static final String FQCN = SLF4JLogger.class.getName();
+    private static Marker EVENT_MARKER = MarkerFactory.getMarker("EVENT");
+    private final boolean eventLogger;
+
+    public SLF4JLogger(AbstractLogger logger, String name) {
+        super(logger, name);
+        eventLogger = "EventLogger".equals(name);
+    }
+
+    @Override
+    public void trace(String format) {
+        if (isTraceEnabled()) {
+            log(null, FQCN, Level.TRACE, new SimpleMessage(format), null);
+        }
+    }
+
+    public void trace(String format, Object o) {
+        if (isTraceEnabled()) {
+            log(null, FQCN, Level.TRACE, new ParameterizedMessage(format, o), null);
+        }
+    }
+
+    public void trace(String format, Object arg1, Object arg2) {
+        if (isTraceEnabled()) {
+            log(null, FQCN, Level.TRACE, new ParameterizedMessage(format, arg1, arg2), null);
+        }
+    }
+
+    public boolean isTraceEnabled(Marker marker) {
+        return logger.isTraceEnabled((org.apache.logging.log4j.Marker) marker);
+    }
+
+    public void trace(Marker marker, String s) {
+        if (isTraceEnabled(marker)) {
+            log((org.apache.logging.log4j.Marker) marker, FQCN, Level.TRACE, new SimpleMessage(s), null);
+        }
+    }
+
+    public void trace(Marker marker, String s, Object o) {
+        if (isTraceEnabled(marker)) {
+            log((org.apache.logging.log4j.Marker) marker, FQCN, Level.TRACE, new ParameterizedMessage(s, o), null);
+        }
+    }
+
+    public void trace(Marker marker, String s, Object o, Object o1) {
+        if (isTraceEnabled(marker)) {
+            log((org.apache.logging.log4j.Marker) marker, FQCN, Level.TRACE, new ParameterizedMessage(s, o, o1), null);
+        }
+    }
+
+    public void trace(Marker marker, String s, Object[] objects) {
+        if (isTraceEnabled(marker)) {
+            log((org.apache.logging.log4j.Marker) marker, FQCN, Level.TRACE,
+                new ParameterizedMessage(s, objects), null);
+        }
+    }
+
+    public void trace(Marker marker, String s, Throwable throwable) {
+        if (isTraceEnabled(marker)) {
+            log((org.apache.logging.log4j.Marker) marker, FQCN, Level.TRACE,
+                new ParameterizedMessage(s, null, throwable), throwable);
+        }
+    }
+
+    @Override
+    public void debug(String format) {
+        if (isDebugEnabled()) {
+            log(null, FQCN, Level.DEBUG, new SimpleMessage(format), null);
+        }
+    }
+
+    public void debug(String format, Object o) {
+        if (isDebugEnabled()) {
+            log(null, FQCN, Level.DEBUG, new ParameterizedMessage(format, o), null);
+        }
+    }
+
+    public void debug(String format, Object arg1, Object arg2) {
+        if (isDebugEnabled()) {
+            log(null, FQCN, Level.DEBUG, new ParameterizedMessage(format, arg1, arg2), null);
+        }
+    }
+
+    public boolean isDebugEnabled(Marker marker) {
+        return logger.isDebugEnabled((org.apache.logging.log4j.Marker) marker);
+    }
+
+    public void debug(Marker marker, String s) {
+        if (isDebugEnabled(marker)) {
+            log((org.apache.logging.log4j.Marker) marker, FQCN, Level.DEBUG, new SimpleMessage(s), null);
+        }
+    }
+
+    public void debug(Marker marker, String s, Object o) {
+        if (isDebugEnabled(marker)) {
+            log((org.apache.logging.log4j.Marker) marker, FQCN, Level.DEBUG, new ParameterizedMessage(s, o), null);
+        }
+    }
+
+    public void debug(Marker marker, String s, Object o, Object o1) {
+        if (isDebugEnabled(marker)) {
+            log((org.apache.logging.log4j.Marker) marker, FQCN, Level.DEBUG, new ParameterizedMessage(s, o, o1), null);
+        }
+    }
+
+    public void debug(Marker marker, String s, Object[] objects) {
+        if (isDebugEnabled(marker)) {
+            log((org.apache.logging.log4j.Marker) marker, FQCN, Level.DEBUG,
+                new ParameterizedMessage(s, objects), null);
+        }
+    }
+
+    public void debug(Marker marker, String s, Throwable throwable) {
+        if (isDebugEnabled(marker)) {
+            log((org.apache.logging.log4j.Marker) marker, FQCN, Level.DEBUG,
+                new ParameterizedMessage(s, null, throwable), throwable);
+        }
+    }
+
+    @Override
+    public void info(String format) {
+        if (isInfoEnabled()) {
+            log(null, FQCN, Level.INFO, new SimpleMessage(format), null);
+        }
+    }
+
+    public void info(String format, Object o) {
+        if (isInfoEnabled()) {
+            log(null, FQCN, Level.INFO, new ParameterizedMessage(format, o), null);
+        }
+    }
+
+    public void info(String format, Object arg1, Object arg2) {
+        if (isInfoEnabled()) {
+            log(null, FQCN, Level.INFO, new ParameterizedMessage(format, arg1, arg2), null);
+        }
+    }
+
+    public boolean isInfoEnabled(Marker marker) {
+        return logger.isInfoEnabled((org.apache.logging.log4j.Marker) marker);
+    }
+
+    public void info(Marker marker, String s) {
+        if (isInfoEnabled(marker)) {
+            log((org.apache.logging.log4j.Marker) marker, FQCN, Level.INFO, new SimpleMessage(s), null);
+        }
+    }
+
+    public void info(Marker marker, String s, Object o) {
+        if (isInfoEnabled(marker)) {
+            log((org.apache.logging.log4j.Marker) marker, FQCN, Level.INFO, new ParameterizedMessage(s, o), null);
+        }
+    }
+
+    public void info(Marker marker, String s, Object o, Object o1) {
+        if (isInfoEnabled(marker)) {
+            log((org.apache.logging.log4j.Marker) marker, FQCN, Level.INFO, new ParameterizedMessage(s, o, o1), null);
+        }
+    }
+
+    public void info(Marker marker, String s, Object[] objects) {
+        if (isInfoEnabled(marker)) {
+            log((org.apache.logging.log4j.Marker) marker, FQCN, Level.INFO,
+                new ParameterizedMessage(s, objects), null);
+        }
+    }
+
+    public void info(Marker marker, String s, Throwable throwable) {
+        if (isInfoEnabled(marker)) {
+            log((org.apache.logging.log4j.Marker) marker, FQCN, Level.INFO,
+                new ParameterizedMessage(s, null, throwable), throwable);
+        }
+    }
+
+    @Override
+    public void warn(String format) {
+        if (isWarnEnabled()) {
+            log(null, FQCN, Level.WARN, new SimpleMessage(format), null);
+        }
+    }
+
+    public void warn(String format, Object o) {
+        if (isWarnEnabled()) {
+            log(null, FQCN, Level.WARN, new ParameterizedMessage(format, o), null);
+        }
+    }
+
+    public void warn(String format, Object arg1, Object arg2) {
+        if (isWarnEnabled()) {
+            log(null, FQCN, Level.WARN, new ParameterizedMessage(format, arg1, arg2), null);
+        }
+    }
+
+    public boolean isWarnEnabled(Marker marker) {
+        return logger.isWarnEnabled((org.apache.logging.log4j.Marker) marker);
+    }
+
+    public void warn(Marker marker, String s) {
+        if (isWarnEnabled(marker)) {
+            log((org.apache.logging.log4j.Marker) marker, FQCN, Level.WARN, new SimpleMessage(s), null);
+        }
+    }
+
+    public void warn(Marker marker, String s, Object o) {
+        if (isDebugEnabled(marker)) {
+            log((org.apache.logging.log4j.Marker) marker, FQCN, Level.WARN, new ParameterizedMessage(s, o), null);
+        }
+    }
+
+    public void warn(Marker marker, String s, Object o, Object o1) {
+        if (isDebugEnabled(marker)) {
+            log((org.apache.logging.log4j.Marker) marker, FQCN, Level.WARN, new ParameterizedMessage(s, o, o1), null);
+        }
+    }
+
+    public void warn(Marker marker, String s, Object[] objects) {
+        if (isDebugEnabled(marker)) {
+            log((org.apache.logging.log4j.Marker) marker, FQCN, Level.WARN,
+                new ParameterizedMessage(s, objects), null);
+        }
+    }
+
+    public void warn(Marker marker, String s, Throwable throwable) {
+        if (isDebugEnabled(marker)) {
+            log((org.apache.logging.log4j.Marker) marker, FQCN, Level.WARN,
+                new ParameterizedMessage(s, null, throwable), throwable);
+        }
+    }
+
+    @Override
+    public void error(String format) {
+        if (isErrorEnabled()) {
+            log(null, FQCN, Level.ERROR, new SimpleMessage(format), null);
+        }
+    }
+
+    public void error(String format, Object o) {
+        if (isErrorEnabled()) {
+            log(null, FQCN, Level.ERROR, new ParameterizedMessage(format, o), null);
+        }
+    }
+
+    public void error(String format, Object arg1, Object arg2) {
+        if (isErrorEnabled()) {
+            log(null, FQCN, Level.ERROR, new ParameterizedMessage(format, arg1, arg2), null);
+        }
+    }
+
+    public boolean isErrorEnabled(Marker marker) {
+        return logger.isErrorEnabled((org.apache.logging.log4j.Marker) marker);
+    }
+
+    public void error(Marker marker, String s) {
+        if (isErrorEnabled(marker)) {
+            log((org.apache.logging.log4j.Marker) marker, FQCN, Level.ERROR, new SimpleMessage(s), null);
+        }
+    }
+
+    public void error(Marker marker, String s, Object o) {
+        if (isErrorEnabled(marker)) {
+            log((org.apache.logging.log4j.Marker) marker, FQCN, Level.ERROR, new ParameterizedMessage(s, o), null);
+        }
+    }
+
+    public void error(Marker marker, String s, Object o, Object o1) {
+        if (isErrorEnabled(marker)) {
+            log((org.apache.logging.log4j.Marker) marker, FQCN, Level.ERROR, new ParameterizedMessage(s, o, o1), null);
+        }
+    }
+
+    public void error(Marker marker, String s, Object[] objects) {
+        if (isErrorEnabled(marker)) {
+            log((org.apache.logging.log4j.Marker) marker, FQCN, Level.ERROR,
+                new ParameterizedMessage(s, objects), null);
+        }
+    }
+
+    public void error(Marker marker, String s, Throwable throwable) {
+        if (isErrorEnabled(marker)) {
+            log((org.apache.logging.log4j.Marker) marker, FQCN, Level.ERROR,
+                new ParameterizedMessage(s, null, throwable), throwable);
+        }
+    }
+
+    public void log(Marker marker, String fqcn, int i, String s1, Object[] objects, Throwable throwable) {
+        Message msg;
+        if (eventLogger && marker != null && marker.contains(EVENT_MARKER)) {
+            try {
+                EventData data = (objects != null && objects[0] instanceof EventData) ? (EventData) objects[0] :
+                    new EventData(s1);
+                msg = new StructuredDataMessage(data.getEventId(), data.getMessage(), data.getEventType());
+                for (Map.Entry entry : data.getEventMap().entrySet()) {
+                    String key = entry.getKey().toString();
+                    if (EventData.EVENT_TYPE.equals(key) || EventData.EVENT_ID.equals(key) ||
+                        EventData.EVENT_MESSAGE.equals(key)) {
+                        continue;
+                    }
+                    ((StructuredDataMessage) msg).put(entry.getKey().toString(), entry.getValue().toString());
+                }
+            } catch (Exception ex) {
+                msg = new ParameterizedMessage(s1, objects, throwable);
+            }
+
+        } else {
+            msg = new ParameterizedMessage(s1, objects, throwable);
+        }
+        log((org.apache.logging.log4j.Marker) marker, fqcn, getLevel(i), msg, throwable);
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    @Override
+    protected String getFQCN() {
+        return FQCN;
+    }
+
+    private Level getLevel(int i) {
+
+        switch (i) {
+            case TRACE_INT :
+                return Level.TRACE;
+            case DEBUG_INT :
+                return Level.DEBUG;
+            case INFO_INT :
+                return Level.INFO;
+            case WARN_INT :
+                return Level.WARN;
+            case ERROR_INT :
+                return Level.ERROR;
+        }
+        return Level.ERROR;
+    }
+}

Modified: logging/log4j/branches/BRANCH_2_0_EXPERIMENTAL/rgoers/slf4j-impl/src/test/java/org/apache/logging/slf4j/LoggerTest.java
URL: http://svn.apache.org/viewvc/logging/log4j/branches/BRANCH_2_0_EXPERIMENTAL/rgoers/slf4j-impl/src/test/java/org/apache/logging/slf4j/LoggerTest.java?rev=1125875&r1=1125874&r2=1125875&view=diff
==============================================================================
--- logging/log4j/branches/BRANCH_2_0_EXPERIMENTAL/rgoers/slf4j-impl/src/test/java/org/apache/logging/slf4j/LoggerTest.java (original)
+++ logging/log4j/branches/BRANCH_2_0_EXPERIMENTAL/rgoers/slf4j-impl/src/test/java/org/apache/logging/slf4j/LoggerTest.java Sun May 22 07:30:44 2011
@@ -16,7 +16,10 @@
  */
 package org.apache.logging.slf4j;
 
+import org.apache.logging.log4j.core.Appender;
+import org.apache.logging.log4j.core.LogEvent;
 import org.apache.logging.log4j.core.LoggerContext;
+import org.apache.logging.log4j.core.appender.ListAppender;
 import org.apache.logging.log4j.core.config.Configuration;
 import org.apache.logging.log4j.core.config.XMLConfigurationFactory;
 import org.apache.logging.log4j.internal.StatusLogger;
@@ -32,8 +35,14 @@ import org.slf4j.ext.XLogger;
 import org.slf4j.ext.XLoggerFactory;
 import org.slf4j.helpers.Log4JLoggerFactory;
 
+import java.util.List;
 import java.util.Locale;
+import java.util.Map;
 
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
 
 /**
  *
@@ -45,14 +54,14 @@ public class LoggerTest {
     @BeforeClass
     public static void setupClass() {
         System.setProperty(XMLConfigurationFactory.CONFIGURATION_FILE_PROPERTY, CONFIG);
-        LoggerContext ctx = Log4JLoggerFactory.getContext();
+        LoggerContext ctx = (LoggerContext) Log4JLoggerFactory.getContext();
         Configuration config = ctx.getConfiguration();
     }
 
     @AfterClass
     public static void cleanupClass() {
         System.clearProperty(XMLConfigurationFactory.CONFIGURATION_FILE_PROPERTY);
-        LoggerContext ctx = Log4JLoggerFactory.getContext();
+        LoggerContext ctx = (LoggerContext) Log4JLoggerFactory.getContext();
         ctx.reconfigure();
         StatusLogger.getLogger().reset();
     }
@@ -63,18 +72,23 @@ public class LoggerTest {
     @Test
     public void basicFlow() {
         xlogger.entry();
+        verify("List", "o.a.l.s.LoggerTest entry MDC{}\n");
         xlogger.exit();
+        verify("List", "o.a.l.s.LoggerTest exit MDC{}\n");
     }
 
     @Test
     public void simpleFlow() {
         xlogger.entry(CONFIG);
+        verify("List", "o.a.l.s.LoggerTest entry with (log4j-test1.xml) MDC{}\n");
         xlogger.exit(0);
+        verify("List", "o.a.l.s.LoggerTest exit with (0) MDC{}\n");
     }
 
     @Test
     public void throwing() {
         xlogger.throwing(new IllegalArgumentException("Test Exception"));
+        verify("List", "o.a.l.s.LoggerTest throwing MDC{}\n");
     }
 
     @Test
@@ -83,18 +97,21 @@ public class LoggerTest {
             throw new NullPointerException();
         } catch (Exception e) {
             xlogger.catching(e);
+            verify("List", "o.a.l.s.LoggerTest catching MDC{}\n");
         }
     }
 
     @Test
     public void debug() {
         logger.debug("Debug message");
+        verify("List", "o.a.l.s.LoggerTest Debug message MDC{}\n");
     }
 
 
     @Test
     public void debugWithParms() {
         logger.debug("Hello, {}", "World");
+        verify("List", "o.a.l.s.LoggerTest Hello, World MDC{}\n");
     }
 
     @Test
@@ -102,8 +119,10 @@ public class LoggerTest {
 
         MDC.put("TestYear", "2010");
         logger.debug("Debug message");
+        verify("List", "o.a.l.s.LoggerTest Debug message MDC{TestYear=2010}\n");
         MDC.clear();
         logger.debug("Debug message");
+        verify("List", "o.a.l.s.LoggerTest Debug message MDC{}\n");
     }
 
     @Test
@@ -120,5 +139,19 @@ public class LoggerTest {
         data.put("Amount", "200.00");
         EventLogger.logEvent(data);
         MDC.clear();
+        verify("EventLogger", "o.a.l.s.LoggerTest Transfer [Audit@18060 Amount=\"200.00\" FromAccount=\"123457\" ToAccount=\"123456\"] Transfer Complete\n");
+    }
+
+    private void verify(String name, String expected) {
+        LoggerContext ctx = (LoggerContext) Log4JLoggerFactory.getContext();
+        Map<String, Appender> list = ctx.getConfiguration().getAppenders();
+        Appender listApp = list.get(name);
+        assertNotNull("Missing Appender", listApp);
+        assertTrue("Not a ListAppender", listApp instanceof ListAppender);
+        List<String> events = ((ListAppender) listApp).getMessages();
+        assertTrue("Incorrect number of messages. Expected 1 Actual " + events.size(), events.size()== 1);
+        String actual = events.get(0);
+        assertEquals("Incorrect message. Expected " + expected + ". Actual " + actual, expected, actual);
+        ((ListAppender) listApp).clear();
     }
 }

Modified: logging/log4j/branches/BRANCH_2_0_EXPERIMENTAL/rgoers/slf4j-impl/src/test/resources/log4j-test1.xml
URL: http://svn.apache.org/viewvc/logging/log4j/branches/BRANCH_2_0_EXPERIMENTAL/rgoers/slf4j-impl/src/test/resources/log4j-test1.xml?rev=1125875&r1=1125874&r2=1125875&view=diff
==============================================================================
--- logging/log4j/branches/BRANCH_2_0_EXPERIMENTAL/rgoers/slf4j-impl/src/test/resources/log4j-test1.xml (original)
+++ logging/log4j/branches/BRANCH_2_0_EXPERIMENTAL/rgoers/slf4j-impl/src/test/resources/log4j-test1.xml Sun May 22 07:30:44 2011
@@ -8,11 +8,11 @@
   </filters>
 
   <appenders>
-    <Console name="EventLogger">
-      <PatternLayout pattern="%m%n"/>
-    </Console>
+    <List name="EventLogger">
+      <PatternLayout pattern="%C{1.} %m%n"/>
+    </List>
     <Console name="STDOUT">
-      <PatternLayout pattern="%m MDC%X%n"/>
+      <PatternLayout pattern="%C{1.} %m MDC%X%n"/>
     </Console>
     <File name="File" fileName="${filename}">
       <PatternLayout>
@@ -20,9 +20,7 @@
       </PatternLayout>
     </File>
     <List name="List">
-      <filters>
-        <Threshold level="error"/>
-      </filters>
+      <PatternLayout pattern="%C{1.} %m MDC%X%n"/>
     </List>
   </appenders>
 
@@ -36,7 +34,7 @@
     </logger>>
 
     <root level="trace">
-      <appender-ref ref="STDOUT"/>
+      <appender-ref ref="List"/>
     </root>
   </loggers>
 



---------------------------------------------------------------------
To unsubscribe, e-mail: log4j-dev-unsubscribe@logging.apache.org
For additional commands, e-mail: log4j-dev-help@logging.apache.org