
package com.limegroup.gnutella.util;

import com.sun.java.util.collections.*;

/**
* This class stores a pair of a property key, and its corresponding value.
* It implements Map.Entry interface, so that other classes can use it in the
* same way, there's no backing Map though, unless stated otherwise.
*/
public class KeyValue implements Map.Entry
{
/** key of the property */
	private Object key = null;

/**	Value of the property */
	private Object value = null;


/**	Constructor
	@param key key of the property
	@param value corresponding value of the property
*/
public KeyValue(Object key, Object value)
{
	this.key = key;
	this.value = value;
}//end of constructor

/**
* Default Constructor
*/
public KeyValue()
{
    this.key = null;
    this.value = null;
}


/**	
* Sets the key and value fields
* @param key key of the property
* @param value corresponding value of the property
*/
public void set(Object key, Object value)
{
	this.key = key;
	this.value = value;
}//end of constructor

/** Compares the instance of this class with another instance. 
	Returns true, if the key field is same, regardless of the 
	value. 
	@param o Another instance of the KeyValue class to which it
	has to be compared.
*/
public boolean equals(Object o)
{
	KeyValue keyValue = (KeyValue)o;

	return key.equals(keyValue.getKey());
}

/**	
* Converts the key Value pair into a string representation 
*/
public String toString()
{
	return key + " = " + value;
}

/** 
* Returns the key(key) in the key value pair 
* @return the key(key) in the key value pair
*/
public Object getKey()
{
    return key;
}

/** 
* Returns the value corresponding to this entry.  
* @return the value corresponding to this entry.
*/
public Object getValue()
{
    return value;
}
/** 
* Replaces the value corresponding to this entry with the specified
 * value. 
 * @param value new value to be stored in this entry.
 * @return old value corresponding to the entry.
 */
public Object setValue(Object value)
{
    //get the old value
    Object oldValue = this.value;
    
    //change the value
    this.value = value;
    
    //return the old value
    return oldValue;
    
}


/** Returns the hash code value for this map entry.  The hash code
 * of a map entry <tt>e</tt> is defined to be: <pre>
 *    (e.getKey()==null   ? 0 : e.getKey().hashCode()) ^
 *    (e.getValue()==null ? 0 : e.getValue().hashCode())
 * </pre>
 * This ensures that <tt>e1.equals(e2)</tt> implies that
 * <tt>e1.hashCode()==e2.hashCode()</tt> for any two Entries
 * <tt>e1</tt> and <tt>e2</tt>, as required by the general
 * contract of <tt>Object.hashCode</tt>.
 *
 * @return the hash code value for this map entry.
 * @see Object#hashCode()
 * @see Object#equals(Object)
 * @see #equals(Object)
 */
public int hashCode()
{
    return ((key == null   ? 0 : key.hashCode()) ^ 
            (value == null ? 0 : value.hashCode()));
}

}//end of class
