private List<Field> findUserCustomedRequiredFields(
      Class<?> modelClass, List<ModelField> userCustomedFields) {

    List<Field> requiredField = new ArrayList<Field>();
    for (ModelField modelField : userCustomedFields) {
      if (modelField.isNotNull()) {
        String name = modelField.getName();
        Field field = ModelReflectionUtil.getModelField(name, modelClass);
        requiredField.add(field);
      }
    }
    return requiredField;
  }
  /**
   * TODO use one single json file to configure thease default fields in both install and parse
   * phrases
   *
   * @return field bean names which is
   */
  private HashMap<Class<?>, List<Field>> parseDefaultRequiredFields() throws Exception {

    if (DefaultRequiredFieldsCache != null) {
      return DefaultRequiredFieldsCache;
    }

    HashMap<Class<?>, List<Field>> result = new HashMap<Class<?>, List<Field>>();

    for (String[] requiredFields : reservedModelRequiredFields) {
      String className = ReservedModelPackage + "." + requiredFields[0];
      Class<?> clazz = Class.forName(className);
      List<Field> fields = new ArrayList<Field>();
      Field[] allFields = ModelReflectionUtil.getModelFields(clazz);
      // if(clazz==CommentBase.class){
      // System.out.print(0);
      // }

      if (requiredFields.length > 1) {
        for (int i = 1; i < requiredFields.length; i++) {
          Field field = null;
          String fieldName = requiredFields[i];
          for (Field f : allFields) {
            if (f.getName().equals(fieldName)) {
              field = f;
              break;
            }
          }
          if (field == null) {
            throw new NoSuchFieldException(className + "." + fieldName);
          }
          logger.debug("add field " + field.getName() + " to class " + clazz);
          fields.add(field);
        }
      }

      result.put(clazz, fields);
    }
    DefaultRequiredFieldsCache = result;
    return DefaultRequiredFieldsCache;
  }