001 package org.shiftone.jrat.provider.tree.ui.summary; 002 003 import org.shiftone.jrat.core.Accumulator; 004 import org.shiftone.jrat.core.MethodKey; 005 import org.shiftone.jrat.provider.tree.ui.TraceTreeNode; 006 import org.shiftone.jrat.util.Percent; 007 008 /** 009 * @author (jeff@shiftone.org) Jeff Drost 010 */ 011 public class MethodSummary { 012 013 private final MethodKey methodKey; 014 private long totalEnters; 015 private long totalExists; 016 private long totalErrors; 017 private long minDuration = Long.MAX_VALUE; 018 private long maxDuration = Long.MIN_VALUE; 019 private long totalDuration; 020 private long totalMethodDuration; 021 private int totalCallers; 022 023 024 public MethodSummary(MethodKey methodKey) { 025 this.methodKey = methodKey; 026 } 027 028 public void addStatistics(TraceTreeNode node) { 029 Accumulator accumulator = node.getAccumulator(); 030 totalEnters += accumulator.getTotalEnters(); 031 totalExists += accumulator.getTotalExits(); 032 totalErrors += accumulator.getTotalErrors(); 033 if (totalExists > 0) { 034 // if the node has not been existed, then the min and max times 035 // will only have the MAX_VALUE and MIN_VALUE. 036 minDuration = Math.min(minDuration, accumulator.getMinDuration()); 037 maxDuration = Math.max(maxDuration, accumulator.getMaxDuration()); 038 } 039 totalDuration += accumulator.getTotalDuration(); 040 totalMethodDuration += node.getTotalMethodDuration(); 041 totalCallers++; 042 } 043 044 045 /** 046 * It the method has been entered but not exited, then it is 047 * possible that the method time would end up negative. I'm not 048 * showing it at all in this case to avoid confusion. 049 */ 050 public Long getTotalMethodDuration() { 051 return totalEnters != totalExists 052 ? null 053 : new Long(totalMethodDuration); 054 } 055 056 public Double getAverageMethodDuration() { 057 return (totalExists == 0) || (totalEnters != totalExists) 058 ? null 059 : new Double((double) totalMethodDuration / (double) totalExists); 060 } 061 062 public Double getAverageDuration() { 063 return totalExists == 0 064 ? null 065 : new Double((double) totalDuration / (double) totalExists); 066 } 067 068 public Percent getErrorRate() { 069 return (totalExists == 0) 070 ? null 071 : new Percent(((double) totalErrors * 100.0) / (double) totalExists); 072 } 073 074 public long getUncompletedCalls() { 075 return totalEnters - totalExists; 076 } 077 078 079 public long getTotalEnters() { 080 return totalEnters; 081 } 082 083 public long getTotalExists() { 084 return totalExists; 085 } 086 087 public long getTotalErrors() { 088 return totalErrors; 089 } 090 091 public Long getMinDuration() { 092 return minDuration == Long.MAX_VALUE ? null : new Long(minDuration); 093 } 094 095 public Long getMaxDuration() { 096 return maxDuration == Long.MIN_VALUE ? null : new Long(maxDuration); 097 } 098 099 public long getTotalDuration() { 100 return totalDuration; 101 } 102 103 public int getTotalCallers() { 104 return totalCallers; 105 } 106 107 public MethodKey getMethodKey() { 108 return methodKey; 109 } 110 }