// This software is released into the Public Domain. See copying.txt for details.
package org.openstreetmap.osmosis.core.progress.v0_6;
import java.util.Map;
import java.util.logging.Logger;
import org.openstreetmap.osmosis.core.container.v0_6.ChangeContainer;
import org.openstreetmap.osmosis.core.domain.v0_6.Entity;
import org.openstreetmap.osmosis.core.progress.v0_6.impl.ProgressTracker;
import org.openstreetmap.osmosis.core.task.common.ChangeAction;
import org.openstreetmap.osmosis.core.task.v0_6.ChangeSink;
import org.openstreetmap.osmosis.core.task.v0_6.ChangeSinkChangeSource;
/**
* Logs progress information using jdk logging at info level at regular intervals.
*
* @author Brett Henderson
*/
public class ChangeProgressLogger implements ChangeSinkChangeSource {
private static final Logger LOG = Logger.getLogger(ChangeProgressLogger.class.getName());
private ChangeSink changeSink;
private ProgressTracker progressTracker;
private String prefix;
/**
* Creates a new instance.
*
* @param interval
* The interval between logging progress reports in milliseconds.
* @param label
* a label to prefix the logger with; may be null.
*/
public ChangeProgressLogger(int interval, String label) {
progressTracker = new ProgressTracker(interval);
if (label != null && !label.equals("")) {
prefix = "[" + label + "] ";
} else {
prefix = "";
}
}
/**
* {@inheritDoc}
*/
public void initialize(Map<String, Object> metaData) {
progressTracker.initialize();
changeSink.initialize(metaData);
}
/**
* {@inheritDoc}
*/
public void process(ChangeContainer changeContainer) {
Entity entity;
ChangeAction action;
entity = changeContainer.getEntityContainer().getEntity();
action = changeContainer.getAction();
if (progressTracker.updateRequired()) {
LOG.info(
prefix
+ "Processing " + entity.getType() + " " + entity.getId() + " with action " + action + ", "
+ progressTracker.getObjectsPerSecond() + " objects/second.");
}
changeSink.process(changeContainer);
}
/**
* {@inheritDoc}
*/
public void complete() {
LOG.info("Processing completion steps.");
long start = System.currentTimeMillis();
changeSink.complete();
long duration = System.currentTimeMillis() - start;
LOG.info("Completion steps took " + duration / 1000d + " seconds.");
LOG.info("Processing complete.");
}
/**
* {@inheritDoc}
*/
public void close() {
changeSink.close();
}
/**
* {@inheritDoc}
*/
public void setChangeSink(ChangeSink changeSink) {
this.changeSink = changeSink;
}
}