sdeboy 2003/10/29 00:50:37 Modified: src/java/org/apache/log4j/chainsaw/filter FilterModel.java EventTypeEntryContainer.java src/java/org/apache/log4j/chainsaw/rule RuleFactory.java RuleTest.java src/java/org/apache/log4j/chainsaw LogPanelPreferencePanel.java LogPanel.java TableColorizingRenderer.java LogPanelPreferenceModel.java LoggingEventFieldResolver.java ChainsawConstants.java Log: * added logger precision support to chainsaw as a panel preference - similar to patternlayout's c{x} * beginning work on expression builder event context popup * example: define expression "logger == ", hit ctrl-space, and a popup is displayed containing all of the the loggers which exist in the tab's set of events (which can then be inserted into the expression) * increased visibility of accessor methods to enable context popup * added 'modelexists' method on eventtypentrycontainer to determine which logging event fields can provide a context popup Revision Changes Path 1.3 +1 -1 jakarta-log4j/src/java/org/apache/log4j/chainsaw/filter/FilterModel.java Index: FilterModel.java =================================================================== RCS file: /home/cvs/jakarta-log4j/src/java/org/apache/log4j/chainsaw/filter/FilterModel.java,v retrieving revision 1.2 retrieving revision 1.3 diff -u -r1.2 -r1.3 --- FilterModel.java 11 Sep 2003 12:32:52 -0000 1.2 +++ FilterModel.java 29 Oct 2003 08:50:36 -0000 1.3 @@ -85,7 +85,7 @@ } } - EventTypeEntryContainer getContainer() { + public EventTypeEntryContainer getContainer() { // if(eventTypeMap.size()>0){ // return (EventTypeEntryContainer) eventTypeMap.values().iterator().next(); // } 1.2 +41 -1 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.1 retrieving revision 1.2 diff -u -r1.1 -r1.2 --- EventTypeEntryContainer.java 11 Sep 2003 12:32:52 -0000 1.1 +++ EventTypeEntryContainer.java 29 Oct 2003 08:50:36 -0000 1.2 @@ -51,8 +51,10 @@ */ package org.apache.log4j.chainsaw.filter; +import java.util.HashMap; import java.util.HashSet; import java.util.Iterator; +import java.util.Map; import java.util.Set; import javax.swing.DefaultListModel; @@ -65,7 +67,7 @@ * @author Paul Smith * */ -class EventTypeEntryContainer { +public class EventTypeEntryContainer { private Set ColumnNames = new HashSet(); private Set Methods = new HashSet(); private Set Classes = new HashSet(); @@ -84,7 +86,45 @@ private DefaultListModel loggerListModel = new DefaultListModel(); private DefaultListModel threadListModel = new DefaultListModel(); private DefaultListModel fileNameListModel = new DefaultListModel(); + private Map modelMap = new HashMap(); + private static final String LOGGER_FIELD = "LOGGER"; + private static final String LEVEL_FIELD = "LEVEL"; + private static final String CLASS_FIELD = "CLASS"; + 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 NDC_FIELD = "NDC"; + public EventTypeEntryContainer() { + modelMap.put(LOGGER_FIELD, loggerListModel); + modelMap.put(LEVEL_FIELD, levelListModel); + modelMap.put(CLASS_FIELD, classesListModel); + modelMap.put(FILE_FIELD, fileNameListModel); + modelMap.put(THREAD_FIELD, threadListModel); + modelMap.put(METHOD_FIELD, methodListModel); + modelMap.put(NDC_FIELD, ndcListModel); + //mdc supported, but not in map + } + + public boolean modelExists(String fieldName) { + if (fieldName != null) { + return ((fieldName.toUpperCase().startsWith(MDC_FIELD)) || (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()); + } + } + return null; + } + void addLevel(Object level) { if (Levels.add(level)) { levelListModel.addElement(level); 1.4 +1 -1 jakarta-log4j/src/java/org/apache/log4j/chainsaw/rule/RuleFactory.java Index: RuleFactory.java =================================================================== RCS file: /home/cvs/jakarta-log4j/src/java/org/apache/log4j/chainsaw/rule/RuleFactory.java,v retrieving revision 1.3 retrieving revision 1.4 diff -u -r1.3 -r1.4 --- RuleFactory.java 24 Oct 2003 08:04:03 -0000 1.3 +++ RuleFactory.java 29 Oct 2003 08:50:36 -0000 1.4 @@ -87,7 +87,7 @@ } static boolean isRule(String symbol) { - return rules.contains(symbol.toLowerCase()); + return ((symbol != null) && (rules.contains(symbol.toLowerCase()))); } static Rule getRule(String symbol, Stack stack) { 1.11 +121 -14 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.10 retrieving revision 1.11 diff -u -r1.10 -r1.11 --- RuleTest.java 25 Oct 2003 07:52:55 -0000 1.10 +++ RuleTest.java 29 Oct 2003 08:50:37 -0000 1.11 @@ -49,16 +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.LoggingEventFieldResolver; -import org.apache.log4j.spi.LoggingEvent; - import java.awt.BorderLayout; import java.awt.GridLayout; +import java.awt.Point; import java.awt.event.ActionEvent; - +import java.awt.event.KeyAdapter; +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; @@ -67,10 +65,23 @@ import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JLabel; +import javax.swing.JList; import javax.swing.JPanel; +import javax.swing.JPopupMenu; +import javax.swing.JScrollPane; 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 { @@ -87,14 +98,16 @@ * */ Rule rule; + FilterModel filterModel; - public RuleTest(String booleanPostFixExpression, String inFixExpression) { + public RuleTest(String inFixText) { setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE); getContentPane().setLayout(new BorderLayout()); - final LoggingEventFieldResolver resolver = + LoggingEventFieldResolver resolver = LoggingEventFieldResolver.getInstance(); - + + filterModel = new FilterModel(); final List eventList = new ArrayList(); MDC.put("entry1", "123"); eventList.add( @@ -120,14 +133,22 @@ "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); + } 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); + 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); @@ -196,10 +217,96 @@ 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 )"); + 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; + + 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); + } + }}); + + + 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()); + } + + 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 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); + } + } + } } } 1.6 +24 -4 jakarta-log4j/src/java/org/apache/log4j/chainsaw/LogPanelPreferencePanel.java Index: LogPanelPreferencePanel.java =================================================================== RCS file: /home/cvs/jakarta-log4j/src/java/org/apache/log4j/chainsaw/LogPanelPreferencePanel.java,v retrieving revision 1.5 retrieving revision 1.6 diff -u -r1.5 -r1.6 --- LogPanelPreferencePanel.java 3 Oct 2003 03:56:51 -0000 1.5 +++ LogPanelPreferencePanel.java 29 Oct 2003 08:50:37 -0000 1.6 @@ -75,6 +75,7 @@ import javax.swing.JPanel; import javax.swing.JRadioButton; import javax.swing.JScrollPane; +import javax.swing.JTextField; import javax.swing.JTree; import javax.swing.ListCellRenderer; import javax.swing.UIManager; @@ -112,10 +113,11 @@ private final JLabel titleLabel = new JLabel("Selected Pref Panel"); private final JPanel mainPanel = new JPanel(new BorderLayout(10, 10)); private final JPanel selectedPrefPanel = new JPanel(new BorderLayout(0, 3)); - private final LogPanelPreferenceModel uncommitedPreferenceModel = + private final LogPanelPreferenceModel uncommittedPreferenceModel = new LogPanelPreferenceModel(); private ActionListener okCancelListener; private Component currentlyDisplayedPanel = null; + private JTextField loggerPrecision = new JTextField(); public LogPanelPreferencePanel(LogPanelPreferenceModel model) { this.committedPreferenceModel = model; @@ -158,7 +160,8 @@ okButton.addActionListener( new ActionListener() { public void actionPerformed(ActionEvent e) { - committedPreferenceModel.apply(uncommitedPreferenceModel); + uncommittedPreferenceModel.setLoggerPrecision(loggerPrecision.getText()); + committedPreferenceModel.apply(uncommittedPreferenceModel); hidePanel(); } }); @@ -236,7 +239,7 @@ * */ public void updateModel() { - this.uncommitedPreferenceModel.apply(committedPreferenceModel); + this.uncommittedPreferenceModel.apply(committedPreferenceModel); } private TreeModel createTreeModel() { @@ -260,7 +263,7 @@ * @return */ private LogPanelPreferenceModel getModel() { - return uncommitedPreferenceModel; + return uncommittedPreferenceModel; } public static void main(String[] args) { @@ -393,6 +396,23 @@ levelFormatPanel.add(rdLevelText); add(levelFormatPanel); + + JPanel loggerFormatPanel = new JPanel(); + loggerFormatPanel.setLayout( + new BoxLayout(loggerFormatPanel, BoxLayout.Y_AXIS)); + loggerFormatPanel.setBorder( + BorderFactory.createTitledBorder( + BorderFactory.createEtchedBorder(), "Logger")); + + final JLabel precisionLabel = new JLabel("Precision (package depth displayed)"); + final JLabel precisionLabel2 = new JLabel("leave blank to display full logger)"); + + loggerFormatPanel.add(precisionLabel); + loggerFormatPanel.add(precisionLabel2); + loggerFormatPanel.add(loggerPrecision); + + add(loggerFormatPanel); + add(Box.createVerticalGlue()); } 1.22 +14 -0 jakarta-log4j/src/java/org/apache/log4j/chainsaw/LogPanel.java Index: LogPanel.java =================================================================== RCS file: /home/cvs/jakarta-log4j/src/java/org/apache/log4j/chainsaw/LogPanel.java,v retrieving revision 1.21 retrieving revision 1.22 diff -u -r1.21 -r1.22 --- LogPanel.java 9 Oct 2003 22:08:02 -0000 1.21 +++ LogPanel.java 29 Oct 2003 08:50:37 -0000 1.22 @@ -464,6 +464,20 @@ } }; + PropertyChangeListener loggerPrecisionChangeListener = + new PropertyChangeListener() { + public void propertyChange(PropertyChangeEvent evt) { + LogPanelPreferenceModel model = + (LogPanelPreferenceModel) evt.getSource(); + + renderer.setLoggerPrecision(model.getLoggerPrecision()); + + table.tableChanged(new TableModelEvent(getModel())); + } + }; + preferenceModel.addPropertyChangeListener( + "loggerPrecision", loggerPrecisionChangeListener); + preferenceModel.addPropertyChangeListener( "dateFormatPattern", datePrefsChangeListener); preferenceModel.addPropertyChangeListener( 1.8 +34 -0 jakarta-log4j/src/java/org/apache/log4j/chainsaw/TableColorizingRenderer.java Index: TableColorizingRenderer.java =================================================================== RCS file: /home/cvs/jakarta-log4j/src/java/org/apache/log4j/chainsaw/TableColorizingRenderer.java,v retrieving revision 1.7 retrieving revision 1.8 diff -u -r1.7 -r1.8 --- TableColorizingRenderer.java 2 Oct 2003 08:29:24 -0000 1.7 +++ TableColorizingRenderer.java 29 Oct 2003 08:50:37 -0000 1.8 @@ -101,6 +101,7 @@ // private String levelDisplay = ChainsawConstants.LEVEL_DISPLAY_ICONS; private boolean levelUseIcons = true; private DateFormat dateFormatInUse = DATE_FORMATTER; + private String loggerPrecision = ""; /** * Creates a new TableColorizingRenderer object. @@ -157,6 +158,31 @@ break; + case ChainsawColumns.INDEX_LOGGER_COL_NAME: + if (loggerPrecision.equals("")) { + break; + } else { + String logger = value.toString(); + int precision = 0; + try { + precision = Integer.parseInt(loggerPrecision); + } catch (NumberFormatException nfe){} + if (precision < 1) { + break; + } + int startPos = logger.length(); + for (int i=0;i<precision;i++) { + startPos = logger.lastIndexOf(".", startPos - 1); + } + if (startPos < 0) { + break; + } else { + ((JLabel)c).setText(logger.substring(startPos + 1)); + } + } + + break; + case ChainsawColumns.INDEX_LEVEL_COL_NAME: Icon icon = (Icon) iconMap.get(value.toString()); @@ -235,6 +261,14 @@ */ void setDateFormatter(DateFormat formatter) { this.dateFormatInUse = formatter; + } + + /** + * Changes the Logger precision. + * @param precision + */ + void setLoggerPrecision(String loggerPrecision) { + this.loggerPrecision = loggerPrecision; } /** 1.6 +20 -0 jakarta-log4j/src/java/org/apache/log4j/chainsaw/LogPanelPreferenceModel.java Index: LogPanelPreferenceModel.java =================================================================== RCS file: /home/cvs/jakarta-log4j/src/java/org/apache/log4j/chainsaw/LogPanelPreferenceModel.java,v retrieving revision 1.5 retrieving revision 1.6 diff -u -r1.5 -r1.6 --- LogPanelPreferenceModel.java 9 Oct 2003 04:05:51 -0000 1.5 +++ LogPanelPreferenceModel.java 29 Oct 2003 08:50:37 -0000 1.6 @@ -100,6 +100,7 @@ private boolean toolTips = false; private boolean scrollToBottom = true; private boolean logTreePanelVisible = true; + private String loggerPrecision = ""; /** * Returns the Date Pattern string for the alternate date formatter. @@ -160,6 +161,7 @@ * all the properties from */ public void apply(LogPanelPreferenceModel that) { + setLoggerPrecision(that.getLoggerPrecision()); setDateFormatPattern(that.getDateFormatPattern()); setLevelIcons(that.isLevelIcons()); @@ -215,6 +217,24 @@ boolean oldVal = this.levelIcons; this.levelIcons = levelIcons; propertySupport.firePropertyChange("levelIcons", oldVal, this.levelIcons); + } + + /** + * @param loggerPrecision - an integer representing the number of packages to display, + * or an empty string representing 'display all packages' + */ + public void setLoggerPrecision(String loggerPrecision) { + String oldVal = this.loggerPrecision; + this.loggerPrecision = loggerPrecision; + propertySupport.firePropertyChange("loggerPrecision", oldVal, this.loggerPrecision); + } + + /** + * Returns the Logger precision. + * @return + */ + public final String getLoggerPrecision() { + return loggerPrecision; } /** 1.9 +1 -1 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.8 retrieving revision 1.9 diff -u -r1.8 -r1.9 --- LoggingEventFieldResolver.java 27 Oct 2003 08:35:31 -0000 1.8 +++ LoggingEventFieldResolver.java 29 Oct 2003 08:50:37 -0000 1.9 @@ -138,7 +138,7 @@ } public boolean isField(String fieldName) { - return keywordList.contains(fieldName); + return ((fieldName != null) && (keywordList.contains(fieldName.toUpperCase()))); } public Object getValue(String fieldName, LoggingEvent event) { 1.4 +2 -2 jakarta-log4j/src/java/org/apache/log4j/chainsaw/ChainsawConstants.java Index: ChainsawConstants.java =================================================================== RCS file: /home/cvs/jakarta-log4j/src/java/org/apache/log4j/chainsaw/ChainsawConstants.java,v retrieving revision 1.3 retrieving revision 1.4 diff -u -r1.3 -r1.4 --- ChainsawConstants.java 4 Sep 2003 05:42:35 -0000 1.3 +++ ChainsawConstants.java 29 Oct 2003 08:50:37 -0000 1.4 @@ -46,8 +46,8 @@ public static final String DETAIL_CONTENT_TYPE = "text/html"; static final String EVENT_TYPE_KEY = "log4j.eventtype"; - static final String LOG4J_EVENT_TYPE = "log4j"; - static final String UTIL_LOGGING_EVENT_TYPE = "util-logging"; + public static final String LOG4J_EVENT_TYPE = "log4j"; + public static final String UTIL_LOGGING_EVENT_TYPE = "util-logging"; static final String LEVEL_DISPLAY = "level.display"; static final String LEVEL_DISPLAY_ICONS = "icons";
--------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]