package com.spun.util.timers;
import java.util.ArrayList;
import com.spun.util.DateDifference;
import com.spun.util.logger.SimpleLogger;
/**
* A Utility for timing things. this is NOT multi-thread safe.
**/
public class LapTimer
{
private long startTime = 0;
private long lapTime = 0;
private long endTime = 0;
private ArrayList<LapTime> lapTimes = null;
private String label = null;
private long pausedTime = 0;
private long pausedTotalTime = 0;
private static Clock clock = new Clock();
public static void registerClock(Clock clock)
{
LapTimer.clock = clock;
}
/************************************************************************/
public LapTimer()
{
this(null);
}
/************************************************************************/
public LapTimer(String label)
{
startTime = getCurrentTime();
lapTime = startTime;
lapTimes = new ArrayList<LapTime>();
this.label = label;
}
private long getCurrentTime()
{
return clock.getTime();
}
/************************************************************************/
public String getLabel()
{
return label;
}
/************************************************************************/
/**
* Marks the time for a lap & a label.
* ie. A timer could store - 1 hour 10 mins ["1st Quarter", 15 mins,"2nd Quarter", 15 mins,"Half Time", 10 mins, "3rd Quarter", 15 mins,"4th Quarter", 15 mins]
**/
public long lap(String label)
{
return lap(false, label);
}
/************************************************************************/
public long end(String label)
{
return lap(true, label);
}
/************************************************************************/
public boolean isPaused()
{
return pausedTime != 0;
}
/************************************************************************/
public void pause()
{
if (!isPaused())
{
pausedTime = getCurrentTime();
}
}
/************************************************************************/
public void resume()
{
if (isPaused())
{
lapTime = getCurrentTime();
pausedTotalTime += lapTime - pausedTime;
pausedTime = 0;
}
}
/************************************************************************/
public long lap(boolean end, String label)
{
long newTime = getCurrentTime();
long difference = newTime - lapTime;
SimpleLogger.variable("difference", difference);
lapTimes.add(new LapTime(difference, label));
lapTime = newTime;
endTime = (end) ? newTime : 0;
return difference;
}
/************************************************************************/
public LapTime[] getLapTimes()
{
return LapTime.toArray(lapTimes);
}
/************************************************************************/
public int getLapCount()
{
return lapTimes.size();
}
/************************************************************************/
public LapTime getLap(int i)
{
if (i >= lapTimes.size()) { return null; }
return (LapTime) lapTimes.get(i);
}
/************************************************************************/
public LapTime getLap(String label)
{
for (int i = 0; i < lapTimes.size(); i++)
{
LapTime time = (LapTime) lapTimes.get(i);
if (label.equals(time.getLabel())) { return time; }
}
return null;
}
/************************************************************************/
public long getTotalTime()
{
long lastrecordedTime = 0;
if (endTime != 0)
{
lastrecordedTime = endTime;
}
else if (isPaused())
{
lastrecordedTime = pausedTime;
}
else
{
lastrecordedTime = getCurrentTime();
}
return lastrecordedTime - startTime - pausedTotalTime;
}
/************************************************************************/
public DateDifference getTotalTimeAsDateDifference()
{
return new DateDifference(getTotalTime());
}
/************************************************************************/
public String toString()
{
String value = String.format(
"com.spun.util.timers.LapTimer[ Label = '%s',\n isPaused = %s ,\n Lap Times = %s ,\n Total Paused Time = %s ,\n Total Time = %s]",
label, isPaused(), getPrintableLapTimesArray(), new DateDifference(pausedTotalTime).getStandardTimeText(1),
getTotalTimeAsDateDifference().getStandardTimeText(1));
return value;
}
/************************************************************************/
/**
* convenience function for toString().
**/
private String getPrintableLapTimesArray()
{
LapTime times[] = getLapTimes();
String output = "[";
for (int i = 0; i < times.length; i++)
{
output += (i > 0) ? ", " : "";
output += times[i].getLapTimeAsDateDifference().getStandardTimeText(2);
}
output += "]";
return output;
}
/***********************************************************************/
/***********************************************************************/
}