From b87dce5b753944fadd1c189c25cdbfa88d19ea2e Mon Sep 17 00:00:00 2001 From: Laurent Date: Thu, 4 Jul 2019 12:20:48 +0200 Subject: [PATCH] Added Import delete functions --- .../pokeranalytics/android/model/LiveData.kt | 67 ++++++++++--------- .../android/model/interfaces/Manageable.kt | 22 +++++- .../android/model/realm/IdentifiableObject.kt | 26 +++++++ .../android/model/realm/Import.kt | 19 ++++-- .../android/model/realm/Session.kt | 10 ++- .../android/ui/fragment/DataListFragment.kt | 2 +- .../ui/fragment/data/DataManagerFragment.kt | 2 +- .../android/util/csv/CSVDescriptor.kt | 25 +------ 8 files changed, 108 insertions(+), 65 deletions(-) create mode 100644 app/src/main/java/net/pokeranalytics/android/model/realm/IdentifiableObject.kt diff --git a/app/src/main/java/net/pokeranalytics/android/model/LiveData.kt b/app/src/main/java/net/pokeranalytics/android/model/LiveData.kt index ba7658ff..8a1cc09e 100644 --- a/app/src/main/java/net/pokeranalytics/android/model/LiveData.kt +++ b/app/src/main/java/net/pokeranalytics/android/model/LiveData.kt @@ -3,46 +3,44 @@ package net.pokeranalytics.android.model import android.content.Context import io.realm.Realm import net.pokeranalytics.android.R -import net.pokeranalytics.android.model.interfaces.Deletable +import net.pokeranalytics.android.model.interfaces.Identifiable import net.pokeranalytics.android.model.realm.* import net.pokeranalytics.android.ui.view.Localizable +import net.pokeranalytics.android.util.enumerations.IntIdentifiable +import net.pokeranalytics.android.util.enumerations.IntSearchable import net.pokeranalytics.android.util.extensions.findById /** * An enum managing the business objects related to a realm results */ -enum class LiveData : Localizable { - BANKROLL, - GAME, - LOCATION, - TOURNAMENT_NAME, - TOURNAMENT_FEATURE, - TRANSACTION, - TRANSACTION_TYPE, - FILTER, - CUSTOM_FIELD, - REPORT_SETUP; - - var subType:Int? = null +enum class LiveData(override var uniqueIdentifier: Int, val relatedEntity: Class) : Localizable, IntIdentifiable { + BANKROLL(0, Bankroll::class.java), + GAME(1, Game::class.java), + LOCATION(2, Location::class.java), + TOURNAMENT_NAME(3, TournamentName::class.java), + TOURNAMENT_FEATURE(4, TournamentFeature::class.java), + TRANSACTION(5, Transaction::class.java), + TRANSACTION_TYPE(6, TransactionType::class.java), + FILTER(7, Filter::class.java), + CUSTOM_FIELD(8, CustomField::class.java), + REPORT_SETUP(9, ReportSetup::class.java), + SESSION(10, Session::class.java); + + companion object : IntSearchable { + + override fun valuesInternal(): Array { + return values() + } - val relatedEntity: Class - get() { - return when (this) { - BANKROLL -> Bankroll::class.java - GAME -> Game::class.java - LOCATION -> Location::class.java - TOURNAMENT_NAME -> TournamentName::class.java - TOURNAMENT_FEATURE -> TournamentFeature::class.java - TRANSACTION -> Transaction::class.java - TRANSACTION_TYPE -> TransactionType::class.java - FILTER -> Filter::class.java - CUSTOM_FIELD -> CustomField::class.java - REPORT_SETUP -> ReportSetup::class.java - } + fun valueFromClass(clazz: Class) : LiveData? { + return values().firstOrNull { it.relatedEntity == clazz } } + } + + var subType:Int? = null - fun updateOrCreate(realm: Realm, primaryKey: String?): Deletable { - val proxyItem: Deletable? = this.getData(realm, primaryKey) + fun updateOrCreate(realm: Realm, primaryKey: String?): Identifiable { + val proxyItem: Identifiable? = this.getData(realm, primaryKey) proxyItem?.let { return realm.copyFromRealm(it) } ?: run { @@ -50,12 +48,12 @@ enum class LiveData : Localizable { } } - private fun newEntity(): Deletable { + private fun newEntity(): Identifiable { return this.relatedEntity.newInstance() } - fun getData(realm: Realm, primaryKey: String?): Deletable? { - var proxyItem: Deletable? = null + fun getData(realm: Realm, primaryKey: String?): Identifiable? { + var proxyItem: Identifiable? = null primaryKey?.let { val t = realm.findById(this.relatedEntity, it) t?.let { @@ -78,6 +76,7 @@ enum class LiveData : Localizable { FILTER -> R.string.filter CUSTOM_FIELD -> R.string.custom_field REPORT_SETUP -> R.string.custom + SESSION -> R.string.session } } @@ -94,6 +93,7 @@ enum class LiveData : Localizable { FILTER -> R.string.filters CUSTOM_FIELD -> R.string.custom_fields REPORT_SETUP -> R.string.custom + SESSION -> R.string.sessions } } @@ -110,6 +110,7 @@ enum class LiveData : Localizable { FILTER -> R.string.new_filter CUSTOM_FIELD -> R.string.new_custom_field REPORT_SETUP -> R.string.new_report + else -> R.string.none } } diff --git a/app/src/main/java/net/pokeranalytics/android/model/interfaces/Manageable.kt b/app/src/main/java/net/pokeranalytics/android/model/interfaces/Manageable.kt index 4a6c077d..4c6abd64 100644 --- a/app/src/main/java/net/pokeranalytics/android/model/interfaces/Manageable.kt +++ b/app/src/main/java/net/pokeranalytics/android/model/interfaces/Manageable.kt @@ -5,6 +5,9 @@ import io.realm.Realm import io.realm.RealmModel import net.pokeranalytics.android.R import net.pokeranalytics.android.exceptions.ModelException +import net.pokeranalytics.android.exceptions.PAIllegalStateException +import net.pokeranalytics.android.model.LiveData +import net.pokeranalytics.android.model.realm.IdentifiableObject import net.pokeranalytics.android.ui.view.RowRepresentable enum class SaveValidityStatus { @@ -45,7 +48,24 @@ interface NameManageable : Manageable { } } -class ObjectIdentifier(var id: String, var clazz: Class) +class ObjectIdentifier(var id: String, var clazz: Class) { + + val identifiableObject: IdentifiableObject + get() { + + val livedata = LiveData.valueFromClass(this.clazz) + livedata?.let { + val io = IdentifiableObject() + io.id = this.id + io.classId = it.uniqueIdentifier + return io + } ?: run { + throw PAIllegalStateException("clazz $clazz has no corresponding LiveData value") + } + + } + +} /** * An interface associate a unique uniqueIdentifier to an object diff --git a/app/src/main/java/net/pokeranalytics/android/model/realm/IdentifiableObject.kt b/app/src/main/java/net/pokeranalytics/android/model/realm/IdentifiableObject.kt new file mode 100644 index 00000000..b211f06f --- /dev/null +++ b/app/src/main/java/net/pokeranalytics/android/model/realm/IdentifiableObject.kt @@ -0,0 +1,26 @@ +package net.pokeranalytics.android.model.realm + +import io.realm.RealmModel +import io.realm.RealmObject +import net.pokeranalytics.android.model.LiveData +import net.pokeranalytics.android.util.extensions.findById + +open class IdentifiableObject : RealmObject() { + + /** + * The id of an Identifiable object + */ + var id: String = "" + + /** + * The uniqueIdentifier of the LiveData object + */ + var classId: Int = 0 + + val realmModel: RealmModel? + get() { + val clazz = LiveData.valueByIdentifier(this.classId).relatedEntity + return this.realm.findById(clazz, id) + } + +} \ No newline at end of file diff --git a/app/src/main/java/net/pokeranalytics/android/model/realm/Import.kt b/app/src/main/java/net/pokeranalytics/android/model/realm/Import.kt index 88452cd6..ec99c037 100644 --- a/app/src/main/java/net/pokeranalytics/android/model/realm/Import.kt +++ b/app/src/main/java/net/pokeranalytics/android/model/realm/Import.kt @@ -2,6 +2,7 @@ package net.pokeranalytics.android.model.realm import io.realm.RealmList import io.realm.RealmObject +import io.realm.kotlin.deleteFromRealm import java.util.* open class Import : RealmObject() { @@ -10,19 +11,25 @@ open class Import : RealmObject() { var fileName: String = "" - var sessions: RealmList = RealmList() - var transactions: RealmList = RealmList() + var identifiableObjects: RealmList = RealmList() fun delete() { this.realm.executeTransaction { - this.sessions.forEach { - it.cleanup() - it.deleteFromRealm() + this.identifiableObjects.forEach { + + val realmModel = it.realmModel + when (realmModel) { + is Session -> { + realmModel.cleanup() + } + else -> {} + } + + realmModel?.deleteFromRealm() } - transactions.deleteAllFromRealm() } } diff --git a/app/src/main/java/net/pokeranalytics/android/model/realm/Session.kt b/app/src/main/java/net/pokeranalytics/android/model/realm/Session.kt index 4df1af75..5e6b3514 100644 --- a/app/src/main/java/net/pokeranalytics/android/model/realm/Session.kt +++ b/app/src/main/java/net/pokeranalytics/android/model/realm/Session.kt @@ -45,7 +45,7 @@ import kotlin.collections.ArrayList typealias BB = Double -open class Session : RealmObject(), Savable, Editable, StaticRowRepresentableDataSource, RowRepresentable, Timed, +open class Session : RealmObject(), Manageable, StaticRowRepresentableDataSource, RowRepresentable, Timed, TimeFilterable, Filterable, DatedBankrollGraphEntry { enum class Type { @@ -493,6 +493,14 @@ open class Session : RealmObject(), Savable, Editable, StaticRowRepresentableDat return R.string.no_br_popup_message } + override fun getFailedDeleteMessage(status: DeleteValidityStatus): Int { + TODO("not implemented") //To change body of created functions use File | Settings | File Templates. + } + + override fun isValidForDelete(realm: Realm): Boolean { + return true + } + // States /** diff --git a/app/src/main/java/net/pokeranalytics/android/ui/fragment/DataListFragment.kt b/app/src/main/java/net/pokeranalytics/android/ui/fragment/DataListFragment.kt index 13c4a9fc..dec3044e 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/fragment/DataListFragment.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/fragment/DataListFragment.kt @@ -47,7 +47,7 @@ open class DataListFragment : DeletableItemFragment(), LiveRowRepresentableDataS open fun setData(dataType: Int) { this.dataType = LiveData.values()[dataType] - this.identifiableClass = this.dataType.relatedEntity + this.identifiableClass = this.dataType.relatedEntity as Class setToolbarTitle(this.dataType.pluralLocalizedTitle(requireContext())) this.items = this.retrieveItems(getRealm()) diff --git a/app/src/main/java/net/pokeranalytics/android/ui/fragment/data/DataManagerFragment.kt b/app/src/main/java/net/pokeranalytics/android/ui/fragment/data/DataManagerFragment.kt index 1234528b..1c80dfce 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/fragment/data/DataManagerFragment.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/fragment/data/DataManagerFragment.kt @@ -75,7 +75,7 @@ open class DataManagerFragment : RealmFragment() { */ private fun loadItem() { - this.item = this.liveDataType.updateOrCreate(this.getRealm(), primaryKey) + this.item = this.liveDataType.updateOrCreate(this.getRealm(), primaryKey) as Deletable this.deleteButtonShouldAppear = this.primaryKey != null } 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 9ca3dac9..b3e3a008 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 @@ -1,13 +1,9 @@ package net.pokeranalytics.android.util.csv 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.Import -import net.pokeranalytics.android.model.realm.Session -import net.pokeranalytics.android.util.extensions.findById import org.apache.commons.csv.CSVRecord import timber.log.Timber import java.text.NumberFormat @@ -27,25 +23,19 @@ enum class DataSource { */ abstract class DataCSVDescriptor(source: DataSource, vararg elements: CSVField) : CSVDescriptor(source, *elements) { - /** - * List of Realm object identificators - */ - private val realmModelIds = mutableListOf() - abstract fun parseData(realm: Realm, record: CSVRecord): T? override fun parse(realm: Realm, record: CSVRecord): Int { val data = this.parseData(realm, record) data?.let { -// Timber.d(">>>>>>> identifier added: ${it.id}") - this.realmModelIds.add(it.objectIdentifier) + this.import.identifiableObjects.add(it.objectIdentifier.identifiableObject) } return if (data != null) 1 else 0 } protected fun addAdditionallyCreatedIdentifiable(identifiable: Identifiable) { - this.realmModelIds.add(identifiable.objectIdentifier) + this.import.identifiableObjects.add(identifiable.objectIdentifier.identifiableObject) } override fun cancel(realm: Realm) { @@ -61,20 +51,11 @@ abstract class DataCSVDescriptor(source: DataSource, vararg el } private fun deleteInsertedFromRealm(realm: Realm) { - this.realmModelIds.forEach { identifier -> - val data = realm.findById(identifier.clazz, identifier.id) - if (data is Session) { - data.cleanup() - } - data?.deleteFromRealm() - } - this.realmModelIds.clear() - + this.import.delete() } override fun save(realm: Realm) { super.save(realm) - this.realmModelIds.clear() } }