package com.spun.util.timers; import java.io.Serializable; import com.spun.util.DateDifference; /** * A Utility for timing an event multiple times. * Holds min, max, timeouts. ect... **/ public class EventTime { public enum SortBy { NAME, COUNT, TOTAL_TIME, AVERAGE_TIME, MIN_TIME, MAX_TIME, EXCEEDED_COUNT } private static final String enumeration[] = {"unknown", "name", "count", "total time", "average time", "min time", "max time", "excceded count" }; private int count = 0; private long totalTime = 0; private String label = null; private long maxTime = 0; private long minTime = Long.MAX_VALUE; private long timeLimit = 0; private Counter timeLimitExceeded = null; /************************************************************************/ public EventTime() { } /************************************************************************/ public EventTime(String eventName, long timeLimit) { this.label = eventName; this.timeLimit = timeLimit; this.timeLimitExceeded = (timeLimit > 0) ? new Counter() : null; } /************************************************************************/ public static int convertEnumerationString(String enumm) { int found = 0; for (int i = 0; i < enumeration.length; i++) { if (enumeration[i].equalsIgnoreCase(enumm)) { found = i; break; } } return found; } /************************************************************************/ public void add(long time) { totalTime += time; count++; maxTime = (time > maxTime) ? time : maxTime; minTime = (time < minTime) ? time : minTime; if ((timeLimitExceeded != null) && (time > timeLimit)) { timeLimitExceeded.inc(); } } /************************************************************************/ public void reset() { maxTime = 0; minTime = Long.MAX_VALUE; count = 0; totalTime = 0; } /************************************************************************/ public int getCount() { return count; } /************************************************************************/ public String getLabel() { return label; } /************************************************************************/ public long getTotalTime() { return totalTime; } /************************************************************************/ public long getMaxTime() { return maxTime; } /************************************************************************/ public DateDifference getMaxTimeAsDateDifference() { return new DateDifference(maxTime); } /************************************************************************/ public long getTimeLimit() { return timeLimit; } /************************************************************************/ public DateDifference getTimeLimitAsDateDifference() { return new DateDifference(timeLimit); } /************************************************************************/ public Counter getTimeLimitExceededCounter() { return timeLimitExceeded; } /************************************************************************/ public long getMinTime() { return minTime; } /************************************************************************/ public DateDifference getMinTimeAsDateDifference() { return new DateDifference(minTime); } /************************************************************************/ public long getAverageTime() { return (getCount() == 0) ? 0 : getTotalTime() / getCount(); } /************************************************************************/ public DateDifference getAverageTimeAsDateDifference() { return new DateDifference(getAverageTime()); } /************************************************************************/ public String toString() { String value = "com.spun.util.timers.EventTime["; value += " count = " + count + ",\n" + " label = '" + label + "'" + ",\n" + " maxTime = " + maxTime + ",\n" + " minTime = " + minTime + ",\n" + " timeLimit = " + timeLimit + ",\n" + " totalTime = " + totalTime + "]"; return value; } /************************************************************************/ /** * A convenience function to turn a vector of EventTime objects * into an Array of the EventTime objects. * @param vectorOf a Vector of EventTime objects * @return the array of EventTime. * @throws Error if an element of vectorOf is not a EventTime object. **/ public static EventTime[] toArray(java.util.Vector vectorOf) { if (vectorOf == null) { return new EventTime[0]; } EventTime array[] = new EventTime[vectorOf.size()]; for (int i = 0; i < array.length; i++) { java.lang.Object rowObject = vectorOf.elementAt(i); if (rowObject instanceof EventTime) { array[i] = (EventTime) rowObject; } else { throw new Error("toArray[i] is not an instance of EventTime but a " + rowObject.getClass().getName()); } } return array; } /************************************************************************/ /** Inner Classes **/ /************************************************************************/ /** * For use with java.util.Arrays.sort(Trade[], Trade.SortAddDate). **/ public static class SortEventTimers implements java.util.Comparator, Serializable { private SortBy type = null; private int asc = 0; /************************************************************************/ public SortEventTimers(SortBy type, boolean asc) { this.type = type; this.asc = (asc) ? 1 : -1; } /************************************************************************/ public int compare(Object o1, Object o2) throws java.lang.ClassCastException { if ((o1 instanceof EventTime) && (o2 instanceof EventTime)) { EventTime et1 = (EventTime) o1; EventTime et2 = (EventTime) o2; switch (type) { case NAME : return asc * et1.getLabel().compareToIgnoreCase(et2.getLabel()); case COUNT : return asc * (et1.getCount() - et2.getCount()); case TOTAL_TIME : return asc * (int) (et1.getTotalTime() - et2.getTotalTime()); case AVERAGE_TIME : return asc * (int) (et1.getAverageTime() - et2.getAverageTime()); case MIN_TIME : return asc * (int) (et1.getMinTime() - et2.getMinTime()); case MAX_TIME : return asc * (int) (et1.getMaxTime() - et2.getMaxTime()); case EXCEEDED_COUNT : return asc * (et1.getTimeLimitExceededCounter().getCount() - et2.getTimeLimitExceededCounter().getCount()); default : return 0;//this cannot be reached } } else { throw new java.lang.ClassCastException("Tried to compare apples and oranges in SortAddDate"); } } /************************************************************************/ /************************************************************************/ } }