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


Reply via email to