1600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang/* 2600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * Conditions Of Use 3600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * 4600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * This software was developed by employees of the National Institute of 5600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * Standards and Technology (NIST), an agency of the Federal Government. 6600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * Pursuant to title 15 Untied States Code Section 105, works of NIST 7600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * employees are not subject to copyright protection in the United States 8600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * and are considered to be in the public domain. As a result, a formal 9600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * license is not needed to use the software. 10600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * 11600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * This software is provided by NIST as a service and is expressly 12600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * provided "AS IS." NIST MAKES NO WARRANTY OF ANY KIND, EXPRESS, IMPLIED 13600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * OR STATUTORY, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTY OF 14600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, NON-INFRINGEMENT 15600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * AND DATA ACCURACY. NIST does not warrant or make any representations 16600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * regarding the use of the software or the results thereof, including but 17600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * not limited to the correctness, accuracy, reliability or usefulness of 18600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * the software. 19600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * 20600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * Permission to use this software is contingent upon your acceptance 21600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * of the terms of this agreement 22600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * 23600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * . 24600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * 25600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang */ 26600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang/******************************************************************************* 27600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * Product of NIST/ITL Advanced Networking Technologies Division (ANTD). * 28600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang *******************************************************************************/ 29600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wangpackage gov.nist.core; 30600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 31600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wangimport java.util.Map.Entry; 32600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 33600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang/* 34600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * Bug reports and fixes: Kirby Kiem, Jeroen van Bemmel. 35600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang */ 36600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 37600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang/** 38600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * Generic structure for storing name-value pairs. 39600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * 40600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * @version 1.2 41600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * 42600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * @author M. Ranganathan <br/> 43600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * 44600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * 45600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * 46600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang */ 47600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wangpublic class NameValue extends GenericObject implements Entry<String,String> { 48600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 49600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang private static final long serialVersionUID = -1857729012596437950L; 50600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 51600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang protected boolean isQuotedString; 52600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 53600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang protected final boolean isFlagParameter; 54600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 55600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang private String separator; 56600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 57600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang private String quotes; 58600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 59600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang private String name; 60600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 61600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang private Object value; 62600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 63600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang public NameValue() { 64600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang name = null; 65600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang value = ""; 66600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang separator = Separators.EQUALS; 67600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang this.quotes = ""; 68600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang this.isFlagParameter = false; 69600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang } 70600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 71600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang /** 72600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * New constructor, taking a boolean which is set if the NV pair is a flag 73600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * 74600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * @param n 75600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * @param v 76600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * @param isFlag 77600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang */ 78600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang public NameValue(String n, Object v, boolean isFlag) { 79600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 80600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang // assert (v != null ); // I dont think this assertion is correct mranga 81600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 82600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang name = n; 83600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang value = v; 84600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang separator = Separators.EQUALS; 85600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang quotes = ""; 86600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang this.isFlagParameter = isFlag; 87600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang } 88600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 89600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang /** 90600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * Original constructor, sets isFlagParameter to 'false' 91600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * 92600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * @param n 93600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * @param v 94600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang */ 95600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang public NameValue(String n, Object v) { 96600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang this(n, v, false); 97600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang } 98600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 99600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang /** 100600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * Set the separator for the encoding method below. 101600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang */ 102600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang public void setSeparator(String sep) { 103600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang separator = sep; 104600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang } 105600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 106600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang /** 107600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * A flag that indicates that doublequotes should be put around the value 108600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * when encoded (for example name=value when value is doublequoted). 109600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang */ 110600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang public void setQuotedValue() { 111600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang isQuotedString = true; 112600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang this.quotes = Separators.DOUBLE_QUOTE; 113600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang } 114600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 115600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang /** 116600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * Return true if the value is quoted in doublequotes. 117600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang */ 118600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang public boolean isValueQuoted() { 119600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang return isQuotedString; 120600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang } 121600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 122600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang public String getName() { 123600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang return name; 124600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang } 125600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 126600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang public Object getValueAsObject() { 127600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang return isFlagParameter ? "" : value; // never return null for flag 128600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang // params 129600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang } 130600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 131600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang /** 132600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * Set the name member 133600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang */ 134600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang public void setName(String n) { 135600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang name = n; 136600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang } 137600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 138600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang /** 139600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * Set the value member 140600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang */ 141600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang public void setValueAsObject(Object v) { 142600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang value = v; 143600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang } 144600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 145600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang /** 146600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * Get the encoded representation of this namevalue object. Added 147600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * doublequote for encoding doublequoted values. 148600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * 149600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * Bug: RFC3261 stipulates that an opaque parameter in authenticate header 150600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * has to be: 151600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * opaque = "opaque" EQUAL quoted-string 152600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * so returning just the name is not acceptable. (e.g. LinkSys phones 153600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * are picky about this) 154600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * 155600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * @since 1.0 156600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * @return an encoded name value (eg. name=value) string. 157600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang */ 158600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang public String encode() { 159600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang return encode(new StringBuffer()).toString(); 160600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang } 161600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 162600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang public StringBuffer encode(StringBuffer buffer) { 163600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang if (name != null && value != null && !isFlagParameter) { 164600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang if (GenericObject.isMySubclass(value.getClass())) { 165600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang GenericObject gv = (GenericObject) value; 166600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang buffer.append(name).append(separator).append(quotes); 167600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang gv.encode(buffer); 168600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang buffer.append(quotes); 169600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang return buffer; 170600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang } else if (GenericObjectList.isMySubclass(value.getClass())) { 171600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang GenericObjectList gvlist = (GenericObjectList) value; 172600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang buffer.append(name).append(separator).append(gvlist.encode()); 173600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang return buffer; 174600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang } else if ( value.toString().length() == 0) { 175600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang // opaque="" bug fix - pmusgrave 176600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang /*if (name.toString().equals(gov.nist.javax.sip.header.ParameterNames.OPAQUE)) 177600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang return name + separator + quotes + quotes; 178600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang else 179600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang return name;*/ 180600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang if ( this.isQuotedString ) { 181600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang buffer.append(name).append(separator).append(quotes).append(quotes); 182600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang return buffer; 183600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang } else { 184600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang buffer.append(name).append(separator); // JvB: fix, case: "sip:host?subject=" 185600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang return buffer; 186600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang } 187600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang } else { 188600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang buffer.append(name).append(separator).append(quotes).append(value.toString()).append(quotes); 189600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang return buffer; 190600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang } 191600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang } else if (name == null && value != null) { 192600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang if (GenericObject.isMySubclass(value.getClass())) { 193600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang GenericObject gv = (GenericObject) value; 194600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang gv.encode(buffer); 195600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang return buffer; 196600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang } else if (GenericObjectList.isMySubclass(value.getClass())) { 197600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang GenericObjectList gvlist = (GenericObjectList) value; 198600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang buffer.append(gvlist.encode()); 199600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang return buffer; 200600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang } else { 201600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang buffer.append(quotes).append(value.toString()).append(quotes); 202600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang return buffer; 203600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang } 204600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang } else if (name != null && (value == null || isFlagParameter)) { 205600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang buffer.append(name); 206600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang return buffer; 207600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang } else { 208600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang return buffer; 209600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang } 210600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang } 211600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 212600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang public Object clone() { 213600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang NameValue retval = (NameValue) super.clone(); 214600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang if (value != null) 215600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang retval.value = makeClone(value); 216600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang return retval; 217600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang } 218600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 219600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang /** 220600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * Equality comparison predicate. 221600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang */ 222600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang public boolean equals(Object other) { 223600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang if (other == null ) return false; 224600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang if (!other.getClass().equals(this.getClass())) 225600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang return false; 226600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang NameValue that = (NameValue) other; 227600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang if (this == that) 228600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang return true; 229600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang if (this.name == null && that.name != null || this.name != null 230600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang && that.name == null) 231600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang return false; 232600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang if (this.name != null && that.name != null 233600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang && this.name.compareToIgnoreCase(that.name) != 0) 234600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang return false; 235600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang if (this.value != null && that.value == null || this.value == null 236600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang && that.value != null) 237600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang return false; 238600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang if (this.value == that.value) 239600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang return true; 240600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang if (value instanceof String) { 241600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang // Quoted string comparisions are case sensitive. 242600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang if (isQuotedString) 243600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang return this.value.equals(that.value); 244600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang String val = (String) this.value; 245600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang String val1 = (String) that.value; 246600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang return val.compareToIgnoreCase(val1) == 0; 247600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang } else 248600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang return this.value.equals(that.value); 249600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang } 250600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 251600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang /* 252600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * (non-Javadoc) 253600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * @see java.util.Map$Entry#getKey() 254600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang */ 255600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang public String getKey() { 256600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 257600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang return this.name; 258600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang } 259600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 260600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang /* 261600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * (non-Javadoc) 262600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * @see java.util.Map$Entry#getValue() 263600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang */ 264600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang public String getValue() { 265600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 266600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang return value == null ? null : this.value.toString(); 267600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang } 268600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 269600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang /* 270600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * (non-Javadoc) 271600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * @see java.util.Map$Entry#setValue(java.lang.Object) 272600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang */ 273600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang public String setValue(String value) { 274600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang String retval = this.value == null ? null : value; 275600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang this.value = value; 276600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang return retval; 277600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 278600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang } 279600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 280600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang @Override 281600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang public int hashCode() { 282600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang return this.encode().toLowerCase().hashCode(); 283600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang } 284600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 285600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang} 286