001 // License: GPL. For details, see LICENSE file. 002 package 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 */ 009 public 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 }