diff --git a/app/src/main/java/net/pokeranalytics/android/util/csv/CSVDescriptor.kt b/app/src/main/java/net/pokeranalytics/android/util/csv/CSVDescriptor.kt index b28c5182..ef936cc4 100644 --- a/app/src/main/java/net/pokeranalytics/android/util/csv/CSVDescriptor.kt +++ b/app/src/main/java/net/pokeranalytics/android/util/csv/CSVDescriptor.kt @@ -4,6 +4,7 @@ import io.realm.Realm import io.realm.kotlin.deleteFromRealm import net.pokeranalytics.android.model.interfaces.Identifiable import net.pokeranalytics.android.model.interfaces.ObjectIdentifier +import net.pokeranalytics.android.model.realm.CustomField import net.pokeranalytics.android.model.realm.Session import net.pokeranalytics.android.util.extensions.findById import org.apache.commons.csv.CSVRecord @@ -26,7 +27,7 @@ abstract class DataCSVDescriptor(source: DataSource, vararg el /** * List of Realm object identificators */ - val realmModelIds = mutableListOf() + private val realmModelIds = mutableListOf() abstract fun parseData(realm: Realm, record: CSVRecord): T? @@ -83,29 +84,19 @@ abstract class CSVDescriptor(var source: DataSource, vararg elements: CSVField) /** * The CSVField list describing the CSV header format */ - protected var fields: List = listOf() + protected var fields: MutableList = mutableListOf() + /** * The mapping of CSVField with their index in the CSV file */ protected var fieldMapping: MutableMap = mutableMapOf() init { - if (elements.size > 0) { - this.fields = elements.toList() + if (elements.isNotEmpty()) { + this.fields = elements.toMutableList() } } - companion object { - /** - * The list of all managed CSVDescriptors - */ - val all: List = - listOf(ProductCSVDescriptors.pokerIncomeCash, - ProductCSVDescriptors.pokerBankrollTracker, - ProductCSVDescriptors.runGoodCashGames, - ProductCSVDescriptors.runGoodTournaments) - } - /** * Method called when iterating on a CSVRecord */ @@ -140,4 +131,24 @@ abstract class CSVDescriptor(var source: DataSource, vararg elements: CSVField) return count >= mandatoryfields.size } + fun mapCustomField(record: CSVRecord, realm: Realm) { + val customFields = realm.where(CustomField::class.java).findAll() + val headers = record.toSet() + headers.forEach { header -> + val customField = customFields.firstOrNull { it.name == header } + customField?.let { + + if (it.isListType) { + + } else { + val f = MappedCustomCVSField.Number(header, null, "", it) + fields.add(f) + } + + + } + } + + } + } diff --git a/app/src/main/java/net/pokeranalytics/android/util/csv/CSVField.kt b/app/src/main/java/net/pokeranalytics/android/util/csv/CSVField.kt index a5367951..46d4ba61 100644 --- a/app/src/main/java/net/pokeranalytics/android/util/csv/CSVField.kt +++ b/app/src/main/java/net/pokeranalytics/android/util/csv/CSVField.kt @@ -1,5 +1,7 @@ package net.pokeranalytics.android.util.csv +import net.pokeranalytics.android.model.realm.CustomField +import net.pokeranalytics.android.model.realm.CustomFieldEntry import timber.log.Timber import java.text.DateFormat import java.text.NumberFormat @@ -82,6 +84,18 @@ interface BlindCSVField : TypedCSVField> { } +interface CustomEntryCSVField : TypedCSVField, CustomCSVField { + +} + +interface CustomNumberCSVField : NumberCSVField, CustomCSVField { + +} + +interface CustomCSVField { + var customField: CustomField +} + interface TypedCSVField : CSVField { fun parse(value: String) : T? var callback: ((String) -> T?)? diff --git a/app/src/main/java/net/pokeranalytics/android/util/csv/CSVImporter.kt b/app/src/main/java/net/pokeranalytics/android/util/csv/CSVImporter.kt index 4ffb6ca9..ba04cfcc 100644 --- a/app/src/main/java/net/pokeranalytics/android/util/csv/CSVImporter.kt +++ b/app/src/main/java/net/pokeranalytics/android/util/csv/CSVImporter.kt @@ -36,10 +36,12 @@ open class CSVImporter(istream: InputStream) { * Number of commits required to commit a Realm transaction */ private val COMMIT_FREQUENCY = 100 + /** * The number of column indicating a valid record */ private val VALID_RECORD_COLUMNS = 4 + /** * The number of valid record to test for descriptor before throwing a File Format Exception */ @@ -111,7 +113,7 @@ open class CSVImporter(istream: InputStream) { this.notifyDelegate() if (this.currentDescriptor == null) { // find descriptor - this.currentDescriptor = this.findDescriptor(record) + this.currentDescriptor = this.findDescriptor(record, realm) if (this.currentDescriptor == null) { @@ -174,10 +176,11 @@ open class CSVImporter(istream: InputStream) { /** * Search for a descriptor in the list of managed formats */ - private fun findDescriptor(record: CSVRecord): CSVDescriptor? { + private fun findDescriptor(record: CSVRecord, realm: Realm): CSVDescriptor? { - CSVDescriptor.all.forEach { descriptor -> + ProductCSVDescriptors.all.forEach { descriptor -> if (descriptor.matches(record)) { + descriptor.mapCustomField(record, realm) this.currentDescriptor = descriptor Timber.d("Identified source: ${descriptor.source}") return descriptor diff --git a/app/src/main/java/net/pokeranalytics/android/util/csv/ProductCSVDescriptors.kt b/app/src/main/java/net/pokeranalytics/android/util/csv/ProductCSVDescriptors.kt index 02d86087..3b913ea5 100644 --- a/app/src/main/java/net/pokeranalytics/android/util/csv/ProductCSVDescriptors.kt +++ b/app/src/main/java/net/pokeranalytics/android/util/csv/ProductCSVDescriptors.kt @@ -4,6 +4,17 @@ class ProductCSVDescriptors { companion object { + /** + * The list of all managed CSVDescriptors + */ + val all: List = + listOf( + ProductCSVDescriptors.pokerIncomeCash, + ProductCSVDescriptors.pokerBankrollTracker, + ProductCSVDescriptors.runGoodCashGames, + ProductCSVDescriptors.runGoodTournaments + ) + val pokerIncomeCash: CSVDescriptor = SessionCSVDescriptor( DataSource.POKER_INCOME, false, diff --git a/app/src/main/java/net/pokeranalytics/android/util/csv/SessionField.kt b/app/src/main/java/net/pokeranalytics/android/util/csv/SessionField.kt index 677c60a4..d9cce18e 100644 --- a/app/src/main/java/net/pokeranalytics/android/util/csv/SessionField.kt +++ b/app/src/main/java/net/pokeranalytics/android/util/csv/SessionField.kt @@ -1,7 +1,29 @@ package net.pokeranalytics.android.util.csv +import net.pokeranalytics.android.model.realm.CustomField +import net.pokeranalytics.android.model.realm.CustomFieldEntry import java.util.* +sealed class MappedCustomCVSField { + + data class Number( + override var header: String, + override var callback: ((String) -> Double?)? = null, + override val numberFormat: String?, + override var customField: CustomField) : CustomNumberCSVField + + data class List( + override var header: String, + override var callback: ((String) -> CustomFieldEntry?)? = null, + override var customField: CustomField) : CustomEntryCSVField { + + override fun parse(value: String): CustomFieldEntry? { + TODO("not implemented") //To change body of created functions use File | Settings | File Templates. + } + + } +} + sealed class TransactionField { data class TransactionType(