/*********************************************************************
*	All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*	システム名		：eo顧客基幹システム
*	モジュール名	：JBSSecureRandom
*	ソースファイル名：JBSSecureRandom.java
*	作成者			：富士通
*	日付			：2011年02月17日
*＜機能概要＞
*	ランダムな文字列を生成する。
*＜修正履歴＞
*	バージョン	修正日		修正者		修正内容
*	v1.00.00	2011/02/17	富士通		新規作成
*
**********************************************************************/
package eo.common.util;

import java.security.SecureRandom;

/**
 * ランダムな文字列の生成を行うクラスです。<p>
 * <br>
 * @author 富士通
 */
public final class JPCSecureRandom extends JPCCommonUtil 
{
	/**
	 * ランダム文字列生成部品クラスを生成する。
	 * <br>
	 */
	public JPCSecureRandom(){
	}

	/**
	 * 指定された桁数範囲内でランダムな英数字の文字列を生成します。
	 * <br>
	 * @param arg0 生成する文字数の最小
	 * @param arg1 生成する文字数の最大
	 * @return String 生成された文字列
	 * @exception IllegalArgumentException 不正な引数が渡された場合。 
	 */
	public String getRandomChar(int arg0, int arg1) 
	{
		if (0 >= arg0) 
		{
			throw new IllegalArgumentException("引数の文字数最小[" + arg0 + "]" + "は不正です。");
		}

		if (0 >= arg1) 
		{
			throw new IllegalArgumentException("引数の文字数最大[" + arg1 + "]" + "は不正です。");
		}

		if (arg0 >= arg1) 
		{
			throw new IllegalArgumentException("引数の文字数の関係が不正です。最小[" + arg0 + "]、最大[" + arg1 + "]");
		}

		// 指定された文字数範囲内でランダムな桁数を取得
		SecureRandom random = new SecureRandom();

		int len = arg0 + (random.nextInt((arg1 + 1) - arg0));

		return getRandomChar(len);
	}

	/**
	 * 指定された桁数でランダムな英数字の文字列を生成します。
	 * <br>
	 * @param arg0 生成する文字数
	 * @return String 生成された文字列
	 * @exception IllegalArgumentException 不正な引数が渡された場合。 
	 */
	public String getRandomChar(int arg0) 
	{
		if (0 >= arg0) 
		{
			throw new IllegalArgumentException("引数の文字数[" + arg0 + "]" + "は不正です。");
		}

		SecureRandom random = new SecureRandom();

		StringBuffer ret = new StringBuffer();

		for (int i = 0; i < arg0; i++) 
		{
			switch (random.nextInt(3)) 
			{
				case 0 :

					// 半角英字小文字[a-z]
					ret.append((char)(97 + random.nextInt(26)));

					break;

				case 1 :

					// 半角英字大文字[A-Z]
					ret.append((char)(65 + random.nextInt(26)));

					break;

				case 2 :

					// 半角数字[0-9]
					ret.append((char)(48 + random.nextInt(10)));

					break;

				default :

					ret.append('a');
			}
		}

		return ret.toString();
	}

	/**
	 * ランダムな数字の文字列を生成します。
	 * <br>
	 * @param arg0 生成する文字数
	 * @return String 生成された文字列
	 * @exception IllegalArgumentException 不正な引数が渡された場合。 
	 */
	public String getRandomNumber(int arg0) 
	{
		if (0 >= arg0) 
		{
			throw new IllegalArgumentException("引数の文字数[" + arg0 + "]" + "は不正です。");
		}

		SecureRandom random = new SecureRandom();

		StringBuffer ret = new StringBuffer();

		for (int i = 0; i < arg0; i++) 
		{
			ret.append((char)(48 + random.nextInt(10)));
		}

		return ret.toString();
	}
}
