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