From 0f759b448e3e44c035eb0db37a30e5d350d3ecef Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=B6rg=20Rade?= Date: Thu, 12 Mar 2020 17:41:51 +0100 Subject: [PATCH] #42 Combine XML (Grid) and JSON based Layout in DisplayList/Object 2/n --- .../ro/core/aggregator/ActionDispatcher.kt | 5 +- .../org/ro/core/aggregator/BaseAggregator.kt | 6 +- .../ro/core/aggregator/DiagramDispatcher.kt | 3 +- .../core/aggregator/DomainTypesAggregator.kt | 2 +- .../ro/core/aggregator/DownloadDispatcher.kt | 2 +- .../org/ro/core/aggregator/ErrorDispatcher.kt | 3 +- .../org/ro/core/aggregator/ListAggregator.kt | 14 +- .../core/aggregator/NavigationDispatcher.kt | 2 +- .../ro/core/aggregator/ObjectAggregator.kt | 17 +- .../ro/core/aggregator/RestfulDispatcher.kt | 2 +- .../ro/core/aggregator/SystemAggregator.kt | 2 +- .../ro/core/aggregator/UndefinedDispatcher.kt | 2 +- .../kotlin/org/ro/core/event/EventStore.kt | 14 +- src/main/kotlin/org/ro/core/event/LogEntry.kt | 2 +- .../ro/core/event/ResourceSpecification.kt | 2 +- .../org/ro/core/event/RoXmlHttpRequest.kt | 12 +- .../kotlin/org/ro/core/model/DisplayList.kt | 38 ++- .../kotlin/org/ro/core/model/DisplayObject.kt | 4 + .../kotlin/org/ro/handler/LayoutHandler.kt | 4 +- .../kotlin/org/ro/handler/LayoutXmlHandler.kt | 1 - src/main/kotlin/org/ro/layout/ColsLt.kt | 13 +- src/main/kotlin/org/ro/layout/Layout.kt | 41 +-- .../kotlin/org/ro/ui/builder/LayoutBuilder.kt | 3 +- src/test/kotlin/org/ro/IntegrationTest.kt | 11 +- .../ro/core/aggregator/ListAggregatorTest.kt | 2 + .../org/ro/core/event/EventStoreTest.kt | 19 +- .../org/ro/core/model/DisplayListTest.kt | 28 +- src/test/kotlin/org/ro/layout/LayoutTest.kt | 5 +- .../simpleapp1_16_0/CFG_LAYOUT_JSON.kt | 299 ++++++++++++++++++ .../{CFG_LAYOUT.kt => CFG_LAYOUT_XML.kt} | 2 +- src/test/kotlin/org/ro/to/ActionTest.kt | 46 ++- src/test/kotlin/org/ro/to/LinkTest.kt | 40 +-- 32 files changed, 478 insertions(+), 168 deletions(-) create mode 100644 src/test/kotlin/org/ro/snapshots/simpleapp1_16_0/CFG_LAYOUT_JSON.kt rename src/test/kotlin/org/ro/snapshots/simpleapp1_16_0/{CFG_LAYOUT.kt => CFG_LAYOUT_XML.kt} (99%) diff --git a/src/main/kotlin/org/ro/core/aggregator/ActionDispatcher.kt b/src/main/kotlin/org/ro/core/aggregator/ActionDispatcher.kt index e1278f4..ea5aff3 100644 --- a/src/main/kotlin/org/ro/core/aggregator/ActionDispatcher.kt +++ b/src/main/kotlin/org/ro/core/aggregator/ActionDispatcher.kt @@ -7,11 +7,10 @@ import org.ro.to.Method import org.ro.ui.Point import org.ro.ui.kv.ActionPrompt import org.ro.utils.Utils -import org.w3c.dom.MimeType class ActionDispatcher(private val at: Point = Point(100, 100)) : BaseAggregator() { - override fun update(logEntry: LogEntry, mimeType: String) { + override fun update(logEntry: LogEntry, subType: String) { val action = logEntry.getTransferObject() as Action action.links.forEach { link -> // it.rel should be neither: (self | up | describedBy ) @@ -36,7 +35,7 @@ class ActionDispatcher(private val at: Point = Point(100, 100)) : BaseAggregator if (link.hasArguments()) { ActionPrompt(action).open(at) } else { - invoke(link) + link.invokeWith(this) } } diff --git a/src/main/kotlin/org/ro/core/aggregator/BaseAggregator.kt b/src/main/kotlin/org/ro/core/aggregator/BaseAggregator.kt index 370e485..bf3d1b9 100644 --- a/src/main/kotlin/org/ro/core/aggregator/BaseAggregator.kt +++ b/src/main/kotlin/org/ro/core/aggregator/BaseAggregator.kt @@ -23,7 +23,7 @@ abstract class BaseAggregator { open lateinit var dsp: BaseDisplayable - open fun update(logEntry: LogEntry, mimeType: String) {} + open fun update(logEntry: LogEntry, subType: String) {} open fun reset(): BaseAggregator { /* do nothing and */ return this @@ -60,8 +60,8 @@ abstract class BaseAggregator { // save a line break in when formatting } - fun Link.invokeWith(aggregator: BaseAggregator, mimeType: String = "json") { - RoXmlHttpRequest().invoke(this, aggregator, mimeType) + fun Link.invokeWith(aggregator: BaseAggregator, subType: String = "json") { + RoXmlHttpRequest().invoke(this, aggregator, subType) } } diff --git a/src/main/kotlin/org/ro/core/aggregator/DiagramDispatcher.kt b/src/main/kotlin/org/ro/core/aggregator/DiagramDispatcher.kt index 6a97879..285bd91 100644 --- a/src/main/kotlin/org/ro/core/aggregator/DiagramDispatcher.kt +++ b/src/main/kotlin/org/ro/core/aggregator/DiagramDispatcher.kt @@ -2,11 +2,10 @@ package org.ro.core.aggregator import org.ro.core.event.LogEntry import org.ro.utils.DomHelper -import org.w3c.dom.MimeType class DiagramDispatcher(private val uuid: String) : BaseAggregator() { - override fun update(logEntry: LogEntry, mimeType: String) { + override fun update(logEntry: LogEntry, subType: String) { val response = logEntry.response DomHelper.appendTo(response, uuid) } diff --git a/src/main/kotlin/org/ro/core/aggregator/DomainTypesAggregator.kt b/src/main/kotlin/org/ro/core/aggregator/DomainTypesAggregator.kt index f49196a..b411ee4 100644 --- a/src/main/kotlin/org/ro/core/aggregator/DomainTypesAggregator.kt +++ b/src/main/kotlin/org/ro/core/aggregator/DomainTypesAggregator.kt @@ -14,7 +14,7 @@ class DomainTypesAggregator(val url: String) : BaseAggregator() { dsp = DiagramDisplay(url) } - override fun update(logEntry: LogEntry, mimeType: String) { + override fun update(logEntry: LogEntry, subType: String) { when (val obj = logEntry.getTransferObject()) { is DomainTypes -> handleDomainTypes(obj) is DomainType -> handleDomainType(obj) diff --git a/src/main/kotlin/org/ro/core/aggregator/DownloadDispatcher.kt b/src/main/kotlin/org/ro/core/aggregator/DownloadDispatcher.kt index 9a5eb00..4c55dbf 100644 --- a/src/main/kotlin/org/ro/core/aggregator/DownloadDispatcher.kt +++ b/src/main/kotlin/org/ro/core/aggregator/DownloadDispatcher.kt @@ -5,7 +5,7 @@ import org.ro.ui.FileAlert class DownloadDispatcher(val actionTitle: String) : BaseAggregator() { - override fun update(logEntry: LogEntry, mimeType: String) { + override fun update(logEntry: LogEntry, subType: String) { FileAlert(logEntry).open() } diff --git a/src/main/kotlin/org/ro/core/aggregator/ErrorDispatcher.kt b/src/main/kotlin/org/ro/core/aggregator/ErrorDispatcher.kt index dcc2aef..796d5cd 100644 --- a/src/main/kotlin/org/ro/core/aggregator/ErrorDispatcher.kt +++ b/src/main/kotlin/org/ro/core/aggregator/ErrorDispatcher.kt @@ -5,11 +5,10 @@ import org.ro.core.event.LogEntry import org.ro.core.event.ResourceSpecification import org.ro.to.HttpError import org.ro.ui.ErrorAlert -import org.w3c.dom.MimeType class ErrorDispatcher : BaseAggregator() { - override fun update(logEntry: LogEntry, mimeType: String) { + override fun update(logEntry: LogEntry, subType: String) { val error = logEntry.getTransferObject() as HttpError val url = logEntry.url val message = error.message diff --git a/src/main/kotlin/org/ro/core/aggregator/ListAggregator.kt b/src/main/kotlin/org/ro/core/aggregator/ListAggregator.kt index c1d461b..5ffbc03 100644 --- a/src/main/kotlin/org/ro/core/aggregator/ListAggregator.kt +++ b/src/main/kotlin/org/ro/core/aggregator/ListAggregator.kt @@ -3,6 +3,7 @@ package org.ro.core.aggregator import org.ro.core.event.LogEntry import org.ro.core.model.DisplayList import org.ro.layout.Layout +import org.ro.layout.PropertyLt import org.ro.to.Property import org.ro.to.ResultList import org.ro.to.TObject @@ -22,7 +23,7 @@ class ListAggregator(actionTitle: String) : BaseAggregator() { dsp = DisplayList(actionTitle) } - override fun update(logEntry: LogEntry, mimeType: String) { + override fun update(logEntry: LogEntry, subType: String) { when (val obj = logEntry.getTransferObject()) { null -> log(logEntry) @@ -59,9 +60,10 @@ class ListAggregator(actionTitle: String) : BaseAggregator() { } private fun handleLayout(layout: Layout) { - dsp.layout = layout - layout.propertyList.forEach { p -> - val l = p.link!! + val dspl = dsp as DisplayList + dspl.addLayout(layout) + dspl.propertyList.forEach { p -> + val l = p.links.firstOrNull{it.rel == "describedby"}!! if (!l.href.contains("datanucleus")) { l.invokeWith(this) } @@ -69,9 +71,7 @@ class ListAggregator(actionTitle: String) : BaseAggregator() { } private fun handleGrid(grid: Grid) { - // console.log("[LA.handleGrid]") - // console.log(grid) - // dsp.layout!!.initGrid(grid) + (dsp as DisplayList).grid = grid } private fun handleProperty(p: Property) { diff --git a/src/main/kotlin/org/ro/core/aggregator/NavigationDispatcher.kt b/src/main/kotlin/org/ro/core/aggregator/NavigationDispatcher.kt index f4b6188..dc1f0ac 100644 --- a/src/main/kotlin/org/ro/core/aggregator/NavigationDispatcher.kt +++ b/src/main/kotlin/org/ro/core/aggregator/NavigationDispatcher.kt @@ -6,7 +6,7 @@ import org.ro.ui.kv.UiManager class NavigationDispatcher() : BaseAggregator() { - override fun update(logEntry: LogEntry, mimeType: String) { + override fun update(logEntry: LogEntry, subType: String) { val obj = logEntry.getTransferObject() val result = obj as Menubars UiManager.amendMenu(result) diff --git a/src/main/kotlin/org/ro/core/aggregator/ObjectAggregator.kt b/src/main/kotlin/org/ro/core/aggregator/ObjectAggregator.kt index 1850ece..a29fe48 100644 --- a/src/main/kotlin/org/ro/core/aggregator/ObjectAggregator.kt +++ b/src/main/kotlin/org/ro/core/aggregator/ObjectAggregator.kt @@ -5,6 +5,7 @@ import org.ro.core.model.DisplayObject import org.ro.layout.Layout import org.ro.to.HttpError import org.ro.to.Property +import org.ro.to.ResultObject import org.ro.to.TObject import org.ro.ui.ErrorAlert import org.ro.ui.kv.UiManager @@ -15,10 +16,11 @@ class ObjectAggregator(val actionTitle: String) : BaseAggregator() { dsp = DisplayObject(actionTitle) } - override fun update(logEntry: LogEntry, mimeType: String) { + override fun update(logEntry: LogEntry, subType: String) { when (val obj = logEntry.getTransferObject()) { is TObject -> handleObject(obj) + is ResultObject -> handleResultObject(obj) is Property -> handleProperty(obj) is Layout -> handleLayout(obj) is HttpError -> ErrorAlert(logEntry).open() @@ -35,6 +37,12 @@ class ObjectAggregator(val actionTitle: String) : BaseAggregator() { obj.getLayoutLink()?.invokeWith(this) } + fun handleResultObject(obj: ResultObject) { + console.log("[OA.handleResultObject]") + console.log(obj) + // dsp.addData(obj) + } + override fun getObject(): TObject? { return dsp.getObject() } @@ -45,13 +53,14 @@ class ObjectAggregator(val actionTitle: String) : BaseAggregator() { } private fun handleLayout(layout: Layout) { - dsp.layout = layout - layout.propertyDescriptionList.forEach { + (dsp as DisplayObject).addLayout(layout) + //FIXME do analogous to DisplayList + /* layout.propertyDescriptionList.forEach { it.links.forEach { l -> //TODO correct link? l.invokeWith(this) } - } + } */ } override fun reset(): ObjectAggregator { diff --git a/src/main/kotlin/org/ro/core/aggregator/RestfulDispatcher.kt b/src/main/kotlin/org/ro/core/aggregator/RestfulDispatcher.kt index 28e487e..0dc64ed 100644 --- a/src/main/kotlin/org/ro/core/aggregator/RestfulDispatcher.kt +++ b/src/main/kotlin/org/ro/core/aggregator/RestfulDispatcher.kt @@ -7,7 +7,7 @@ import org.ro.to.Restful class RestfulDispatcher() : BaseAggregator() { - override fun update(logEntry: LogEntry, mimeType: String) { + override fun update(logEntry: LogEntry, subType: String) { val restful = logEntry.getTransferObject() as Restful restful.links.forEach { when { diff --git a/src/main/kotlin/org/ro/core/aggregator/SystemAggregator.kt b/src/main/kotlin/org/ro/core/aggregator/SystemAggregator.kt index edfe27b..fa57109 100644 --- a/src/main/kotlin/org/ro/core/aggregator/SystemAggregator.kt +++ b/src/main/kotlin/org/ro/core/aggregator/SystemAggregator.kt @@ -12,7 +12,7 @@ class SystemAggregator() : BaseAggregator() { dsp = DisplaySystem("not filled (yet)") } - override fun update(logEntry: LogEntry, mimeType: String) { + override fun update(logEntry: LogEntry, subType: String) { when (val obj = logEntry.getTransferObject()) { is User -> dsp.addData(obj) diff --git a/src/main/kotlin/org/ro/core/aggregator/UndefinedDispatcher.kt b/src/main/kotlin/org/ro/core/aggregator/UndefinedDispatcher.kt index 02fcb6a..490c737 100644 --- a/src/main/kotlin/org/ro/core/aggregator/UndefinedDispatcher.kt +++ b/src/main/kotlin/org/ro/core/aggregator/UndefinedDispatcher.kt @@ -5,7 +5,7 @@ import org.ro.view.UndefinedAlert class UndefinedDispatcher : BaseAggregator() { - override fun update(logEntry: LogEntry, mimeType: String) { + override fun update(logEntry: LogEntry, subType: String) { UndefinedAlert(logEntry).open() } diff --git a/src/main/kotlin/org/ro/core/event/EventStore.kt b/src/main/kotlin/org/ro/core/event/EventStore.kt index 31a03ad..4a3631c 100644 --- a/src/main/kotlin/org/ro/core/event/EventStore.kt +++ b/src/main/kotlin/org/ro/core/event/EventStore.kt @@ -2,7 +2,6 @@ package org.ro.core.event import org.ro.utils.Utils import org.ro.core.aggregator.BaseAggregator -import org.ro.core.event.ResourceSpecification import org.ro.to.TObject import org.ro.ui.kv.UiManager import pl.treksoft.kvision.panel.SimplePanel @@ -29,9 +28,9 @@ object EventStore { fun start(reSpec: ResourceSpecification, method: String, - body: String = "", + body:String = "", aggregator: BaseAggregator? = null): LogEntry { - val entry = LogEntry(reSpec.url, method, body, reSpec.mimeType) + val entry = LogEntry(reSpec.url, method, request = body, subType= reSpec.subType) if (aggregator != null) { entry.addAggregator(aggregator) } @@ -114,7 +113,7 @@ object EventStore { } internal fun findExact(reSpec: ResourceSpecification): LogEntry? { - return log.firstOrNull { it.url == reSpec.url && it.mimeType == reSpec.mimeType} + return log.firstOrNull { it.url == reSpec.url && it.subType == reSpec.subType} } internal fun findView(title: String): LogEntry? { @@ -122,8 +121,9 @@ object EventStore { } internal fun findEquivalent(reSpec: ResourceSpecification): LogEntry? { - val url = reSpec.url - return log.firstOrNull { areEquivalent(it.url, url) } + return log.firstOrNull { + it.subType == reSpec.subType + && areEquivalent(it.url, reSpec.url) } } private fun areEquivalent(searchUrl: String, compareUrl: String, allowedDiff: Int = 1): Boolean { @@ -155,7 +155,7 @@ object EventStore { val le = this.find(reSpec) if (le != null) { when { - le.hasResponse() && le.method == method && le.mimeType == reSpec.mimeType -> answer = true + le.hasResponse() && le.method == method && le.subType == reSpec.subType -> answer = true le.isView() -> answer = true } } diff --git a/src/main/kotlin/org/ro/core/event/LogEntry.kt b/src/main/kotlin/org/ro/core/event/LogEntry.kt index fd1ab39..6652197 100644 --- a/src/main/kotlin/org/ro/core/event/LogEntry.kt +++ b/src/main/kotlin/org/ro/core/event/LogEntry.kt @@ -29,7 +29,7 @@ data class LogEntry( val url: String, val method: String? = "", val request: String = "", - val mimeType: String = "json", + val subType: String = "json", @ContextualSerialization val createdAt: Date = Date()) { var state = EventState.INITIAL var title: String = "" diff --git a/src/main/kotlin/org/ro/core/event/ResourceSpecification.kt b/src/main/kotlin/org/ro/core/event/ResourceSpecification.kt index ef045a2..d321d3a 100644 --- a/src/main/kotlin/org/ro/core/event/ResourceSpecification.kt +++ b/src/main/kotlin/org/ro/core/event/ResourceSpecification.kt @@ -2,4 +2,4 @@ package org.ro.core.event class ResourceSpecification( val url: String, - val mimeType: String = "Json") + val subType: String = "json") diff --git a/src/main/kotlin/org/ro/core/event/RoXmlHttpRequest.kt b/src/main/kotlin/org/ro/core/event/RoXmlHttpRequest.kt index 635c7bb..1649128 100644 --- a/src/main/kotlin/org/ro/core/event/RoXmlHttpRequest.kt +++ b/src/main/kotlin/org/ro/core/event/RoXmlHttpRequest.kt @@ -14,12 +14,12 @@ import org.w3c.xhr.XMLHttpRequest */ class RoXmlHttpRequest { - fun invoke(link: Link, aggregator: BaseAggregator?, mimeType: String = "json") { + fun invoke(link: Link, aggregator: BaseAggregator?, subType: String = "json") { val reSpec = ResourceSpecification(link.href) if (EventStore.isCached(reSpec, link.method)) { processCached(reSpec) } else { - process(link, aggregator, mimeType) + process(link, aggregator, subType) } } @@ -30,7 +30,7 @@ class RoXmlHttpRequest { EventStore.cached(reSpec) } - private fun process(link: Link, aggregator: BaseAggregator?, mimeType: String) { + private fun process(link: Link, aggregator: BaseAggregator?, subType: String) { val method = link.method var url = link.href if (method != Method.POST.operation) { @@ -41,10 +41,10 @@ class RoXmlHttpRequest { val xhr = XMLHttpRequest() xhr.open(method, url, true) xhr.setRequestHeader("Authorization", "Basic $credentials") - xhr.setRequestHeader("Content-Type", "application/$mimeType;charset=UTF-8") - xhr.setRequestHeader("Accept", "application/$mimeType") + xhr.setRequestHeader("Content-Type", "application/$subType;charset=UTF-8") + xhr.setRequestHeader("Accept", "application/$subType") - val reSpec = ResourceSpecification(url, mimeType) + val reSpec = ResourceSpecification(url, subType) xhr.onload = { _ -> resultHandler(reSpec, xhr.responseText) } xhr.onerror = { _ -> errorHandler(reSpec, xhr.responseText) } xhr.ontimeout = { _ -> errorHandler(reSpec, xhr.responseText) } diff --git a/src/main/kotlin/org/ro/core/model/DisplayList.kt b/src/main/kotlin/org/ro/core/model/DisplayList.kt index fd51d7a..ae1dd4a 100644 --- a/src/main/kotlin/org/ro/core/model/DisplayList.kt +++ b/src/main/kotlin/org/ro/core/model/DisplayList.kt @@ -1,36 +1,65 @@ package org.ro.core.model import org.ro.layout.Layout +import org.ro.layout.PropertyLt import org.ro.to.Extensions import org.ro.to.Property import org.ro.to.TObject import org.ro.to.TransferObject +import org.ro.to.bs3.Grid import pl.treksoft.kvision.state.observableListOf class DisplayList(override val title: String) : BaseDisplayable() { var data = observableListOf() override var layout: Layout? = null + var grid: Grid? = null var propertyDescriptionList = mutableMapOf() var propertyList = mutableListOf() + var propertyLayoutList = mutableListOf() override fun canBeDisplayed(): Boolean { when { isRendered -> return false layout == null -> return false + grid == null -> return false else -> { - val lps = layout!!.propertyList.size + val lps = propertyList.size val pds = propertyDescriptionList.size - // val ps = propertyList.size + // val ps = propertyList.size val descriptionsComplete = lps <= pds - // val propertiesComplete = lps <= ps + // val propertiesComplete = lps <= ps console.log("[DL.canBeDisplayed] layout.properties: $lps") console.log("[DL.canBeDisplayed] propertyDescriptions: $pds") - // console.log("[DL.canBeDisplayed] properties: $ps") + // console.log("[DL.canBeDisplayed] properties: $ps") return descriptionsComplete //&& propertiesComplete } } } + fun addLayout(layout: Layout) { + this.layout = layout + layout.row.forEach { r -> + r.cols.forEach { cs -> + cs.col.fieldSet.forEach { fs -> + fs.property.forEach { p -> + propertyLayoutList.add(p) + } + } + cs.col.row.forEach { r -> + r.cols.forEach { cs -> + cs.col.fieldSet.forEach { fs -> + fs.property.forEach { p -> + propertyLayoutList.add(p) + } + } + } + } + } + } + console.log("[DL.addLayout]") + console.log(propertyLayoutList) + } + override fun addData(obj: TransferObject) { val exo = Exposer(obj as TObject) data.add(exo.dynamise()) //if exposer is not dynamised, data access in tables won't work @@ -41,7 +70,6 @@ class DisplayList(override val title: String) : BaseDisplayable() { val e: Extensions = p.extensions!! val friendlyName = e.friendlyName propertyDescriptionList.put(id, friendlyName) - layout?.addPropertyDescription(p) } fun addProperty(property: Property) { diff --git a/src/main/kotlin/org/ro/core/model/DisplayObject.kt b/src/main/kotlin/org/ro/core/model/DisplayObject.kt index 8419a89..9fc74ec 100644 --- a/src/main/kotlin/org/ro/core/model/DisplayObject.kt +++ b/src/main/kotlin/org/ro/core/model/DisplayObject.kt @@ -25,6 +25,10 @@ class DisplayObject(override val title: String) : BaseDisplayable() { } } + fun addLayout(layout:Layout) { + this.layout = layout + } + override fun addData(obj: TransferObject) { val exo = Exposer(obj as TObject) data = exo.dynamise() as? Exposer diff --git a/src/main/kotlin/org/ro/handler/LayoutHandler.kt b/src/main/kotlin/org/ro/handler/LayoutHandler.kt index db59172..ff470bb 100644 --- a/src/main/kotlin/org/ro/handler/LayoutHandler.kt +++ b/src/main/kotlin/org/ro/handler/LayoutHandler.kt @@ -12,9 +12,9 @@ import org.ro.utils.XmlHelper class LayoutHandler : BaseHandler() { override fun canHandle(response: String): Boolean { - val formatAndUrlMatches = !XmlHelper.isXml(response) + val isJsonLayout = !XmlHelper.isXml(response) && logEntry.url.endsWith("layout") - if (formatAndUrlMatches) { + if (isJsonLayout) { return super.canHandle(response) } return false diff --git a/src/main/kotlin/org/ro/handler/LayoutXmlHandler.kt b/src/main/kotlin/org/ro/handler/LayoutXmlHandler.kt index 582c398..743600a 100644 --- a/src/main/kotlin/org/ro/handler/LayoutXmlHandler.kt +++ b/src/main/kotlin/org/ro/handler/LayoutXmlHandler.kt @@ -1,6 +1,5 @@ package org.ro.handler -import org.ro.layout.Layout import org.ro.to.TransferObject import org.ro.to.bs3.Grid import org.ro.utils.XmlHelper diff --git a/src/main/kotlin/org/ro/layout/ColsLt.kt b/src/main/kotlin/org/ro/layout/ColsLt.kt index fa4e6c4..e7fe57c 100644 --- a/src/main/kotlin/org/ro/layout/ColsLt.kt +++ b/src/main/kotlin/org/ro/layout/ColsLt.kt @@ -3,19 +3,10 @@ package org.ro.layout import kotlinx.serialization.Serializable @Serializable -data class ColsLt(val col: ColLt? = null) { +data class ColsLt(val col: ColLt) { fun getCol(): ColLt { - // return getValues().first() -// console.log("[layout/Cols.getCol]") -// console.log(col) - // return col.first() - return col!! + return col//.first() } - //fun getValues(): MutableCollection { - //FIXME wrapper in between required? - // return col. - // } - } diff --git a/src/main/kotlin/org/ro/layout/Layout.kt b/src/main/kotlin/org/ro/layout/Layout.kt index 8229fc2..f8b93cb 100644 --- a/src/main/kotlin/org/ro/layout/Layout.kt +++ b/src/main/kotlin/org/ro/layout/Layout.kt @@ -1,50 +1,13 @@ package org.ro.layout -import kotlinx.serialization.ContextualSerialization import kotlinx.serialization.Serializable import org.ro.to.TransferObject -import org.ro.to.bs3.Grid /** - * Wraps Grid and adds (marker) interface TransferObject + * Json variant of layout TransferObject * * @See: https://en.wikipedia.org/wiki/Composite_pattern */ @Serializable data class Layout(val cssClass: String? = null, - val row: List = emptyList()) : TransferObject { - val propertyList = mutableListOf() - val propertyDescriptionList = mutableListOf() - @ContextualSerialization - var grid: Grid? = null - - fun initGrid(grid:Grid) { - //propertyList.addAll(grid.getPropertyList()) - } - - fun addPropertyDescription(p: org.ro.to.Property) { - propertyDescriptionList.add(p) - } - - init { - // row[0] (head) contains the object title and actions - // row[1] contains data, tabs, collections, etc. - val secondRow = row[1] // traditional C braintwist - var colsLyt = secondRow.cols.first() - var colLyt = colsLyt.getCol() - val tgLyts = colLyt.tabGroup - if (tgLyts.isNotEmpty()) { - val tabGroup = tgLyts.first() - val tab = tabGroup.tab.first() - val row = tab.row.first() - colsLyt = row.cols.first() - } - colLyt = colsLyt.getCol() - val fsList = colLyt.fieldSet - if (fsList.isNotEmpty()) { - val fsLyt = fsList.first() - //propertyList = fsLyt.property - } - } - -} + val row: List = emptyList()) : TransferObject diff --git a/src/main/kotlin/org/ro/ui/builder/LayoutBuilder.kt b/src/main/kotlin/org/ro/ui/builder/LayoutBuilder.kt index 064e26d..361ea5e 100644 --- a/src/main/kotlin/org/ro/ui/builder/LayoutBuilder.kt +++ b/src/main/kotlin/org/ro/ui/builder/LayoutBuilder.kt @@ -16,10 +16,11 @@ class LayoutBuilder { oCpt.width = CssSize(100, UNIT.perc) result.add(oCpt) + /* FIXME for (rl in layout.grid!!.rows) { val cpt = RowBuilder().create(rl, tObject, dsp) result.add(cpt) - } + } */ return result } diff --git a/src/test/kotlin/org/ro/IntegrationTest.kt b/src/test/kotlin/org/ro/IntegrationTest.kt index 8194dd8..6b05da8 100644 --- a/src/test/kotlin/org/ro/IntegrationTest.kt +++ b/src/test/kotlin/org/ro/IntegrationTest.kt @@ -42,11 +42,14 @@ open class IntegrationTest { fun mockResponse(response: Response, aggregator: BaseAggregator?): LogEntry { val str = response.str - val method = Method.GET.operation val reSpec = ResourceSpecification(response.url) - EventStore.start(reSpec, method, "", aggregator) - val le = EventStore.end(reSpec, str) - ResponseHandler.handle(le!!) + EventStore.start( + reSpec, + Method.GET.operation, + "", + aggregator) + val le = EventStore.end(reSpec, str)!! + ResponseHandler.handle(le) wait(100) return le } diff --git a/src/test/kotlin/org/ro/core/aggregator/ListAggregatorTest.kt b/src/test/kotlin/org/ro/core/aggregator/ListAggregatorTest.kt index d332e00..81dff1d 100644 --- a/src/test/kotlin/org/ro/core/aggregator/ListAggregatorTest.kt +++ b/src/test/kotlin/org/ro/core/aggregator/ListAggregatorTest.kt @@ -45,6 +45,8 @@ class ListAggregatorTest : IntegrationTest() { assertEquals("className", p.id) //1 assertNotNull(descLink) //2 assertEquals(obs, actObs) //3 + console.log("[LAT.testFixtureResult]") + console.log(actObs) assertNotNull(actObs.dsp.layout) // 4 assertEquals(pdLe.getAggregator(), layoutLe.getAggregator()) // 5 assertNotNull(dl.layout) // 6 diff --git a/src/test/kotlin/org/ro/core/event/EventStoreTest.kt b/src/test/kotlin/org/ro/core/event/EventStoreTest.kt index 972f010..211dded 100644 --- a/src/test/kotlin/org/ro/core/event/EventStoreTest.kt +++ b/src/test/kotlin/org/ro/core/event/EventStoreTest.kt @@ -21,10 +21,15 @@ class EventStoreTest : IntegrationTest() { // given EventStore.reset() val obs = ListAggregator("test") - //val rsJson = ResourceSpecification(SO_LAYOUT_JSON.url) + + val rsJson = ResourceSpecification(SO_LAYOUT_JSON.url) + EventStore.start(rsJson, Method.GET.operation, "", obs) val leJson = mockResponse(SO_LAYOUT_JSON, obs) - //val rsXml = ResourceSpecification(SO_LAYOUT_XML.url) + + val rsXml = ResourceSpecification(SO_LAYOUT_XML.url, "xml") + EventStore.start(rsXml, Method.GET.operation, "", obs) val leXml = mockResponse(SO_LAYOUT_XML, obs) + assertEquals(2, EventStore.log.size) console.log("[EST.testLayout]") console.log(EventStore.log) @@ -48,12 +53,12 @@ class EventStoreTest : IntegrationTest() { val selfSpec = ResourceSpecification(selfUrl) val upSpec = ResourceSpecification(upUrl) // when - EventStore.start(selfSpec, method, myFirst) - EventStore.start(upSpec, method, myFirst) + EventStore.start(selfSpec, method, body = myFirst) + EventStore.start(upSpec, method, body = myFirst) EventStore.end(selfSpec, selfStr) EventStore.end(upSpec, upStr) - EventStore.start(selfSpec, method, myLast) - EventStore.start(upSpec, method, myLast) + EventStore.start(selfSpec, method, body = myLast) + EventStore.start(upSpec, method, body = myLast) // then val currentSize: Int = EventStore.log.size assertEquals(4 + initialSize, currentSize) //1 @@ -61,6 +66,8 @@ class EventStoreTest : IntegrationTest() { // Entries with the same key can be written, but when updated or retrieved the first (oldest) entry should be used //when val le2 = EventStore.find(selfSpec)!! + console.log("[EST.testSecondEntry]") + console.log(le2) //then assertEquals(myFirst, le2.request) //2 assertEquals(selfStr.length, le2.response.length) //3 diff --git a/src/test/kotlin/org/ro/core/model/DisplayListTest.kt b/src/test/kotlin/org/ro/core/model/DisplayListTest.kt index 85e9499..176dcd4 100644 --- a/src/test/kotlin/org/ro/core/model/DisplayListTest.kt +++ b/src/test/kotlin/org/ro/core/model/DisplayListTest.kt @@ -7,6 +7,7 @@ import org.ro.handler.TObjectHandler import org.ro.layout.Layout import org.ro.snapshots.simpleapp1_16_0.* import org.ro.to.TObject +import org.ro.to.bs3.Grid import kotlin.test.Test import kotlin.test.assertEquals import kotlin.test.assertNotNull @@ -17,34 +18,33 @@ class DisplayListTest { @Test fun testConfiguration() { val ro0 = TObjectHandler().parse(CFG_1.str) as TObject - val lyt = LayoutHandler().parse(CFG_LAYOUT.str) as Layout + val lt = LayoutHandler().parse(CFG_LAYOUT_JSON.str) as Layout + // val grd = LayoutXmlHandler().parse(CFG_LAYOUT_XML.str) as Grid val dl = DisplayList("test") dl.addData(ro0) - dl.layout = lyt - assertEquals(1, dl.data.size) + dl.addLayout(lt) + assertEquals(1, dl.data.size) //1 - assertNotNull(dl.layout) - val properties = dl.layout!!.propertyList - assertNotNull(properties) - assertEquals("key", properties[0].id) - assertEquals("value", properties[1].id) + val properties = dl.propertyList + assertEquals("key", properties[0].id) // 2 + assertEquals("value", properties[1].id) // 3 } //@Test fun testFixtureResult() { val ro0 = TObjectHandler().parse(FR_OBJECT.str) as TObject - val lyt = LayoutXmlHandler().parse(FR_OBJECT_LAYOUT.str) as Layout + val lt = LayoutXmlHandler().parse(FR_OBJECT_LAYOUT.str) as Layout val dl = DisplayList("test") dl.addData(ro0) - dl.layout = lyt + dl.addLayout(lt) assertEquals(1, dl.data.size) assertNotNull(dl.layout) - val properties = dl.layout!!.propertyList + val properties = dl.propertyList assertNotNull(properties) //Sequence in FR_OBJECT differs from sequence in FR_OBJECT_LAYOUT // FR_OBJECT: fixtureScriptClassName, key, object, className @@ -59,16 +59,16 @@ class DisplayListTest { fun testSimpleObject() { val ro0 = TObjectHandler().parse(SO_0.str) as TObject val ro1 = TObjectHandler().parse(SO_1.str) as TObject - val lyt = LayoutHandler().parse(SO_OBJECT_LAYOUT.str) as Layout + val lt = LayoutHandler().parse(SO_OBJECT_LAYOUT.str) as Layout val dl = DisplayList("test") dl.addData(ro0) dl.addData(ro1) - dl.layout = lyt + dl.addLayout(lt) assertEquals(2, dl.data.size) //1 - val properties = lyt.propertyList + val properties = dl.propertyList assertEquals(2, properties.size) //2 //FIXME assertEquals("name", properties[0].id) //3 diff --git a/src/test/kotlin/org/ro/layout/LayoutTest.kt b/src/test/kotlin/org/ro/layout/LayoutTest.kt index bd99311..8daffd1 100644 --- a/src/test/kotlin/org/ro/layout/LayoutTest.kt +++ b/src/test/kotlin/org/ro/layout/LayoutTest.kt @@ -7,6 +7,7 @@ import org.ro.snapshots.simpleapp1_16_0.SO_LAYOUT_JSON import org.ro.to.Links import kotlin.test.Test import kotlin.test.assertEquals +import kotlin.test.assertNotNull @UnstableDefault class LayoutTest : IntegrationTest() { @@ -17,9 +18,9 @@ class LayoutTest : IntegrationTest() { val jsonStr = SO_LAYOUT_JSON.str //when val layout = LayoutHandler().parse(jsonStr) as Layout - val linkList = layout.propertyList + //val linkList = layout.propertyList // then - assertEquals(5, linkList.size) //1 + assertNotNull(layout) //1 } } diff --git a/src/test/kotlin/org/ro/snapshots/simpleapp1_16_0/CFG_LAYOUT_JSON.kt b/src/test/kotlin/org/ro/snapshots/simpleapp1_16_0/CFG_LAYOUT_JSON.kt new file mode 100644 index 0000000..7e1f621 --- /dev/null +++ b/src/test/kotlin/org/ro/snapshots/simpleapp1_16_0/CFG_LAYOUT_JSON.kt @@ -0,0 +1,299 @@ +package org.ro.snapshots.simpleapp1_16_0 + +import org.ro.snapshots.Response + +object CFG_LAYOUT_JSON: Response() { + override val url= "http://localhost:8080/restful/objects/isisApplib.ConfigurationProperty/PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9InllcyI_Pgo8Y29uZmlndXJhdGlvblByb3BlcnR5PgogICAgPGtleT5pc2lzLmFwcE1hbmlmZXN0PC9rZXk-CiAgICA8dmFsdWU-ZG9tYWluYXBwLmFwcGxpY2F0aW9uLm1hbmlmZXN0LkRvbWFpbkFwcEFwcE1hbmlmZXN0PC92YWx1ZT4KPC9jb25maWd1cmF0aW9uUHJvcGVydHk-Cg==/object-layout" + override val str = """ +{ + "row": [ + { + "cols": [ + { + "col": { + "domainObject": { + "named": null, + "describedAs": null, + "plural": null, + "metadataError": null, + "link": { + "rel": "urn:org.restfulobjects:rels/element", + "method": "GET", + "href": "http://localhost:8080/restful/objects/isisApplib.ConfigurationProperty/PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9InllcyI_Pgo8Y29uZmlndXJhdGlvblByb3BlcnR5PgogICAgPGtleT5pc2lzLmFwcE1hbmlmZXN0PC9rZXk-CiAgICA8dmFsdWU-ZG9tYWluYXBwLmFwcGxpY2F0aW9uLm1hbmlmZXN0LkRvbWFpbkFwcEFwcE1hbmlmZXN0PC92YWx1ZT4KPC9jb25maWd1cmF0aW9uUHJvcGVydHk-Cg==", + "type": "application/json;profile=\"urn:org.restfulobjects:repr-types/object\"" + }, + "bookmarking": null, + "cssClass": null, + "cssClassFa": null, + "cssClassFaPosition": null, + "namedEscaped": null + }, + "action": [ + { + "named": null, + "describedAs": null, + "metadataError": null, + "link": { + "rel": "urn:org.restfulobjects:rels/action", + "method": "GET", + "href": "http://localhost:8080/restful/objects/isisApplib.ConfigurationProperty/PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9InllcyI_Pgo8Y29uZmlndXJhdGlvblByb3BlcnR5PgogICAgPGtleT5pc2lzLmFwcE1hbmlmZXN0PC9rZXk-CiAgICA8dmFsdWU-ZG9tYWluYXBwLmFwcGxpY2F0aW9uLm1hbmlmZXN0LkRvbWFpbkFwcEFwcE1hbmlmZXN0PC92YWx1ZT4KPC9jb25maWd1cmF0aW9uUHJvcGVydHk-Cg==/actions/clearHints", + "type": "application/json;profile=\"urn:org.restfulobjects:repr-types/object-action\"" + }, + "id": "clearHints", + "bookmarking": null, + "cssClass": null, + "cssClassFa": null, + "cssClassFaPosition": null, + "hidden": "EVERYWHERE", + "namedEscaped": null, + "position": null, + "promptStyle": null + }, + { + "named": null, + "describedAs": null, + "metadataError": null, + "link": { + "rel": "urn:org.restfulobjects:rels/action", + "method": "GET", + "href": "http://localhost:8080/restful/objects/isisApplib.ConfigurationProperty/PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9InllcyI_Pgo8Y29uZmlndXJhdGlvblByb3BlcnR5PgogICAgPGtleT5pc2lzLmFwcE1hbmlmZXN0PC9rZXk-CiAgICA8dmFsdWU-ZG9tYWluYXBwLmFwcGxpY2F0aW9uLm1hbmlmZXN0LkRvbWFpbkFwcEFwcE1hbmlmZXN0PC92YWx1ZT4KPC9jb25maWd1cmF0aW9uUHJvcGVydHk-Cg==/actions/openRestApi", + "type": "application/json;profile=\"urn:org.restfulobjects:repr-types/object-action\"" + }, + "id": "openRestApi", + "bookmarking": null, + "cssClass": null, + "cssClassFa": null, + "cssClassFaPosition": null, + "hidden": null, + "namedEscaped": null, + "position": null, + "promptStyle": null + } + ], + "metadataError": null, + "cssClass": null, + "size": null, + "id": null, + "span": 12, + "unreferencedActions": true, + "unreferencedCollections": null + } + } + ], + "metadataError": null, + "cssClass": null, + "id": null + }, + { + "cols": [ + { + "col": { + "domainObject": null, + "tabGroup": [ + { + "tab": [ + { + "name": "General", + "row": [ + { + "cols": [ + { + "col": { + "domainObject": null, + "fieldSet": [ + { + "name": "Property", + "action": [ + { + "named": null, + "describedAs": null, + "metadataError": null, + "link": { + "rel": "urn:org.restfulobjects:rels/action", + "method": "GET", + "href": "http://localhost:8080/restful/objects/isisApplib.ConfigurationProperty/PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9InllcyI_Pgo8Y29uZmlndXJhdGlvblByb3BlcnR5PgogICAgPGtleT5pc2lzLmFwcE1hbmlmZXN0PC9rZXk-CiAgICA8dmFsdWU-ZG9tYWluYXBwLmFwcGxpY2F0aW9uLm1hbmlmZXN0LkRvbWFpbkFwcEFwcE1hbmlmZXN0PC92YWx1ZT4KPC9jb25maWd1cmF0aW9uUHJvcGVydHk-Cg==/actions/downloadLayoutXml", + "type": "application/json;profile=\"urn:org.restfulobjects:repr-types/object-action\"" + }, + "id": "downloadLayoutXml", + "bookmarking": null, + "cssClass": null, + "cssClassFa": null, + "cssClassFaPosition": null, + "hidden": null, + "namedEscaped": null, + "position": "PANEL_DROPDOWN", + "promptStyle": null + }, + { + "named": null, + "describedAs": null, + "metadataError": null, + "link": { + "rel": "urn:org.restfulobjects:rels/action", + "method": "GET", + "href": "http://localhost:8080/restful/objects/isisApplib.ConfigurationProperty/PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9InllcyI_Pgo8Y29uZmlndXJhdGlvblByb3BlcnR5PgogICAgPGtleT5pc2lzLmFwcE1hbmlmZXN0PC9rZXk-CiAgICA8dmFsdWU-ZG9tYWluYXBwLmFwcGxpY2F0aW9uLm1hbmlmZXN0LkRvbWFpbkFwcEFwcE1hbmlmZXN0PC92YWx1ZT4KPC9jb25maWd1cmF0aW9uUHJvcGVydHk-Cg==/actions/rebuildMetamodel", + "type": "application/json;profile=\"urn:org.restfulobjects:repr-types/object-action\"" + }, + "id": "rebuildMetamodel", + "bookmarking": null, + "cssClass": null, + "cssClassFa": null, + "cssClassFaPosition": null, + "hidden": null, + "namedEscaped": null, + "position": "PANEL_DROPDOWN", + "promptStyle": null + } + ], + "property": [ + { + "named": null, + "describedAs": null, + "metadataError": null, + "link": { + "rel": "urn:org.restfulobjects:rels/property", + "method": "GET", + "href": "http://localhost:8080/restful/objects/isisApplib.ConfigurationProperty/PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9InllcyI_Pgo8Y29uZmlndXJhdGlvblByb3BlcnR5PgogICAgPGtleT5pc2lzLmFwcE1hbmlmZXN0PC9rZXk-CiAgICA8dmFsdWU-ZG9tYWluYXBwLmFwcGxpY2F0aW9uLm1hbmlmZXN0LkRvbWFpbkFwcEFwcE1hbmlmZXN0PC92YWx1ZT4KPC9jb25maWd1cmF0aW9uUHJvcGVydHk-Cg==/properties/key", + "type": "application/json;profile=\"urn:org.restfulobjects:repr-types/object-property\"" + }, + "id": "key", + "cssClass": null, + "hidden": null, + "labelPosition": null, + "multiLine": null, + "namedEscaped": null, + "promptStyle": null, + "renderedAsDayBefore": null, + "typicalLength": null, + "unchanging": null + }, + { + "named": null, + "describedAs": null, + "metadataError": null, + "link": { + "rel": "urn:org.restfulobjects:rels/property", + "method": "GET", + "href": "http://localhost:8080/restful/objects/isisApplib.ConfigurationProperty/PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9InllcyI_Pgo8Y29uZmlndXJhdGlvblByb3BlcnR5PgogICAgPGtleT5pc2lzLmFwcE1hbmlmZXN0PC9rZXk-CiAgICA8dmFsdWU-ZG9tYWluYXBwLmFwcGxpY2F0aW9uLm1hbmlmZXN0LkRvbWFpbkFwcEFwcE1hbmlmZXN0PC92YWx1ZT4KPC9jb25maWd1cmF0aW9uUHJvcGVydHk-Cg==/properties/value", + "type": "application/json;profile=\"urn:org.restfulobjects:repr-types/object-property\"" + }, + "id": "value", + "cssClass": null, + "hidden": null, + "labelPosition": null, + "multiLine": 5, + "namedEscaped": null, + "promptStyle": null, + "renderedAsDayBefore": null, + "typicalLength": null, + "unchanging": null + } + ], + "metadataError": null, + "id": "key", + "unreferencedActions": null, + "unreferencedProperties": null + } + ], + "metadataError": null, + "cssClass": null, + "size": null, + "id": null, + "span": 8, + "unreferencedActions": null, + "unreferencedCollections": null + } + } + ], + "metadataError": null, + "cssClass": null, + "id": null + } + ], + "cssClass": null + }, + { + "name": "Other", + "row": [ + { + "cols": [ + { + "col": { + "domainObject": null, + "fieldSet": [ + { + "name": "Other", + "metadataError": null, + "id": "other", + "unreferencedActions": null, + "unreferencedProperties": true + } + ], + "metadataError": null, + "cssClass": null, + "size": null, + "id": null, + "span": 12, + "unreferencedActions": null, + "unreferencedCollections": null + } + } + ], + "metadataError": null, + "cssClass": null, + "id": null + } + ], + "cssClass": null + } + ], + "metadataError": null, + "cssClass": null, + "unreferencedCollections": null + } + ], + "metadataError": null, + "cssClass": null, + "size": null, + "id": null, + "span": 12, + "unreferencedActions": null, + "unreferencedCollections": null + } + } + ], + "metadataError": null, + "cssClass": null, + "id": null + }, + { + "cols": [ + { + "col": { + "domainObject": null, + "tabGroup": [ + { + "metadataError": null, + "cssClass": null, + "unreferencedCollections": true + } + ], + "metadataError": null, + "cssClass": null, + "size": null, + "id": null, + "span": 12, + "unreferencedActions": null, + "unreferencedCollections": null + } + } + ], + "metadataError": null, + "cssClass": null, + "id": null + } + ], + "cssClass": null +} +""" +} diff --git a/src/test/kotlin/org/ro/snapshots/simpleapp1_16_0/CFG_LAYOUT.kt b/src/test/kotlin/org/ro/snapshots/simpleapp1_16_0/CFG_LAYOUT_XML.kt similarity index 99% rename from src/test/kotlin/org/ro/snapshots/simpleapp1_16_0/CFG_LAYOUT.kt rename to src/test/kotlin/org/ro/snapshots/simpleapp1_16_0/CFG_LAYOUT_XML.kt index a8b424e..4c16442 100644 --- a/src/test/kotlin/org/ro/snapshots/simpleapp1_16_0/CFG_LAYOUT.kt +++ b/src/test/kotlin/org/ro/snapshots/simpleapp1_16_0/CFG_LAYOUT_XML.kt @@ -2,7 +2,7 @@ package org.ro.snapshots.simpleapp1_16_0 import org.ro.snapshots.Response -object CFG_LAYOUT: Response() { +object CFG_LAYOUT_XML: Response() { override val url= "http://localhost:8080/restful/objects/isisApplib.ConfigurationProperty/PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9InllcyI_Pgo8Y29uZmlndXJhdGlvblByb3BlcnR5PgogICAgPGtleT5pc2lzLmFwcE1hbmlmZXN0PC9rZXk-CiAgICA8dmFsdWU-ZG9tYWluYXBwLmFwcGxpY2F0aW9uLm1hbmlmZXN0LkRvbWFpbkFwcEFwcE1hbmlmZXN0PC92YWx1ZT4KPC9jb25maWd1cmF0aW9uUHJvcGVydHk-Cg==/object-layout" override val str = """ diff --git a/src/test/kotlin/org/ro/to/ActionTest.kt b/src/test/kotlin/org/ro/to/ActionTest.kt index f6e6757..2e2dd7c 100644 --- a/src/test/kotlin/org/ro/to/ActionTest.kt +++ b/src/test/kotlin/org/ro/to/ActionTest.kt @@ -1,14 +1,58 @@ package org.ro.to import kotlinx.serialization.UnstableDefault +import org.ro.IntegrationTest +import org.ro.core.aggregator.ActionDispatcher +import org.ro.core.event.EventStore +import org.ro.core.event.ResourceSpecification import org.ro.handler.ActionHandler import org.ro.snapshots.simpleapp1_16_0.* +import org.ro.utils.Utils import kotlin.test.Test import kotlin.test.assertEquals import kotlin.test.assertNotNull +import kotlin.test.assertTrue @UnstableDefault -class ActionTest { +class ActionTest : IntegrationTest() { + + // @Test + // IntegrationTest, assumes a server is running, furthermore expects the fingerPrint (PD94*) to be valid + fun testInvokeAction() { + val url = "http://localhost:8080/restful/services/isisApplib.FixtureScriptsDefault/actions/runFixtureScript/invoke" + val fingerPrint = "PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPG1lbWVudG8-PHBhdGg-PC9wYXRoPjwvbWVtZW50bz4=" +/* val body = """{ + "script": { + "value": { + "href": "http://localhost:8080/restful/objects/domainapp.application.fixture.scenarios.DomainAppDemo/$fingerPrint"} + }, + "parameters": {"value": ""} + } """ */ + val href = "\"href\": \"http://localhost:8080/restful/objects/domainapp.application.fixture.scenarios.DomainAppDemo/$fingerPrint\"".trimIndent() + //TODO construct link, invoke and check response + if (isAppAvailable()) { + console.log("[AT.testInvokeAction]") + val action = ActionHandler().parse(ACTIONS_RUN_FIXTURE_SCRIPT.str) as Action + + val link = action.getInvokeLink() + assertNotNull(link) + //now pass on body in order to prepare everything to invoke + val arguments = link.arguments as MutableMap + val arg = Argument(href) + arguments.put("script", arg) + //ensure link arguments make up valid json body + val body = Utils.argumentsAsBody(link) + console.log(body) + val json = JSON.parse(body) + console.log(json) + ActionDispatcher().invoke(link) + val urlSpec = ResourceSpecification(url) + val le = EventStore.find(urlSpec)!! + console.log(EventStore.log) + console.log(le) + assertTrue(!le.isError()) + } + } @Test fun testParseActionGETArgument() { diff --git a/src/test/kotlin/org/ro/to/LinkTest.kt b/src/test/kotlin/org/ro/to/LinkTest.kt index ed243bb..d517819 100644 --- a/src/test/kotlin/org/ro/to/LinkTest.kt +++ b/src/test/kotlin/org/ro/to/LinkTest.kt @@ -2,19 +2,11 @@ package org.ro.to import kotlinx.serialization.UnstableDefault import kotlinx.serialization.json.Json -import org.ro.IntegrationTest -import org.ro.core.aggregator.ActionDispatcher -import org.ro.core.event.EventStore -import org.ro.handler.ActionHandler -import org.ro.core.event.ResourceSpecification -import org.ro.snapshots.simpleapp1_16_0.ACTIONS_RUN_FIXTURE_SCRIPT import kotlin.test.Test import kotlin.test.assertEquals -import kotlin.test.assertNotNull -import kotlin.test.assertTrue @UnstableDefault -class LinkTest : IntegrationTest() { +class LinkTest { @Test fun testParse() { @@ -34,36 +26,6 @@ class LinkTest : IntegrationTest() { assertEquals("R", link.rel) } - @Test - // IntegrationTest, assumes a server is running, furthermore expects the fingerPrint (PD94*) to be valid - fun testInvokeAction() { - val url = "http://localhost:8080/restful/services/isisApplib.FixtureScriptsDefault/actions/runFixtureScript/invoke" - val fingerPrint = "PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPG1lbWVudG8-PHBhdGg-PC9wYXRoPjwvbWVtZW50bz4=" -/* val body = """{ - "script": { - "value": { - "href": "http://localhost:8080/restful/objects/domainapp.application.fixture.scenarios.DomainAppDemo/$fingerPrint"} - }, - "parameters": {"value": ""} - } """ */ - val href = """"href": "http://localhost:8080/restful/objects/domainapp.application.fixture.scenarios.DomainAppDemo/$fingerPrint"""" - //TODO construct link, invoke and check response - if (isAppAvailable()) { - val action = ActionHandler().parse(ACTIONS_RUN_FIXTURE_SCRIPT.str) as Action - - val link = action.getInvokeLink() - assertNotNull(link) - //now pass on body in order to prepare everything to invoke - val arguments = link.arguments as MutableMap - val arg = Argument(href) - arguments.put("script", arg) - ActionDispatcher().invoke(link) - val urlSpec = ResourceSpecification(url) - val le = EventStore.find(urlSpec)!! - assertTrue(!le.isError()) - } - } - @Test fun testArgumentsCanHaveEmptyKeys() { val href = "href"