/*
 * Copyright (c) 2003, Morpho Project.
 * All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions are met:
 *
 * 1. Redistributions of source code must retain the above copyright notice,
 *    this list of conditions and the following disclaimer.
 * 2. Redistributions in binary form must reproduce the above copyright notice,
 *    this list of conditions and the following disclaimer in the documentation
 *    and/or other materials provided with the distribution.
 * 3. Neither the name of the Morpho Project nor the names of its contributors
 *    may be used to endorse or promote products derived from this software
 *    without specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
 * POSSIBILITY OF SUCH DAMAGE.
 */
package jp.morpho.util;

import java.io.InputStream;
import java.io.Reader;
import java.io.Serializable;
import java.math.BigDecimal;
import java.math.BigInteger;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;
import java.util.Locale;
import java.util.Map;
import java.util.Vector;

/**
 * <P>
 * PrimitiveHolderList の実装です。
 * プリミティブ型の値を挿入することができます。
 * </P>
 * @author Kumiko Hiroi
 */
public class ConversionList
	extends ListWrapper
	implements PrimitiveHolderList, Serializable
{

	/**
	 * <P>
	 * 指定のリストをラップする ConversionList を構築します。
	 * </P>
	 * @param list ラップされるリスト
	 * @exception IllegalArgumentException リストが null の場合
	 */
	public ConversionList(List list)
	{
		super(list);
	}

	/**
	 * <P>
	 * ConversionList を構築します。
	 * Vector をラップする新しい ConversionList を構築します。
	 * </P>
	 */
	public ConversionList()
	{
		super(new Vector());
	}

	/**
	 * <P>
	 * リスト内の指定された位置にある要素を入力ストリームとして返します。
	 * </P>
	 * @param index 返される要素のインデックス
	 * @return リスト内の指定された位置にある要素
	 * @see jp.morpho.util.PrimitiveHolderList#getInputStream(int)
	 */
	public InputStream getInputStream(int index)
	{
		return (InputStream)get(index);
	}

	/**
	 * <P>
	 * リスト内の指定された位置にある要素を、指定された入力ストリームに置き換えます。
	 * </P>
	 * @param index 置換される要素のインデックス
	 * @param element 指定された位置に格納される要素
	 * @see jp.morpho.util.PrimitiveHolderList#setInputStream(int, java.io.InputStream)
	 */
	public void setInputStream(int index, InputStream element)
	{
		set(index, element);
	}

	/**
	 * <P>
	 * リスト内の指定された位置に、指定された入力ストリームを挿入します。
	 * </P>
	 * @param index 指定の要素が挿入されるインデックス
	 * @param element 挿入される要素
	 * @see jp.morpho.util.PrimitiveHolderList#addInputStream(int, java.io.InputStream)
	 */
	public void addInputStream(int index, InputStream element)
	{
		add(index, element);
	}

	/**
	 * <P>
	 * 指定された入力ストリームをリストの最後に追加します。
	 * </P>
	 * @param element リストに追加される要素
	 * @return この呼び出しの結果、リストが変更された場合は true
	 * @see jp.morpho.util.PrimitiveHolderList#addInputStream(java.io.InputStream)
	 */
	public boolean addInputStream(InputStream element)
	{
		return add(element);
	}

	/**
	 * <P>
	 * リスト内の指定された位置にある要素を java.math.BigDecimal オブジェクトとして返します。
	 * </P>
	 * @param index 返される要素のインデックス
	 * @return リスト内の指定された位置にある要素
	 * @see jp.morpho.util.PrimitiveHolderList#getBigDecimal(int)
	 */
	public BigDecimal getBigDecimal(int index)
	{
		Object obj = get(index);

		if (obj == null)
		{
			return null;
		}

		if (obj instanceof BigDecimal)
		{
			return (BigDecimal)obj;
		}
		else if (obj.toString().trim().length() > 0)
		{
			return new BigDecimal(obj.toString());
		}

		return null;
	}

	/**
	 * <P>
	 * リスト内の指定された位置にある要素を、指定された java.math.BigDecimal オブジェクトに置き換えます。
	 * </P>
	 * @param index 置換される要素のインデックス
	 * @param element 指定された位置に格納される要素
	 * @see jp.morpho.util.PrimitiveHolderList#setBigDecimal(int, java.math.BigDecimal)
	 */
	public void setBigDecimal(int index, BigDecimal element)
	{
		set(index, element);
	}

	/**
	 * <P>
	 * リスト内の指定された位置に、指定された java.math.BigDecimal オブジェクトを挿入します。
	 * </P>
	 * @param index 指定の要素が挿入されるインデックス
	 * @param element 挿入される要素
	 * @see jp.morpho.util.PrimitiveHolderList#addBigDecimal(int, java.math.BigDecimal)
	 */
	public void addBigDecimal(int index, BigDecimal element)
	{
		add(index, element);
	}

	/**
	 * <P>
	 * 指定された java.math.BigDecimal オブジェクトをリストの最後に追加します。
	 * </P>
	 * @param element リストに追加される要素
	 * @return この呼び出しの結果、リストが変更された場合は true
	 * @see jp.morpho.util.PrimitiveHolderList#addBigDecimal(java.math.BigDecimal)
	 */
	public boolean addBigDecimal(BigDecimal element)
	{
		return add(element);
	}

	/**
	 * <P>
	 * リスト内の指定された位置にある要素を java.math.BigInteger オブジェクトとして返します。
	 * </P>
	 * @param index 返される要素のインデックス
	 * @return リスト内の指定された位置にある要素
	 * @see jp.morpho.util.PrimitiveHolderList#getBigInteger(int)
	 */
	public BigInteger getBigInteger(int index)
	{
		Object obj = get(index);

		if (obj == null)
		{
			return null;
		}

		if (obj instanceof BigInteger)
		{
			return (BigInteger)obj;
		}
		else if (obj.toString().trim().length() > 0)
		{
			return new BigInteger(obj.toString());
		}

		return null;
	}

	/**
	 * <P>
	 * リスト内の指定された位置にある要素を、指定された java.math.BigInteger オブジェクトに置き換えます。
	 * </P>
	 * @param index 置換される要素のインデックス
	 * @param element 指定された位置に格納される要素
	 * @see jp.morpho.util.PrimitiveHolderList#setBigInteger(int, java.math.BigInteger)
	 */
	public void setBigInteger(int index, BigInteger element)
	{
		set(index, element);
	}

	/**
	 * <P>
	 * リスト内の指定された位置に、指定された java.math.BigInteger オブジェクトを挿入します。
	 * </P>
	 * @param index 指定の要素が挿入されるインデックス
	 * @param element 挿入される要素
	 * @see jp.morpho.util.PrimitiveHolderList#addBigInteger(int, java.math.BigInteger)
	 */
	public void addBigInteger(int index, BigInteger element)
	{
		add(index, element);
	}

	/**
	 * <P>
	 * 指定された java.math.BigInteger オブジェクトをリストの最後に追加します。
	 * </P>
	 * @param element リストに追加される要素
	 * @return この呼び出しの結果、リストが変更された場合は true
	 * @see jp.morpho.util.PrimitiveHolderList#addBigInteger(java.math.BigInteger)
	 */
	public boolean addBigInteger(BigInteger element)
	{
		return add(element);
	}

	/**
	 * <P>
	 * リスト内の指定された位置にある要素を Java プログラミング言語の boolean として返します。
	 * </P>
	 * @param index 返される要素のインデックス
	 * @return リスト内の指定された位置にある要素
	 * @see jp.morpho.util.PrimitiveHolderList#getBoolean(int)
	 */
	public boolean getBoolean(int index)
	{
		Object obj = get(index);

		if (obj == null)
		{
			return false;
		}

		if (obj instanceof Boolean)
		{
			return ((Boolean)obj).booleanValue();
		}
		else
		{
			return Boolean.valueOf(obj.toString()).booleanValue();
		}
	}

	/**
	 * <P>
	 * リスト内の指定された位置にある要素を、指定された boolean 値に置き換えます。
	 * </P>
	 * @param index 置換される要素のインデックス
	 * @param element 指定された位置に格納される要素
	 * @see jp.morpho.util.PrimitiveHolderList#setBoolean(int, boolean)
	 */
	public void setBoolean(int index, boolean element)
	{
		set(index, new Boolean(element));
	}

	/**
	 * <P>
	 * リスト内の指定された位置に、指定された boolean 値を挿入します。
	 * </P>
	 * @param index 指定の要素が挿入されるインデックス
	 * @param element 挿入される要素
	 * @see jp.morpho.util.PrimitiveHolderList#addBoolean(int, boolean)
	 */
	public void addBoolean(int index, boolean element)
	{
		add(index, new Boolean(element));
	}

	/**
	 * <P>
	 * 指定された boolean 値をリストの最後に追加します。
	 * </P>
	 * @param element リストに追加される要素
	 * @return この呼び出しの結果、リストが変更された場合は true
	 * @see jp.morpho.util.PrimitiveHolderList#addBoolean(boolean)
	 */
	public boolean addBoolean(boolean element)
	{
		return add(new Boolean(element));
	}

	/**
	 * <P>
	 * リスト内の指定された位置にある要素を Java プログラミング言語の byte として返します。
	 * </P>
	 * @param index 返される要素のインデックス
	 * @return リスト内の指定された位置にある要素
	 * @see jp.morpho.util.PrimitiveHolderList#getByte(int)
	 */
	public byte getByte(int index)
	{
		Object obj = get(index);

		if (obj == null)
		{
			return 0;
		}

		if (obj instanceof Byte)
		{
			return ((Byte)obj).byteValue();
		}
		else if (obj.toString().trim().length() > 0)
		{
			return Byte.valueOf(obj.toString()).byteValue();
		}

		return 0;
	}

	/**
	 * <P>
	 * リスト内の指定された位置にある要素を、指定された byte 値に置き換えます。
	 * </P>
	 * @param index 置換される要素のインデックス
	 * @param element 指定された位置に格納される要素
	 * @see jp.morpho.util.PrimitiveHolderList#setByte(int, byte)
	 */
	public void setByte(int index, byte element)
	{
		set(index, new Byte(element));
	}

	/**
	 * <P>
	 * リスト内の指定された位置に、指定された byte 値を挿入します。
	 * </P>
	 * @param index 指定の要素が挿入されるインデックス
	 * @param element 挿入される要素
	 * @see jp.morpho.util.PrimitiveHolderList#addByte(int, byte)
	 */
	public void addByte(int index, byte element)
	{
		add(index, new Byte(element));
	}

	/**
	 * <P>
	 * 指定された byte 値をリストの最後に追加します。
	 * </P>
	 * @param element リストに追加される要素
	 * @return この呼び出しの結果、リストが変更された場合は true
	 * @see jp.morpho.util.PrimitiveHolderList#addByte(byte)
	 */
	public boolean addByte(byte element)
	{
		return add(new Byte(element));
	}

	/**
	 * <P>
	 * リスト内の指定された位置にある要素を Java プログラミング言語の byte 配列として返します。
	 * </P>
	 * @param index 返される要素のインデックス
	 * @return リスト内の指定された位置にある要素
	 * @see jp.morpho.util.PrimitiveHolderList#getBytes(int)
	 */
	public byte[] getBytes(int index)
	{
		return (byte[])get(index);
	}

	/**
	 * <P>
	 * リスト内の指定された位置にある要素を、指定された byte 配列に置き換えます。
	 * </P>
	 * @param index 置換される要素のインデックス
	 * @param element 指定された位置に格納される要素
	 * @see jp.morpho.util.PrimitiveHolderList#setBytes(int, byte[])
	 */
	public void setBytes(int index, byte[] element)
	{
		set(index, element);
	}

	/**
	 * <P>
	 * リスト内の指定された位置に、指定された byte 配列を挿入します。
	 * </P>
	 * @param index 指定の要素が挿入されるインデックス
	 * @param element 挿入される要素
	 * @see jp.morpho.util.PrimitiveHolderList#addBytes(int, byte[])
	 */
	public void addBytes(int index, byte[] element)
	{
		add(index, element);
	}

	/**
	 * <P>
	 * 指定された byte 配列をリストの最後に追加します。
	 * </P>
	 * @param element リストに追加される要素
	 * @return この呼び出しの結果、リストが変更された場合は true
	 * @see jp.morpho.util.PrimitiveHolderList#addBytes(byte[])
	 */
	public boolean addBytes(byte[] element)
	{
		return add(element);
	}

	/**
	 * <P>
	 * リスト内の指定された位置にある要素を Java プログラミング言語の char として返します。
	 * </P>
	 * @param index 返される要素のインデックス
	 * @return リスト内の指定された位置にある要素
	 * @see jp.morpho.util.PrimitiveHolderList#getChar(int)
	 */
	public char getChar(int index)
	{
		Object obj = get(index);

		if (obj == null)
		{
			return 0;
		}

		if (obj instanceof Character)
		{
			return ((Character)obj).charValue();
		}
		else if (obj.toString().trim().length() > 0)
		{
			return obj.toString().toCharArray()[0];
		}

		return 0;
	}

	/**
	 * <P>
	 * リスト内の指定された位置にある要素を、指定された char 値に置き換えます。
	 * </P>
	 * @param index 置換される要素のインデックス
	 * @param element 指定された位置に格納される要素
	 * @see jp.morpho.util.PrimitiveHolderList#setChar(int, char)
	 */
	public void setChar(int index, char element)
	{
		set(index, new Character(element));
	}

	/**
	 * <P>
	 * リスト内の指定された位置に、指定された char 値を挿入します。
	 * </P>
	 * @param index 指定の要素が挿入されるインデックス
	 * @param element 挿入される要素
	 * @see jp.morpho.util.PrimitiveHolderList#addChar(int, char)
	 */
	public void addChar(int index, char element)
	{
		add(index, new Character(element));
	}

	/**
	 * <P>
	 * 指定された char 値をリストの最後に追加します。
	 * </P>
	 * @param element リストに追加される要素
	 * @return この呼び出しの結果、リストが変更された場合は true
	 * @see jp.morpho.util.PrimitiveHolderList#addChar(char)
	 */
	public boolean addChar(char element)
	{
		return add(new Character(element));
	}

	/**
	 * <P>
	 * リスト内の指定された位置にある要素を java.io.Reader オブジェクトとして返します。
	 * </P>
	 * @param index 返される要素のインデックス
	 * @return リスト内の指定された位置にある要素
	 * @see jp.morpho.util.PrimitiveHolderList#getReader(int)
	 */
	public Reader getReader(int index)
	{
		return (Reader)get(index);
	}

	/**
	 * <P>
	 * リスト内の指定された位置にある要素を、指定された java.io.Reader オブジェクトに置き換えます。
	 * </P>
	 * @param index 置換される要素のインデックス
	 * @param element 指定された位置に格納される要素
	 * @see jp.morpho.util.PrimitiveHolderList#setReader(int, java.io.Reader)
	 */
	public void setReader(int index, Reader element)
	{
		set(index, element);
	}

	/**
	 * <P>
	 * リスト内の指定された位置に、指定された java.io.Reader オブジェクトを挿入します。
	 * </P>
	 * @param index 指定の要素が挿入されるインデックス
	 * @param element 挿入される要素
	 * @see jp.morpho.util.PrimitiveHolderList#addReader(int, java.io.Reader)
	 */
	public void addReader(int index, Reader element)
	{
		add(index, element);
	}

	/**
	 * <P>
	 * 指定された java.io.Reader オブジェクトをリストの最後に追加します。
	 * </P>
	 * @param element リストに追加される要素
	 * @return この呼び出しの結果、リストが変更された場合は true
	 * @see jp.morpho.util.PrimitiveHolderList#addReader(java.io.Reader)
	 */
	public boolean addReader(Reader element)
	{
		return add(element);
	}

	/**
	 * <P>
	 * リスト内の指定された位置にある要素を java.util.Date オブジェクトとして返します。
	 * </P>
	 * @param index 返される要素のインデックス
	 * @return リスト内の指定された位置にある要素
	 * @see jp.morpho.util.PrimitiveHolderList#getDate(int)
	 */
	public Date getDate(int index)
	{
		Object obj = get(index);

		if (obj == null)
		{
			return null;
		}

		if (obj instanceof java.sql.Timestamp)
		{
			//java.sql.Timestamp オブジェクトの場合
			return new java.util.Date(((java.sql.Timestamp)obj).getTime());
		}
		else if (obj instanceof java.sql.Date)
		{
			//java.sql.Date オブジェクトの場合
			return new java.util.Date(((java.sql.Date)obj).getTime());
		}
		else if (obj instanceof java.sql.Time)
		{
			//java.sql.Time オブジェクトの場合
			return new java.util.Date(((java.sql.Time)obj).getTime());
		}
		else if (obj instanceof java.util.Date)
		{
			//java.util.Date オブジェクトの場合
			return (java.util.Date)obj;
		}
		else
		{
			//java.sql.Timestamp の文字列表現の場合
			try
			{
				return new java.util.Date(java.sql.Timestamp.valueOf(obj.toString()).getTime());
			}
			catch (Exception e)
			{
			}

			//java.sql.Date の文字列表現の場合
			try
			{
				return new java.util.Date(java.sql.Date.valueOf(obj.toString()).getTime());
			}
			catch (Exception e)
			{
			}

			//java.sql.Time の文字列表現の場合
			try
			{
				return new java.util.Date(java.sql.Time.valueOf(obj.toString()).getTime());
			}
			catch (Exception e)
			{
			}

			//java.util.Date の文字列表現の場合
			try
			{
				return new SimpleDateFormat(
					"EEE MMM dd HH:mm:ss zzz yyyy",
					Locale.US).parse(obj.toString());
			}
			catch (Exception e)
			{
			}

			//日付/時刻の文字列表現の場合
			try
			{
				return DateFormat.getDateTimeInstance().parse(obj.toString());
			}
			catch (Exception e)
			{
			}

			//日付の文字列表現の場合
			try
			{
				return DateFormat.getDateInstance().parse(obj.toString());
			}
			catch (Exception e)
			{
			}

			//時刻の文字列表現の場合
			try
			{
				return DateFormat.getTimeInstance().parse(obj.toString());
			}
			catch (Exception e)
			{
			}
		}

		return null;
	}

	/**
	 * <P>
	 * リスト内の指定された位置にある要素の文字列表現を pattern で指定した日付／時刻パターンで解析して、java.util.Date オブジェクトとして返します。
	 * </P>
	 * @param index 返される要素のインデックス
	 * @param pattern 日付／時刻パターン
	 * @return リスト内の指定された位置にある要素
	 * @see jp.morpho.util.PrimitiveHolderList#parseDate(int, java.lang.String)
	 */
	public Date parseDate(int index, String pattern)
	{
		Object obj = get(index);

		if (obj == null)
		{
			return null;
		}

		try
		{
			return new SimpleDateFormat(pattern).parse(obj.toString());
		}
		catch (ParseException e)
		{
		}

		return null;
	}

	/**
	 * <P>
	 * リスト内の指定された位置にある要素を、指定された java.util.Date 値に置き換えます。
	 * </P>
	 * @param index 置換される要素のインデックス
	 * @param element 指定された位置に格納される要素
	 * @see jp.morpho.util.PrimitiveHolderList#setDate(int, java.util.Date)
	 */
	public void setDate(int index, Date element)
	{
		set(index, element);
	}

	/**
	 * <P>
	 * リスト内の指定された位置に、指定された java.util.Date 値を挿入します。
	 * </P>
	 * @param index 指定の要素が挿入されるインデックス
	 * @param element 挿入される要素
	 * @see jp.morpho.util.PrimitiveHolderList#addDate(int, java.util.Date)
	 */
	public void addDate(int index, Date element)
	{
		add(index, element);
	}

	/**
	 * <P>
	 * 指定された java.util.Date 値をリストの最後に追加します。
	 * </P>
	 * @param element リストに追加される要素
	 * @return この呼び出しの結果、リストが変更された場合は true
	 * @see jp.morpho.util.PrimitiveHolderList#addDate(java.util.Date)
	 */
	public boolean addDate(Date element)
	{
		return add(element);
	}

	/**
	 * <P>
	 * リスト内の指定された位置にある要素を Java プログラミング言語の double として返します。
	 * </P>
	 * @param index 返される要素のインデックス
	 * @return リスト内の指定された位置にある要素
	 * @see jp.morpho.util.PrimitiveHolderList#getDouble(int)
	 */
	public double getDouble(int index)
	{
		Object obj = get(index);

		if (obj == null)
		{
			return 0;
		}

		if (obj instanceof Double)
		{
			return ((Double)obj).doubleValue();
		}
		else if (obj.toString().trim().length() > 0)
		{
			return Double.valueOf(obj.toString()).doubleValue();
		}

		return 0;
	}

	/**
	 * <P>
	 * リスト内の指定された位置にある要素を、指定された double 値に置き換えます。
	 * </P>
	 * @param index 置換される要素のインデックス
	 * @param element 指定された位置に格納される要素
	 * @see jp.morpho.util.PrimitiveHolderList#setDouble(int, double)
	 */
	public void setDouble(int index, double element)
	{
		set(index, new Double(element));
	}

	/**
	 * <P>
	 * リスト内の指定された位置に、指定された double 値を挿入します。
	 * </P>
	 * @param index 指定の要素が挿入されるインデックス
	 * @param element 挿入される要素
	 * @see jp.morpho.util.PrimitiveHolderList#addDouble(int, double)
	 */
	public void addDouble(int index, double element)
	{
		add(index, new Double(element));
	}

	/**
	 * <P>
	 * 指定された double 値をリストの最後に追加します。
	 * </P>
	 * @param element リストに追加される要素
	 * @return この呼び出しの結果、リストが変更された場合は true
	 * @see jp.morpho.util.PrimitiveHolderList#addDouble(double)
	 */
	public boolean addDouble(double element)
	{
		return add(new Double(element));
	}

	/**
	 * <P>
	 * リスト内の指定された位置にある要素を Java プログラミング言語の float として返します。
	 * </P>
	 * @param index 返される要素のインデックス
	 * @return リスト内の指定された位置にある要素
	 * @see jp.morpho.util.PrimitiveHolderList#getFloat(int)
	 */
	public float getFloat(int index)
	{
		Object obj = get(index);

		if (obj == null)
		{
			return 0;
		}

		if (obj instanceof Float)
		{
			return ((Float)obj).floatValue();
		}
		else if (obj.toString().trim().length() > 0)
		{
			return Double.valueOf(obj.toString()).floatValue();
		}

		return 0;
	}

	/**
	 * <P>
	 * リスト内の指定された位置にある要素を、指定された float 値に置き換えます。
	 * </P>
	 * @param index 置換される要素のインデックス
	 * @param element 指定された位置に格納される要素
	 * @see jp.morpho.util.PrimitiveHolderList#setFloat(int, float)
	 */
	public void setFloat(int index, float element)
	{
		set(index, new Float(element));
	}

	/**
	 * <P>
	 * リスト内の指定された位置に、指定された float 値を挿入します。
	 * </P>
	 * @param index 指定の要素が挿入されるインデックス
	 * @param element 挿入される要素
	 * @see jp.morpho.util.PrimitiveHolderList#addFloat(int, float)
	 */
	public void addFloat(int index, float element)
	{
		add(index, new Float(element));
	}

	/**
	 * <P>
	 * 指定された float 値をリストの最後に追加します。
	 * </P>
	 * @param element リストに追加される要素
	 * @return この呼び出しの結果、リストが変更された場合は true
	 * @see jp.morpho.util.PrimitiveHolderList#addFloat(float)
	 */
	public boolean addFloat(float element)
	{
		return add(new Float(element));
	}

	/**
	 * <P>
	 * リスト内の指定された位置にある要素を Java プログラミング言語の int として返します。
	 * </P>
	 * @param index 返される要素のインデックス
	 * @return リスト内の指定された位置にある要素
	 * @see jp.morpho.util.PrimitiveHolderList#getInt(int)
	 */
	public int getInt(int index)
	{
		Object obj = get(index);

		if (obj == null)
		{
			return 0;
		}

		if (obj instanceof Integer)
		{
			return ((Integer)obj).intValue();
		}
		else if (obj.toString().trim().length() > 0)
		{
			return Double.valueOf(obj.toString()).intValue();
		}

		return 0;
	}

	/**
	 * <P>
	 * リスト内の指定された位置にある要素を、指定された int 値に置き換えます。
	 * </P>
	 * @param index 置換される要素のインデックス
	 * @param element 指定された位置に格納される要素
	 * @see jp.morpho.util.PrimitiveHolderList#setInt(int, int)
	 */
	public void setInt(int index, int element)
	{
		set(index, new Integer(element));
	}

	/**
	 * <P>
	 * リスト内の指定された位置に、指定された int 値を挿入します。
	 * </P>
	 * @param index 指定の要素が挿入されるインデックス
	 * @param element 挿入される要素
	 * @see jp.morpho.util.PrimitiveHolderList#addInt(int, int)
	 */
	public void addInt(int index, int element)
	{
		add(index, new Integer(element));
	}

	/**
	 * <P>
	 * 指定された int 値をリストの最後に追加します。
	 * </P>
	 * @param element リストに追加される要素
	 * @return この呼び出しの結果、リストが変更された場合は true
	 * @see jp.morpho.util.PrimitiveHolderList#addInt(int)
	 */
	public boolean addInt(int element)
	{
		return add(new Integer(element));
	}

	/**
	 * <P>
	 * リスト内の指定された位置にある要素を Java プログラミング言語の long として返します。
	 * </P>
	 * @param index 返される要素のインデックス
	 * @return リスト内の指定された位置にある要素
	 * @see jp.morpho.util.PrimitiveHolderList#getLong(int)
	 */
	public long getLong(int index)
	{
		Object obj = get(index);

		if (obj == null)
		{
			return 0;
		}

		if (obj instanceof Long)
		{
			return ((Long)obj).longValue();
		}
		else if (obj.toString().trim().length() > 0)
		{
			return Double.valueOf(obj.toString()).longValue();
		}

		return 0;
	}

	/**
	 * <P>
	 * リスト内の指定された位置にある要素を、指定された long 値に置き換えます。
	 * </P>
	 * @param index 置換される要素のインデックス
	 * @param element 指定された位置に格納される要素
	 * @see jp.morpho.util.PrimitiveHolderList#setLong(int, long)
	 */
	public void setLong(int index, long element)
	{
		set(index, new Long(element));
	}

	/**
	 * <P>
	 * リスト内の指定された位置に、指定された long 値を挿入します。
	 * </P>
	 * @param index 指定の要素が挿入されるインデックス
	 * @param element 挿入される要素
	 * @see jp.morpho.util.PrimitiveHolderList#addLong(int, long)
	 */
	public void addLong(int index, long element)
	{
		add(index, new Long(element));
	}

	/**
	 * <P>
	 * 指定された long 値をリストの最後に追加します。
	 * </P>
	 * @param element リストに追加される要素
	 * @return この呼び出しの結果、リストが変更された場合は true
	 * @see jp.morpho.util.PrimitiveHolderList#addLong(long)
	 */
	public boolean addLong(long element)
	{
		return add(new Long(element));
	}

	/**
	 * <P>
	 * リスト内の指定された位置にある要素を Java プログラミング言語の Object として返します。
	 * </P>
	 * @param index 返される要素のインデックス
	 * @return リスト内の指定された位置にある要素
	 * @see jp.morpho.util.PrimitiveHolderList#getObject(int)
	 */
	public Object getObject(int index)
	{
		return get(index);
	}

	/**
	 * <P>
	 * リスト内の指定された位置にある要素を、指定された Object 値に置き換えます。
	 * </P>
	 * @param index 置換される要素のインデックス
	 * @param element 指定された位置に格納される要素
	 * @see jp.morpho.util.PrimitiveHolderList#setObject(int, java.lang.Object)
	 */
	public void setObject(int index, Object element)
	{
		set(index, element);
	}

	/**
	 * <P>
	 * リスト内の指定された位置に、指定された Object 値を挿入します。
	 * </P>
	 * @param index 指定の要素が挿入されるインデックス
	 * @param element 挿入される要素
	 * @see jp.morpho.util.PrimitiveHolderList#addObject(int, java.lang.Object)
	 */
	public void addObject(int index, Object element)
	{
		add(index, element);
	}

	/**
	 * <P>
	 * 指定された Object 値をリストの最後に追加します。
	 * </P>
	 * @param element リストに追加される要素
	 * @return この呼び出しの結果、リストが変更された場合は true
	 * @see jp.morpho.util.PrimitiveHolderList#addObject(java.lang.Object)
	 */
	public boolean addObject(Object element)
	{
		return add(element);
	}

	/**
	 * <P>
	 * リスト内の指定された位置にある要素を Java プログラミング言語の short として返します。
	 * </P>
	 * @param index 返される要素のインデックス
	 * @return リスト内の指定された位置にある要素
	 * @see jp.morpho.util.PrimitiveHolderList#getShort(int)
	 */
	public short getShort(int index)
	{
		Object obj = get(index);

		if (obj == null)
		{
			return 0;
		}

		if (obj instanceof Short)
		{
			return ((Short)obj).shortValue();
		}
		else if (obj.toString().trim().length() > 0)
		{
			return Double.valueOf(obj.toString()).shortValue();
		}

		return 0;
	}

	/**
	 * <P>
	 * リスト内の指定された位置にある要素を、指定された short 値に置き換えます。
	 * </P>
	 * @param index 置換される要素のインデックス
	 * @param element 指定された位置に格納される要素
	 * @see jp.morpho.util.PrimitiveHolderList#setShort(int, short)
	 */
	public void setShort(int index, short element)
	{
		set(index, new Short(element));
	}

	/**
	 * <P>
	 * リスト内の指定された位置に、指定された short 値を挿入します。
	 * </P>
	 * @param index 指定の要素が挿入されるインデックス
	 * @param element 挿入される要素
	 * @see jp.morpho.util.PrimitiveHolderList#addShort(int, short)
	 */
	public void addShort(int index, short element)
	{
		add(index, new Short(element));
	}

	/**
	 * <P>
	 * 指定された short 値をリストの最後に追加します。
	 * </P>
	 * @param element リストに追加される要素
	 * @return この呼び出しの結果、リストが変更された場合は true
	 * @see jp.morpho.util.PrimitiveHolderList#addShort(short)
	 */
	public boolean addShort(short element)
	{
		return add(new Short(element));
	}

	/**
	 * <P>
	 * リスト内の指定された位置にある要素を Java プログラミング言語の String として返します。
	 * </P>
	 * @param index 返される要素のインデックス
	 * @return リスト内の指定された位置にある要素
	 * @see jp.morpho.util.PrimitiveHolderList#getString(int)
	 */
	public String getString(int index)
	{
		Object obj = get(index);

		if (obj == null)
		{
			return null;
		}

		if (obj instanceof String)
		{
			return (String)obj;
		}
		else
		{
			return obj.toString();
		}
	}

	/**
	 * <P>
	 * リスト内の指定された位置にある要素を、指定された String 値に置き換えます。
	 * </P>
	 * @param index 置換される要素のインデックス
	 * @param element 指定された位置に格納される要素
	 * @see jp.morpho.util.PrimitiveHolderList#setString(int, java.lang.String)
	 */
	public void setString(int index, String element)
	{
		set(index, element);
	}

	/**
	 * <P>
	 * リスト内の指定された位置に、指定された String 値を挿入します。
	 * </P>
	 * @param index 指定の要素が挿入されるインデックス
	 * @param element 挿入される要素
	 * @see jp.morpho.util.PrimitiveHolderList#addString(int, java.lang.String)
	 */
	public void addString(int index, String element)
	{
		add(index, element);
	}

	/**
	 * <P>
	 * 指定された String 値をリストの最後に追加します。
	 * </P>
	 * @param element リストに追加される要素
	 * @return この呼び出しの結果、リストが変更された場合は true
	 * @see jp.morpho.util.PrimitiveHolderList#addString(java.lang.String)
	 */
	public boolean addString(String element)
	{
		return add(element);
	}

	/**
	 * <P>
	 * リスト内の指定された位置にある要素を java.util.List として返します。
	 * </P>
	 * @param index 返される要素のインデックス
	 * @return リスト内の指定された位置にある要素
	 * @see jp.morpho.util.PrimitiveHolderList#getList(int)
	 */
	public List getList(int index)
	{
		return (List)get(index);
	}

	/**
	 * <P>
	 * リスト内の指定された位置にある要素を、指定された java.util.List に置き換えます。
	 * </P>
	 * @param index 置換される要素のインデックス
	 * @param element 指定された位置に格納される要素
	 * @see jp.morpho.util.PrimitiveHolderList#setList(int, java.util.List)
	 */
	public void setList(int index, List element)
	{
		set(index, element);
	}

	/**
	 * <P>
	 * リスト内の指定された位置に、指定された java.util.List を挿入します。
	 * </P>
	 * @param index 指定の要素が挿入されるインデックス
	 * @param element 挿入される要素
	 * @see jp.morpho.util.PrimitiveHolderList#addList(int, java.util.List)
	 */
	public void addList(int index, List element)
	{
		add(index, element);
	}

	/**
	 * <P>
	 * 指定された java.util.List をリストの最後に追加します。
	 * </P>
	 * @param element リストに追加される要素
	 * @return この呼び出しの結果、リストが変更された場合は true
	 * @see jp.morpho.util.PrimitiveHolderList#addList(java.util.List)
	 */
	public boolean addList(List element)
	{
		return add(element);
	}

	/**
	 * <P>
	 * リスト内の指定された位置にある要素を java.util.Map として返します。
	 * </P>
	 * @param index 返される要素のインデックス
	 * @return リスト内の指定された位置にある要素
	 * @see jp.morpho.util.PrimitiveHolderList#getMap(int)
	 */
	public Map getMap(int index)
	{
		return (Map)get(index);
	}

	/**
	 * <P>
	 * リスト内の指定された位置にある要素を、指定された java.util.Map に置き換えます。
	 * </P>
	 * @param index 置換される要素のインデックス
	 * @param element 指定された位置に格納される要素
	 * @see jp.morpho.util.PrimitiveHolderList#setMap(int, java.util.Map)
	 */
	public void setMap(int index, Map element)
	{
		set(index, element);
	}

	/**
	 * <P>
	 * リスト内の指定された位置に、指定された java.util.Map を挿入します。
	 * </P>
	 * @param index 指定の要素が挿入されるインデックス
	 * @param element 挿入される要素
	 * @see jp.morpho.util.PrimitiveHolderList#addMap(int, java.util.Map)
	 */
	public void addMap(int index, Map element)
	{
		add(index, element);
	}

	/**
	 * <P>
	 * 指定された java.util.Map をリストの最後に追加します。
	 * </P>
	 * @param element リストに追加される要素
	 * @return この呼び出しの結果、リストが変更された場合は true
	 * @see jp.morpho.util.PrimitiveHolderList#addMap(java.util.Map)
	 */
	public boolean addMap(Map element)
	{
		return add(element);
	}

	/**
	 * <P>
	 * 新しい ConversionList を構築して、指定のリストからすべての要素を構築した新しい  ConversionList にコピーします。
	 * 指定のマップが ConversionList の場合は、それを返します。
	 * </P>
	 * @param list 新しく構築される ConversionList に格納されるリスト
	 * @return ConversionList
	 */
	public synchronized static ConversionList valueOf(List list)
	{
		if (list instanceof ConversionList)
		{
			return (ConversionList)list;
		}
		else
		{
			return new ConversionList(list);
		}
	}

}
