// 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.EntityContainer; 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.v0_6.Sink; import org.openstreetmap.osmosis.core.task.v0_6.SinkSource; /** * Logs progress information using jdk logging at info level at regular intervals. * * @author Brett Henderson */ public class EntityProgressLogger implements SinkSource { private static final Logger LOG = Logger.getLogger(EntityProgressLogger.class.getName()); private Sink sink; 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 EntityProgressLogger(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(); sink.initialize(metaData); } /** * {@inheritDoc} */ public void process(EntityContainer entityContainer) { Entity entity; entity = entityContainer.getEntity(); if (progressTracker.updateRequired()) { LOG.info( prefix + "Processing " + entity.getType() + " " + entity.getId() + ", " + progressTracker.getObjectsPerSecond() + " objects/second."); } sink.process(entityContainer); } /** * {@inheritDoc} */ public void complete() { LOG.info("Processing completion steps."); long start = System.currentTimeMillis(); sink.complete(); long duration = System.currentTimeMillis() - start; LOG.info("Completion steps took " + duration / 1000d + " seconds."); LOG.info("Processing complete."); } /** * {@inheritDoc} */ public void close() { sink.close(); } /** * {@inheritDoc} */ public void setSink(Sink sink) { this.sink = sink; } }