FileDocCategorySizeDatePackage
NameValueList.javaAPI DocphoneME MR2 API (J2ME)9413Wed May 02 18:00:42 BST 2007gov.nist.core

NameValueList.java

/*
 * Portions Copyright  2000-2007 Sun Microsystems, Inc. All Rights
 * Reserved.  Use is subject to license terms.
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
 * 
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the GNU General Public License version
 * 2 only, as published by the Free Software Foundation.
 * 
 * This program is distributed in the hope that it will be useful, but
 * WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
 * General Public License version 2 for more details (a copy is
 * included at /legal/license.txt).
 * 
 * You should have received a copy of the GNU General Public License
 * version 2 along with this work; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
 * 02110-1301 USA
 * 
 * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa
 * Clara, CA 95054 or visit www.sun.com if you need additional
 * information or have any questions.
 */
/*
 */
package gov.nist.core;
import java.util.*;
import java.util.Hashtable;

/**
 * Implements a simple NameValue association with a quick lookup.
 *
 * @version  JAIN-SIP-1.1
 *
 *
 * <a href="{@docRoot}/uncopyright.html">This code is in the public domain.</a>
 *
 */
public class NameValueList   extends GenericObject {
    /** Internal name value list. */
    private  Hashtable    nvList;
    /** Separator character. */
    private  String    separator;


    /**
     * Constructs a new list.
     * @param listName label for this list
     */
    public NameValueList(String listName) {
        nvList = new Hashtable();
        this.separator = Separators.SEMICOLON;
    }

    /**
     * Gets a list of key names.
     * @return list of key names.
     */
    public Vector getNames() {
        Vector names = new Vector();
	Enumeration enumNames = nvList.keys();

	while (enumNames.hasMoreElements()) {
	    names.addElement(enumNames.nextElement());
	}

        return names;
    }

    /**
     * Gets the enumeration of key names.
     * @return enumeration of key names.
     */
    public Enumeration getKeys() {
        return nvList.keys();
    }

    /**
     * Adds a name value pair to the list.
     * @param nv the data to be stored
     */
    public void add(NameValue nv) {
        if (nv == null)
            throw new NullPointerException("null nv");
        nvList.put(nv.getName(), nv.getValue());
    }

    /**
     * Sets a namevalue object in this list.
     * @param nv the data to be updated
     */
    public void set(NameValue nv) {
        this.add(nv);
    }

    /**
     * Sets a namevalue object in this list.
     * @param name the label for the data element
     * @param value the value for the element
     */
    public void set(String name, Object value) {
        NameValue nv = new NameValue(name, value);
        this.set(nv);
    }

    /**
     * Adds a name value record to this list.
     * @param name the label for the data element
     * @param obj the value for the data element
     */
    public void add(String name, Object obj) {
        if (name == null)
            throw new NullPointerException("name in null ! ");
        NameValue nv = new NameValue(name, obj);
        add(nv);
    }

    /**
     * Compares if two NameValue lists are equal.
     * @param otherObject  is the object to compare to.
     * @return true if the two objects compare for equality.
     */
    public boolean equals(Object otherObject) {
        if (!otherObject.getClass().equals
                (this.getClass())) {
            return false;
        }
        NameValueList other = (NameValueList) otherObject;

        if (this.nvList.size() != other.nvList.size()) {
            return false;
        }
	Enumeration enumNames = nvList.keys();
        String currKey;
	Object currValue, currValueOther;
	while (enumNames.hasMoreElements()) {
	    currKey = (String)enumNames.nextElement();
	    currValue = this.nvList.get(currKey);
	    currValueOther = other.nvList.get(currKey);
	    if (
	        (currValueOther == null) || !currValue.equals(currValueOther)) {
                return false;
	    }
	}
        return true;
    }


    /**
     * Do a lookup on a given name and return value associated with it.
     * @param name to be looked up
     * @return the object that was found or null if not found
     */
    public Object  getValue(String name) {
        return nvList.get(name.toLowerCase());
    }

    /**
     * Do a lookup on a given name and return value associated with it.
     * @param name to be looked up
     * @param nameDefault to be returned when name is not found
     * @return the object that was found or default if not found
     */
    public String getValueDefault(String name, String nameDefault) {
        String returnValue = (String)nvList.get(name.toLowerCase());
	if (returnValue == null) returnValue = nameDefault;
        return returnValue;
    }

    /**
     * Gets the NameValue record given a name.
     * @param name the data element laebl to find
     * @return the name value found or null if not found
     * @since 1.0
     */
    public NameValue getNameValue(String name) {
        if (name == null)
            throw new NullPointerException("null arg!");
        String name1  = name.toLowerCase();
        NameValue returnValue = null;
	Object value = getValue(name1);
	if (value != null)
	    returnValue = new NameValue(name1, value);
        return returnValue;
    }

    /**
     * Returns a boolean telling if this NameValueList
     * has a record with this name.
     * @param name the label to find
     * @return true if the element includes a value
     * @since 1.0
     */
    public boolean hasNameValue(String name) {
        return nvList.containsKey(name.toLowerCase());
    }

    /**
     * Removes the element corresponding to this name.
     * @param name the label to find
     * @return true if successfully removed
     * @since 1.0
     */
    public boolean delete(String name) {
        if (name == null) {
            return true;
        }

        String name1  = name.toLowerCase();
	nvList.remove(name1);

        return true;
    }

    /**
     * Default constructor.
     */
    public NameValueList() {
        nvList = new Hashtable();
	this.separator = Separators.SEMICOLON;
    }

    /**
     * Makes a copy of the current instance.
     * @return copy of current object
     */
    public Object clone()   {
        NameValueList retval = new NameValueList();
        retval.separator = this.separator;
	Enumeration enumNames = nvList.keys();
        String currKey;
	while (enumNames.hasMoreElements()) {
            currKey = (String)enumNames.nextElement();
	    retval.add(currKey, nvList.get(currKey));
	}
        return retval;

    }

    /**
     * Gets the parameter as a String.
     * @param name the label to find
     * @return the parameter as a string.
     */
    public String getParameter(String name) {
        Object val = this.getValue(name);
        if (val == null)
            return null;
        if (val instanceof GenericObject)
            return ((GenericObject)val).encode();
        else return val.toString();
    }

    /**
     * Encodes the contenst as a string.
     * @return the encoded text string.
     */
    public String encode() {
        if (nvList.size() == 0)
            return "";

        StringBuffer encoding = new StringBuffer();
	Enumeration enumNames = nvList.keys();
        String currKey;
	Object currValue;

	while (enumNames.hasMoreElements()) {
            currKey = (String)enumNames.nextElement();
	    encoding.append(currKey);
	    currValue = nvList.get(currKey);

	    if (currValue != null) {
                if (currValue instanceof GenericObject) {
                    GenericObject gobj = (GenericObject) currValue;
                    encoding.append(Separators.EQUALS + gobj.encode());
                } else {
                    String s = currValue.toString();

                    if (s.length() > 0) {
                        encoding.append(Separators.EQUALS + s);
                    }
                }
	    }

	    if (enumNames.hasMoreElements()) // not last
	        encoding.append(separator);
	}

        return encoding.toString();
    }

    /**
     * Encodes the contenst as a string followd by separator.
     * @return the encoded text string.
     */
    public String encodeWithSep() {
        String retVal = encode();
        if (retVal.length() > 0) {
            retVal = separator + retVal;
        }
        return retVal; 
    }

    /**
     * Converts contenets to a string.
     * @return contenets encoded in a text string
     */
    public String toString() {
        return this.encode();
    }

    /**
     * Sets the separator string to be used in formatted contents.
     * @param separator string to use between fields
     */
    public void setSeparator(String separator) {
        this.separator = separator;
    }

    /**
     * Checks if the listis empty.
     * @return true if the size of the list is zero
     */
    public boolean isEmpty() {
        return this.nvList.size() == 0;
    }

    /**
     * Gets the size of the list.
     * @return the count of elements in the list
     */
    public int size() {
        return nvList.size();
    }
}