added data classes
This commit is contained in:
parent
06b7666aa3
commit
ec23a2b32f
|
@ -0,0 +1,11 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<module type="JAVA_MODULE" version="4">
|
||||||
|
<component name="NewModuleRootManager" inherit-compiler-output="true">
|
||||||
|
<exclude-output />
|
||||||
|
<content url="file://$MODULE_DIR$">
|
||||||
|
<sourceFolder url="file://$MODULE_DIR$/src" isTestSource="false" />
|
||||||
|
</content>
|
||||||
|
<orderEntry type="inheritedJdk" />
|
||||||
|
<orderEntry type="sourceFolder" forTests="false" />
|
||||||
|
</component>
|
||||||
|
</module>
|
|
@ -0,0 +1,5 @@
|
||||||
|
public class Main {
|
||||||
|
public static void main(String[] args) {
|
||||||
|
System.out.println("Hello world!");
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,34 @@
|
||||||
|
package me.teridax.jcash.banking;
|
||||||
|
|
||||||
|
@SuppressWarnings("unused")
|
||||||
|
public abstract class Account {
|
||||||
|
|
||||||
|
private int iban;
|
||||||
|
private int pin;
|
||||||
|
private double balance;
|
||||||
|
|
||||||
|
private final Owner owner;
|
||||||
|
|
||||||
|
public Account(int iban, int pin, Owner owner) {
|
||||||
|
this.owner = owner;
|
||||||
|
this.iban = iban;
|
||||||
|
this.pin = pin;
|
||||||
|
this.balance = 0.0d;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Owner getOwner() {
|
||||||
|
return owner;
|
||||||
|
}
|
||||||
|
|
||||||
|
public int getIban() {
|
||||||
|
return iban;
|
||||||
|
}
|
||||||
|
|
||||||
|
public int getPin() {
|
||||||
|
return pin;
|
||||||
|
}
|
||||||
|
|
||||||
|
public double getBalance() {
|
||||||
|
return balance;
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,61 @@
|
||||||
|
package me.teridax.jcash.banking;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Objects;
|
||||||
|
|
||||||
|
@SuppressWarnings("unused")
|
||||||
|
public final class Bank {
|
||||||
|
private String name;
|
||||||
|
private int blz;
|
||||||
|
private List<Account> accounts;
|
||||||
|
|
||||||
|
private Bank(int blz, String name) {
|
||||||
|
this.blz = blz;
|
||||||
|
this.name = name;
|
||||||
|
this.accounts = new ArrayList<>();
|
||||||
|
}
|
||||||
|
|
||||||
|
public Account[] getAccounts() {
|
||||||
|
return accounts.toArray(new Account[0]);
|
||||||
|
}
|
||||||
|
|
||||||
|
public int getBlz() {
|
||||||
|
return blz;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getName() {
|
||||||
|
return name;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean equals(Object obj) {
|
||||||
|
if (obj instanceof Bank) {
|
||||||
|
return blz == ((Bank) obj).blz;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int hashCode() {
|
||||||
|
return Objects.hash(blz, name);
|
||||||
|
}
|
||||||
|
|
||||||
|
public Account[] getAccountsOfOwner(Owner owner) {
|
||||||
|
return accounts.stream()
|
||||||
|
.filter(account -> account.getOwner().equals(owner))
|
||||||
|
.toArray(Account[]::new);
|
||||||
|
}
|
||||||
|
|
||||||
|
private static String validateBlz(String maybeBlz) {
|
||||||
|
var builder = new StringBuilder();
|
||||||
|
maybeBlz.trim().chars().filter(ch -> Character.isDigit(ch) || Character.isLetter(ch)).forEach(builder::append);
|
||||||
|
var blz = builder.toString();
|
||||||
|
|
||||||
|
if (blz.isEmpty()) {
|
||||||
|
throw new IllegalArgumentException("Bank Blz must only contain letters and digits");
|
||||||
|
}
|
||||||
|
|
||||||
|
return blz;
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,35 @@
|
||||||
|
package me.teridax.jcash.banking;
|
||||||
|
|
||||||
|
import java.io.File;
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.nio.file.Files;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
public final class BankingManagementSystem {
|
||||||
|
|
||||||
|
private List<Bank> banks;
|
||||||
|
|
||||||
|
private BankingManagementSystem(List<Bank> banks) {
|
||||||
|
this.banks = banks;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static BankingManagementSystem loadFromCsv(File file) {
|
||||||
|
|
||||||
|
try {
|
||||||
|
var content = Files.readString(file.toPath());
|
||||||
|
|
||||||
|
var banks = new ArrayList<Bank>();
|
||||||
|
|
||||||
|
content.lines().forEach(line -> {
|
||||||
|
// load bank and account from line.
|
||||||
|
// transfer accounts to existing bank if already created
|
||||||
|
});
|
||||||
|
|
||||||
|
} catch (IOException e) {
|
||||||
|
throw new IllegalArgumentException("Could not read file " + file);
|
||||||
|
}
|
||||||
|
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,15 @@
|
||||||
|
package me.teridax.jcash.banking;
|
||||||
|
|
||||||
|
public class Girokonto extends Account {
|
||||||
|
|
||||||
|
private double overdraft;
|
||||||
|
|
||||||
|
public Girokonto(int iban, int pin, double overdraft, Owner owner) {
|
||||||
|
super(iban, pin, owner);
|
||||||
|
this.overdraft = overdraft;
|
||||||
|
}
|
||||||
|
|
||||||
|
public double getOverdraft() {
|
||||||
|
return overdraft;
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,66 @@
|
||||||
|
package me.teridax.jcash.banking;
|
||||||
|
|
||||||
|
import java.util.Objects;
|
||||||
|
|
||||||
|
@SuppressWarnings("unused")
|
||||||
|
public final class Owner {
|
||||||
|
private int uid;
|
||||||
|
private String familyName;
|
||||||
|
private String name;
|
||||||
|
private String street;
|
||||||
|
private int zip;
|
||||||
|
private String city;
|
||||||
|
|
||||||
|
private Owner() { }
|
||||||
|
|
||||||
|
public Owner(int uid, String familyName, String name, int zip, String city, String street) {
|
||||||
|
this.uid = uid;
|
||||||
|
this.familyName = familyName;
|
||||||
|
this.name = name;
|
||||||
|
this.zip = zip;
|
||||||
|
this.city = city;
|
||||||
|
this.street = street;
|
||||||
|
}
|
||||||
|
|
||||||
|
public long getUid() {
|
||||||
|
return uid;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getFamilyName() {
|
||||||
|
return familyName;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getName() {
|
||||||
|
return name;
|
||||||
|
}
|
||||||
|
|
||||||
|
public int getZip() {
|
||||||
|
return zip;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getCity() {
|
||||||
|
return city;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getStreet() {
|
||||||
|
return street;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int hashCode() {
|
||||||
|
return Objects.hash(uid, familyName, name, zip, city, street);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean equals(Object obj) {
|
||||||
|
if (obj instanceof Owner) {
|
||||||
|
return this.uid == ((Owner) obj).getUid();
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String toString() {
|
||||||
|
return String.format("@Owner[uid=%08x, familyName=%s, name=%s, zip=%s, city=%s, street=%s]", uid, familyName, name, zip, city, street);
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,16 @@
|
||||||
|
package me.teridax.jcash.banking;
|
||||||
|
|
||||||
|
@SuppressWarnings("unused")
|
||||||
|
public class SavingsAccount extends Account {
|
||||||
|
|
||||||
|
private double interest;
|
||||||
|
|
||||||
|
public SavingsAccount(int iban, int pin, double interest, Owner owner) {
|
||||||
|
super(iban, pin, owner);
|
||||||
|
this.interest = interest;
|
||||||
|
}
|
||||||
|
|
||||||
|
public double getInterest() {
|
||||||
|
return interest;
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,118 @@
|
||||||
|
package me.teridax.jcash.decode;
|
||||||
|
|
||||||
|
import org.junit.Test;
|
||||||
|
|
||||||
|
import java.text.NumberFormat;
|
||||||
|
import java.text.ParseException;
|
||||||
|
import java.util.Locale;
|
||||||
|
import java.util.Objects;
|
||||||
|
import java.util.regex.Pattern;
|
||||||
|
|
||||||
|
import static junit.framework.TestCase.assertEquals;
|
||||||
|
|
||||||
|
public class Decoder {
|
||||||
|
|
||||||
|
private static final Locale LOCALE = Locale.GERMANY;
|
||||||
|
private static final NumberFormat LOCAL_NUMBER_FORMAT = NumberFormat.getInstance(LOCALE);
|
||||||
|
|
||||||
|
public static double decodePercent(String number) throws IllegalArgumentException, NullPointerException {
|
||||||
|
Objects.requireNonNull(number);
|
||||||
|
|
||||||
|
// trim the number and cut out optional percent symbols
|
||||||
|
var trimmed = number.trim().replace("%", "");
|
||||||
|
|
||||||
|
try {
|
||||||
|
return LOCAL_NUMBER_FORMAT.parse(trimmed).doubleValue();
|
||||||
|
} catch (ParseException ex) {
|
||||||
|
throw new IllegalArgumentException("Not a valid number: " + number, ex);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static double decodeCurrency(String currency) throws IllegalArgumentException, NullPointerException {
|
||||||
|
Objects.requireNonNull(currency);
|
||||||
|
|
||||||
|
try {
|
||||||
|
return LOCAL_NUMBER_FORMAT.parse(currency.trim()).doubleValue();
|
||||||
|
} catch (ParseException ex) {
|
||||||
|
throw new IllegalArgumentException("Not a valid currency in german locale: " + currency, ex);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static int decodeSerialNumber(String number) throws IllegalArgumentException, NullPointerException {
|
||||||
|
Objects.requireNonNull(number);
|
||||||
|
|
||||||
|
// check if the string is a valid unsigned number
|
||||||
|
try {
|
||||||
|
LOCAL_NUMBER_FORMAT.setParseIntegerOnly(true);
|
||||||
|
var serialNumber = LOCAL_NUMBER_FORMAT.parse(number.trim());
|
||||||
|
LOCAL_NUMBER_FORMAT.setParseIntegerOnly(false);
|
||||||
|
return serialNumber.intValue();
|
||||||
|
} catch (ParseException ex) {
|
||||||
|
throw new IllegalArgumentException("Not a valid serial number: " + number, ex);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static String decodeName(String name) throws IllegalArgumentException, NullPointerException {
|
||||||
|
Objects.requireNonNull(name);
|
||||||
|
|
||||||
|
var trimmed = name.trim();
|
||||||
|
|
||||||
|
// check if the string is a valid unsigned number
|
||||||
|
if (!trimmed.trim().chars().allMatch(Character::isLetter))
|
||||||
|
throw new IllegalArgumentException("Not a valid name: " + name);
|
||||||
|
|
||||||
|
return trimmed;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static String decodeStreet(String street) throws IllegalArgumentException, NullPointerException {
|
||||||
|
Objects.requireNonNull(street);
|
||||||
|
|
||||||
|
var pattern = Pattern.compile("\\S+(\\s+\\d+(/\\d+)?)?", Pattern.CASE_INSENSITIVE);
|
||||||
|
var matcher = pattern.matcher(street);
|
||||||
|
if (matcher.find()) {
|
||||||
|
return matcher.group();
|
||||||
|
} else {
|
||||||
|
throw new IllegalArgumentException("not a void address");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testDecodeSuccessfulFunctions() {
|
||||||
|
decodeSerialNumber("95786978625347895");
|
||||||
|
decodeSerialNumber(" 927856347 ");
|
||||||
|
decodeSerialNumber("0");
|
||||||
|
|
||||||
|
decodeName("Adolf");
|
||||||
|
decodeName("Günther");
|
||||||
|
decodeName("Saßkia");
|
||||||
|
|
||||||
|
decodeStreet("Bahnhofstraße 40/1");
|
||||||
|
decodeStreet("Gülleweg 9");
|
||||||
|
decodeStreet("Echsengaße 67 / 4");
|
||||||
|
|
||||||
|
assertEquals(decodePercent("1,4%"), 1.4d);
|
||||||
|
assertEquals(decodePercent("99"), 99.0d);
|
||||||
|
assertEquals(decodePercent("1,003 %"), 1.003d);
|
||||||
|
|
||||||
|
assertEquals(decodeCurrency("1,3€"), 1.3d);
|
||||||
|
assertEquals(decodeCurrency("145,34"), 145,34d);
|
||||||
|
assertEquals(decodeCurrency("0,45 €"), 0.45d);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test(expected = IllegalArgumentException.class)
|
||||||
|
public void testDecodeInvalidFunctions() {
|
||||||
|
decodeSerialNumber("q0948tvb6q047t 740 t74z0tz 784");
|
||||||
|
decodeSerialNumber("-39867.8475");
|
||||||
|
decodeSerialNumber("-398678475");
|
||||||
|
decodeSerialNumber(" ß9qu908t76q34798t6q734vb9843");
|
||||||
|
|
||||||
|
decodeName("John Doe");
|
||||||
|
decodeName("3490qt67v 0b34");
|
||||||
|
decodeName("Alexander9");
|
||||||
|
decodeName("-ga76re78g6$§");
|
||||||
|
|
||||||
|
decodeStreet("Bahnhofstraße -40/1");
|
||||||
|
decodeStreet("Gülleweg 9//567");
|
||||||
|
decodeStreet("23Echsengaße 67 / 4 Hofwetg 9");
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue