// This software is released into the Public Domain. See copying.txt for details.
package org.openstreetmap.osmosis.core.sort.v0_6;
import java.util.Comparator;
import java.util.Map;
import org.openstreetmap.osmosis.core.container.v0_6.EntityContainer;
import org.openstreetmap.osmosis.core.lifecycle.ReleasableIterator;
import org.openstreetmap.osmosis.core.sort.common.FileBasedSort;
import org.openstreetmap.osmosis.core.store.GenericObjectSerializationFactory;
import org.openstreetmap.osmosis.core.task.v0_6.Sink;
import org.openstreetmap.osmosis.core.task.v0_6.SinkSource;
/**
* A data stream filter that sorts entities. The sort order is specified by
* comparator provided during instantiation.
*
* @author Brett Henderson
*/
public class EntitySorter implements SinkSource {
private FileBasedSort<EntityContainer> fileBasedSort;
private Sink sink;
/**
* Creates a new instance.
*
* @param comparator
* The comparator to use for sorting.
*/
public EntitySorter(Comparator<EntityContainer> comparator) {
this(comparator, true);
}
/**
* Creates a new instance.
*
* @param comparator
* The comparator to use for sorting.
* @param useCompression
* If true, the storage files will be compressed.
*/
public EntitySorter(Comparator<EntityContainer> comparator, boolean useCompression) {
fileBasedSort = new FileBasedSort<EntityContainer>(
new GenericObjectSerializationFactory(), comparator, useCompression);
}
/**
* {@inheritDoc}
*/
public void initialize(Map<String, Object> metaData) {
sink.initialize(metaData);
}
/**
* {@inheritDoc}
*/
public void process(EntityContainer entityContainer) {
fileBasedSort.add(entityContainer);
}
/**
* {@inheritDoc}
*/
public void setSink(Sink sink) {
this.sink = sink;
}
/**
* {@inheritDoc}
*/
public void complete() {
try (ReleasableIterator<EntityContainer> iterator = fileBasedSort.iterate()) {
while (iterator.hasNext()) {
sink.process(iterator.next());
}
sink.complete();
}
}
/**
* {@inheritDoc}
*/
public void close() {
fileBasedSort.close();
sink.close();
}
}