• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /**
2  * Copyright (c) 2004-2011 QOS.ch
3  * All rights reserved.
4  *
5  * Permission is hereby granted, free  of charge, to any person obtaining
6  * a  copy  of this  software  and  associated  documentation files  (the
7  * "Software"), to  deal in  the Software without  restriction, including
8  * without limitation  the rights to  use, copy, modify,  merge, publish,
9  * distribute,  sublicense, and/or sell  copies of  the Software,  and to
10  * permit persons to whom the Software  is furnished to do so, subject to
11  * the following conditions:
12  *
13  * The  above  copyright  notice  and  this permission  notice  shall  be
14  * included in all copies or substantial portions of the Software.
15  *
16  * THE  SOFTWARE IS  PROVIDED  "AS  IS", WITHOUT  WARRANTY  OF ANY  KIND,
17  * EXPRESS OR  IMPLIED, INCLUDING  BUT NOT LIMITED  TO THE  WARRANTIES OF
18  * MERCHANTABILITY,    FITNESS    FOR    A   PARTICULAR    PURPOSE    AND
19  * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20  * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21  * OF CONTRACT, TORT OR OTHERWISE,  ARISING FROM, OUT OF OR IN CONNECTION
22  * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
23  *
24  */
25 package org.slf4j.ext;
26 
27 import java.io.Serializable;
28 import java.io.ByteArrayInputStream;
29 import java.io.ByteArrayOutputStream;
30 import java.util.Date;
31 import java.util.HashMap;
32 import java.util.Iterator;
33 import java.util.Map;
34 import java.beans.XMLDecoder;
35 import java.beans.XMLEncoder;
36 import java.beans.ExceptionListener;
37 
38 /**
39  * Base class for Event Data. Event Data contains data to be logged about an
40  * event. Users may extend this class for each EventType they want to log.
41  *
42  * @author Ralph Goers
43  */
44 public class EventData implements Serializable {
45 
46     private static final long serialVersionUID = 153270778642103985L;
47 
48     private Map<String, Object> eventData = new HashMap<String, Object>();
49     public static final String EVENT_MESSAGE = "EventMessage";
50     public static final String EVENT_TYPE = "EventType";
51     public static final String EVENT_DATETIME = "EventDateTime";
52     public static final String EVENT_ID = "EventId";
53 
54     /**
55      * Default Constructor
56      */
EventData()57     public EventData() {
58     }
59 
60     /**
61      * Constructor to create event data from a Map.
62      *
63      * @param map
64      *          The event data.
65      */
EventData(Map<String, Object> map)66     public EventData(Map<String, Object> map) {
67         eventData.putAll(map);
68     }
69 
70     /**
71      * Construct from a serialized form of the Map containing the RequestInfo
72      * elements
73      *
74      * @param xml
75      *          The serialized form of the RequestInfo Map.
76      */
77     @SuppressWarnings("unchecked")
EventData(String xml)78     public EventData(String xml) {
79         ByteArrayInputStream bais = new ByteArrayInputStream(xml.getBytes());
80         try {
81             XMLDecoder decoder = new XMLDecoder(bais);
82             this.eventData = (Map<String, Object>) decoder.readObject();
83         } catch (Exception e) {
84             throw new EventException("Error decoding " + xml, e);
85         }
86     }
87 
88     /**
89      * Serialize all the EventData items into an XML representation.
90      *
91      * @return an XML String containing all the EventDAta items.
92      */
toXML()93     public String toXML() {
94         return toXML(eventData);
95     }
96 
97     /**
98      * Serialize all the EventData items into an XML representation.
99      *
100      * @param map the Map to transform
101      * @return an XML String containing all the EventDAta items.
102      */
toXML(Map<String, Object> map)103     public static String toXML(Map<String, Object> map) {
104         ByteArrayOutputStream baos = new ByteArrayOutputStream();
105         try {
106             XMLEncoder encoder = new XMLEncoder(baos);
107             encoder.setExceptionListener(new ExceptionListener() {
108                 public void exceptionThrown(Exception exception) {
109                     exception.printStackTrace();
110                 }
111             });
112             encoder.writeObject(map);
113             encoder.close();
114             return baos.toString();
115         } catch (Exception e) {
116             e.printStackTrace();
117             return null;
118         }
119     }
120 
121     /**
122      * Retrieve the event identifier.
123      *
124      * @return The event identifier
125      */
getEventId()126     public String getEventId() {
127         return (String) this.eventData.get(EVENT_ID);
128     }
129 
130     /**
131      * Set the event identifier.
132      *
133      * @param eventId
134      *          The event identifier.
135      */
setEventId(String eventId)136     public void setEventId(String eventId) {
137         if (eventId == null) {
138             throw new IllegalArgumentException("eventId cannot be null");
139         }
140         this.eventData.put(EVENT_ID, eventId);
141     }
142 
143     /**
144      * Retrieve the message text associated with this event, if any.
145      *
146      * @return The message text associated with this event or null if there is
147      *         none.
148      */
getMessage()149     public String getMessage() {
150         return (String) this.eventData.get(EVENT_MESSAGE);
151     }
152 
153     /**
154      * Set the message text associated with this event.
155      *
156      * @param message
157      *          The message text.
158      */
setMessage(String message)159     public void setMessage(String message) {
160         this.eventData.put(EVENT_MESSAGE, message);
161     }
162 
163     /**
164      * Retrieve the date and time the event occurred.
165      *
166      * @return The Date associated with the event.
167      */
getEventDateTime()168     public Date getEventDateTime() {
169         return (Date) this.eventData.get(EVENT_DATETIME);
170     }
171 
172     /**
173      * Set the date and time the event occurred in case it is not the same as when
174      * the event was logged.
175      *
176      * @param eventDateTime
177      *          The event Date.
178      */
setEventDateTime(Date eventDateTime)179     public void setEventDateTime(Date eventDateTime) {
180         this.eventData.put(EVENT_DATETIME, eventDateTime);
181     }
182 
183     /**
184      * Set the type of event that occurred.
185      *
186      * @param eventType
187      *          The type of the event.
188      */
setEventType(String eventType)189     public void setEventType(String eventType) {
190         this.eventData.put(EVENT_TYPE, eventType);
191     }
192 
193     /**
194      * Retrieve the type of the event.
195      *
196      * @return The event type.
197      */
getEventType()198     public String getEventType() {
199         return (String) this.eventData.get(EVENT_TYPE);
200     }
201 
202     /**
203      * Add arbitrary attributes about the event.
204      *
205      * @param name
206      *          The attribute's key.
207      * @param obj
208      *          The data associated with the key.
209      */
put(String name, Serializable obj)210     public void put(String name, Serializable obj) {
211         this.eventData.put(name, obj);
212     }
213 
214     /**
215      * Retrieve an event attribute.
216      *
217      * @param name
218      *          The attribute's key.
219      * @return The value associated with the key or null if the key is not
220      *         present.
221      */
get(String name)222     public Serializable get(String name) {
223         return (Serializable) this.eventData.get(name);
224     }
225 
226     /**
227      * Populate the event data from a Map.
228      *
229      * @param data
230      *          The Map to copy.
231      */
putAll(Map<String, Object> data)232     public void putAll(Map<String, Object> data) {
233         this.eventData.putAll(data);
234     }
235 
236     /**
237      * Returns the number of attributes in the EventData.
238      *
239      * @return the number of attributes in the EventData.
240      */
getSize()241     public int getSize() {
242         return this.eventData.size();
243     }
244 
245     /**
246      * Returns an Iterator over all the entries in the EventDAta.
247      *
248      * @return an Iterator that can be used to access all the event attributes.
249      */
getEntrySetIterator()250     public Iterator<Map.Entry<String, Object>> getEntrySetIterator() {
251         return this.eventData.entrySet().iterator();
252     }
253 
254     /**
255      * Retrieve all the attributes in the EventData as a Map. Changes to this map
256      * will be reflected in the EventData.
257      *
258      * @return The Map of attributes in this EventData instance.
259      */
getEventMap()260     public Map<String, Object> getEventMap() {
261         return this.eventData;
262     }
263 
264     /**
265      * Convert the EventData to a String.
266      *
267      * @return The EventData as a String.
268      */
269     @Override
toString()270     public String toString() {
271         return toXML();
272     }
273 
274     /**
275      * Compare two EventData objects for equality.
276      *
277      * @param o
278      *          The Object to compare.
279      * @return true if the objects are the same instance or contain all the same
280      *         keys and their values.
281      */
282     @SuppressWarnings("unchecked")
283     @Override
equals(Object o)284     public boolean equals(Object o) {
285         if (this == o) {
286             return true;
287         }
288         if (!(o instanceof EventData || o instanceof Map)) {
289             return false;
290         }
291         Map<String, Object> map = (o instanceof EventData) ? ((EventData) o).getEventMap() : (Map<String, Object>) o;
292 
293         return this.eventData.equals(map);
294     }
295 
296     /**
297      * Compute the hashCode for this EventData instance.
298      *
299      * @return The hashcode for this EventData instance.
300      */
301     @Override
hashCode()302     public int hashCode() {
303         return this.eventData.hashCode();
304     }
305 }