sdeboy      2003/10/29 23:04:27

  Modified:    src/java/org/apache/log4j/chainsaw/filter
                        EventTypeEntryContainer.java
               src/java/org/apache/log4j/chainsaw/rule RuleTest.java
               src/java/org/apache/log4j/chainsaw
                        LoggingEventFieldResolver.java
  Log:
  updated context menu code - now support for context menu via right mouse button or 
ctrl-space
  mdc lookup now functions correctly
  
  Revision  Changes    Path
  1.3       +5 -9      
jakarta-log4j/src/java/org/apache/log4j/chainsaw/filter/EventTypeEntryContainer.java
  
  Index: EventTypeEntryContainer.java
  ===================================================================
  RCS file: 
/home/cvs/jakarta-log4j/src/java/org/apache/log4j/chainsaw/filter/EventTypeEntryContainer.java,v
  retrieving revision 1.2
  retrieving revision 1.3
  diff -u -r1.2 -r1.3
  --- EventTypeEntryContainer.java      29 Oct 2003 08:50:36 -0000      1.2
  +++ EventTypeEntryContainer.java      30 Oct 2003 07:04:27 -0000      1.3
  @@ -93,7 +93,7 @@
     private static final String FILE_FIELD = "FILE";
     private static final String THREAD_FIELD = "THREAD";
     private static final String METHOD_FIELD = "METHOD";
  -  private static final String MDC_FIELD = "MDC.";
  +  private static final String MDC_FIELD = "MDC";
     private static final String NDC_FIELD = "NDC";
   
     public EventTypeEntryContainer() {
  @@ -104,23 +104,19 @@
         modelMap.put(THREAD_FIELD, threadListModel);
         modelMap.put(METHOD_FIELD, methodListModel);
         modelMap.put(NDC_FIELD, ndcListModel);
  -      //mdc supported, but not in map
  +      modelMap.put(MDC_FIELD, mdcListModel);
     }
     
     public boolean modelExists(String fieldName) {
         if (fieldName != null) {
  -          return ((fieldName.toUpperCase().startsWith(MDC_FIELD)) || 
(modelMap.keySet().contains(fieldName.toUpperCase())));
  +          return (modelMap.keySet().contains(fieldName.toUpperCase()));
         }
         return false;
     }
     
     public ListModel getModel(String fieldName) {
  -      if (modelExists(fieldName)) {
  -          if (fieldName.toUpperCase().startsWith(MDC_FIELD)) {
  -              return mdcListModel;
  -          } else {
  -              return (ListModel)modelMap.get(fieldName.toUpperCase());
  -          }
  +      if (fieldName != null) {
  +          return (ListModel)modelMap.get(fieldName.toUpperCase());
         }
         return null;
     } 
  
  
  
  1.12      +159 -93   
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.11
  retrieving revision 1.12
  diff -u -r1.11 -r1.12
  --- RuleTest.java     29 Oct 2003 08:50:37 -0000      1.11
  +++ RuleTest.java     30 Oct 2003 07:04:27 -0000      1.12
  @@ -49,6 +49,14 @@
   
   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.ChainsawConstants;
  +import org.apache.log4j.chainsaw.LoggingEventFieldResolver;
  +import org.apache.log4j.chainsaw.filter.FilterModel;
  +import org.apache.log4j.spi.LoggingEvent;
  +
   import java.awt.BorderLayout;
   import java.awt.GridLayout;
   import java.awt.Point;
  @@ -57,6 +65,7 @@
   import java.awt.event.KeyEvent;
   import java.awt.event.MouseAdapter;
   import java.awt.event.MouseEvent;
  +
   import java.util.ArrayList;
   import java.util.Iterator;
   import java.util.List;
  @@ -72,16 +81,6 @@
   import javax.swing.JTextArea;
   import javax.swing.JTextField;
   import javax.swing.WindowConstants;
  -import javax.swing.event.CaretEvent;
  -import javax.swing.event.CaretListener;
  -
  -import org.apache.log4j.Level;
  -import org.apache.log4j.Logger;
  -import org.apache.log4j.MDC;
  -import org.apache.log4j.chainsaw.ChainsawConstants;
  -import org.apache.log4j.chainsaw.LoggingEventFieldResolver;
  -import org.apache.log4j.chainsaw.filter.FilterModel;
  -import org.apache.log4j.spi.LoggingEvent;
   
   
   public class RuleTest extends JFrame {
  @@ -106,8 +105,9 @@
   
       LoggingEventFieldResolver resolver =
         LoggingEventFieldResolver.getInstance();
  -      
  +
       filterModel = new FilterModel();
  +
       final List eventList = new ArrayList();
       MDC.put("entry1", "123");
       eventList.add(
  @@ -133,10 +133,13 @@
           "org.apache.log4j.chainsaw", Logger.getLogger("logger4"),
           System.currentTimeMillis(), Level.WARN, "message4",
           new Exception("test4")));
  +
       Iterator iter = eventList.iterator();
  +
       while (iter.hasNext()) {
  -        LoggingEvent event = (LoggingEvent)iter.next();
  -        filterModel.processNewLoggingEvent(ChainsawConstants.LOG4J_EVENT_TYPE, 
event);
  +      LoggingEvent event = (LoggingEvent) iter.next();
  +      filterModel.processNewLoggingEvent(
  +        ChainsawConstants.LOG4J_EVENT_TYPE, event);
       }
   
       JPanel fieldPanel = new JPanel(new GridLayout(5, 1));
  @@ -146,9 +149,9 @@
   
       final JTextField inFixTextField = new JTextField(inFixText);
       fieldPanel.add(inFixTextField);
  +
       ContextListener listener = new ContextListener(inFixTextField);
       inFixTextField.addKeyListener(listener);
  -    inFixTextField.addCaretListener(listener);
   
       JButton inFixButton = new JButton("Convert InFix to PostFix");
       fieldPanel.add(inFixButton);
  @@ -217,96 +220,159 @@
   
     public static void main(String[] args) {
       RuleTest test =
  -      new RuleTest("( level ~= deb ) && ( logger like logger[1-2] || MDC.entry1 >= 
234 )");
  +      new RuleTest(
  +        "( level ~= deb ) && ( logger like logger[1-2] || MDC.entry1 >= 234 )");
       test.pack();
       test.setVisible(true);
     }
  -  
  -  class ContextListener extends KeyAdapter implements CaretListener {
  -      LoggingEventFieldResolver resolver = LoggingEventFieldResolver.getInstance();
  -      String lastSymbol = null;
  -      String lastField = null;
  -      JPopupMenu contextMenu = new JPopupMenu();
  -      JList list = new JList();
  -      final JTextField textField;
  -      
  +
  +  class ContextListener extends KeyAdapter {
  +    LoggingEventFieldResolver resolver =
  +      LoggingEventFieldResolver.getInstance();
  +    String lastField = null;
  +    JPopupMenu contextMenu = new JPopupMenu();
  +    JList list = new JList();
  +    final JTextField textField;
  +
       public ContextListener(final JTextField textField) {
  -        this.textField = textField;
  -        list.setVisibleRowCount(5);
  -        list.addKeyListener(new KeyAdapter() {
  -            public void keyPressed(KeyEvent e) {
  -                System.out.println("key pressed");
  -                if (e.getKeyCode() == KeyEvent.VK_ENTER) {
  -                    System.out.println("enter pressed");
  -                    updateField(list.getSelectedValue().toString());
  -                    contextMenu.setVisible(false);
  -                }
  -            }});
  -            
  -        list.addMouseListener(new MouseAdapter() {
  -            public void mouseClicked(MouseEvent e) {
  -                if (e.getClickCount() == 2) {
  -                    System.out.println("double clicked");
  -                    updateField(list.getSelectedValue().toString());
  -                    contextMenu.setVisible(false);
  -                }
  -            }});
  +      this.textField = textField;
  +      list.setVisibleRowCount(5);
   
  +      PopupListener popupListener = new PopupListener();
  +      textField.addMouseListener(popupListener);
  +
  +      list.addKeyListener(
  +        new KeyAdapter() {
  +          public void keyPressed(KeyEvent e) {
  +            if (e.getKeyCode() == KeyEvent.VK_ENTER) {
  +              updateField(list.getSelectedValue().toString());
  +              contextMenu.setVisible(false);
  +            }
  +          }
  +        });
  +
  +      list.addMouseListener(
  +        new MouseAdapter() {
  +          public void mouseClicked(MouseEvent e) {
  +            if (e.getClickCount() == 2) {
  +              updateField(list.getSelectedValue().toString());
  +              contextMenu.setVisible(false);
  +            }
  +          }
  +        });
   
  -        JScrollPane scrollPane = new JScrollPane(list);
  -        contextMenu.insert(scrollPane, 0);
  +      JScrollPane scrollPane = new JScrollPane(list);
  +      contextMenu.insert(scrollPane, 0);
       }
   
       private void updateField(String value) {
  -        String text = textField.getText();
  -        int position = textField.getCaretPosition();
  -        textField.setText(text.substring(0, position) + value + 
text.substring(position));
  -        textField.setCaretPosition(position + value.length());
  +      String text = textField.getText();
  +      int position = textField.getCaretPosition();
  +      textField.setText(
  +        text.substring(0, position) + value + text.substring(position));
  +      textField.setCaretPosition(position + value.length());
       }
  -    
  -    public void keyTyped(KeyEvent e) {
  -        if ((e.getKeyCode() == KeyEvent.VK_SPACE) && (e.getModifiers() == 
KeyEvent.CTRL_MASK));
  -        System.out.println("PRESSED CTRL-SPACE");
  -        if (resolver.isField(lastField) && RuleFactory.isRule(lastSymbol)) {
  -            System.out.println("showing popupmenu");
  -            if (filterModel.getContainer().modelExists(lastField)) {
  -                list.setModel(filterModel.getContainer().getModel(lastField));
  -                list.setSelectedIndex(0);
  -                Point p = 
((JTextField)e.getComponent()).getCaret().getMagicCaretPosition();
  -                contextMenu.show(e.getComponent(), p.x, (p.y + 
(e.getComponent().getHeight() - 5)));
  -                contextMenu.requestFocusInWindow();
  -            }
  -        }
  +
  +    public void keyPressed(KeyEvent e) {
  +      if (
  +        (e.getKeyCode() == KeyEvent.VK_SPACE)
  +          && (e.getModifiers() == KeyEvent.CTRL_MASK)) {
  +        displayContext();
  +      }
       }
  -    
  -     public void caretUpdate(CaretEvent e) {
  -        //( level ~= deb )
  -        String text = textField.getText();
  -        int endPosition = e.getDot() - 2;
  -        if (endPosition > -1 && text.charAt(endPosition) == ' ') {
  -            endPosition--;
  -        }
  -        System.out.println("position is " + endPosition);
  -        int startPosition = text.lastIndexOf(" ", endPosition) + 1;
  -        System.out.println("startposition is " + startPosition);
  -        
  -        if (startPosition > -1 && endPosition > -1) {
  -            lastSymbol = text.substring(startPosition, endPosition + 1);
  -            if (!RuleFactory.isRule(lastSymbol)) {
  -                lastSymbol = null;
  -            }
  -            System.out.println("last SYMBOL IS " + lastSymbol);
  -            
  -            int fieldStartPosition = text.lastIndexOf(" ", startPosition - 2);
  -            System.out.println("fieldstart is " + fieldStartPosition);
  -            if (fieldStartPosition > -1 ) {
  -                lastField = text.substring(fieldStartPosition + 1, startPosition - 
1);
  -                if (!resolver.isField(lastField)) {
  -                    lastField = null;
  -                }
  -                System.out.println("last field is " + lastField);
  -            }
  +
  +    public void displayContext() {
  +      String lastField = getContextKey();
  +
  +      if (lastField != null) {
  +        list.setModel(filterModel.getContainer().getModel(lastField));
  +        list.setSelectedIndex(0);
  +
  +        Point p = textField.getCaret().getMagicCaretPosition();
  +        contextMenu.show(textField, p.x, (p.y + (textField.getHeight() - 6)));
  +        list.requestFocus();
  +      }
  +    }
  +
  +    private String getContextKey() {
  +      String field = getField();
  +
  +      if (field == null) {
  +        field = getSubField();
  +      }
  +
  +      return field;
  +    }
  +
  +    //returns the currently active field which can be used to display a context menu
  +    //the field returned is the left hand portion of an expression (for example, 
logger == )
  +    //logger is the field that is returned
  +    private String getField() {
  +      String text = textField.getText();
  +
  +      int currentPosition = textField.getCaretPosition();
  +
  +      if ((currentPosition < 1) || (text.charAt(currentPosition - 1) != ' ')) {
  +        return null;
  +      }
  +
  +      int symbolPosition = text.lastIndexOf(" ", currentPosition - 1);
  +
  +      if (symbolPosition < 0) {
  +        return null;
  +      }
  +
  +      int lastFieldPosition = text.lastIndexOf(" ", symbolPosition - 1);
  +
  +      if (lastFieldPosition < 0) {
  +        return null;
  +      }
  +
  +      int lastFieldStartPosition =
  +        Math.max(0, text.lastIndexOf(" ", lastFieldPosition - 1));
  +      String lastSymbol =
  +        text.substring(lastFieldPosition + 1, symbolPosition).trim();
  +
  +      String lastField =
  +        text.substring(lastFieldStartPosition, lastFieldPosition).trim();
  +
  +      if (RuleFactory.isRule(lastSymbol) && resolver.isField(lastField)) {
  +        return lastField;
  +      }
  +
  +      return null;
  +    }
  +
  +    //subfields allow the key portion of a field to provide context menu support
  +    //and are available after the fieldname and a . (for example, MDC.)
  +    private String getSubField() {
  +      int currentPosition = textField.getCaretPosition();
  +      String text = textField.getText();
  +
  +      if (text.substring(0, currentPosition).endsWith("MDC.")) {
  +        return "MDC";
  +      }
  +
  +      return null;
  +    }
  +
  +    class PopupListener extends MouseAdapter {
  +      PopupListener() {
  +      }
  +
  +      public void mousePressed(MouseEvent e) {
  +        checkPopup(e);
  +      }
  +
  +      public void mouseReleased(MouseEvent e) {
  +        checkPopup(e);
  +      }
  +
  +      private void checkPopup(MouseEvent e) {
  +        if (e.isPopupTrigger()) {
  +          displayContext();
           }
  -     }
  +      }
  +    }
     }
   }
  
  
  
  1.10      +15 -21    
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.9
  retrieving revision 1.10
  diff -u -r1.9 -r1.10
  --- LoggingEventFieldResolver.java    29 Oct 2003 08:50:37 -0000      1.9
  +++ LoggingEventFieldResolver.java    30 Oct 2003 07:04:27 -0000      1.10
  @@ -68,21 +68,21 @@
    * 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'
  + * 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).
  @@ -142,10 +142,6 @@
     }
   
     public Object getValue(String fieldName, LoggingEvent event) {
  -    if (fieldName == null) {
  -        throw new RuntimeException("null field name");
  -    }
  -
       String upperField = fieldName.toUpperCase();
   
       if (LOGGER_FIELD.equals(upperField)) {
  @@ -164,7 +160,6 @@
         return event.getMessage();
       } else if (NDC_FIELD.equals(upperField)) {
         String ndcValue = event.getNDC();
  -
         return ((ndcValue == null) ? "" : ndcValue);
       } else if (EXCEPTION_FIELD.equals(upperField)) {
         return event.getThrowableInformation();
  @@ -180,7 +175,6 @@
       } else if (upperField.startsWith(PROP_FIELD)) {
         //note: need to use actual fieldname since case matters
         String propValue = event.getProperty(fieldName.substring(5));
  -
         return ((propValue == null) ? EMPTY_STRING : propValue);
       }
   
  
  
  

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

Reply via email to