|
@@ -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<>();
|
|
|
|
+ }
|
|
|
|
+}
|