sdeboy      2003/10/25 00:52:55

  Modified:    src/java/org/apache/log4j/chainsaw/rule
                        LevelInequalityRule.java RuleTest.java
                        InequalityRule.java
               src/java/org/apache/log4j/chainsaw
                        LoggingEventFieldResolver.java
  Log:
  Corrected inequality rule logic errors, added example ruletest expression 
demonstrating regular expressions, inequality and access of MDC entries in the 
expressions.
  
  Revision  Changes    Path
  1.2       +70 -64    
jakarta-log4j/src/java/org/apache/log4j/chainsaw/rule/LevelInequalityRule.java
  
  Index: LevelInequalityRule.java
  ===================================================================
  RCS file: 
/home/cvs/jakarta-log4j/src/java/org/apache/log4j/chainsaw/rule/LevelInequalityRule.java,v
  retrieving revision 1.1
  retrieving revision 1.2
  diff -u -r1.1 -r1.2
  --- LevelInequalityRule.java  24 Oct 2003 08:04:03 -0000      1.1
  +++ LevelInequalityRule.java  25 Oct 2003 07:52:55 -0000      1.2
  @@ -49,78 +49,84 @@
   
   package org.apache.log4j.chainsaw.rule;
   
  +import org.apache.log4j.Level;
  +import org.apache.log4j.UtilLoggingLevel;
  +import org.apache.log4j.chainsaw.LoggingEventFieldResolver;
  +import org.apache.log4j.spi.LoggingEvent;
  +
   import java.util.Iterator;
   import java.util.LinkedList;
   import java.util.List;
   import java.util.Stack;
   
  -import org.apache.log4j.Level;
  -import org.apache.log4j.UtilLoggingLevel;
  -import org.apache.log4j.chainsaw.LoggingEventFieldResolver;
  -import org.apache.log4j.spi.LoggingEvent;
  +
   /**
    * A Rule class implementing inequality evaluation for Levels (log4j and 
util.logging) using the toInt method.
    * 
    * @author Scott Deboy <[EMAIL PROTECTED]>
    */
  -
   class LevelInequalityRule extends AbstractRule {
  -    LoggingEventFieldResolver resolver = LoggingEventFieldResolver.getInstance();
  -
  -     Level levelFirstParam;
  -      String levelSecondParam;
  -      List utilList = new LinkedList();
  -      List levelList = new LinkedList();
  -      String inequalitySymbol;
  -
  -      private LevelInequalityRule(String inequalitySymbol, String levelFirstParam, 
String levelSecondParam) {
  -          levelList.add(Level.FATAL.toString());
  -          levelList.add(Level.ERROR.toString());
  -          levelList.add(Level.WARN.toString());
  -          levelList.add(Level.INFO.toString());
  -          levelList.add(Level.DEBUG.toString());
  -
  -          Iterator iter = UtilLoggingLevel.getAllPossibleLevels().iterator();
  -          while (iter.hasNext()) {
  -              utilList.add(((UtilLoggingLevel)iter.next()).toString());
  -          }
  -
  -        if (levelList.contains(levelFirstParam)) {
  -            this.levelFirstParam = Level.toLevel(levelFirstParam);
  -        } else {
  -            this.levelFirstParam = UtilLoggingLevel.toLevel(levelFirstParam);
  -        }
  -        this.inequalitySymbol = inequalitySymbol;
  -        this.levelSecondParam = levelSecondParam;
  -      }
  -
  -      static Rule getRule(String inequalitySymbol, Stack stack) {
  -          String p1 = stack.pop().toString();
  -          String p2 = stack.pop().toString();
  -          return new LevelInequalityRule(inequalitySymbol, p1, p2);
  -      }
  -      
  -      public boolean evaluate(LoggingEvent event) {
  -        //use the type of the first level to access the static toLevel method on 
the second param
  -        Level level2 = levelFirstParam.toLevel(resolver.getValue(levelSecondParam, 
event).toString());
  -        System.out.println("lessthan level op " + levelFirstParam + ".." + level2);
  -
  -        boolean result = false;
  -        int first = levelFirstParam.toInt();
  -        int second = level2.toInt();
  -        
  -        if ("<".equals(inequalitySymbol)) {
  -            result = first < second;
  -        } else if (">".equals(inequalitySymbol)) {
  -            result = first > second;
  -        } else if ("<=".equals(inequalitySymbol)){
  -            result = first <= second;
  -        } else if (">=".equals(inequalitySymbol)) {
  -            result = first >= second;
  -        }
  -        System.out.println("result is " + result);
  -
  -        return result;
  -      }
  -      
  -  }
  \ No newline at end of file
  +  LoggingEventFieldResolver resolver = LoggingEventFieldResolver.getInstance();
  +  Level levelFirstParam;
  +  String levelSecondParam;
  +  List utilList = new LinkedList();
  +  List levelList = new LinkedList();
  +  String inequalitySymbol;
  +
  +  private LevelInequalityRule(
  +    String inequalitySymbol, String levelFirstParam, String levelSecondParam) {
  +    levelList.add(Level.FATAL.toString());
  +    levelList.add(Level.ERROR.toString());
  +    levelList.add(Level.WARN.toString());
  +    levelList.add(Level.INFO.toString());
  +    levelList.add(Level.DEBUG.toString());
  +
  +    Iterator iter = UtilLoggingLevel.getAllPossibleLevels().iterator();
  +
  +    while (iter.hasNext()) {
  +      utilList.add(((UtilLoggingLevel) iter.next()).toString());
  +    }
  +
  +    if (levelList.contains(levelFirstParam)) {
  +      this.levelFirstParam = Level.toLevel(levelFirstParam);
  +    } else {
  +      this.levelFirstParam = UtilLoggingLevel.toLevel(levelFirstParam);
  +    }
  +
  +    this.inequalitySymbol = inequalitySymbol;
  +    this.levelSecondParam = levelSecondParam;
  +  }
  +
  +  static Rule getRule(String inequalitySymbol, Stack stack) {
  +    String p1 = stack.pop().toString();
  +    String p2 = stack.pop().toString();
  +
  +    return new LevelInequalityRule(inequalitySymbol, p1, p2);
  +  }
  +
  +  public boolean evaluate(LoggingEvent event) {
  +    //use the type of the first level to access the static toLevel method on the 
second param
  +    Level level2 =
  +      levelFirstParam.toLevel(
  +        resolver.getValue(levelSecondParam, event).toString());
  +    System.out.println("lessthan level op " + levelFirstParam + ".." + level2);
  +
  +    boolean result = false;
  +    int first = level2.toInt();
  +    int second = levelFirstParam.toInt();
  +
  +    if ("<".equals(inequalitySymbol)) {
  +      result = first < second;
  +    } else if (">".equals(inequalitySymbol)) {
  +      result = first > second;
  +    } else if ("<=".equals(inequalitySymbol)) {
  +      result = first <= second;
  +    } else if (">=".equals(inequalitySymbol)) {
  +      result = first >= second;
  +    }
  +
  +    System.out.println("result is " + result);
  +
  +    return result;
  +  }
  +}
  
  
  
  1.10      +135 -130  
jakarta-log4j/src/java/org/apache/log4j/chainsaw/rule/RuleTest.java
  
  Index: RuleTest.java
  ===================================================================
  RCS file: 
/home/cvs/jakarta-log4j/src/java/org/apache/log4j/chainsaw/rule/RuleTest.java,v
  retrieving revision 1.9
  retrieving revision 1.10
  diff -u -r1.9 -r1.10
  --- RuleTest.java     23 Oct 2003 09:18:12 -0000      1.9
  +++ RuleTest.java     25 Oct 2003 07:52:55 -0000      1.10
  @@ -49,9 +49,16 @@
   
   package org.apache.log4j.chainsaw.rule;
   
  +import org.apache.log4j.Level;
  +import org.apache.log4j.Logger;
  +import org.apache.log4j.MDC;
  +import org.apache.log4j.chainsaw.LoggingEventFieldResolver;
  +import org.apache.log4j.spi.LoggingEvent;
  +
   import java.awt.BorderLayout;
   import java.awt.GridLayout;
   import java.awt.event.ActionEvent;
  +
   import java.util.ArrayList;
   import java.util.Iterator;
   import java.util.List;
  @@ -65,136 +72,134 @@
   import javax.swing.JTextField;
   import javax.swing.WindowConstants;
   
  -import org.apache.log4j.Level;
  -import org.apache.log4j.Logger;
  -import org.apache.log4j.chainsaw.LoggingEventFieldResolver;
  -import org.apache.log4j.spi.LoggingEvent;
   
   public class RuleTest extends JFrame {
  -     /**
  -      * UI for demonstrating infix/postfix conversion and expression rule 
evaluation...work in progress...
  -      *
  -      * Infix to postfix conversion routines and evaluation methods for boolean 
expressions.
  -      * See http://www.qiksearch.com/articles/cs/infix-postfix/
  -      * and http://www.spsu.edu/cs/faculty/bbrown/web_lectures/postfix/
  -      *
  -      * for more information.
  -      *
  -      * @author Scott Deboy <[EMAIL PROTECTED]>
  -      *
  -      */
  -    Rule rule;
  -     public RuleTest(String booleanPostFixExpression, String inFixExpression) {
  -             setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
  -             getContentPane().setLayout(new BorderLayout());
  -
  -             final LoggingEventFieldResolver resolver =
  -                     LoggingEventFieldResolver.getInstance();
  -
  -             final List eventList = new ArrayList();
  -
  -             eventList.add(
  -                     new LoggingEvent(
  -                             "org.apache.log4j.chainsaw",
  -                             Logger.getLogger("logger1"),
  -                             System.currentTimeMillis(),
  -                             Level.DEBUG,
  -                             "message1",
  -                             new Exception("test")));
  -             eventList.add(
  -                     new LoggingEvent(
  -                             "org.apache.log4j.chainsaw",
  -                             Logger.getLogger("logger2"),
  -                             System.currentTimeMillis(),
  -                             Level.DEBUG,
  -                             "message2",
  -                             new Exception("test2")));
  -             eventList.add(
  -                     new LoggingEvent(
  -                             "org.apache.log4j.net",
  -                             Logger.getLogger("logger3"),
  -                             System.currentTimeMillis(),
  -                             Level.DEBUG,
  -                             "message3",
  -                             new Exception("test3")));
  -             eventList.add(
  -                     new LoggingEvent(
  -                             "org.apache.log4j.chainsaw",
  -                             Logger.getLogger("logger4"),
  -                             System.currentTimeMillis(),
  -                             Level.WARN,
  -                             "message4",
  -                             new Exception("test4")));
  -
  -             JPanel fieldPanel = new JPanel(new GridLayout(5, 1));
  -
  -             fieldPanel.add(
  -                     new JLabel("Enter infix expression to convert to postfix: "));
  -
  -             final JTextField inFixTextField = new JTextField(inFixExpression);
  -             fieldPanel.add(inFixTextField);
  -
  -             JButton inFixButton = new JButton("Convert InFix to PostFix");
  -             fieldPanel.add(inFixButton);
  -
  -             JLabel resultsLabel = new JLabel("Results:");
  -             fieldPanel.add(resultsLabel);
  -
  -             final JTextField inFixResult = new JTextField();
  -             fieldPanel.add(inFixResult);
  -             inFixButton.addActionListener(new AbstractAction() {
  -                     public void actionPerformed(ActionEvent evt) {
  -                             InFixToPostFix inFixConverter = new InFixToPostFix();
  -                             inFixResult.setText(
  -                                     
inFixConverter.convert(inFixTextField.getText()));
  -                rule = ExpressionRule.getRule(inFixResult.getText(), true);
  -                     }
  -             });
  -
  -             JPanel resultsPanel = new JPanel(new BorderLayout());
  -
  -             JButton resultsButton =
  -                     new JButton("Evaluate postfix expression against collection of 
events: ");
  -             resultsPanel.add(resultsButton, BorderLayout.NORTH);
  -
  -             final JTextArea results = new JTextArea(5, 50);
  -             resultsPanel.add(results, BorderLayout.CENTER);
  -
  -             resultsButton.addActionListener(new AbstractAction() {
  -                     public void actionPerformed(ActionEvent evt) {
  -                             results.setText("");
  -
  -                             Iterator iter = eventList.iterator();
  -
  -                             while (iter.hasNext()) {
  -                                     LoggingEvent event = (LoggingEvent) 
iter.next();
  -                                     results.setText(
  -                                             results.getText()
  -                                                     + ((results.getText().length() 
== 0) ? "" : "\n")
  -                                                     + "level: "
  -                                                     + event.getLevel()
  -                                                     + ", logger: "
  -                                                     + event.getLoggerName()
  -                                                     + " - result: "
  -                                                     + rule.evaluate(event));
  -                             }
  -                     }
  -             });
  -
  -             getContentPane().add(fieldPanel, BorderLayout.NORTH);
  -             getContentPane().add(resultsPanel, BorderLayout.CENTER);
  -     }
  -
  -    private void setRule(Rule rule) {
  -        this.rule = rule;
  -    }
  -    
  -     public static void main(String[] args) {
  -             RuleTest test =
  -                     new RuleTest(
  -                             "level deb ~=  blah test ==  ||  logger logger[1-3] 
like && ",
  -                             "( ( level ~= deb ) || ( BLAH == test ) ) && logger 
like logger[1-3]");
  -             test.pack();
  -             test.setVisible(true);
  -     }
  +  /**
  +   * UI for demonstrating infix/postfix conversion and expression rule 
evaluation...work in progress...
  +   *
  +   * Infix to postfix conversion routines and evaluation methods for boolean 
expressions.
  +   * See http://www.qiksearch.com/articles/cs/infix-postfix/
  +   * and http://www.spsu.edu/cs/faculty/bbrown/web_lectures/postfix/
  +   *
  +   * for more information.
  +   *
  +   * @author Scott Deboy <[EMAIL PROTECTED]>
  +   *
  +   */
  +  Rule rule;
  +
  +  public RuleTest(String booleanPostFixExpression, String inFixExpression) {
  +    setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
  +    getContentPane().setLayout(new BorderLayout());
  +
  +    final LoggingEventFieldResolver resolver =
  +      LoggingEventFieldResolver.getInstance();
  +
  +    final List eventList = new ArrayList();
  +    MDC.put("entry1", "123");
  +    eventList.add(
  +      new LoggingEvent(
  +        "org.apache.log4j.chainsaw", Logger.getLogger("logger1"),
  +        System.currentTimeMillis(), Level.DEBUG, "message1",
  +        new Exception("test")));
  +    MDC.put("entry2", "test1");
  +    eventList.add(
  +      new LoggingEvent(
  +        "org.apache.log4j.chainsaw", Logger.getLogger("logger2"),
  +        System.currentTimeMillis(), Level.DEBUG, "message2",
  +        new Exception("test2")));
  +    eventList.add(
  +      new LoggingEvent(
  +        "org.apache.log4j.net", Logger.getLogger("logger3"),
  +        System.currentTimeMillis(), Level.DEBUG, "message3",
  +        new Exception("test3")));
  +
  +    MDC.put("test", "234");
  +    eventList.add(
  +      new LoggingEvent(
  +        "org.apache.log4j.chainsaw", Logger.getLogger("logger4"),
  +        System.currentTimeMillis(), Level.WARN, "message4",
  +        new Exception("test4")));
  +
  +    JPanel fieldPanel = new JPanel(new GridLayout(5, 1));
  +
  +    fieldPanel.add(
  +      new JLabel("Enter infix expression to convert to postfix: "));
  +
  +    final JTextField inFixTextField = new JTextField(inFixExpression);
  +    fieldPanel.add(inFixTextField);
  +
  +    JButton inFixButton = new JButton("Convert InFix to PostFix");
  +    fieldPanel.add(inFixButton);
  +
  +    JLabel resultsLabel = new JLabel("Results:");
  +    fieldPanel.add(resultsLabel);
  +
  +    final JTextField inFixResult = new JTextField();
  +    fieldPanel.add(inFixResult);
  +    inFixButton.addActionListener(
  +      new AbstractAction() {
  +        public void actionPerformed(ActionEvent evt) {
  +          InFixToPostFix inFixConverter = new InFixToPostFix();
  +          inFixResult.setText(
  +            inFixConverter.convert(inFixTextField.getText()));
  +          rule = ExpressionRule.getRule(inFixResult.getText(), true);
  +        }
  +      });
  +
  +    JPanel resultsPanel = new JPanel(new BorderLayout());
  +
  +    JButton resultsButton =
  +      new JButton(
  +        "Evaluate postfix expression against collection of events: ");
  +    resultsPanel.add(resultsButton, BorderLayout.NORTH);
  +
  +    final JTextArea results = new JTextArea(5, 50);
  +    resultsPanel.add(results, BorderLayout.CENTER);
  +
  +    resultsButton.addActionListener(
  +      new AbstractAction() {
  +        public void actionPerformed(ActionEvent evt) {
  +          results.setText("");
  +
  +          Iterator iter = eventList.iterator();
  +
  +          while (iter.hasNext()) {
  +            LoggingEvent event = (LoggingEvent) iter.next();
  +            Iterator iter2 = event.getMDCKeySet().iterator();
  +            StringBuffer mdc = new StringBuffer();
  +
  +            while (iter2.hasNext()) {
  +              String mdcKey = (String) iter2.next();
  +              mdc.append(mdcKey);
  +              mdc.append(":");
  +              mdc.append(event.getMDC(mdcKey));
  +            }
  +
  +            results.setText(
  +              results.getText()
  +              + ((results.getText().length() == 0) ? "" : "\n") + "level: "
  +              + event.getLevel() + ", logger: " + event.getLoggerName()
  +              + ", MDC: " + mdc.toString() + " - result: "
  +              + rule.evaluate(event));
  +          }
  +        }
  +      });
  +
  +    getContentPane().add(fieldPanel, BorderLayout.NORTH);
  +    getContentPane().add(resultsPanel, BorderLayout.CENTER);
  +  }
  +
  +  private void setRule(Rule rule) {
  +    this.rule = rule;
  +  }
  +
  +  public static void main(String[] args) {
  +    RuleTest test =
  +      new RuleTest(
  +        "level deb ~=  BLAH test ==  ||  logger logger[1-3] like MDC.entry1 234 >= 
||  && ",
  +        "( ( level ~= deb ) || ( BLAH == test ) ) && ( logger like logger[1-3] || 
MDC.entry1 >= 234 )");
  +    test.pack();
  +    test.setVisible(true);
  +  }
   }
  
  
  
  1.2       +38 -22    
jakarta-log4j/src/java/org/apache/log4j/chainsaw/rule/InequalityRule.java
  
  Index: InequalityRule.java
  ===================================================================
  RCS file: 
/home/cvs/jakarta-log4j/src/java/org/apache/log4j/chainsaw/rule/InequalityRule.java,v
  retrieving revision 1.1
  retrieving revision 1.2
  diff -u -r1.1 -r1.2
  --- InequalityRule.java       24 Oct 2003 08:04:03 -0000      1.1
  +++ InequalityRule.java       25 Oct 2003 07:52:55 -0000      1.2
  @@ -49,28 +49,28 @@
   
   package org.apache.log4j.chainsaw.rule;
   
  -import java.util.Stack;
  -
   import org.apache.log4j.chainsaw.LoggingEventFieldResolver;
   import org.apache.log4j.spi.LoggingEvent;
   
  +import java.util.Stack;
  +
  +
   /**
    * A Rule class implementing less than - expects to be able to convert two values 
to longs.
    * If the field being evaluated can support inequality evaluation, the appropriate 
rule is returned.
    * (For example, if the expression is Level < DEBUG, a LessThanLevelRule is 
returned).
  - * 
  + *
    * @author Scott Deboy <[EMAIL PROTECTED]>
    */
  -
   class InequalityRule extends AbstractRule {
  -    private static final String LEVEL = "LEVEL";
  -
  +  private static final String LEVEL = "LEVEL";
     LoggingEventFieldResolver resolver = LoggingEventFieldResolver.getInstance();
     String firstParam;
     String secondParam;
     String inequalitySymbol;
   
  -  private InequalityRule(String inequalitySymbol, String firstParam, String 
secondParam) {
  +  private InequalityRule(
  +    String inequalitySymbol, String firstParam, String secondParam) {
       this.inequalitySymbol = inequalitySymbol;
       this.firstParam = firstParam;
       this.secondParam = secondParam;
  @@ -79,34 +79,50 @@
     static Rule getRule(String inequalitySymbol, Stack stack) {
       String p1 = stack.pop().toString();
       String p2 = stack.pop().toString();
  +
       if (p2.equalsIgnoreCase(LEVEL)) {
  -        //push the value back on the stack and allow the level-specific rule pop 
values
  -        stack.push(p1);
  -        stack.push(p2);
  +      //push the value back on the stack and allow the level-specific rule pop 
values
  +      stack.push(p2);
  +      stack.push(p1);
   
  -        return LevelInequalityRule.getRule(inequalitySymbol, stack);
  +      return LevelInequalityRule.getRule(inequalitySymbol, stack);
       } else {
  -        System.out.println("get equals op " + p1 + ".." + p2);
  +      System.out.println("get equals op " + p1 + ".." + p2);
   
  -        return new InequalityRule(inequalitySymbol, p1, p2);
  +      return new InequalityRule(inequalitySymbol, p1, p2);
       }
     }
  -  
  +
     public boolean evaluate(LoggingEvent event) {
  -    long second = new Long(resolver.getValue(secondParam, 
event).toString()).longValue();
  -    long first = new Long(firstParam).longValue();
  +    long first = 0;
  +
  +    try {
  +      first =
  +        new Long(resolver.getValue(secondParam, event).toString()).longValue();
  +    } catch (NumberFormatException nfe) {
  +      return false;
  +    }
  +
  +    long second = 0;
  +
  +    try {
  +      second = new Long(firstParam).longValue();
  +    } catch (NumberFormatException nfe) {
  +      return false;
  +    }
   
       boolean result = false;
  -        
  +
       if ("<".equals(inequalitySymbol)) {
  -        result = first < second;
  +      result = first < second;
       } else if (">".equals(inequalitySymbol)) {
  -        result = first > second;
  -    } else if ("<=".equals(inequalitySymbol)){
  -        result = first <= second;
  +      result = first > second;
  +    } else if ("<=".equals(inequalitySymbol)) {
  +      result = first <= second;
       } else if (">=".equals(inequalitySymbol)) {
  -        result = first >= second;
  +      result = first >= second;
       }
  +
       System.out.println("result is " + result);
   
       return result;
  
  
  
  1.6       +35 -31    
jakarta-log4j/src/java/org/apache/log4j/chainsaw/LoggingEventFieldResolver.java
  
  Index: LoggingEventFieldResolver.java
  ===================================================================
  RCS file: 
/home/cvs/jakarta-log4j/src/java/org/apache/log4j/chainsaw/LoggingEventFieldResolver.java,v
  retrieving revision 1.5
  retrieving revision 1.6
  diff -u -r1.5 -r1.6
  --- LoggingEventFieldResolver.java    23 Oct 2003 09:32:23 -0000      1.5
  +++ LoggingEventFieldResolver.java    25 Oct 2003 07:52:55 -0000      1.6
  @@ -49,11 +49,11 @@
   
   package org.apache.log4j.chainsaw;
   
  +import org.apache.log4j.spi.LoggingEvent;
  +
   import java.util.ArrayList;
   import java.util.List;
   
  -import org.apache.log4j.spi.LoggingEvent;
  -
   
   /**
    * A singleton helper utility which accepts a field name and a LoggingEvent and 
returns the
  @@ -64,25 +64,25 @@
    * The only available method is Object getField(String fieldName, LoggingEvent 
event).
    *
    * Here is a description of the mapping of field names in the grammar
  - * to fields on the logging event.  While the getField method returns an Object, 
the 
  - * individual types returned per field are described here: 
  + * to fields on the logging event.  While the getField method returns an Object, the
  + * individual types returned per field are described here:
    *
  - * Field Name                Field value (String representation              Return 
type
  - * LOGGER                    category name (logger)                                 
 String
  - * LEVEL                     level                                                  
                 Level
  - * CLASS                     locationInformation's class name                String
  - * FILE                      locationInformation's file name         String
  - * LINE                      locationInformation's line number               String
  - * METHOD                    locationInformation's method name               String
  - * MSG                       message                                                
         Object
  - * NDC                       NDC                                                    
                 String
  - * EXCEPTION                 throwable string representation         
ThrowableInformation
  - * TIMESTAMP                 timestamp                                              
                 Long
  - * THREAD                    thread                                                 
                 String
  - * MDC.keyName               entry in the MDC hashtable                      Object
  - *                                                    mapped to key 'keyName'       
                 
  - * PROP.keyName              entry in the Property hashtable                 String
  - *                                                    mapped to the key 'keyName'   
 
  + * Field Name                Field value (String representation                
Return type
  + * LOGGER                    category name (logger)                                 
       String
  + * LEVEL                     level                                                  
                      Level
  + * CLASS                     locationInformation's class name                String
  + * FILE                      locationInformation's file name                String
  + * LINE                      locationInformation's line number                String
  + * METHOD                    locationInformation's method name                String
  + * MSG                       message                                                
                Object
  + * NDC                       NDC                                                    
                    String
  + * EXCEPTION                 throwable string representation                
ThrowableInformation
  + * TIMESTAMP                 timestamp                                              
                  Long
  + * THREAD                    thread                                                 
                       String
  + * MDC.keyName               entry in the MDC hashtable                         
Object
  + *                                                          mapped to key 'keyName'
  + * PROP.keyName              entry in the Property hashtable                 String
  + *                                                          mapped to the key 
'keyName'
   
    * NOTE:  the values for the 'keyName' portion of the MDC and PROP mappings must
    * be an exact match to the key in the hashTable (case sensitive).
  @@ -97,7 +97,6 @@
    */
   public final class LoggingEventFieldResolver {
     private static final List keywordList = new ArrayList();
  -    
     private static final String LOGGER_FIELD = "LOGGER";
     private static final String LEVEL_FIELD = "LEVEL";
     private static final String CLASS_FIELD = "CLASS";
  @@ -111,12 +110,10 @@
     private static final String THREAD_FIELD = "THREAD";
     private static final String MDC_FIELD = "MDC.";
     private static final String PROP_FIELD = "PROP.";
  -  
     private static final String EMPTY_STRING = "";
  -
     private static final LoggingEventFieldResolver resolver =
       new LoggingEventFieldResolver();
  -  
  +
     private LoggingEventFieldResolver() {
       keywordList.add(LOGGER_FIELD);
       keywordList.add(LEVEL_FIELD);
  @@ -144,7 +141,7 @@
     public boolean isField(String fieldName) {
       return keywordList.contains(fieldName);
     }
  -  
  +
     public Object getValue(String fieldName, LoggingEvent event) {
       if (fieldName == null) {
         return EMPTY_STRING;
  @@ -167,21 +164,28 @@
       } else if (MSG_FIELD.equals(upperField)) {
         return event.getMessage();
       } else if (NDC_FIELD.equals(upperField)) {
  -      return event.getNDC();
  +      String ndcValue = event.getNDC();
  +
  +      return ((ndcValue == null) ? "" : ndcValue);
       } else if (EXCEPTION_FIELD.equals(upperField)) {
  -       return event.getThrowableInformation();
  +      return event.getThrowableInformation();
       } else if (TIMESTAMP_FIELD.equals(upperField)) {
         return new Long(event.timeStamp);
       } else if (THREAD_FIELD.equals(upperField)) {
         return event.getThreadName();
       } else if (upperField.startsWith(MDC_FIELD)) {
         //note: need to use actual fieldname since case matters
  -      return event.getMDC(fieldName.substring(4));
  +      Object mdcValue = event.getMDC(fieldName.substring(4));
  +
  +      return ((mdcValue == null) ? "" : mdcValue.toString());
       } else if (upperField.startsWith(PROP_FIELD)) {
  -             //note: need to use actual fieldname since case matters
  -      return event.getProperty(fieldName.substring(5));
  +      //note: need to use actual fieldname since case matters
  +      String propValue = event.getProperty(fieldName.substring(5));
  +
  +      return ((propValue == null) ? "" : propValue);
       }
  -     //there wasn't a match, so just return the passed-in name
  +
  +    //there wasn't a match, so just return the passed-in name
       return fieldName;
     }
   }
  
  
  

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

Reply via email to