001// License: GPL. For details, see LICENSE file.
002package org.openstreetmap.josm.data.osm;
003
004/**
005 * Tag represents an immutable key/value-pair. Both the key and the value may
006 * be empty, but not null.
007 *
008 */
009public class Tag {
010
011    private String key;
012    private String value;
013
014    /**
015     * Create an empty tag whose key and value are empty.
016     */
017    public Tag(){
018        this("", "");
019    }
020
021    /**
022     * Create a tag whose key is <code>key</code> and whose value is
023     * empty.
024     *
025     * @param key the key. If null, it is set to the empty key.
026     */
027    public Tag(String key) {
028        this(key, "");
029    }
030
031    /**
032     * Creates a tag for a key and a value. If key and/or value are null,
033     * the empty value "" is assumed.
034     *
035     * @param key the key
036     * @param value  the value
037     */
038    public Tag(String key, String value) {
039        this.key = key == null ? "" : key;
040        this.value = value == null ? "" : value;
041    }
042
043    /**
044     * Creates clone of the tag <code>tag</code>.
045     *
046     * @param tag the tag.
047     */
048    public Tag(Tag tag) {
049        this(tag.getKey(), tag.getValue());
050    }
051
052    /**
053     * Replies the key of the tag. This is never null.
054     *
055     * @return the key of the tag
056     */
057    public String getKey() {
058        return key;
059    }
060
061    /**
062     * Replies the value of the tag. This is never null.
063     *
064     * @return the value of the tag
065     */
066    public String getValue() {
067        return value;
068    }
069
070    /**
071     * Replies true if the key of this tag is equal to <code>key</code>.
072     * If <code>key</code> is null, assumes the empty key.
073     *
074     * @param key the key
075     * @return true if the key of this tag is equal to <code>key</code>
076     */
077    public boolean matchesKey(String key) {
078        return this.key.equals(key);
079    }
080
081    @Override
082    public int hashCode() {
083        final int prime = 31;
084        int result = 1;
085        result = prime * result + key.hashCode();
086        result = prime * result + value.hashCode();
087        return result;
088    }
089
090    @Override
091    public boolean equals(Object obj) {
092        if (obj instanceof Tag) {
093            Tag other = (Tag) obj;
094            return key.equals(other.getKey()) && value.equals(other.getValue());
095        } else
096            return false;
097    }
098
099    @Override
100    public String toString() {
101        return key + "=" + value;
102    }
103}