// This software is released into the Public Domain. See copying.txt for details.
package org.openstreetmap.osmosis.tagfilter.v0_6;
import java.util.HashSet;
import java.util.Iterator;
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.domain.v0_6.Tag;
import org.openstreetmap.osmosis.core.task.v0_6.Sink;
import org.openstreetmap.osmosis.core.task.v0_6.SinkSource;
/**
* Filters a set of tags from all entities. This allows unwanted tags to be
* removed from the data.
*
* @author Jochen Topf
* @author Brett Henderson
*/
public class TagRemover implements SinkSource {
private Sink sink;
private HashSet<String> keysToDrop;
private String[] keyPrefixesToDrop;
/**
* Creates a new instance.
*
* @param keyList
* Comma separated list of keys of tags to be removed.
* @param keyPrefixList
* Comma separated list of key prefixes of tags to be removed.
*/
public TagRemover(String keyList, String keyPrefixList) {
keysToDrop = new HashSet<String>();
String[] keys = keyList.split(",");
for (int i = 0; i < keys.length; i++) {
keysToDrop.add(keys[i]);
}
keyPrefixesToDrop = keyPrefixList.split(",");
if (keyPrefixesToDrop[0] == "") {
keyPrefixesToDrop = new String[] {};
}
}
/**
* {@inheritDoc}
*/
public void setSink(Sink sink) {
this.sink = sink;
}
/**
* {@inheritDoc}
*/
public void initialize(Map<String, Object> metaData) {
sink.initialize(metaData);
}
/**
* {@inheritDoc}
*/
@Override
public void process(EntityContainer entityContainer) {
EntityContainer writeableContainer;
Entity entity;
writeableContainer = entityContainer.getWriteableInstance();
entity = writeableContainer.getEntity();
for (Iterator<Tag> i = entity.getTags().iterator(); i.hasNext();) {
Tag tag;
tag = i.next();
if (keysToDrop.contains(tag.getKey())) {
i.remove();
} else {
for (String prefix : keyPrefixesToDrop) {
if (tag.getKey().startsWith(prefix)) {
i.remove();
break;
}
}
}
}
sink.process(writeableContainer);
}
/**
* {@inheritDoc}
*/
public void complete() {
sink.complete();
}
/**
* {@inheritDoc}
*/
public void close() {
sink.close();
}
}