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 784bdb5d079b6d5968fc57523bb6f4f60189872d Author: Jörg Rade <[email protected]> AuthorDate: Tue Oct 19 16:14:05 2021 +0200 ISIS-2348 Replay User Events (2/n): dead code removed, duplicate handling with xml layout fixed, event log table height corrected, doc improved --- .../modules/kroviz/pages/DevelopmentGuide.adoc | 16 +++--- .../kroviz/partials/design/uml-renderer.adoc | 20 ++++---- .../isis/client/kroviz/core/event/EventStore.kt | 14 ++--- .../isis/client/kroviz/core/event/ReplayCommand.kt | 60 +++++++++------------- .../isis/client/kroviz/core/event/ResourceProxy.kt | 3 +- .../isis/client/kroviz/handler/BaseHandler.kt | 3 -- .../apache/isis/client/kroviz/ui/core/Constants.kt | 2 +- .../isis/client/kroviz/ui/panel/EventLogTable.kt | 1 - 8 files changed, 49 insertions(+), 70 deletions(-) diff --git a/incubator/clients/kroviz/adoc/modules/kroviz/pages/DevelopmentGuide.adoc b/incubator/clients/kroviz/adoc/modules/kroviz/pages/DevelopmentGuide.adoc index 73ca46e..a197afa 100644 --- a/incubator/clients/kroviz/adoc/modules/kroviz/pages/DevelopmentGuide.adoc +++ b/incubator/clients/kroviz/adoc/modules/kroviz/pages/DevelopmentGuide.adoc @@ -263,18 +263,14 @@ include::partial$design/dev-mindmap.adoc[] * JSON structures can be visualized via kroki (cf. History -> Details) * Layout: for FLEX see https://css-tricks.com/snippets/css/a-guide-to-flexbox/ -[source,bash] ----- -npm install -g json-to-plantuml ----- +=== The Browser as Client Runtime Environment -=== Visualize JS dependencies +Google Chrome is used as browser. It has a very feature rich debugger (<CTRL>-<SHIFT>-I) which can even be connected to IntelliJ's debugger (Settings -> Preferences -> Extension -> Link handling). For a nice introduction to Chrome, see: https://www.google.com/googlebooks/chrome/. -[source,bash] ----- -npm -g install dependo -dependo -f amd ./build/js/kroviz.js > dependo.html ----- +All current browsers implement some security features in order to counteract Cross-Site-Resource-Forgery (XSRF). CORS (Cross-Origin-Resource-Sharing) is beeing devised to allow access to resources from a different host-port under certain circumstances. It is said to be bypassable via https://www.npmjs.com/package/node-iframe, cf. https://stackoverflow.com/questions/33143776/ajax-request-refused-to-set-unsafe-header/66782595#66782595 + +=== Visualize JS dependencies +E.g. via https://npmgraph.js.org/ === Measure Test Coverage diff --git a/incubator/clients/kroviz/adoc/modules/kroviz/partials/design/uml-renderer.adoc b/incubator/clients/kroviz/adoc/modules/kroviz/partials/design/uml-renderer.adoc index 822c7a8..d5374be 100644 --- a/incubator/clients/kroviz/adoc/modules/kroviz/partials/design/uml-renderer.adoc +++ b/incubator/clients/kroviz/adoc/modules/kroviz/partials/design/uml-renderer.adoc @@ -8,7 +8,7 @@ abstract class Renderer { iconName:String title:String - view:RoView + view:RvzView protocol:Protocol } Renderer -right-> Protocol @@ -18,19 +18,19 @@ abstract class Protocol { } Renderer <|-down- ObjectRdr -Renderer <|-down- ListRdr -ListRdr <|-down- GeoLocationRdr -ListRdr <|-down- EventRdr +Renderer <|-down- CollectionRdr +CollectionRdr <|-down- GeoLocationRdr +CollectionRdr <|-down- EventRdr -abstract class RoView { +abstract class RvzView { } -RoView <|-down- ObjectVw -RoView <|-down- ListVw -ListVw <|-down- GeoLocationVw -ListVw <|-down- TimeLineView +RvzView <|-down- ObjectV +RvzView <|-down- CollectionV +CollectionV <|-down- GeoLocationV +CollectionV <|-down- TimeLineV -Renderer -left-> RoView +Renderer -left-> RvzView class Exposer { delegate:TransferObject 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 686911c..e9b9f3e 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 @@ -121,18 +121,18 @@ object EventStore { /** * Answers the first matching entry. */ - fun findBy(reSpec: ResourceSpecification): LogEntry? { - return if (reSpec.isRedundant()) { - findEquivalent(reSpec) + fun findBy(rs: ResourceSpecification): LogEntry? { + return if (rs.isRedundant()) { + findEquivalent(rs) } else { - findExact(reSpec) + findExact(rs) } } - fun findBy(reSpec: ResourceSpecification, body: String): LogEntry? { + fun findBy(rs: ResourceSpecification, body: String): LogEntry? { return log.firstOrNull() { - it.url == reSpec.url - && it.subType == reSpec.subType + it.url == rs.url + && it.subType == rs.subType && it.request == body } } 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 9ae653e..4d09ac8 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 @@ -18,14 +18,10 @@ */ package org.apache.isis.client.kroviz.core.event -import io.kvision.utils.createInstance -import kotlinx.coroutines.GlobalScope -import kotlinx.coroutines.delay -import kotlinx.coroutines.launch import org.apache.isis.client.kroviz.core.aggregator.AggregatorWithLayout -import org.apache.isis.client.kroviz.core.aggregator.BaseAggregator import org.apache.isis.client.kroviz.main import org.apache.isis.client.kroviz.to.Link +import org.apache.isis.client.kroviz.to.Relation import org.apache.isis.client.kroviz.to.Represention class ReplayCommand { @@ -33,41 +29,42 @@ class ReplayCommand { fun execute() { val events = copyEvents(EventStore.log) EventStore.reset() - main() + main() // re-creates the UI, but keeps the UiManager(singleton/object) and the session - console.log("[ReplayCommand.execute]") - console.log(events) - console.log(events.size) + val userActions = filterUserActions(events) + replay(userActions) + } + + private fun replay(userActions: List<LogEntry>) { + console.log("[ReplayCommand.replay]") + userActions.forEach { + val link = Link(href = it.url) + console.log(link) + ResourceProxy().fetch(link, null, it.subType) + } + } + + private fun filterUserActions(events: List<LogEntry>): List<LogEntry> { + console.log("[ReplayCommand.filterUserActions]") val userActions = events.filter { (it.type == Represention.HOMEPAGE.type) || it.type == Represention.OBJECT_ACTION.type || - it.type == Represention.OBJECT.type || + it.type == Relation.OBJECT_LAYOUT.type || it.hasDisplayModel() } console.log(userActions) console.log(userActions.size) - - userActions.forEach { - val link = Link(href = it.url) - var aggregator: BaseAggregator? = null - if (it.nOfAggregators > 0) { - val clazz = it.getAggregator()::class - aggregator = clazz.createInstance<BaseAggregator>() - } - //eventually put a thinkTime here - wait(1000) - console.log(link) - console.log(aggregator) - ResourceProxy().fetch(link, aggregator, it.subType) - } - + return userActions } private fun copyEvents(inputList: List<LogEntry>): List<LogEntry> { + console.log("[ReplayCommand.copyEvents]") val outputList = mutableListOf<LogEntry>() inputList.forEach { outputList.add(copyEvent(it)) } + console.log(outputList) + console.log(outputList.size) return outputList } @@ -83,18 +80,9 @@ class ReplayCommand { return output } - fun wait(milliseconds: Long) { - GlobalScope.launch { - delay(milliseconds) - } - } - private fun LogEntry.hasDisplayModel(): Boolean { - if (this.nOfAggregators > 0) { - val aggregator = this.getAggregator() - return (aggregator is AggregatorWithLayout) - } - return false + return (this.nOfAggregators > 0) && + (this.getAggregator() is AggregatorWithLayout) } } \ No newline at end of file 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 ad596a0..c3ad519 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 @@ -57,7 +57,7 @@ class ResourceProxy { subType: String = Constants.subTypeJson, isRest: Boolean = true, referrer: String = "") { - val rs = ResourceSpecification(link.href, referrerUrl = referrer) + val rs = ResourceSpecification(link.href, subType = subType, referrerUrl = referrer) val isCached = when (val le = EventStore.findBy(rs)) { null -> false else -> le.isCached(rs, link.method) @@ -93,7 +93,6 @@ class ResourceProxy { EventStore.updateStatus(le) } - fun invokeKroki(pumlCode: String, aggregator: SvgDispatcher) { RoXmlHttpRequest(aggregator).invokeKroki(pumlCode) } diff --git a/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/handler/BaseHandler.kt b/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/handler/BaseHandler.kt index 77c6b51..578ff72 100644 --- a/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/handler/BaseHandler.kt +++ b/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/handler/BaseHandler.kt @@ -77,9 +77,6 @@ abstract class BaseHandler { open fun update() { logEntry.getAggregator().update(logEntry, Constants.subTypeJson) - logEntry.aggregators.forEach { -// console.log(it) - } } } diff --git a/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/ui/core/Constants.kt b/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/ui/core/Constants.kt index b708db5..b15121e 100644 --- a/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/ui/core/Constants.kt +++ b/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/ui/core/Constants.kt @@ -25,7 +25,7 @@ object Constants { const val svgMimeType = "image/svg+xml" const val pngMimeType = "image/png" const val xmlMimeType = "application/xml" - const val calcHeight = "calc(100vh - 88px)" + const val calcHeight = "calc(100vh - 113px)" const val actionSeparator = "\n" const val subTypeJson = "json" const val subTypeXml = "xml" diff --git a/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/ui/panel/EventLogTable.kt b/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/ui/panel/EventLogTable.kt index db3505b..7ad8cbf 100644 --- a/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/ui/panel/EventLogTable.kt +++ b/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/ui/panel/EventLogTable.kt @@ -77,7 +77,6 @@ class EventLogTable(val model: List<LogEntry>) : VPanel() { field = "response", headerFilter = Editor.INPUT, width = "200", -// tooltip = { (data) -> data.response } ), ColumnDefinition("resp.len", field = "responseLength", width = "100", hozAlign = Align.RIGHT, download = false), ColumnDefinition("cacheHits", field = "cacheHits", width = "100", hozAlign = Align.RIGHT, download = false),
