View Javadoc

1   /*
2    * Licensed to the Apache Software Foundation (ASF) under one or more
3    * contributor license agreements.  See the NOTICE file distributed with
4    * this work for additional information regarding copyright ownership.
5    * The ASF licenses this file to You under the Apache License, Version 2.0
6    * (the "License"); you may not use this file except in compliance with
7    * the License.  You may obtain a copy of the License at
8    *
9    *      http://www.apache.org/licenses/LICENSE-2.0
10   *
11   * Unless required by applicable law or agreed to in writing, software
12   * distributed under the License is distributed on an "AS IS" BASIS,
13   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14   * See the License for the specific language governing permissions and
15   * limitations under the License.
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 }