// License: GPL. For details, see LICENSE file. package org.openstreetmap.josm.data.gpx; import java.util.Collection; import java.util.HashMap; import java.util.Map; /** * Default implementation for IWithAttributes. * * Base class for various classes in the GPX model. * * @author Frederik Ramm * @since 444 */ public class WithAttributes implements IWithAttributes, GpxConstants { /** * The "attr" hash is used to store the XML payload (not only XML attributes!) */ public Map<String, Object> attr = new HashMap<>(0); /** * Returns the Object value to which the specified key is mapped, * or {@code null} if this map contains no mapping for the key. * * @param key the key whose associated value is to be returned * @return the value */ @Override public Object get(String key) { return attr.get(key); } /** * Returns the String value to which the specified key is mapped, * or {@code null} if this map contains no String mapping for the key. * * @param key the key whose associated value is to be returned * @return the String value to which the specified key is mapped, * or {@code null} if this map contains no String mapping for the key */ @Override public String getString(String key) { Object value = attr.get(key); return (value instanceof String) ? (String) value : null; } /** * Returns the Collection value to which the specified key is mapped, * or {@code null} if this map contains no Collection mapping for the key. * * @param key the key whose associated value is to be returned * @return the Collection value to which the specified key is mapped, * or {@code null} if this map contains no Collection mapping for the key * @since 5502 */ @SuppressWarnings("unchecked") @Override public <T> Collection<T> getCollection(String key) { Object value = attr.get(key); return (value instanceof Collection) ? (Collection<T>) value : null; } /** * Put a key / value pair as a new attribute. * * Overrides key / value pair with the same key (if present). * * @param key the key * @param value the value */ @Override public void put(String key, Object value) { attr.put(key, value); } /** * Add a key / value pair that is not part of the GPX schema as an extension. * * @param key the key * @param value the value */ @Override public void addExtension(String key, String value) { if (!attr.containsKey(META_EXTENSIONS)) { attr.put(META_EXTENSIONS, new Extensions()); } Extensions ext = (Extensions) attr.get(META_EXTENSIONS); ext.put(key, value); } @Override public int hashCode() { return 31 + ((attr == null) ? 0 : attr.hashCode()); } @Override public boolean equals(Object obj) { if (this == obj) return true; if (obj == null) return false; if (getClass() != obj.getClass()) return false; WithAttributes other = (WithAttributes) obj; if (attr == null) { if (other.attr != null) return false; } else if (!attr.equals(other.attr)) return false; return true; } }