1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 package org.apache.log4j.chainsaw.color;
19
20 import java.awt.Color;
21 import java.beans.PropertyChangeListener;
22 import java.beans.PropertyChangeSupport;
23 import java.util.ArrayList;
24 import java.util.HashMap;
25 import java.util.Iterator;
26 import java.util.List;
27 import java.util.Map;
28
29 import org.apache.log4j.rule.ColorRule;
30 import org.apache.log4j.rule.ExpressionRule;
31 import org.apache.log4j.rule.Rule;
32 import org.apache.log4j.spi.LoggingEvent;
33
34
35 /***
36 * A colorizer supporting an ordered collection of ColorRules, including support for notification of
37 * color rule changes via a propertyChangeListener and the 'colorrule' property.
38 *
39 * @author Scott Deboy <sdeboy@apache.org>
40 */
41 public class RuleColorizer implements Colorizer {
42 private static final String DEFAULT_NAME = "Default";
43 private Map rules;
44 private final PropertyChangeSupport colorChangeSupport =
45 new PropertyChangeSupport(this);
46 private Map defaultRules = new HashMap();
47 private String currentRuleSet = DEFAULT_NAME;
48 private Rule findRule;
49 private Rule loggerRule;
50 private final Color FIND_FOREGROUND = Color.white;
51 private final Color FIND_BACKGROUND = Color.black;
52 private final Color LOGGER_FOREGROUND = Color.white;
53 private final Color LOGGER_BACKGROUND = Color.black;
54
55 public RuleColorizer() {
56 List rulesList = new ArrayList();
57
58 String expression = "level == FATAL || level == ERROR";
59 rulesList.add(
60 new ColorRule(
61 expression, ExpressionRule.getRule(expression), new Color(147, 22, 0),
62 Color.white));
63 expression = "level == WARN";
64 rulesList.add(
65 new ColorRule(
66 expression, ExpressionRule.getRule(expression), Color.yellow.brighter(),
67 Color.black));
68 defaultRules.put(DEFAULT_NAME, rulesList);
69 setRules(defaultRules);
70 }
71
72 public void setLoggerRule(Rule loggerRule) {
73 this.loggerRule = loggerRule;
74 colorChangeSupport.firePropertyChange("colorrule", false, true);
75 }
76
77 public void setFindRule(Rule findRule) {
78 this.findRule = findRule;
79 colorChangeSupport.firePropertyChange("colorrule", false, true);
80 }
81
82 public void setRules(Map rules) {
83 this.rules = rules;
84 colorChangeSupport.firePropertyChange("colorrule", false, true);
85 }
86
87 public Map getRules() {
88 return rules;
89 }
90
91 public void addRules(Map newRules) {
92 Iterator iter = newRules.entrySet().iterator();
93
94 while (iter.hasNext()) {
95 Map.Entry entry = (Map.Entry) iter.next();
96
97 if (rules.containsKey(entry.getKey())) {
98 ((List) rules.get(entry.getKey())).addAll((List) entry.getValue());
99 } else {
100 rules.put(entry.getKey(), entry.getValue());
101 }
102 }
103
104 colorChangeSupport.firePropertyChange("colorrule", false, true);
105 }
106
107 public void addRule(String ruleSetName, ColorRule rule) {
108 if (rules.containsKey(ruleSetName)) {
109 ((List) rules.get(ruleSetName)).add(rule);
110 } else {
111 List list = new ArrayList();
112 list.add(rule);
113 rules.put(ruleSetName, list);
114 }
115
116 colorChangeSupport.firePropertyChange("colorrule", false, true);
117 }
118
119 public void removeRule(String ruleSetName, String expression) {
120 if (rules.containsKey(ruleSetName)) {
121 List list = (List) rules.get(ruleSetName);
122
123 for (int i = 0; i < list.size(); i++) {
124 ColorRule rule = (ColorRule) list.get(i);
125
126 if (rule.getExpression().equals(expression)) {
127 list.remove(rule);
128
129 return;
130 }
131 }
132 }
133 }
134
135 public void setCurrentRuleSet(String ruleSetName) {
136 currentRuleSet = ruleSetName;
137 }
138
139 public Color getBackgroundColor(LoggingEvent event) {
140 if ((findRule != null) && findRule.evaluate(event)) {
141 return FIND_BACKGROUND;
142 }
143
144 if ((loggerRule != null) && loggerRule.evaluate(event)) {
145 return LOGGER_BACKGROUND;
146 }
147
148 if (rules.containsKey(currentRuleSet)) {
149 List list = (List) rules.get(currentRuleSet);
150 Iterator iter = list.iterator();
151
152 while (iter.hasNext()) {
153 ColorRule rule = (ColorRule) iter.next();
154
155 if ((rule.getBackgroundColor() != null) && (rule.evaluate(event))) {
156 return rule.getBackgroundColor();
157 }
158 }
159 }
160
161 return null;
162 }
163
164 public Color getForegroundColor(LoggingEvent event) {
165 if ((findRule != null) && findRule.evaluate(event)) {
166 return FIND_FOREGROUND;
167 }
168
169 if ((loggerRule != null) && loggerRule.evaluate(event)) {
170 return LOGGER_FOREGROUND;
171 }
172
173 if (rules.containsKey(currentRuleSet)) {
174 List list = (List) rules.get(currentRuleSet);
175 Iterator iter = list.iterator();
176
177 while (iter.hasNext()) {
178 ColorRule rule = (ColorRule) iter.next();
179
180 if ((rule.getForegroundColor() != null) && (rule.evaluate(event))) {
181 return rule.getForegroundColor();
182 }
183 }
184 }
185
186 return null;
187 }
188
189 public void addPropertyChangeListener(PropertyChangeListener listener) {
190 colorChangeSupport.addPropertyChangeListener(listener);
191 }
192
193 public void removePropertyChangeListener(PropertyChangeListener listener) {
194 colorChangeSupport.removePropertyChangeListener(listener);
195 }
196
197 /***
198 * @param propertyName
199 * @param listener
200 */
201 public void addPropertyChangeListener(
202 String propertyName, PropertyChangeListener listener) {
203 colorChangeSupport.addPropertyChangeListener(propertyName, listener);
204 }
205 }