// This software is released into the Public Domain. See copying.txt for details.
package org.openstreetmap.osmosis.set.v0_6;
import java.util.Map;
import org.openstreetmap.osmosis.core.container.v0_6.EntityContainer;
import org.openstreetmap.osmosis.core.domain.v0_6.Entity;
import org.openstreetmap.osmosis.core.task.v0_6.Sink;
import org.openstreetmap.osmosis.core.sort.v0_6.SortedDuplicateEntityPipeValidator;
/**
* Flatten / simplify a sorted entity stream. (similar to --simplify-change)
*/
public class FlattenFilter extends SortedDuplicateEntityPipeValidator {
private Sink sink;
private Sink flattener = new Sink() {
private EntityContainer previousContainer;
@Override
public void initialize(Map<String, Object> metaData) {
sink.initialize(metaData);
}
/**
* Process a node, way or relation.
*
* @param currentContainer
* The entity container to be processed.
*/
@Override
public void process(EntityContainer currentContainer) {
if (previousContainer == null) {
previousContainer = currentContainer;
return;
}
Entity current = currentContainer.getEntity();
Entity previous = previousContainer.getEntity();
if (current.getId() != previous.getId() || !current.getType().equals(previous.getType())) {
sink.process(previousContainer);
previousContainer = currentContainer;
return;
}
if (current.getVersion() > previous.getVersion()) {
previousContainer = currentContainer;
}
}
@Override
public void complete() {
/*
* If we've stored entities temporarily, we now need to forward the
* stored ones to the output.
*/
if (previousContainer != null) {
sink.process(previousContainer);
}
sink.complete();
}
@Override
public void close() {
sink.close();
}
};
/**
* Creates a new instance.
*/
public FlattenFilter() {
super.setSink(flattener);
}
/**
* {@inheritDoc}
*/
public void setSink(Sink sink) {
this.sink = sink;
}
}