Implemented deserializing BankList.json on iOS (but packaging BankList.json doesn't work yet, manually linked it to iOSApp project)
This commit is contained in:
parent
1bef1904f9
commit
57ced4a88b
|
@ -0,0 +1,28 @@
|
||||||
|
package net.dankito.utils.multiplatform
|
||||||
|
|
||||||
|
import platform.Foundation.NSArray
|
||||||
|
import platform.Foundation.NSDictionary
|
||||||
|
|
||||||
|
|
||||||
|
fun <T> NSArray.toList(): List<T> {
|
||||||
|
val result = mutableListOf<T>()
|
||||||
|
|
||||||
|
for (i in 0L until this.count.toLong()) {
|
||||||
|
result.add(this.objectAtIndex(i.toULong()) as T)
|
||||||
|
}
|
||||||
|
|
||||||
|
return result
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
fun NSDictionary.getString(key: String): String? {
|
||||||
|
return this.objectForKey(key) as? String
|
||||||
|
}
|
||||||
|
|
||||||
|
fun NSDictionary.getString(key: String, defaultValue: String): String {
|
||||||
|
return this.getString(key) ?: defaultValue
|
||||||
|
}
|
||||||
|
|
||||||
|
fun NSDictionary.getStringOrEmpty(key: String): String {
|
||||||
|
return this.getString(key, "")
|
||||||
|
}
|
|
@ -24,7 +24,7 @@ kotlin {
|
||||||
fromPreset(iOSTarget, 'ios') {
|
fromPreset(iOSTarget, 'ios') {
|
||||||
binaries {
|
binaries {
|
||||||
framework {
|
framework {
|
||||||
baseName = "fints4k"
|
baseName = "BankFinder"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -35,6 +35,8 @@ kotlin {
|
||||||
commonMain {
|
commonMain {
|
||||||
dependencies {
|
dependencies {
|
||||||
implementation kotlin("stdlib-common")
|
implementation kotlin("stdlib-common")
|
||||||
|
|
||||||
|
implementation project(":common")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,18 +1,8 @@
|
||||||
package net.dankito.banking.bankfinder
|
package net.dankito.banking.bankfinder
|
||||||
|
|
||||||
import net.dankito.utils.serialization.JacksonJsonSerializer
|
|
||||||
import org.slf4j.LoggerFactory
|
|
||||||
|
|
||||||
|
|
||||||
abstract class BankFinderBase : IBankFinder {
|
abstract class BankFinderBase : IBankFinder {
|
||||||
|
|
||||||
companion object {
|
|
||||||
const val BankListFileName = "BankList.json"
|
|
||||||
|
|
||||||
private val log = LoggerFactory.getLogger(InMemoryBankFinder::class.java)
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
protected abstract fun findBankByNameOrCityForNonEmptyQuery(query: String): List<BankInfo>
|
protected abstract fun findBankByNameOrCityForNonEmptyQuery(query: String): List<BankInfo>
|
||||||
|
|
||||||
abstract fun searchBankByBic(bic: String): BankInfo?
|
abstract fun searchBankByBic(bic: String): BankInfo?
|
||||||
|
@ -47,24 +37,8 @@ abstract class BankFinderBase : IBankFinder {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
protected open fun loadBankListFile(): List<BankInfo> {
|
protected open fun loadBankList(): List<BankInfo> {
|
||||||
try {
|
return BankListDeserializer().loadBankList()
|
||||||
val bankListString = readBankListFile()
|
|
||||||
|
|
||||||
JacksonJsonSerializer().deserializeList(bankListString, BankInfo::class.java)?.let {
|
|
||||||
return it
|
|
||||||
}
|
|
||||||
} catch (e: Exception) {
|
|
||||||
log.error("Could not load bank list", e)
|
|
||||||
}
|
|
||||||
|
|
||||||
return listOf()
|
|
||||||
}
|
|
||||||
|
|
||||||
protected open fun readBankListFile(): String {
|
|
||||||
val inputStream = BankFinderBase::class.java.classLoader.getResourceAsStream(BankListFileName)
|
|
||||||
|
|
||||||
return inputStream.bufferedReader().readText()
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
|
@ -0,0 +1,8 @@
|
||||||
|
package net.dankito.banking.bankfinder
|
||||||
|
|
||||||
|
|
||||||
|
expect class BankListDeserializer() {
|
||||||
|
|
||||||
|
fun loadBankList(): List<BankInfo>
|
||||||
|
|
||||||
|
}
|
|
@ -58,7 +58,7 @@ open class InMemoryBankFinder() : BankFinderBase(), IBankFinder {
|
||||||
return it
|
return it
|
||||||
}
|
}
|
||||||
|
|
||||||
val bankList = loadBankListFile()
|
val bankList = loadBankList()
|
||||||
|
|
||||||
this.bankListField = bankList
|
this.bankListField = bankList
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,44 @@
|
||||||
|
package net.dankito.banking.bankfinder
|
||||||
|
|
||||||
|
import net.dankito.utils.multiplatform.getString
|
||||||
|
import net.dankito.utils.multiplatform.getStringOrEmpty
|
||||||
|
import net.dankito.utils.multiplatform.toList
|
||||||
|
import platform.Foundation.*
|
||||||
|
|
||||||
|
|
||||||
|
actual class BankListDeserializer {
|
||||||
|
|
||||||
|
actual fun loadBankList(): List<BankInfo> {
|
||||||
|
val bundle = NSBundle.mainBundle
|
||||||
|
|
||||||
|
bundle.pathForResource("BankList", "json")?.let { bankListJsonPath ->
|
||||||
|
NSData.dataWithContentsOfFile(bankListJsonPath, NSDataReadingMappedIfSafe, null)?.let { bankListData ->
|
||||||
|
NSJSONSerialization.JSONObjectWithData(bankListData, NSJSONReadingMutableContainers, null)?.let { bankListJson ->
|
||||||
|
(bankListJson as? NSArray)?.let {
|
||||||
|
return bankListJson.toList<NSDictionary>().map {
|
||||||
|
mapToBankInfo(it)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
return listOf()
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun mapToBankInfo(bankInfoDict: NSDictionary): BankInfo {
|
||||||
|
return BankInfo(
|
||||||
|
bankInfoDict.getStringOrEmpty("name"),
|
||||||
|
bankInfoDict.getStringOrEmpty("bankCode"),
|
||||||
|
bankInfoDict.getStringOrEmpty("bic"),
|
||||||
|
bankInfoDict.getStringOrEmpty("postalCode"),
|
||||||
|
bankInfoDict.getStringOrEmpty("city"),
|
||||||
|
bankInfoDict.getStringOrEmpty("checksumMethod"),
|
||||||
|
bankInfoDict.getString("pinTanAddress"),
|
||||||
|
bankInfoDict.getString("pinTanVersion"),
|
||||||
|
bankInfoDict.getString("oldBankCode")
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,36 @@
|
||||||
|
package net.dankito.banking.bankfinder
|
||||||
|
|
||||||
|
import net.dankito.utils.multiplatform.log.LoggerFactory
|
||||||
|
import net.dankito.utils.serialization.JacksonJsonSerializer
|
||||||
|
|
||||||
|
|
||||||
|
actual class BankListDeserializer {
|
||||||
|
|
||||||
|
companion object {
|
||||||
|
const val BankListFileName = "BankList.json"
|
||||||
|
|
||||||
|
private val log = LoggerFactory.getLogger(InMemoryBankFinder::class)
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
actual fun loadBankList(): List<BankInfo> {
|
||||||
|
try {
|
||||||
|
val bankListString = readBankListFile()
|
||||||
|
|
||||||
|
JacksonJsonSerializer().deserializeList(bankListString, BankInfo::class.java)?.let {
|
||||||
|
return it
|
||||||
|
}
|
||||||
|
} catch (e: Exception) {
|
||||||
|
log.error(e) { "Could not load bank list" }
|
||||||
|
}
|
||||||
|
|
||||||
|
return listOf()
|
||||||
|
}
|
||||||
|
|
||||||
|
fun readBankListFile(): String {
|
||||||
|
val inputStream = BankFinderBase::class.java.classLoader.getResourceAsStream(BankListFileName)
|
||||||
|
|
||||||
|
return inputStream.bufferedReader().readText()
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
Loading…
Reference in New Issue