/* | |
* Licensed to the Apache Software Foundation (ASF) under one | |
* or more contributor license agreements. See the NOTICE file | |
* distributed with this work for additional information | |
* regarding copyright ownership. The ASF licenses this file | |
* to you under the Apache License, Version 2.0 (the | |
* "License"); you may not use this file except in compliance | |
* with the License. You may obtain a copy of the License at | |
* | |
* http://www.apache.org/licenses/LICENSE-2.0 | |
* | |
* Unless required by applicable law or agreed to in writing, | |
* software distributed under the License is distributed on an | |
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY | |
* KIND, either express or implied. See the License for the | |
* specific language governing permissions and limitations | |
* under the License. | |
*/ | |
package org.apache.openjpa.persistence.event.common.apps; | |
import javax.persistence.Entity; | |
@Entity | |
/* | |
Millisecond (only) accuracy timer. | |
Java 1.4 supposedly has sun.misc.Perf. | |
Java 1.5 has System.nanoTime (JSR 166) | |
*/ | |
public class Duration | |
implements Cloneable { | |
private String _name; | |
private boolean _started; | |
private boolean _running; | |
private long _startTime; // millis | |
private long _stopTime; // millis | |
// NYI clock time of day at start | |
public Duration(String name) { | |
_name = name; | |
_started = false; | |
_running = false; | |
} | |
public String getName() { | |
return _name; | |
} | |
public synchronized void start() { | |
if (_started) { | |
throw new RuntimeException("Duration was already started."); | |
} | |
_startTime = System.currentTimeMillis(); | |
_started = true; | |
_running = true; | |
} | |
public synchronized void stop() { | |
if (!_started) { | |
throw new RuntimeException("Duration was never started."); | |
} | |
if (!_running) { | |
throw new RuntimeException("Duration was already stopped."); | |
} | |
_stopTime = System.currentTimeMillis(); | |
_running = false; | |
} | |
protected Object clone() | |
throws CloneNotSupportedException { | |
return super.clone(); | |
} | |
/* | |
Returns a new Duration object from a currently running timer | |
as a snapshot of this object. | |
The returned timer is stopped, while this object continue on. | |
*/ | |
public synchronized Duration getCurrentDuration() { | |
if (!_started) { | |
throw new RuntimeException("Duration was never started."); | |
} | |
if (!_running) { | |
throw new RuntimeException("Duration is not running."); | |
} | |
long now = System.currentTimeMillis(); | |
Duration currentDuration; | |
try { | |
currentDuration = (Duration) this.clone(); | |
} catch (Exception e) { | |
currentDuration = new Duration(""); | |
} | |
currentDuration._stopTime = now; | |
currentDuration._running = false; | |
return currentDuration; | |
} | |
/* Obtain the duration that this timer has run (in seconds) */ | |
public synchronized double getDurationAsSeconds() { | |
if (!_started) { | |
throw new RuntimeException("Duration was never started."); | |
} | |
if (_running) { | |
// snapshot | |
Duration snapshot = getCurrentDuration(); | |
return (1000.0 * (snapshot._stopTime - snapshot._startTime)); | |
} | |
// Return a double value. Someday this class may make use of | |
// higher precision timing services (e.g. java 1.5) | |
return ((_stopTime - _startTime) / (double) 1000.0); | |
} | |
public synchronized boolean isRunning() { | |
return _running; | |
} | |
public synchronized boolean wasStarted() { | |
return _started; | |
} | |
public String toString() { | |
double time = 0.0; | |
StringBuffer buf = new StringBuffer(256); | |
if (wasStarted()) { | |
if (isRunning()) { | |
Duration snapshot = getCurrentDuration(); | |
time = snapshot.getDurationAsSeconds(); | |
} else { | |
time = getDurationAsSeconds(); | |
} | |
buf.append("Duration for '" + _name + "' is " + time + " (s)."); | |
} else { | |
buf.append("Duration for '" + _name + | |
"' has not yet been started."); | |
} | |
return buf.toString(); | |
} | |
/* Example usage: | |
public static void main (String[] args) | |
throws Exception | |
{ | |
Duration test = new Duration ("hello, count to 1 million"); | |
System.out.println (test); | |
test.start (); | |
for (int i = 0; i < 1000000000; i++) | |
{ | |
} | |
test.stop (); | |
System.out.println (test); | |
} | |
*/ | |
} | |