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 <[email protected]> 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) }
