1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20 package org.apache.log4j.chainsaw;
21
22 import org.apache.log4j.LogManager;
23 import org.apache.log4j.Logger;
24
25 import javax.swing.*;
26 import javax.swing.tree.DefaultMutableTreeNode;
27 import javax.swing.tree.DefaultTreeModel;
28 import javax.swing.tree.MutableTreeNode;
29 import java.util.*;
30
31
32
33
34
35
36
37 class LogPanelLoggerTreeModel extends DefaultTreeModel
38 implements LoggerNameListener {
39 private Map<String, LogPanelTreeNode> fullPackageMap = new HashMap<>();
40 private final Logger logger = LogManager.getLogger(LogPanelLoggerTreeModel.class);
41
42 LogPanelLoggerTreeModel() {
43 super(new LogPanelTreeNode("Root Logger"));
44 }
45
46
47
48
49 public void loggerNameAdded(final String loggerName) {
50
51 SwingUtilities.invokeLater(
52 () -> addLoggerNameInDispatchThread(loggerName));
53 }
54
55 public void reset() {
56 DefaultMutableTreeNode current = (DefaultMutableTreeNode) getRoot();
57 current.removeAllChildren();
58 fullPackageMap.clear();
59 nodeStructureChanged(current);
60 }
61
62 private void addLoggerNameInDispatchThread(final String loggerName) {
63 String[] packages = tokenize(loggerName);
64
65
66
67
68
69
70 DefaultMutableTreeNode current = (DefaultMutableTreeNode) getRoot();
71
72
73
74
75
76
77
78 outerFor:
79 for (int i = 0; i < packages.length; i++) {
80 String packageName = packages[i];
81 Enumeration enumeration = current.children();
82
83 while (enumeration.hasMoreElements()) {
84 DefaultMutableTreeNode child =
85 (DefaultMutableTreeNode) enumeration.nextElement();
86 String childName = child.getUserObject().toString();
87
88 if (childName.equals(packageName)) {
89
90
91
92 current = child;
93
94
95
96
97
98
99 continue outerFor;
100 }
101 }
102
103
104
105
106
107 final LogPanelTreeNode newChild = new LogPanelTreeNode(packageName);
108
109 StringBuilder fullPackageBuf = new StringBuilder();
110
111 for (int j = 0; j <= i; j++) {
112 fullPackageBuf.append(packages[j]);
113
114 if (j < i) {
115 fullPackageBuf.append(".");
116 }
117 }
118
119 logger.debug("Adding to Map " + fullPackageBuf.toString());
120 fullPackageMap.put(fullPackageBuf.toString(), newChild);
121
122 final DefaultMutableTreeNode changedNode = current;
123
124 changedNode.add(newChild);
125
126 final int[] changedIndices = new int[changedNode.getChildCount()];
127
128 for (int j = 0; j < changedIndices.length; j++) {
129 changedIndices[j] = j;
130 }
131
132 nodesWereInserted(
133 changedNode, new int[]{changedNode.getIndex(newChild)});
134 nodesChanged(changedNode, changedIndices);
135 current = newChild;
136 }
137 }
138
139 LogPanelTreeNode lookupLogger(String newLogger) {
140 if (fullPackageMap.containsKey(newLogger)) {
141 return fullPackageMap.get(newLogger);
142 } else {
143 logger.debug("No logger found matching '" + newLogger + "'");
144 logger.debug("Map Dump: " + fullPackageMap);
145 }
146
147 return null;
148 }
149
150
151
152
153
154
155
156
157
158 private String[] tokenize(String loggerName) {
159 StringTokenizer tok = new StringTokenizer(loggerName, ".");
160
161 String[] tokens = new String[tok.countTokens()];
162
163 int index = 0;
164
165 while (tok.hasMoreTokens()) {
166 tokens[index++] = tok.nextToken();
167 }
168
169 return tokens;
170 }
171
172 private static class LogPanelTreeNode extends DefaultMutableTreeNode {
173 protected static Comparator nodeComparator =
174 (o1, o2) -> o1.toString().compareToIgnoreCase(o2.toString());
175
176 private LogPanelTreeNode(String logName) {
177 super(logName);
178 }
179
180 public void insert(MutableTreeNode newChild, int childIndex) {
181
182
183 super.insert(newChild, childIndex);
184
185
186 this.children.sort(nodeComparator);
187
188
189 }
190 }
191 }