Skip to content

Commit bdfcc5b

Browse files
author
pauldambra
committed
refactor some of the supporting classes to change the API
1 parent 0cc3e1f commit bdfcc5b

21 files changed

+134
-140
lines changed

src/main/java/com/dambra/paul/moduluschecker/Account/BankAccount.java

Lines changed: 10 additions & 82 deletions
Original file line numberDiff line numberDiff line change
@@ -13,18 +13,21 @@ public class BankAccount {
1313
public final String sortCode;
1414
public final String accountNumber;
1515

16-
public BankAccount(String sortCode, String accountNumber) {
17-
String[] corrected = NonStandardAccounts.corrections(sortCode, accountNumber);
18-
19-
this.sortCode = corrected[0];
20-
this.accountNumber = corrected[1];
16+
private BankAccount(String sortCode, String accountNumber) {
17+
this.sortCode = sortCode;
18+
this.accountNumber = accountNumber;
2119
}
2220

2321
public BankAccount(BankAccount bankAccount) {
2422
this.sortCode = bankAccount.sortCode;
2523
this.accountNumber = bankAccount.accountNumber;
2624
}
2725

26+
public static BankAccount Of(String sortCode, String accountNumber) {
27+
String[] corrected = NonStandardAccounts.corrections(sortCode, accountNumber);
28+
return new BankAccount(corrected[0], corrected[1]);
29+
}
30+
2831
public Stream<Integer> allDigits() {
2932
return Stream.concat(
3033
As.integerStream(sortCode),
@@ -46,84 +49,9 @@ public String toString() {
4649
public BankAccount zeroiseUToB() {
4750
if (getNumberAt(G) == 9) {
4851
String account = Strings.padStart(accountNumber.substring(2), 8, '0');
49-
return new BankAccount("000000", account);
50-
}
51-
return new BankAccount(sortCode, accountNumber);
52-
}
53-
54-
private static class NonStandardAccounts {
55-
public static String[] corrections(String sortCode, String accountNumber) {
56-
57-
accountNumber = CorrectForNatWest(sortCode, accountNumber);
58-
accountNumber = CorrectForCoop(sortCode, accountNumber);
59-
accountNumber = correctForShortAccountNumber(accountNumber);
60-
61-
return CorrectForSantander(sortCode, accountNumber);
62-
}
63-
64-
/**
65-
* pad left with zeros until 8 in length
66-
*/
67-
private static String correctForShortAccountNumber(String accountNumber) {
68-
return Strings.padStart(accountNumber, 8, '0');
69-
}
70-
71-
/**
72-
* Replace the last digit of the sorting code with
73-
* the first digit of the account number, then use
74-
* the last eight digits of the account number only.
75-
*/
76-
private static String[] CorrectForSantander(String sortCode, String accountNumber) {
77-
if (accountNumber.length()!=9) {
78-
return new String[] {sortCode, accountNumber};
79-
}
80-
81-
return new String[]{
82-
sortCode.substring(0, 5) + accountNumber.substring(0, 1),
83-
accountNumber.substring(1, 9)
84-
};
85-
}
86-
87-
/**
88-
* use the first eight digits only
89-
*/
90-
private static String CorrectForCoop(String sortCode, String accountNumber) {
91-
return SortCode.IsCooperativeBankSortCode(sortCode)
92-
? accountNumber.substring(0, 8)
93-
: accountNumber;
94-
}
95-
96-
/**
97-
* NatWest have ten digit account numbers
98-
*
99-
* Use the last eight digits only. If there is a hyphen
100-
* in the account number between the second and
101-
* third numbers this should be ignored.
102-
*/
103-
private static String CorrectForNatWest(String sortCode, String accountNumber) {
104-
if (!SortCode.IsNatWestSortCode(sortCode)) {
105-
return accountNumber;
106-
}
107-
108-
accountNumber = accountNumber.replaceAll("[\\D]", "");
109-
return accountNumber.substring(accountNumber.length() - 8);
52+
return Of("000000", account);
11053
}
54+
return Of(sortCode, accountNumber);
11155
}
11256

113-
// I didn't log where I got this data... is it correct?
114-
// todo allow external hookup of ISCD? Can't find a free version
115-
private static class SortCode {
116-
static boolean IsCooperativeBankSortCode(String sortCode) {
117-
return sortCode.startsWith("08") || sortCode.startsWith("839");
118-
}
119-
120-
static boolean IsNatWestSortCode(String sortCode) {
121-
return sortCode.startsWith("600")
122-
|| sortCode.startsWith("606")
123-
|| sortCode.startsWith("601")
124-
|| sortCode.startsWith("609")
125-
|| sortCode.startsWith("830")
126-
|| sortCode.startsWith("602");
127-
}
128-
}
12957
}
Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
package com.dambra.paul.moduluschecker.Account;
2+
3+
import com.google.common.base.Strings;
4+
5+
class NonStandardAccounts {
6+
static String[] corrections(String sortCode, String accountNumber) {
7+
8+
accountNumber = CorrectForNatWest(sortCode, accountNumber);
9+
accountNumber = CorrectForCoop(sortCode, accountNumber);
10+
accountNumber = correctForShortAccountNumber(accountNumber);
11+
12+
return CorrectForSantander(sortCode, accountNumber);
13+
}
14+
15+
/**
16+
* pad left with zeros until 8 in length
17+
*/
18+
private static String correctForShortAccountNumber(String accountNumber) {
19+
return Strings.padStart(accountNumber, 8, '0');
20+
}
21+
22+
/**
23+
* Replace the last digit of the sorting code with
24+
* the first digit of the account number, then use
25+
* the last eight digits of the account number only.
26+
*/
27+
private static String[] CorrectForSantander(String sortCode, String accountNumber) {
28+
if (accountNumber.length()!=9) {
29+
return new String[] {sortCode, accountNumber};
30+
}
31+
32+
return new String[]{
33+
sortCode.substring(0, 5) + accountNumber.substring(0, 1),
34+
accountNumber.substring(1, 9)
35+
};
36+
}
37+
38+
/**
39+
* use the first eight digits only
40+
*/
41+
private static String CorrectForCoop(String sortCode, String accountNumber) {
42+
return SortCode.IsCooperativeBankSortCode(sortCode)
43+
? accountNumber.substring(0, 8)
44+
: accountNumber;
45+
}
46+
47+
/**
48+
* NatWest have ten digit account numbers
49+
*
50+
* Use the last eight digits only. If there is a hyphen
51+
* in the account number between the second and
52+
* third numbers this should be ignored.
53+
*/
54+
private static String CorrectForNatWest(String sortCode, String accountNumber) {
55+
if (!SortCode.IsNatWestSortCode(sortCode)) {
56+
return accountNumber;
57+
}
58+
59+
accountNumber = accountNumber.replaceAll("[\\D]", "");
60+
return accountNumber.substring(accountNumber.length() - 8);
61+
}
62+
}
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
package com.dambra.paul.moduluschecker.Account;
2+
3+
// I didn't log where I got this data... is it correct?
4+
// todo allow external hookup of ISCD? Can't find a free version
5+
class SortCode {
6+
static boolean IsCooperativeBankSortCode(String sortCode) {
7+
return sortCode.startsWith("08") || sortCode.startsWith("839");
8+
}
9+
10+
static boolean IsNatWestSortCode(String sortCode) {
11+
return sortCode.startsWith("600")
12+
|| sortCode.startsWith("606")
13+
|| sortCode.startsWith("601")
14+
|| sortCode.startsWith("609")
15+
|| sortCode.startsWith("830")
16+
|| sortCode.startsWith("602");
17+
}
18+
}

src/main/java/com/dambra/paul/moduluschecker/ModulusCheckParams.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,10 @@ public ModulusCheckParams(
2323
this.modulusResult = modulusResult;
2424
}
2525

26+
static ModulusCheckParams startingParams(BankAccount account) {
27+
return new ModulusCheckParams(account, Optional.empty(), Optional.empty(), Optional.empty());
28+
}
29+
2630
public ModulusCheckParams withAccount(BankAccount bankAccount) {
2731
return new ModulusCheckParams(
2832
bankAccount,

src/main/java/com/dambra/paul/moduluschecker/ModulusChecker.java

Lines changed: 2 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@
55
import com.dambra.paul.moduluschecker.valacdosFile.ModulusWeightRows;
66

77
import java.io.IOException;
8-
import java.util.Optional;
98

109
public class ModulusChecker {
1110
private SortCodeSubstitution sortCodeSubstitution = SortCodeSubstitution.fromFile("file/scsubtab.txt");
@@ -16,15 +15,9 @@ public ModulusChecker() throws IOException {
1615
}
1716

1817
public Boolean checkBankAccount(String sortCode, String accountNumber) {
19-
20-
BankAccount account = new BankAccount(sortCode, accountNumber);
21-
22-
ModulusCheckParams startingParams = new ModulusCheckParams(account, Optional.empty(), Optional.empty(), Optional.empty());
23-
18+
BankAccount account = BankAccount.Of(sortCode, accountNumber);
2419
ModulusChainCheck chain = makeModulusChainCheck();
25-
26-
ModulusResult modulusResults = chain.check(startingParams);
27-
20+
ModulusResult modulusResults = chain.check(ModulusCheckParams.startingParams(account));
2821
return modulusResults.processResults();
2922
}
3023

src/main/java/com/dambra/paul/moduluschecker/SortCodeSubstitution.java

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,6 @@
1010
import java.io.IOException;
1111
import java.net.URL;
1212
import java.util.Map;
13-
import java.util.Optional;
1413
import java.util.regex.Pattern;
1514
import java.util.stream.Collectors;
1615

@@ -25,13 +24,13 @@ public SortCodeSubstitution(ImmutableMap<String, String> sortCodeSubstitutionTab
2524
this.sortCodeSubstitutionTable = sortCodeSubstitutionTable;
2625
}
2726

28-
public SortCodeSubstitution(Map<String, String> sortCodeSubstitutionTable) {
27+
private SortCodeSubstitution(Map<String, String> sortCodeSubstitutionTable) {
2928
this.sortCodeSubstitutionTable = ImmutableMap.copyOf(sortCodeSubstitutionTable);
3029
}
3130

3231
public BankAccount Apply(BankAccount bankAccount) {
3332
return sortCodeSubstitutionTable.containsKey(bankAccount.sortCode)
34-
? new BankAccount(sortCodeSubstitutionTable.get(bankAccount.sortCode), bankAccount.accountNumber)
33+
? BankAccount.Of(sortCodeSubstitutionTable.get(bankAccount.sortCode), bankAccount.accountNumber)
3534
: new BankAccount(bankAccount);
3635
}
3736

src/main/java/com/dambra/paul/moduluschecker/chain/FirstModulusCheckRouter.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -38,12 +38,12 @@ public ModulusResult check(ModulusCheckParams params) {
3838
}
3939

4040
if (rowSelector.apply(params).isException(8)) {
41-
BankAccount account = new BankAccount("090126", params.account.accountNumber);
41+
BankAccount account = BankAccount.Of("090126", params.account.accountNumber);
4242
params = params.withAccount(account);
4343
}
4444

4545
if (rowSelector.apply(params).isException(10)) {
46-
//For the exception 10 check, if ab = 09 or ab = 99 and g = 9, zeroise weighting positions u-b.
46+
//Of the exception 10 check, if ab = 09 or ab = 99 and g = 9, zeroise weighting positions u-b.
4747
int a = params.account.getNumberAt(BankAccount.A);
4848
int b = params.account.getNumberAt(BankAccount.B);
4949
int g = params.account.getNumberAt(BankAccount.G);

src/main/java/com/dambra/paul/moduluschecker/chain/SecondModulusCheckRouter.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ public ModulusResult check(ModulusCheckParams params) {
4141
}
4242

4343
if (rowSelector.apply(params).isException(8)) {
44-
BankAccount account = new BankAccount("090126", params.account.accountNumber);
44+
BankAccount account = BankAccount.Of("090126", params.account.accountNumber);
4545
params = params.withAccount(account);
4646
}
4747

src/main/java/com/dambra/paul/moduluschecker/chain/checks/ExceptionFourteenModulusElevenCheck.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ public Boolean check(ModulusCheckParams params) {
3131
}
3232

3333
final String newAccountNumber = "0" + params.account.accountNumber.substring(0, 7);
34-
final BankAccount correctedAccount = new BankAccount(params.account.sortCode, newAccountNumber);
34+
final BankAccount correctedAccount = BankAccount.Of(params.account.sortCode, newAccountNumber);
3535

3636
int total = ModulusTotal.calculate(
3737
correctedAccount,

src/main/java/com/dambra/paul/moduluschecker/chain/checks/LloydsAlternateModulusElevenCheck.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ public Boolean check(ModulusCheckParams params, Function<ModulusCheckParams, Wei
1717
return false;
1818
}
1919

20-
BankAccount account = new BankAccount(BankAccount.LLOYDS_EURO_SORT_CODE, params.account.accountNumber);
20+
BankAccount account = BankAccount.Of(BankAccount.LLOYDS_EURO_SORT_CODE, params.account.accountNumber);
2121

2222
int total = ModulusTotal.calculate(account, selectedRow.getWeights());
2323
return total % 11 == 0;

0 commit comments

Comments
 (0)