Skip to content

Commit 13edfa6

Browse files
committed
refactor: introduce de.speedbanking:iban-commons
Simplifies the IBAN generation logic by migrating from iban4j to the more performant iban-commons library. This change streamlines the DefaultIBANProvider by offloading random IBAN generation directly to the new library's RandomIban utility. Key changes: - Switched dependency from org.iban4j:iban4j to de.speedbanking:iban-commons - Refactored DefaultIBANProvider to use IbanRegistry and RandomIban, eliminating the manual Iban.Builder ceremony - Removed several redundant fields and setters (accountNumber, bankCode, branchCode, nationalCheckDigit) from IBANProvider and DefaultIBANProvider, favoring the library's internal generation - Simplified the IBAN data object by removing unused fields like identificationNumber, accountType, and ownerAccountType - Updated IBANProperties to map LanguageCodes directly to IbanRegistry constants - Updated test suite to use IbanValidator for verification link: https://www.speedbanking.de/
1 parent e140038 commit 13edfa6

7 files changed

Lines changed: 45 additions & 155 deletions

File tree

pom.xml

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -87,7 +87,7 @@
8787
<dep.snakeyaml-engine.version>3.0.1</dep.snakeyaml-engine.version>
8888
<dep.jspecify.version>1.0.0</dep.jspecify.version>
8989
<dep.slf4j.version>2.0.17</dep.slf4j.version>
90-
<dep.iban4j.version>3.2.13-RELEASE</dep.iban4j.version>
90+
<dep.iban-commons.version>1.8.4</dep.iban-commons.version>
9191
<dep.commons-validator.version>1.10.1</dep.commons-validator.version>
9292
<dep.spock.version>2.4-groovy-4.0</dep.spock.version>
9393
<dep.groovy.version>4.0.30</dep.groovy.version>
@@ -135,9 +135,9 @@
135135
<version>${dep.slf4j.version}</version>
136136
</dependency>
137137
<dependency>
138-
<groupId>org.iban4j</groupId>
139-
<artifactId>iban4j</artifactId>
140-
<version>${dep.iban4j.version}</version>
138+
<groupId>de.speedbanking</groupId>
139+
<artifactId>iban-commons</artifactId>
140+
<version>${dep.iban-commons.version}</version>
141141
</dependency>
142142
<dependency>
143143
<groupId>commons-validator</groupId>

src/main/java/com/devskiller/jfairy/data/MapBasedDataMaster.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -109,6 +109,7 @@ public void readResources(String path) throws IOException {
109109
final Load load = new Load(loadSettings);
110110
final URL url = resources.nextElement();
111111
try (InputStream is = url.openStream()) {
112+
@SuppressWarnings("unchecked")
112113
final Map<String, Object> data = (Map<String, Object>) load.loadFromInputStream(is);
113114
appendData(data);
114115
}
Lines changed: 22 additions & 63 deletions
Original file line numberDiff line numberDiff line change
@@ -1,31 +1,25 @@
11
package com.devskiller.jfairy.producer.payment;
22

3-
import java.util.IllegalFormatCodePointException;
43
import java.util.List;
4+
import java.util.Optional;
55

6-
import org.iban4j.CountryCode;
7-
import org.iban4j.Iban;
8-
import org.iban4j.UnsupportedCountryException;
6+
import de.speedbanking.iban.Iban;
7+
import de.speedbanking.iban.IbanRegistry;
8+
import de.speedbanking.iban.RandomIban;
99
import org.jspecify.annotations.Nullable;
1010

1111
import com.devskiller.jfairy.data.DataMaster;
1212
import com.devskiller.jfairy.producer.BaseProducer;
1313
import com.devskiller.jfairy.producer.person.Country;
1414

15-
import static com.devskiller.jfairy.producer.util.StringUtils.isNotEmpty;
16-
1715
/**
1816
* ALPHA: Under development
1917
*/
2018
public class DefaultIBANProvider implements IBANProvider {
2119

2220
protected final DataMaster dataMaster;
2321
protected final BaseProducer baseProducer;
24-
protected CountryCode countryCode;
25-
protected String accountNumber;
26-
protected String bankCode;
27-
protected String branchCode;
28-
protected String nationalCheckDigit;
22+
protected String countryCode;
2923

3024
public DefaultIBANProvider(BaseProducer baseProducer,
3125
DataMaster dataMaster,
@@ -39,72 +33,37 @@ public DefaultIBANProvider(BaseProducer baseProducer,
3933

4034
@Override
4135
public @Nullable IBAN get() {
42-
try {
43-
44-
fillCountryCode();
45-
46-
try {
47-
48-
Iban.Builder builder = new Iban.Builder()
49-
.countryCode(countryCode)
50-
.bankCode(bankCode)
51-
.branchCode(branchCode)
52-
.nationalCheckDigit(nationalCheckDigit);
53-
if (isNotEmpty(accountNumber)) {
54-
builder.accountNumber(accountNumber);
55-
}
56-
Iban iban = builder.buildRandom();
57-
58-
String identificationNumber = iban.getIdentificationNumber();
59-
String checkDigit = iban.getCheckDigit();
60-
String accountType = iban.getAccountType();
61-
String bban = iban.getBban();
62-
String ownerAccountType = iban.getOwnerAccountType();
63-
String ibanNumber = iban.toString();
36+
fillCountryCode();
6437

65-
return new IBAN(accountNumber, identificationNumber, branchCode, checkDigit,
66-
accountType, bankCode, bban, countryCode.getName(), nationalCheckDigit,
67-
ownerAccountType, ibanNumber);
68-
} catch (UnsupportedCountryException ex) {
69-
return null;
70-
}
71-
} catch (IllegalFormatCodePointException ex) {
72-
throw new IllegalArgumentException("Invalid iban " + ex.getMessage(), ex);
38+
IbanRegistry reg = IbanRegistry.getByCode(countryCode);
39+
if (reg == null) {
40+
return null;
7341
}
42+
Iban iban = RandomIban.of(countryCode);
43+
44+
return new IBAN(iban.getAccountNumber(),
45+
iban.getCheckDigits(),
46+
iban.getBankCode(),
47+
iban.getBban(),
48+
iban.getCountryCode(),
49+
iban.getNationalCheckDigit(),
50+
iban.toString());
7451
}
7552

7653
@Override
7754
public void fillCountryCode() {
7855
if (countryCode == null) {
7956
List<Country> countries = Country.findCountryForLanguage(dataMaster.getLanguage());
8057
Country country = baseProducer.randomElement(countries);
81-
countryCode = CountryCode.valueOf(country.getCode());
82-
}
83-
}
84-
85-
@Override
86-
public void setNationalCheckDigit(String nationalCheckDigit) {
87-
this.nationalCheckDigit = nationalCheckDigit;
88-
}
8958

90-
@Override
91-
public void setBranchCode(String branchCode) {
92-
this.branchCode = branchCode;
59+
IbanRegistry r = IbanRegistry.getByCode(country.getCode());
60+
countryCode = Optional.ofNullable(r).map(IbanRegistry::name).orElse(null);
61+
}
9362
}
9463

9564
@Override
9665
public void setCountry(String country) {
97-
this.countryCode = CountryCode.valueOf(country);
98-
}
99-
100-
@Override
101-
public void setAccountNumber(String accountNumber) {
102-
this.accountNumber = accountNumber;
103-
}
104-
105-
@Override
106-
public void setBankCode(String bankCode) {
107-
this.bankCode = bankCode;
66+
this.countryCode = country;
10867
}
10968

11069
}

src/main/java/com/devskiller/jfairy/producer/payment/IBAN.java

Lines changed: 2 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -3,52 +3,32 @@
33
public class IBAN {
44

55
private final String accountNumber;
6-
private final String identificationNumber;
7-
private final String branchCode;
86
private final String checkDigit;
9-
private final String accountType;
107
private final String bankCode;
118
private final String bban;
129
private final String country;
1310
private final String nationalCheckDigit;
14-
private final String ownerAccountType;
1511
private final String ibanNumber;
1612

17-
public IBAN(String accountNumber, String identificationNumber, String branchCode, String checkDigit,
18-
String accountType, String bankCode, String bban, String country, String nationalCheckDigit, String ownerAccountType, String ibanNumber) {
13+
public IBAN(String accountNumber, String checkDigit, String bankCode, String bban,
14+
String country, String nationalCheckDigit, String ibanNumber) {
1915
this.accountNumber = accountNumber;
20-
this.identificationNumber = identificationNumber;
21-
this.branchCode = branchCode;
2216
this.checkDigit = checkDigit;
23-
this.accountType = accountType;
2417
this.bankCode = bankCode;
2518
this.bban = bban;
2619
this.country = country;
2720
this.nationalCheckDigit = nationalCheckDigit;
28-
this.ownerAccountType = ownerAccountType;
2921
this.ibanNumber = ibanNumber;
3022
}
3123

3224
public String getAccountNumber() {
3325
return accountNumber;
3426
}
3527

36-
public String getIdentificationNumber() {
37-
return identificationNumber;
38-
}
39-
40-
public String getBranchCode() {
41-
return branchCode;
42-
}
43-
4428
public String getCheckDigit() {
4529
return checkDigit;
4630
}
4731

48-
public String getAccountType() {
49-
return accountType;
50-
}
51-
5232
public String getBankCode() {
5333
return bankCode;
5434
}
@@ -65,10 +45,6 @@ public String getNationalCheckDigit() {
6545
return nationalCheckDigit;
6646
}
6747

68-
public String getOwnerAccountType() {
69-
return ownerAccountType;
70-
}
71-
7248
public String getIbanNumber() {
7349
return ibanNumber;
7450
}

src/main/java/com/devskiller/jfairy/producer/payment/IBANProperties.java

Lines changed: 12 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -3,25 +3,24 @@
33
import java.util.HashMap;
44
import java.util.Map;
55

6-
import org.iban4j.CountryCode;
6+
import de.speedbanking.iban.IbanRegistry;
77

88
import com.devskiller.jfairy.producer.util.LanguageCode;
99

1010
public final class IBANProperties {
1111

12-
private static final HashMap<LanguageCode, CountryCode> COUNTRIES = new HashMap<>();
12+
private static final Map<LanguageCode, IbanRegistry> COUNTRIES = new HashMap<>();
1313

1414
static {
15-
COUNTRIES.put(LanguageCode.PL, CountryCode.PL);
16-
COUNTRIES.put(LanguageCode.EN, CountryCode.GB);
17-
COUNTRIES.put(LanguageCode.ES, CountryCode.ES);
18-
COUNTRIES.put(LanguageCode.FR, CountryCode.FR);
19-
COUNTRIES.put(LanguageCode.KA, CountryCode.GE);
20-
COUNTRIES.put(LanguageCode.IT, CountryCode.IT);
21-
COUNTRIES.put(LanguageCode.DE, CountryCode.DE);
22-
COUNTRIES.put(LanguageCode.SK, CountryCode.SK);
23-
COUNTRIES.put(LanguageCode.SV, CountryCode.SV);
24-
COUNTRIES.put(LanguageCode.ZH, CountryCode.TW);
15+
COUNTRIES.put(LanguageCode.PL, IbanRegistry.PL);
16+
COUNTRIES.put(LanguageCode.EN, IbanRegistry.GB);
17+
COUNTRIES.put(LanguageCode.ES, IbanRegistry.ES);
18+
COUNTRIES.put(LanguageCode.FR, IbanRegistry.FR);
19+
COUNTRIES.put(LanguageCode.KA, IbanRegistry.GE);
20+
COUNTRIES.put(LanguageCode.IT, IbanRegistry.IT);
21+
COUNTRIES.put(LanguageCode.DE, IbanRegistry.DE);
22+
COUNTRIES.put(LanguageCode.SK, IbanRegistry.SK);
23+
COUNTRIES.put(LanguageCode.SV, IbanRegistry.SV);
2524
}
2625

2726
private IBANProperties() {
@@ -33,33 +32,6 @@ public abstract static class Property {
3332

3433
}
3534

36-
public static Property branchCode(final String branchCode) {
37-
return new Property() {
38-
@Override
39-
public void apply(IBANProvider provider) {
40-
provider.setBranchCode(branchCode);
41-
}
42-
};
43-
}
44-
45-
public static Property nationalCheckDigit(final String nationalCheckDigit) {
46-
return new Property() {
47-
@Override
48-
public void apply(IBANProvider provider) {
49-
provider.setNationalCheckDigit(nationalCheckDigit);
50-
}
51-
};
52-
}
53-
54-
public static Property accountNumber(final String accountNumber) {
55-
return new Property() {
56-
@Override
57-
public void apply(IBANProvider provider) {
58-
provider.setAccountNumber(accountNumber);
59-
}
60-
};
61-
}
62-
6335
public static Property country(final String country) {
6436
return new Property() {
6537
@Override
@@ -82,18 +54,9 @@ private static String countryFromLanguage(String lang) {
8254
return COUNTRIES.entrySet().stream()
8355
.filter(locale -> locale.getKey().name().equals(lang))
8456
.map(Map.Entry::getValue)
85-
.map(CountryCode::getAlpha2)
57+
.map(IbanRegistry::name)
8658
.findFirst()
8759
.orElse("PL");
8860
}
8961

90-
public static Property bankCode(final String bankCode) {
91-
return new Property() {
92-
@Override
93-
public void apply(IBANProvider provider) {
94-
provider.setBankCode(bankCode);
95-
}
96-
};
97-
}
98-
9962
}

src/main/java/com/devskiller/jfairy/producer/payment/IBANProvider.java

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -9,13 +9,6 @@ public interface IBANProvider extends Supplier<IBAN> {
99

1010
void fillCountryCode();
1111

12-
void setNationalCheckDigit(String nationalCheckDigit);
13-
14-
void setBranchCode(String branchCode);
15-
1612
void setCountry(String country);
1713

18-
void setAccountNumber(String accountNumber);
19-
20-
void setBankCode(String bankCode);
2114
}

src/test/groovy/com/devskiller/jfairy/producer/payment/IBANSpec.groovy

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
package com.devskiller.jfairy.producer.payment
22

3-
import org.iban4j.IbanUtil
3+
import de.speedbanking.iban.IbanValidator
44
import spock.lang.Specification
55

66
import com.devskiller.jfairy.Fairy
@@ -25,23 +25,21 @@ class IBANSpec extends Specification {
2525
* ATkk bbbb bccc cccc cccc
2626
*
2727
* b = National bank code
28-
c = Account number
2928
*/
3029
def "should return valid iban"() {
3130
when:
3231
IBANProvider iban = new DefaultIBANProvider(
3332
baseProducer,
3433
dataMaster,
35-
IBANProperties.accountNumber("00234573201"),
3634
IBANProperties.country("AT")
3735
)
3836

3937
then:
40-
IbanUtil.validate(iban.get().ibanNumber)
38+
IbanValidator.validate(iban.get().ibanNumber)
4139
}
4240

4341
/**
44-
* Poland 28 24n PLkk bbbs sssx cccc cccc cccc cccc b = National bank code
42+
Poland 28 24n PLkk bbbs sssx cccc cccc cccc cccc b = National bank code
4543
s = Branch code
4644
x = National check digit
4745
c = Account number,
@@ -53,7 +51,7 @@ class IBANSpec extends Specification {
5351
when:
5452
IBANProvider iban = new DefaultIBANProvider(baseProducer, dataMaster)
5553
then:
56-
IbanUtil.validate(iban.get().ibanNumber)
54+
IbanValidator.validate(iban.get().ibanNumber)
5755
}
5856

5957
def "should be usable directly from Fairy"() {

0 commit comments

Comments
 (0)