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