diff --git a/src/main/kotlin/nl/astraeus/persistence/reference/Reference.kt b/src/main/kotlin/nl/astraeus/persistence/reference/Reference.kt index 02648d1..af2270f 100644 --- a/src/main/kotlin/nl/astraeus/persistence/reference/Reference.kt +++ b/src/main/kotlin/nl/astraeus/persistence/reference/Reference.kt @@ -2,16 +2,20 @@ package nl.astraeus.nl.astraeus.persistence.reference import nl.astraeus.nl.astraeus.persistence.Persistable import nl.astraeus.nl.astraeus.persistence.currentTransaction +import java.io.Serializable import kotlin.reflect.KProperty +inline fun reference( +) = Reference(T::class.java) + + class Reference( - val cls: Class, - val setter: (Long?) -> Unit, - val getter: () -> Long?, -) { + val cls: Class +) : Serializable { + var id: Long? = null operator fun getValue(thisRef: Persistable, property: KProperty<*>): S? { - return currentTransaction()?.find(cls.kotlin, (getter() ?: 0L)) + return currentTransaction()?.find(cls.kotlin, id ?: 0L) } operator fun setValue(thisRef: Persistable, property: KProperty<*>, value: S?) { @@ -19,7 +23,7 @@ class Reference( // todo: only store if not already stored? currentTransaction()?.store(value) } - setter(value?.id) + id = value?.id } companion object { diff --git a/src/test/kotlin/nl/astraeus/persistence/TestReferences.kt b/src/test/kotlin/nl/astraeus/persistence/TestReferences.kt index 98a607c..908a216 100644 --- a/src/test/kotlin/nl/astraeus/persistence/TestReferences.kt +++ b/src/test/kotlin/nl/astraeus/persistence/TestReferences.kt @@ -3,7 +3,7 @@ package nl.astraeus.persistence import nl.astraeus.nl.astraeus.persistence.Persistable import nl.astraeus.nl.astraeus.persistence.Persistent import nl.astraeus.nl.astraeus.persistence.TransactionLog -import nl.astraeus.nl.astraeus.persistence.currentTransaction +import nl.astraeus.nl.astraeus.persistence.reference.reference import nl.astraeus.nl.astraeus.persistence.reference.referenceCollection import java.io.File import kotlin.test.Test @@ -31,23 +31,15 @@ class TestReferences { override var version: Long = 0, val name: String, val age: Int, - private var companyId: Long? = null ) : Persistable, Cloneable { - var company: Company? - get() = currentTransaction()?.find(Company::class, companyId ?: 0L) - set(value) { - if (value != null) { - currentTransaction()?.store(value) - } - companyId = value?.id - } + var company: Company? by reference() companion object { private const val serialVersionUID: Long = 1L } override fun toString(): String { - return "Person(id=$id, version=$version, name='$name', age=$age, company=$companyId)" + return "Person(id=$id, version=$version, name='$name', age=$age, company=$company)" } } @@ -79,6 +71,10 @@ class TestReferences { person.company = company store(person) company.persons.add(person) + } else { + for (person in company.persons) { + println("Found stored Person: $person") + } } store(company) diff --git a/src/test/kotlin/nl/astraeus/persistence/TestThreaded.kt b/src/test/kotlin/nl/astraeus/persistence/TestThreaded.kt index e8d1460..bcf5a26 100644 --- a/src/test/kotlin/nl/astraeus/persistence/TestThreaded.kt +++ b/src/test/kotlin/nl/astraeus/persistence/TestThreaded.kt @@ -38,11 +38,11 @@ class TestThreaded { val age: Int, var companyId: Long? = null ) : Persistable, Cloneable { - var company: Company? by Reference( +/* var company: Company? by Reference( Company::class.java, { id -> companyId = id }, { companyId } - ) + )*/ companion object { private const val serialVersionUID: Long = 1L @@ -113,7 +113,7 @@ class TestThreaded { name = names[random.nextInt(names.size)], age = random.nextInt(0, 100), ) - person.company = company + //person.company = company store(person) }