Advertisement
Guest User

Untitled

a guest
Dec 21st, 2014
304
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 3.80 KB | None | 0 0
  1. package ssn;
  2.  
  3. import java.text.DateFormatSymbols;
  4. import java.util.ArrayList;
  5. import java.util.Calendar;
  6. import java.util.Date;
  7. import java.util.GregorianCalendar;
  8. import java.util.Iterator;
  9. import java.util.List;
  10. import java.util.regex.Matcher;
  11. import java.util.regex.Pattern;
  12.  
  13. public class SwedishSocialSecurityNumber {
  14.     private Integer _year;
  15.     private Integer _month;
  16.     private Integer _day;
  17.     private String _code;
  18.  
  19.     private Pattern _tenDigitPattern;
  20.     private Matcher _matcher;
  21.     private boolean _isOver100;
  22.  
  23.     private static final String TEN_DIGIT_PATTERN = "^[0-9]{2}[0-1][0-9][0-3][0-9][-|+][0-9]{4}$";
  24.  
  25.     public SwedishSocialSecurityNumber(String socialSecurityNumber)
  26.             throws IllegalArgumentException {
  27.         socialSecurityNumber = socialSecurityNumber.trim();
  28.         _tenDigitPattern = Pattern.compile(TEN_DIGIT_PATTERN);
  29.         _isOver100 = false;
  30.  
  31.         if (!this.isTenDigit(socialSecurityNumber))
  32.             throw new IllegalArgumentException("The format has to be YYMMDD-XXXX or YYMMDD+XXXX");
  33.  
  34.         try {
  35.             _year = Integer.parseInt(socialSecurityNumber.substring(0, 2));
  36.             _month = Integer.parseInt(socialSecurityNumber.substring(2, 4));
  37.             _day = Integer.parseInt(socialSecurityNumber.substring(4, 6));
  38.             _code = socialSecurityNumber.substring(7, 11);
  39.         } catch (Exception e) {
  40.             throw new IllegalArgumentException("Error when parsing date parts from the SSN given");
  41.         }
  42.  
  43.         if (socialSecurityNumber.charAt(6) == '+')
  44.             _isOver100 = true;
  45.  
  46.         if(!this.isDateValid(this.getYear(), _month, _day))
  47.             throw new IllegalArgumentException("The date given is not valid or is fictional");
  48.        
  49.         Integer checkSum = this.getCheckSum(socialSecurityNumber);
  50.         String lastNumber = socialSecurityNumber.substring(socialSecurityNumber
  51.                 .length() - 1);
  52.  
  53.         if (!checkSum.toString().equals(lastNumber)) {
  54.             throw new IllegalArgumentException("The control number is invalid");
  55.         }
  56.     }
  57.  
  58.     public int getYear() {
  59.         int tempInt = 0;
  60.  
  61.         Integer Year = Calendar.getInstance().get(Calendar.YEAR);
  62.  
  63.         if (_year < 10)
  64.             tempInt = Integer.parseInt(String.format("%s0%d", Year.toString()
  65.                     .substring(0, 2), _year));
  66.         else
  67.             tempInt = Integer.parseInt(String.format("%s%d", Year.toString()
  68.                     .substring(0, 2), _year));
  69.  
  70.         if (_isOver100)
  71.             return tempInt - 100;
  72.         if (tempInt > Year)
  73.             return tempInt - 100;
  74.  
  75.         return tempInt;
  76.  
  77.     }
  78.  
  79.     public String getMonth() {
  80.         DateFormatSymbols dfs = new DateFormatSymbols();
  81.         return dfs.getMonths()[_month - 1];
  82.     }
  83.  
  84.     public int getMonthNumber() {
  85.         return _month;
  86.     }
  87.  
  88.     public int getDay() {
  89.         return _day;
  90.     }
  91.  
  92.     public String getCode() {
  93.         return _code;
  94.     }
  95.  
  96.     private boolean isTenDigit(String number) {
  97.         _matcher = _tenDigitPattern.matcher(number);
  98.         return _matcher.matches();
  99.     }
  100.  
  101.  
  102.     private Integer getCheckSum(String number) {
  103.         int variegated = 2;
  104.         Integer temp = 0;
  105.         List<Integer> list = new ArrayList<Integer>();
  106.         for (int i = 0; i < number.length() - 1; i++) {
  107.             if (i == 6)
  108.                 continue;
  109.             temp = Character.getNumericValue(number.charAt(i));
  110.  
  111.             temp = temp * variegated;
  112.  
  113.             for (int j = 0; j < temp.toString().length(); j++) {
  114.                 list.add(Character.getNumericValue(temp.toString().charAt(j)));
  115.             }
  116.            
  117.             variegated = variegated == 2 ? 1 : 2;
  118.         }
  119.  
  120.         int sum = 0;
  121.         Iterator<Integer> iter = list.iterator();
  122.         while (iter.hasNext()) {
  123.             sum = sum + iter.next();
  124.         }
  125.         return (10 - (sum % 10));
  126.     }
  127.    
  128.     private boolean isDateValid(int year, int month, int day){
  129.         Calendar cal = null;
  130.         try {
  131.             cal = new GregorianCalendar();
  132.             cal.setLenient(false);
  133.             cal.set(year, month - 1, day);
  134.             cal.getTime();
  135.         } catch (Exception e) {        
  136.             return false;
  137.         }
  138.         Date currentDate = new Date();
  139.         if(cal.getTime().compareTo(currentDate) > 0) return false;
  140.         return true;
  141.     }
  142.  
  143. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement