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 Wangpackage gov.nist.core;
25600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
26600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wangimport java.io.Serializable;
27600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wangimport java.util.Collection;
28600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wangimport java.util.Iterator;
29600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wangimport java.util.Map;
30600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wangimport java.util.Set;
31600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
32600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang/**
33600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang *
34600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang *
35600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * This is a Duplicate Name Value List that will allow multiple values map to the same key.
36600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang *
37600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * The parsing and encoding logic for it is the same as that of NameValueList. Only the HashMap
38600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * container is different.
39600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang *
40600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * @author aayush.bhatnagar
41600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * @since 2.0
42600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang *
43600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang */
44600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wangpublic class DuplicateNameValueList implements Serializable, Cloneable {
45600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
46600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    private MultiValueMapImpl<NameValue> nameValueMap = new MultiValueMapImpl<NameValue>();
47600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    private String separator;
48600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
49600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    private static final long serialVersionUID = -5611332957903796952L;
50600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
51600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    public DuplicateNameValueList()
52600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
53600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    {
54600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        this.separator = ";";
55600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    }
56600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
57600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    // ------------------
58600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
59600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    public void setSeparator(String separator) {
60600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        this.separator = separator;
61600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    }
62600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
63600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    /**
64600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     * Encode the list in semicolon separated form.
65600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     *
66600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     * @return an encoded string containing the objects in this list.
67600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     * @since v1.0
68600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     */
69600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    public String encode() {
70600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        return encode(new StringBuffer()).toString();
71600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    }
72600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
73600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    public StringBuffer encode(StringBuffer buffer) {
74600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        if (!nameValueMap.isEmpty()) {
75600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang            Iterator<NameValue> iterator = nameValueMap.values().iterator();
76600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang            if (iterator.hasNext()) {
77600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang                while (true) {
78600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang                    Object obj = iterator.next();
79600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang                    if (obj instanceof GenericObject) {
80600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang                        GenericObject gobj = (GenericObject) obj;
81600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang                        gobj.encode(buffer);
82600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang                    } else {
83600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang                        buffer.append(obj.toString());
84600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang                    }
85600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang                    if (iterator.hasNext())
86600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang                        buffer.append(separator);
87600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang                    else
88600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang                        break;
89600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang                }
90600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang            }
91600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        }
92600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        return buffer;
93600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    }
94600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
95600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    public String toString() {
96600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        return this.encode();
97600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    }
98600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
99600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    /**
100600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     * Set a namevalue object in this list.
101600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     */
102600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
103600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    public void set(NameValue nv) {
104600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        this.nameValueMap.put(nv.getName().toLowerCase(), nv);
105600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    }
106600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
107600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    /**
108600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     * Set a namevalue object in this list.
109600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     */
110600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    public void set(String name, Object value) {
111600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        NameValue nameValue = new NameValue(name, value);
112600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        nameValueMap.put(name.toLowerCase(), nameValue);
113600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
114600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    }
115600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
116600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    /**
117600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     * Compare if two NameValue lists are equal.
118600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     *
119600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     * @param otherObject is the object to compare to.
120600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     * @return true if the two objects compare for equality.
121600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     */
122600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    public boolean equals(Object otherObject) {
123600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        if ( otherObject == null ) {
124600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang            return false;
125600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        }
126600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        if (!otherObject.getClass().equals(this.getClass())) {
127600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang            return false;
128600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        }
129600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        DuplicateNameValueList other = (DuplicateNameValueList) otherObject;
130600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
131600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        if (nameValueMap.size() != other.nameValueMap.size()) {
132600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang            return false;
133600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        }
134600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        Iterator<String> li = this.nameValueMap.keySet().iterator();
135600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
136600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        while (li.hasNext()) {
137600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang            String key = (String) li.next();
138600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang            Collection nv1 = this.getNameValue(key);
139600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang            Collection nv2 = (Collection) other.nameValueMap.get(key);
140600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang            if (nv2 == null)
141600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang                return false;
142600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang            else if (!nv2.equals(nv1))
143600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang                return false;
144600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        }
145600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        return true;
146600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    }
147600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
148600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    /**
149600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     * Do a lookup on a given name and return value associated with it.
150600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     */
151600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    public Object getValue(String name) {
152600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        Collection nv = this.getNameValue(name.toLowerCase());
153600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        if (nv != null)
154600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang            return nv;
155600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        else
156600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang            return null;
157600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    }
158600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
159600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    /**
160600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     * Get the NameValue record given a name.
161600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     *
162600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     */
163600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    public Collection getNameValue(String name) {
164600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        return (Collection) this.nameValueMap.get(name.toLowerCase());
165600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    }
166600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
167600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    /**
168600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     * Returns a boolean telling if this NameValueList has a record with this name
169600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     */
170600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    public boolean hasNameValue(String name) {
171600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        return nameValueMap.containsKey(name.toLowerCase());
172600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    }
173600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
174600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    /**
175600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     * Remove the element corresponding to this name.
176600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     */
177600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    public boolean delete(String name) {
178600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        String lcName = name.toLowerCase();
179600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        if (this.nameValueMap.containsKey(lcName)) {
180600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang            this.nameValueMap.remove(lcName);
181600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang            return true;
182600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        } else {
183600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang            return false;
184600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        }
185600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
186600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    }
187600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
188600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    public Object clone() {
189600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        DuplicateNameValueList retval = new DuplicateNameValueList();
190600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        retval.setSeparator(this.separator);
191600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        Iterator<NameValue> it = this.nameValueMap.values().iterator();
192600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        while (it.hasNext()) {
193600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang            retval.set((NameValue) ((NameValue) it.next()).clone());
194600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        }
195600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        return retval;
196600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    }
197600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
198600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    /**
199600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     * Return an iterator for the name-value pairs of this list.
200600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     *
201600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     * @return the iterator.
202600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     */
203600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    public Iterator<NameValue> iterator() {
204600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        return this.nameValueMap.values().iterator();
205600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    }
206600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
207600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    /**
208600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     * Get a list of parameter names.
209600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     *
210600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     * @return a list iterator that has the names of the parameters.
211600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     */
212600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    public Iterator<String> getNames() {
213600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        return this.nameValueMap.keySet().iterator();
214600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
215600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    }
216600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
217600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    /**
218600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     * Get the parameter as a String.
219600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     *
220600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     * @return the parameter as a string.
221600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang     */
222600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    public String getParameter(String name) {
223600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        Object val = this.getValue(name);
224600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        if (val == null)
225600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang            return null;
226600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        if (val instanceof GenericObject)
227600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang            return ((GenericObject) val).encode();
228600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        else
229600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang            return val.toString();
230600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    }
231600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
232600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    public void clear() {
233600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        nameValueMap.clear();
234600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
235600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    }
236600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
237600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    public boolean isEmpty() {
238600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        return this.nameValueMap.isEmpty();
239600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    }
240600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
241600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    public NameValue put(String key, NameValue value) {
242600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        return (NameValue) this.nameValueMap.put(key, value);
243600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    }
244600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
245600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    public NameValue remove(Object key) {
246600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        return (NameValue) this.nameValueMap.remove(key);
247600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    }
248600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
249600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    public int size() {
250600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        return this.nameValueMap.size();
251600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    }
252600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
253600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    public Collection<NameValue> values() {
254600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        return this.nameValueMap.values();
255600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    }
256600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
257600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    public int hashCode() {
258600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang        return this.nameValueMap.keySet().hashCode();
259600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    }
260600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
261600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang}
262