diff --git a/pom.xml b/pom.xml index c319f7de..d0f5c957 100644 --- a/pom.xml +++ b/pom.xml @@ -87,7 +87,7 @@ 3.0.1 1.0.0 2.0.17 - 3.2.13-RELEASE + 1.8.4 1.10.1 2.4-groovy-4.0 4.0.30 @@ -135,9 +135,9 @@ ${dep.slf4j.version} - org.iban4j - iban4j - ${dep.iban4j.version} + de.speedbanking + iban-commons + ${dep.iban-commons.version} commons-validator diff --git a/src/main/java/com/devskiller/jfairy/data/MapBasedDataMaster.java b/src/main/java/com/devskiller/jfairy/data/MapBasedDataMaster.java index 14605dca..5afdf3b6 100644 --- a/src/main/java/com/devskiller/jfairy/data/MapBasedDataMaster.java +++ b/src/main/java/com/devskiller/jfairy/data/MapBasedDataMaster.java @@ -109,6 +109,7 @@ public void readResources(String path) throws IOException { final Load load = new Load(loadSettings); final URL url = resources.nextElement(); try (InputStream is = url.openStream()) { + @SuppressWarnings("unchecked") final Map data = (Map) load.loadFromInputStream(is); appendData(data); } diff --git a/src/main/java/com/devskiller/jfairy/producer/payment/DefaultIBANProvider.java b/src/main/java/com/devskiller/jfairy/producer/payment/DefaultIBANProvider.java index 258d3c71..6eff059b 100644 --- a/src/main/java/com/devskiller/jfairy/producer/payment/DefaultIBANProvider.java +++ b/src/main/java/com/devskiller/jfairy/producer/payment/DefaultIBANProvider.java @@ -1,19 +1,17 @@ package com.devskiller.jfairy.producer.payment; -import java.util.IllegalFormatCodePointException; import java.util.List; +import java.util.Optional; -import org.iban4j.CountryCode; -import org.iban4j.Iban; -import org.iban4j.UnsupportedCountryException; +import de.speedbanking.iban.Iban; +import de.speedbanking.iban.IbanRegistry; +import de.speedbanking.iban.RandomIban; import org.jspecify.annotations.Nullable; import com.devskiller.jfairy.data.DataMaster; import com.devskiller.jfairy.producer.BaseProducer; import com.devskiller.jfairy.producer.person.Country; -import static com.devskiller.jfairy.producer.util.StringUtils.isNotEmpty; - /** * ALPHA: Under development */ @@ -21,11 +19,7 @@ public class DefaultIBANProvider implements IBANProvider { protected final DataMaster dataMaster; protected final BaseProducer baseProducer; - protected CountryCode countryCode; - protected String accountNumber; - protected String bankCode; - protected String branchCode; - protected String nationalCheckDigit; + protected String countryCode; public DefaultIBANProvider(BaseProducer baseProducer, DataMaster dataMaster, @@ -39,38 +33,21 @@ public DefaultIBANProvider(BaseProducer baseProducer, @Override public @Nullable IBAN get() { - try { - - fillCountryCode(); - - try { - - Iban.Builder builder = new Iban.Builder() - .countryCode(countryCode) - .bankCode(bankCode) - .branchCode(branchCode) - .nationalCheckDigit(nationalCheckDigit); - if (isNotEmpty(accountNumber)) { - builder.accountNumber(accountNumber); - } - Iban iban = builder.buildRandom(); - - String identificationNumber = iban.getIdentificationNumber(); - String checkDigit = iban.getCheckDigit(); - String accountType = iban.getAccountType(); - String bban = iban.getBban(); - String ownerAccountType = iban.getOwnerAccountType(); - String ibanNumber = iban.toString(); + fillCountryCode(); - return new IBAN(accountNumber, identificationNumber, branchCode, checkDigit, - accountType, bankCode, bban, countryCode.getName(), nationalCheckDigit, - ownerAccountType, ibanNumber); - } catch (UnsupportedCountryException ex) { - return null; - } - } catch (IllegalFormatCodePointException ex) { - throw new IllegalArgumentException("Invalid iban " + ex.getMessage(), ex); + IbanRegistry reg = IbanRegistry.getByCode(countryCode); + if (reg == null) { + return null; } + Iban iban = RandomIban.of(countryCode); + + return new IBAN(iban.getAccountNumber(), + iban.getCheckDigits(), + iban.getBankCode(), + iban.getBban(), + iban.getCountryCode(), + iban.getNationalCheckDigit(), + iban.toString()); } @Override @@ -78,33 +55,15 @@ public void fillCountryCode() { if (countryCode == null) { List countries = Country.findCountryForLanguage(dataMaster.getLanguage()); Country country = baseProducer.randomElement(countries); - countryCode = CountryCode.valueOf(country.getCode()); - } - } - - @Override - public void setNationalCheckDigit(String nationalCheckDigit) { - this.nationalCheckDigit = nationalCheckDigit; - } - @Override - public void setBranchCode(String branchCode) { - this.branchCode = branchCode; + IbanRegistry r = IbanRegistry.getByCode(country.getCode()); + countryCode = Optional.ofNullable(r).map(IbanRegistry::name).orElse(null); + } } @Override public void setCountry(String country) { - this.countryCode = CountryCode.valueOf(country); - } - - @Override - public void setAccountNumber(String accountNumber) { - this.accountNumber = accountNumber; - } - - @Override - public void setBankCode(String bankCode) { - this.bankCode = bankCode; + this.countryCode = country; } } diff --git a/src/main/java/com/devskiller/jfairy/producer/payment/IBAN.java b/src/main/java/com/devskiller/jfairy/producer/payment/IBAN.java index ba14367c..05d1ec97 100644 --- a/src/main/java/com/devskiller/jfairy/producer/payment/IBAN.java +++ b/src/main/java/com/devskiller/jfairy/producer/payment/IBAN.java @@ -3,29 +3,21 @@ public class IBAN { private final String accountNumber; - private final String identificationNumber; - private final String branchCode; private final String checkDigit; - private final String accountType; private final String bankCode; private final String bban; private final String country; private final String nationalCheckDigit; - private final String ownerAccountType; private final String ibanNumber; - public IBAN(String accountNumber, String identificationNumber, String branchCode, String checkDigit, - String accountType, String bankCode, String bban, String country, String nationalCheckDigit, String ownerAccountType, String ibanNumber) { + public IBAN(String accountNumber, String checkDigit, String bankCode, String bban, + String country, String nationalCheckDigit, String ibanNumber) { this.accountNumber = accountNumber; - this.identificationNumber = identificationNumber; - this.branchCode = branchCode; this.checkDigit = checkDigit; - this.accountType = accountType; this.bankCode = bankCode; this.bban = bban; this.country = country; this.nationalCheckDigit = nationalCheckDigit; - this.ownerAccountType = ownerAccountType; this.ibanNumber = ibanNumber; } @@ -33,22 +25,10 @@ public String getAccountNumber() { return accountNumber; } - public String getIdentificationNumber() { - return identificationNumber; - } - - public String getBranchCode() { - return branchCode; - } - public String getCheckDigit() { return checkDigit; } - public String getAccountType() { - return accountType; - } - public String getBankCode() { return bankCode; } @@ -65,10 +45,6 @@ public String getNationalCheckDigit() { return nationalCheckDigit; } - public String getOwnerAccountType() { - return ownerAccountType; - } - public String getIbanNumber() { return ibanNumber; } diff --git a/src/main/java/com/devskiller/jfairy/producer/payment/IBANProperties.java b/src/main/java/com/devskiller/jfairy/producer/payment/IBANProperties.java index f1ad543e..2d822c12 100644 --- a/src/main/java/com/devskiller/jfairy/producer/payment/IBANProperties.java +++ b/src/main/java/com/devskiller/jfairy/producer/payment/IBANProperties.java @@ -3,25 +3,24 @@ import java.util.HashMap; import java.util.Map; -import org.iban4j.CountryCode; +import de.speedbanking.iban.IbanRegistry; import com.devskiller.jfairy.producer.util.LanguageCode; public final class IBANProperties { - private static final HashMap COUNTRIES = new HashMap<>(); + private static final Map COUNTRIES = new HashMap<>(); static { - COUNTRIES.put(LanguageCode.PL, CountryCode.PL); - COUNTRIES.put(LanguageCode.EN, CountryCode.GB); - COUNTRIES.put(LanguageCode.ES, CountryCode.ES); - COUNTRIES.put(LanguageCode.FR, CountryCode.FR); - COUNTRIES.put(LanguageCode.KA, CountryCode.GE); - COUNTRIES.put(LanguageCode.IT, CountryCode.IT); - COUNTRIES.put(LanguageCode.DE, CountryCode.DE); - COUNTRIES.put(LanguageCode.SK, CountryCode.SK); - COUNTRIES.put(LanguageCode.SV, CountryCode.SV); - COUNTRIES.put(LanguageCode.ZH, CountryCode.TW); + COUNTRIES.put(LanguageCode.PL, IbanRegistry.PL); + COUNTRIES.put(LanguageCode.EN, IbanRegistry.GB); + COUNTRIES.put(LanguageCode.ES, IbanRegistry.ES); + COUNTRIES.put(LanguageCode.FR, IbanRegistry.FR); + COUNTRIES.put(LanguageCode.KA, IbanRegistry.GE); + COUNTRIES.put(LanguageCode.IT, IbanRegistry.IT); + COUNTRIES.put(LanguageCode.DE, IbanRegistry.DE); + COUNTRIES.put(LanguageCode.SK, IbanRegistry.SK); + COUNTRIES.put(LanguageCode.SV, IbanRegistry.SV); } private IBANProperties() { @@ -33,33 +32,6 @@ public abstract static class Property { } - public static Property branchCode(final String branchCode) { - return new Property() { - @Override - public void apply(IBANProvider provider) { - provider.setBranchCode(branchCode); - } - }; - } - - public static Property nationalCheckDigit(final String nationalCheckDigit) { - return new Property() { - @Override - public void apply(IBANProvider provider) { - provider.setNationalCheckDigit(nationalCheckDigit); - } - }; - } - - public static Property accountNumber(final String accountNumber) { - return new Property() { - @Override - public void apply(IBANProvider provider) { - provider.setAccountNumber(accountNumber); - } - }; - } - public static Property country(final String country) { return new Property() { @Override @@ -82,18 +54,9 @@ private static String countryFromLanguage(String lang) { return COUNTRIES.entrySet().stream() .filter(locale -> locale.getKey().name().equals(lang)) .map(Map.Entry::getValue) - .map(CountryCode::getAlpha2) + .map(IbanRegistry::name) .findFirst() .orElse("PL"); } - public static Property bankCode(final String bankCode) { - return new Property() { - @Override - public void apply(IBANProvider provider) { - provider.setBankCode(bankCode); - } - }; - } - } diff --git a/src/main/java/com/devskiller/jfairy/producer/payment/IBANProvider.java b/src/main/java/com/devskiller/jfairy/producer/payment/IBANProvider.java index fc5abc70..55fd4606 100644 --- a/src/main/java/com/devskiller/jfairy/producer/payment/IBANProvider.java +++ b/src/main/java/com/devskiller/jfairy/producer/payment/IBANProvider.java @@ -9,13 +9,6 @@ public interface IBANProvider extends Supplier { void fillCountryCode(); - void setNationalCheckDigit(String nationalCheckDigit); - - void setBranchCode(String branchCode); - void setCountry(String country); - void setAccountNumber(String accountNumber); - - void setBankCode(String bankCode); } diff --git a/src/test/groovy/com/devskiller/jfairy/producer/payment/IBANSpec.groovy b/src/test/groovy/com/devskiller/jfairy/producer/payment/IBANSpec.groovy index 8968fbcc..c95fd2de 100644 --- a/src/test/groovy/com/devskiller/jfairy/producer/payment/IBANSpec.groovy +++ b/src/test/groovy/com/devskiller/jfairy/producer/payment/IBANSpec.groovy @@ -1,6 +1,6 @@ package com.devskiller.jfairy.producer.payment -import org.iban4j.IbanUtil +import de.speedbanking.iban.IbanValidator import spock.lang.Specification import com.devskiller.jfairy.Fairy @@ -25,23 +25,21 @@ class IBANSpec extends Specification { * ATkk bbbb bccc cccc cccc * * b = National bank code - c = Account number */ def "should return valid iban"() { when: IBANProvider iban = new DefaultIBANProvider( baseProducer, dataMaster, - IBANProperties.accountNumber("00234573201"), IBANProperties.country("AT") ) then: - IbanUtil.validate(iban.get().ibanNumber) + IbanValidator.validate(iban.get().ibanNumber) } /** - * Poland 28 24n PLkk bbbs sssx cccc cccc cccc cccc b = National bank code + Poland 28 24n PLkk bbbs sssx cccc cccc cccc cccc b = National bank code s = Branch code x = National check digit c = Account number, @@ -53,7 +51,7 @@ class IBANSpec extends Specification { when: IBANProvider iban = new DefaultIBANProvider(baseProducer, dataMaster) then: - IbanUtil.validate(iban.get().ibanNumber) + IbanValidator.validate(iban.get().ibanNumber) } def "should be usable directly from Fairy"() {