/* Copyright (c) 2005, John O'Hanley, Canada Code for this class was taken from http://www.javapractices.com/ */ package it.univpm.deit.semedia.musicuri.statistics; /** * Allows timing of the execution of any block of code. */ public final class Stopwatch { /** * Starts the stopwatch. * @throws IllegalStateException if the stopwatch is already running. */ public void start(){ if ( fIsRunning ) { throw new IllegalStateException("Must stop before calling start again."); } //reset both start and stop fStart = System.currentTimeMillis(); fStop = 0; fIsRunning = true; fHasBeenUsedOnce = true; } /** * Stops the stopwatch. * @throws IllegalStateException if the stopwatch is not already running. */ public void stop() { if ( !fIsRunning ) { throw new IllegalStateException("Cannot stop if not currently running."); } fStop = System.currentTimeMillis(); fIsRunning = false; } /** * Expresses the "reading" on the stopwatch. * @throws IllegalStateException if the Stopwatch has never been used, * or if the stopwatch is still running. */ public String toString() { validateIsReadable(); StringBuffer result = new StringBuffer(); result.append(fStop - fStart); result.append(" ms"); return result.toString(); } /** * Expresses the "reading" on the stopwatch as a numeric type. * @throws IllegalStateException if the Stopwatch has never been used, * or if the stopwatch is still running. */ public long toValue() { validateIsReadable(); return fStop - fStart; } // PRIVATE //// private long fStart; private long fStop; private boolean fIsRunning; private boolean fHasBeenUsedOnce; /** * @throws IllegalStateException if the watch has never been started, * or if the watch is still running. */ private void validateIsReadable() { if ( fIsRunning ) { String message = "Cannot read a stopwatch which is still running."; throw new IllegalStateException(message); } if ( !fHasBeenUsedOnce ) { String message = "Cannot read a stopwatch which has never been started."; throw new IllegalStateException(message); } } }