package kcg.faics.comn.validator; import java.lang.reflect.InvocationTargetException; import java.util.Collection; import org.apache.commons.beanutils.PropertyUtils; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.apache.commons.validator.Field; import org.apache.commons.validator.GenericValidator; import org.apache.commons.validator.ValidatorAction; import org.apache.commons.validator.util.ValidatorUtils; import org.apache.oro.text.perl.Perl5Util; import org.springframework.validation.Errors; import org.springframework.web.multipart.MultipartFile; import org.springmodules.validation.commons.FieldChecks; /** * 유효성 검사 클래스. * * @author kimnomin * */ public class KcgFieldChecks extends FieldChecks { /** * sericalVersion UID. */ private static final long serialVersionUID = -2911390948016164140L; /** * Log used by this class. */ private static final Log LOGGER = LogFactory.getLog(FieldChecks.class); /** * 파일 확장자 체크. * * @param bean * The bean validation is being performed on. * @param va * The ValidatorAction that is currently being * performed. * @param field * field The Field object associated with the * current field being validated. * @param errors * Errors The Errors object to add errors to if any * validation errors occur. * @return true Valid. false inValid. */ public static boolean validateFileExt(final Object bean, final ValidatorAction va, final Field field, final Errors errors) { String value = extractValue(bean, field); String extStr = field.getVarValue("ext"); try { String[] validExts; String regexp = ""; if (!GenericValidator.isBlankOrNull(extStr)) { int loopIdx = 0; validExts = extStr.split(","); regexp = "\\.("; for (String s : validExts) { if (loopIdx > 0) { regexp += "|"; } regexp += s; loopIdx++; } regexp += ")$"; } Perl5Util matcher = null; try { matcher = new Perl5Util(); } catch (Exception e) { e.printStackTrace(); } if (value != null) { boolean isValid = matcher.match("/" + regexp + "/i", value); if (!GenericValidator.isBlankOrNull(value) && !isValid) { FieldChecks.rejectValue(errors, field, va); return false; } else { return true; } } else { return true; } } catch (Exception e) { e.printStackTrace(); KcgFieldChecks.LOGGER.error(e.getMessage(), e); } return true; } public static boolean validateStrRegex(final Object bean, final ValidatorAction va, final Field field, final Errors errors) { String value = FieldChecks.extractValue(bean, field); String idRegex = field.getVarValue("regex"); if (!value.matches(idRegex)) { FieldChecks.rejectValue(errors, field, va); return false; } else { return true; } } /** * 객체 내 프로퍼티의 값을 추출하여 반환한다. * *
	 * FieldCheck.extractValue 메소드 Override.
	 * 
* * @param bean * 값을 추출할 대상 객체 * @param field * 실제 값을 추출할 대상 객체의 프로퍼티 * @return bean.field가 갖고 있는 값 */ protected static String extractValue(final Object bean, final Field field) { String value = null; if (bean == null) { return null; } else if (bean instanceof String) { value = (String) bean; } else { value = getValueAsString(bean, field.getProperty()); } return value; } /** * 객체 내 프로퍼티의 값을 추출하여 반환한다. * *
	 * ValidatorUtils.getValueAsString 메소드 커스터 마이징.
	 * 
* * @param bean * bean 값을 추출할 대상 객체 * @param property * 실제 값을 추출할 대상 객체의 프로퍼티 * @return bean.field가 갖고 있는 값 */ public static String getValueAsString(final Object bean, final String property) { Object value = null; try { value = PropertyUtils.getProperty(bean, property); } catch (IllegalAccessException e) { Log log = LogFactory.getLog(ValidatorUtils.class); log.error(e.getMessage(), e); } catch (InvocationTargetException e) { Log log = LogFactory.getLog(ValidatorUtils.class); log.error(e.getMessage(), e); } catch (NoSuchMethodException e) { Log log = LogFactory.getLog(ValidatorUtils.class); log.error(e.getMessage(), e); } if (value == null) { return null; } if (value instanceof String[]) { return ((String[]) value).length > 0 ? value.toString() : ""; } else if (value instanceof Collection) { return ((Collection) value).isEmpty() ? "" : value.toString(); } else if (value instanceof MultipartFile) { MultipartFile file = (MultipartFile) value; if (file.isEmpty()) { return ""; } else { return file.getOriginalFilename(); } } else { return value.toString(); } } }