All Downloads are FREE. Search and download functionalities are using the official Maven repository.

no.bekk.bekkopen.person.FodselsnummerCalculator Maven / Gradle / Ivy

package no.bekk.bekkopen.person;

import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.*;

/**
 * This class calculates valid Fodselsnummer instances for a given date.
 */
public class FodselsnummerCalculator {

	private FodselsnummerCalculator() {
		super();
	}

	/**
	 * Returns a List with valid Fodselsnummer instances for a given Date and gender.
	 */
	public static List getFodselsnummerForDateAndGender(Date date, KJONN kjonn) {
		List result = getManyFodselsnummerForDate(date);
		splitByGender(kjonn, result);
		return result;
	}

	/**
	 * Return one random valid fodselsnummer on a given date
	 */
	public static Fodselsnummer getFodselsnummerForDate(Date date){
		List fodselsnummerList = getManyFodselsnummerForDate(date);
		Collections.shuffle(fodselsnummerList);
		return fodselsnummerList.get(0);
	}

	/**
	 * Returns a List with with VALID DNumber Fodselsnummer instances for a given Date.
	 *
	 * @param date The Date instance
	 * @return A List with Fodelsnummer instances
	 */

	public static List getManyDNumberFodselsnummerForDate(Date date) {
		if (date == null) {
			throw new IllegalArgumentException();
		}
		DateFormat df = new SimpleDateFormat("ddMMyy");
		String centuryString = getCentury(date);
		String dateString = df.format(date);
		dateString = new StringBuilder()
				.append(Character.toChars(dateString.charAt(0) + 4)[0])
				.append(dateString.substring(1))
				.toString();
		return generateFodselsnummerForDate(dateString, centuryString);
	}

	/**
	 * Returns a List with with VALID Fodselsnummer instances for a given Date.
	 *
	 * @param date The Date instance
	 * @return A List with Fodelsnummer instances
	 */

	public static List getManyFodselsnummerForDate(Date date) {
		if (date == null) {
			throw new IllegalArgumentException();
		}
		DateFormat df = new SimpleDateFormat("ddMMyy");
		String centuryString = getCentury(date);
		String dateString = df.format(date);
		return generateFodselsnummerForDate(dateString, centuryString);
	}

	private static List generateFodselsnummerForDate(String dateString, String centuryString) {
		List result = new ArrayList();
		for (int i = 999; i >= 0; i--) {
			StringBuilder sb = new StringBuilder(dateString);
			if (i < 10) {
				sb.append("00");
			} else if (i < 100) {
				sb.append("0");
			}
			sb.append(i);
			Fodselsnummer fodselsnummer = new Fodselsnummer(sb.toString());
			try {
				sb.append(FodselsnummerValidator.calculateFirstChecksumDigit(fodselsnummer));
				fodselsnummer = new Fodselsnummer(sb.toString());

				sb.append(FodselsnummerValidator.calculateSecondChecksumDigit(fodselsnummer));
				fodselsnummer = new Fodselsnummer(sb.toString());

				String centuryByIndividnummer = fodselsnummer.getCentury();
				if (centuryByIndividnummer != null && centuryByIndividnummer.equals(centuryString) && FodselsnummerValidator.isValid(fodselsnummer.getValue())) {
					result.add(fodselsnummer);
				}
			} catch (IllegalArgumentException e) {
				continue;
			}
		}
		return result;
	}

	private static String getCentury(Date date) {
		Calendar c = Calendar.getInstance();
		c.setTime(date);
		int year = c.get(Calendar.YEAR);
		return Integer.toString(year).substring(0, 2);
	}

	private static void splitByGender(KJONN kjonn, List result) {
		Iterator iter = result.iterator();
		while (iter.hasNext()) {
			Fodselsnummer f = iter.next();
			if (f.getKjonn() != kjonn) {
				iter.remove();
			}
		}
	}

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy