This is an automated email from the ASF dual-hosted git repository. joergrade pushed a commit to branch ISIS-3171 in repository https://gitbox.apache.org/repos/asf/causeway.git
commit 35a43a8bcf9332d78309616899fcb933573a05d3 Author: Jörg Rade <[email protected]> AuthorDate: Wed Feb 15 22:40:56 2023 +0100 ISIS-3171 PropertySpecification amended with object-layout.xml (per 'protoType') --- .../collection_layout_aggregation_diagram.adoc | 14 +- .../kroviz/core/aggregator/AggregatorWithLayout.kt | 6 +- .../kroviz/core/aggregator/CollectionAggregator.kt | 24 +- .../client/kroviz/core/model/BaseLayout.kt | 16 - .../client/kroviz/core/model/CollectionDM.kt | 29 +- .../client/kroviz/core/model/CollectionLayout.kt | 49 ++- .../causeway/client/kroviz/core/model/ObjectDM.kt | 2 +- .../client/kroviz/core/model/ObjectLayout.kt | 21 -- .../kroviz/core/model/PropertySpecification.kt | 48 ++- .../test/resources/object-layout_collection.xml | 337 +++++++++++++++++++++ 10 files changed, 420 insertions(+), 126 deletions(-) diff --git a/incubator/clients/kroviz/adoc/modules/kroviz/partials/design/collection_layout_aggregation_diagram.adoc b/incubator/clients/kroviz/adoc/modules/kroviz/partials/design/collection_layout_aggregation_diagram.adoc index bbef7a319d..523ad3d247 100644 --- a/incubator/clients/kroviz/adoc/modules/kroviz/partials/design/collection_layout_aggregation_diagram.adoc +++ b/incubator/clients/kroviz/adoc/modules/kroviz/partials/design/collection_layout_aggregation_diagram.adoc @@ -3,8 +3,8 @@ ---- allowmixing -() START -() END +() START #green +() END #red together { file "object-layout" <<BootStrap XML>> as OL #lightblue class GridBs <<(T,tomato)TransferObject>> #lightgreen {} @@ -27,6 +27,7 @@ together { TObject .. O } file "collection-description" <<JSON>> as CD #lightblue +file "object-layout" <<JSON>> as OLJ #lightblue together { file "object-property" <<JSON>> as OP #lightblue @@ -48,9 +49,10 @@ START --> OL : menu action \ninvoked by user OL --> OC : contains\nreference\nto OC --> CD : contains\ncollection\ntitle OC --> O : contains\nreference\nto +O --> OLJ O --> OP : contains\nreference\nto OP -> PD : contains\nreference\nto -PD --> END +PD -r-> END ' references between TO classes GridBs o-->"0.n" Collection @@ -124,5 +126,11 @@ iterate over value[] and add data to DisplayModel end note +legend left + <back:#lightblue> Description </back> + <back:#lightgreen> Party, place, thing</back> + <back:#pink> Moment, Interval </back> + <back:#lightyellow> Role </back> +endlegend ---- diff --git a/incubator/clients/kroviz/src/main/kotlin/org/apache/causeway/client/kroviz/core/aggregator/AggregatorWithLayout.kt b/incubator/clients/kroviz/src/main/kotlin/org/apache/causeway/client/kroviz/core/aggregator/AggregatorWithLayout.kt index 54eb826efe..b114488c4f 100644 --- a/incubator/clients/kroviz/src/main/kotlin/org/apache/causeway/client/kroviz/core/aggregator/AggregatorWithLayout.kt +++ b/incubator/clients/kroviz/src/main/kotlin/org/apache/causeway/client/kroviz/core/aggregator/AggregatorWithLayout.kt @@ -54,17 +54,13 @@ abstract class AggregatorWithLayout : BaseAggregator() { protected fun handleProperty(property: Property, referrer: String, layout: BaseLayout) { when { property.isObjectProperty() -> { - console.log("[AWL_handleProperty] objectProperty") val op = ObjectProperty(property) - layout.addObjectProperty(op, this, referrer) val pdLink = op.getDescriptionLink()!! ResourceProxy().fetch(pdLink, this, referrer = referrer) } property.isPropertyDescription() -> { - console.log("[AWL_handleProperty] propertyDescription") - val pd = PropertyDescription(property) - layout.addPropertyDescription(pd, this, referrer) + console.log("[AWL_handleProperty] PropertyDescription obsolete?") } else -> { diff --git a/incubator/clients/kroviz/src/main/kotlin/org/apache/causeway/client/kroviz/core/aggregator/CollectionAggregator.kt b/incubator/clients/kroviz/src/main/kotlin/org/apache/causeway/client/kroviz/core/aggregator/CollectionAggregator.kt index e31da813c9..07ea8ebc5f 100644 --- a/incubator/clients/kroviz/src/main/kotlin/org/apache/causeway/client/kroviz/core/aggregator/CollectionAggregator.kt +++ b/incubator/clients/kroviz/src/main/kotlin/org/apache/causeway/client/kroviz/core/aggregator/CollectionAggregator.kt @@ -25,6 +25,8 @@ import org.apache.causeway.client.kroviz.core.event.ResourceSpecification import org.apache.causeway.client.kroviz.core.model.CollectionDM import org.apache.causeway.client.kroviz.core.model.CollectionLayout import org.apache.causeway.client.kroviz.to.* +import org.apache.causeway.client.kroviz.to.bs.GridBs +import org.apache.causeway.client.kroviz.ui.core.Constants import org.apache.causeway.client.kroviz.ui.core.ViewManager /** sequence of operations: @@ -54,7 +56,7 @@ class CollectionAggregator(actionTitle: String, private val parent: ObjectAggreg is ResultList -> handleList(obj) is TObject -> handleObject(obj) is DomainType -> handleDomainType(obj) - //is GridBs -> Unit //In the case of CollectionDM, object-layout can be ignored + is GridBs -> handleLayout(obj) is Property -> handleProperty(obj) is Collection -> handleCollection(obj) is Icon -> handleIcon(obj) @@ -99,15 +101,21 @@ class CollectionAggregator(actionTitle: String, private val parent: ObjectAggreg } } - private fun handleObject(obj: TObject) { - displayModel.addData(obj, this, referrer) - - getLayout().initColumns(obj) + private fun handleLayout(grid: GridBs) { + getDisplayModel().setProtoTypeLayout(grid) + } - if (isStandAloneCollection()) { - invokeLayoutLink(obj, this, referrer = referrer) + private fun handleObject(tObj: TObject) { + val dm = getDisplayModel() + dm.addData(tObj) + if (!dm.hasProtoType()) { + dm.setProtoType(tObj) + invokeLayoutLink(tObj, this, referrer = referrer) } - invokeIconLink(obj, this, referrer = referrer) + //TODO fold layout into model + getLayout().addObject(tObj, this, referrer = referrer) + + invokeIconLink(tObj, this, referrer = referrer) } private fun isStandAloneCollection(): Boolean { diff --git a/incubator/clients/kroviz/src/main/kotlin/org/apache/causeway/client/kroviz/core/model/BaseLayout.kt b/incubator/clients/kroviz/src/main/kotlin/org/apache/causeway/client/kroviz/core/model/BaseLayout.kt index 206ae67da1..e2625c75e6 100644 --- a/incubator/clients/kroviz/src/main/kotlin/org/apache/causeway/client/kroviz/core/model/BaseLayout.kt +++ b/incubator/clients/kroviz/src/main/kotlin/org/apache/causeway/client/kroviz/core/model/BaseLayout.kt @@ -18,24 +18,8 @@ */ package org.apache.causeway.client.kroviz.core.model -import org.apache.causeway.client.kroviz.core.aggregator.AggregatorWithLayout -import org.apache.causeway.client.kroviz.to.ObjectProperty -import org.apache.causeway.client.kroviz.to.PropertyDescription - abstract class BaseLayout { - abstract fun addObjectProperty( - objectProperty: ObjectProperty, - aggregator: AggregatorWithLayout, - referrer: String - ) - - abstract fun addPropertyDescription( - propertyDescription: PropertyDescription, - aggregator: AggregatorWithLayout, - referrer: String - ) - abstract fun readyToRender(): Boolean } \ No newline at end of file diff --git a/incubator/clients/kroviz/src/main/kotlin/org/apache/causeway/client/kroviz/core/model/CollectionDM.kt b/incubator/clients/kroviz/src/main/kotlin/org/apache/causeway/client/kroviz/core/model/CollectionDM.kt index e0f387683b..af6e1371e5 100644 --- a/incubator/clients/kroviz/src/main/kotlin/org/apache/causeway/client/kroviz/core/model/CollectionDM.kt +++ b/incubator/clients/kroviz/src/main/kotlin/org/apache/causeway/client/kroviz/core/model/CollectionDM.kt @@ -23,6 +23,7 @@ import org.apache.causeway.client.kroviz.core.aggregator.AggregatorWithLayout import org.apache.causeway.client.kroviz.core.event.ResourceProxy import org.apache.causeway.client.kroviz.to.TObject import org.apache.causeway.client.kroviz.to.TransferObject +import org.apache.causeway.client.kroviz.to.bs.GridBs import org.apache.causeway.client.kroviz.utils.StringUtils class CollectionDM(override val title: String) : DisplayModelWithLayout() { @@ -33,6 +34,24 @@ class CollectionDM(override val title: String) : DisplayModelWithLayout() { var id = "" var data = observableListOf<Exposer>() private var rawData = observableListOf<TransferObject>() + private var protoType: TObject? = null + private var protoTypeLayout: GridBs? = null + + fun setProtoTypeLayout(grid: GridBs) { + protoTypeLayout = grid + val propertyList = grid.getPropertyList() + propertyList.forEach{ + getLayout().addPropertyDetails(it) + } + } + + fun hasProtoType(): Boolean { + return protoType != null + } + + fun setProtoType(to:TransferObject){ + protoType = to as TObject + } override fun readyToRender(): Boolean { return getLayout().readyToRender() @@ -53,16 +72,6 @@ class CollectionDM(override val title: String) : DisplayModelWithLayout() { val exo = Exposer(obj as TObject) data.add(exo.dynamise()) //if exposer is not dynamised, data access in Tabulator tables won't work } - // for the first element, invoke ObjectProperty & PropertyDescription links - if (rawData.size == 1) { - val tObj = obj as TObject - val properties = tObj.getProperties() - properties.forEach { - val opLink = it.getInvokeLink()!! - ResourceProxy().fetch(opLink, aggregator, referrer = referrer!!) - //FIXME is PropertyDescription automatically invoked? - } - } } override fun reset() { diff --git a/incubator/clients/kroviz/src/main/kotlin/org/apache/causeway/client/kroviz/core/model/CollectionLayout.kt b/incubator/clients/kroviz/src/main/kotlin/org/apache/causeway/client/kroviz/core/model/CollectionLayout.kt index 5cb4d4b08b..92f1a48ef1 100644 --- a/incubator/clients/kroviz/src/main/kotlin/org/apache/causeway/client/kroviz/core/model/CollectionLayout.kt +++ b/incubator/clients/kroviz/src/main/kotlin/org/apache/causeway/client/kroviz/core/model/CollectionLayout.kt @@ -18,14 +18,13 @@ */ package org.apache.causeway.client.kroviz.core.model -import org.apache.causeway.client.kroviz.core.aggregator.AggregatorWithLayout +import org.apache.causeway.client.kroviz.core.aggregator.CollectionAggregator import org.apache.causeway.client.kroviz.core.event.ResourceProxy -import org.apache.causeway.client.kroviz.to.ObjectProperty -import org.apache.causeway.client.kroviz.to.PropertyDescription import org.apache.causeway.client.kroviz.to.TObject +import org.apache.causeway.client.kroviz.to.bs.PropertyBs /** - * For (parented) collections aggregate information for each column + * For collections aggregate information for each column * in order to display the table, namely: * - columnName : column header/label * - id : attribute to be used to retrieve the value of each cell (id) @@ -33,16 +32,16 @@ import org.apache.causeway.client.kroviz.to.TObject */ class CollectionLayout : BaseLayout() { var id = "" - val propertySpecificationList = mutableListOf<PropertySpecification>() + var propertySpecificationList = mutableListOf<PropertySpecification>() override fun readyToRender(): Boolean { - console.log("[CL_readyToRender]") return isInitialized() && arePropertySpecificationsReadyToRender() } private fun arePropertySpecificationsReadyToRender():Boolean { propertySpecificationList.forEach { - if (!it.readyToRender()) { + val ready = it.readyToRender() + if (!ready) { return false } } @@ -53,13 +52,15 @@ class CollectionLayout : BaseLayout() { * collection layout needs only to be initialized once with an object (pars pro toto, prototype) * obj acts as a kind prototype - we assume all elements in the collection have the same structure */ - fun initColumns(obj: TObject) { + fun addObject(obj: TObject, aggregator: CollectionAggregator, referrer: String) { if (!isInitialized()) { // members contain all properties, regardless if hidden, disabled, etc. val members = obj.getProperties() members.forEach { m -> val ps = PropertySpecification(m) propertySpecificationList.add(ps) + val l = m.getInvokeLink()!! + ResourceProxy().fetch(l, aggregator, referrer = referrer) } } } @@ -68,31 +69,15 @@ class CollectionLayout : BaseLayout() { return propertySpecificationList.isNotEmpty() && propertySpecificationList.size > 0 } - override fun addObjectProperty( - objectProperty: ObjectProperty, - aggregator: AggregatorWithLayout, - referrer: String - ) { - console.log("[CL_addObjectProperty]") - val l = objectProperty.getDescriptionLink()!! - // FIXME NPE -> ISIS-2846 ? - //invoking DN links leads to an error - val isDn = l.href.contains("datanucleus") // Outdated? - if (!isDn) { - ResourceProxy().fetch(l, aggregator, referrer = referrer) - } - } - - override fun addPropertyDescription( - propertyDescription: PropertyDescription, - aggregator: AggregatorWithLayout, - referrer: String - ) { - console.log("[CL_addPropertyDescription]") - val id = propertyDescription.id + fun addPropertyDetails(propertyBs: PropertyBs) { + val id = propertyBs.id val ps: PropertySpecification = propertySpecificationList.firstOrNull { it.id == id }!! - console.log(ps) - ps.amendWith(propertyDescription) + ps.amendWith(propertyBs) } + // FIXME NPE -> ISIS-2846 ? + //FIXME hidden etc is not contained in ObjectProperty, see GidBs for the collection.protoType + // e.g. http://localhost:9090/restful/objects/demo.JavaLangStringEntity/356/object-layout + // furthermore, the column header can be taken from there as well + } \ No newline at end of file diff --git a/incubator/clients/kroviz/src/main/kotlin/org/apache/causeway/client/kroviz/core/model/ObjectDM.kt b/incubator/clients/kroviz/src/main/kotlin/org/apache/causeway/client/kroviz/core/model/ObjectDM.kt index b5242ecbcb..57a952fe52 100644 --- a/incubator/clients/kroviz/src/main/kotlin/org/apache/causeway/client/kroviz/core/model/ObjectDM.kt +++ b/incubator/clients/kroviz/src/main/kotlin/org/apache/causeway/client/kroviz/core/model/ObjectDM.kt @@ -82,7 +82,7 @@ class ObjectDM(override val title: String) : DisplayModelWithLayout() { obj.getProperties().forEach { m -> val p = createPropertyFrom(m) val op = ObjectProperty(p) - layout?.addObjectProperty(op, aggregator!!, referrer!!) +//FIXME layout?.addObjectProperty(op, aggregator!!, referrer!!) } } diff --git a/incubator/clients/kroviz/src/main/kotlin/org/apache/causeway/client/kroviz/core/model/ObjectLayout.kt b/incubator/clients/kroviz/src/main/kotlin/org/apache/causeway/client/kroviz/core/model/ObjectLayout.kt index d5023d6cd3..9ca18153de 100644 --- a/incubator/clients/kroviz/src/main/kotlin/org/apache/causeway/client/kroviz/core/model/ObjectLayout.kt +++ b/incubator/clients/kroviz/src/main/kotlin/org/apache/causeway/client/kroviz/core/model/ObjectLayout.kt @@ -18,13 +18,10 @@ */ package org.apache.causeway.client.kroviz.core.model -import org.apache.causeway.client.kroviz.core.aggregator.AggregatorWithLayout import org.apache.causeway.client.kroviz.core.aggregator.CollectionAggregator import org.apache.causeway.client.kroviz.core.aggregator.ObjectAggregator import org.apache.causeway.client.kroviz.core.event.ResourceProxy import org.apache.causeway.client.kroviz.to.Link -import org.apache.causeway.client.kroviz.to.ObjectProperty -import org.apache.causeway.client.kroviz.to.PropertyDescription import org.apache.causeway.client.kroviz.to.bs.CollectionBs import org.apache.causeway.client.kroviz.to.bs.GridBs import org.apache.causeway.client.kroviz.to.bs.RowBs @@ -49,24 +46,6 @@ class ObjectLayout : BaseLayout() { } } - override fun addObjectProperty( - objectProperty: ObjectProperty, - aggregator: AggregatorWithLayout, - referrer: String - ) { - // console.log("[OL_addObjectProperty]") -// TODO("Not yet implemented") - } - - override fun addPropertyDescription( - propertyDescription: PropertyDescription, - aggregator: AggregatorWithLayout, - referrer: String - ) { - console.log("[OL_addPropertyDescription]") -// TODO("Not yet implemented") - } - fun addGrid(grid: GridBs, aggregator: ObjectAggregator, referrer: String?) { this.grid = grid grid.rows.forEach { r -> diff --git a/incubator/clients/kroviz/src/main/kotlin/org/apache/causeway/client/kroviz/core/model/PropertySpecification.kt b/incubator/clients/kroviz/src/main/kotlin/org/apache/causeway/client/kroviz/core/model/PropertySpecification.kt index 346fc4e236..187d464294 100644 --- a/incubator/clients/kroviz/src/main/kotlin/org/apache/causeway/client/kroviz/core/model/PropertySpecification.kt +++ b/incubator/clients/kroviz/src/main/kotlin/org/apache/causeway/client/kroviz/core/model/PropertySpecification.kt @@ -19,8 +19,7 @@ package org.apache.causeway.client.kroviz.core.model import org.apache.causeway.client.kroviz.to.Member -import org.apache.causeway.client.kroviz.to.ObjectProperty -import org.apache.causeway.client.kroviz.to.PropertyDescription +import org.apache.causeway.client.kroviz.to.bs.PropertyBs /** * Properties have multiple aspects: @@ -33,42 +32,31 @@ import org.apache.causeway.client.kroviz.to.PropertyDescription * All are required in order to be correctly displayed (in a table). */ class PropertySpecification(member: Member) { - var id = "" + var id = member.id var name = "" // aka: columnName, named, label, title - var hidden = false - var disabled = false - var isPropertyDescriptionProcessed = false - var isObjectPropertyProcessed = true //FIXME + var hidden = true + var disabled = member.disabledReason.isNotEmpty() + var isAmendedFromBs = false + var typicalLength: Int = 10 - init { - id = member.id - name = member.id // can be changed later via property-description - hidden = false // can be changed later via ... - //FIXME - if (name == "sources" || name == "description" || name == "logicalTypeName") { - hidden = true - } - disabled = member.disabledReason.isNotEmpty() - } - fun amendWith(op: ObjectProperty) { - console.log("[PS_amendWith] ObjectProperty") - //TODO - } - - fun amendWith(pd: PropertyDescription) { - console.log("[PS_amendWith] PropertyDescription") - val ex = pd.extensions!! - val fn = ex.getFriendlyName() - if (fn.isNotEmpty()) { - name = fn + fun amendWith(pbs: PropertyBs) { + console.log("[PS_amendWith] PropertyBs") + name = pbs.named + hidden = !(pbs.hidden != null && pbs.hidden.isNotEmpty()) + if (pbs.typicalLength != null && pbs.typicalLength > 0) { + typicalLength = pbs.typicalLength.toInt() } - isPropertyDescriptionProcessed = true + isAmendedFromBs = true console.log(this) } fun readyToRender(): Boolean { - return isObjectPropertyProcessed && isPropertyDescriptionProcessed + return when (id) { + "logicalTypeName" -> true + "objectIdentifier" -> true + else -> isAmendedFromBs + } } } \ No newline at end of file diff --git a/incubator/clients/kroviz/src/test/resources/object-layout_collection.xml b/incubator/clients/kroviz/src/test/resources/object-layout_collection.xml new file mode 100644 index 0000000000..ab9044b4ca --- /dev/null +++ b/incubator/clients/kroviz/src/test/resources/object-layout_collection.xml @@ -0,0 +1,337 @@ +<bs:grid xmlns:cpt="http://causeway.apache.org/applib/layout/component" + xmlns:bs="http://causeway.apache.org/applib/layout/grid/bootstrap3" + xmlns:lnk="http://causeway.apache.org/applib/layout/links"> + <bs:row> + <bs:col span="10" unreferencedActions="true"> + <cpt:domainObject> + <cpt:link> + <lnk:rel>urn:org.restfulobjects:rels/element</lnk:rel> + <lnk:method>GET</lnk:method> + <lnk:href>http://localhost:9090/restful/objects/demo.JavaLangStringEntity/356</lnk:href> + <lnk:type>application/json;profile="urn:org.restfulobjects:repr-types/object"</lnk:type> + </cpt:link> + </cpt:domainObject> + <cpt:action id="actionReturning"> + <cpt:link> + <lnk:rel>urn:org.restfulobjects:rels/action</lnk:rel> + <lnk:method>GET</lnk:method> + <lnk:href> + http://localhost:9090/restful/objects/demo.JavaLangStringEntity/356/actions/actionReturning + </lnk:href> + <lnk:type>application/json;profile="urn:org.restfulobjects:repr-types/object-action"</lnk:type> + </cpt:link> + </cpt:action> + <cpt:action id="actionReturningCollection"> + <cpt:link> + <lnk:rel>urn:org.restfulobjects:rels/action</lnk:rel> + <lnk:method>GET</lnk:method> + <lnk:href> + http://localhost:9090/restful/objects/demo.JavaLangStringEntity/356/actions/actionReturningCollection + </lnk:href> + <lnk:type>application/json;profile="urn:org.restfulobjects:repr-types/object-action"</lnk:type> + </cpt:link> + </cpt:action> + <cpt:action cssClassFa="fa fa-fw fa-download" cssClassFaPosition="LEFT" id="downloadLayout"> + <cpt:named>Download Layout</cpt:named> + <cpt:describedAs>Downloads the Xxx.layout... layout file effective/inferred for this object + </cpt:describedAs> + <cpt:link> + <lnk:rel>urn:org.restfulobjects:rels/action</lnk:rel> + <lnk:method>GET</lnk:method> + <lnk:href> + http://localhost:9090/restful/objects/demo.JavaLangStringEntity/356/actions/downloadLayout + </lnk:href> + <lnk:type>application/json;profile="urn:org.restfulobjects:repr-types/object-action"</lnk:type> + </cpt:link> + </cpt:action> + <cpt:action cssClassFa="fa fa-fw fa-mask" cssClassFaPosition="LEFT" id="impersonate"> + <cpt:named>Impersonate</cpt:named> + <cpt:describedAs>Switch to another user account (for prototype/testing only)</cpt:describedAs> + <cpt:link> + <lnk:rel>urn:org.restfulobjects:rels/action</lnk:rel> + <lnk:method>GET</lnk:method> + <lnk:href>http://localhost:9090/restful/objects/demo.JavaLangStringEntity/356/actions/impersonate + </lnk:href> + <lnk:type>application/json;profile="urn:org.restfulobjects:repr-types/object-action"</lnk:type> + </cpt:link> + </cpt:action> + <cpt:action cssClassFa="fa fa-fw fa-mask" cssClassFaPosition="LEFT" id="impersonateWithRoles"> + <cpt:named>Impersonate With Roles</cpt:named> + <cpt:describedAs>Switch to another user account with specified roles (for prototype/testing only) + </cpt:describedAs> + <cpt:link> + <lnk:rel>urn:org.restfulobjects:rels/action</lnk:rel> + <lnk:method>GET</lnk:method> + <lnk:href> + http://localhost:9090/restful/objects/demo.JavaLangStringEntity/356/actions/impersonateWithRoles + </lnk:href> + <lnk:type>application/json;profile="urn:org.restfulobjects:repr-types/object-action"</lnk:type> + </cpt:link> + </cpt:action> + <cpt:action cssClassFa="fa fa-fw fa-bolt" cssClassFaPosition="LEFT" id="recentExecutions"> + <cpt:named>Recent Executions</cpt:named> + <cpt:link> + <lnk:rel>urn:org.restfulobjects:rels/action</lnk:rel> + <lnk:method>GET</lnk:method> + <lnk:href> + http://localhost:9090/restful/objects/demo.JavaLangStringEntity/356/actions/recentExecutions + </lnk:href> + <lnk:type>application/json;profile="urn:org.restfulobjects:repr-types/object-action"</lnk:type> + </cpt:link> + </cpt:action> + <cpt:action cssClassFa="fa fa-fw fa-bolt" cssClassFaPosition="LEFT" id="recentAuditTrailEntries"> + <cpt:named>Recent Audit Trail Entries</cpt:named> + <cpt:link> + <lnk:rel>urn:org.restfulobjects:rels/action</lnk:rel> + <lnk:method>GET</lnk:method> + <lnk:href> + http://localhost:9090/restful/objects/demo.JavaLangStringEntity/356/actions/recentAuditTrailEntries + </lnk:href> + <lnk:type>application/json;profile="urn:org.restfulobjects:repr-types/object-action"</lnk:type> + </cpt:link> + </cpt:action> + </bs:col> + <bs:col span="2"> + <cpt:fieldSet name="" id="sources"> + <cpt:property dateRenderAdjustDays="0" hidden="ALL_TABLES" id="sources" labelPosition="NONE"> + <cpt:named>Sources</cpt:named> + <cpt:link> + <lnk:rel>urn:org.restfulobjects:rels/property</lnk:rel> + <lnk:method>GET</lnk:method> + <lnk:href> + http://localhost:9090/restful/objects/demo.JavaLangStringEntity/356/properties/sources + </lnk:href> + <lnk:type>application/json;profile="urn:org.restfulobjects:repr-types/object-property" + </lnk:type> + </cpt:link> + </cpt:property> + </cpt:fieldSet> + </bs:col> + </bs:row> + <bs:row> + <bs:col span="6"> + <cpt:fieldSet name="Read Only Properties" id="read-only-properties"> + <cpt:property dateRenderAdjustDays="0" id="readOnlyProperty" labelPosition="LEFT" typicalLength="25"> + <cpt:link> + <lnk:rel>urn:org.restfulobjects:rels/property</lnk:rel> + <lnk:method>GET</lnk:method> + <lnk:href> + http://localhost:9090/restful/objects/demo.JavaLangStringEntity/356/properties/readOnlyProperty + </lnk:href> + <lnk:type>application/json;profile="urn:org.restfulobjects:repr-types/object-property" + </lnk:type> + </cpt:link> + </cpt:property> + </cpt:fieldSet> + <cpt:fieldSet name="Editable Properties" id="editable-properties"> + <cpt:property dateRenderAdjustDays="0" id="readWriteProperty" labelPosition="LEFT" typicalLength="25"> + <cpt:link> + <lnk:rel>urn:org.restfulobjects:rels/property</lnk:rel> + <lnk:method>GET</lnk:method> + <lnk:href> + http://localhost:9090/restful/objects/demo.JavaLangStringEntity/356/properties/readWriteProperty + </lnk:href> + <lnk:type>application/json;profile="urn:org.restfulobjects:repr-types/object-property" + </lnk:type> + </cpt:link> + </cpt:property> + </cpt:fieldSet> + <cpt:fieldSet name="Optional Properties" id="optional-properties"> + <cpt:property dateRenderAdjustDays="0" id="readOnlyOptionalProperty" labelPosition="LEFT" + typicalLength="25"> + <cpt:link> + <lnk:rel>urn:org.restfulobjects:rels/property</lnk:rel> + <lnk:method>GET</lnk:method> + <lnk:href> + http://localhost:9090/restful/objects/demo.JavaLangStringEntity/356/properties/readOnlyOptionalProperty + </lnk:href> + <lnk:type>application/json;profile="urn:org.restfulobjects:repr-types/object-property" + </lnk:type> + </cpt:link> + </cpt:property> + <cpt:property dateRenderAdjustDays="0" id="readWriteOptionalProperty" labelPosition="LEFT" + typicalLength="25"> + <cpt:link> + <lnk:rel>urn:org.restfulobjects:rels/property</lnk:rel> + <lnk:method>GET</lnk:method> + <lnk:href> + http://localhost:9090/restful/objects/demo.JavaLangStringEntity/356/properties/readWriteOptionalProperty + </lnk:href> + <lnk:type>application/json;profile="urn:org.restfulobjects:repr-types/object-property" + </lnk:type> + </cpt:link> + </cpt:property> + </cpt:fieldSet> + <cpt:fieldSet name="Contributed by Mixins" id="contributed"> + <cpt:property dateRenderAdjustDays="0" hidden="ALL_TABLES" id="mixinProperty" typicalLength="25"> + <cpt:named>Mixin Property</cpt:named> + <cpt:link> + <lnk:rel>urn:org.restfulobjects:rels/property</lnk:rel> + <lnk:method>GET</lnk:method> + <lnk:href> + http://localhost:9090/restful/objects/demo.JavaLangStringEntity/356/properties/mixinProperty + </lnk:href> + <lnk:type>application/json;profile="urn:org.restfulobjects:repr-types/object-property" + </lnk:type> + </cpt:link> + </cpt:property> + </cpt:fieldSet> + <cpt:fieldSet name="@PropertyLayout(labelPosition=...)" id="label-positions"> + <cpt:property dateRenderAdjustDays="0" hidden="ALL_TABLES" id="readOnlyPropertyDerivedLabelPositionLeft" + labelPosition="LEFT" typicalLength="25"> + <cpt:describedAs>@PropertyLayout(labelPosition=LEFT)</cpt:describedAs> + <cpt:link> + <lnk:rel>urn:org.restfulobjects:rels/property</lnk:rel> + <lnk:method>GET</lnk:method> + <lnk:href> + http://localhost:9090/restful/objects/demo.JavaLangStringEntity/356/properties/readOnlyPropertyDerivedLabelPositionLeft + </lnk:href> + <lnk:type>application/json;profile="urn:org.restfulobjects:repr-types/object-property" + </lnk:type> + </cpt:link> + </cpt:property> + <cpt:property dateRenderAdjustDays="0" hidden="ALL_TABLES" id="readOnlyPropertyDerivedLabelPositionTop" + labelPosition="TOP" typicalLength="25"> + <cpt:describedAs>@PropertyLayout(labelPosition=TOP)</cpt:describedAs> + <cpt:link> + <lnk:rel>urn:org.restfulobjects:rels/property</lnk:rel> + <lnk:method>GET</lnk:method> + <lnk:href> + http://localhost:9090/restful/objects/demo.JavaLangStringEntity/356/properties/readOnlyPropertyDerivedLabelPositionTop + </lnk:href> + <lnk:type>application/json;profile="urn:org.restfulobjects:repr-types/object-property" + </lnk:type> + </cpt:link> + </cpt:property> + <cpt:property dateRenderAdjustDays="0" hidden="ALL_TABLES" + id="readOnlyPropertyDerivedLabelPositionRight" labelPosition="RIGHT" typicalLength="25"> + <cpt:describedAs>@PropertyLayout(labelPosition=RIGHT)</cpt:describedAs> + <cpt:link> + <lnk:rel>urn:org.restfulobjects:rels/property</lnk:rel> + <lnk:method>GET</lnk:method> + <lnk:href> + http://localhost:9090/restful/objects/demo.JavaLangStringEntity/356/properties/readOnlyPropertyDerivedLabelPositionRight + </lnk:href> + <lnk:type>application/json;profile="urn:org.restfulobjects:repr-types/object-property" + </lnk:type> + </cpt:link> + </cpt:property> + <cpt:property dateRenderAdjustDays="0" hidden="ALL_TABLES" id="readOnlyPropertyDerivedLabelPositionNone" + labelPosition="NONE" typicalLength="25"> + <cpt:describedAs>@PropertyLayout(labelPosition=NONE)</cpt:describedAs> + <cpt:link> + <lnk:rel>urn:org.restfulobjects:rels/property</lnk:rel> + <lnk:method>GET</lnk:method> + <lnk:href> + http://localhost:9090/restful/objects/demo.JavaLangStringEntity/356/properties/readOnlyPropertyDerivedLabelPositionNone + </lnk:href> + <lnk:type>application/json;profile="urn:org.restfulobjects:repr-types/object-property" + </lnk:type> + </cpt:link> + </cpt:property> + </cpt:fieldSet> + <cpt:fieldSet name="Other" id="other" unreferencedProperties="true"/> + </bs:col> + <bs:col span="6"> + <cpt:fieldSet name="Description" id="description"> + <cpt:action id="clearHints" position="PANEL"> + <cpt:metadataError>No such action</cpt:metadataError> + <cpt:link> + <lnk:rel>urn:org.restfulobjects:rels/action</lnk:rel> + <lnk:method>GET</lnk:method> + <lnk:href> + http://localhost:9090/restful/objects/demo.JavaLangStringEntity/356/actions/clearHints + </lnk:href> + <lnk:type>application/json;profile="urn:org.restfulobjects:repr-types/object-action"</lnk:type> + </cpt:link> + </cpt:action> + <cpt:action id="downloadLayoutXml" position="PANEL_DROPDOWN"> + <cpt:metadataError>No such action</cpt:metadataError> + <cpt:link> + <lnk:rel>urn:org.restfulobjects:rels/action</lnk:rel> + <lnk:method>GET</lnk:method> + <lnk:href> + http://localhost:9090/restful/objects/demo.JavaLangStringEntity/356/actions/downloadLayoutXml + </lnk:href> + <lnk:type>application/json;profile="urn:org.restfulobjects:repr-types/object-action"</lnk:type> + </cpt:link> + </cpt:action> + <cpt:action id="rebuildMetamodel" position="PANEL"> + <cpt:link> + <lnk:rel>urn:org.restfulobjects:rels/action</lnk:rel> + <lnk:method>GET</lnk:method> + <lnk:href> + http://localhost:9090/restful/objects/demo.JavaLangStringEntity/356/actions/rebuildMetamodel + </lnk:href> + <lnk:type>application/json;profile="urn:org.restfulobjects:repr-types/object-action"</lnk:type> + </cpt:link> + </cpt:action> + <cpt:action id="downloadMetamodelXml" position="PANEL_DROPDOWN"> + <cpt:link> + <lnk:rel>urn:org.restfulobjects:rels/action</lnk:rel> + <lnk:method>GET</lnk:method> + <lnk:href> + http://localhost:9090/restful/objects/demo.JavaLangStringEntity/356/actions/downloadMetamodelXml + </lnk:href> + <lnk:type>application/json;profile="urn:org.restfulobjects:repr-types/object-action"</lnk:type> + </cpt:link> + </cpt:action> + <cpt:action id="inspectMetamodel" position="PANEL_DROPDOWN"> + <cpt:link> + <lnk:rel>urn:org.restfulobjects:rels/action</lnk:rel> + <lnk:method>GET</lnk:method> + <lnk:href> + http://localhost:9090/restful/objects/demo.JavaLangStringEntity/356/actions/inspectMetamodel + </lnk:href> + <lnk:type>application/json;profile="urn:org.restfulobjects:repr-types/object-action"</lnk:type> + </cpt:link> + </cpt:action> + <cpt:action id="recentCommands" position="PANEL_DROPDOWN"> + <cpt:link> + <lnk:rel>urn:org.restfulobjects:rels/action</lnk:rel> + <lnk:method>GET</lnk:method> + <lnk:href> + http://localhost:9090/restful/objects/demo.JavaLangStringEntity/356/actions/recentCommands + </lnk:href> + <lnk:type>application/json;profile="urn:org.restfulobjects:repr-types/object-action"</lnk:type> + </cpt:link> + </cpt:action> + <cpt:action id="downloadJdoMetadata" position="PANEL_DROPDOWN"> + <cpt:metadataError>No such action</cpt:metadataError> + <cpt:link> + <lnk:rel>urn:org.restfulobjects:rels/action</lnk:rel> + <lnk:method>GET</lnk:method> + <lnk:href> + http://localhost:9090/restful/objects/demo.JavaLangStringEntity/356/actions/downloadJdoMetadata + </lnk:href> + <lnk:type>application/json;profile="urn:org.restfulobjects:repr-types/object-action"</lnk:type> + </cpt:link> + </cpt:action> + <cpt:action id="openRestApi" position="PANEL_DROPDOWN"> + <cpt:link> + <lnk:rel>urn:org.restfulobjects:rels/action</lnk:rel> + <lnk:method>GET</lnk:method> + <lnk:href> + http://localhost:9090/restful/objects/demo.JavaLangStringEntity/356/actions/openRestApi + </lnk:href> + <lnk:type>application/json;profile="urn:org.restfulobjects:repr-types/object-action"</lnk:type> + </cpt:link> + </cpt:action> + <cpt:property dateRenderAdjustDays="0" id="description"> + <cpt:link> + <lnk:rel>urn:org.restfulobjects:rels/property</lnk:rel> + <lnk:method>GET</lnk:method> + <lnk:href> + http://localhost:9090/restful/objects/demo.JavaLangStringEntity/356/properties/description + </lnk:href> + <lnk:type>application/json;profile="urn:org.restfulobjects:repr-types/object-property" + </lnk:type> + </cpt:link> + </cpt:property> + </cpt:fieldSet> + </bs:col> + </bs:row> + <bs:row> + <bs:col span="12" unreferencedCollections="true"/> + </bs:row> +</bs:grid> \ No newline at end of file
