You are viewing a plain text version of this content. The canonical link for it is here.
Posted to log4j-dev@logging.apache.org by ps...@apache.org on 2003/09/18 06:05:05 UTC

cvs commit: jakarta-log4j/src/java/org/apache/log4j/chainsaw ReceiversPanel.java ReceiversTreeModel.java

psmith      2003/09/17 21:05:05

  Modified:    src/java/org/apache/log4j/chainsaw ReceiversPanel.java
                        ReceiversTreeModel.java
  Log:
  The receivers panel now binds the ReceiversTreeModel
  as a PluginListener and it manages it's own state
  with respect to Receivers starting/stopped.  Less coupling,
  changes to the PluginRegistry by external clients
  are now properly reflected when they happen.
  
  Revision  Changes    Path
  1.12      +105 -61   jakarta-log4j/src/java/org/apache/log4j/chainsaw/ReceiversPanel.java
  
  Index: ReceiversPanel.java
  ===================================================================
  RCS file: /home/cvs/jakarta-log4j/src/java/org/apache/log4j/chainsaw/ReceiversPanel.java,v
  retrieving revision 1.11
  retrieving revision 1.12
  diff -u -r1.11 -r1.12
  --- ReceiversPanel.java	9 Sep 2003 02:57:01 -0000	1.11
  +++ ReceiversPanel.java	18 Sep 2003 04:05:05 -0000	1.12
  @@ -49,23 +49,6 @@
   
   package org.apache.log4j.chainsaw;
   
  -import org.apache.log4j.Level;
  -import org.apache.log4j.LogManager;
  -import org.apache.log4j.chainsaw.icons.ChainsawIcons;
  -import org.apache.log4j.chainsaw.icons.LevelIconFactory;
  -import org.apache.log4j.chainsaw.icons.LineIconFactory;
  -import org.apache.log4j.helpers.LogLog;
  -import org.apache.log4j.net.SocketAppender;
  -import org.apache.log4j.net.SocketHubAppender;
  -import org.apache.log4j.net.SocketHubReceiver;
  -import org.apache.log4j.net.SocketNodeEventListener;
  -import org.apache.log4j.net.SocketReceiver;
  -import org.apache.log4j.net.UDPAppender;
  -import org.apache.log4j.net.UDPReceiver;
  -import org.apache.log4j.plugins.Pauseable;
  -import org.apache.log4j.plugins.PluginRegistry;
  -import org.apache.log4j.plugins.Receiver;
  -
   import java.awt.BorderLayout;
   import java.awt.Color;
   import java.awt.Component;
  @@ -77,16 +60,11 @@
   import java.awt.event.ActionEvent;
   import java.awt.event.KeyEvent;
   import java.awt.event.KeyListener;
  -
   import java.beans.PropertyChangeEvent;
   import java.beans.PropertyChangeListener;
  -
   import java.io.IOException;
  -
   import java.lang.reflect.Method;
  -
   import java.net.URL;
  -
   import java.util.ArrayList;
   import java.util.Collection;
   import java.util.Collections;
  @@ -105,7 +83,6 @@
   import javax.swing.ImageIcon;
   import javax.swing.InputVerifier;
   import javax.swing.JButton;
  -import javax.swing.JCheckBoxMenuItem;
   import javax.swing.JComponent;
   import javax.swing.JDialog;
   import javax.swing.JEditorPane;
  @@ -121,13 +98,34 @@
   import javax.swing.JTree;
   import javax.swing.KeyStroke;
   import javax.swing.SwingUtilities;
  -import javax.swing.event.ChangeEvent;
  -import javax.swing.event.ChangeListener;
   import javax.swing.event.HyperlinkEvent;
   import javax.swing.event.HyperlinkListener;
  +import javax.swing.event.TreeExpansionEvent;
  +import javax.swing.event.TreeModelEvent;
  +import javax.swing.event.TreeModelListener;
   import javax.swing.event.TreeSelectionEvent;
   import javax.swing.event.TreeSelectionListener;
  +import javax.swing.event.TreeWillExpandListener;
   import javax.swing.tree.DefaultMutableTreeNode;
  +import javax.swing.tree.ExpandVetoException;
  +import javax.swing.tree.TreePath;
  +
  +import org.apache.log4j.Level;
  +import org.apache.log4j.LogManager;
  +import org.apache.log4j.chainsaw.icons.ChainsawIcons;
  +import org.apache.log4j.chainsaw.icons.LevelIconFactory;
  +import org.apache.log4j.chainsaw.icons.LineIconFactory;
  +import org.apache.log4j.helpers.LogLog;
  +import org.apache.log4j.net.SocketAppender;
  +import org.apache.log4j.net.SocketHubAppender;
  +import org.apache.log4j.net.SocketHubReceiver;
  +import org.apache.log4j.net.SocketNodeEventListener;
  +import org.apache.log4j.net.SocketReceiver;
  +import org.apache.log4j.net.UDPAppender;
  +import org.apache.log4j.net.UDPReceiver;
  +import org.apache.log4j.plugins.Pauseable;
  +import org.apache.log4j.plugins.PluginRegistry;
  +import org.apache.log4j.plugins.Receiver;
   
   
   /**
  @@ -162,7 +160,50 @@
       setMinimumSize(getPreferredSize());
       setMaximumSize(getPreferredSize());
   
  -    receiversTree.setModel(new ReceiversTreeModel());
  +    final ReceiversTreeModel model = new ReceiversTreeModel();
  +    PluginRegistry.addPluginListener(model);
  +    receiversTree.setModel(model);
  +
  +    receiversTree.setExpandsSelectedPaths(true);
  +    model.addTreeModelListener(
  +      new TreeModelListener() {
  +        public void treeNodesChanged(TreeModelEvent e) {
  +          expandRoot();
  +        }
  +
  +        public void treeNodesInserted(TreeModelEvent e) {
  +          expandRoot();
  +        }
  +
  +        public void treeNodesRemoved(TreeModelEvent e) {
  +          expandRoot();
  +        }
  +
  +        public void treeStructureChanged(TreeModelEvent e) {
  +          expandRoot();
  +        }
  +
  +        private void expandRoot() {
  +          receiversTree.expandPath(
  +            new TreePath(model.getPathToRoot(model.RootNode)));
  +        }
  +      });
  +    receiversTree.expandPath(
  +      new TreePath(model.getPathToRoot(model.RootNode)));
  +
  +    receiversTree.addTreeWillExpandListener(
  +      new TreeWillExpandListener() {
  +        public void treeWillCollapse(TreeExpansionEvent event)
  +          throws ExpandVetoException {
  +          if (event.getPath().getLastPathComponent() == model.RootNode) {
  +            throw new ExpandVetoException(event);
  +          }
  +        }
  +
  +        public void treeWillExpand(TreeExpansionEvent event)
  +          throws ExpandVetoException {
  +        }
  +      });
   
       receiversTree.setToolTipText("Allows you to manage Log4j Receivers");
       newReceiverButtonAction =
  @@ -478,8 +519,6 @@
   
               if (receiver != null) {
                 PluginRegistry.stopPlugin(receiver);
  -
  -              updateReceiverTreeInDispatchThread();
               }
             }
           }).start();
  @@ -525,11 +564,14 @@
      *
      */
     public void updateReceiverTreeInDispatchThread() {
  -    if (SwingUtilities.isEventDispatchThread()) {
  -      updateReceiverTree.run();
  -    } else {
  -      SwingUtilities.invokeLater(updateReceiverTree);
  -    }
  +    LogLog.debug(
  +      "updateReceiverTreeInDispatchThread, should not be needed now");
  +	
  +    //    if (SwingUtilities.isEventDispatchThread()) {
  +    //      updateReceiverTree.run();
  +    //    } else {
  +    //      SwingUtilities.invokeLater(updateReceiverTree);
  +    //    }
     }
   
     /**
  @@ -708,37 +750,39 @@
         add(shutdownReceiverButtonAction);
         addSeparator();
         add(editReceiverButtonAction);
  -	addSeparator();
  -	
  -	  final Receiver r = getCurrentlySelectedReceiver();
  -	  add(createLevelRadioButton(r, Level.DEBUG));
  -	  add(createLevelRadioButton(r, Level.INFO));
  -	  add(createLevelRadioButton(r, Level.WARN));
  -	  add(createLevelRadioButton(r, Level.ERROR));
  -	  addSeparator();
  -	  add(createLevelRadioButton(r, Level.OFF));
  -	  add(createLevelRadioButton(r, Level.ALL));
  -	  
  +      addSeparator();
  +
  +      final Receiver r = getCurrentlySelectedReceiver();
  +      add(createLevelRadioButton(r, Level.DEBUG));
  +      add(createLevelRadioButton(r, Level.INFO));
  +      add(createLevelRadioButton(r, Level.WARN));
  +      add(createLevelRadioButton(r, Level.ERROR));
  +      addSeparator();
  +      add(createLevelRadioButton(r, Level.OFF));
  +      add(createLevelRadioButton(r, Level.ALL));
       }
   
  +    private JRadioButtonMenuItem createLevelRadioButton(
  +      final Receiver r, final Level l) {
  +      Map levelIconMap = LevelIconFactory.getInstance().getLevelToIconMap();
  +
  +      Action action =
  +        new AbstractAction(
  +          l.toString(), (Icon) levelIconMap.get(l.toString())) {
  +          public void actionPerformed(ActionEvent e) {
  +            if (r != null) {
  +              r.setThreshold(l);
  +              updateCurrentlySelectedNodeInDispatchThread();
  +            }
  +          }
  +        };
  +
  +      JRadioButtonMenuItem item = new JRadioButtonMenuItem(action);
  +      item.setSelected(r.getThreshold() == l);
  +
  +      return item;
  +    }
   
  -	private JRadioButtonMenuItem createLevelRadioButton(final Receiver r, final Level l) {
  -		Map levelIconMap = LevelIconFactory.getInstance().getLevelToIconMap();
  -
  -		Action action = new AbstractAction(l.toString(),(Icon)levelIconMap.get(l.toString())){
  -
  -				public void actionPerformed(ActionEvent e) {
  -					if(r!=null){
  -						r.setThreshold(l);
  -						updateCurrentlySelectedNodeInDispatchThread();
  -					}
  -				}
  -		};
  -		JRadioButtonMenuItem item = new JRadioButtonMenuItem(action);
  -		item.setSelected(r.getThreshold() == l);
  -		return item;
  -	}
  -	
       /**
        * Builds a relevant set of menus for when the Root node in the Receiver
        * tree has been selected
  
  
  
  1.4       +57 -3     jakarta-log4j/src/java/org/apache/log4j/chainsaw/ReceiversTreeModel.java
  
  Index: ReceiversTreeModel.java
  ===================================================================
  RCS file: /home/cvs/jakarta-log4j/src/java/org/apache/log4j/chainsaw/ReceiversTreeModel.java,v
  retrieving revision 1.3
  retrieving revision 1.4
  diff -u -r1.3 -r1.4
  --- ReceiversTreeModel.java	5 Sep 2003 06:11:11 -0000	1.3
  +++ ReceiversTreeModel.java	18 Sep 2003 04:05:05 -0000	1.4
  @@ -50,13 +50,19 @@
   package org.apache.log4j.chainsaw;
   
   import java.util.Collection;
  +import java.util.HashMap;
   import java.util.Iterator;
  +import java.util.Map;
   
   import javax.swing.tree.DefaultMutableTreeNode;
   import javax.swing.tree.DefaultTreeModel;
  +import javax.swing.tree.TreeNode;
   
   import org.apache.log4j.LogManager;
   import org.apache.log4j.net.SocketReceiver;
  +import org.apache.log4j.plugins.Plugin;
  +import org.apache.log4j.plugins.PluginEvent;
  +import org.apache.log4j.plugins.PluginListener;
   import org.apache.log4j.plugins.PluginRegistry;
   import org.apache.log4j.plugins.Receiver;
   
  @@ -67,11 +73,13 @@
    *
    * @author Paul Smith <ps...@apache.org>
    */
  -public class ReceiversTreeModel extends DefaultTreeModel {
  +public class ReceiversTreeModel extends DefaultTreeModel
  +  implements PluginListener {
     private static final String ROOTNODE_LABEL = "Receivers";
     final DefaultMutableTreeNode NoReceiversNode =
       new DefaultMutableTreeNode("You have no Receivers defined");
     final DefaultMutableTreeNode RootNode;
  +  private Map pluginNodeMap = new HashMap();
   
     ReceiversTreeModel() {
       super(new DefaultMutableTreeNode(ROOTNODE_LABEL));
  @@ -125,12 +133,58 @@
      * and that listeners are notified.
      */
     void updateRootDisplay() {
  -    getRootNode().setUserObject(
  -      ROOTNODE_LABEL );
  +    getRootNode().setUserObject(ROOTNODE_LABEL);
       nodeChanged(getRootNode());
     }
   
     DefaultMutableTreeNode getRootNode() {
       return (DefaultMutableTreeNode) getRoot();
  +  }
  +
  +  /* (non-Javadoc)
  +   * @see org.apache.log4j.plugins.PluginListener#pluginStarted(org.apache.log4j.plugins.PluginEvent)
  +   */
  +  public void pluginStarted(PluginEvent e) {
  +    if (e.getPlugin() instanceof Receiver) {
  +      if (NoReceiversNode.getParent() == getRootNode()) {
  +        int index = getRootNode().getIndex(NoReceiversNode);
  +        getRootNode().remove(NoReceiversNode);
  +        nodesWereRemoved(
  +          getRootNode(), new int[] { index }, new Object[] { NoReceiversNode });
  +      }
  +
  +      Receiver receiver = (Receiver) e.getPlugin();
  +      DefaultMutableTreeNode newNode = new DefaultMutableTreeNode(receiver);
  +      getRootNode().add(newNode);
  +      nodesWereInserted(
  +        getRootNode(), new int[] { getRootNode().getIndex(newNode) });
  +      pluginNodeMap.put(receiver, newNode);
  +    }
  +  }
  +
  +	TreeNode resolvePluginNode(Plugin p){
  +		return (TreeNode) pluginNodeMap.get(p);
  +	}
  +  /* (non-Javadoc)
  +   * @see org.apache.log4j.plugins.PluginListener#pluginStopped(org.apache.log4j.plugins.PluginEvent)
  +   */
  +  public void pluginStopped(PluginEvent e) {
  +    if (e.getPlugin() instanceof Receiver) {
  +      Receiver receiver = (Receiver) e.getPlugin();
  +      DefaultMutableTreeNode node =
  +        (DefaultMutableTreeNode) resolvePluginNode(receiver);
  +      int index = getRootNode().getIndex(node);
  +      getRootNode().remove(node);
  +      nodesWereRemoved(
  +        getRootNode(), new int[] { index }, new Object[] { node });
  +      pluginNodeMap.remove(receiver);
  +
  +      if (getRootNode().getChildCount() == 0) {
  +        getRootNode().add(NoReceiversNode);
  +
  +        index = getRootNode().getIndex(NoReceiversNode);
  +        nodesWereInserted(getRootNode(), new int[] { index });
  +      }
  +    }
     }
   }
  
  
  

---------------------------------------------------------------------
To unsubscribe, e-mail: log4j-dev-unsubscribe@jakarta.apache.org
For additional commands, e-mail: log4j-dev-help@jakarta.apache.org