package org.openstreetmap.josm.plugins.graphview.core.data; import java.util.Collection; import java.util.Collections; import java.util.HashMap; import java.util.Iterator; import java.util.LinkedList; import java.util.Map; /** * TagGroup that uses a key-value-Map to store tags */ public class MapBasedTagGroup implements TagGroup { private final Map<String, String> tagMap; /** * @param tagMap map from keys to values; != null; * must not be modified after being used as parameter */ public MapBasedTagGroup(Map<String, String> tagMap) { if (tagMap == null) { throw new IllegalArgumentException(); } this.tagMap = tagMap; } /** * @param tags tags to add to the group; != null, each != null */ public MapBasedTagGroup(Iterable<Tag> tags) { if (tags == null) { throw new IllegalArgumentException(); } this.tagMap = new HashMap<String, String>(); for (Tag tag : tags) { if (tag == null) { throw new IllegalArgumentException(); } else { this.tagMap.put(tag.key, tag.value); } } } /** * @param tags tags to add to the group; each != null */ public MapBasedTagGroup(Tag... tags) { this.tagMap = new HashMap<String, String>(tags.length); for (Tag tag : tags) { if (tag == null) { throw new IllegalArgumentException(); } else { this.tagMap.put(tag.key, tag.value); } } } @Override public String getValue(String key) { assert key != null; return tagMap.get(key); } @Override public boolean containsKey(String key) { assert key != null; return tagMap.containsKey(key); } @Override public boolean containsAnyKey(Iterable<String> keys) { for (String key : keys) { if (this.containsKey(key)) { return true; } } return false; } @Override public boolean containsValue(String value) { assert value != null; return tagMap.containsValue(value); } @Override public boolean containsAnyValue(Iterable<String> values) { for (String value : values) { if (this.containsValue(value)) { return true; } } return false; } @Override public boolean contains(Tag tag) { assert tag != null; return tag.value.equals(tagMap.get(tag.key)); } @Override public boolean containsAny(Iterable<Tag> tags) { for (Tag tag : tags) { if (this.contains(tag)) { return true; } } return false; } @Override public boolean contains(String key, String value) { assert key != null; assert value != null; return value.equals(tagMap.get(key)); } @Override public boolean containsAny( Iterable<String> keys, String value) { for (String key : keys) { if (this.contains(key, value)) { return true; } } return false; } @Override public boolean containsAny(Iterable<String> keys, Iterable<String> values) { for (String key : keys) { if (this.containsAny(key, values)) { return true; } } return false; } @Override public boolean containsAny(String key, Iterable<String> values) { for (String value : values) { if (this.contains(key, value)) { return true; } } return false; } @Override public int size() { return tagMap.size(); } @Override public boolean isEmpty() { return tagMap.isEmpty(); } /** * returns an Iterator providing access to all Tags. * The Iterator does not support the {@link Iterator#remove()} method. */ @Override public Iterator<Tag> iterator() { Collection<Tag> tagCollection = new LinkedList<Tag>(); for (String key : tagMap.keySet()) { tagCollection.add(new Tag(key, tagMap.get(key))); } return Collections.unmodifiableCollection(tagCollection).iterator(); } @Override public String toString() { return tagMap.toString(); } }