// This software is released into the Public Domain. See copying.txt for details.
package org.openstreetmap.osmosis.core.sort.v0_6;
import java.util.Map;
import org.openstreetmap.osmosis.core.OsmosisRuntimeException;
import org.openstreetmap.osmosis.core.container.v0_6.EntityContainer;
import org.openstreetmap.osmosis.core.task.v0_6.Sink;
import org.openstreetmap.osmosis.core.task.v0_6.SinkSource;
/**
* Validates that entity data in a pipeline is sorted by entity type then id. It
* accepts input data from a Source and passes all data to a downstream Sink.
*
* @author Brett Henderson
*/
public class SortedEntityPipeValidator implements SinkSource {
private Sink sink;
private EntityContainerComparator comparator;
private EntityContainer previousEntityContainer;
/**
* Creates a new instance.
*/
public SortedEntityPipeValidator() {
comparator = new EntityContainerComparator(new EntityByTypeThenIdComparator());
}
/**
* {@inheritDoc}
*/
public void initialize(Map<String, Object> metaData) {
sink.initialize(metaData);
}
/**
* {@inheritDoc}
*/
public void complete() {
sink.complete();
}
/**
* {@inheritDoc}
*/
public void process(EntityContainer entityContainer) {
// If this is not the first entity in the pipeline, make sure this
// entity is greater than the previous.
if (previousEntityContainer != null) {
if (comparator.compare(previousEntityContainer, entityContainer) >= 0) {
throw new OsmosisRuntimeException(
"Pipeline entities are not sorted, previous entity type="
+ previousEntityContainer.getEntity().getType() + ", id="
+ previousEntityContainer.getEntity().getId() + ", version="
+ previousEntityContainer.getEntity().getVersion() + " current entity type="
+ entityContainer.getEntity().getType() + ", id="
+ entityContainer.getEntity().getId() + ", version="
+ entityContainer.getEntity().getVersion() + "."
);
}
}
sink.process(entityContainer);
previousEntityContainer = entityContainer;
}
/**
* {@inheritDoc}
*/
public void close() {
sink.close();
}
/**
* {@inheritDoc}
*/
public void setSink(Sink sink) {
this.sink = sink;
}
}