From c2f0c24a8f23c6912e55b24fc9acbe30ce198aa5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Brage=20Skj=C3=B8nborg?= Date: Thu, 1 Jan 2026 20:33:00 +0100 Subject: [PATCH] Added order for listeners --- .idea/vcs.xml | 2 +- .../eventi/ListenerRegistryImplementation.kt | 2 +- .../eventi/events/EventListenerRegistry.kt | 7 +++- .../eventi/tasks/TaskListenerRegistry.kt | 6 +++- .../no/iktdev/eventi/EventDispatcherTest.kt | 34 ++++++++++++++++++- 5 files changed, 46 insertions(+), 5 deletions(-) diff --git a/.idea/vcs.xml b/.idea/vcs.xml index 94a25f7..35eb1dd 100644 --- a/.idea/vcs.xml +++ b/.idea/vcs.xml @@ -1,6 +1,6 @@ - + \ No newline at end of file diff --git a/src/main/kotlin/no/iktdev/eventi/ListenerRegistryImplementation.kt b/src/main/kotlin/no/iktdev/eventi/ListenerRegistryImplementation.kt index 6d4099a..07f05fd 100644 --- a/src/main/kotlin/no/iktdev/eventi/ListenerRegistryImplementation.kt +++ b/src/main/kotlin/no/iktdev/eventi/ListenerRegistryImplementation.kt @@ -7,5 +7,5 @@ abstract class ListenerRegistryImplementation { listeners.add(listener) } - fun getListeners(): List = listeners.toList() + open fun getListeners(): List = listeners.toList() } \ No newline at end of file diff --git a/src/main/kotlin/no/iktdev/eventi/events/EventListenerRegistry.kt b/src/main/kotlin/no/iktdev/eventi/events/EventListenerRegistry.kt index 042fb5b..cf2623f 100644 --- a/src/main/kotlin/no/iktdev/eventi/events/EventListenerRegistry.kt +++ b/src/main/kotlin/no/iktdev/eventi/events/EventListenerRegistry.kt @@ -1,6 +1,11 @@ package no.iktdev.eventi.events +import no.iktdev.eventi.ListenerOrder import no.iktdev.eventi.ListenerRegistryImplementation -object EventListenerRegistry: ListenerRegistryImplementation() { +object EventListenerRegistry : ListenerRegistryImplementation() { + override fun getListeners(): List { + return super.getListeners() + .sortedBy { it::class.java.getAnnotation(ListenerOrder::class.java)?.value ?: Int.MAX_VALUE } + } } \ No newline at end of file diff --git a/src/main/kotlin/no/iktdev/eventi/tasks/TaskListenerRegistry.kt b/src/main/kotlin/no/iktdev/eventi/tasks/TaskListenerRegistry.kt index d0d4481..a1d0ba8 100644 --- a/src/main/kotlin/no/iktdev/eventi/tasks/TaskListenerRegistry.kt +++ b/src/main/kotlin/no/iktdev/eventi/tasks/TaskListenerRegistry.kt @@ -1,7 +1,11 @@ package no.iktdev.eventi.tasks +import no.iktdev.eventi.ListenerOrder import no.iktdev.eventi.ListenerRegistryImplementation object TaskListenerRegistry: ListenerRegistryImplementation() { - + override fun getListeners(): List { + return super.getListeners() + .sortedBy { it::class.java.getAnnotation(ListenerOrder::class.java)?.value ?: Int.MAX_VALUE } + } } \ No newline at end of file diff --git a/src/test/kotlin/no/iktdev/eventi/EventDispatcherTest.kt b/src/test/kotlin/no/iktdev/eventi/EventDispatcherTest.kt index 5e3f8d1..9d366c2 100644 --- a/src/test/kotlin/no/iktdev/eventi/EventDispatcherTest.kt +++ b/src/test/kotlin/no/iktdev/eventi/EventDispatcherTest.kt @@ -8,6 +8,7 @@ import no.iktdev.eventi.events.EventListenerRegistry import no.iktdev.eventi.events.EventTypeRegistry import no.iktdev.eventi.models.DeleteEvent import no.iktdev.eventi.models.Event +import no.iktdev.eventi.models.Metadata import no.iktdev.eventi.testUtil.wipe import org.assertj.core.api.Assertions.assertThat import org.junit.jupiter.api.Assertions.assertEquals @@ -15,6 +16,7 @@ import org.junit.jupiter.api.Assertions.assertFalse import org.junit.jupiter.api.Assertions.assertNotNull import org.junit.jupiter.api.Assertions.assertTrue import org.junit.jupiter.api.BeforeEach +import org.junit.jupiter.api.DisplayName import org.junit.jupiter.api.Test import java.time.LocalDateTime import java.util.UUID @@ -26,6 +28,11 @@ class EventDispatcherTest: TestBase() { class TriggerEvent(): Event() { } class OtherEvent(): Event() + class DummyEvent(): Event() { + fun putMetadata(metadata: Metadata) { + this.metadata = metadata + } + } @BeforeEach @@ -37,7 +44,8 @@ class EventDispatcherTest: TestBase() { EventTypeRegistry.register(listOf( DerivedEvent::class.java, TriggerEvent::class.java, - OtherEvent::class.java + OtherEvent::class.java, + DummyEvent::class.java )) } @@ -146,6 +154,30 @@ class EventDispatcherTest: TestBase() { assertTrue(received.contains(deleted)) } + @Test + @DisplayName("Replay skal ikke levere en event som allerede har avledet en ny") + fun `should not re-deliver events that have produced derived events`() { + val listener = ProducingListener() + + val trigger = TriggerEvent() + // Første dispatch: trigger produserer en DerivedEvent + dispatcher.dispatch(trigger.referenceId, listOf(trigger)) + + val produced = eventStore.all().mapNotNull { it.toEvent() } + assertEquals(1, produced.size) + val derived = produced.first() + assertTrue(derived is DerivedEvent) + + // Replay: nå har vi både trigger og derived i konteksten + val replayContext = listOf(trigger, derived) + dispatcher.dispatch(trigger.referenceId, replayContext) + + // Verifiser at ingen nye events ble produsert + assertEquals(1, eventStore.all().size) { + "TriggerEvent skal ikke leveres som kandidat igjen når den allerede har avledet en DerivedEvent" + } + } + // --- Test helpers ---