1 17 18 package org.sape.carbon.services.perflog; 19 20 import java.util.EmptyStackException ; 21 import java.util.Stack ; 22 23 import org.apache.commons.logging.Log; 24 import org.apache.commons.logging.LogFactory; 25 26 81 public class DefaultPerformanceLogger implements PerformanceLogger { 82 83 86 private Log log = LogFactory.getLog(this.getClass()); 87 88 89 public static final long INVALID_TIME = -1; 90 91 98 private final ThreadLocal threadLocalCallStack = new ThreadLocal (); 99 100 107 protected Stack getCallStack() { 108 Stack stack = (Stack ) threadLocalCallStack.get(); 109 110 if (stack == null) { 112 stack = new Stack (); 113 threadLocalCallStack.set(stack); 114 } 115 116 return stack; 118 } 119 120 121 135 public void start(Object trackedObject) { 136 if (enabled()) { 138 getCallStack().push(new TrackingInfo(trackedObject)); 139 } 140 } 141 142 143 173 public long end(Object trackedObject) { 174 175 TrackingInfo currentTrackingInfo = null; 177 Object currentTrackedObject = null; 178 long endTime = DefaultPerformanceLogger.INVALID_TIME; 179 long totalTime = DefaultPerformanceLogger.INVALID_TIME; 180 Stack callStack = null; 181 182 if (enabled()) { 184 callStack = getCallStack(); 185 186 endTime = System.currentTimeMillis(); 189 190 try { 191 currentTrackingInfo = (TrackingInfo) callStack.pop(); 193 currentTrackedObject = currentTrackingInfo.getTrackedObject(); 194 195 while (!currentTrackedObject.equals(trackedObject)) { 201 currentTrackingInfo = (TrackingInfo) callStack.pop(); 202 currentTrackedObject = 203 currentTrackingInfo.getTrackedObject(); 204 } 205 206 totalTime = endTime - currentTrackingInfo.getStartTime(); 207 208 trackTiming(trackedObject, totalTime); 209 } catch (EmptyStackException ese) { 210 if (log.isWarnEnabled()) { 213 log.warn("Performance measurement - tracked object " 214 + trackedObject 215 + " could not be located. Call stack now empty."); 216 } 217 totalTime = DefaultPerformanceLogger.INVALID_TIME; 218 } 219 } 220 221 return totalTime; 223 } 224 225 226 232 public int clearStack() { 233 if (enabled()) { 236 int previousDepth = getCallStack().size(); 237 logCallStack(); 238 getCallStack().clear(); 239 if (log.isTraceEnabled()) { 240 log.trace( 241 "Performance measurement stack being cleared on thread " 242 + Thread.currentThread().getName()); 243 } 244 return previousDepth; 245 } else { 246 return 0; 247 } 248 } 249 250 251 261 public void logCallStack() { 262 if (enabled()) { 264 Stack stack = getCallStack(); 265 StringBuffer message = new StringBuffer (256); 266 TrackingInfo info = null; 267 268 message.append("Performance measurement stack logged on thread "); 271 message.append(Thread.currentThread().getName()); 272 message.append("\n Tracking stack (depth "); 273 message.append(stack.size()); 274 message.append("): \n"); 275 276 for (int i = 0; i < stack.size(); ++i) { 278 info = (TrackingInfo) stack.get(i); 279 280 message.append(" "); 281 if (i < 10) { 282 message.append(" "); 284 } 285 message.append(i); 286 message.append(": "); 287 message.append(info.getTrackedObject()); 288 message.append(" [Started at "); 289 message.append(info.getStartTime()); 290 message.append("ms]\n"); 291 } 292 293 message.append(" Current time is"); 295 message.append(System.currentTimeMillis()); 296 message.append("ms."); 297 298 log.info(message.toString()); 299 } 300 } 301 302 308 protected void trackTiming(Object trackedObject, long time) { 309 310 if (log.isInfoEnabled()) { 311 log.info("Performance measurement - item [" 312 + trackedObject 313 + "] executed in [" + time + "ms]."); 314 } 315 } 316 317 322 public boolean enabled() { 323 return log.isInfoEnabled(); 324 } 325 326 327 } | Popular Tags |