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 2010/10/28 09:13:55 UTC

svn commit: r1028206 - in /logging/log4j/branches/BRANCH_2_0_EXPERIMENTAL/rgoers/log4j2-core/src: main/java/org/apache/logging/log4j/core/ main/java/org/apache/logging/log4j/core/appender/ main/java/org/apache/logging/log4j/core/config/ main/java/org/a...

Author: rgoers
Date: Thu Oct 28 07:13:55 2010
New Revision: 1028206

URL: http://svn.apache.org/viewvc?rev=1028206&view=rev
Log:
Move filters into its own object

Added:
    logging/log4j/branches/BRANCH_2_0_EXPERIMENTAL/rgoers/log4j2-core/src/main/java/org/apache/logging/log4j/core/filter/Filterable.java
    logging/log4j/branches/BRANCH_2_0_EXPERIMENTAL/rgoers/log4j2-core/src/main/java/org/apache/logging/log4j/core/filter/Filters.java
Removed:
    logging/log4j/branches/BRANCH_2_0_EXPERIMENTAL/rgoers/log4j2-core/src/main/java/org/apache/logging/log4j/core/config/plugins/FiltersPlugin.java
Modified:
    logging/log4j/branches/BRANCH_2_0_EXPERIMENTAL/rgoers/log4j2-core/src/main/java/org/apache/logging/log4j/core/Appender.java
    logging/log4j/branches/BRANCH_2_0_EXPERIMENTAL/rgoers/log4j2-core/src/main/java/org/apache/logging/log4j/core/Filter.java
    logging/log4j/branches/BRANCH_2_0_EXPERIMENTAL/rgoers/log4j2-core/src/main/java/org/apache/logging/log4j/core/Lifecycle.java
    logging/log4j/branches/BRANCH_2_0_EXPERIMENTAL/rgoers/log4j2-core/src/main/java/org/apache/logging/log4j/core/Logger.java
    logging/log4j/branches/BRANCH_2_0_EXPERIMENTAL/rgoers/log4j2-core/src/main/java/org/apache/logging/log4j/core/appender/AppenderBase.java
    logging/log4j/branches/BRANCH_2_0_EXPERIMENTAL/rgoers/log4j2-core/src/main/java/org/apache/logging/log4j/core/appender/ConsoleAppender.java
    logging/log4j/branches/BRANCH_2_0_EXPERIMENTAL/rgoers/log4j2-core/src/main/java/org/apache/logging/log4j/core/appender/FileAppender.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/log4j2-core/src/main/java/org/apache/logging/log4j/core/appender/OutputStreamAppender.java
    logging/log4j/branches/BRANCH_2_0_EXPERIMENTAL/rgoers/log4j2-core/src/main/java/org/apache/logging/log4j/core/config/AppenderControl.java
    logging/log4j/branches/BRANCH_2_0_EXPERIMENTAL/rgoers/log4j2-core/src/main/java/org/apache/logging/log4j/core/config/BaseConfiguration.java
    logging/log4j/branches/BRANCH_2_0_EXPERIMENTAL/rgoers/log4j2-core/src/main/java/org/apache/logging/log4j/core/config/LoggerConfig.java
    logging/log4j/branches/BRANCH_2_0_EXPERIMENTAL/rgoers/log4j2-core/src/test/java/org/apache/logging/log4j/core/config/XMLConfigurationTest.java
    logging/log4j/branches/BRANCH_2_0_EXPERIMENTAL/rgoers/log4j2-core/src/test/java/org/apache/logging/log4j/core/layout/PatternLayoutTest.java

Modified: logging/log4j/branches/BRANCH_2_0_EXPERIMENTAL/rgoers/log4j2-core/src/main/java/org/apache/logging/log4j/core/Appender.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.java?rev=1028206&r1=1028205&r2=1028206&view=diff
==============================================================================
--- logging/log4j/branches/BRANCH_2_0_EXPERIMENTAL/rgoers/log4j2-core/src/main/java/org/apache/logging/log4j/core/Appender.java (original)
+++ logging/log4j/branches/BRANCH_2_0_EXPERIMENTAL/rgoers/log4j2-core/src/main/java/org/apache/logging/log4j/core/Appender.java Thu Oct 28 07:13:55 2010
@@ -23,33 +23,6 @@ import java.util.List;
  */
 public interface Appender {
     /**
-     * Add a filter to the end of the filter list.
-     *
-     * @param filter The Filter to add.
-     */
-    void addFilter(Filter filter);
-
-    /**
-     * Returns the head Filter. The Filters are organized in a linked list
-     * and so all Filters on this Appender are available through the result.
-     *
-     * @return the head Filter or null, if no Filters are present
-     */
-    Filter getFilter();
-
-    /**
-     * Clear the list of filters by removing all the filters in it.
-     */
-    void clearFilters();
-
-    /**
-     * Return the list of Filters associated with this appender.
-     *
-     * @return
-     */
-    List<Filter> getFilters();
-
-    /**
      * Release any resources allocated within the appender such as file
      * handles, network connections, etc.
      * <p/>
@@ -107,22 +80,6 @@ public interface Appender {
      */
     boolean suppressException();
 
-    /**
-     * Called when the Appender is initialized.
-     */
-    void start();
-
-    /**
-     * Called when the Appender is being shut down.
-     */
-    void stop();
-
-    /**
-     * Returns true if the appender is ready to process requests.
-     * @return true if the appender is ready to process requests, false otherwise.
-     */
-    boolean isStarted();
-
     ErrorHandler getHandler();
 
     void setHandler(ErrorHandler handler);

Modified: logging/log4j/branches/BRANCH_2_0_EXPERIMENTAL/rgoers/log4j2-core/src/main/java/org/apache/logging/log4j/core/Filter.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/Filter.java?rev=1028206&r1=1028205&r2=1028206&view=diff
==============================================================================
--- logging/log4j/branches/BRANCH_2_0_EXPERIMENTAL/rgoers/log4j2-core/src/main/java/org/apache/logging/log4j/core/Filter.java (original)
+++ logging/log4j/branches/BRANCH_2_0_EXPERIMENTAL/rgoers/log4j2-core/src/main/java/org/apache/logging/log4j/core/Filter.java Thu Oct 28 07:13:55 2010
@@ -13,21 +13,6 @@ public interface Filter {
         ACCEPT, NEUTRAL, DENY
     }
 
-    /**
-     * @doubt lifecycle management should be orthogonal.
-    */
-    void start();
-
-    /**
-     * @doubt lifecycle management should be orthogonal.
-    */
-    void stop();
-
-    /**
-     * @doubt lifecycle management should be orthogonal.
-    */
-    boolean isStarted();
-
     Result getOnMismatch();
 
     Result getOnMatch();

Modified: logging/log4j/branches/BRANCH_2_0_EXPERIMENTAL/rgoers/log4j2-core/src/main/java/org/apache/logging/log4j/core/Lifecycle.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/Lifecycle.java?rev=1028206&r1=1028205&r2=1028206&view=diff
==============================================================================
--- logging/log4j/branches/BRANCH_2_0_EXPERIMENTAL/rgoers/log4j2-core/src/main/java/org/apache/logging/log4j/core/Lifecycle.java (original)
+++ logging/log4j/branches/BRANCH_2_0_EXPERIMENTAL/rgoers/log4j2-core/src/main/java/org/apache/logging/log4j/core/Lifecycle.java Thu Oct 28 07:13:55 2010
@@ -7,4 +7,6 @@ public interface Lifecycle {
     void start();
 
     void stop();
+
+    boolean isStarted();
 }

Modified: logging/log4j/branches/BRANCH_2_0_EXPERIMENTAL/rgoers/log4j2-core/src/main/java/org/apache/logging/log4j/core/Logger.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/Logger.java?rev=1028206&r1=1028205&r2=1028206&view=diff
==============================================================================
--- logging/log4j/branches/BRANCH_2_0_EXPERIMENTAL/rgoers/log4j2-core/src/main/java/org/apache/logging/log4j/core/Logger.java (original)
+++ logging/log4j/branches/BRANCH_2_0_EXPERIMENTAL/rgoers/log4j2-core/src/main/java/org/apache/logging/log4j/core/Logger.java Thu Oct 28 07:13:55 2010
@@ -29,12 +29,12 @@ import java.util.Map;
 
 /**
  * @doubt All the isEnabled methods could be pushed into a filter interface.  Not sure of the utility of having
- * isEnabled be able to examine the message pattern and parameters. (RG) Will look into whether adding an
- * interface for the isEnabled methods provides any value. The isEnabled methods are required so that Filters
- * (besides the standard log level check) can participate in the decision.
+ * isEnabled be able to examine the message pattern and parameters. (RG) Moving the isEnabled methods out of
+ * Logger noticeably impacts performance. The message pattern and parameters are required so that they can be
+ * used in global filters.
  */
 public class Logger extends AbstractLogger {
-    //private static String FQCN = Logger.class.getName();
+    
     private final String name;
 
     private final LoggerContext context;
@@ -141,10 +141,14 @@ public class Logger extends AbstractLogg
          return config.loggerConfig.getAppenders();
     }
 
-    public List<Filter> getFilters() {
+    public Iterator<Filter> getFilters() {
         return config.loggerConfig.getFilters();
     }
 
+    public int filterCount() {
+        return config.loggerConfig.filterCount();
+    }
+
     public void addFilter(Filter filter) {
         config.config.addLoggerFilter(this, filter);
     }

Modified: logging/log4j/branches/BRANCH_2_0_EXPERIMENTAL/rgoers/log4j2-core/src/main/java/org/apache/logging/log4j/core/appender/AppenderBase.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/AppenderBase.java?rev=1028206&r1=1028205&r2=1028206&view=diff
==============================================================================
--- logging/log4j/branches/BRANCH_2_0_EXPERIMENTAL/rgoers/log4j2-core/src/main/java/org/apache/logging/log4j/core/appender/AppenderBase.java (original)
+++ logging/log4j/branches/BRANCH_2_0_EXPERIMENTAL/rgoers/log4j2-core/src/main/java/org/apache/logging/log4j/core/appender/AppenderBase.java Thu Oct 28 07:13:55 2010
@@ -23,6 +23,8 @@ import org.apache.logging.log4j.core.con
 import org.apache.logging.log4j.core.Filter;
 import org.apache.logging.log4j.core.Layout;
 import org.apache.logging.log4j.core.config.plugins.Plugin;
+import org.apache.logging.log4j.core.filter.Filterable;
+import org.apache.logging.log4j.core.filter.Filters;
 import org.apache.logging.log4j.internal.StatusLogger;
 import org.apache.logging.log4j.Logger;
 
@@ -32,7 +34,7 @@ import java.util.concurrent.CopyOnWriteA
 /**
  * @doubt Appender should be refactored as mentioned elsewhere
  */
-public abstract class AppenderBase implements Appender, Lifecycle {
+public abstract class AppenderBase extends Filterable implements Appender, Lifecycle {
 
     /**
      * Appenders set this by calling super.start().
@@ -41,8 +43,6 @@ public abstract class AppenderBase imple
 
     private Layout layout = null;
 
-    private List<Filter> filters = new CopyOnWriteArrayList<Filter>();
-
     private final String name;
 
     private final boolean errors = false;
@@ -56,12 +56,10 @@ public abstract class AppenderBase imple
 
     public static final String NAME = "name";
 
-    public AppenderBase(String name, Filter[] filters, Layout layout) {
+    public AppenderBase(String name, Filters filters, Layout layout) {
         this.name = name;
         this.layout = layout;
-        if (filters != null) {
-            this.filters = new CopyOnWriteArrayList<Filter>(filters);
-        }
+        setFilters(filters);
     }
 
     public ErrorHandler getHandler() {
@@ -82,26 +80,6 @@ public abstract class AppenderBase imple
         this.handler = handler;
     }
 
-
-    /**
-     * @doubt would be better to atomically replace a single Filter (which could be composite)
-     */
-    public void addFilter(Filter filter) {
-        filters.add(filter);
-    }
-
-    public Filter getFilter() {
-        return filters.size() > 0 ? filters.get(0) : null;
-    }
-
-    public void clearFilters() {
-        filters.clear();
-    }
-
-    public List<Filter> getFilters() {
-        return filters;
-    }
-
     public void close() {
 
     }
@@ -150,17 +128,13 @@ public abstract class AppenderBase imple
             logger.error("A layout is required and none was provided");
             return;
         }
-        for (Filter filter : filters) {
-            filter.start();
-        }
+        startFilters();
         this.started = true;
     }
 
     public void stop() {
         this.started = false;
-        for (Filter filter : filters) {
-            filter.stop();
-        }
+        stopFilters();
     }
 
     public boolean isStarted() {

Modified: logging/log4j/branches/BRANCH_2_0_EXPERIMENTAL/rgoers/log4j2-core/src/main/java/org/apache/logging/log4j/core/appender/ConsoleAppender.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/ConsoleAppender.java?rev=1028206&r1=1028205&r2=1028206&view=diff
==============================================================================
--- logging/log4j/branches/BRANCH_2_0_EXPERIMENTAL/rgoers/log4j2-core/src/main/java/org/apache/logging/log4j/core/appender/ConsoleAppender.java (original)
+++ logging/log4j/branches/BRANCH_2_0_EXPERIMENTAL/rgoers/log4j2-core/src/main/java/org/apache/logging/log4j/core/appender/ConsoleAppender.java Thu Oct 28 07:13:55 2010
@@ -22,6 +22,7 @@ import org.apache.logging.log4j.core.con
 import org.apache.logging.log4j.core.config.plugins.PluginAttr;
 import org.apache.logging.log4j.core.config.plugins.PluginElement;
 import org.apache.logging.log4j.core.config.plugins.PluginFactory;
+import org.apache.logging.log4j.core.filter.Filters;
 
 /**
  * ConsoleAppender appends log events to <code>System.out</code> or
@@ -49,13 +50,13 @@ public class ConsoleAppender extends Out
 
     }
 
-    public ConsoleAppender(String name, Layout layout, Filter[] filters, Target target) {
+    public ConsoleAppender(String name, Layout layout, Filters filters, Target target) {
         super(name, layout, filters, target == Target.SYSTEM_OUT ? System.out : System.err);
     }
 
     @PluginFactory
     public static ConsoleAppender createAppender(@PluginElement("layout") Layout layout,
-                                                 @PluginElement("filters") Filter[] filters,
+                                                 @PluginElement("filters") Filters filters,
                                                  @PluginAttr("target") String t,
                                                  @PluginAttr("name") String name) {
         if (name == null) {

Modified: logging/log4j/branches/BRANCH_2_0_EXPERIMENTAL/rgoers/log4j2-core/src/main/java/org/apache/logging/log4j/core/appender/FileAppender.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/FileAppender.java?rev=1028206&r1=1028205&r2=1028206&view=diff
==============================================================================
--- logging/log4j/branches/BRANCH_2_0_EXPERIMENTAL/rgoers/log4j2-core/src/main/java/org/apache/logging/log4j/core/appender/FileAppender.java (original)
+++ logging/log4j/branches/BRANCH_2_0_EXPERIMENTAL/rgoers/log4j2-core/src/main/java/org/apache/logging/log4j/core/appender/FileAppender.java Thu Oct 28 07:13:55 2010
@@ -22,6 +22,7 @@ import org.apache.logging.log4j.core.con
 import org.apache.logging.log4j.core.config.plugins.PluginAttr;
 import org.apache.logging.log4j.core.config.plugins.PluginElement;
 import org.apache.logging.log4j.core.config.plugins.PluginFactory;
+import org.apache.logging.log4j.core.filter.Filters;
 
 import java.io.FileNotFoundException;
 import java.io.FileOutputStream;
@@ -37,7 +38,7 @@ public class FileAppender extends Output
     public static final String APPEND = "append";
     public final String fileName;
 
-    public FileAppender(String name, Layout layout, Filter[] filters, OutputStream os, String filename) {
+    public FileAppender(String name, Layout layout, Filters filters, OutputStream os, String filename) {
         super(name, layout, filters, os);
         this.fileName = filename;
     }
@@ -47,7 +48,7 @@ public class FileAppender extends Output
                                               @PluginAttr("append") String append,
                                               @PluginAttr("name") String name,
                                               @PluginElement("layout") Layout layout,
-                                              @PluginElement("filters") Filter[] filters) {
+                                              @PluginElement("filters") Filters filters) {
 
         boolean isAppend = append == null ? true : Boolean.valueOf(append);
 

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=1028206&r1=1028205&r2=1028206&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 Thu Oct 28 07:13:55 2010
@@ -22,6 +22,7 @@ import org.apache.logging.log4j.core.con
 import org.apache.logging.log4j.core.config.plugins.PluginAttr;
 import org.apache.logging.log4j.core.config.plugins.PluginElement;
 import org.apache.logging.log4j.core.config.plugins.PluginFactory;
+import org.apache.logging.log4j.core.filter.Filters;
 
 import java.util.ArrayList;
 import java.util.Collections;
@@ -40,7 +41,7 @@ public class ListAppender extends Append
         super(name, null, null);
     }
 
-    public ListAppender(String name, Filter[] filters) {
+    public ListAppender(String name, Filters filters) {
         super(name, filters, null);
     }
 
@@ -58,7 +59,7 @@ public class ListAppender extends Append
 
     @PluginFactory
     public static ListAppender createAppender(@PluginAttr("name") String name,
-                                              @PluginElement("filters") Filter[] filters) {
+                                              @PluginElement("filters") Filters filters) {
 
         if (name == null) {
             logger.error("No name provided for ListAppender");

Modified: logging/log4j/branches/BRANCH_2_0_EXPERIMENTAL/rgoers/log4j2-core/src/main/java/org/apache/logging/log4j/core/appender/OutputStreamAppender.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/OutputStreamAppender.java?rev=1028206&r1=1028205&r2=1028206&view=diff
==============================================================================
--- logging/log4j/branches/BRANCH_2_0_EXPERIMENTAL/rgoers/log4j2-core/src/main/java/org/apache/logging/log4j/core/appender/OutputStreamAppender.java (original)
+++ logging/log4j/branches/BRANCH_2_0_EXPERIMENTAL/rgoers/log4j2-core/src/main/java/org/apache/logging/log4j/core/appender/OutputStreamAppender.java Thu Oct 28 07:13:55 2010
@@ -20,6 +20,7 @@ import org.apache.logging.log4j.core.Err
 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.filter.Filters;
 
 import java.io.IOException;
 import java.io.OutputStream;
@@ -56,7 +57,7 @@ public abstract class OutputStreamAppend
      * @param layout The layout to format the message.
      * @param os The OutputStream.
      */
-    public OutputStreamAppender(String name, Layout layout, Filter[] filters, OutputStream os) {
+    public OutputStreamAppender(String name, Layout layout, Filters filters, OutputStream os) {
         super(name, filters, layout);
         this.setOutputStream(os);
     }

Modified: logging/log4j/branches/BRANCH_2_0_EXPERIMENTAL/rgoers/log4j2-core/src/main/java/org/apache/logging/log4j/core/config/AppenderControl.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/config/AppenderControl.java?rev=1028206&r1=1028205&r2=1028206&view=diff
==============================================================================
--- logging/log4j/branches/BRANCH_2_0_EXPERIMENTAL/rgoers/log4j2-core/src/main/java/org/apache/logging/log4j/core/config/AppenderControl.java (original)
+++ logging/log4j/branches/BRANCH_2_0_EXPERIMENTAL/rgoers/log4j2-core/src/main/java/org/apache/logging/log4j/core/config/AppenderControl.java Thu Oct 28 07:13:55 2010
@@ -19,9 +19,13 @@ package org.apache.logging.log4j.core.co
 import org.apache.logging.log4j.core.ErrorHandler;
 import org.apache.logging.log4j.core.Appender;
 import org.apache.logging.log4j.core.Filter;
+import org.apache.logging.log4j.core.Lifecycle;
 import org.apache.logging.log4j.core.LogEvent;
 import org.apache.logging.log4j.core.appender.AppenderRuntimeException;
 import org.apache.logging.log4j.core.appender.DefaultErrorHandler;
+import org.apache.logging.log4j.core.filter.Filterable;
+
+import java.util.Iterator;
 
 /**
  * Wraps appenders with details the appender implementation shouldn't need to know about.
@@ -48,20 +52,24 @@ public class AppenderControl {
         try {
             recursive.set(this);
 
-            if (!appender.isStarted()) {
-                appender.getHandler().error("Attempted to append to non-started appender " + appender.getName());
-
-                if (!appender.suppressException()) {
-                    throw new AppenderRuntimeException("Attempted to append to non-started appender " + appender.getName());
+            if (appender instanceof Lifecycle) {
+                if (!((Lifecycle)appender).isStarted()) {
+                    appender.getHandler().error("Attempted to append to non-started appender " + appender.getName());
+
+                    if (!appender.suppressException()) {
+                        throw new AppenderRuntimeException("Attempted to append to non-started appender " + appender.getName());
+                    }
                 }
             }
 
             Filter.Result result = Filter.Result.NEUTRAL;
-
-            for (Filter filter : appender.getFilters()) {
-                result = filter.filter(event);
-                if (result != Filter.Result.NEUTRAL) {
-                    break;
+            if (appender instanceof Filterable) {
+                Iterator<Filter> iter = ((Filterable)appender).getFilters();
+                while (iter.hasNext()) {
+                    result = iter.next().filter(event);
+                    if (result != Filter.Result.NEUTRAL) {
+                        break;
+                    }
                 }
             }
             if (result == Filter.Result.DENY) {

Modified: logging/log4j/branches/BRANCH_2_0_EXPERIMENTAL/rgoers/log4j2-core/src/main/java/org/apache/logging/log4j/core/config/BaseConfiguration.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/config/BaseConfiguration.java?rev=1028206&r1=1028205&r2=1028206&view=diff
==============================================================================
--- logging/log4j/branches/BRANCH_2_0_EXPERIMENTAL/rgoers/log4j2-core/src/main/java/org/apache/logging/log4j/core/config/BaseConfiguration.java (original)
+++ logging/log4j/branches/BRANCH_2_0_EXPERIMENTAL/rgoers/log4j2-core/src/main/java/org/apache/logging/log4j/core/config/BaseConfiguration.java Thu Oct 28 07:13:55 2010
@@ -19,12 +19,15 @@ package org.apache.logging.log4j.core.co
 import org.apache.logging.log4j.Logger;
 import org.apache.logging.log4j.core.Appender;
 import org.apache.logging.log4j.core.Filter;
+import org.apache.logging.log4j.core.Lifecycle;
 import org.apache.logging.log4j.core.config.plugins.PluginAttr;
 import org.apache.logging.log4j.core.config.plugins.PluginFactory;
 import org.apache.logging.log4j.core.config.plugins.PluginManager;
 import org.apache.logging.log4j.core.config.plugins.PluginElement;
 import org.apache.logging.log4j.core.config.plugins.PluginType;
 import org.apache.logging.log4j.core.config.plugins.PluginValue;
+import org.apache.logging.log4j.core.filter.Filterable;
+import org.apache.logging.log4j.core.filter.Filters;
 import org.apache.logging.log4j.core.helpers.NameUtil;
 import org.apache.logging.log4j.core.lookup.Interpolator;
 import org.apache.logging.log4j.core.lookup.MapLookup;
@@ -43,11 +46,12 @@ import java.util.Map;
 import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.ConcurrentMap;
 import java.util.concurrent.CopyOnWriteArrayList;
+import java.util.concurrent.atomic.AtomicReference;
 
 /**
  *
  */
-public class BaseConfiguration implements Configuration {
+public class BaseConfiguration extends Filterable implements Configuration {
 
     private String name;
 
@@ -59,10 +63,6 @@ public class BaseConfiguration implement
 
     private LoggerConfig root = new LoggerConfig();
 
-    private List<Filter> filters = new CopyOnWriteArrayList<Filter>();
-
-    private boolean hasFilters = false;
-
     private boolean started = false;
 
     protected Node rootNode;
@@ -81,12 +81,11 @@ public class BaseConfiguration implement
         setup();
         doConfigure();
         for (Appender appender : appenders.values()) {
-            appender.start();
+            if (appender instanceof Lifecycle)
+            ((Lifecycle)appender).start();
         }
 
-        for (Filter filter : filters) {
-            filter.start();
-        }
+        startFilters();
     }
 
     public void stop() {
@@ -94,11 +93,11 @@ public class BaseConfiguration implement
             logger.clearAppenders();
         }
         for (Appender appender : appenders.values()) {
-            appender.stop();
-        }
-        for (Filter filter : filters) {
-            filter.stop();
+            if (appender instanceof Lifecycle) {
+                ((Lifecycle)appender).stop();
+            }
         }
+        stopFilters();
     }
 
     protected void setup() {
@@ -115,7 +114,7 @@ public class BaseConfiguration implement
             } else if (child.getName().equals("appenders")) {
                 appenders = (ConcurrentMap<String, Appender>) child.getObject();
             } else if (child.getName().equals("filters")) {
-                filters = new CopyOnWriteArrayList((Filter[]) child.getObject());
+                setFilters((Filters) child.getObject());
             } else if (child.getName().equals("loggers")) {
                 Loggers l = (Loggers) child.getObject();
                 loggers = l.getMap();
@@ -212,8 +211,8 @@ public class BaseConfiguration implement
         }
         Appender app = appenders.remove(name);
 
-        if (app != null) {
-            app.stop();
+        if (app != null && app instanceof Lifecycle) {
+            ((Lifecycle)app).stop();
         }
     }
 
@@ -275,24 +274,6 @@ public class BaseConfiguration implement
         loggers.remove(name);
     }
 
-    public Iterator<Filter> getFilters() {
-        return filters.iterator();
-    }
-
-    public void addFilter(Filter filter) {
-        filters.add(filter);
-        hasFilters = filters.size() > 0;
-    }
-
-    public void removeFilter(Filter filter) {
-        filters.remove(filter);
-        hasFilters = filters.size() > 0;
-    }
-
-    public boolean hasFilters() {
-        return hasFilters;
-    }
-
     private void createConfiguration(Node node) {
         for (Node child : node.getChildren()) {
             createConfiguration(child);
@@ -405,8 +386,8 @@ public class BaseConfiguration implement
                 } else if (a instanceof PluginElement) {
                     PluginElement elem = (PluginElement)a;
                     String name = elem.value();
-                    Class parmClass = parmClasses[index].getComponentType();
                     if (parmClasses[index].isArray()) {
+                        Class parmClass = parmClasses[index].getComponentType();
                         List<Object> list = new ArrayList<Object>();
                         sb.append("{");
                         boolean first = true;
@@ -441,6 +422,7 @@ public class BaseConfiguration implement
                         }
                         parms[index] = array;
                     } else {
+                        Class parmClass = parmClasses[index];                       
                         for (Node child : children) {
                             sb.append(child.toString());
                             PluginType childType = child.getType();

Modified: logging/log4j/branches/BRANCH_2_0_EXPERIMENTAL/rgoers/log4j2-core/src/main/java/org/apache/logging/log4j/core/config/LoggerConfig.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/config/LoggerConfig.java?rev=1028206&r1=1028205&r2=1028206&view=diff
==============================================================================
--- logging/log4j/branches/BRANCH_2_0_EXPERIMENTAL/rgoers/log4j2-core/src/main/java/org/apache/logging/log4j/core/config/LoggerConfig.java (original)
+++ logging/log4j/branches/BRANCH_2_0_EXPERIMENTAL/rgoers/log4j2-core/src/main/java/org/apache/logging/log4j/core/config/LoggerConfig.java Thu Oct 28 07:13:55 2010
@@ -28,6 +28,8 @@ import org.apache.logging.log4j.core.con
 import org.apache.logging.log4j.core.config.plugins.PluginAttr;
 import org.apache.logging.log4j.core.config.plugins.PluginFactory;
 import org.apache.logging.log4j.core.config.plugins.PluginElement;
+import org.apache.logging.log4j.core.filter.Filterable;
+import org.apache.logging.log4j.core.filter.Filters;
 import org.apache.logging.log4j.internal.StatusLogger;
 import org.apache.logging.log4j.message.Message;
 
@@ -39,19 +41,17 @@ import java.util.List;
 import java.util.Map;
 import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.CopyOnWriteArrayList;
+import java.util.concurrent.atomic.AtomicReference;
 
 /**
  *
  */
 @Plugin(name="logger",type="Core")
-public class LoggerConfig implements LogEventFactory {
+public class LoggerConfig extends Filterable implements LogEventFactory {
 
     private List<String> appenderRefs = new ArrayList<String>();
     private Map<String, AppenderControl> appenders = new ConcurrentHashMap<String, AppenderControl>();
 
-    private List<Filter> filters = new CopyOnWriteArrayList<Filter>();
-    private boolean hasFilters = false;
-
     private final String name;
 
     private LogEventFactory logEventFactory;
@@ -77,15 +77,12 @@ public class LoggerConfig implements Log
         this.additive = additive;
     }
 
-    protected LoggerConfig(String name, List<String> appenders, Filter[] filters, Level level,
+    protected LoggerConfig(String name, List<String> appenders, Filters filters, Level level,
                            boolean additive) {
         this.logEventFactory = this;
         this.name = name;
         this.appenderRefs = appenders;
-        if (filters != null && filters.length > 0) {
-            this.filters = new CopyOnWriteArrayList<Filter>(filters);
-            hasFilters = true;
-        }
+        setFilters(filters);
         this.level = level;
         this.additive = additive;
     }
@@ -142,20 +139,6 @@ public class LoggerConfig implements Log
         this.logEventFactory = logEventFactory;
     }
 
-    public void addFilter(Filter filter) {
-        filters.add(filter);
-        hasFilters = filters.size() > 0;
-    }
-
-    public void removeFilter(Filter filter) {
-        filters.remove(filter);
-        hasFilters = filters.size() > 0;
-    }
-
-    public List<Filter> getFilters() {
-        return Collections.unmodifiableList(filters);
-    }
-
     public boolean isAdditive() {
         return additive;
     }
@@ -170,12 +153,8 @@ public class LoggerConfig implements Log
     }
 
     private void log(LogEvent event) {
-        if (hasFilters) {
-            for (Filter filter : filters) {
-                if (filter.filter(event) == Filter.Result.DENY) {
-                    return;
-                }
-            }
+        if (isFiltered(event)) {
+            return;
         }
 
         callAppenders(event);
@@ -201,7 +180,7 @@ public class LoggerConfig implements Log
                                             @PluginAttr("level") String loggerLevel,
                                             @PluginAttr("name") String loggerName,
                                             @PluginElement("appender-ref") String[] refs,
-                                            @PluginElement("filters") Filter[] filters) {
+                                            @PluginElement("filters") Filters filters) {
         if (loggerName == null) {
             logger.error("Loggers cannot be configured without a name");
             return null;
@@ -222,7 +201,7 @@ public class LoggerConfig implements Log
         public static LoggerConfig createLogger(@PluginAttr("additivity") String additivity,
                                             @PluginAttr("level") String loggerLevel,
                                             @PluginElement("appender-ref") String[] refs,
-                                            @PluginElement("filters") Filter[] filters) {
+                                            @PluginElement("filters") Filters filters) {
             List<String> appenderRefs = Arrays.asList(refs);
             Level level = loggerLevel == null ? Level.ERROR : Level.valueOf(loggerLevel.toUpperCase());
             boolean additive = additivity == null ? true : Boolean.parseBoolean(additivity);

Added: logging/log4j/branches/BRANCH_2_0_EXPERIMENTAL/rgoers/log4j2-core/src/main/java/org/apache/logging/log4j/core/filter/Filterable.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/filter/Filterable.java?rev=1028206&view=auto
==============================================================================
--- logging/log4j/branches/BRANCH_2_0_EXPERIMENTAL/rgoers/log4j2-core/src/main/java/org/apache/logging/log4j/core/filter/Filterable.java (added)
+++ logging/log4j/branches/BRANCH_2_0_EXPERIMENTAL/rgoers/log4j2-core/src/main/java/org/apache/logging/log4j/core/filter/Filterable.java Thu Oct 28 07:13:55 2010
@@ -0,0 +1,91 @@
+/*
+ * 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.core.filter;
+
+import org.apache.logging.log4j.core.Filter;
+import org.apache.logging.log4j.core.Lifecycle;
+import org.apache.logging.log4j.core.LogEvent;
+
+import java.util.Iterator;
+
+/**
+ *
+ */
+public class Filterable {
+    private volatile Filters filters = new Filters(null);
+    private boolean hasFilters;
+
+    public synchronized void addFilter(Filter filter) {
+        filters = Filters.addFilter(filters, filter);
+        hasFilters = filters.hasFilters();
+    }
+
+    public synchronized void removeFilter(Filter filter) {
+        filters = Filters.removeFilter(filters, filter);
+         hasFilters = filters.hasFilters();
+    }
+
+    public synchronized void clearFilters() {
+        filters = new Filters(null);
+        hasFilters = false;
+    }
+
+    public Iterator<Filter> getFilters() {
+        return filters.iterator();
+    }
+
+    public boolean hasFilters() {
+        return hasFilters;
+    }
+
+    public int filterCount() {
+        return filters.size();
+    }
+
+    protected void startFilters() {
+        for (Filter filter : filters) {
+            if ((filter instanceof Lifecycle)) {
+                ((Lifecycle)filter).start();
+            }
+        }
+    }
+
+    protected void stopFilters() {
+        for (Filter filter : filters) {
+            if ((filter instanceof Lifecycle)) {
+                ((Lifecycle)filter).stop();
+            }
+        }
+    }
+
+    protected synchronized void setFilters(Filters newFilters) {
+        filters = newFilters == null ? new Filters(null) : newFilters;
+        hasFilters = filters.hasFilters();
+    }
+
+    protected boolean isFiltered(LogEvent event) {
+        if (hasFilters) {
+            for (Filter filter : filters) {
+                if (filter.filter(event) == Filter.Result.DENY) {
+                    return true;
+                }
+            }
+        }
+        return false;
+    }
+
+}

Added: logging/log4j/branches/BRANCH_2_0_EXPERIMENTAL/rgoers/log4j2-core/src/main/java/org/apache/logging/log4j/core/filter/Filters.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/filter/Filters.java?rev=1028206&view=auto
==============================================================================
--- logging/log4j/branches/BRANCH_2_0_EXPERIMENTAL/rgoers/log4j2-core/src/main/java/org/apache/logging/log4j/core/filter/Filters.java (added)
+++ logging/log4j/branches/BRANCH_2_0_EXPERIMENTAL/rgoers/log4j2-core/src/main/java/org/apache/logging/log4j/core/filter/Filters.java Thu Oct 28 07:13:55 2010
@@ -0,0 +1,103 @@
+/*
+ * 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.core.filter;
+
+import org.apache.logging.log4j.core.Filter;
+import org.apache.logging.log4j.core.config.plugins.Plugin;
+import org.apache.logging.log4j.core.config.plugins.PluginElement;
+import org.apache.logging.log4j.core.config.plugins.PluginFactory;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.Iterator;
+import java.util.List;
+
+/**
+ *
+ */
+@Plugin(name="filters", type="Core", printObject=true)
+public class Filters implements Iterable<Filter> {
+
+    private final List<Filter> filters;
+    private final boolean hasFilters;
+
+    public Filters(Filter[] filters) {
+        this.filters = filters == null || filters.length == 0 ? new ArrayList<Filter>() : Arrays.asList(filters);
+        hasFilters = filters != null && filters.length > 0;
+    }
+
+    private Filters(List<Filter> filters) {
+        if (filters == null) {
+            this.filters = new ArrayList<Filter>();
+            this.hasFilters = false;
+            return;
+        }
+        this.filters = new ArrayList<Filter>(filters);
+        this.hasFilters = this.filters.size() > 0;
+    }
+
+    public static Filters addFilter(Filters f, Filter filter) {
+        Filters newFilters = new Filters(f.filters);
+        newFilters.filters.add(filter);
+        return  newFilters;
+    }
+
+    public static Filters removeFilter(Filters f, Filter filter) {
+        Filters newFilters = new Filters(f.filters);
+        newFilters.filters.remove(filter);
+        return  newFilters;
+    }
+
+    public Iterator<Filter> iterator() {
+        return filters.iterator();
+    }
+
+    public List<Filter> getFilters() {
+        return Collections.unmodifiableList(filters);
+    }
+
+    public boolean hasFilters() {
+        return hasFilters;
+    }
+
+    public int size() {
+        return filters.size();
+    }
+
+    public String toString() {
+        StringBuilder sb = new StringBuilder();
+        for (Filter filter : filters) {
+            if (sb.length() == 0) {
+                sb.append("{");
+            } else {
+                sb.append(", ");
+            }
+            sb.append(filter.toString());
+        }
+        if (sb.length() > 0) {
+            sb.append("}");
+        }
+        return sb.toString();
+    }
+
+    @PluginFactory
+    public static Filters createFilters(@PluginElement("filters") Filter[] filters) {
+        return new Filters(filters);
+    }
+
+}

Modified: logging/log4j/branches/BRANCH_2_0_EXPERIMENTAL/rgoers/log4j2-core/src/test/java/org/apache/logging/log4j/core/config/XMLConfigurationTest.java
URL: http://svn.apache.org/viewvc/logging/log4j/branches/BRANCH_2_0_EXPERIMENTAL/rgoers/log4j2-core/src/test/java/org/apache/logging/log4j/core/config/XMLConfigurationTest.java?rev=1028206&r1=1028205&r2=1028206&view=diff
==============================================================================
--- logging/log4j/branches/BRANCH_2_0_EXPERIMENTAL/rgoers/log4j2-core/src/test/java/org/apache/logging/log4j/core/config/XMLConfigurationTest.java (original)
+++ logging/log4j/branches/BRANCH_2_0_EXPERIMENTAL/rgoers/log4j2-core/src/test/java/org/apache/logging/log4j/core/config/XMLConfigurationTest.java Thu Oct 28 07:13:55 2010
@@ -29,6 +29,7 @@ import org.junit.AfterClass;
 import org.junit.BeforeClass;
 import org.junit.Test;
 
+import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
 
@@ -72,9 +73,10 @@ public class XMLConfigurationTest {
         assertTrue(logger instanceof org.apache.logging.log4j.core.Logger);
         org.apache.logging.log4j.core.Logger l = (org.apache.logging.log4j.core.Logger) logger;
         assertEquals(Level.DEBUG, l.getLevel());
-        List<Filter> filters = l.getFilters();
-        assertTrue("number of filters - " + filters.size(), filters.size() == 1);
-        Filter filter = filters.get(0);
+        int filterCount = l.filterCount();
+        assertTrue("number of filters - " + filterCount, filterCount == 1);
+        Iterator<Filter> iter = l.getFilters();
+        Filter filter = iter.next();
         assertTrue(filter instanceof MDCFilter);
         Map<String, Appender> appenders = l.getAppenders();
         assertNotNull(appenders);

Modified: logging/log4j/branches/BRANCH_2_0_EXPERIMENTAL/rgoers/log4j2-core/src/test/java/org/apache/logging/log4j/core/layout/PatternLayoutTest.java
URL: http://svn.apache.org/viewvc/logging/log4j/branches/BRANCH_2_0_EXPERIMENTAL/rgoers/log4j2-core/src/test/java/org/apache/logging/log4j/core/layout/PatternLayoutTest.java?rev=1028206&r1=1028205&r2=1028206&view=diff
==============================================================================
--- logging/log4j/branches/BRANCH_2_0_EXPERIMENTAL/rgoers/log4j2-core/src/test/java/org/apache/logging/log4j/core/layout/PatternLayoutTest.java (original)
+++ logging/log4j/branches/BRANCH_2_0_EXPERIMENTAL/rgoers/log4j2-core/src/test/java/org/apache/logging/log4j/core/layout/PatternLayoutTest.java Thu Oct 28 07:13:55 2010
@@ -20,6 +20,7 @@ import org.apache.logging.log4j.Level;
 import org.apache.logging.log4j.LogManager;
 import org.apache.logging.log4j.ThreadContext;
 import org.apache.logging.log4j.core.Appender;
+import org.apache.logging.log4j.core.Lifecycle;
 import org.apache.logging.log4j.core.Logger;
 import org.apache.logging.log4j.core.LoggerContext;
 import org.apache.logging.log4j.core.BasicConfigurationFactory;
@@ -74,7 +75,7 @@ public class PatternLayoutTest {
         // set up appender
         PatternLayout layout = new PatternLayout(msgPattern);
         FileOutputStream fos = new FileOutputStream(OUTPUT_FILE + "_mdc");
-        Appender appender = new FileAppender("File", layout, null, fos, OUTPUT_FILE + "_mdc");
+        FileAppender appender = new FileAppender("File", layout, null, fos, OUTPUT_FILE + "_mdc");
         appender.start();
 
         // set appender on root and set level to debug



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