You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@isis.apache.org by jo...@apache.org on 2021/10/22 16:00:59 UTC

[isis] 01/03: ISIS-2348 EventStore refactored from object (Singleton) to class

This is an automated email from the ASF dual-hosted git repository.

joergrade pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/isis.git

commit 59ec70a50d31d8f8765b52b9deca6d5460722744
Author: Jörg Rade <jo...@kuehne-nagel.com>
AuthorDate: Fri Oct 22 12:44:01 2021 +0200

    ISIS-2348 EventStore refactored from object (Singleton) to class
---
 .../org/apache/isis/client/kroviz/core/Session.kt  |   2 +
 .../kroviz/core/aggregator/ErrorDispatcher.kt      |   4 +-
 .../isis/client/kroviz/core/event/EventStore.kt    |   2 +-
 .../isis/client/kroviz/core/event/ReplayCommand.kt |   6 +-
 .../isis/client/kroviz/core/event/ResourceProxy.kt |  13 +-
 .../client/kroviz/core/event/RoXmlHttpRequest.kt   |  12 +-
 .../isis/client/kroviz/core/model/ObjectDM.kt      |  48 +++----
 .../isis/client/kroviz/ui/core/MenuFactory.kt      |   2 +-
 .../apache/isis/client/kroviz/ui/core/RoIconBar.kt |   2 +-
 .../apache/isis/client/kroviz/ui/core/RoMenuBar.kt |   2 +-
 .../apache/isis/client/kroviz/ui/core/UiManager.kt |  10 +-
 .../client/kroviz/ui/diagram/LinkTreeDiagram.kt    |   2 +-
 .../isis/client/kroviz/ui/dialog/DiagramDialog.kt  |   2 +-
 .../client/kroviz/ui/dialog/EventExportDialog.kt   |   7 +-
 .../isis/client/kroviz/ui/dialog/EventLogDetail.kt |   3 +-
 .../client/kroviz/ui/panel/DynamicMenuBuilder.kt   |   2 +-
 .../apache/isis/client/kroviz/IntegrationTest.kt   |   5 +-
 .../core/aggregator/CollectionAggregatorTest.kt    |   9 +-
 .../client/kroviz/core/event/EventStoreTest.kt     | 140 +++++++++++----------
 .../org/apache/isis/client/kroviz/to/ActionTest.kt |   7 +-
 .../isis/client/kroviz/to/ResultValueTest.kt       |   3 +-
 .../client/kroviz/ui/table/LinkTreeDiagramTest.kt  |  24 ++--
 22 files changed, 168 insertions(+), 139 deletions(-)

diff --git a/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/core/Session.kt b/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/core/Session.kt
index eee34ee..feb12f0 100644
--- a/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/core/Session.kt
+++ b/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/core/Session.kt
@@ -18,6 +18,7 @@
  */
 package org.apache.isis.client.kroviz.core
 
+import org.apache.isis.client.kroviz.core.event.EventStore
 import org.apache.isis.client.kroviz.ui.core.UiManager
 import org.apache.isis.client.kroviz.utils.StringUtils
 
@@ -28,6 +29,7 @@ class Session {
     private var user: String = ""
     private var pw: String = ""
     var url: String = ""
+    val eventStore = EventStore()
 
     fun login(url: String, user: String, pw: String) {
         this.user = user
diff --git a/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/core/aggregator/ErrorDispatcher.kt b/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/core/aggregator/ErrorDispatcher.kt
index 89ccc28..35add14 100644
--- a/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/core/aggregator/ErrorDispatcher.kt
+++ b/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/core/aggregator/ErrorDispatcher.kt
@@ -18,10 +18,10 @@
  */
 package org.apache.isis.client.kroviz.core.aggregator
 
-import org.apache.isis.client.kroviz.core.event.EventStore
 import org.apache.isis.client.kroviz.core.event.LogEntry
 import org.apache.isis.client.kroviz.core.event.ResourceSpecification
 import org.apache.isis.client.kroviz.to.HttpError
+import org.apache.isis.client.kroviz.ui.core.UiManager
 import org.apache.isis.client.kroviz.ui.dialog.ErrorDialog
 
 class ErrorDispatcher : BaseAggregator() {
@@ -31,7 +31,7 @@ class ErrorDispatcher : BaseAggregator() {
         val url = logEntry.url
         val message = error.message
         val reSpec = ResourceSpecification(url)
-        EventStore.fault(reSpec, message)
+        UiManager.getEventStore().fault(reSpec, message)
         ErrorDialog(logEntry).open()
     }
 
diff --git a/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/core/event/EventStore.kt b/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/core/event/EventStore.kt
index 75f6bec..a0ae52b 100644
--- a/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/core/event/EventStore.kt
+++ b/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/core/event/EventStore.kt
@@ -37,7 +37,7 @@ import org.w3c.files.Blob
  * @see "https://en.wikipedia.org/wiki/Proxy_pattern"
  * @see "https://martinfowler.com/eaaDev/EventSourcing.html"
  */
-object EventStore {
+class EventStore {
     var log = observableListOf<LogEntry>()
     var logStartTime: Int = 0
 
diff --git a/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/core/event/ReplayCommand.kt b/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/core/event/ReplayCommand.kt
index d7b7ce6..4aa7604 100644
--- a/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/core/event/ReplayCommand.kt
+++ b/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/core/event/ReplayCommand.kt
@@ -27,14 +27,16 @@ import org.apache.isis.client.kroviz.main
 import org.apache.isis.client.kroviz.to.Link
 import org.apache.isis.client.kroviz.to.Represention
 import org.apache.isis.client.kroviz.to.TObject
+import org.apache.isis.client.kroviz.ui.core.UiManager
 
 val AppScope = CoroutineScope(window.asCoroutineDispatcher())
 
 class ReplayCommand {
 
     fun execute() {
-        val expectedEvents = copyEvents(EventStore.log)
-        EventStore.reset()
+        val es = UiManager.getEventStore()
+        val expectedEvents = copyEvents(es.log)
+        es.reset()
         main() // re-creates the UI, but keeps the UiManager(singleton/object) and the session
 
         val replayEvents = filterReplayEvents(expectedEvents)
diff --git a/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/core/event/ResourceProxy.kt b/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/core/event/ResourceProxy.kt
index 5254e05..aeb5f2d 100644
--- a/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/core/event/ResourceProxy.kt
+++ b/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/core/event/ResourceProxy.kt
@@ -26,6 +26,7 @@ import org.apache.isis.client.kroviz.handler.ResponseHandler
 import org.apache.isis.client.kroviz.to.Link
 import org.apache.isis.client.kroviz.to.TObject
 import org.apache.isis.client.kroviz.ui.core.Constants
+import org.apache.isis.client.kroviz.ui.core.UiManager
 import org.apache.isis.client.kroviz.ui.diagram.Node
 import org.apache.isis.client.kroviz.ui.diagram.Tree
 
@@ -45,11 +46,12 @@ class ResourceProxy {
     fun load(tObject: TObject) {
         val aggregator = ObjectAggregator(tObject.title)
         // ASSUMPTION: there can be max one LogEntry for an Object
-        val le = EventStore.findBy(tObject)
+        val es = UiManager.getEventStore()
+        val le = es.findBy(tObject)
         if (le != null) {
             le.addAggregator(aggregator)
             aggregator.update(le, le.subType)
-            EventStore.addUserAction(aggregator, tObject)
+            es.addUserAction(aggregator, tObject)
         }
     }
 
@@ -59,7 +61,7 @@ class ResourceProxy {
               isRest: Boolean = true,
               referrer: String = "") {
         val rs = ResourceSpecification(link.href, subType = subType, referrerUrl = referrer)
-        val isCached = when (val le = EventStore.findBy(rs)) {
+        val isCached = when (val le = UiManager.getEventStore().findBy(rs)) {
             null -> false
             else -> le.isCached(rs, link.method)
         }
@@ -83,7 +85,8 @@ class ResourceProxy {
     }
 
     private fun processCached(rs: ResourceSpecification, aggregator: BaseAggregator?) {
-        val le = EventStore.findBy(rs)!!
+        val es = UiManager.getEventStore()
+        val le = es.findBy(rs)!!
         le.retrieveResponse()
         if (aggregator == null) {
             ResponseHandler.handle(le)
@@ -91,7 +94,7 @@ class ResourceProxy {
             aggregator.update(le, le.subType)
         }
         le.setCached()
-        EventStore.updateStatus(le)
+        es.updateStatus(le)
     }
 
     fun invokeKroki(pumlCode: String, aggregator: SvgDispatcher) {
diff --git a/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/core/event/RoXmlHttpRequest.kt b/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/core/event/RoXmlHttpRequest.kt
index 00b933f..5f77a1e 100644
--- a/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/core/event/RoXmlHttpRequest.kt
+++ b/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/core/event/RoXmlHttpRequest.kt
@@ -65,14 +65,14 @@ class RoXmlHttpRequest(val aggregator: BaseAggregator?) {
             body.isEmpty() -> xhr.send()
             else -> xhr.send(body)
         }
-        EventStore.start(rs, method, body, aggregator)
+        UiManager.getEventStore().start(rs, method, body, aggregator)
     }
 
     private fun buildBody(link: Link): String {
         return when {
             link.hasArguments() -> StringUtils.argumentsAsBody(link)
             link.method == Method.PUT.operation -> {
-                val logEntry = EventStore.findBy(aggregator!!)
+                val logEntry = UiManager.getEventStore().findBy(aggregator!!)
                 when (val obj = logEntry?.obj) {
                     is TObject -> StringUtils.propertiesAsBody(obj)
                     else -> ""
@@ -94,7 +94,7 @@ class RoXmlHttpRequest(val aggregator: BaseAggregator?) {
         xhr.send(body)
         val rs = buildResourceSpecificationAndSetupHandler(url, subType, body)
 
-        EventStore.start(rs, method, body, aggregator)
+        UiManager.getEventStore().start(rs, method, body, aggregator)
     }
 
     internal fun invokeKroki(pumlCode: String) {
@@ -108,7 +108,7 @@ class RoXmlHttpRequest(val aggregator: BaseAggregator?) {
         val rs = buildResourceSpecificationAndSetupHandler(url, Constants.subTypeJson, pumlCode)
 
         xhr.send(pumlCode)
-        EventStore.start(rs, method, pumlCode, aggregator)
+        UiManager.getEventStore().start(rs, method, pumlCode, aggregator)
     }
 
     private fun buildResourceSpecificationAndSetupHandler(
@@ -124,7 +124,7 @@ class RoXmlHttpRequest(val aggregator: BaseAggregator?) {
 
     private fun handleResult(rs: ResourceSpecification, body: String) {
         val response: Any? = xhr.response
-        val le: LogEntry? = EventStore.end(rs, body, response)
+        val le: LogEntry? = UiManager.getEventStore().end(rs, body, response)
         if (le != null) {
             when {
                 aggregator == null -> ResponseHandler.handle(le)
@@ -137,7 +137,7 @@ class RoXmlHttpRequest(val aggregator: BaseAggregator?) {
 
     private fun handleError(rs: ResourceSpecification) {
         val responseText = xhr.responseText
-        EventStore.fault(rs, responseText)
+        UiManager.getEventStore().fault(rs, responseText)
     }
 
 }
diff --git a/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/core/model/ObjectDM.kt b/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/core/model/ObjectDM.kt
index ec80bfb..94f4e07 100644
--- a/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/core/model/ObjectDM.kt
+++ b/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/core/model/ObjectDM.kt
@@ -18,11 +18,10 @@
  */
 package org.apache.isis.client.kroviz.core.model
 
-import org.apache.isis.client.kroviz.core.event.EventStore
-import org.apache.isis.client.kroviz.core.event.EventStore.findBy
 import org.apache.isis.client.kroviz.core.event.ResourceProxy
 import org.apache.isis.client.kroviz.core.event.ResourceSpecification
 import org.apache.isis.client.kroviz.to.*
+import org.apache.isis.client.kroviz.ui.core.UiManager
 
 class ObjectDM(override val title: String) : DisplayModelWithLayout() {
     var data: Exposer? = null
@@ -30,7 +29,7 @@ class ObjectDM(override val title: String) : DisplayModelWithLayout() {
     private var dirty: Boolean = false
 
     override fun canBeDisplayed(): Boolean {
- //       debug()
+        //       debug()
         return when {
             isRendered -> false
             (layout == null) && (grid == null) -> false
@@ -38,7 +37,7 @@ class ObjectDM(override val title: String) : DisplayModelWithLayout() {
         }
     }
 
-    private fun debug()  {
+    private fun debug() {
         console.log("[]")
         console.log("[ODM.debug] data / collections / layout / grid / properties / icon / aggregator / logEntries")
         console.log(data)
@@ -51,10 +50,11 @@ class ObjectDM(override val title: String) : DisplayModelWithLayout() {
             val delegate = (data as Exposer).delegate
             val selfLink = delegate.getSelfLink()
             val rs = ResourceSpecification(selfLink.href)
-            val le = EventStore.findBy(rs)!!
+            val es = UiManager.getEventStore()
+            val le = es.findBy(rs)!!
             val aggt = le.getAggregator()
             console.log(aggt)
-            val logEntries = EventStore.findAllBy(aggt)
+            val logEntries = es.findAllBy(aggt)
             logEntries.forEach {
                 console.log(it)
             }
@@ -94,12 +94,13 @@ class ObjectDM(override val title: String) : DisplayModelWithLayout() {
             val getLink = tObject.links.first()
             val href = getLink.href
             val reSpec = ResourceSpecification(href)
+            val es = UiManager.getEventStore()
             //WATCHOUT this is sequence dependent: GET and PUT share the same URL - if called after PUTting, it may fail
-            val getLogEntry = findBy(reSpec)!!
+            val getLogEntry = es.findBy(reSpec)!!
             getLogEntry.setReload()
 
             val putLink = Link(method = Method.PUT.operation, href = href)
-            val logEntry = findBy(reSpec)
+            val logEntry = es.findBy(reSpec)
             val aggregator = logEntry?.getAggregator()!!
             // there may be more than one aggt - which may break this code
 
@@ -117,27 +118,28 @@ class ObjectDM(override val title: String) : DisplayModelWithLayout() {
 
     private fun createPropertyFrom(m: Member): Property {
         return Property(
-                id = m.id,
-                memberType = m.memberType,
-                links = m.links,
-                optional = m.optional,
-                title = m.id,
-                value = m.value,
-                extensions = m.extensions,
-                format = m.format,
-                disabledReason = m.disabledReason
+            id = m.id,
+            memberType = m.memberType,
+            links = m.links,
+            optional = m.optional,
+            title = m.id,
+            value = m.value,
+            extensions = m.extensions,
+            format = m.format,
+            disabledReason = m.disabledReason
         )
     }
 
     private fun createObjectFrom(resultObject: ResultObject): TObject {
         val r = resultObject.result!!
         return TObject(
-                links = r.links,
-                extensions = r.extensions!!,
-                title = r.title,
-                domainType = r.domainType,
-                instanceId = r.instanceId.toString(),
-                members = r.members)
+            links = r.links,
+            extensions = r.extensions!!,
+            title = r.title,
+            domainType = r.domainType,
+            instanceId = r.instanceId.toString(),
+            members = r.members
+        )
     }
 
 }
diff --git a/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/ui/core/MenuFactory.kt b/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/ui/core/MenuFactory.kt
index 22e9cdb..3658bcf 100644
--- a/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/ui/core/MenuFactory.kt
+++ b/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/ui/core/MenuFactory.kt
@@ -104,7 +104,7 @@ object MenuFactory {
     }
 
     private fun findMenuByTitle(menuTitle: String): Menu? {
-        val menuBars = EventStore.findMenuBars()!!.obj as Menubars
+        val menuBars = UiManager.getEventStore().findMenuBars()!!.obj as Menubars
         var menu = findMenu(menuBars.primary, menuTitle)
         if (menu == null) menu = findMenu(menuBars.secondary, menuTitle)
         if (menu == null) menu = findMenu(menuBars.tertiary, menuTitle)
diff --git a/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/ui/core/RoIconBar.kt b/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/ui/core/RoIconBar.kt
index ceece35..ddc7cff 100644
--- a/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/ui/core/RoIconBar.kt
+++ b/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/ui/core/RoIconBar.kt
@@ -101,7 +101,7 @@ class RoIconBar : SimplePanel() {
 
     private fun createObjectIcon(url: String): DropDown? {
         val reSpec = ResourceSpecification(url)
-        val logEntry = EventStore.findBy(reSpec)!!
+        val logEntry = UiManager.getEventStore().findBy(reSpec)!!
         return when (val obj = logEntry.obj) {
             (obj == null) -> null
             is TObject -> {
diff --git a/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/ui/core/RoMenuBar.kt b/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/ui/core/RoMenuBar.kt
index c5903da..13f1610 100644
--- a/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/ui/core/RoMenuBar.kt
+++ b/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/ui/core/RoMenuBar.kt
@@ -87,7 +87,7 @@ class RoMenuBar : SimplePanel() {
         )
 
         mainMenu.add(
-            buildMenuEntry("Event Log", "History", { UiManager.add("Event Log", EventLogTable(EventStore.log)) })
+            buildMenuEntry("Event Log", "History", { UiManager.add("Event Log", EventLogTable(UiManager.getEventStore().log)) })
         )
 
         val chartTitle = "Sample Chart"
diff --git a/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/ui/core/UiManager.kt b/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/ui/core/UiManager.kt
index 16fa92f..d6f9ac7 100644
--- a/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/ui/core/UiManager.kt
+++ b/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/ui/core/UiManager.kt
@@ -96,7 +96,7 @@ object UiManager {
 
     fun add(title: String, panel: SimplePanel, aggregator: BaseAggregator = UndefinedDispatcher()) {
         getRoView().addTab(title, panel)
-        EventStore.addView(title, aggregator, panel)
+        getEventStore().addView(title, aggregator, panel)
     }
 
     fun remove(panel: SimplePanel) {
@@ -126,13 +126,13 @@ object UiManager {
         tab.svg = svg
 
         val aggregator: BaseAggregator = UndefinedDispatcher()
-        EventStore.addView(title, aggregator, panel)
+        getEventStore().addView(title, aggregator, panel)
     }
 
     fun closeView(tab: SimplePanel) {
         val tt = tab.title
         if (tt != null) {
-            EventStore.closeView(tt)
+            getEventStore().closeView(tt)
         }
     }
 
@@ -189,6 +189,10 @@ object UiManager {
         }
     }
 
+    fun getEventStore() : EventStore {
+        return getSession().eventStore
+    }
+
     fun loadDomainTypes(): Boolean {
         val k = "loadDomainTypes"
         return when {
diff --git a/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/ui/diagram/LinkTreeDiagram.kt b/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/ui/diagram/LinkTreeDiagram.kt
index decb7c1..eae17e8 100644
--- a/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/ui/diagram/LinkTreeDiagram.kt
+++ b/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/ui/diagram/LinkTreeDiagram.kt
@@ -48,7 +48,7 @@ object LinkTreeDiagram {
     private fun toPumlCode(node: Node, level: Int): String {
         val url = node.name
         val rs = ResourceSpecification(url)
-        val le = EventStore.findBy(rs)
+        val le = UiManager.getEventStore().findBy(rs)
         val pc = PumlCode()
         if (le != null) {
             val title = StringUtils.shortTitle(url, protocolHostPort)
diff --git a/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/ui/dialog/DiagramDialog.kt b/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/ui/dialog/DiagramDialog.kt
index ed239bc..c04544b 100644
--- a/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/ui/dialog/DiagramDialog.kt
+++ b/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/ui/dialog/DiagramDialog.kt
@@ -67,7 +67,7 @@ class DiagramDialog(
     }
 
     private fun getDiagramCode(): String {
-        val logEntry = EventStore.findByDispatcher(callBack as UUID)
+        val logEntry = UiManager.getEventStore().findByDispatcher(callBack as UUID)
         return logEntry.getResponse()
     }
 
diff --git a/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/ui/dialog/EventExportDialog.kt b/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/ui/dialog/EventExportDialog.kt
index 445b9af..b41f475 100644
--- a/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/ui/dialog/EventExportDialog.kt
+++ b/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/ui/dialog/EventExportDialog.kt
@@ -27,6 +27,7 @@ import org.apache.isis.client.kroviz.ui.core.RoDialog
 import io.kvision.core.StringPair
 import io.kvision.form.select.SimpleSelect
 import org.apache.isis.client.kroviz.ui.core.FormItem
+import org.apache.isis.client.kroviz.ui.core.UiManager
 
 class EventExportDialog() : Command() {
 
@@ -36,7 +37,7 @@ class EventExportDialog() : Command() {
     val events = mutableListOf<ReplayEvent>()
 
     private fun collectReplayEvents() {
-        EventStore.log.forEach { it ->
+        UiManager.getEventStore().log.forEach { it ->
             val re = buildExportEvent(it)
             when (it.state) {
                 EventState.SUCCESS_JS -> events.add(re)
@@ -102,7 +103,7 @@ class EventExportDialog() : Command() {
     }
 
     private fun collectUnfinishedEvents() {
-        EventStore.log.forEach { it ->
+        UiManager.getEventStore().log.forEach { it ->
             val re = buildExportEvent(it)
             when (it.state) {
                 EventState.RUNNING -> events.add(re)
@@ -114,7 +115,7 @@ class EventExportDialog() : Command() {
     }
 
     private fun collectAllEvents() {
-        EventStore.log.forEach { it ->
+        UiManager.getEventStore().log.forEach { it ->
             val re = buildExportEvent(it)
             events.add(re)
         }
diff --git a/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/ui/dialog/EventLogDetail.kt b/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/ui/dialog/EventLogDetail.kt
index cf63a15..8b49cc3 100644
--- a/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/ui/dialog/EventLogDetail.kt
+++ b/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/ui/dialog/EventLogDetail.kt
@@ -26,6 +26,7 @@ import org.apache.isis.client.kroviz.to.bs3.Grid
 import org.apache.isis.client.kroviz.ui.core.Constants
 import org.apache.isis.client.kroviz.ui.core.FormItem
 import org.apache.isis.client.kroviz.ui.core.RoDialog
+import org.apache.isis.client.kroviz.ui.core.UiManager
 import org.apache.isis.client.kroviz.ui.diagram.JsonDiagram
 import org.apache.isis.client.kroviz.ui.diagram.LayoutDiagram
 import org.apache.isis.client.kroviz.ui.diagram.LinkTreeDiagram
@@ -41,7 +42,7 @@ class EventLogDetail(val logEntryFromTabulator: LogEntry) : Command() {
         // For a yet unknown reason, aggregators are not transmitted via tabulator.
         // As a WORKAROUND, we fetch the full blown LogEntry from the EventStore again.
         val rs = ResourceSpecification(logEntryFromTabulator.title)
-        logEntry = EventStore.findBy(rs) ?: logEntryFromTabulator  // in case of xml, we use the entry passed in
+        logEntry = UiManager.getEventStore().findBy(rs) ?: logEntryFromTabulator  // in case of xml, we use the entry passed in
     }
 
     // callback parameter
diff --git a/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/ui/panel/DynamicMenuBuilder.kt b/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/ui/panel/DynamicMenuBuilder.kt
index 7f01d61..6e9aba0 100644
--- a/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/ui/panel/DynamicMenuBuilder.kt
+++ b/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/ui/panel/DynamicMenuBuilder.kt
@@ -60,7 +60,7 @@ class DynamicMenuBuilder {
 
         val title = "Chart"
         val a4 = buildMenuEntry(title, title, {
-            UiManager.add(title, ChartFactory().build(EventStore.log))
+            UiManager.add(title, ChartFactory().build(UiManager.getEventStore().log))
         })
         menu.add(a4)
 
diff --git a/incubator/clients/kroviz/src/test/kotlin/org/apache/isis/client/kroviz/IntegrationTest.kt b/incubator/clients/kroviz/src/test/kotlin/org/apache/isis/client/kroviz/IntegrationTest.kt
index 8e15ff0..8214df4 100644
--- a/incubator/clients/kroviz/src/test/kotlin/org/apache/isis/client/kroviz/IntegrationTest.kt
+++ b/incubator/clients/kroviz/src/test/kotlin/org/apache/isis/client/kroviz/IntegrationTest.kt
@@ -67,12 +67,13 @@ open class IntegrationTest {
             else -> Constants.subTypeJson
         }
         val reSpec = ResourceSpecification(response.url, subType)
-        EventStore.start(
+        val es = EventStore()
+        es.start(
                 reSpec,
                 Method.GET.operation,
                 "",
                 aggregator)
-        val le = EventStore.end(reSpec, str)!!
+        val le = es.end(reSpec, str)!!
         ResponseHandler.handle(le)
         wait(100)
         return le
diff --git a/incubator/clients/kroviz/src/test/kotlin/org/apache/isis/client/kroviz/core/aggregator/CollectionAggregatorTest.kt b/incubator/clients/kroviz/src/test/kotlin/org/apache/isis/client/kroviz/core/aggregator/CollectionAggregatorTest.kt
index fd60757..557b0a6 100644
--- a/incubator/clients/kroviz/src/test/kotlin/org/apache/isis/client/kroviz/core/aggregator/CollectionAggregatorTest.kt
+++ b/incubator/clients/kroviz/src/test/kotlin/org/apache/isis/client/kroviz/core/aggregator/CollectionAggregatorTest.kt
@@ -19,12 +19,12 @@
 package org.apache.isis.client.kroviz.core.aggregator
 
 import org.apache.isis.client.kroviz.IntegrationTest
-import org.apache.isis.client.kroviz.core.event.EventStore
 import org.apache.isis.client.kroviz.core.event.ResourceSpecification
 import org.apache.isis.client.kroviz.core.model.CollectionDM
 import org.apache.isis.client.kroviz.snapshots.simpleapp1_16_0.*
 import org.apache.isis.client.kroviz.to.Property
 import org.apache.isis.client.kroviz.to.Relation
+import org.apache.isis.client.kroviz.ui.core.UiManager
 import kotlin.test.assertEquals
 import kotlin.test.assertNotNull
 import kotlin.test.assertTrue
@@ -37,14 +37,15 @@ class CollectionAggregatorTest : IntegrationTest() {
     fun testFixtureResult() {
         if (isAppAvailable()) {
             // given
-            EventStore.reset()
+            val es = UiManager.getEventStore()
+            es.reset()
             val obs = CollectionAggregator("test")
             // when
             mockResponse(FR_OBJECT, obs)
             mockResponse(FR_OBJECT_LAYOUT, obs)
             mockResponse(FR_OBJECT_PROPERTY, obs)
             val reSpec = ResourceSpecification(FR_OBJECT_PROPERTY.url)
-            val pLe = EventStore.findBy(reSpec)!!
+            val pLe = es.findBy(reSpec)!!
             val pdLe = mockResponse(FR_PROPERTY_DESCRIPTION, obs)
             val layoutLe = mockResponse(FR_OBJECT_LAYOUT, obs)
 
@@ -81,7 +82,7 @@ class CollectionAggregatorTest : IntegrationTest() {
     fun testService() {
         if (isAppAvailable()) {
             // given
-            EventStore.reset()
+            UiManager.getEventStore().reset()
             val obs = CollectionAggregator("test")
             // when
             mockResponse(SO_LIST_ALL, obs)
diff --git a/incubator/clients/kroviz/src/test/kotlin/org/apache/isis/client/kroviz/core/event/EventStoreTest.kt b/incubator/clients/kroviz/src/test/kotlin/org/apache/isis/client/kroviz/core/event/EventStoreTest.kt
index 8ab2beb..3513b45 100644
--- a/incubator/clients/kroviz/src/test/kotlin/org/apache/isis/client/kroviz/core/event/EventStoreTest.kt
+++ b/incubator/clients/kroviz/src/test/kotlin/org/apache/isis/client/kroviz/core/event/EventStoreTest.kt
@@ -39,21 +39,22 @@ class EventStoreTest : IntegrationTest() {
         val url2 = Constants.krokiUrl + "plantuml"
         val rs2 = ResourceSpecification(url2)
         val body2 = "zwoa"
+        val es = EventStore()
 
         // when
-        EventStore.reset()
-        EventStore.start(rs1, Method.POST.operation, body = body1)
-        EventStore.start(rs2, Method.POST.operation, body = body2)
+        es.reset()
+        es.start(rs1, Method.POST.operation, body = body1)
+        es.start(rs2, Method.POST.operation, body = body2)
 
         // then
-        assertEquals(2, EventStore.log.size) //1
+        assertEquals(2, es.log.size) //1
         console.log("[EST.testFindPlantuml]")
 
-        val le1 = EventStore.findBy(rs1, body1)
+        val le1 = es.findBy(rs1, body1)
         assertNotNull(le1)  //2
         console.log("le1: ${le1.toString()}")
 
-        val le2 = EventStore.findBy(rs2, body2)
+        val le2 = es.findBy(rs2, body2)
         assertNotNull(le2)  //3
         console.log("le2: ${le2.toString()}")
 
@@ -66,7 +67,8 @@ class EventStoreTest : IntegrationTest() {
     fun testLayout() {
         if (isAppAvailable()) {
             // given
-            EventStore.reset()
+            val es = EventStore()
+            es.reset()
             val obs = CollectionAggregator("test")
 
             //when
@@ -80,25 +82,26 @@ class EventStoreTest : IntegrationTest() {
             mockResponse(SO_LAYOUT_XML, obs)
 
             // then
-            val soListLe = EventStore.findBy(soList)!!
+            val soListLe = es.findBy(soList)!!
             assertEquals(Constants.subTypeJson, soListLe.subType) // 1
 
-            val leJson = EventStore.findBy(rsJson)!!
+            val leJson = es.findBy(rsJson)!!
             assertEquals(Constants.subTypeJson, leJson.subType) // 2
 
-            val leXml = EventStore.findBy(rsXml)!!
+            val leXml = es.findBy(rsXml)!!
             assertEquals(Constants.subTypeXml, leXml.subType) // 3
             assertTrue(XmlHelper.isXml(leXml.response)) // 4
 
-            assertTrue(EventStore.log.size > 3)
+            assertTrue(es.log.size > 3)
         }
     }
 
     @Test
     fun testSecondEntry() {
         // given
-        EventStore.reset()
-        val initialSize: Int = EventStore.log.size
+        val es = EventStore()
+        es.reset()
+        val initialSize: Int = es.log.size
         val myFirst = "1"
         val myLast = "n"
         val method = Method.GET.operation
@@ -111,24 +114,24 @@ class EventStoreTest : IntegrationTest() {
         val selfSpec = ResourceSpecification(selfUrl)
         val upSpec = ResourceSpecification(upUrl)
         // when
-        EventStore.start(selfSpec, method, body = myFirst)
-        EventStore.start(upSpec, method, body = myFirst)
-        EventStore.end(selfSpec, selfStr)
-        EventStore.end(upSpec, upStr)
-        EventStore.start(selfSpec, method, body = myLast)
-        EventStore.start(upSpec, method, body = myLast)
+        es.start(selfSpec, method, body = myFirst)
+        es.start(upSpec, method, body = myFirst)
+        es.end(selfSpec, selfStr)
+        es.end(upSpec, upStr)
+        es.start(selfSpec, method, body = myLast)
+        es.start(upSpec, method, body = myLast)
         // then
-        val currentSize: Int = EventStore.log.size
+        val currentSize: Int = es.log.size
         assertEquals(4 + initialSize, currentSize)  //1
 
         // Entries with the same key can be written, but when updated or retrieved the first (oldest) entry should be used
         //when
-        val le2 = EventStore.findBy(selfSpec)!!
+        val le2 = es.findBy(selfSpec)!!
         //then
         assertEquals(myFirst, le2.request)  //2
         assertEquals(selfStr.length, le2.response.length)  //3
         //when
-        val leU = EventStore.findBy(upSpec)!!
+        val leU = es.findBy(upSpec)!!
         //then
         assertEquals(myFirst, leU.request)  //4
         assertEquals(upStr.length, leU.response.length)  //5
@@ -143,31 +146,33 @@ class EventStoreTest : IntegrationTest() {
         val i1 = "Test (1)"
         val i2 = "Test (2)"
         val agg = ObjectAggregator("testFindView")
+        val es = EventStore()
 
         // construct list with urls
-        EventStore.add(h1Spec)
-        EventStore.addView(i1, agg, VPanel())
-        EventStore.add(h2Spec)
-        EventStore.addView(i2, agg, VPanel())
+        es.add(h1Spec)
+        es.addView(i1, agg, VPanel())
+        es.add(h2Spec)
+        es.addView(i2, agg, VPanel())
 
-        val le1 = EventStore.findBy(h1Spec)!!
+        val le1 = es.findBy(h1Spec)!!
         assertEquals(h1, le1.url)   //1
 
-        val le2 = EventStore.findBy(h2Spec)!!
+        val le2 = es.findBy(h2Spec)!!
         assertEquals(h2, le2.url)   //2
 
-        val le3 = EventStore.findView(i2)
+        val le3 = es.findView(i2)
         assertNotNull(le3)                  //3
-        val le4 = EventStore.findView(i1)
+        val le4 = es.findView(i1)
         assertNotNull(le4)                 //4
 
-        EventStore.closeView(i1)
+        es.closeView(i1)
         assertTrue(le4.isClosedView())
     }
 
     @Test
     fun testFind() {
-        EventStore.reset()
+        val es = EventStore()
+        es.reset()
         val ol1 = "http://localhost:8080/restful/objects/simple.SimpleObject/51/object-layout"
         val ol1Spec = ResourceSpecification(ol1)
         val ol2 = "http://localhost:8080/restful/objects/simple.SimpleObject/52/object-layout"
@@ -177,25 +182,25 @@ class EventStoreTest : IntegrationTest() {
         val olx = "http://localhost:8080/restful/objects/simple.SimpleObject/object-layout"
 
         // construct list with urls
-        EventStore.add(ol1Spec)
-        EventStore.add(ResourceSpecification(ol2))
-        EventStore.add(ResourceSpecification(ol3))
+        es.add(ol1Spec)
+        es.add(ResourceSpecification(ol2))
+        es.add(ResourceSpecification(ol3))
 
-        val le1 = EventStore.findBy(ol1Spec)
+        val le1 = es.findBy(ol1Spec)
         assertNotNull(le1)  //1
 
-        val le2 = EventStore.findExact(ol9Spec)
+        val le2 = es.findExact(ol9Spec)
         assertEquals(null, le2)     //2
 
-        val le3 = EventStore.findEquivalent(ol9Spec)
+        val le3 = es.findEquivalent(ol9Spec)
         assertNotNull(le3)  //3
         assertEquals(ol1, le3.url)  //4
 
-        val le4 = EventStore.findBy(ol9Spec)
+        val le4 = es.findBy(ol9Spec)
         assertEquals(le3, le4)      //5
 
         val olxSpec = ResourceSpecification(olx)
-        val le5 = EventStore.findEquivalent(olxSpec)
+        val le5 = es.findEquivalent(olxSpec)
         assertNull(le5)             //6
 
         val p1 = "http://localhost:8080/restful/objects/simple.SimpleObject/11/properties/name"
@@ -204,10 +209,10 @@ class EventStoreTest : IntegrationTest() {
         val p2Spec = ResourceSpecification(p2)
         val p3 = "http://localhost:8080/restful/objects/simple.SimpleObject/13/properties/name"
         val p3Spec = ResourceSpecification(p3)
-        EventStore.add(p1Spec)
-        EventStore.add(p2Spec)
-        EventStore.add(p3Spec)
-        val le6 = EventStore.findBy(p3Spec)
+        es.add(p1Spec)
+        es.add(p2Spec)
+        es.add(p3Spec)
+        val le6 = es.findBy(p3Spec)
         assertNotNull(le6)          //7
         assertEquals(le6.url, p1)   //8
 
@@ -215,29 +220,30 @@ class EventStoreTest : IntegrationTest() {
         val pNameSpec = ResourceSpecification(pName)
         val pNotes = "http://localhost:8080/restful/domain-types/simple.SimpleObject/properties/notes"
         val pNotesSpec = ResourceSpecification(pNotes)
-        EventStore.add(pNameSpec)
-        EventStore.add(pNotesSpec)
-        val le7 = EventStore.findBy(pNotesSpec)
+        es.add(pNameSpec)
+        es.add(pNotesSpec)
+        val le7 = es.findBy(pNotesSpec)
         assertNotNull(le7)            //9
         assertEquals(le7.url, pNotes) //10
     }
 
     @Test
     fun testFindEquivalent_ConfigurationLayout() {
-        EventStore.reset()
+        val es = EventStore()
+        es.reset()
         val ol1 = "http://localhost:8080/restful/objects/isisApplib.ConfigurationProperty/PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9InllcyI_Pgo8Y29uZmlndXJhdGlvblByb3BlcnR5PgogICAgPGtleT5pc2lzLnBlcnNpc3Rvci5kYXRhbnVjbGV1cy5pbXBsLmRhdGFudWNsZXVzLmNhY2hlLmxldmVsMi50eXBlPC9rZXk-CiAgICA8dmFsdWU-bm9uZTwvdmFsdWU-CjwvY29uZmlndXJhdGlvblByb3BlcnR5Pgo=/object-layout"
         val ol1Spec = ResourceSpecification(ol1)
         val ol2 = "http://localhost:8080/restful/objects/isisApplib.ConfigurationProperty/PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9InllcyI_Pgo8Y29uZmlndXJhdGlvblByb3BlcnR5PgogICAgPGtleT5pc2lzLnJlZmxlY3Rvci52YWxpZGF0b3Iuc2VydmljZUFjdGlvbnNPbmx5PC9rZXk-CiAgICA8dmFsdWU-dHJ1ZTwvdmFsdWU-CjwvY29uZmlndXJhdGlvblByb3BlcnR5Pgo=/object-layout"
         val ol2Spec = ResourceSpecification(ol2)
 
         // construct list with urls
-        EventStore.add(ol1Spec)
-        EventStore.add(ol2Spec)
+        es.add(ol1Spec)
+        es.add(ol2Spec)
 
-        val le1 = EventStore.findBy(ol1Spec)
+        val le1 = es.findBy(ol1Spec)
         assertNotNull(le1)  //1
 
-        val le2 = EventStore.findEquivalent(ol2Spec)
+        val le2 = es.findEquivalent(ol2Spec)
         assertNotNull(le2)  //2
         assertEquals(ol1, le2.url)  //3
     }
@@ -245,18 +251,19 @@ class EventStoreTest : IntegrationTest() {
     @Test
     fun testAnonymousEntry() {
         // given
-        EventStore.reset()
+        val es = EventStore()
+        es.reset()
         val method = Method.POST.operation
         val url = Constants.krokiUrl
         val rs = ResourceSpecification(url)
         // when
-        EventStore.start(rs, method, body = "first invocation")
-        EventStore.start(rs, method, body = "second invocation")
-        EventStore.end(rs, "first response")
+        es.start(rs, method, body = "first invocation")
+        es.start(rs, method, body = "second invocation")
+        es.end(rs, "first response")
         // then
-        val currentSize: Int = EventStore.log.size
+        val currentSize: Int = es.log.size
         assertEquals(2, currentSize)  //1
-        val le = EventStore.findBy(rs)!!
+        val le = es.findBy(rs)!!
         assertEquals("first response", le.response)
     }
 
@@ -269,19 +276,20 @@ class EventStoreTest : IntegrationTest() {
         val rs2 = ResourceSpecification(url2)
 
         //when
-        EventStore.reset()
-        EventStore.add(rs1)
-        EventStore.add(rs2)
-        val le1 = EventStore.findBy(rs1)
-        val le2 = EventStore.findBy(rs2)
+        val es = EventStore()
+        es.reset()
+        es.add(rs1)
+        es.add(rs2)
+        val le1 = es.findBy(rs1)
+        val le2 = es.findBy(rs2)
 
         //then
-        assertEquals(2, EventStore.log.size)
+        assertEquals(2, es.log.size)
         assertNotEquals(le1, le2)
 
         //when
-        val le1eq = EventStore.findEquivalent(rs1)
-        val le2eq = EventStore.findEquivalent(rs2)
+        val le1eq = es.findEquivalent(rs1)
+        val le2eq = es.findEquivalent(rs2)
 
         //then
         assertNotEquals(le1eq, le2eq)
diff --git a/incubator/clients/kroviz/src/test/kotlin/org/apache/isis/client/kroviz/to/ActionTest.kt b/incubator/clients/kroviz/src/test/kotlin/org/apache/isis/client/kroviz/to/ActionTest.kt
index 26dea78..11abd50 100644
--- a/incubator/clients/kroviz/src/test/kotlin/org/apache/isis/client/kroviz/to/ActionTest.kt
+++ b/incubator/clients/kroviz/src/test/kotlin/org/apache/isis/client/kroviz/to/ActionTest.kt
@@ -20,11 +20,11 @@ package org.apache.isis.client.kroviz.to
 
 import org.apache.isis.client.kroviz.IntegrationTest
 import org.apache.isis.client.kroviz.core.aggregator.ActionDispatcher
-import org.apache.isis.client.kroviz.core.event.EventStore
 import org.apache.isis.client.kroviz.core.event.ResourceProxy
 import org.apache.isis.client.kroviz.core.event.ResourceSpecification
 import org.apache.isis.client.kroviz.handler.ActionHandler
 import org.apache.isis.client.kroviz.snapshots.simpleapp1_16_0.*
+import org.apache.isis.client.kroviz.ui.core.UiManager
 import org.apache.isis.client.kroviz.utils.StringUtils
 import kotlin.test.Test
 import kotlin.test.assertEquals
@@ -64,8 +64,9 @@ class ActionTest : IntegrationTest() {
             console.log(json)
             ResourceProxy().fetch(link, ActionDispatcher())
             val urlSpec = ResourceSpecification(url)
-            val le = EventStore.findBy(urlSpec)!!
-            console.log(EventStore.log)
+            val es = UiManager.getEventStore()
+            val le = es.findBy(urlSpec)!!
+            console.log(es.log)
             console.log(le)
             assertTrue(!le.isError())
         }
diff --git a/incubator/clients/kroviz/src/test/kotlin/org/apache/isis/client/kroviz/to/ResultValueTest.kt b/incubator/clients/kroviz/src/test/kotlin/org/apache/isis/client/kroviz/to/ResultValueTest.kt
index e84cf73..29a93ff 100644
--- a/incubator/clients/kroviz/src/test/kotlin/org/apache/isis/client/kroviz/to/ResultValueTest.kt
+++ b/incubator/clients/kroviz/src/test/kotlin/org/apache/isis/client/kroviz/to/ResultValueTest.kt
@@ -25,6 +25,7 @@ import org.apache.isis.client.kroviz.core.event.EventStore
 import org.apache.isis.client.kroviz.handler.ResultValueHandler
 import org.apache.isis.client.kroviz.snapshots.simpleapp1_16_0.ACTIONS_DOWNLOAD_VALUE
 import org.apache.isis.client.kroviz.snapshots.simpleapp1_16_0.ACTIONS_OPEN_SWAGGER_UI
+import org.apache.isis.client.kroviz.ui.core.UiManager
 import kotlin.test.Test
 import kotlin.test.assertEquals
 
@@ -48,7 +49,7 @@ class ResultValueTest : IntegrationTest() {
             // given
             val aggregator = ObjectAggregator("object test")
             // when
-            EventStore.reset()
+            UiManager.getEventStore().reset()
             val logEntry = mockResponse(ACTIONS_DOWNLOAD_VALUE, aggregator)
             val ro = logEntry.getTransferObject() as ResultValue
             val type = ro.resulttype
diff --git a/incubator/clients/kroviz/src/test/kotlin/org/apache/isis/client/kroviz/ui/table/LinkTreeDiagramTest.kt b/incubator/clients/kroviz/src/test/kotlin/org/apache/isis/client/kroviz/ui/table/LinkTreeDiagramTest.kt
index 90bdf8e..f1bc3c7 100644
--- a/incubator/clients/kroviz/src/test/kotlin/org/apache/isis/client/kroviz/ui/table/LinkTreeDiagramTest.kt
+++ b/incubator/clients/kroviz/src/test/kotlin/org/apache/isis/client/kroviz/ui/table/LinkTreeDiagramTest.kt
@@ -34,19 +34,21 @@ class LinkTreeDiagramTest {
 
     //@Test         //TODO rework test to use AggregatorWithLayout
     fun testLinkTreeDiagram() {
+        // given
+        val es = EventStore()
         //when
         val aggregator = SystemAggregator()
-        load(RESTFUL, "", RestfulHandler(), aggregator)
+        load(RESTFUL, "", RestfulHandler(), aggregator, es)
         val referer = RESTFUL.url
-        load(RESTFUL_SERVICES, referer, ServiceHandler(), aggregator)
-        load(RESTFUL_USER, referer, UserHandler(), aggregator)
-        load(RESTFUL_MENUBARS, referer, MenuBarsHandler(), aggregator)
-        load(RESTFUL_VERSION, referer, VersionHandler(), aggregator)
-        load(RESTFUL_DOMAIN_TYPES, referer, DomainTypesHandler(), aggregator)
+        load(RESTFUL_SERVICES, referer, ServiceHandler(), aggregator, es)
+        load(RESTFUL_USER, referer, UserHandler(), aggregator, es)
+        load(RESTFUL_MENUBARS, referer, MenuBarsHandler(), aggregator, es)
+        load(RESTFUL_VERSION, referer, VersionHandler(), aggregator, es)
+        load(RESTFUL_DOMAIN_TYPES, referer, DomainTypesHandler(), aggregator, es)
         // then
-        assertTrue(EventStore.log.size >= 6)
+        assertTrue(es.log.size >= 6)
         val rootRs = ResourceSpecification(RESTFUL.url)
-        val rootLogEntry = EventStore.findBy(rootRs)
+        val rootLogEntry = es.findBy(rootRs)
         assertNotNull(rootLogEntry)  //1
 
         // when
@@ -60,10 +62,10 @@ class LinkTreeDiagramTest {
         assertTrue(code.contains("http://localhost:8080/restful/menuBars"))
     }
 
-    private fun load(response: Response, referer: String, handler: BaseHandler, aggregator: SystemAggregator) {
+    private fun load(response: Response, referer: String, handler: BaseHandler, aggregator: SystemAggregator, es: EventStore) {
         val rs = ResourceSpecification(response.url, referrerUrl = referer)
-        EventStore.start(rs, Method.GET.operation, aggregator = aggregator)
-        val le = EventStore.end(rs, response.str)!!
+        es.start(rs, Method.GET.operation, aggregator = aggregator)
+        val le = es.end(rs, response.str)!!
         val tObj = handler.parse(response.str)!!
         le.setTransferObject(tObj)
     }