Hi Scott,

While most Actions tend to be simple, actions that can be self-nested are not trivial to write, with NestComponentIA acts as a prime example of an action that can be self-nested (implicit objects potentially nesting other implicit objects).

Even if Joran can currently deal with nested filters just fine, we'd better explicitly create a FilterAction. If you rename the nested <filter> elements as <nestedFilter>, and change the addFilter() method in AndFilter to addNestedFilter, then we might gain in clarity.

 <filter class="org.apache.log4j.filter.AndFilter">

   <nestedFilter class="org.apache.log4j.filter.LevelMatchFilter">
     <param name="levelToMatch" value="DEBUG" />
     <param name="acceptOnMatch" value="true" />
   </nestedFilter>

   <nestedFilter class="org.apache.log4j.filter.StringMatchFilter">
     <param name="stringToMatch" value="test" />
     <param name="acceptOnMatch" value="true" />
   </nestedFilter>

   .... other nested filters go here

 </filter>

I have noticed that you are using an ArrayList to collect nested filters and iterate though them. Filters are designed to be chained together so you don't need an ArrayList to collect or iterate through them. See how AppenderSkeleton does it.

Oh, we also need an element called <filter-chain> so that we can reference filter chains by name.

<configuration>

  <filter-chain name="X-chain">
   <filter class="org.apache.log4j.filter.SomeFilter">
     <param name="levelToMatch" value="DEBUG" />
     <param name="acceptOnMatch" value="true" />
   </filter>
  <filter-chain>


<appender name=X" class="org.apache.log4j...">
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%d %level [%thread] %logger - %m%n%stackTrace{X-chain}"/>
</layout>
</appender>
</configuration>


The filter-chain action would create a filter chain an add it by name in to the repository object bag by name. Later a stack trace converter could retreive this filter chain by name from the object bag in its owning repository.

Would you like to take a shot at this?

At 09:03 AM 1/8/2005, [EMAIL PROTECTED] wrote:
sdeboy      2005/01/08 00:03:34

Modified: src/java/org/apache/log4j/filter AndFilter.java
Log:
AndFilter now supports any number of contained filters, using Joran's support for collections.


Revision Changes Path
1.2 +20 -20 logging-log4j/src/java/org/apache/log4j/filter/AndFilter.java


Index: AndFilter.java
===================================================================
RCS file: /home/cvs/logging-log4j/src/java/org/apache/log4j/filter/AndFilter.java,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -r1.1 -r1.2
--- AndFilter.java 8 Jan 2005 06:57:48 -0000 1.1
+++ AndFilter.java 8 Jan 2005 08:03:34 -0000 1.2
@@ -16,16 +16,19 @@


   package org.apache.log4j.filter;

  +import java.util.ArrayList;
  +import java.util.Iterator;
  +import java.util.List;
   import org.apache.log4j.spi.Filter;
   import org.apache.log4j.spi.LoggingEvent;


/**
- * A filter that 'and's the results of two filters together.
+ * A filter that 'and's the results of any number of contained filters together.
*
- * For the filter to process events, both contained filters must return Filter.ACCEPT.
+ * For the filter to process events, all contained filters must return Filter.ACCEPT.
*
- * If both filters do not return Filter.ACCEPT, Filter.NEUTRAL is returned.
+ * If the contained filters do not return Filter.ACCEPT, Filter.NEUTRAL is returned.
*
* If acceptOnMatch is set to true, Filter.ACCEPT is returned.
* If acceptOnMatch is set to false, Filter.DENY is returned.
@@ -35,14 +38,14 @@
*
*<appender name="STDOUT" class="org.apache.log4j.ConsoleAppender">
* <filter class="org.apache.log4j.filter.AndFilter">
- * <filter1 class="org.apache.log4j.filter.LevelMatchFilter">
+ * <filter class="org.apache.log4j.filter.LevelMatchFilter">
* <param name="levelToMatch" value="DEBUG" />
* <param name="acceptOnMatch" value="true" />
- * </filter1>
- * <filter2 class="org.apache.log4j.filter.StringMatchFilter">
+ * </filter>
+ * <filter class="org.apache.log4j.filter.StringMatchFilter">
* <param name="stringToMatch" value="test" />
* <param name="acceptOnMatch" value="true" />
- * </filter2>
+ * </filter>
* <param name="acceptOnMatch" value="false"/>
* </filter>
* <filter class="org.apache.log4j.filter.DenyAllFilter"/>
@@ -64,24 +67,17 @@
* @author Scott Deboy [EMAIL PROTECTED]
*/
public class AndFilter extends Filter {
- Filter filter1;
- Filter filter2;
+ List filters = new ArrayList();
boolean acceptOnMatch = true;


     public void activateOptions() {
       //nothing to do
     }

  -  public void setFilter1(Filter filter1) {
  -    System.out.println("filter 1 set to: " + filter1);
  -    this.filter1 = filter1;
  +  public void addFilter(Filter filter) {
  +    filters.add(filter);
     }

- public void setFilter2(Filter filter2) {
- System.out.println("filter 2 set to: " + filter2);
- this.filter2 = filter2;
- }
-
public void setAcceptOnMatch(boolean acceptOnMatch) {
this.acceptOnMatch = acceptOnMatch;
}
@@ -95,14 +91,18 @@
* Returns [EMAIL PROTECTED] Filter#NEUTRAL}
*/
public int decide(LoggingEvent event) {
- if ((Filter.ACCEPT == filter1.decide(event)) &&
- Filter.ACCEPT == filter2.decide(event)) {
+ boolean accepted = true;
+ for (Iterator iter = filters.iterator(); iter.hasNext();) {
+ Filter thisFilter = (Filter)iter.next();
+ accepted = accepted && (Filter.ACCEPT == thisFilter.decide(event));
+ }
+
+ if (accepted) {
if(acceptOnMatch) {
return Filter.ACCEPT;
}
return Filter.DENY;
}
-// System.out.println("neutral: " + event.getLevel() + ".." + event.getMessage());
return Filter.NEUTRAL;
}
}





--------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]

-- Ceki Gülcü

  The complete log4j manual: http://www.qos.ch/log4j/



---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]



Reply via email to