1 /* 2 * Copyright (c) 1998-2005 The Jgroup Team. 3 * 4 * This program is free software; you can redistribute it and/or modify 5 * it under the terms of the GNU Lesser General Public License version 2 as 6 * published by the Free Software Foundation. 7 * 8 * This program is distributed in the hope that it will be useful, 9 * but WITHOUT ANY WARRANTY; without even the implied warranty of 10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 11 * GNU Lesser General Public License for more details. 12 * 13 * You should have received a copy of the GNU Lesser General Public License 14 * along with this program; if not, write to the Free Software 15 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. 16 * 17 */ 18 package jgroup.util.log; 19 20 import java.io.IOException; 21 import java.io.ObjectInputStream; 22 import java.io.Serializable; 23 import java.net.InetAddress; 24 25 import jgroup.util.Network; 26 27 /** 28 * A general event that can be logged. This class is designed to be 29 * subclassed, and it should be noted that subclassing requires that 30 * the subclass be serializable to be written to disk. Since this class 31 * does implement <code>Serializable</code> the subclasses do not need 32 * to do that. 33 * 34 * @author Rune Vestvik 35 * @author Hein Meling 36 * @since Jgroup 3.0 37 */ 38 public class Event 39 implements Comparable<Event>, Serializable 40 { 41 42 //////////////////////////////////////////////////////////////////////////////////////////// 43 // Constants 44 //////////////////////////////////////////////////////////////////////////////////////////// 45 46 private static final long serialVersionUID = 4121134753270542643L; 47 48 /** 49 * The time of the event to which other events should be relative to. 50 * If not set, the output generated for the events will be the actual 51 * time values of the logged events. 52 */ 53 private static long timeOfRelativeEvent = 0; 54 55 /** The length of the longest hostname ever recorded */ 56 private static int longestHostname = 0; 57 58 59 //////////////////////////////////////////////////////////////////////////////////////////// 60 // Event fields 61 //////////////////////////////////////////////////////////////////////////////////////////// 62 63 protected long time; 64 65 protected EventType type; 66 67 protected String description; 68 69 private String hostname; 70 71 protected InetAddress eventHost; 72 73 74 //////////////////////////////////////////////////////////////////////////////////////////// 75 // Constructors 76 //////////////////////////////////////////////////////////////////////////////////////////// 77 78 /** Super constructor for sub events with late initialization */ 79 public Event() 80 { 81 } 82 83 public Event(EventType type, String description) 84 { 85 this(System.currentTimeMillis(), type, description); 86 } 87 88 public Event(long time, EventType type, String description) 89 { 90 this.time = time; 91 this.type = type; 92 this.description = description; 93 this.hostname = Network.getLocalMachineName(); 94 this.eventHost = Network.getLocalHost(); 95 } 96 97 98 //////////////////////////////////////////////////////////////////////////////////////////// 99 // Access methods 100 //////////////////////////////////////////////////////////////////////////////////////////// 101 102 /** 103 * @return Returns the occurrance time of this event 104 */ 105 public long getTime() 106 { 107 return time; 108 } 109 110 /** 111 * Set the time value of this event; used to adjust the time for events that 112 * was logged on machines with incorrect clock. 113 * 114 * @param time the occurrance time of this event 115 */ 116 public void setTime(long time) 117 { 118 this.time = time; 119 } 120 121 /** 122 * @return Returns the type of this event 123 */ 124 public EventType getType() 125 { 126 return type; 127 } 128 129 /** 130 * @return Returns the description of this event 131 */ 132 public String getDescription() 133 { 134 return description; 135 } 136 137 /** 138 * @return Returns the hostname. 139 */ 140 public String getHostname() 141 { 142 return hostname; 143 } 144 145 /** 146 * @return Returns the host on which this event was generated. 147 */ 148 public InetAddress getHost() 149 { 150 return eventHost; 151 } 152 153 /** 154 * Returns true if the given type is the same as the type of this instance. 155 */ 156 public boolean isType(EventType theType) 157 { 158 return theType == type; 159 } 160 161 /** 162 * This method must be overriden by the event type which will be used to indicate 163 * that it is the last event. 164 * 165 * @return Always returns false. 166 */ 167 public boolean isLastEvent() 168 { 169 return false; 170 } 171 172 /** 173 * Set the event whose time will be the used to compute relative time 174 * of consecutive events. Typically, the first event should be the 175 * relative event. 176 * 177 * @param relativeEvent 178 */ 179 public static void setRelativeTo(Event relativeEvent) 180 { 181 timeOfRelativeEvent = relativeEvent.time; 182 } 183 184 185 //////////////////////////////////////////////////////////////////////////////////////////// 186 // Methods from Object 187 //////////////////////////////////////////////////////////////////////////////////////////// 188 189 public String toString() 190 { 191 StringBuilder buf = commonToString(true); 192 return buf.toString(); 193 } 194 195 protected StringBuilder commonToString(boolean includeDescription) 196 { 197 StringBuilder buf = new StringBuilder(); 198 buf.append(String.format("%6d", time - timeOfRelativeEvent)); 199 buf.append(" ("); 200 buf.append(hostname); 201 int pad = longestHostname - hostname.length(); 202 for (int i = 0; i < pad; i++) { 203 buf.append(' '); 204 } 205 buf.append("): "); 206 if (type != null) { 207 buf.append(type); 208 } 209 if (includeDescription && description.length() > 0) { 210 buf.append(' '); 211 buf.append(description); 212 } 213 return buf; 214 } 215 216 217 //////////////////////////////////////////////////////////////////////////////////////////// 218 // Methods from Comparable 219 //////////////////////////////////////////////////////////////////////////////////////////// 220 221 /** 222 * Allows the system to compare two events to determine which are first 223 * in some ordering; hence making it simple to sort the events. 224 */ 225 public int compareTo(Event event) 226 { 227 if (time > event.time) 228 return 1; 229 else if (time < event.time) 230 return -1; 231 return 0; 232 } 233 234 235 //////////////////////////////////////////////////////////////////////////////////////////// 236 // Serialization Methods 237 //////////////////////////////////////////////////////////////////////////////////////////// 238 239 /** 240 * Override readObject to allow us to compute the length of longest hostname so that 241 * we can do pretty printing. 242 */ 243 private void readObject(ObjectInputStream in) 244 throws IOException, ClassNotFoundException 245 { 246 in.defaultReadObject(); 247 if (hostname != null) { 248 int hostnameLen = hostname.length(); 249 if (longestHostname < hostnameLen) 250 longestHostname = hostnameLen; 251 } 252 } 253 254 } // END Event