psmith 2003/09/04 20:39:43 Modified: src/java/org/apache/log4j/chainsaw LogUI.java ChainsawCyclicBufferTableModel.java EventContainer.java Log: Added NewKeyListener support to the model and the GUI. Now when a new MDC key arrives via a LoggingEvent into the table model, a listener ensures that a new Column is automatically added to the visible Table to ensure it is displayed correctly. Revision Changes Path 1.21 +26 -9 jakarta-log4j/src/java/org/apache/log4j/chainsaw/LogUI.java Index: LogUI.java =================================================================== RCS file: /home/cvs/jakarta-log4j/src/java/org/apache/log4j/chainsaw/LogUI.java,v retrieving revision 1.20 retrieving revision 1.21 diff -u -r1.20 -r1.21 --- LogUI.java 4 Sep 2003 23:45:38 -0000 1.20 +++ LogUI.java 5 Sep 2003 03:39:43 -0000 1.21 @@ -772,10 +772,9 @@ } void removeWelcomePanel() { - if(tabbedPane.containsWelcomePanel()) { - tabbedPane.remove( - tabbedPane.getComponentAt(tabbedPane.indexOfTab("Welcome"))); - + if (tabbedPane.containsWelcomePanel()) { + tabbedPane.remove( + tabbedPane.getComponentAt(tabbedPane.indexOfTab("Welcome"))); } } @@ -1148,6 +1147,8 @@ ((ChainsawEventBatchEntry) eventBatchEntrys.get(0)).getEventType(); final LogPanel thisPanel = new LogPanel(ident, eventType); + sm.configure(thisPanel); + /** * Let the new LogPanel receive this batch */ @@ -1166,8 +1167,6 @@ } }); - sm.configure(thisPanel); - String msg = "added tab " + ident; LogLog.debug(msg); statusBar.setMessage(msg); @@ -1261,6 +1260,16 @@ table.setAutoCreateColumnsFromModel(false); + /** + * We listen for new Key's coming in so we can get them automatically added as columns + */ + tableModel.addNewKeyListener( + new NewKeyListener() { + public void newKeyAdded(NewKeyEvent e) { + table.addColumn(new TableColumn(e.getNewModelIndex())); + } + }); + table.setRowHeight(20); table.setShowGrid(false); @@ -2231,9 +2240,16 @@ while (e.hasMoreElements()) { TableColumn c = (TableColumn) e.nextElement(); - o.writeObject( - new TableColumnData( - (String) c.getHeaderValue(), c.getModelIndex(), c.getWidth())); + + if (c.getModelIndex() < ChainsawColumns.getColumnsNames().size()) { + o.writeObject( + new TableColumnData( + (String) c.getHeaderValue(), c.getModelIndex(), c.getWidth())); + } else { + LogLog.debug( + "Not saving col ' " + c.getHeaderValue() + + "' not part of standard columns"); + } } o.flush(); @@ -2742,6 +2758,7 @@ } public void columnAdded(TableColumnModelEvent e) { + LogLog.debug("Detected columnAdded" + e); } public void columnRemoved(TableColumnModelEvent e) { 1.4 +76 -16 jakarta-log4j/src/java/org/apache/log4j/chainsaw/ChainsawCyclicBufferTableModel.java Index: ChainsawCyclicBufferTableModel.java =================================================================== RCS file: /home/cvs/jakarta-log4j/src/java/org/apache/log4j/chainsaw/ChainsawCyclicBufferTableModel.java,v retrieving revision 1.3 retrieving revision 1.4 diff -u -r1.3 -r1.4 --- ChainsawCyclicBufferTableModel.java 3 Sep 2003 05:44:51 -0000 1.3 +++ ChainsawCyclicBufferTableModel.java 5 Sep 2003 03:39:43 -0000 1.4 @@ -49,21 +49,24 @@ package org.apache.log4j.chainsaw; -import org.apache.log4j.helpers.LogLog; -import org.apache.log4j.spi.LocationInfo; -import org.apache.log4j.spi.LoggingEvent; - import java.util.ArrayList; import java.util.Collection; import java.util.Collections; import java.util.Date; +import java.util.HashSet; import java.util.Iterator; import java.util.List; +import java.util.Set; import java.util.Vector; import javax.swing.SwingUtilities; +import javax.swing.event.EventListenerList; import javax.swing.table.AbstractTableModel; +import org.apache.log4j.helpers.LogLog; +import org.apache.log4j.spi.LocationInfo; +import org.apache.log4j.spi.LoggingEvent; + /** * A CyclicBuffer implementation of the EventContainer. @@ -84,9 +87,12 @@ private final int INITIAL_CAPACITY = 1024; final List unfilteredList; final List filteredList; - private Vector countListeners = new Vector(); + + // private Vector countListeners = new Vector(); private boolean currentSortAscending; private int currentSortColumn; + private EventListenerList eventListenerList = new EventListenerList(); + private List columnNames = new ArrayList(ChainsawColumns.getColumnsNames()); /** * @deprecated should use new filtering stuff @@ -102,6 +108,7 @@ //because we may be using a cyclic buffer, if an ID is not provided in the property, //use and increment this row counter as the ID for each received row int uniqueRow; + private Set uniqueMDCKeys = new HashSet(); public ChainsawCyclicBufferTableModel(boolean isCyclic, int bufferSize) { this.cyclic = isCyclic; @@ -166,7 +173,7 @@ } public void addEventCountListener(EventCountListener listener) { - countListeners.add(listener); + eventListenerList.add(EventCountListener.class, listener); } public void filterChanged() { @@ -178,8 +185,12 @@ } public void notifyCountListeners() { - for (int i = 0; i < countListeners.size(); i++) { - ((EventCountListener) countListeners.get(i)).eventCountChanged( + EventCountListener[] listeners = + (EventCountListener[]) eventListenerList.getListeners( + EventCountListener.class); + + for (int i = 0; i < listeners.length; i++) { + listeners[i].eventCountChanged( filteredList.size(), unfilteredList.size()); } } @@ -409,11 +420,11 @@ } public int getColumnCount() { - return ChainsawColumns.getColumnsNames().size(); + return columnNames.size(); } public String getColumnName(int column) { - return ChainsawColumns.getColumnsNames().get(column).toString(); + return columnNames.get(column).toString(); } public LoggingEvent getRow(int row) { @@ -443,6 +454,7 @@ if (id != null) { return id; } + return new Integer(rowIndex); case ChainsawColumns.INDEX_LEVEL_COL_NAME: @@ -485,8 +497,11 @@ return (info != null) ? info.getMethodName() : ""; default: - return ""; + if(columnIndex<=columnNames.size()){ + return event.getMDC(columnNames.get(columnIndex).toString()); + } } + return ""; } public boolean isAddRow(LoggingEvent e, boolean valueIsAdjusting) { @@ -524,10 +539,28 @@ int newRow = filteredList.size() - 1; - if (!isCyclic()) { + /** + * Is this a new MDC key we haven't seen before? + */ + boolean newColumn = uniqueMDCKeys.addAll(e.getMDCKeySet()); + + /** + * If so, we should add them as columns and notify listeners. + */ + for (Iterator iter = e.getMDCKeySet().iterator(); iter.hasNext();) { + Object key = (Object) iter.next(); + + if (!columnNames.contains(key)) { + columnNames.add(key); + LogLog.debug("Adding col '" + key + "', columNames=" + columnNames); + fireNewKeyColumnAdded(new NewKeyEvent(this, columnNames.indexOf(key), key, e.getMDC(key.toString()))); + } + } + + if (!isCyclic() && !newColumn) { fireTableRowsInserted(newRow, newRow); } else { - if ( + if (newColumn || unfilteredList.size() == ((CyclicBufferList) unfilteredList) .getMaxSize()) { fireTableDataChanged(); @@ -540,9 +573,22 @@ } /** - * Returns true if this model is Cyclic (bounded) or not - * @return true/false - */ + * @param key + */ + private void fireNewKeyColumnAdded(NewKeyEvent e) { + NewKeyListener[] listeners = + (NewKeyListener[]) eventListenerList.getListeners(NewKeyListener.class); + + for (int i = 0; i < listeners.length; i++) { + NewKeyListener listener = listeners[i]; + listener.newKeyAdded(e); + } + } + + /** + * Returns true if this model is Cyclic (bounded) or not + * @return true/false + */ public boolean isCyclic() { return cyclic; } @@ -557,6 +603,20 @@ } return ((CyclicBufferList) unfilteredList).getMaxSize(); + } + + /* (non-Javadoc) + * @see org.apache.log4j.chainsaw.EventContainer#addNewKeyListener(org.apache.log4j.chainsaw.NewKeyListener) + */ + public void addNewKeyListener(NewKeyListener l) { + eventListenerList.add(NewKeyListener.class, l); + } + + /* (non-Javadoc) + * @see org.apache.log4j.chainsaw.EventContainer#removeNewKeyListener(org.apache.log4j.chainsaw.NewKeyListener) + */ + public void removeNewKeyListener(NewKeyListener l) { + eventListenerList.remove(NewKeyListener.class, l); } class SortExecutor implements Runnable { 1.5 +20 -6 jakarta-log4j/src/java/org/apache/log4j/chainsaw/EventContainer.java Index: EventContainer.java =================================================================== RCS file: /home/cvs/jakarta-log4j/src/java/org/apache/log4j/chainsaw/EventContainer.java,v retrieving revision 1.4 retrieving revision 1.5 diff -u -r1.4 -r1.5 --- EventContainer.java 3 Sep 2003 05:46:25 -0000 1.4 +++ EventContainer.java 5 Sep 2003 03:39:43 -0000 1.5 @@ -49,9 +49,10 @@ package org.apache.log4j.chainsaw; +import org.apache.log4j.spi.LoggingEvent; + import java.util.List; -import org.apache.log4j.spi.LoggingEvent; /** * To allow pluggable TableModel implementations for Chainsaw, this interface has been factored out. @@ -60,15 +61,29 @@ * * @author Paul Smith <[EMAIL PROTECTED]> * @author Scott Deboy <[EMAIL PROTECTED]> - * + * */ -public interface EventContainer extends SortTableModel, FilterChangedListener, LoggerNameModel { +public interface EventContainer extends SortTableModel, FilterChangedListener, + LoggerNameModel { /** * Adds an EventCountListener, to be notified when the # of events changes * @param listener */ void addEventCountListener(EventCountListener listener); + /** + * Adds a NewKeyListener to be notified when unique Key (MDC/Property keys) + * arrive into this EventContainer + * @param l + */ + void addNewKeyListener(NewKeyListener l); + + /** + * Removes a listener from being notified of NewKey events. + * @param l + */ + void removeNewKeyListener(NewKeyListener l); + /** * Clears the model completely * @@ -76,11 +91,11 @@ void clearModel(); /** - * Returns true if this model is Cyclic (bounded) or not. + * Returns true if this model is Cyclic (bounded) or not. * @return true/false */ public boolean isCyclic(); - + /** * Locates a row number, starting from startRow, containing the text * within any column. @@ -129,5 +144,4 @@ * Causes the EventContainer to sort according to it's configured attributes */ void sort(); - }
--------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]