// This software is released into the Public Domain. See copying.txt for details.
package org.openstreetmap.osmosis.core.progress.v0_6.impl;
import org.openstreetmap.osmosis.core.OsmosisRuntimeException;
/**
* Maintains state about execution progress. It calculates when the next update
* is due, and provides statistics on execution.
*
* @author Brett Henderson
*/
public class ProgressTracker {
private int interval;
private boolean initialized;
private long lastUpdateTimestamp;
private long objectCount;
private double objectsPerSecond;
/**
* Creates a new instance.
*
* @param interval
* The interval between logging progress reports in milliseconds.
*/
public ProgressTracker(int interval) {
this.interval = interval;
initialized = false;
}
/**
* Initializes interval measurement from now.
*/
public void initialize() {
lastUpdateTimestamp = System.currentTimeMillis();
objectCount = 0;
objectsPerSecond = 0;
initialized = true;
}
/**
* Indicates if an update is due. This should be called once per object that
* is processed.
*
* @return True if an update is due.
*/
public boolean updateRequired() {
long currentTimestamp;
long duration;
if (!initialized) {
throw new OsmosisRuntimeException("initialize has not been called");
}
// Calculate the time since the last update.
currentTimestamp = System.currentTimeMillis();
duration = currentTimestamp - lastUpdateTimestamp;
// Increment the processed object count.
objectCount++;
if (duration > interval || duration < 0) {
lastUpdateTimestamp = currentTimestamp;
// Calculate the number of objects processed per second.
objectsPerSecond = (double) objectCount * 1000 / duration;
// Reset the object count.
objectCount = 0;
return true;
} else {
return false;
}
}
/**
* Provides the number of objects processed per second. This only becomes
* valid after updateRequired returns true for the first time.
*
* @return The number of objects processed per second in the last timing
* interval.
*/
public double getObjectsPerSecond() {
return objectsPerSecond;
}
}