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.concurrent.*; 32600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 33600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wangimport java.io.Serializable; 34600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wangimport java.util.Collection; 35600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wangimport java.util.HashMap; 36600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wangimport java.util.Iterator; 37600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wangimport java.util.LinkedHashMap; 38600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wangimport java.util.Map; 39600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wangimport java.util.Set; 40600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 41600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang/** 42600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * Implements a simple NameValue association with a quick lookup function (via a 43600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * hash map) the default behavior for this class is not thread safe. 44600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * specify a constructor with boolean true to make this thread safe. 45600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * 46600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * @version 1.2 47600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * 48600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * @author M. Ranganathan <br/> 49600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * 50600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * 51600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * 52600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang */ 53600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 54600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wangpublic class NameValueList implements Serializable, Cloneable, Map<String,NameValue> { 55600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 56600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 57600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang private static final long serialVersionUID = -6998271876574260243L; 58600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 59600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang private Map<String,NameValue> hmap; 60600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 61600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang private String separator; 62600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 63600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang /** 64600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * default constructor. 65600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang */ 66600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang public NameValueList() { 67600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang this.separator = ";"; 68600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang this.hmap = new LinkedHashMap<String,NameValue>(); 69600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang } 70600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 71600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang public NameValueList(boolean sync) { 72600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang this.separator = ";"; 73600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang if (sync) 74600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang this.hmap = new ConcurrentHashMap<String,NameValue>(); 75600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang else 76600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang this.hmap = new LinkedHashMap<String,NameValue>(); 77600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang } 78600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 79600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang public void setSeparator(String separator) { 80600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang this.separator = separator; 81600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang } 82600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 83600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang /** 84600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * Encode the list in semicolon separated form. 85600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * 86600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * @return an encoded string containing the objects in this list. 87600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * @since v1.0 88600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang */ 89600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang public String encode() { 90600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang return encode(new StringBuffer()).toString(); 91600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang } 92600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 93600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang public StringBuffer encode(StringBuffer buffer) { 94600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang if (!hmap.isEmpty()) { 95600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang Iterator<NameValue> iterator = hmap.values().iterator(); 96600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang if (iterator.hasNext()) { 97600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang while (true) { 98600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang Object obj = iterator.next(); 99600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang if (obj instanceof GenericObject) { 100600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang GenericObject gobj = (GenericObject) obj; 101600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang gobj.encode(buffer); 102600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang } else { 103600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang buffer.append(obj.toString()); 104600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang } 105600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang if (iterator.hasNext()) 106600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang buffer.append(separator); 107600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang else 108600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang break; 109600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang } 110600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang } 111600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang } 112600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang return buffer; 113600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang } 114600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 115600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang public String toString() { 116600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang return this.encode(); 117600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang } 118600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 119600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang /** 120600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * Set a namevalue object in this list. 121600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang */ 122600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 123600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang public void set(NameValue nv) { 124600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang this.hmap.put(nv.getName().toLowerCase(), nv); 125600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang } 126600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 127600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang /** 128600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * Set a namevalue object in this list. 129600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang */ 130600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang public void set(String name, Object value) { 131600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang NameValue nameValue = new NameValue(name, value); 132600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang hmap.put(name.toLowerCase(), nameValue); 133600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 134600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang } 135600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 136600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang /** 137600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * Compare if two NameValue lists are equal. 138600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * 139600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * @param otherObject 140600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * is the object to compare to. 141600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * @return true if the two objects compare for equality. 142600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang */ 143600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang public boolean equals(Object otherObject) { 144600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang if ( otherObject == null ) { 145600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang return false; 146600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang } 147600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang if (!otherObject.getClass().equals(this.getClass())) { 148600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang return false; 149600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang } 150600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang NameValueList other = (NameValueList) otherObject; 151600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 152600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang if (hmap.size() != other.hmap.size()) { 153600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang return false; 154600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang } 155600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang Iterator<String> li = this.hmap.keySet().iterator(); 156600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 157600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang while (li.hasNext()) { 158600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang String key = (String) li.next(); 159600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang NameValue nv1 = this.getNameValue(key); 160600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang NameValue nv2 = (NameValue) other.hmap.get(key); 161600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang if (nv2 == null) 162600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang return false; 163600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang else if (!nv2.equals(nv1)) 164600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang return false; 165600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang } 166600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang return true; 167600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang } 168600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 169600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang /** 170600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * Do a lookup on a given name and return value associated with it. 171600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang */ 172600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang public Object getValue(String name) { 173600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang NameValue nv = this.getNameValue(name.toLowerCase()); 174600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang if (nv != null) 175600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang return nv.getValueAsObject(); 176600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang else 177600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang return null; 178600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang } 179600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 180600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang /** 181600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * Get the NameValue record given a name. 182600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * 183600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * @since 1.0 184600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang */ 185600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang public NameValue getNameValue(String name) { 186600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang return (NameValue) this.hmap.get(name.toLowerCase()); 187600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang } 188600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 189600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang /** 190600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * Returns a boolean telling if this NameValueList has a record with this 191600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * name 192600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * 193600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * @since 1.0 194600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang */ 195600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang public boolean hasNameValue(String name) { 196600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang return hmap.containsKey(name.toLowerCase()); 197600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang } 198600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 199600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang /** 200600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * Remove the element corresponding to this name. 201600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * 202600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * @since 1.0 203600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang */ 204600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang public boolean delete(String name) { 205600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang String lcName = name.toLowerCase(); 206600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang if (this.hmap.containsKey(lcName)) { 207600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang this.hmap.remove(lcName); 208600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang return true; 209600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang } else { 210600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang return false; 211600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang } 212600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 213600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang } 214600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 215600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang public Object clone() { 216600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang NameValueList retval = new NameValueList(); 217600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang retval.setSeparator(this.separator); 218600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang Iterator<NameValue> it = this.hmap.values().iterator(); 219600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang while (it.hasNext()) { 220600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang retval.set((NameValue) ((NameValue) it.next()).clone()); 221600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang } 222600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang return retval; 223600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang } 224600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 225600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang /** 226600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * Return the size of the embedded map 227600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang */ 228600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang public int size() { 229600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang return this.hmap.size(); 230600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang } 231600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 232600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang /** 233600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * Return true if empty. 234600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang */ 235600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang public boolean isEmpty() { 236600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang return hmap.isEmpty(); 237600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang } 238600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 239600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang /** 240600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * Return an iterator for the name-value pairs of this list. 241600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * 242600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * @return the iterator. 243600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang */ 244600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang public Iterator<NameValue> iterator() { 245600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang return this.hmap.values().iterator(); 246600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang } 247600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 248600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang /** 249600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * Get a list of parameter names. 250600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * 251600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * @return a list iterator that has the names of the parameters. 252600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang */ 253600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang public Iterator<String> getNames() { 254600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang return this.hmap.keySet().iterator(); 255600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 256600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang } 257600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 258600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang /** 259600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * Get the parameter as a String. 260600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * 261600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * @return the parameter as a string. 262600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang */ 263600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang public String getParameter(String name) { 264600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang Object val = this.getValue(name); 265600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang if (val == null) 266600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang return null; 267600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang if (val instanceof GenericObject) 268600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang return ((GenericObject) val).encode(); 269600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang else 270600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang return val.toString(); 271600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang } 272600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 273600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang /* 274600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * (non-Javadoc) 275600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * @see java.util.Map#clear() 276600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang */ 277600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 278600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang public void clear() { 279600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang this.hmap.clear(); 280600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang } 281600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 282600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang /* 283600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * (non-Javadoc) 284600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * @see java.util.Map#containsKey(java.lang.Object) 285600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang */ 286600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang public boolean containsKey(Object key) { 287600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang return this.hmap.containsKey(key.toString().toLowerCase()); 288600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang } 289600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 290600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang /* 291600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * (non-Javadoc) 292600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * @see java.util.Map#containsValue(java.lang.Object) 293600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang */ 294600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang public boolean containsValue(Object value) { 295600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang return this.hmap.containsValue(value); 296600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang } 297600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 298600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang /* 299600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * (non-Javadoc) 300600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * @see java.util.Map#entrySet() 301600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang */ 302600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang public Set<java.util.Map.Entry<String, NameValue>> entrySet() { 303600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang return this.hmap.entrySet(); 304600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang } 305600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 306600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang /* 307600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * (non-Javadoc) 308600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * @see java.util.Map#get(java.lang.Object) 309600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang */ 310600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang public NameValue get(Object key) { 311600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang return this.hmap.get(key.toString().toLowerCase()); 312600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang } 313600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 314600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang /* 315600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * (non-Javadoc) 316600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * @see java.util.Map#keySet() 317600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang */ 318600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang public Set<String> keySet() { 319600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang return this.hmap.keySet(); 320600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang } 321600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 322600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang /* 323600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * (non-Javadoc) 324600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * @see java.util.Map#put(java.lang.Object, java.lang.Object) 325600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang */ 326600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang public NameValue put(String name, NameValue nameValue) { 327600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang return this.hmap.put(name, nameValue); 328600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang } 329600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 330600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang public void putAll(Map<? extends String, ? extends NameValue> map) { 331600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang this.hmap.putAll(map); 332600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang } 333600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 334600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang /* 335600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * (non-Javadoc) 336600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * @see java.util.Map#remove(java.lang.Object) 337600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang */ 338600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang public NameValue remove(Object key) { 339600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang return this.hmap.remove(key.toString().toLowerCase()); 340600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang } 341600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 342600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang /* 343600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * (non-Javadoc) 344600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * @see java.util.Map#values() 345600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang */ 346600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang public Collection<NameValue> values() { 347600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang return this.hmap.values(); 348600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang } 349600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 350600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang @Override 351600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang public int hashCode() { 352600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang return this.hmap.keySet().hashCode(); 353600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang } 354600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang} 355