psmith 2003/09/14 16:47:27 Modified: src/java/org/apache/log4j/chainsaw LogUI.java ChainsawAppenderHandler.java ChainsawStatusBar.java Log: For a bit of fun, I added a Data Rate concept to the object that receives and processes events inside Chainsaw, and displayed it in the Status bar. Revision Changes Path 1.27 +9 -0 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.26 retrieving revision 1.27 diff -u -r1.26 -r1.27 --- LogUI.java 11 Sep 2003 09:42:31 -0000 1.26 +++ LogUI.java 14 Sep 2003 23:47:26 -0000 1.27 @@ -553,6 +553,15 @@ }); pack(); + + this.handler.addPropertyChangeListener("dataRate", new PropertyChangeListener(){ + + public void propertyChange(PropertyChangeEvent evt) { + double dataRate = ((Double)evt.getNewValue()).doubleValue(); + LogLog.debug("dataRate=" + dataRate); + statusBar.setDataRate(dataRate); + + }}); getSettingsManager().addSettingsListener(this); getSettingsManager().addSettingsListener(getToolBarAndMenus()); 1.6 +121 -39 jakarta-log4j/src/java/org/apache/log4j/chainsaw/ChainsawAppenderHandler.java Index: ChainsawAppenderHandler.java =================================================================== RCS file: /home/cvs/jakarta-log4j/src/java/org/apache/log4j/chainsaw/ChainsawAppenderHandler.java,v retrieving revision 1.5 retrieving revision 1.6 diff -u -r1.5 -r1.6 --- ChainsawAppenderHandler.java 4 Sep 2003 02:27:15 -0000 1.5 +++ ChainsawAppenderHandler.java 14 Sep 2003 23:47:26 -0000 1.6 @@ -57,6 +57,9 @@ import org.apache.log4j.spi.LocationInfo; import org.apache.log4j.spi.LoggingEvent; +import java.beans.PropertyChangeListener; +import java.beans.PropertyChangeSupport; + import java.util.ArrayList; import java.util.Collection; import java.util.Date; @@ -85,6 +88,9 @@ private final Object mutex = new Object(); private int sleepInterval = 1000; private EventListenerList listenerList = new EventListenerList(); + private double dataRate = 0.0; + private PropertyChangeSupport propertySupport = + new PropertyChangeSupport(this); public ChainsawAppenderHandler(ChainsawAppender appender) { this.appender = appender; @@ -133,7 +139,7 @@ * Converts a LoggingEvent into a Vector of element (columns really). * @param event * @return - * + * * @deprecated */ public static Vector convert(LoggingEvent event) { @@ -234,7 +240,7 @@ * @param v * @return */ - private static String getTabIdentifier(LoggingEvent e) { + private static String getTabIdentifier(LoggingEvent e) { StringBuffer ident = new StringBuffer(); String machinename = e.getProperty(ChainsawConstants.LOG4J_MACHINE_KEY); @@ -243,7 +249,7 @@ } String appname = e.getProperty(ChainsawConstants.LOG4J_APP_KEY); - + if (appname != null) { ident.append("-"); ident.append(appname); @@ -253,16 +259,19 @@ /** * Maybe there's a Remote Host entry? */ - String remoteHost = e.getProperty(ChainsawConstants.LOG4J_REMOTEHOST_KEY); - if(remoteHost!=null) { - int colonIndex = remoteHost.indexOf(":"); - - if (colonIndex == -1) { - colonIndex = remoteHost.length(); - } - - remoteHost = remoteHost.substring(0, colonIndex); - } + String remoteHost = + e.getProperty(ChainsawConstants.LOG4J_REMOTEHOST_KEY); + + if (remoteHost != null) { + int colonIndex = remoteHost.indexOf(":"); + + if (colonIndex == -1) { + colonIndex = remoteHost.length(); + } + + remoteHost = remoteHost.substring(0, colonIndex); + } + if (remoteHost != null) { ident.append(remoteHost); } @@ -276,6 +285,91 @@ } /** + * A little test bed + * @param args + */ + public static void main(String[] args) throws InterruptedException { + ChainsawAppenderHandler handler = new ChainsawAppenderHandler(); + handler.addEventBatchListener( + new EventBatchListener() { + public String getInterestedIdentifier() { + return null; + } + + public void receiveEventBatch( + String identifier, List eventBatchEntrys) { + LogLog.debug( + "received batch for '" + identifier + "', list.size()=" + + eventBatchEntrys.size()); + LogLog.debug(eventBatchEntrys.toString()); + } + }); + LogManager.getRootLogger().addAppender(handler); + + SocketReceiver receiver = new SocketReceiver(4445); + PluginRegistry.startPlugin(receiver); + + Thread.sleep(60000); + } + + /** + * Exposes the current Data rate calculated. This is periodically updated + * by an internal Thread as is the number of events that have + * been processed, and dispatched to all listeners since the last sample period + * divided by the number of seconds since the last sample period. + * + * This method fires a PropertyChange event so listeners can monitor the rate + * @return double # of events processed per second + */ + public double getDataRate() { + return dataRate; + } + + /** + * @param dataRate + */ + private void setDataRate(double dataRate) { + double oldValue = this.dataRate; + this.dataRate = dataRate; + propertySupport.firePropertyChange( + "dataRate", new Double(oldValue), new Double(this.dataRate)); + } + + /** + * @param listener + */ + public synchronized void addPropertyChangeListener( + PropertyChangeListener listener) { + propertySupport.addPropertyChangeListener(listener); + } + + /** + * @param propertyName + * @param listener + */ + public synchronized void addPropertyChangeListener( + String propertyName, PropertyChangeListener listener) { + propertySupport.addPropertyChangeListener(propertyName, listener); + } + + /** + * @param listener + */ + public synchronized void removePropertyChangeListener( + PropertyChangeListener listener) { + propertySupport.removePropertyChangeListener(listener); + } + + /** + * @param propertyName + * @param listener + */ + public synchronized void removePropertyChangeListener( + String propertyName, PropertyChangeListener listener) { + propertySupport.removePropertyChangeListener(propertyName, listener); + } + + /** * Queue of Events are placed in here, which are picked up by an * asychronous thread. The WorkerThread looks for events once a second and * processes all events accumulated during that time.. @@ -314,6 +408,8 @@ List innerList = new ArrayList(); while (isAlive()) { + long timeStart = System.currentTimeMillis(); + synchronized (mutex) { if (stopped) { return; @@ -325,6 +421,8 @@ } } + int size = innerList.size(); + if (innerList.size() > 0) { Iterator iter = innerList.iterator(); Map identifiersEventsMap = new HashMap(); @@ -348,10 +446,20 @@ innerList.clear(); } + + try { Thread.sleep(getQueueInterval()); } catch (InterruptedException ie) { } + if (size == 0) { + setDataRate(0.0); + } else { + long timeEnd = System.currentTimeMillis(); + long diffInSeconds = (timeEnd - timeStart)/1000; + double rate = (((double) size) / diffInSeconds); + setDataRate(rate); + } } } @@ -389,30 +497,4 @@ } } } - - /** - * A little test bed - * @param args - */ - public static void main(String[] args) throws InterruptedException { - - ChainsawAppenderHandler handler = new ChainsawAppenderHandler(); - handler.addEventBatchListener(new EventBatchListener() { - - public String getInterestedIdentifier() { - return null; - } - - public void receiveEventBatch(String identifier, List eventBatchEntrys) { - LogLog.debug("received batch for '" + identifier + "', list.size()=" + eventBatchEntrys.size()); - LogLog.debug(eventBatchEntrys.toString()); - - }}); - LogManager.getRootLogger().addAppender(handler); - - SocketReceiver receiver = new SocketReceiver(4445); - PluginRegistry.startPlugin(receiver); - - Thread.sleep(60000); -} } 1.2 +24 -9 jakarta-log4j/src/java/org/apache/log4j/chainsaw/ChainsawStatusBar.java Index: ChainsawStatusBar.java =================================================================== RCS file: /home/cvs/jakarta-log4j/src/java/org/apache/log4j/chainsaw/ChainsawStatusBar.java,v retrieving revision 1.1 retrieving revision 1.2 diff -u -r1.1 -r1.2 --- ChainsawStatusBar.java 25 Jun 2003 04:05:21 -0000 1.1 +++ ChainsawStatusBar.java 14 Sep 2003 23:47:26 -0000 1.2 @@ -56,6 +56,7 @@ import java.awt.GridBagConstraints; import java.awt.GridBagLayout; import java.awt.Insets; +import java.text.NumberFormat; import javax.swing.BorderFactory; import javax.swing.Icon; @@ -78,7 +79,7 @@ private final JLabel statusMsg = new JLabel(DEFAULT_MSG); private final JLabel pausedLabel = new JLabel("", JLabel.CENTER); private final JLabel lineSelectionLabel = new JLabel("", JLabel.CENTER); - private final JLabel receivedEventLabel = new JLabel("", JLabel.CENTER); + private final JLabel receivedEventLabel = new JLabel("0.0", JLabel.CENTER); private final JLabel receivedConnectionlabel = new JLabel("", JLabel.CENTER); private volatile long lastReceivedEvent = System.currentTimeMillis(); private volatile long lastReceivedConnection = System.currentTimeMillis(); @@ -86,8 +87,10 @@ private final Thread connectionThread; private final Icon radioTowerIcon = new ImageIcon(ChainsawIcons.ANIM_RADIO_TOWER); - private final Icon netConnectIcon = new ImageIcon(ChainsawIcons.ANIM_NET_CONNECT); - + private final Icon netConnectIcon = + new ImageIcon(ChainsawIcons.ANIM_NET_CONNECT); + + private final NumberFormat nf = NumberFormat.getNumberInstance(); // private final Border statusBarComponentBorder = // BorderFactory.createEmptyBorder(); @@ -99,6 +102,9 @@ ChainsawStatusBar() { setLayout(new GridBagLayout()); + nf.setMaximumFractionDigits(1); + nf.setMinimumFractionDigits(1); + nf.setGroupingUsed(false); JPanel statusMsgPanel = new JPanel(new FlowLayout(FlowLayout.LEFT, 2, 2)); statusMsgPanel.add(statusMsg); @@ -115,11 +121,13 @@ receivedEventLabel.setBorder(statusBarComponentBorder); receivedEventLabel.setToolTipText( - "Indicates whether Chainsaw is receiving events"); + "Indicates whether Chainsaw is receiving events, and how fast it is processing them"); receivedEventLabel.setPreferredSize( new Dimension( - radioTowerIcon.getIconWidth() + 4, + radioTowerIcon.getIconWidth() + receivedEventLabel.getFontMetrics(receivedEventLabel.getFont()).stringWidth( + "9999.9") + 10, (int) receivedEventLabel.getPreferredSize().getHeight())); + receivedEventLabel.setMinimumSize(receivedEventLabel.getPreferredSize()); receivedConnectionlabel.setBorder(statusBarComponentBorder); receivedConnectionlabel.setToolTipText( @@ -129,7 +137,6 @@ netConnectIcon.getIconWidth() + 4, (int) receivedConnectionlabel.getPreferredSize().getHeight())); - lineSelectionLabel.setBorder(statusBarComponentBorder); lineSelectionLabel.setPreferredSize( new Dimension( @@ -204,7 +211,7 @@ } }); receiveThread.start(); - + connectionThread = new Thread( new Runnable() { @@ -248,6 +255,14 @@ receiveThread.interrupt(); } + void setDataRate(final double dataRate) { + SwingUtilities.invokeLater(new Runnable(){ + + public void run() { + receivedEventLabel.setText(nf.format(dataRate) + "/s"); + }}); + } + /** * Indicates a new connection has been established between * Chainsaw and some remote host @@ -257,7 +272,7 @@ lastReceivedConnection = System.currentTimeMillis(); setMessage("Connection received from " + source); connectionThread.interrupt(); - + // TODO and maybe play a sound? } @@ -309,7 +324,7 @@ SwingUtilities.invokeLater( new Runnable() { public void run() { - statusMsg.setText(" " +msg); + statusMsg.setText(" " + msg); } }); }
--------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]