|  | @@ -0,0 +1,186 @@
 | 
	
		
			
				|  |  | +package xgs.net.validation;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +import com.alibaba.fastjson.JSON;
 | 
	
		
			
				|  |  | +import com.alibaba.fastjson.JSONArray;
 | 
	
		
			
				|  |  | +import com.alibaba.fastjson.JSONObject;
 | 
	
		
			
				|  |  | +import com.google.common.collect.Maps;
 | 
	
		
			
				|  |  | +import com.jfinal.plugin.activerecord.Model;
 | 
	
		
			
				|  |  | +import org.slf4j.Logger;
 | 
	
		
			
				|  |  | +import org.slf4j.LoggerFactory;
 | 
	
		
			
				|  |  | +import xgs.net.annotation.Entity;
 | 
	
		
			
				|  |  | +import xgs.net.exception.XgsException;
 | 
	
		
			
				|  |  | +//import xgs.net.model.TbSysUser;
 | 
	
		
			
				|  |  | +import xgs.net.utils.IOUtils;
 | 
	
		
			
				|  |  | +import xgs.net.validation.entity.FieldEntity;
 | 
	
		
			
				|  |  | +import xgs.net.validation.entity.ModelEntity;
 | 
	
		
			
				|  |  | +import xgs.net.validation.entity.ValidationEntity;
 | 
	
		
			
				|  |  | +import xgs.net.validation.entity.ValidationErrorMsg;
 | 
	
		
			
				|  |  | +import xgs.net.validation.utils.ValidatePool;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +import java.io.IOException;
 | 
	
		
			
				|  |  | +import java.io.InputStream;
 | 
	
		
			
				|  |  | +import java.util.ArrayList;
 | 
	
		
			
				|  |  | +import java.util.List;
 | 
	
		
			
				|  |  | +import java.util.Map;
 | 
	
		
			
				|  |  | +import java.util.Set;
 | 
	
		
			
				|  |  | +import java.util.concurrent.ConcurrentHashMap;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +public class ValidationUtils
 | 
	
		
			
				|  |  | +{
 | 
	
		
			
				|  |  | +    static Logger logger;
 | 
	
		
			
				|  |  | +    private static final String xgsType = "xgsType";
 | 
	
		
			
				|  |  | +    private static final String message = "message";
 | 
	
		
			
				|  |  | +    private static final String required = "required";
 | 
	
		
			
				|  |  | +    private static final String mobile = "mobile";
 | 
	
		
			
				|  |  | +    private static final String email = "email";
 | 
	
		
			
				|  |  | +    private static final String type = "type";
 | 
	
		
			
				|  |  | +    private static final String max = "max";
 | 
	
		
			
				|  |  | +    private static final String min = "min";
 | 
	
		
			
				|  |  | +    private static final String len = "len";
 | 
	
		
			
				|  |  | +    private static JSONObject json;
 | 
	
		
			
				|  |  | +    private static Map<String, ModelEntity> entities;
 | 
	
		
			
				|  |  | +    private static Map<String, String> jsonEntities;
 | 
	
		
			
				|  |  | +    
 | 
	
		
			
				|  |  | +    private ValidationUtils(InputStream file) {
 | 
	
		
			
				|  |  | +        try {
 | 
	
		
			
				|  |  | +            String jsonStr = IOUtils.toString(file);
 | 
	
		
			
				|  |  | +            ValidationUtils.json = JSON.parseObject(jsonStr);
 | 
	
		
			
				|  |  | +            Set<String> tableSet = ValidationUtils.json.keySet();
 | 
	
		
			
				|  |  | +            for (String tableName : tableSet) {
 | 
	
		
			
				|  |  | +                JSONObject _jsonObj = ValidationUtils.json.getJSONObject(tableName);
 | 
	
		
			
				|  |  | +                ValidationUtils.jsonEntities.put(tableName, JSON.toJSONString(_jsonObj));
 | 
	
		
			
				|  |  | +                ValidationUtils.entities.put(tableName, this.initModel(tableName, _jsonObj));
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +        catch (IOException e) {
 | 
	
		
			
				|  |  | +            throw new XgsException(303);
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +    
 | 
	
		
			
				|  |  | +    private ModelEntity initModel(final String tableName, final JSONObject _jsonObj) {
 | 
	
		
			
				|  |  | +        final ModelEntity model = new ModelEntity();
 | 
	
		
			
				|  |  | +        model.setTable(tableName);
 | 
	
		
			
				|  |  | +        final Set<String> fields = _jsonObj.keySet();
 | 
	
		
			
				|  |  | +        final List<FieldEntity> fieldEntityList = new ArrayList<>();
 | 
	
		
			
				|  |  | +        model.setEntities(fieldEntityList);
 | 
	
		
			
				|  |  | +        for (final String field : fields) {
 | 
	
		
			
				|  |  | +            final JSONObject _property = _jsonObj.getJSONObject(field);
 | 
	
		
			
				|  |  | +            fieldEntityList.add(this.initField(field, _property));
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +        return model;
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +    
 | 
	
		
			
				|  |  | +    private FieldEntity initField(final String field, final JSONObject _property) {
 | 
	
		
			
				|  |  | +        final FieldEntity fieldEntity = new FieldEntity();
 | 
	
		
			
				|  |  | +        final String label = _property.getString("label");
 | 
	
		
			
				|  |  | +        fieldEntity.setLabel(label);
 | 
	
		
			
				|  |  | +        fieldEntity.setField(field);
 | 
	
		
			
				|  |  | +        final JSONArray validationArray = _property.getJSONArray("validation");
 | 
	
		
			
				|  |  | +        final List<ValidationEntity> validationEntityList = new ArrayList<>();
 | 
	
		
			
				|  |  | +        fieldEntity.setEntities(validationEntityList);
 | 
	
		
			
				|  |  | +        if (validationArray != null && validationArray.size() != 0) {
 | 
	
		
			
				|  |  | +            for (final Object validation : validationArray) {
 | 
	
		
			
				|  |  | +                validationEntityList.add(this.initValidation(validation));
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +        return fieldEntity;
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +    
 | 
	
		
			
				|  |  | +    private ValidationEntity initValidation(final Object validation) {
 | 
	
		
			
				|  |  | +        final JSONObject v = (JSONObject)validation;
 | 
	
		
			
				|  |  | +        final ValidationEntity validationEntity = new ValidationEntity();
 | 
	
		
			
				|  |  | +        validationEntity.setXgsType(v.getString("xgsType"));
 | 
	
		
			
				|  |  | +        validationEntity.setMessage(v.getString("message"));
 | 
	
		
			
				|  |  | +        if (v.containsKey("required")) {
 | 
	
		
			
				|  |  | +            validationEntity.setRequired(v.getBoolean("required"));
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +        if (v.containsKey("type")) {
 | 
	
		
			
				|  |  | +            validationEntity.setType(v.getString("type"));
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +        if (v.containsKey("max")) {
 | 
	
		
			
				|  |  | +            validationEntity.setMax(v.getInteger("max"));
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +        if (v.containsKey("min")) {
 | 
	
		
			
				|  |  | +            validationEntity.setMin(v.getInteger("min"));
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +        if (v.containsKey("len")) {
 | 
	
		
			
				|  |  | +            validationEntity.setLen(v.getInteger("len"));
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +        if (v.containsKey("email")) {
 | 
	
		
			
				|  |  | +            validationEntity.setEmail(v.getBoolean("email"));
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +        if (v.containsKey("mobile")) {
 | 
	
		
			
				|  |  | +            validationEntity.setMobile(v.getBoolean("mobile"));
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +        return validationEntity;
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +    
 | 
	
		
			
				|  |  | +    static void init(final InputStream file) {
 | 
	
		
			
				|  |  | +        if (ValidationUtils.json == null) {
 | 
	
		
			
				|  |  | +            new ValidationUtils(file);
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +    
 | 
	
		
			
				|  |  | +    public static String getModelName(final Model model) {
 | 
	
		
			
				|  |  | +        final Class<?> clazz = model.getClass();
 | 
	
		
			
				|  |  | +        return getModelName(clazz);
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +    
 | 
	
		
			
				|  |  | +    public static String getModelName(final Class<?> clazz) {
 | 
	
		
			
				|  |  | +        final Entity entity = clazz.getAnnotation(Entity.class);
 | 
	
		
			
				|  |  | +        return entity.value();
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +    
 | 
	
		
			
				|  |  | +    public static String getJson(final Class<?> clazz) {
 | 
	
		
			
				|  |  | +        return ValidationUtils.jsonEntities.get(getModelName(clazz));
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +    
 | 
	
		
			
				|  |  | +    public static String getJson(final Model model) {
 | 
	
		
			
				|  |  | +        return ValidationUtils.jsonEntities.get(getModelName(model));
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +    
 | 
	
		
			
				|  |  | +    public static Map<String, ValidationErrorMsg> validate(final Model model) {
 | 
	
		
			
				|  |  | +        final Map<String, ValidationErrorMsg> errors = Maps.newHashMap();
 | 
	
		
			
				|  |  | +        final String table = getModelName(model);
 | 
	
		
			
				|  |  | +        final ModelEntity entity = ValidationUtils.entities.get(table);
 | 
	
		
			
				|  |  | +        final List<FieldEntity> fields = entity.getEntities();
 | 
	
		
			
				|  |  | +        for (final FieldEntity field : fields) {
 | 
	
		
			
				|  |  | +            final ValidationErrorMsg errorMsg = new ValidationErrorMsg();
 | 
	
		
			
				|  |  | +            errorMsg.setField(field.getField());
 | 
	
		
			
				|  |  | +            errorMsg.setLabel(field.getLabel());
 | 
	
		
			
				|  |  | +            final List<ValidationEntity> validationEntityList = field.getEntities();
 | 
	
		
			
				|  |  | +            for (final ValidationEntity v : validationEntityList) {
 | 
	
		
			
				|  |  | +                check(entity, field, v, model, errorMsg);
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +            if (errorMsg.getErrors().size() != 0) {
 | 
	
		
			
				|  |  | +                errors.put(field.getField(), errorMsg);
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +        return errors;
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +    
 | 
	
		
			
				|  |  | +    public static void validateE(final Model model) throws XgsException {
 | 
	
		
			
				|  |  | +        final Map<String, ValidationErrorMsg> errors = validate(model);
 | 
	
		
			
				|  |  | +        if (errors.size() != 0) {
 | 
	
		
			
				|  |  | +            ValidationUtils.logger.debug("validation error:{}", JSON.toJSONString(errors));
 | 
	
		
			
				|  |  | +            throw new XgsException(10000, JSON.toJSONString(errors));
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +    
 | 
	
		
			
				|  |  | +    private static void check(final ModelEntity me, final FieldEntity field, final ValidationEntity entity, final Model model, final ValidationErrorMsg errorMsg) {
 | 
	
		
			
				|  |  | +        final XgsValidation xv = ValidatePool.get(entity.getXgsType());
 | 
	
		
			
				|  |  | +        xv.executor(me, field, entity, model, errorMsg);
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    public static void main(final String[] args) {
 | 
	
		
			
				|  |  | +//        final TbSysUser user = new TbSysUser();
 | 
	
		
			
				|  |  | +//        System.out.println(getJson(user));
 | 
	
		
			
				|  |  | +//        System.out.println(getJson(TbSysUser.class));
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +    
 | 
	
		
			
				|  |  | +    static {
 | 
	
		
			
				|  |  | +        ValidationUtils.logger = LoggerFactory.getLogger(ValidationUtils.class);
 | 
	
		
			
				|  |  | +        ValidationUtils.entities = new ConcurrentHashMap<>();
 | 
	
		
			
				|  |  | +        ValidationUtils.jsonEntities = new ConcurrentHashMap<>();
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +}
 |