at.gv.egovernment.moa.id.configuration.validation.CompanyNumberValidator.java Source code

Java tutorial

Introduction

Here is the source code for at.gv.egovernment.moa.id.configuration.validation.CompanyNumberValidator.java

Source

/*******************************************************************************
 * Copyright 2014 Federal Chancellery Austria
 * MOA-ID has been developed in a cooperation between BRZ, the Federal
 * Chancellery Austria - ICT staff unit, and Graz University of Technology.
 *
 * Licensed under the EUPL, Version 1.1 or - as soon they will be approved by
 * the European Commission - subsequent versions of the EUPL (the "Licence");
 * You may not use this work except in compliance with the Licence.
 * You may obtain a copy of the Licence at:
 * http://www.osor.eu/eupl/
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the Licence is distributed on an "AS IS" basis,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the Licence for the specific language governing permissions and
 * limitations under the Licence.
 *
 * This product combines work with different licenses. See the "NOTICE" text
 * file for details on the various modules and licenses.
 * The "NOTICE" text file is part of the distribution. Any derivative works
 * that you distribute must include a readable copy of the "NOTICE" text file.
 *******************************************************************************/
package at.gv.egovernment.moa.id.configuration.validation;

import org.apache.commons.lang.StringUtils;

import at.gv.egovernment.moa.id.configuration.Constants;

public class CompanyNumberValidator implements IdentificationNumberValidator {

    public boolean validate(String commercialRegisterNumber) {

        String normalizedNumber = commercialRegisterNumber.replaceAll(" ", "");
        if (normalizedNumber.startsWith(Constants.IDENIFICATIONTYPE_FN))
            normalizedNumber = normalizedNumber.substring(2);

        return checkCommercialRegisterNumber(normalizedNumber);
    }

    private boolean checkCommercialRegisterNumber(String commercialRegisterNumber) {
        if (commercialRegisterNumber == null) {
            return false;
        }
        commercialRegisterNumber = StringUtils.leftPad(commercialRegisterNumber, 7, '0');
        if (!commercialRegisterNumber.matches("\\d{6}[abdfghikmpstvwxzy]")) {
            return false;
        }
        String digits = commercialRegisterNumber.substring(0, commercialRegisterNumber.length() - 1);
        char checkDigit = commercialRegisterNumber.charAt(commercialRegisterNumber.length() - 1);
        boolean result = calcCheckDigitFromCommercialRegisterNumber(digits) == checkDigit;
        return result;
    }

    public static char calcCheckDigitFromCommercialRegisterNumber(String commercialRegisterDigits) {
        final int[] WEIGHT = { 6, 4, 14, 15, 10, 1 };
        final char[] CHECKDIGIT = { 'a', 'b', 'd', 'f', 'g', 'h', 'i', 'k', 'm', 'p', 's', 't', 'v', 'w', 'x', 'y',
                'z' };
        if (commercialRegisterDigits == null) {
            throw new NullPointerException("Commercial register number missing.");
        }
        commercialRegisterDigits = StringUtils.leftPad(commercialRegisterDigits, 6, '0');
        if (!commercialRegisterDigits.matches("\\d{6}")) {
            throw new IllegalArgumentException("Invalid commercial register number provided.");
        }
        int sum = 0;
        for (int i = 0; i < commercialRegisterDigits.length(); i++) {
            int value = commercialRegisterDigits.charAt(i) - '0';
            sum += WEIGHT[i] * value;
        }
        return CHECKDIGIT[sum % 17];
    }
}