Package com.skyline.common.validation

Source Code of com.skyline.common.validation.ValidationJsGenerator

package com.skyline.common.validation;

import java.io.File;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.util.List;
import java.util.Locale;
import java.util.Set;

import org.apache.commons.io.FileUtils;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.commons.validator.Field;
import org.apache.commons.validator.Form;
import org.apache.commons.validator.FormSet;
import org.apache.commons.validator.ValidatorAction;
import org.apache.commons.validator.ValidatorResources;

import com.skyline.common.util.SpringUtils;

/**
* 生成校验脚本(实际生产中需要配置classpath来运行)
*
* @author wuqh
* */
public class ValidationJsGenerator {
  private static final Log LOGGER = LogFactory.getLog(ValidationJsGenerator.class);
  public static final ValidatorResources validatorResources = SpringUtils.getBean(
      ValidationFactory.class).getValidatorResources();

  @SuppressWarnings("unchecked")
  public static String generateValidationJs(String formName) {
    StringBuilder totleJs = new StringBuilder("(function($){$().ready(function() {\n");
    StringBuilder rulesJs = new StringBuilder("rules:{\n");
    StringBuilder messagesJs = new StringBuilder("messages:{\n");
    Form form = validatorResources.getForm(Locale.getDefault(), formName);

    int fieldIndex = 0;
    List<Field> fields = form.getFields();
    for (Field field : fields) {
      if (fieldIndex != 0) {
        rulesJs.append(",\n");
        messagesJs.append(",\n");
      }
      rulesJs.append(field.getProperty()).append(":{");
      messagesJs.append(field.getProperty()).append(":{");

      int dependencyIndex = 0;
      List<String> dependencyList = field.getDependencyList();
      for (String dependency : dependencyList) {
        if (dependencyIndex != 0) {
          rulesJs.append(',');
          messagesJs.append(',');
        }
        ValidatorAction va = validatorResources.getValidatorAction(dependency);
        String message = ValidationUtils.getMessage(va, field);

        if (dependency.equals("required")) {
          rulesJs.append("required:true");
          messagesJs.append("required:'").append(message).append('\'');
        }

        if (dependency.equals("minlength")) {
          try {
            int min = Integer.parseInt(field.getVarValue("minlength"));
            rulesJs.append("minlength:").append(min);
            messagesJs.append("minlength:'").append(message).append('\'');
          } catch (Exception e) {
            LOGGER.info("生成" + form.getName() + "的" + field.getProperty()
                + "字段的minlength校验失败", e);
          }

        }

        if (dependency.equals("maxlength")) {
          try {
            int max = Integer.parseInt(field.getVarValue("maxlength"));
            rulesJs.append("maxlength:").append(max);
            messagesJs.append("maxlength:'").append(message).append('\'');
          } catch (Exception e) {
            LOGGER.info("生成" + form.getName() + "的" + field.getProperty()
                + "字段的minlength校验失败", e);
          }
        }

        if (dependency.equals("mask")) {
          String mask = field.getVarValue("mask");
          rulesJs.append("regexmatch:").append('/').append(mask).append('/');
          messagesJs.append("regexmatch:'").append(message).append('\'');
        }

        if (dependency.equals("byte") || dependency.equals("short")
            || dependency.equals("integer") || dependency.equals("long")
            || dependency.equals("double") || dependency.equals("float")) {
          // FIXME:全部归为数值型,实际应用中是否需要区分
          rulesJs.append("number:true");
          messagesJs.append("number:'").append(message).append('\'');
        }

        if (dependency.equals("date")) {
          // FIXME:使用正则,不再使用日期类型
        }

        if (dependency.toLowerCase().endsWith("range")) {
          try {
            int min = Integer.parseInt(field.getVarValue("min"));
            int max = Integer.parseInt(field.getVarValue("max"));
            rulesJs.append("range:").append('[').append(min).append('\'').append(max)
                .append(']');
            messagesJs.append("range:'").append(message).append('\'');
          } catch (Exception e) {
            LOGGER.info("生成" + form.getName() + "的" + field.getProperty() + "字段的"
                + dependency + "校验失败", e);
          }
        }

        // if (dependency.endsWith("email")) {
        // // FIXME:使用正则,不再使用邮件类型
        // }

        if (dependency.endsWith("notEqualTo")) {
          try {
            String toId = field.getVarValue("toid");
            rulesJs.append("notEqualTo:").append("\"#").append(formName)
                .append(" [name='").append(toId).append("']\"");
            messagesJs.append("notEqualTo:'").append(message).append('\'');
          } catch (Exception e) {
            LOGGER.info("生成" + form.getName() + "的" + field.getProperty()
                + "字段的notEqualTo校验失败", e);
          }
        }

        if (dependency.endsWith("equalTo")) {
          try {
            String toId = field.getVarValue("toid");
            rulesJs.append("equalTo:").append("\"#").append(formName)
                .append(" [name='").append(toId).append("']\"");
            messagesJs.append("equalTo:'").append(message).append('\'');
          } catch (Exception e) {
            LOGGER.info("生成" + form.getName() + "的" + field.getProperty()
                + "字段的notEqualTo校验失败", e);
          }
        }

        // if (dependency.endsWith("submitToken")) {
        // //FIXME:表单防重复提交校验不生成JS
        // }
        dependencyIndex++;
      }
      rulesJs.append('}');
      messagesJs.append('}');
      fieldIndex++;
    }
    rulesJs.append("\n},\n");
    messagesJs.append("\n}\n");
    totleJs.append("$(\"#" + formName + "\").validate({\n").append(rulesJs.toString())
        .append(messagesJs.toString()).append("});\n});\n})(jQuery);");
    try {
      return new String(totleJs.toString().getBytes("utf-8"));
    } catch (UnsupportedEncodingException e) {
      LOGGER.info("脚本编码转换失败!使用未编码转换的字符串。");
      return totleJs.toString();
    }
  }

  @SuppressWarnings("unchecked")
  public static void generateValidationJsFile(String basePath) throws IOException {
    FormSet formSet = null;
    try {
      java.lang.reflect.Field field = validatorResources.getClass().getDeclaredField(
          "defaultFormSet");
      field.setAccessible(true);
      formSet = (FormSet) field.get(validatorResources);
    } catch (SecurityException e) {
      // TODO Auto-generated catch block
      e.printStackTrace();
    } catch (NoSuchFieldException e) {
      // TODO Auto-generated catch block
      e.printStackTrace();
    } catch (IllegalArgumentException e) {
      // TODO Auto-generated catch block
      e.printStackTrace();
    } catch (IllegalAccessException e) {
      // TODO Auto-generated catch block
      e.printStackTrace();
    }

    if (formSet != null) {
      Set<String> formNames = formSet.getForms().keySet();
      for (String formName : formNames) {
        File file = new File(basePath, formName + ".js");
        String js = generateValidationJs(formName);
        FileUtils.writeStringToFile(file, js);
      }

    }
  }

  public static void main(String... strings) throws IOException {
    generateValidationJsFile("/home/skyline/WorkSpace/.metadata/.plugins/org.eclipse.wst.server.core/tmp0/wtpwebapps/skyline/js/validator/");
    System.out.println("成功生成js文件");
  }
}
TOP

Related Classes of com.skyline.common.validation.ValidationJsGenerator

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.