Untitled

 avatar
unknown
java
4 years ago
13 kB
2
Indexable
package com.bssys.core.common.check;

import com.bssys.bird.doctype.schema.DocContentDef;
import com.bssys.bird.doctype.schema.DocSchema;
import com.bssys.bird.oapi.doc.DocTypeInfo;
import com.bssys.bird.doctype.check.DocCheckExecuteContext;
import com.bssys.bird.oapi.edit.check.ICheckParam;
import com.google.common.collect.ImmutableMap;
import com.bssys.oapi.resource.AppObjResources;
import org.springframework.util.StringUtils;

import java.util.ArrayList;
import java.util.List;
import java.util.TreeSet;


import static com.bssys.bird.doctype.check.CheckUtils.LIST_SPLITTER;
import static com.bssys.bird.doctype.check.CheckUtils.convertString;
import static com.bssys.bird.doctype.check.CheckUtils.fail;
import static com.bssys.bird.doctype.check.CheckUtils.filterValidCharacters;
import static com.bssys.bird.doctype.check.CheckUtils.getIntegerParam;
import static com.bssys.bird.doctype.check.CheckUtils.getStringParam;
import static com.bssys.bird.doctype.check.CheckUtils.isStringEmpty;
import static com.bssys.bird.doctype.check.CheckUtils.getFieldValue;
import static com.bssys.bird.doctype.check.CheckUtils.getStringField;

import static com.bssys.util.StringUtilities.clearCrLf;
import static com.bssys.util.StringUtilities.emptyIfNull;

/**
 * Created by IntelliJ IDEA.
 * User: ira1512
 * Date: 06.05.2006
 * Time: 11:22:27
 * To change this template use File | Settings | File Templates.
 */
public class MinLengthCheck {
  public static final String NAME_ALIAS = "fieldName";
  public static final String VALIDCHARACTERS_PARAM = "validCharacters";
  private static final String VALIDCHARACTERS_RU_PARAM = "validCharactersRU";
  private static final String MAX_LENGTH_PARAM = "minLength";
  private static final String PARAM_FIELD_ALIAS = "paramField";
  private static final String PARAM_VALUE_ALIAS = "paramValue";
  private static final String CHEKED_FIELDS_LIST = "fields";
  private static final String PAYMENT_DIRECTION_FIELD = "paymentDirectionField";
  private static final String CHECK_CYRILLIC_PARAM = "checkCyrillic";
  private static final String ALLOWED_TAIL_PARAM = "allowedTail";
  private static final String STRIP_TRAILING_CR_PARAM = "stripTrailingCR";
  private static final String INVALIDCHARS = "INVALIDCHARS";
  private static final String FIELD_NAME = "FIELDNAME";

  private static final String MAXLENGTH_PARAM_NAME = "MINLENGTH";
  private static final String LENGTH_PARAM_NAME = "LENGTH";
  private static final String FAIL_CODE_6 = "6";

  public void characters(DocCheckExecuteContext context) {

    String fieldName = getStringField(NAME_ALIAS, context);
    if (isStringEmpty(fieldName)) {
      return;
    }

    String validCharacters = getStringParam(VALIDCHARACTERS_PARAM, context);
    validCharacters = convertString(validCharacters);

    String invalidChars = filterValidCharacters(fieldName, validCharacters, " ");

    if (invalidChars != null) {
      fail("5", context, INVALIDCHARS, invalidChars);
    }
  }


/*Проверять, что если PARAM_FIELD_ALIAS равно:
    - 0, то в поле содержаться только допустимые VALIDCHARACTERS_PARAM
    - 1, то в поле содержаться только допустимые VALIDCHARACTERS_RU_PARAM
*/

  public void charactersIncludingRU(DocCheckExecuteContext context) {
    final String fieldName = getStringField(NAME_ALIAS, context);
    if (isStringEmpty(fieldName)) {
      return;
    }

    final String validCharacters = getStringParam(VALIDCHARACTERS_PARAM, context);
    final String validCharactersRU = getStringParam(VALIDCHARACTERS_RU_PARAM, context);

    String convertedValidCharacters = null;
    if (paymentIsOutside(context)) {
      convertedValidCharacters = convertString(validCharacters);
    } else if (paymentIsInside(context)) {
      convertedValidCharacters = convertString(validCharactersRU);
    }

    if (convertedValidCharacters != null) {
      final String invalidChars = filterValidCharacters(fieldName, convertedValidCharacters, " ");

      if (invalidChars != null) {
        fail("INVALID_CHARS_ERROR", context, INVALIDCHARS, invalidChars);
      }
    }
  }

  private boolean paymentIsOutside(DocCheckExecuteContext context) {
    return "0".equals(getStringField(PARAM_FIELD_ALIAS, context));
  }

  private boolean paymentIsInside(DocCheckExecuteContext context) {
    return "1".equals(getStringField(PARAM_FIELD_ALIAS, context));
  }

  public void charactersParam(DocCheckExecuteContext context) {

    Object fieldValue = getFieldValue(PARAM_FIELD_ALIAS, context);
    String valueField = fieldValue == null ? null : fieldValue.toString();

    ICheckParam param = context.getParam(PARAM_VALUE_ALIAS);
    String stringParam = param == null ? null : param.getValue();

    if (valueField != null && stringParam != null && StringUtils.hasText(valueField) && stringParam.equals(valueField)) {
      characters(context);
    }
  }

  public void charactersParamForListOfField(DocCheckExecuteContext context) {

    String paramFieldValue = getStringField(PARAM_FIELD_ALIAS, context);
    String paramControlValue = getStringParam(PARAM_VALUE_ALIAS, context);
    if (StringUtils.hasText(paramFieldValue) && StringUtils.hasText(paramControlValue)
        && paramFieldValue.equals(paramControlValue))
    {
      String validCharacters = getStringParam(VALIDCHARACTERS_PARAM, context);
      String validCharactersRU = getStringParam(VALIDCHARACTERS_RU_PARAM, context);
      if ("true".equalsIgnoreCase(getStringParam(CHECK_CYRILLIC_PARAM, context))) {
        if ("1".equals(getStringField(PAYMENT_DIRECTION_FIELD, context))) {
          validCharacters = convertString(validCharactersRU);
        }
      }

      validCharacters = convertString(validCharacters);

      String list = getStringParam(CHEKED_FIELDS_LIST, context);
      String[] fieldsList = list == null ? null : LIST_SPLITTER.split(list);

      boolean isValid = true;

      if (fieldsList != null) {
        TreeSet<Character> invalidChars = new TreeSet<Character>();
        for (String fieldName : fieldsList) {

          String fieldValue = getStringField(fieldName, context);
          if (StringUtils.hasText(fieldValue)) {
            filterValidCharacters(invalidChars, fieldValue, validCharacters);
            if (!invalidChars.isEmpty()) {
              isValid = false;
            }
          }
        }
        if (!isValid) {
          fail("notValid", context, INVALIDCHARS, org.apache.commons.lang.StringUtils.join(invalidChars, " "));
        }
      }

    }
  }

  public void length(DocCheckExecuteContext context) {
    // Проверять, что длина поля не превышает заданного количества символов,
    // в противном случае сообщение [6].
    String fieldName = getStringField(NAME_ALIAS, context);
    if (isStringEmpty(fieldName)) {
      return;
    }

    int maxLen = getIntegerParam(MAX_LENGTH_PARAM, context);
    if (fieldName.length() < maxLen) {
      fail("6", context, ImmutableMap.<String, Object>of("MAXLENGTH", maxLen, "LENGTH", fieldName.length()));
    }
  }

  /**
   * Проверять, что длина поля не превышает заданного количества символов,
   * в противном случае сообщение [6].
   * ALLOWED_TAIL_PARAM - находящаяся в хвосте строка, которая в подсчете длины не участвует. Например, это нужно,
   * когда при подписании в коммент вставляется системный комментарий, и его учитывать не нужно.
   * STRIP_TRAILING_CR_PARAM - отбрасывать ли хвостовой перевод строки
   */
  public void checkLengthIgnoreTail(DocCheckExecuteContext context) {
    String fieldValue = getStringField(NAME_ALIAS, context);
    if (isStringEmpty(fieldValue)) {
      return;
    }

    String allowedTail = getStringParam(ALLOWED_TAIL_PARAM, context);
    boolean stripTrailingCR = "true".equalsIgnoreCase(getStringParam(STRIP_TRAILING_CR_PARAM, context));
    if (allowedTail != null && fieldValue.endsWith(allowedTail)) {
      fieldValue = fieldValue.substring(0, fieldValue.length() - allowedTail.length() );
      if (stripTrailingCR && fieldValue.endsWith("\n")) {
        fieldValue = fieldValue.substring(0, fieldValue.length() - 1);
      }
    }
    int maxLen = getIntegerParam(MAX_LENGTH_PARAM, context);
    if (fieldValue.length() > maxLen) {
      fail("6", context, ImmutableMap.<String, Object>of("MAXLENGTH", maxLen, "LENGTH", fieldValue.length()));
    }
  }

  /**
   * Проверка длины поля без учета символов переноса строки
   */
  public void checkLengthIgnoreCrLf(DocCheckExecuteContext context) {
    String checkedValue = clearCrLf(emptyIfNull(getStringField(NAME_ALIAS, context)));

    int maxLen = getIntegerParam(MAX_LENGTH_PARAM, context);
    if (checkedValue.length() > maxLen) {
      fail(FAIL_CODE_6, context, ImmutableMap.of(MAXLENGTH_PARAM_NAME, maxLen, LENGTH_PARAM_NAME, checkedValue.length()));
    }
  }

  public void charactersForEMail(DocCheckExecuteContext context) {
    String fieldName = getStringField(NAME_ALIAS, context);
    if (isStringEmpty(fieldName)) {
      return;
    }

    String validCharacters = getStringParam(VALIDCHARACTERS_PARAM, context);
    validCharacters = convertString(validCharacters);

    String invalidChars = filterValidCharacters(fieldName, validCharacters, " ");

    if (invalidChars != null) {
      fail("5", context, INVALIDCHARS, invalidChars);
      return;
    }
    if (!fieldName.contains("@") || fieldName.startsWith("@") || fieldName.endsWith("@")|| !fieldName.contains(".") || fieldName.startsWith(".") || fieldName.endsWith(".")) {
      fail("wrongEMail", context);
    }
  }


  public void spaceExist(DocCheckExecuteContext context) {
    String fieldName = getStringField(NAME_ALIAS, context);
    if (fieldName == null) {
      return;
    }
    if (fieldName.contains(" ")) {
      fail("0", context);
    }
  }

  /**
   * Проверка на наличие в поле платежного документа символов, не входящих в кодировку ISO8859-5.
   * Поля для контроля задаются в настройках чекера.
   * В параметрах ошибки передаются описание поля, в котором найдены невалидные символы и перечень таких символов.
   */
  public void checkValidSymbols(DocCheckExecuteContext context) {
    String stringOfCheckingFields = getStringParam(CHEKED_FIELDS_LIST, context);

    if (!StringUtils.hasText(stringOfCheckingFields)) {
      return;
    }

    List<String> checkingFields = stringToList(stringOfCheckingFields);
    String convertedValidCharacters = convertString(getStringParam(VALIDCHARACTERS_PARAM, context));

    for (String checkingField : checkingFields) {
      String fieldValue = getStringField(checkingField, context);

      if (!StringUtils.hasText(fieldValue)) {
        continue;
      }

      String invalidChars = filterValidCharacters(fieldValue, convertedValidCharacters, " ");

      if (StringUtils.hasText(invalidChars)) {
        DocTypeInfo docType = context.getDoc().getDocType();
        DocSchema ds = AppObjResources.getDocSchema(docType);
        DocContentDef contentDef = ds.getContent();
        String fieldName = contentDef.getDocFieldDef(checkingField).getDesc();

        fail("0", context, ImmutableMap.<String, Object>of(FIELD_NAME, fieldName, INVALIDCHARS, invalidChars));
      }
    }
  }

  /**
   * Преобразует строку в список строк, используя в качестве разделителя запятую. Дополнительно удаляет пробелы
   * по краям получившегося элемента.
   *
   * @param stringParam строка с параметрами, которую нужно преобразовать.
   * @return список, содержащий отдельные строковые элементы.
   */
  private List<String> stringToList(String stringParam) {
    String[] strValues = LIST_SPLITTER.split(stringParam);
    List<String> result = new ArrayList<String>();

    for (String value : strValues) {
      value = value.trim();
      if (!value.isEmpty()) {
        result.add(value);
      }
    }

    return result;
  }
}
Editor is loading...