/*
* Copyright 2003 Federal Chancellery Austria
* MOA-ID has been developed in a cooperation between BRZ, the Federal
* Chancellery Austria - ICT staff unit, and Graz University of Technology.
*
* Licensed under the EUPL, Version 1.1 or - as soon they will be approved by
* the European Commission - subsequent versions of the EUPL (the "Licence");
* You may not use this work except in compliance with the Licence.
* You may obtain a copy of the Licence at:
* http://www.osor.eu/eupl/
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the Licence is distributed on an "AS IS" basis,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the Licence for the specific language governing permissions and
* limitations under the Licence.
*
* This product combines work with different licenses. See the "NOTICE" text
* file for details on the various modules and licenses.
* The "NOTICE" text file is part of the distribution. Any derivative works
* that you distribute must include a readable copy of the "NOTICE" text file.
*/
package at.gv.egovernment.moa.util;
import java.util.Map;
import java.util.WeakHashMap;
/**
* A timer utility for named timers.
*
* @author Sven Aigner
*/
public class MOATimer {
/** The single instance of this class. */
private static MOATimer instance = null;
/** The starting points of single timings. */
private static Map timemapstart = new WeakHashMap();
/** The end points of single timings. */
private static Map timemapend = new WeakHashMap();
/**
* Return the single instance of this class.
*
* @return The single instance of this class.
*/
public static MOATimer getInstance() {
if (instance == null) {
instance = new MOATimer();
}
return instance;
}
/**
* Create a new MOATimer
.
*
* Protected to disallow multiple instances.
*/
protected MOATimer() {
super();
}
/**
* Start timing a certain action.
*
* The timing belonging to the action ID is garbage collected as soon as there
* exists no other reference to the action ID.
*
* @param id The action ID.
*/
public void startTiming(Object id) {
timemapstart.put(id, new Long(System.currentTimeMillis()));
}
/**
* Stop timing an action.
*
* @param id The action ID.
*/
public void stopTiming(Object id) {
timemapend.put(id, new Long(System.currentTimeMillis()));
}
/**
* Get the duration of an action.
*
* @param id The action ID for which to compute the duration.
* @return long The duration in milliseconds between calls to
* startTiming()
and stopTiming()
. If
* only startTiming()
has been called for the action, then
* current difference to the system time is returned. If no timing exists for
* the action, - 1
is returned.
*/
public long duration(Object id) {
if (timemapstart.containsKey(id)) {
long start = ((Long) timemapstart.get(id)).longValue();
if (timemapend.containsKey(id)) {
long end = ((Long) timemapend.get(id)).longValue();
return end - start;
} else {
return System.currentTimeMillis() - start;
}
} else
return -1;
}
/**
* Get the duration of an action, as a nicely formatted String
.
*
* @param id The action ID.
* @return String The duration()
as a String
.
*/
public String durationAsString(Object id) {
long dur = duration(id);
long second = dur / 1000;
long mil = (dur) - (second * 1000);
return "Duration: " + second + "." + mil + " seconds";
}
/**
* Remove a timing.
*
* @param id The action ID.
*/
public void clearTiming(String id) {
if (timemapstart.containsKey(id))
timemapstart.remove(id);
if (timemapend.containsKey(id))
timemapend.remove(id);
}
}