package com.gh.mygreen.xlsmapper.validation.fieldvalidation; import java.util.LinkedHashMap; import com.gh.mygreen.xlsmapper.ArgUtils; /** * 文字列に関する入力値検証を行う。 */ public abstract class StringValidator extends AbstractFieldValidator<String>{ private StringValidator() { super(); } /** * 文字列が指定した文字長かどうかチェックする。 * <ul> * <li>メッセージキーは、「fieldError.exactLength」。 * <li>メッセージ引数{0}は、文字長。 */ public static class ExactLengthValidator extends StringValidator { /** 文字長 */ private final int length; public ExactLengthValidator(final int length) { super(); ArgUtils.notMin(length, 0, "length"); this.length = length; } public int getLength() { return length; } @Override public String getDefaultMessageKey() { return "cellFieldError.exactLength"; } @Override protected boolean validate(final String value) { if(isNullValue(value)) { return true; } if(value.length() == getLength()) { return true; } return false; } @Override protected LinkedHashMap<String, Object> getMessageVars(final String value) { final LinkedHashMap<String, Object> vars = new LinkedHashMap<>(); vars.put("validatedValue", value); vars.put("valueLength", value.length()); vars.put("length", getLength()); return vars; } } /** * 文字列が指定した文字長以内かどうかチェックする。 * <ul> * <li>メッセージキーは、「fieldError.maxLength」。 * <li>メッセージ引数{0}は、最大文字長。 */ public static class MaxLengthValidator extends StringValidator { /** 最大文字長 */ private final int maxLength; public MaxLengthValidator(final int maxLength) { super(); ArgUtils.notMin(maxLength, 0, "maxLength"); this.maxLength = maxLength; } public int getMaxLength() { return maxLength; } @Override public String getDefaultMessageKey() { return "cellFieldError.maxLength"; } @Override protected boolean validate(final String value) { if(isNullValue(value)) { return true; } if(value.length() <= getMaxLength()) { return true; } return false; } @Override protected LinkedHashMap<String, Object> getMessageVars(final String value) { final LinkedHashMap<String, Object> vars = new LinkedHashMap<>(); vars.put("validatedValue", value); vars.put("valueLength", value.length()); vars.put("maxLength", getMaxLength()); return vars; } } /** * 文字列が指定した文字長以上かどうかチェックする。 * <ul> * <li>メッセージキーは、「fieldError.minLength」。 * <li>メッセージ引数{0}は、最小文字長。 */ public static class MinLengthValidator extends StringValidator { /** 最小文字長 */ private final int minLength; public MinLengthValidator(final int minLength) { super(); ArgUtils.notMin(minLength, 0, "minLength"); this.minLength = minLength; } public int getMinLength() { return minLength; } @Override public String getDefaultMessageKey() { return "cellFieldError.minLength"; } @Override protected boolean validate(final String value) { if(isNullValue(value)) { return true; } if(value.length() >= getMinLength()) { return true; } return false; } @Override protected LinkedHashMap<String, Object> getMessageVars(final String value) { final LinkedHashMap<String, Object> vars = new LinkedHashMap<>(); vars.put("validatedValue", value); vars.put("valueLength", value.length()); vars.put("minLength", getMinLength()); return vars; } } /** * 文字列が指定した文字長の範囲内かどうかチェックする。 * <ul> * <li>メッセージキーは、「fieldError.betweenLength」。 * <li>メッセージ引数{0}は、最小文字長。 * <li>メッセージ引数{1}は、最大文字長。 */ public static class BetweenLengthValidator extends StringValidator { /** 最小文字長 */ private final int minLength; /** 最大文字長 */ private final int maxLength; public BetweenLengthValidator(final int minLength, final int maxLength) { super(); ArgUtils.notMin(minLength, 0, "minLength"); ArgUtils.notMin(maxLength, 0, "maxLength"); ArgUtils.notMax(minLength, maxLength, "minLength"); this.minLength = minLength; this.maxLength = maxLength; } public int getMinLength() { return minLength; } public int getMaxLength() { return maxLength; } @Override public String getDefaultMessageKey() { return "cellFieldError.betweenLength"; } @Override protected boolean validate(final String value) { if(isNullValue(value)) { return true; } final int strLength = value.length(); if(getMinLength() <= strLength && strLength <= getMaxLength()) { return true; } return false; } @Override protected LinkedHashMap<String, Object> getMessageVars(final String value) { final LinkedHashMap<String, Object> vars = new LinkedHashMap<>(); vars.put("validatedValue", value); vars.put("valueLength", value.length()); vars.put("minLength", getMinLength()); vars.put("maxLength", getMaxLength()); return vars; } } /** * 文字長をチェックするValidatorを取得する。 * @param length 文字長。 * @return */ public static StringValidator exactLength(final int length) { return new ExactLengthValidator(length); } /** * 文字長が指定した文字長以下かチェックするValidatorを取得する。 * @param maxLength 最大文字長 * @return */ public static StringValidator maxLength(final int maxLength) { return new MaxLengthValidator(maxLength); } /** * 文字長が指定した文字長以上かチェックするValidatorを取得する。 * @param minLength 最小文字長 * @return */ public static StringValidator minLength(final int minLength) { return new MinLengthValidator(minLength); } /** * 文字長が指定した文字長の範囲内かかチェックするValidatorを取得する。 * @param minLength 最小文字長 * @param maxLength 最大文字長 * @return */ public static StringValidator betweenLength(final int minLength, final int maxLength) { return new BetweenLengthValidator(minLength, maxLength); } }