/*
 * BooleanUtil.java
 * 
 * Author: http://www.hrtdotnet.jp/
 * 
 */
package jp.hrtdotnet.java.util;

/**
 * Boolean関連のユーティリティクラスです。
 * 
 * @version 2.0
 * @author hrtdotnet.jp
 * <br>http://www.hrtdotnet.jp/
 * @since 2.0
 */
public class BooleanUtil {

    /**
     * 文字列をboolean型に変換します。
     * 文字列にboolean以外が指定された場合は、指定したデフォルト値を取得します。
     * 
     * @param str boolean型に変換する文字列
     * @param defaultValue デフォルト値、boolean型以外が指定された場合に返すboolean値
     * @return 変換したboolean値
     * @since 2.0
     */
    public static boolean toBoolean(String str, boolean defaultValue){
        return BooleanUtil.toBool(str, new Boolean(defaultValue)).booleanValue();
    }

    /**
     * 小文字の文字列をboolean型に変換します。
     * 文字列は小文字 の「true」,「false」のいずれかでなければなりません。
     * 文字列に小文字のboolean型以外が指定された場合は、指定したデフォルト値を取得します。
     * 
     * @param str boolean型に変換する文字列
     * @param defaultValue デフォルト値、boolean型以外が指定された場合に返すboolean値
     * @return 変換したboolean値
     * @since 2.0
     */
    public static boolean toBooleanLowerCase(String str, boolean defaultValue){
        return BooleanUtil.toBoolLowerCase(str, new Boolean(defaultValue)).booleanValue();
    }

    /**
     * 文字列をboolean型に変換します。
     * 文字列は大文字 の「TRUE」,「FALSE」のいずれかでなければなりません。
     * 文字列に大文字のboolean以外が指定された場合は、指定したデフォルト値を取得します。
     * 
     * @param str boolean型に変換する文字列
     * @param defaultValue デフォルト値、boolean型以外が指定された場合に返すboolean値
     * @return 変換したboolean値
     * @since 2.0
     */
    public static boolean toBooleanUpperCase(String str, boolean defaultValue){
        return BooleanUtil.toBoolUpperCase(str, new Boolean(defaultValue)).booleanValue();
    }

    /**
     * 文字列をboolean型に変換します。
     * 
     * @param str boolean型に変換する文字列
     * @return 変換したboolean値
     * @throws IllegalArgumentException
     *          boolean値に変換できない場合
     * @since 2.0
     */
    public static boolean toBoolean(String str) throws IllegalArgumentException {
        return BooleanUtil.toBool(str).booleanValue();
    }

    /**
     * 文字列をboolean型に変換します。
     * 文字列は小文字 の「true」,「false」のいずれかでなければなりません。
     * 
     * @param str boolean型に変換する文字列
     * @return 変換したboolean値
     * @throws IllegalArgumentException
     *          boolean値に変換できない場合
     * @since 2.0
     */
    public static boolean toBooleanLowerCase(String str) throws IllegalArgumentException {
        return BooleanUtil.toBoolLowerCase(str).booleanValue();
    }

    /**
     * 文字列をboolean型に変換します。
     * 文字列は大文字 の"TRUE","FALSE"のいずれかでなければなりません。
     * 
     * @param str boolean型に変換する文字列
     * @return 変換したboolean値
     * @throws IllegalArgumentException
     *          boolean値に変換できない場合
     * @since 2.0
     */
    public static boolean toBooleanUpperCase(String str) throws IllegalArgumentException {
        return BooleanUtil.toBoolUpperCase(str).booleanValue();
    }

    /**
     * 文字列をBoolean型に変換します。
     * 文字列がBoolean型に変換できなかった場合は、指定したデフォルト値を取得します。
     * 
     * @param str Boolean型に変換する文字列
     * @param defaultValue デフォルト値、Booleanに変換できなかった場合に返すBooleanオブジェクト
     * @return 変換したBoolean型
     * @since 2.0
     */
    public static Boolean toBool(String str, Boolean defaultValue) throws IllegalArgumentException {
        if(BooleanUtil.isBoolean(str) == false){
            return defaultValue;
        }
        return new Boolean(str.toLowerCase());
    }

    /**
     * 文字列をBoolean型に変換します。
     * 文字列がBoolean型に変換できなかった場合は、指定したデフォルト値を取得します。
     * 
     * @param str Boolean型に変換する文字列
     * @param defaultValue デフォルト値、Booleanに変換できなかった場合に返すBooleanオブジェクト
     * @return 変換したBoolean型
     * @since 2.0
     */
    public static Boolean toBoolLowerCase(String str, Boolean defaultValue) throws IllegalArgumentException {
        if(BooleanUtil.isBooleanLowerCase(str) == false){
            return defaultValue;
        }
        return new Boolean(str);
    }

    /**
     * 文字列をBoolean型に変換します。
     * 文字列がBoolean型に変換できなかった場合は、指定したデフォルト値を取得します。
     * 
     * @param str Boolean型に変換する文字列
     * @param defaultValue デフォルト値、Booleanに変換できなかった場合に返すBooleanオブジェクト
     * @return 変換したBoolean型
     * @since 2.0
     */
    public static Boolean toBoolUpperCase(String str, Boolean defaultValue) throws IllegalArgumentException {
        if(BooleanUtil.isBooleanUpperCase(str) == false){
            return defaultValue;
        }
        return new Boolean(str.toLowerCase());
    }

    /**
     * 文字列をBoolean型に変換します。
     * 
     * @param str Boolean型に変換する文字列
     * @return 変換したBoolean型
     * @throws IllegalArgumentException
     *          Boolean型に変換できなかった場合
     * @since 2.0
     */
    public static Boolean toBool(String str) throws IllegalArgumentException {
        if(BooleanUtil.isBoolean(str) == false){
            throw new IllegalArgumentException("Argument is not a boolean-type : " + str);
        }
        return new Boolean(str.toLowerCase());
    }

    /**
     * 文字列をBoolean型に変換します。
     * 
     * @param str Boolean型に変換する文字列
     * @return 変換したBoolean型
     * @throws IllegalArgumentException
     *          Boolean型に変換できなかった場合
     * @since 2.0
     */
    public static Boolean toBoolLowerCase(String str) {
        if(BooleanUtil.isBooleanLowerCase(str) == false){
            throw new IllegalArgumentException("Argument(str) is not a boolean-type.");
        }
        return new Boolean(str);
    }

    /**
     * 文字列をBoolean型に変換します。
     * 
     * @param str Boolean型に変換する文字列
     * @return 変換したBoolean型
     * @throws IllegalArgumentException
     *          Boolean型に変換できなかった場合
     * @since 2.0
     */
    public static Boolean toBoolUpperCase(String str) {
        if(BooleanUtil.isBooleanUpperCase(str) == false){
            throw new IllegalArgumentException("Argument(str) is not a boolean-type.");
        }
        return new Boolean(str.toLowerCase());
    }

    /**
     * 大小区別なしで文字列が、boolean値を示す値かどうかの判定します。
     * boolean値は「true」,「false」の大小区別なしの半角文字列です。
     * 
     * @param str 判定する文字列
     * @return boolean boolean型であればtrue、それ以外ならfalse
     * @since 2.0
     */
    public static boolean isBoolean(String str) {
        if(str == null){
            return false;
        }
        str = str.toLowerCase();
        if (str.equals("true") || str.equals("false")) {
            return true;
        }        
        return false;
    }

    /**
     * 小文字の文字列が、boolean値を示す値かどうかの判定します。
     * boolean値は「true」,「false」の小文字の半角文字列です。
     * 
     * @param str 判定する文字列
     * @return boolean 小文字のboolean型であればtrue、それ以外ならfalse
     * @since 2.0
     */
    public static boolean isBooleanLowerCase(String str) {
        if(str == null){
            return false;
        }
        if ("true".equals(str) || "false".equals(str)) {
            return true;
        }        
        return false;
    }

    /**
     * 大文字の文字列が、boolean値を示す値かどうかの判定します。
     * boolean値は「TRUE」,「FALSE」の大文字の半角文字列です。
     * 
     * @param str 判定する文字列
     * @return boolean boolean型であればtrue、それ以外ならfalse
     * @since 2.0
     */
    public static boolean isBooleanUpperCase(String str) {
        if(str == null){
            return false;
        }
        if ("TRUE".equals(str) || "FALSE".equals(str)) {
            return true;
        }        
        return false;
    }

}
