package com.android_mvc.framework.controller.validation; import java.util.regex.Pattern; import com.android_mvc.framework.activities.IBaseActivity; /** * バリデーションロジックの基底クラス。 * @author id:language_and_engineering * */ public class BaseValidationsUtil { // チェック対象のアクティビティのパラメータ protected ActivityParams params; // バリデーション結果 protected ValidationResult vres; /** * あるアクティビティに関するバリデーション処理を開始するため,初期化を行なう。 */ protected void initValidationOf(IBaseActivity activity) { params = activity.toParams(); vres = new ValidationResult(); } // ------------- assert系メソッド /** * 該当キーの文字列が空でない事を要求する。 */ protected void assertNotEmpty(String key) { String s = (String)params.getValue(key); // 1文字以上であること if( isEmpty( s ) ) { vres.err( params.getName(key) + "が入力されていません。"); } } /** * 該当キーの文字列が,有効な整数としてパース可能であることを要求する。 */ protected void assertValidInteger(String key) { String s = (String)params.getValue(key); if( isEmpty(s) ) return; // 半角数字のみであること。マイナスやピリオドも許可しない。 if( ! isNumberCharSequence(s) ) { // パース不可能 vres.err( params.getName(key) + "には半角数字のみを入力してください。"); } else if( ! validParsableAsInteger(s) ) { // パース実行結果が不正 vres.err( params.getName(key) + "の整数の入力形式が不正です。"); } } /** * 該当キーの数値に対し,特定の演算条件を満たすことを要求する。 */ protected void assertNumberOperation(String key, NumberComparator nc) { String s = (String)params.getValue(key); if( ! validInteger(s) ) return; long target_value = Long.parseLong(s); // 演算を実行 if( "greaterThan".equals(nc.type_code) && ! (target_value > nc.value)) { vres.err( params.getName(key) + "には" + nc.value + "より大きい数を入力してください。"); } // TODO: 演算タイプの追加 } /** * 文字列の先頭が特定のフレーズで始まることを要求する。 */ protected void assertStringHead(String key, String headerTemplate) { String s = (String)params.getValue(key); if( isEmpty(s) ) return; // 先頭にマッチすること if( s.indexOf(headerTemplate) != 0 ) { vres.err( params.getName(key) + "は「" + headerTemplate +"」で始まる必要があります。"); } } // ------------ 補助メソッド /** * 「よりも大きい」を表す。 */ protected NumberComparator greaterThan( long l ) { return new NumberComparator( l, "greaterThan" ); } /** * バリデーションの結果を返す。 */ protected ValidationResult getValidationResult() { return vres; } // ------------ 内部使用 /** * 対象文字列が空でないか検査 */ private boolean isEmpty(String s) { return ( ( s == null ) || ( s.length() < 1 ) ); } /** * 対象文字列が半角数字のみであるか検査 */ private boolean isNumberCharSequence(String s) { return ( Pattern.compile("^[0-9]+$").matcher(s).matches() ); } /** * 有効な整数としてパース可能か検査 */ private boolean validParsableAsInteger( String s ) { // パース実行 Long long_value = Long.parseLong(s); // パース前後で余計な変化がないこと。先頭の0とか。 return String.valueOf( long_value ).equals(s); } /** * 有効な整数であるか検査 */ private boolean validInteger( String s ) { return ( ! isEmpty(s) ) && ( isNumberCharSequence(s) ) && validParsableAsInteger(s); } }