From 68562160f12e18ac8c81fb6eea7009276f502647 Mon Sep 17 00:00:00 2001 From: rnentjes Date: Mon, 6 May 2024 20:11:01 +0200 Subject: [PATCH] nullable, non-nullable reference --- .../persistence/reference/Reference.kt | 27 +++++++++++- .../nl/astraeus/persistence/TestReferences.kt | 44 +++++++++++-------- 2 files changed, 50 insertions(+), 21 deletions(-) diff --git a/src/main/kotlin/nl/astraeus/persistence/reference/Reference.kt b/src/main/kotlin/nl/astraeus/persistence/reference/Reference.kt index af2270f..5895b0f 100644 --- a/src/main/kotlin/nl/astraeus/persistence/reference/Reference.kt +++ b/src/main/kotlin/nl/astraeus/persistence/reference/Reference.kt @@ -6,10 +6,33 @@ import java.io.Serializable import kotlin.reflect.KProperty inline fun reference( -) = Reference(T::class.java) + initialValue:T +) = Reference(T::class.java, initialValue) +inline fun nullableReference( +) = NullableReference(T::class.java) class Reference( + val cls: Class, + initialValue: S +) : Serializable { + var id: Long = initialValue.id + + operator fun getValue(thisRef: Persistable, property: KProperty<*>): S { + return currentTransaction()?.find(cls.kotlin, id) ?: throw IllegalStateException("Reference not found") + } + + operator fun setValue(thisRef: Persistable, property: KProperty<*>, value: S) { + currentTransaction()?.store(value) + id = value.id + } + + companion object { + private const val serialVersionUID: Long = 1L + } +} + +class NullableReference( val cls: Class ) : Serializable { var id: Long? = null @@ -29,4 +52,4 @@ class Reference( companion object { private const val serialVersionUID: Long = 1L } -} \ No newline at end of file +} diff --git a/src/test/kotlin/nl/astraeus/persistence/TestReferences.kt b/src/test/kotlin/nl/astraeus/persistence/TestReferences.kt index 908a216..5200031 100644 --- a/src/test/kotlin/nl/astraeus/persistence/TestReferences.kt +++ b/src/test/kotlin/nl/astraeus/persistence/TestReferences.kt @@ -5,6 +5,7 @@ import nl.astraeus.nl.astraeus.persistence.Persistent import nl.astraeus.nl.astraeus.persistence.TransactionLog import nl.astraeus.nl.astraeus.persistence.reference.reference import nl.astraeus.nl.astraeus.persistence.reference.referenceCollection +import org.junit.jupiter.api.assertThrows import java.io.File import kotlin.test.Test @@ -31,15 +32,16 @@ class TestReferences { override var version: Long = 0, val name: String, val age: Int, + company: Company ) : Persistable, Cloneable { - var company: Company? by reference() + var company: Company by reference(company) companion object { private const val serialVersionUID: Long = 1L } override fun toString(): String { - return "Person(id=$id, version=$version, name='$name', age=$age, company=$company)" + return "Person(id=$id, version=$version, name='$name', age=$age)" } } @@ -57,31 +59,35 @@ class TestReferences { ) pst.transaction { - val company = find(Company::class, 1L) ?: Company( + val company = Company( id = 1L, name = "ACME" ) - if (company.persons.isEmpty()) { - val person = Person( - id = 0L, - name = "John Doe", - age = 25 - ) - person.company = company - store(person) - company.persons.add(person) - } else { - for (person in company.persons) { - println("Found stored Person: $person") - } - } + val person = Person( + id = 0L, + name = "John Doe", + age = 25, + company = company + ) + store(person) + + company.persons.add(person) store(company) - for (person in company.persons) { - println("Person: $person") + for (p in company.persons) { + println("Person: $p") } + + delete(company) + + // company is gone, can't get it through person anymore + assertThrows { + println("Company in person: ${person.company}") + } + + delete(person) } }