
no.bekk.bekkopen.banking.KontonummerValidator Maven / Gradle / Ivy
package no.bekk.bekkopen.banking;
import no.bekk.bekkopen.common.StringNumberValidator;
import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;
import static no.bekk.bekkopen.common.Checksums.ERROR_INVALID_CHECKSUM;
import static no.bekk.bekkopen.common.Checksums.calculateMod11CheckSum;
import static no.bekk.bekkopen.common.Checksums.getMod11Weights;
/**
* Provides methods that validates if a Kontonummer is valid with respect to
* syntax (length and digits only) and that the checksum digit is correct.
*/
public class KontonummerValidator extends StringNumberValidator implements ConstraintValidator {
private static final int LENGTH = 11;
protected static final int ACCOUNTTYPE_NUM_DIGITS = 2;
protected static final int REGISTERNUMMER_NUM_DIGITS = 4;
private static final String NOT_ALLOWED_AS_LEADING = "0000";
public static final String ERROR_LEADING_ZEROS = "Leading zeros too many : ";
private KontonummerValidator() {
super();
}
/**
* Return true if the provided String is a valid Kontonummmer.
*
* @param kontonummer A String containing a Kontonummer
* @return true or false
*/
public static boolean isValid(String kontonummer) {
try {
KontonummerValidator.getKontonummer(kontonummer);
return true;
} catch (IllegalArgumentException e) {
return false;
}
}
/**
* Returns an object that represents a Kontonummer.
*
* @param kontonummer A String containing a Kontonummer
* @return A Kontonummer instance
* @throws IllegalArgumentException thrown if String contains an invalid Kontonummer
*/
public static Kontonummer getKontonummer(String kontonummer) throws IllegalArgumentException {
validateSyntax(kontonummer);
validateChecksum(kontonummer);
return new Kontonummer(kontonummer);
}
/**
* Returns an object that represents a Kontonummer. The checksum of the
* supplied kontonummer is changed to a valid checksum if the original
* kontonummer has an invalid checksum.
*
* @param kontonummer A String containing a Kontonummer
* @return A Kontonummer instance
* @throws IllegalArgumentException thrown if String contains an invalid Kontonummer, ie. a
* number which for one cannot calculate a valid checksum.
*/
public static Kontonummer getAndForceValidKontonummer(String kontonummer) {
validateSyntax(kontonummer);
try {
validateChecksum(kontonummer);
} catch (IllegalArgumentException iae) {
Kontonummer k = new Kontonummer(kontonummer);
int checksum = calculateMod11CheckSum(getMod11Weights(k), k);
kontonummer = kontonummer.substring(0, LENGTH - 1) + checksum;
}
return new Kontonummer(kontonummer);
}
static void validateSyntax(String kontonummer) {
if (kontonummer.startsWith(NOT_ALLOWED_AS_LEADING)) {
throw new IllegalArgumentException(ERROR_LEADING_ZEROS + kontonummer);
}
validateLengthAndAllDigits(kontonummer, LENGTH);
}
static void validateAccountTypeSyntax(String accountType) {
validateLengthAndAllDigits(accountType, ACCOUNTTYPE_NUM_DIGITS);
}
static void validateRegisternummerSyntax(String registernummer) {
validateLengthAndAllDigits(registernummer, REGISTERNUMMER_NUM_DIGITS);
}
static void validateChecksum(String kontonummer) {
Kontonummer k = new Kontonummer(kontonummer);
int k1 = calculateMod11CheckSum(getMod11Weights(k), k);
if (k1 != k.getChecksumDigit()) {
throw new IllegalArgumentException(ERROR_INVALID_CHECKSUM + kontonummer);
}
}
public void initialize(no.bekk.bekkopen.banking.annotation.Kontonummer constraintAnnotation) {
}
public boolean isValid(String kontonummer, ConstraintValidatorContext context) {
if(kontonummer == null){
return true;
}
return isValid(kontonummer);
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy