// License: GPL. For details, see LICENSE file.
package org.openstreetmap.josm.plugins.graphview.core.access;
import java.util.Collection;
import java.util.HashMap;
import java.util.Map;
import org.openstreetmap.josm.plugins.graphview.core.data.MapBasedTagGroup;
import org.openstreetmap.josm.plugins.graphview.core.data.Tag;
import org.openstreetmap.josm.plugins.graphview.core.data.TagGroup;
import org.openstreetmap.josm.plugins.graphview.core.util.TagCondition;
/**
* immutable representation of a tag implication rule.
*/
public final class Implication {
private final TagCondition condition;
private final Collection<Tag> impliedTags;
public Implication(TagCondition condition, Collection<Tag> impliedTags) {
this.condition = condition;
this.impliedTags = impliedTags;
}
/**
* applies this implication to a tag group.
* The resulting tag group will contain all tags from the original group
* and all implied tags with a key that didn't occur in the original group.
*
* @param tags tag group to apply implications to; != null
*/
public TagGroup apply(TagGroup tags) {
if (condition.matches(tags)) {
Map<String, String> newTagMap = new HashMap<>();
for (Tag tag : tags) {
newTagMap.put(tag.key, tag.value);
}
for (Tag impliedTag : impliedTags) {
if (!newTagMap.containsKey(impliedTag.key)) {
newTagMap.put(impliedTag.key, impliedTag.value);
}
}
return new MapBasedTagGroup(newTagMap);
} else {
return tags;
}
}
@Override
public String toString() {
return condition.toString() + " => " + impliedTags.toString();
}
}