// This software is released into the Public Domain. See copying.txt for details.
package org.openstreetmap.osmosis.core.sort.v0_6;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import org.openstreetmap.osmosis.core.container.v0_6.ChangeContainer;
import org.openstreetmap.osmosis.core.container.v0_6.EntityContainer;
import org.openstreetmap.osmosis.core.domain.v0_6.Entity;
import org.openstreetmap.osmosis.core.domain.v0_6.Tag;
import org.openstreetmap.osmosis.core.task.v0_6.ChangeSink;
import org.openstreetmap.osmosis.core.task.v0_6.ChangeSinkChangeSource;
/**
* A data stream filter that sorts tags on changes. This is useful for testing
* to allow two sets of data to be compared for equality.
*
* @author Brett Henderson
*/
public class ChangeTagSorter implements ChangeSinkChangeSource {
private ChangeSink changeSink;
/**
* {@inheritDoc}
*/
public void initialize(Map<String, Object> metaData) {
changeSink.initialize(metaData);
}
/**
* {@inheritDoc}
*/
public void process(ChangeContainer changeContainer) {
EntityContainer readOnlyContainer;
EntityContainer writeableContainer;
Entity entity;
Collection<Tag> sortedTags;
readOnlyContainer = changeContainer.getEntityContainer();
writeableContainer = readOnlyContainer.getWriteableInstance();
entity = writeableContainer.getEntity();
sortedTags = sortTags(entity.getTags());
entity.getTags().clear();
entity.getTags().addAll(sortedTags);
changeSink.process(new ChangeContainer(writeableContainer, changeContainer.getAction()));
}
/**
* Sorts the specified tag list.
*
* @param tagList
* The tag list to be sorted.
* @return A new list containing the sorted tags.
*/
private List<Tag> sortTags(Collection<Tag> tagList) {
List<Tag> sortedTagList;
sortedTagList = new ArrayList<Tag>(tagList);
Collections.sort(sortedTagList);
return sortedTagList;
}
/**
* {@inheritDoc}
*/
public void setChangeSink(ChangeSink changeSink) {
this.changeSink = changeSink;
}
/**
* {@inheritDoc}
*/
public void complete() {
changeSink.complete();
}
/**
* {@inheritDoc}
*/
public void close() {
changeSink.close();
}
}