package com.akjava.lib.common.form; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import com.akjava.lib.common.param.Parameter; import com.akjava.lib.common.param.ParameterUtils; import com.akjava.lib.common.utils.ValuesUtils; public class ValidatorTools { private ValidatorTools(){} //private static BiMap<String,Validator> bimap=null; /* public static BiMap<String,Validator> getValidatorMap(){ if(bimap==null){ init(); } return bimap; } */ public static Map<String,Validator> validatorMap=new HashMap<String, Validator>(); public static Validator getValidator(String line) throws ValidatorNotFoundException{ Validator validator=validatorMap.get(line); if(validator!=null){ return validator; } Parameter param=ParameterUtils.parse(line); String name=param.getName().toLowerCase(); if(name.equals(StaticValidators.VALIDATOR_NOT_EMPTY.toLowerCase())){ return StaticValidators.notEmptyValidator(); } else if(name.equals(StaticValidators.VALIDATOR_ASCII_NUMBER.toLowerCase())){ return StaticValidators.asciiNumberOnly(); } else if(name.equals(StaticValidators.VALIDATOR_ASCII_NUMBER_AND_CHAR.toLowerCase())){ return StaticValidators.asciiNumberAndCharOnly(); } else if(name.equals(StaticValidators.VALIDATOR_ASCII_NUMBER_AND_CHAR_AND_UNDERBAR.toLowerCase())){ return StaticValidators.asciiNumberAndCharAndUnderbarOnly(); } else if(name.equals(StaticValidators.VALIDATOR_HANKAKU_KANA.toLowerCase())){ return StaticValidators.hankakuKana(); } else if(name.equals(StaticValidators.VALIDATOR_HIRAGANA.toLowerCase())){ return StaticValidators.hiragana(); } else if(name.equals(StaticValidators.VALIDATOR_ASCII_CHAR.toLowerCase())){ return StaticValidators.asciiCharOnly(); } else if(name.equals(StaticValidators.VALIDATOR_START_ASCII_CHAR.toLowerCase())){ return StaticValidators.startAsciiChar(); }else if(name.equals(StaticValidators.VALIDATOR_DECIMAL_NUMBER.toLowerCase())){ return StaticValidators.decimalNumber(); }else if(name.equals(StaticValidators.VALIDATOR_INTEGER_NUMBER.toLowerCase())){ return StaticValidators.integerNumber(); }else if(name.equals(Validators.VALIDATOR_RANGE_NUMBER.toLowerCase())){ Double min=null; Double max=null; if(param.size()>0){ try{ min=Double.parseDouble(param.get(0)); }catch (Exception e) { //use null; } if(param.size()>1){ try{ max=Double.parseDouble(param.get(1)); }catch (Exception e) { //use null; } } } if(min==null && max==null){ throw new ValidatorNotFoundException(name+" need min or max value:"+line); } return Validators.rangedNumber(min, max); } else if(name.equals(Validators.VALIDATOR_MAX_STRING_SIZE)){ if(param.size()!=1){ throw new ValidatorNotFoundException(name+" need size attribute:"+line); }else{ int size; try{ size=Integer.parseInt(param.get(0)); }catch (Exception e) { throw new ValidatorNotFoundException(name+" invalid size attribute:"+line); } validator=Validators.maxStringSize(size); } } else if(name.equals(Validators.VALIDATOR_MAX_STRING_BYTE_SIZE)){ if(param.size()!=1){ throw new ValidatorNotFoundException(name+" need size attribute:"+line); }else{ int size; try{ size=ValuesUtils.parseByte(param.get(0)); }catch (Exception e) { throw new ValidatorNotFoundException(name+" invalid size attribute:"+line); } validator=Validators.maxStringByteSize(size); } } else if(name.equals(Validators.VALIDATOR_BETWEEN_STRING_SIZE)){ if(param.size()!=2){ throw new ValidatorNotFoundException(name+" need min and max attribute:"+line); }else{ int min; int max; try{ min=Integer.parseInt(param.get(0)); max=Integer.parseInt(param.get(1)); }catch (Exception e) { throw new ValidatorNotFoundException(name+" invalid size attribute:"+line); } validator=Validators.betweenStringSize(min,max); } }else if(name.equals(Validators.VALIDATOR_AVAIABLE_VALUE_ONLY)){ if(param.size()<2){ throw new ValidatorNotFoundException(name+" need at leaset 2 attributes:"+line); }else{ boolean bool; try{ String v=param.get(0).toLowerCase(); if(v.equals("true")){ bool=true; }else if(v.equals("false")){ bool=false; }else{ throw new Exception(); } }catch (Exception e) { throw new ValidatorNotFoundException(name+" invalid boolean attribute:"+line); } List<String> values=new ArrayList<String>(); for(int i=1;i<param.size();i++){ values.add(param.get(i)); } validator=Validators.avaiableValueOnly(values, bool); } } if(validator!=null){ validatorMap.put(line, validator); return validator; } throw new ValidatorNotFoundException("not found:"+line); } public static boolean contain(List<Validator> validators,String checkName){ if(checkName==null || checkName.isEmpty()){ return false; } checkName=checkName.toLowerCase(); for(Validator validator:validators){ String name=validator.getName().toLowerCase(); if(name.equals(checkName)){ return true; } } return false; } public static boolean hasLimitValidator(List<Validator> validators){ for(Validator validator:validators){ String name=validator.getName().toLowerCase(); if(name.equals("max")||name.equals("maxb")|| name.equals("between")){ return true; } } return false; } public static boolean hasNumberValidator(List<Validator> validators){ for(Validator validator:validators){ String name=validator.getName().toLowerCase(); if(name.equals("asciiNumber")||name.equals("integerNumber")|| name.equals("range")||name.equals("asciiNumber")){ return true; } } return false; } /* private static void init(){ bimap=HashBiMap.create(); bimap.put(StaticValidators.VALIDATOR_NOT_EMPTY.toLowerCase(), StaticValidators.notEmptyValidator()); bimap.put(StaticValidators.VALIDATOR_ASCII_NUMBER.toLowerCase(), StaticValidators.asciiNumberOnly()); bimap.put(StaticValidators.VALIDATOR_ASCII_NUMBER_AND_CHAR.toLowerCase(), StaticValidators.asciiNumberAndCharOnly()); bimap.put(StaticValidators.VALIDATOR_ASCII_NUMBER_AND_CHAR_AND_UNDERBAR.toLowerCase(), StaticValidators.asciiNumberAndCharAndUnderbarOnly()); bimap.put(StaticValidators.VALIDATOR_HANKAKU_KANA.toLowerCase(), StaticValidators.hankakuKana()); bimap.put(StaticValidators.VALIDATOR_HIRAGANA.toLowerCase(), StaticValidators.hiragana()); bimap.put(StaticValidators.VALIDATOR_ASCII_CHAR.toLowerCase(), StaticValidators.asciiCharOnly()); bimap.put(StaticValidators.VALIDATOR_START_ASCII_CHAR.toLowerCase(), StaticValidators.startAsciiChar()); //TODO should support name contain args like msize(12),bet(6:12) bimap.put("between", Validators.betweenStringSize(6, 12)); bimap.put("less8", Validators.maxStringSize(8)); bimap.put("less8b", Validators.maxStringByteSize(8)); bimap.put("less64", Validators.maxStringSize(64)); bimap.put("less128", Validators.maxStringSize(128)); bimap.put("less256", Validators.maxStringSize(256)); bimap.put("less500", Validators.maxStringSize(500)); bimap.put("less1m", Validators.maxStringByteSize(1024*1024)); }*/ public static class ValidatorNotFoundException extends Exception{ public ValidatorNotFoundException(String string) { super(string); } /** * */ private static final long serialVersionUID = 1L; } public static String getValidatorLabel(Validator validator) { return validator.toString(); /* String label= bimap.inverse().get(validator); if(label==null){ return validator.getName(); }else{ return label; } */ } /** * use lower case inside * @param key * @return */ /* public static Validator getValidator(String key)throws ValidatorNotFoundException { if(bimap==null){ init(); } if(key==null){ throw new ValidatorNotFoundException("null validator key"); } Validator v= bimap.get(key.toLowerCase()); if(v==null){ throw new ValidatorNotFoundException("null validator for "+key); } return v; }*/ }