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  package org.apache.log4j.chainsaw;
18  
19  import org.apache.log4j.helpers.Constants;
20  import org.apache.log4j.rule.Rule;
21  import org.apache.log4j.spi.LoggingEvent;
22  
23  import java.awt.*;
24  import java.util.HashMap;
25  import java.util.Map;
26  import java.util.Set;
27  
28  /**
29   * Wrap access to a LoggingEvent.  All property updates need to go through this object and not through the wrapped logging event,
30   * since the properties are shared by two views of the same backing LoggingEvent, and loggingEvent itself creates a copy of passed-in properties..
31   * <p>
32   * Property reads can be made on the actual LoggingEvent.
33   */
34  public class LoggingEventWrapper {
35      private final LoggingEvent loggingEvent;
36      private static final int DEFAULT_HEIGHT = -1;
37  
38      private Color colorRuleBackground = ChainsawConstants.COLOR_DEFAULT_BACKGROUND;
39      private Color colorRuleForeground = ChainsawConstants.COLOR_DEFAULT_FOREGROUND;
40      private int markerHeight = DEFAULT_HEIGHT;
41      private int msgHeight = DEFAULT_HEIGHT;
42  
43      //set to the log4jid value via setId - assumed to never change
44      private int id;
45  
46      private boolean searchMatch = false;
47      //a Map of event fields to Sets of string matches (can be used to render matches differently)
48      Map eventMatches = new HashMap();
49      private LoggingEventWrapper syncWrapper;
50      private boolean displayed;
51  
52      public LoggingEventWrapper(LoggingEvent loggingEvent) {
53          this.loggingEvent = loggingEvent;
54      }
55  
56      public LoggingEventWrapper(LoggingEventWrapper loggingEventWrapper) {
57          this.loggingEvent = loggingEventWrapper.getLoggingEvent();
58          this.id = loggingEventWrapper.id;
59          this.syncWrapper = loggingEventWrapper;
60          loggingEventWrapper.syncWrapper = this;
61      }
62  
63      public LoggingEvent getLoggingEvent() {
64          return loggingEvent;
65      }
66  
67      public void setProperty(String propName, String propValue) {
68          loggingEvent.setProperty(propName, propValue);
69          if (id == 0 && propName.equals(Constants.LOG4J_ID_KEY)) {
70              id = Integer.parseInt(propValue);
71          }
72          if (syncWrapper != null && !propName.equals(ChainsawConstants.MILLIS_DELTA_COL_NAME_LOWERCASE)) {
73              syncWrapper.getLoggingEvent().setProperty(propName, propValue);
74          }
75      }
76  
77      public Object removeProperty(String propName) {
78          Object result = loggingEvent.removeProperty(propName);
79          if (syncWrapper != null && !propName.equals(ChainsawConstants.MILLIS_DELTA_COL_NAME_LOWERCASE)) {
80              syncWrapper.getLoggingEvent().removeProperty(propName);
81          }
82          return result;
83      }
84  
85      public Set getPropertyKeySet() {
86          return loggingEvent.getPropertyKeySet();
87      }
88  
89      public void updateColorRuleColors(Color backgroundColor, Color foregroundColor) {
90          if (backgroundColor != null && foregroundColor != null) {
91              this.colorRuleBackground = backgroundColor;
92              this.colorRuleForeground = foregroundColor;
93              if (syncWrapper != null) {
94                  syncWrapper.colorRuleBackground = this.colorRuleBackground;
95                  syncWrapper.colorRuleForeground = this.colorRuleForeground;
96              }
97          } else {
98              this.colorRuleBackground = ChainsawConstants.COLOR_DEFAULT_BACKGROUND;
99              this.colorRuleForeground = ChainsawConstants.COLOR_DEFAULT_FOREGROUND;
100             if (syncWrapper != null) {
101                 syncWrapper.colorRuleBackground = this.colorRuleBackground;
102                 syncWrapper.colorRuleForeground = this.colorRuleForeground;
103             }
104         }
105     }
106 
107     public void evaluateSearchRule(Rule searchRule) {
108         eventMatches.clear();
109         searchMatch = searchRule != null && searchRule.evaluate(loggingEvent, eventMatches);
110     }
111 
112     public Map getSearchMatches() {
113         return eventMatches;
114     }
115 
116     public Color getForeground() {
117         return colorRuleForeground;
118     }
119 
120     public Color getBackground() {
121         return colorRuleBackground;
122     }
123 
124     public Color getColorRuleBackground() {
125         return colorRuleBackground;
126     }
127 
128     public Color getColorRuleForeground() {
129         return colorRuleForeground;
130     }
131 
132     public boolean isSearchMatch() {
133         return searchMatch;
134     }
135 
136     public void setMarkerHeight(int markerHeight) {
137         this.markerHeight = markerHeight;
138     }
139 
140     public int getMarkerHeight() {
141         return markerHeight;
142     }
143 
144     public void setMsgHeight(int msgHeight) {
145         this.msgHeight = msgHeight;
146     }
147 
148     public int getMsgHeight() {
149         return msgHeight;
150     }
151 
152     public void setDisplayed(boolean b) {
153         markerHeight = DEFAULT_HEIGHT;
154         msgHeight = DEFAULT_HEIGHT;
155         displayed = b;
156     }
157 
158     public void setPreviousDisplayedEventTimestamp(long previousDisplayedEventTimeStamp) {
159         setProperty(ChainsawConstants.MILLIS_DELTA_COL_NAME_LOWERCASE, String.valueOf(loggingEvent.getTimeStamp() - previousDisplayedEventTimeStamp));
160     }
161 
162     public boolean isDisplayed() {
163         return displayed;
164     }
165 
166     public boolean equals(Object o) {
167         if (this == o) {
168             return true;
169         }
170         if (o == null || getClass() != o.getClass()) {
171             return false;
172         }
173 
174         LoggingEventWrapper that = (LoggingEventWrapper) o;
175 
176         return id == that.id;
177     }
178 
179     public int hashCode() {
180         return id;
181     }
182 
183     public String toString() {
184         return "LoggingEventWrapper - id: " + id + " background: " + getBackground() + ", foreground: " + getForeground() + ", msg: " + loggingEvent.getMessage();
185     }
186 }