Advertisement
Guest User

Untitled

a guest
Nov 17th, 2017
65
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 13.77 KB | None | 0 0
  1. package ru.mobileup.tutu.mvp.main.order.passengers.details;
  2.  
  3. import java.util.ArrayList;
  4. import java.util.Calendar;
  5. import java.util.HashSet;
  6. import java.util.List;
  7. import java.util.Set;
  8.  
  9. import ru.mobileup.tutu.core.core.PassengerDocumentType;
  10. import ru.mobileup.tutu.entity.Passenger;
  11. import ru.mobileup.tutu.mvp.main.order.passengers.details.PassengerDetailsContract.ValidationErrorType;
  12.  
  13. import static ru.mobileup.tutu.core.core.PassengerDocumentType.EMPTY;
  14. import static ru.mobileup.tutu.core.core.PassengerDocumentType.FOREIGN_DOCUMENT;
  15.  
  16. public class PassengerValidationUtil {
  17.  
  18.     public static final String DOMESTIC_COUNTRY_CODE = "RUS";
  19.     public static final List<PassengerDocumentType> NON_DOMESTIC_DOC_TYPES = new ArrayList<PassengerDocumentType>() {{
  20.         add(FOREIGN_DOCUMENT);
  21.     }};
  22.  
  23.     public static final Long INVALID_DATE = Long.MIN_VALUE;
  24.  
  25.     private static final String LATIN_CHARS = "qwertyuiopasdfghjklzxcvbnm";
  26.     private static final String MIDDLE_NAME = "отчество";
  27.     private static final String CYRILIC_LIKE_CHARS = "cmtbapokehx";
  28.     private static final String CYRILIC_CHARS = "йцукенгшщзхъфывапролджэячсмитьбю";
  29.  
  30.     public static Set<ValidationErrorType> validate(Passenger passenger) {
  31.         Set<ValidationErrorType> errors = new HashSet<>();
  32.  
  33.         errors.addAll(basicChecks(passenger));
  34.         errors.addAll(documentChecks(passenger));
  35.         errors.addAll(birthDateChecks(passenger));
  36.         errors.addAll(citizenshipChecks(passenger));
  37.  
  38.         return errors;
  39.     }
  40.  
  41.     private static Set<ValidationErrorType> basicChecks(Passenger passenger) {
  42.         Set<ValidationErrorType> errors = new HashSet<>();
  43.  
  44.         String firstName = passenger.getFirstName();
  45.         String lastName = passenger.getLastName();
  46.         String middleName = passenger.getMiddleName();
  47.  
  48.         if (lastName == null || lastName.trim().isEmpty() || lastName.length() > 40 || !hasLetter(lastName)) {
  49.             errors.add(ValidationErrorType.LAST_NAME_ERROR);
  50.         }
  51.  
  52.         if (firstName == null || firstName.trim().isEmpty() || firstName.length() > 20 || !hasLetter(firstName)) {
  53.             errors.add(ValidationErrorType.FIRST_NAME_ERROR);
  54.         }
  55.  
  56.         if (middleName != null) {
  57.             if (middleName.trim().length() > 20) {
  58.                 errors.add(ValidationErrorType.MIDDLE_NAME_ERROR);
  59.             }
  60.  
  61.             if (middleName.trim().toLowerCase().equals(MIDDLE_NAME)) {
  62.                 errors.add(ValidationErrorType.MIDDLE_NAME_ERROR);
  63.             }
  64.  
  65.             if (!middleName.trim().isEmpty()) {
  66.                 if (!hasLetter(middleName) && !middleName.trim().equals("-")) {
  67.                     errors.add(ValidationErrorType.MIDDLE_NAME_ERROR);
  68.                 }
  69.             }
  70.         }
  71.  
  72.         int firstNameLenght = firstName == null ? 0 : firstName.trim().length();
  73.         int lastNameLenght = lastName == null ? 0 : lastName.trim().length();
  74.         int middleNameLenght = middleName == null ? 0 : middleName.trim().length();
  75.  
  76.         if (firstNameLenght + lastNameLenght + middleNameLenght > 73) {
  77.             errors.add(ValidationErrorType.LAST_NAME_ERROR);
  78.         }
  79.  
  80.         return errors;
  81.     }
  82.  
  83.     private static Set<ValidationErrorType> documentChecks(Passenger passenger) {
  84.         Set<ValidationErrorType> errors = new HashSet<>();
  85.  
  86.         String number = passenger.getDocumentNumber();
  87.  
  88.         if (passenger.getDocumentType() != null) {
  89.             if (passenger.getDocumentType() != EMPTY && (number == null || number.trim().isEmpty())) {
  90.                 errors.add(ValidationErrorType.DOCUMENT_NUMBER_EMPTY_ERROR);
  91.             } else {
  92.                 switch (passenger.getDocumentType()) {
  93.                     case INNER_PASSPORT:
  94.                         errors.addAll(checkNameForLatinLetters(passenger));
  95.                         if (!isInnerPassportNumberValid(number)) {
  96.                             errors.add(ValidationErrorType.DOCUMENT_NUMBER_ERROR);
  97.                         }
  98.                         break;
  99.                     case BIRTH_CERTIFICATE:
  100.                         errors.addAll(checkNameForLatinLetters(passenger));
  101.                         if (!isBithCertificateNumberFormatValid(number)) {
  102.                             errors.add(ValidationErrorType.DOCUMENT_NUMBER_ERROR);
  103.                         }
  104.                         break;
  105.                     case SAILOR_DOC:
  106.                         errors.addAll(checkNameForLatinLetters(passenger));
  107.                         if (!isSailorDocNumberValid(number)) {
  108.                             errors.add(ValidationErrorType.DOCUMENT_NUMBER_ERROR);
  109.                         }
  110.                         break;
  111.                     case MILITARY_DOC:
  112.                         errors.addAll(checkNameForLatinLetters(passenger));
  113.                         if (!isMilitaryDocNumberValid(number)) {
  114.                             errors.add(ValidationErrorType.DOCUMENT_NUMBER_ERROR);
  115.                         }
  116.                         break;
  117.                     case OUTER_PASSPORT:
  118.                         if (!isOuterPassportNumberValid(number)) {
  119.                             errors.add(ValidationErrorType.DOCUMENT_NUMBER_ERROR);
  120.                         }
  121.                         break;
  122.                     case FOREIGN_DOCUMENT:
  123.                         if (!isForeignPassportNumberValid(number)) {
  124.                             errors.add(ValidationErrorType.DOCUMENT_NUMBER_ERROR);
  125.                         }
  126.                         break;
  127.                     case EMPTY:
  128.                         if (number != null && !number.trim().isEmpty()) {
  129.                             errors.add(ValidationErrorType.DOCUMENT_NUMBER_ERROR);
  130.                         }
  131.                         break;
  132.                 }
  133.             }
  134.         } else {
  135.             if (number != null && !number.trim().isEmpty()) {
  136.                 errors.add(ValidationErrorType.DOCUMENT_TYPE_ERROR);
  137.             }
  138.         }
  139.  
  140.         return errors;
  141.     }
  142.  
  143.     private static Set<ValidationErrorType> birthDateChecks(Passenger passenger) {
  144.         Set<ValidationErrorType> errors = new HashSet<>();
  145.  
  146.         Long birthday = passenger.getBirthday();
  147.         if (birthday != null) {
  148.             if (birthday.equals(INVALID_DATE)) { // format error
  149.                 errors.add(ValidationErrorType.BIRTHDAY_ERROR);
  150.             }
  151.  
  152.             if (birthday > System.currentTimeMillis()) {
  153.                 errors.add(ValidationErrorType.BIRTHDAY_ERROR);
  154.             }
  155.  
  156.             Calendar calendar = Calendar.getInstance();
  157.             calendar.set(Calendar.YEAR, 1900);
  158.             calendar.set(Calendar.MONTH, Calendar.JANUARY);
  159.             calendar.set(Calendar.DAY_OF_YEAR, 1);
  160.  
  161.             if (birthday < calendar.getTimeInMillis()) {
  162.                 errors.add(ValidationErrorType.BIRTHDAY_ERROR);
  163.             }
  164.         }
  165.         return errors;
  166.     }
  167.  
  168.     private static Set<ValidationErrorType> citizenshipChecks(Passenger passenger) {
  169.         Set<ValidationErrorType> errors = new HashSet<>();
  170.  
  171.         String citizenship = passenger.getCitizenship();
  172.         PassengerDocumentType documentType = passenger.getDocumentType();
  173.  
  174.         if (DOMESTIC_COUNTRY_CODE.equals(citizenship) && NON_DOMESTIC_DOC_TYPES.contains(documentType)) {
  175.             errors.add(ValidationErrorType.CITIZENSHIP_ERROR);
  176.         } else if ((documentType == null || documentType == EMPTY) && citizenship != null) {
  177.             errors.add(ValidationErrorType.CITIZENSHIP_ERROR);
  178.         }
  179.         return errors;
  180.     }
  181.  
  182.     private static Set<ValidationErrorType> checkNameForLatinLetters(Passenger passenger) {
  183.         Set<ValidationErrorType> errors = new HashSet<>();
  184.  
  185.         if (passenger.getFirstName() != null && hasLatinLetters(passenger.getFirstName())) {
  186.             errors.add(ValidationErrorType.FIRST_NAME_ERROR);
  187.         }
  188.         if (passenger.getLastName() != null && hasLatinLetters(passenger.getLastName())) {
  189.             errors.add(ValidationErrorType.LAST_NAME_ERROR);
  190.         }
  191.  
  192.         if (passenger.getMiddleName() != null && hasLatinLetters(passenger.getMiddleName())) {
  193.             errors.add(ValidationErrorType.MIDDLE_NAME_ERROR);
  194.         }
  195.         return errors;
  196.     }
  197.  
  198.     private static boolean hasLetter(String string) {
  199.         for (char next : string.toCharArray()) {
  200.             if (Character.isLetter(next)) {
  201.                 return true;
  202.             }
  203.         }
  204.         return false;
  205.     }
  206.  
  207.     private static boolean hasLatinLetters(String name) {
  208.         String lowerCaseName = name.toLowerCase();
  209.         for (char c : LATIN_CHARS.toCharArray()) {
  210.             if (lowerCaseName.contains(String.valueOf(c))) {
  211.                 return true;
  212.             }
  213.         }
  214.         return false;
  215.     }
  216.  
  217.     private static boolean digitsOnly(String string) {
  218.         for (char c : string.toCharArray()) {
  219.             if (!Character.isDigit(c)) {
  220.                 return false;
  221.             }
  222.         }
  223.         return true;
  224.     }
  225.  
  226.     private static boolean cyrilicLikeCharsOnly(String string) {
  227.         for (char c : string.toLowerCase().toCharArray()) {
  228.             String character = Character.toString(c);
  229.             if (!CYRILIC_CHARS.contains(character) && !CYRILIC_LIKE_CHARS.contains(character)) {
  230.                 return false;
  231.             }
  232.         }
  233.         return true;
  234.     }
  235.  
  236.     private static boolean isInnerPassportNumberValid(String string) {
  237.         if (string != null) {
  238.             string = string.replaceAll("[ \\-]", "");
  239.  
  240.             if (string.length() != 10 || !digitsOnly(string)) {
  241.                 return false;
  242.             }
  243.         } else {
  244.             return false;
  245.         }
  246.         return true;
  247.     }
  248.  
  249.     private static boolean isBithCertificateNumberFormatValid(String string) {
  250.         if (string != null) {
  251.             string = string.replaceAll("[№ \\-]", "");
  252.  
  253.             if (string.length() < 9) {
  254.                 return false;
  255.             }
  256.             String firstToken = string.substring(0, string.length() - 8).toUpperCase();
  257.             String secondToken = string.substring(string.length() - 8, string.length() - 6).toUpperCase();
  258.             String thirdToken = string.substring(string.length() - 6, string.length()).toUpperCase();
  259.  
  260.             if (!firstToken.replaceAll("[IVX]", "").isEmpty() || romanToDecimal(firstToken) > 35) {
  261.                 return false;
  262.             }
  263.  
  264.             if (!cyrilicLikeCharsOnly(secondToken)) {
  265.                 return false;
  266.             }
  267.  
  268.             return digitsOnly(thirdToken);
  269.         } else {
  270.             return false;
  271.         }
  272.     }
  273.  
  274.     private static int romanToDecimal(java.lang.String romanNumber) {
  275.         int decimal = 0;
  276.         int lastNumber = 0;
  277.         String romanNumeral = romanNumber.toUpperCase();
  278.  
  279.         for (int x = romanNumeral.length() - 1; x >= 0; x--) {
  280.             char convertToDecimal = romanNumeral.charAt(x);
  281.  
  282.             switch (convertToDecimal) {
  283.                 case 'X':
  284.                     decimal = processDecimal(10, lastNumber, decimal);
  285.                     lastNumber = 10;
  286.                     break;
  287.  
  288.                 case 'V':
  289.                     decimal = processDecimal(5, lastNumber, decimal);
  290.                     lastNumber = 5;
  291.                     break;
  292.  
  293.                 case 'I':
  294.                     decimal = processDecimal(1, lastNumber, decimal);
  295.                     lastNumber = 1;
  296.                     break;
  297.  
  298.                 default:
  299.                     return Integer.MAX_VALUE;
  300.             }
  301.         }
  302.         return decimal;
  303.     }
  304.  
  305.     private static int processDecimal(int decimal, int lastNumber, int lastDecimal) {
  306.         if (lastNumber > decimal) {
  307.             return lastDecimal - decimal;
  308.         } else {
  309.             return lastDecimal + decimal;
  310.         }
  311.     }
  312.  
  313.     private static boolean isSailorDocNumberValid(String string) {
  314.         if (string != null) {
  315.             string = string.replaceAll("[ \\-]", "").toLowerCase();
  316.  
  317.             if (string.length() != 9) {
  318.                 return false;
  319.             }
  320.  
  321.             boolean digitsStarted = false;
  322.             for (int i = 0; i < string.length(); i++) {
  323.                 if (Character.isLetter(string.charAt(i))) {
  324.                     if (i >= 2 || digitsStarted) {
  325.                         return false;
  326.                     }
  327.                 } else if (Character.isDigit(string.charAt(i))) {
  328.                     if (!digitsStarted) {
  329.                         digitsStarted = true;
  330.                     }
  331.                 } else {
  332.                     return false;
  333.                 }
  334.             }
  335.             return true;
  336.         } else {
  337.             return false;
  338.         }
  339.     }
  340.  
  341.     private static boolean isMilitaryDocNumberValid(String string) {
  342.         if (string != null) {
  343.             for (char c : string.toCharArray()) {
  344.                 if (Character.isDigit(c)) {
  345.                     return true;
  346.                 }
  347.             }
  348.             return false;
  349.         } else {
  350.             return false;
  351.         }
  352.     }
  353.  
  354.     private static boolean isOuterPassportNumberValid(String string) {
  355.         if (string != null) {
  356.             string = string.replaceAll("[ \\-]", "");
  357.             if (string.length() != 9) {
  358.                 return false;
  359.             }
  360.  
  361.             for (char c : string.toCharArray()) {
  362.                 if (!Character.isDigit(c)) {
  363.                     return false;
  364.                 }
  365.             }
  366.             return true;
  367.         } else {
  368.             return false;
  369.         }
  370.     }
  371.  
  372.     private static boolean isForeignPassportNumberValid(String string) {
  373.         if (string != null) {
  374.             string = string.replaceAll("[ \\-]", "");
  375.  
  376.             return string.length() <= 16;
  377.         } else {
  378.             return false;
  379.         }
  380.     }
  381.  
  382. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement