1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 package org.apache.log4j.chainsaw.receivers;
19
20 import org.apache.log4j.LogManager;
21 import org.apache.log4j.Logger;
22 import org.apache.log4j.plugins.Plugin;
23 import org.apache.log4j.plugins.PluginEvent;
24 import org.apache.log4j.plugins.PluginListener;
25 import org.apache.log4j.plugins.Receiver;
26 import org.apache.log4j.spi.LoggerRepository;
27 import org.apache.log4j.spi.LoggerRepositoryEx;
28
29 import javax.swing.tree.DefaultMutableTreeNode;
30 import javax.swing.tree.DefaultTreeModel;
31 import javax.swing.tree.TreeNode;
32 import java.beans.PropertyChangeListener;
33 import java.util.Collection;
34 import java.util.Enumeration;
35 import java.util.Vector;
36
37
38
39
40
41
42
43
44 public class ReceiversTreeModel extends DefaultTreeModel
45 implements PluginListener {
46 private static final String ROOTNODE_LABEL = "Receivers";
47 final DefaultMutableTreeNode NoReceiversNode =
48 new DefaultMutableTreeNode("No Receivers defined");
49 final DefaultMutableTreeNode RootNode;
50 private final Logger logger = LogManager.getLogger(ReceiversTreeModel.class);
51
52 ReceiversTreeModel() {
53 super(new DefaultMutableTreeNode(ROOTNODE_LABEL));
54 RootNode = (DefaultMutableTreeNode) getRoot();
55 refresh();
56 }
57
58
59
60
61
62
63
64 public final synchronized ReceiversTreeModel refresh() {
65 RootNode.removeAllChildren();
66
67 LoggerRepository repo = LogManager.getLoggerRepository();
68 Collection receivers;
69 if (repo instanceof LoggerRepositoryEx) {
70 receivers = ((LoggerRepositoryEx) repo).getPluginRegistry().getPlugins(Receiver.class);
71 } else {
72 receivers = new Vector();
73 }
74
75 updateRootDisplay();
76
77 if (receivers.size() == 0) {
78 getRootNode().add(NoReceiversNode);
79 } else {
80 for (Object receiver : receivers) {
81 final Receiver item = (Receiver) receiver;
82 final DefaultMutableTreeNode receiverNode = new DefaultMutableTreeNode(item);
83
84 item.addPropertyChangeListener(creatPluginPropertyChangeListener(item, receiverNode));
85 getRootNode().add(receiverNode);
86 }
87 }
88
89 reload();
90
91 return this;
92 }
93
94 private PropertyChangeListener creatPluginPropertyChangeListener(final Receiver item, final DefaultMutableTreeNode receiverNode) {
95 return evt -> {
96 logger.debug(evt.toString());
97 ReceiversTreeModel.this.fireTreeNodesChanged(item, receiverNode.getPath(), null, null);
98
99 };
100 }
101
102
103
104
105
106 void updateRootDisplay() {
107 getRootNode().setUserObject(ROOTNODE_LABEL);
108 nodeChanged(getRootNode());
109 }
110
111 DefaultMutableTreeNode getRootNode() {
112 return (DefaultMutableTreeNode) getRoot();
113 }
114
115
116
117
118 public void pluginStarted(PluginEvent e) {
119 if (e.getPlugin() instanceof Receiver) {
120 if (NoReceiversNode.getParent() == getRootNode()) {
121 int index = getRootNode().getIndex(NoReceiversNode);
122 getRootNode().remove(NoReceiversNode);
123 nodesWereRemoved(
124 getRootNode(), new int[]{index}, new Object[]{NoReceiversNode});
125 }
126
127 Receiver receiver = (Receiver) e.getPlugin();
128 DefaultMutableTreeNode newNode = new DefaultMutableTreeNode(receiver);
129 getRootNode().add(newNode);
130 receiver.addPropertyChangeListener(creatPluginPropertyChangeListener(receiver, newNode));
131 nodesWereInserted(
132 getRootNode(), new int[]{getRootNode().getIndex(newNode)});
133 }
134 }
135
136 TreeNode resolvePluginNode(Plugin p) {
137
138
139
140
141
142
143
144
145 TreeNode treeNode = null;
146 Enumeration e = getRootNode().breadthFirstEnumeration();
147 while (e.hasMoreElements()) {
148 DefaultMutableTreeNode node = (DefaultMutableTreeNode) e.nextElement();
149 if (node.getUserObject().equals(p)) {
150 treeNode = node;
151 break;
152 }
153 }
154 return treeNode;
155 }
156
157
158
159
160 public void pluginStopped(PluginEvent e) {
161 if (e.getPlugin() instanceof Receiver) {
162 Receiver receiver = (Receiver) e.getPlugin();
163 DefaultMutableTreeNode node =
164 (DefaultMutableTreeNode) resolvePluginNode(receiver);
165 if (node != null) {
166 int index = getRootNode().getIndex(node);
167 getRootNode().remove(node);
168 nodesWereRemoved(
169 getRootNode(), new int[]{index}, new Object[]{node});
170 }
171
172 if (getRootNode().getChildCount() == 0) {
173 getRootNode().add(NoReceiversNode);
174
175 int index = getRootNode().getIndex(NoReceiversNode);
176 nodesWereInserted(getRootNode(), new int[]{index});
177 }
178 }
179 }
180 }