/*
このファイルの中身は、NTT オープンソースライセンス　バージョン 1.0（「本
契約」という）の適用を受けます。
本契約を遵守しない限り、このファイルを使用してはなりません。
本契約のコピーは、次のＵＲＬから入手できます。
【配布サイトのURL】 http://www.oss.ecl.ntt.co.jp/lms/

本契約に基づき頒布されるソフトウェアは、現状のまま、明示又は黙示のあらゆ
る種類の保証なしで、頒布されます。本契約に基づく権利及び制限を律する特定
の文言については、本契約を参照してください。

「オリジナルコード」は、 NTT Cyber Space Laboratories Code です。 
「オリジナルコード」の「初期開発者」は、日本電信電話株式会社です。  
日本電信電話株式会社により創作された部分は、Copyright (C) 2004 
日本電信電話株式会社 です。
全ての権利が留保されます。 
「コントリビュータ」：_____________________________________ 


The contents of this file are subject to the NTT Opensource License
Version 1.0 (the License); you may not use this file except in
compliance with the License. You may obtain a copy of the License at
【配布サイトのURL】 http://www.oss.ecl.ntt.co.jp/lms/

Software distributed under the License is distributed on an AS IS
basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the
License for the specific language governing rights and limitations
under the License.

The Original Code is NTT Cyber Space Laboratories Code .

The Initial Developer of the Original Code is NIPPON TELEGRAPH AND 
TELEPHONE CORPORATION.
Portions created by the NIPPON TELEGRAPH AND TELEPHONE CORPORATION 
are Copyright (C) 2004 NIPPON TELEGRAPH AND TELEPHONE CORPORATION. 
All Rights Reserved.

Contributor(s) ______________________________________.
*/

//
// 文字列ユーティリティ・クラス
// 
//
//	変更履歴
//	2004/01/08 新規作成	T.Nishiki
//
package jp.co.ntt.lms.xms.common.util;

import java.util.ArrayList;
import java.util.List;
import java.util.StringTokenizer;

/**
 * 文字列ユーティリティ・クラス。<br>
 * @author T.Nishiki
 */
public final class StringUtil {

	/**
	 * 文字列を分割する。<br>
	 * 
	 * @param str 分割する対象の文字列。
	 * @param delim 分割文字。
	 * @return 分割した各部分文字列を要素とするリスト。<br>
	 *          分割する文字列がない場合、要素が空のリストを戻す。
	 */
	public static List split( String str, String delim ) {
		
		List returnList = null;
		try {
			returnList = new ArrayList();
			StringTokenizer tokenizer = null;
			tokenizer = new StringTokenizer( str, delim );
			while ( tokenizer.hasMoreTokens() ) {
				String token = null;
				token = tokenizer.nextToken();
				returnList.add( token );
			}
		} catch ( Exception e ) {
			returnList = new ArrayList();
		}
		return returnList;
	}
	
	/**
	 * 空文字列を判定する。<br>
	 * @param str 判定対象の文字列。
	 * @return strがnullもしくは空文字列の場合trueを
	 *          それ以外はfalseを戻す。
	 */
	public static boolean isNullString( String str ) {
		return ( (str == null) || (str.length() == 0) );
	}

	/**
	 * 文字列を数値化します。<br>
	 * 数値に変換できた場合はその値を、できない場合はあらかじめ指定した値を戻す。
	 * @param str 数値化する文字列。
	 * @param defaultValue strを数値に変換できなかった場合に返却する値。
	 * @return strを数値に変換した値。変換できない場合はdefaultValue。
	 * @see Integer#parseInt(java.lang.String)
	 */
	public static int parseInt( String str, int defaultValue ) {
		int returnValue = 0;
		try {
			returnValue = Integer.parseInt(str);
		} catch (Exception e) {
			returnValue = defaultValue;
		}
		return returnValue;
	}
	
	/**
	 * 文字列の置換する。<br>
	 * 
	 * @param str 置換する文字列全体。
	 * @param oldStr 置き換え対象として検索する文字列。
	 * @param newStr oldStrから置換する文字列。 
	 * @return strの中からoldStrに該当する個所をnewStrに置換した結果の文字列を戻す。
	 *          strがnullの場合空文字列を戻す。
	 */
	public static String replace( String str, String oldStr, String newStr ) {
		// このメソッドの戻り値
		String retVal = null;
		// retVal生成用
		StringBuffer buffer = null;
		// oldStrによって分割した部分文字列リスト
		List substringList = null;
		// 部分文字列
		String substring = null;
		
		substringList = split( str, oldStr);
		buffer = new StringBuffer();
		for ( int i = 0; i < substringList.size(); i++ ) {
			if ( i > 0 ) {
				buffer.append( newStr );
			}
			substring = (String)substringList.get(i);
			buffer.append(substring);
		}
		retVal = buffer.toString();
		return retVal;
	}

	/**
	 * ＨＴＭＬ用に文字列を置換する。<br>
	 * 以下の表に従い変換します。
	 * <table border="1">
	 *   <tr><td>置換前</td><td>置換後</td></tr>
	 *   <tr><td>&amp;</td><td>&amp;amp;</td></tr>
	 *   <tr><td>&lt;</td><td>&amp;lt;</td></tr>
	 *   <tr><td>&gt;</td><td>&amp;gt;</td></tr>
	 *   <tr><td>&quot;</td><td>&amp;quot;</td></tr>
	 *   <tr><td>連続する半角スペース２文字</td><td>全角スペース</td></tr>
	 * </table>
	 * @param str 変換対象の文字列。
	 * @return 変換後の文字列を戻す。
	 */
	public static String convertForHtml( String str ) {
		String retVal = null;
		retVal = str;
		retVal = convertForForm( str );
		retVal = replace( retVal, "  ", "　" );
		return retVal;
	}

	/**
	 * ＨＴＭＬフォーム用に文字列を置換する。<br>
	 * 以下の表に従い変換します。
	 * <table border="1">
	 *   <tr><td>置換前</td><td>置換後</td></tr>
	 *   <tr><td>&amp;</td><td>&amp;amp;</td></tr>
	 *   <tr><td>&lt;</td><td>&amp;lt;</td></tr>
	 *   <tr><td>&gt;</td><td>&amp;gt;</td></tr>
	 *   <tr><td>&quot;</td><td>&amp;quot;</td></tr>
	 * </table>
	 * @param str 変換対象の文字列。
	 * @return 変換後の文字列を戻す。
	 */
	public static String convertForForm( String str ) {
		String retVal = null;
		retVal = str;
		retVal = replace( retVal, "&", "&amp;" );
		retVal = replace( retVal, ">", "&gt;" );
		retVal = replace( retVal, "<", "&lt;" );
		retVal = replace( retVal, "\"", "&quot;" );
		return retVal;
	}

	/**
	 * JavaScript用に文字列を置換する。<br>
	 * 以下の表に従い変換します。
	 * <table border="1">
	 *   <tr><td>置換前</td><td>置換後</td></tr>
	 *   <tr><td>\</td><td>\\</td></tr>
	 *   <tr><td>'</td><td>\'</td></tr>
	 *   <tr><td>&quot;</td><td>\&quot;</td></tr>
	 * </table>
	 * @param str 変換対象の文字列。
	 * @return 変換後の文字列を戻す。
	 */
	public static String convertForJs( String str ) {
		String retVal = null;
		retVal = str;
		retVal = replace( retVal, "\\", "\\\\" );
		retVal = replace( retVal, "'", "\'" );
		retVal = replace( retVal, "\"", "\\\"" );
		return retVal;
	}
}
