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 bb5574fa934e1d973f3d999f2f1b2eb0880caa7c Author: Jörg Rade <joerg.r...@kuehne-nagel.com> AuthorDate: Thu Jun 2 14:58:31 2022 +0200 ISIS-3041 fixing unset errortype, code cosmetic, debugging info --- .../kroviz/core/aggregator/AggregatorWithLayout.kt | 21 ++++++++++++++++- .../kroviz/core/aggregator/ObjectAggregator.kt | 2 +- .../isis/client/kroviz/core/event/EventStore.kt | 19 +++++++++++----- .../isis/client/kroviz/core/event/LogEntry.kt | 26 ++++++++++++++++++---- .../isis/client/kroviz/core/event/ResourceProxy.kt | 25 ++++++++++++++++++++- .../apache/isis/client/kroviz/IntegrationTest.kt | 18 ++++++++++----- .../isis/client/kroviz/core/event/LogEntryTest.kt | 9 +++----- 7 files changed, 95 insertions(+), 25 deletions(-) diff --git a/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/core/aggregator/AggregatorWithLayout.kt b/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/core/aggregator/AggregatorWithLayout.kt index dad0d12824..81f504fbc8 100644 --- a/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/core/aggregator/AggregatorWithLayout.kt +++ b/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/core/aggregator/AggregatorWithLayout.kt @@ -1,3 +1,21 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ package org.apache.isis.client.kroviz.core.aggregator import org.apache.isis.client.kroviz.core.event.LogEntry @@ -19,12 +37,13 @@ abstract class AggregatorWithLayout : BaseAggregator() { } protected fun handleLayout(layout: Layout, dm: DisplayModelWithLayout, referrer: String) { + console.log("[AWL.handleLayout]") + console.log(layout) if (dm.layout == null) { dm.addLayout(layout) dm.properties.propertyLayoutList.forEach { p -> val l = p.link if (l == null) { - console.log("[AWL.handleLayout]") console.log(p.id + " link empty") // ISIS-2846 console.log(p) } else { diff --git a/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/core/aggregator/ObjectAggregator.kt b/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/core/aggregator/ObjectAggregator.kt index 0d1794c599..05c981c923 100644 --- a/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/core/aggregator/ObjectAggregator.kt +++ b/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/core/aggregator/ObjectAggregator.kt @@ -122,7 +122,7 @@ class ObjectAggregator(val actionTitle: String) : AggregatorWithLayout() { private fun handleProperty(property: Property) { console.log("[OA.handleProperty]") console.log(property) - throw Throwable("[ObjectAggregator.handleProperty] not implemented yet") +// throw Throwable("[ObjectAggregator.handleProperty] not implemented yet") } private fun handleGrid(grid: Grid) { 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 16d7a7c456..5758573d3e 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 @@ -58,7 +58,7 @@ class EventStore { rs: ResourceSpecification, method: String, body: String = "", - aggregator: BaseAggregator? = null + aggregator: BaseAggregator? = null, ): LogEntry { val entry = LogEntry(rs = rs, method = method, request = body) if (aggregator != null) { @@ -149,11 +149,11 @@ class EventStore { } internal fun updateStatus(entry: LogEntry) { - val successNo = log.count { le -> le.isSuccess() } - val runningNo = countRunning() - val errorNo = log.count { le -> le.isError() } - val viewNo = log.count { le -> le.isView() } - val status = StatusPo(successNo, runningNo, errorNo, viewNo) + val successCnt = log.count { le -> le.isSuccess() } + val runningCnt = countRunning() + val errorCnt = log.count { le -> le.isError() } + val viewCnt = log.count { le -> le.isView() } + val status = StatusPo(successCnt, runningCnt, errorCnt, viewCnt, 0) ViewManager.updateStatus(status) } @@ -218,6 +218,13 @@ class EventStore { } } + fun findAll(reSpec: ResourceSpecification): List<LogEntry> { + return log.filter { + it.matches(reSpec) + } + } + + //public for test fun findExact(reSpec: ResourceSpecification): LogEntry? { return log.firstOrNull { diff --git a/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/core/event/LogEntry.kt b/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/core/event/LogEntry.kt index eaaf436b54..ef2024b1ef 100644 --- a/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/core/event/LogEntry.kt +++ b/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/core/event/LogEntry.kt @@ -125,6 +125,7 @@ data class LogEntry( calculate() fault = error state = EventState.ERROR + type = Represention.ERROR.type } fun setUndefined(error: String) { @@ -143,7 +144,8 @@ data class LogEntry( responseLength = response.length if (responseLength == 0) { // it's a blob - responseLength = blob?.size as Int + val size = blob?.size ?: 0 + responseLength = size.toInt() } state = when { url.startsWith(Constants.krokiUrl) -> EventState.SUCCESS_IMG @@ -178,6 +180,7 @@ data class LogEntry( } fun setTransferObject(to: TransferObject) { + console.log("[LE.setTransferObject]") this.obj = to when (to) { is WithLinks -> { @@ -195,8 +198,20 @@ data class LogEntry( is Menubars -> { this.type = Represention.LAYOUT_MENUBARS.type } + is HttpError -> { + this.type = Represention.ERROR.type + } + is TObject -> { + when { + to == null -> { + this.state = EventState.MISSING + this.type = Represention.ERROR.type + console.log("to == null for response:") + console.log(response) + } + } + } else -> { - console.log("[LE.setTransferObject]") console.log(to) } } @@ -232,12 +247,16 @@ data class LogEntry( fun retrieveResponse(): String { lastAccessedAt = Date() - cacheHits++ + incrementCacheHits() return response } //end region response + fun incrementCacheHits() { + cacheHits++ + } + fun isSuccess(): Boolean { return state.name.startsWith("SUCCESS") } @@ -276,7 +295,6 @@ data class LogEntry( fun addAggregator(aggregator: BaseAggregator) { if (aggregator is ActionDispatcher) { -// console.log("[LE.addAggregator] is ActionDispatcher") ViewManager.setBusyCursor() } aggregators.add(aggregator) 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 ec5d9d7f2b..f686fc130d 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 @@ -61,7 +61,8 @@ class ResourceProxy { isRest: Boolean = true, referrer: String = "") { val rs = ResourceSpecification(link.href, subType = subType, referrerUrl = referrer) - val isCached = when (val le = SessionManager.getEventStore().findBy(rs)) { + val le = findAndSetupLogEntry(rs) + val isCached = when (le) { null -> false else -> le.isCached(rs, link.method) } @@ -72,6 +73,28 @@ class ResourceProxy { } } + // in case of a race condition (many similar requests started within millis), + // it could happen, that similar entries are written to the log in parallel, + // although they should have been taken from the cache. + private fun findAndSetupLogEntry(rs: ResourceSpecification): LogEntry? { + val leList = SessionManager.getEventStore().findAll(rs) + val first = leList.firstOrNull() + if (first?.state == EventState.DUPLICATE) { + when (rs.subType) { + Constants.subTypeJson -> first.state = EventState.SUCCESS_JS + Constants.subTypeXml -> first.state = EventState.SUCCESS_XML + else -> first.state = EventState.SUCCESS_IMG + } + } + leList.forEachIndexed { index, logEntry -> + if (index > 0 && logEntry.state != EventState.DUPLICATE) { + logEntry.state = EventState.DUPLICATE + first?.incrementCacheHits() + } + } + return first + } + private fun process(aggregator: BaseAggregator?, link: Link, subType: String, referrer: String) { if (aggregator is AggregatorWithLayout) { if (aggregator.tree == null) { 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 426b85c04b..da1129056e 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 @@ -30,6 +30,7 @@ import org.apache.isis.client.kroviz.snapshots.Response import org.apache.isis.client.kroviz.to.Method import org.apache.isis.client.kroviz.ui.core.Constants import org.apache.isis.client.kroviz.ui.core.SessionManager +import org.apache.isis.client.kroviz.ui.core.ViewManager import org.apache.isis.client.kroviz.utils.XmlHelper import org.w3c.xhr.XMLHttpRequest @@ -38,6 +39,12 @@ import org.w3c.xhr.XMLHttpRequest open class IntegrationTest { fun isAppAvailable(): Boolean { + val app = App() + app.start() + ViewManager.app = app +console.log("[IT.isAppAvailable]") + console.log(ViewManager.getRoApp()) + val user = "sven" val pw = "pass" val url = "http://${user}:${pw}@localhost:8080/restful/" @@ -56,8 +63,7 @@ open class IntegrationTest { } finally { } - val answer = xhr.status.equals(200) - return answer + return xhr.status.equals(200) } fun mockResponse(response: Response, aggregator: BaseAggregator?): LogEntry { @@ -69,10 +75,10 @@ open class IntegrationTest { val reSpec = ResourceSpecification(response.url, subType) val es = EventStore() es.start( - reSpec, - Method.GET.operation, - "", - aggregator) + reSpec, + Method.GET.operation, + "", + aggregator) val le = es.end(reSpec, str)!! ResponseHandler.handle(le) wait(100) diff --git a/incubator/clients/kroviz/src/test/kotlin/org/apache/isis/client/kroviz/core/event/LogEntryTest.kt b/incubator/clients/kroviz/src/test/kotlin/org/apache/isis/client/kroviz/core/event/LogEntryTest.kt index dea66af06d..38b4c5a492 100644 --- a/incubator/clients/kroviz/src/test/kotlin/org/apache/isis/client/kroviz/core/event/LogEntryTest.kt +++ b/incubator/clients/kroviz/src/test/kotlin/org/apache/isis/client/kroviz/core/event/LogEntryTest.kt @@ -28,10 +28,8 @@ class LogEntryTest { fun testTitle() { // given val url = "https://kroki.io" - // when val le = LogEntry(ResourceSpecification(url)) - // then assertFalse(le.title.startsWith("/")) } @@ -39,16 +37,15 @@ class LogEntryTest { @Test fun testCalculate() { // given - val le = LogEntry(ResourceSpecification("http://test/url")) - + val rs = ResourceSpecification("http://test/url") + val le = LogEntry(rs) // when le.setSuccess() - // then assertTrue(0 <= le.duration) if (le.duration < 0 && le.cacheHits == 0) { - //TODO add assert +// assertEquals(EventState.SUCCESS_JS, le.state) } }