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