Added order for listeners

This commit is contained in:
Brage Skjønborg 2026-01-01 20:33:00 +01:00
parent 1e179e32a5
commit c2f0c24a8f
5 changed files with 46 additions and 5 deletions

2
.idea/vcs.xml generated
View File

@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<project version="4"> <project version="4">
<component name="VcsDirectoryMappings"> <component name="VcsDirectoryMappings">
<mapping directory="$PROJECT_DIR$" vcs="Git" /> <mapping directory="" vcs="Git" />
</component> </component>
</project> </project>

View File

@ -7,5 +7,5 @@ abstract class ListenerRegistryImplementation<T> {
listeners.add(listener) listeners.add(listener)
} }
fun getListeners(): List<T> = listeners.toList() open fun getListeners(): List<T> = listeners.toList()
} }

View File

@ -1,6 +1,11 @@
package no.iktdev.eventi.events package no.iktdev.eventi.events
import no.iktdev.eventi.ListenerOrder
import no.iktdev.eventi.ListenerRegistryImplementation import no.iktdev.eventi.ListenerRegistryImplementation
object EventListenerRegistry: ListenerRegistryImplementation<EventListener>() { object EventListenerRegistry : ListenerRegistryImplementation<EventListener>() {
override fun getListeners(): List<EventListener> {
return super.getListeners()
.sortedBy { it::class.java.getAnnotation(ListenerOrder::class.java)?.value ?: Int.MAX_VALUE }
}
} }

View File

@ -1,7 +1,11 @@
package no.iktdev.eventi.tasks package no.iktdev.eventi.tasks
import no.iktdev.eventi.ListenerOrder
import no.iktdev.eventi.ListenerRegistryImplementation import no.iktdev.eventi.ListenerRegistryImplementation
object TaskListenerRegistry: ListenerRegistryImplementation<TaskListener>() { object TaskListenerRegistry: ListenerRegistryImplementation<TaskListener>() {
override fun getListeners(): List<TaskListener> {
return super.getListeners()
.sortedBy { it::class.java.getAnnotation(ListenerOrder::class.java)?.value ?: Int.MAX_VALUE }
}
} }

View File

@ -8,6 +8,7 @@ import no.iktdev.eventi.events.EventListenerRegistry
import no.iktdev.eventi.events.EventTypeRegistry import no.iktdev.eventi.events.EventTypeRegistry
import no.iktdev.eventi.models.DeleteEvent import no.iktdev.eventi.models.DeleteEvent
import no.iktdev.eventi.models.Event import no.iktdev.eventi.models.Event
import no.iktdev.eventi.models.Metadata
import no.iktdev.eventi.testUtil.wipe import no.iktdev.eventi.testUtil.wipe
import org.assertj.core.api.Assertions.assertThat import org.assertj.core.api.Assertions.assertThat
import org.junit.jupiter.api.Assertions.assertEquals 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.assertNotNull
import org.junit.jupiter.api.Assertions.assertTrue import org.junit.jupiter.api.Assertions.assertTrue
import org.junit.jupiter.api.BeforeEach import org.junit.jupiter.api.BeforeEach
import org.junit.jupiter.api.DisplayName
import org.junit.jupiter.api.Test import org.junit.jupiter.api.Test
import java.time.LocalDateTime import java.time.LocalDateTime
import java.util.UUID import java.util.UUID
@ -26,6 +28,11 @@ class EventDispatcherTest: TestBase() {
class TriggerEvent(): Event() { class TriggerEvent(): Event() {
} }
class OtherEvent(): Event() class OtherEvent(): Event()
class DummyEvent(): Event() {
fun putMetadata(metadata: Metadata) {
this.metadata = metadata
}
}
@BeforeEach @BeforeEach
@ -37,7 +44,8 @@ class EventDispatcherTest: TestBase() {
EventTypeRegistry.register(listOf( EventTypeRegistry.register(listOf(
DerivedEvent::class.java, DerivedEvent::class.java,
TriggerEvent::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)) 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 --- // --- Test helpers ---