You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@isis.apache.org by jo...@apache.org on 2021/09/10 11:01:17 UTC

[isis] branch master updated (93e759e -> 4b97e55)

This is an automated email from the ASF dual-hosted git repository.

joergrade pushed a change to branch master
in repository https://gitbox.apache.org/repos/asf/isis.git.


    from 93e759e  ISIS-2774: fixes annotation processing if having both field and getter annotated
     new f463470  ISIS-2846 Create a LinkTreeDiagram (via PlantUML mindmap) from History/LogEntry
     new c7a3900  ISIS-2846 Referrer introduced for easier link tree re-construction
     new f848f38  ISIS-2846 link tree diagram works
     new d80c042  ISIS-2846 link tree diagram works correctly
     new 8ce7c80  ISIS-2846 link tree diagram works correctly, including extension properties
     new 290c681  ISIS-2846 link tree diagram / clean up
     new 4b97e55  Merge branch 'master' of https://github.com/apache/isis

The 7 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.


Summary of changes:
 .../kroviz/core/aggregator/ActionDispatcher.kt     |  19 +--
 .../kroviz/core/aggregator/AggregatorWithLayout.kt |  24 ++-
 .../kroviz/core/aggregator/BaseAggregator.kt       |  11 +-
 .../kroviz/core/aggregator/CollectionAggregator.kt |  44 +++---
 .../core/aggregator/DomainTypesAggregator.kt       |   4 +-
 .../kroviz/core/aggregator/ObjectAggregator.kt     |  22 +--
 .../kroviz/core/aggregator/RestfulDispatcher.kt    |   4 +-
 .../isis/client/kroviz/core/event/EventStore.kt    |   4 +-
 .../isis/client/kroviz/core/event/LogEntry.kt      |  18 ++-
 .../client/kroviz/core/event/LogEntryDecorator.kt  | 161 ---------------------
 .../isis/client/kroviz/core/event/ResourceProxy.kt |  48 +++---
 .../kroviz/core/event/ResourceSpecification.kt     |   3 +-
 .../client/kroviz/ui/diagram/LinkTreeDiagram.kt    | 116 +++++++++++----
 .../isis/client/kroviz/ui/diagram/PumlCode.kt      |  97 +++++++++++++
 .../apache/isis/client/kroviz/ui/diagram/Tree.kt   |  53 ++++---
 .../isis/client/kroviz/ui/dialog/DiagramDialog.kt  |  27 +++-
 .../isis/client/kroviz/ui/dialog/EventLogDetail.kt |  43 ++----
 .../client/kroviz/ui/panel/DynamicMenuBuilder.kt   |  15 +-
 .../apache/isis/client/kroviz/utils/StringUtils.kt |  12 ++
 .../kroviz/core/event/LogEntryDecoratorTest.kt     |   4 +-
 .../isis/client/kroviz/core/event/LogEntryTest.kt  |   4 +-
 .../isis/client/kroviz/ui/diagram/TreeTest.kt      |  56 +++++++
 .../isis/client/kroviz/util/StringUtilsTest.kt     |  24 +++
 23 files changed, 472 insertions(+), 341 deletions(-)
 delete mode 100644 incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/core/event/LogEntryDecorator.kt
 create mode 100644 incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/ui/diagram/PumlCode.kt
 copy core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/validator/MetaModelValidatorForAmbiguousMixinAnnotations.java => incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/ui/diagram/Tree.kt (51%)
 copy api/applib/src/test/java/org/apache/isis/applib/SomeDomainClass.java => incubator/clients/kroviz/src/test/kotlin/org/apache/isis/client/kroviz/core/event/LogEntryDecoratorTest.kt (91%)
 create mode 100644 incubator/clients/kroviz/src/test/kotlin/org/apache/isis/client/kroviz/ui/diagram/TreeTest.kt
 create mode 100644 incubator/clients/kroviz/src/test/kotlin/org/apache/isis/client/kroviz/util/StringUtilsTest.kt

[isis] 02/07: ISIS-2846 Referrer introduced for easier link tree re-construction

Posted by jo...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

joergrade pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/isis.git

commit c7a3900a8a50d42f00209a4c93caf18b3934474b
Author: Jörg Rade <jo...@kuehne-nagel.com>
AuthorDate: Mon Sep 6 15:23:24 2021 +0200

    ISIS-2846 Referrer introduced for easier link tree re-construction
---
 .../kroviz/core/aggregator/ActionDispatcher.kt     | 19 +++---
 .../kroviz/core/aggregator/AggregatorWithLayout.kt | 22 ++++--
 .../kroviz/core/aggregator/BaseAggregator.kt       | 11 ++-
 .../kroviz/core/aggregator/CollectionAggregator.kt | 44 ++++++------
 .../core/aggregator/DomainTypesAggregator.kt       |  4 +-
 .../kroviz/core/aggregator/ObjectAggregator.kt     | 22 +++---
 .../kroviz/core/aggregator/RestfulDispatcher.kt    |  4 +-
 .../isis/client/kroviz/core/event/EventStore.kt    |  4 +-
 .../isis/client/kroviz/core/event/LogEntry.kt      | 16 ++---
 .../client/kroviz/core/event/LogEntryDecorator.kt  | 35 ++++++++++
 .../isis/client/kroviz/core/event/ResourceProxy.kt | 16 +++--
 .../kroviz/core/event/ResourceSpecification.kt     |  3 +-
 .../client/kroviz/ui/diagram/LinkTreeDiagram.kt    | 55 ++++++++++-----
 .../apache/isis/client/kroviz/ui/diagram/Node.kt   | 30 +++++++++
 .../isis/client/kroviz/ui/diagram/PumlCode.kt      | 78 ++++++++++++++++++++++
 15 files changed, 277 insertions(+), 86 deletions(-)

diff --git a/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/core/aggregator/ActionDispatcher.kt b/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/core/aggregator/ActionDispatcher.kt
index aaf1ec0..68603d9 100644
--- a/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/core/aggregator/ActionDispatcher.kt
+++ b/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/core/aggregator/ActionDispatcher.kt
@@ -20,8 +20,8 @@ package org.apache.isis.client.kroviz.core.aggregator
 
 import org.apache.isis.client.kroviz.core.event.LogEntry
 import org.apache.isis.client.kroviz.to.*
-import org.apache.isis.client.kroviz.ui.dialog.ActionPrompt
 import org.apache.isis.client.kroviz.ui.core.Constants
+import org.apache.isis.client.kroviz.ui.dialog.ActionPrompt
 import org.apache.isis.client.kroviz.utils.Point
 import org.apache.isis.client.kroviz.utils.StringUtils
 
@@ -29,14 +29,15 @@ class ActionDispatcher(private val at: Point = Point(100, 100)) : BaseAggregator
 
     override fun update(logEntry: LogEntry, subType: String) {
         val to = logEntry.getTransferObject()
+        val referrer = logEntry.url
         when {
             to is Action -> {
                 to.links.forEach { link ->
                     if (link.isInvokeAction()) {
                         when (link.method) {
-                            Method.GET.name -> process(to, link)
-                            Method.POST.name -> invoke(to, link)
-                            Method.PUT.name -> process(to, link)
+                            Method.GET.name -> process(to, link, referrer = referrer)
+                            Method.POST.name -> invoke(to, link, referrer = referrer)
+                            Method.PUT.name -> process(to, link, referrer = referrer)
                         }
                     }
                 }
@@ -54,17 +55,17 @@ class ActionDispatcher(private val at: Point = Point(100, 100)) : BaseAggregator
         }
     }
 
-    private fun process(action: Action, link: Link, aggregator: BaseAggregator = this) {
+    private fun process(action: Action, link: Link, aggregator: BaseAggregator = this, referrer: String) {
         when {
             link.hasArguments() -> ActionPrompt(action = action).open(at)
-            link.relation() == Relation.INVOKE -> invoke(action, link)
-            else -> invoke(link, aggregator)
+            link.relation() == Relation.INVOKE -> invoke(action, link, referrer)
+            else -> invoke(link, aggregator, referrer = referrer)
         }
     }
 
-    private fun invoke(action: Action, link: Link) {
+    private fun invoke(action: Action, link: Link, referrer: String) {
         val title = StringUtils.deCamel(action.id)
-        invoke(link, ObjectAggregator(title))
+        invoke(link, ObjectAggregator(title), referrer = referrer)
     }
 
     /**
diff --git a/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/core/aggregator/AggregatorWithLayout.kt b/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/core/aggregator/AggregatorWithLayout.kt
index 46998dc..4bea388 100644
--- a/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/core/aggregator/AggregatorWithLayout.kt
+++ b/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/core/aggregator/AggregatorWithLayout.kt
@@ -1,5 +1,6 @@
 package org.apache.isis.client.kroviz.core.aggregator
 
+import org.apache.isis.client.kroviz.core.event.LogEntry
 import org.apache.isis.client.kroviz.core.model.DisplayModelWithLayout
 import org.apache.isis.client.kroviz.layout.Layout
 import org.apache.isis.client.kroviz.to.Represention
@@ -7,8 +8,15 @@ import org.apache.isis.client.kroviz.to.TObject
 import org.apache.isis.client.kroviz.ui.core.Constants
 
 abstract class AggregatorWithLayout : BaseAggregator() {
+    // parentUrl is to be set in update
+    // and to be used in subsequent invocations
+    var parentUrl: String? = null
 
-    protected fun handleLayout(layout: Layout, dm: DisplayModelWithLayout) {
+    override fun update(logEntry: LogEntry, subType: String) {
+        parentUrl = logEntry.url
+    }
+
+    protected fun handleLayout(layout: Layout, dm: DisplayModelWithLayout, referrer: String) {
         if (dm.layout == null) {
             dm.addLayout(layout)
             dm.properties.propertyLayoutList.forEach { p ->
@@ -19,25 +27,25 @@ abstract class AggregatorWithLayout : BaseAggregator() {
                     val isDn = l.href.contains("datanucleus")
                     if (!isDn) {
                         //invoking DN links leads to an error
-                        invoke(l, this)
+                        invoke(l, this, referrer = referrer)
                     }
                 }
             }
         }
     }
 
-    protected fun invokeLayoutLink(obj: TObject, aggregator: AggregatorWithLayout) {
+    protected fun invokeLayoutLink(obj: TObject, aggregator: AggregatorWithLayout, referrer :String) {
         val l = obj.getLayoutLink()
         if (l.representation() == Represention.OBJECT_LAYOUT_BS3) {
-            invoke(l, aggregator, Constants.subTypeXml)
+            invoke(l, aggregator, Constants.subTypeXml, referrer)
         } else {
-            invoke(l, aggregator)
+            invoke(l, aggregator, referrer = referrer)
         }
     }
 
-    protected fun invokeIconLink(obj: TObject, aggregator: AggregatorWithLayout) {
+    protected fun invokeIconLink(obj: TObject, aggregator: AggregatorWithLayout, referrer: String) {
         val l = obj.getIconLink()!!
-        invoke(l, aggregator)
+        invoke(l, aggregator, referrer = referrer)
     }
 
 }
diff --git a/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/core/aggregator/BaseAggregator.kt b/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/core/aggregator/BaseAggregator.kt
index 46f4262..edbe93b 100644
--- a/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/core/aggregator/BaseAggregator.kt
+++ b/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/core/aggregator/BaseAggregator.kt
@@ -58,7 +58,8 @@ abstract class BaseAggregator {
         logEntry.setUndefined("no handler found")
         console.log("[BaseAggregator.log] ")
         console.log(logEntry)
-        throw Throwable("no handler found: ${this::class.simpleName}")
+        val className = this::class.simpleName
+        throw Throwable("no handler found: $className")
     }
 
     fun TObject.getLayoutLink(): Link? {
@@ -82,8 +83,12 @@ abstract class BaseAggregator {
         return href.isNotEmpty() && href.endsWith("object-icon")
     }
 
-    protected fun invoke(link: Link, aggregator: BaseAggregator, subType: String = Constants.subTypeJson) {
-        ResourceProxy().fetch(link, aggregator, subType)
+    protected fun invoke(
+            link: Link,
+            aggregator: BaseAggregator,
+            subType: String = Constants.subTypeJson,
+            referrer: String) {
+        ResourceProxy().fetch(link, aggregator, subType, referrer = referrer)
     }
 
 }
diff --git a/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/core/aggregator/CollectionAggregator.kt b/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/core/aggregator/CollectionAggregator.kt
index 99f19b2..fe833c6 100644
--- a/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/core/aggregator/CollectionAggregator.kt
+++ b/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/core/aggregator/CollectionAggregator.kt
@@ -21,6 +21,7 @@ package org.apache.isis.client.kroviz.core.aggregator
 import org.apache.isis.client.kroviz.core.event.EventState
 import org.apache.isis.client.kroviz.core.event.LogEntry
 import org.apache.isis.client.kroviz.core.event.ResourceProxy
+import org.apache.isis.client.kroviz.core.event.ResourceSpecification
 import org.apache.isis.client.kroviz.core.model.CollectionDM
 import org.apache.isis.client.kroviz.layout.Layout
 import org.apache.isis.client.kroviz.to.*
@@ -41,20 +42,21 @@ class CollectionAggregator(actionTitle: String, val parent: ObjectAggregator? =
     }
 
     override fun update(logEntry: LogEntry, subType: String) {
-
+        super.update(logEntry, subType)
         if (logEntry.state == EventState.DUPLICATE) {
             console.log("[CollectionAggregator.update] TODO duplicates should not be propagated to handlers")
             //TODO this may not hold true for changed and deleted objects - object version required to deal with it?
         } else {
+            val referrer = logEntry.url
             when (val obj = logEntry.getTransferObject()) {
                 null -> log(logEntry)
-                is ResultList -> handleList(obj)
-                is TObject -> handleObject(obj)
-                is DomainType -> handleDomainType(obj)
-                is Layout -> handleLayout(obj, dpm as CollectionDM)
+                is ResultList -> handleList(obj, referrer)
+                is TObject -> handleObject(obj, referrer)
+                is DomainType -> handleDomainType(obj, referrer)
+                is Layout -> handleLayout(obj, dpm as CollectionDM, referrer)
                 is Grid -> handleGrid(obj)
-                is Property -> handleProperty(obj)
-                is Collection -> handleCollection(obj)
+                is Property -> handleProperty(obj, referrer)
+                is Collection -> handleCollection(obj, referrer)
                 is Icon -> handleIcon(obj)
                 else -> log(logEntry)
             }
@@ -64,41 +66,41 @@ class CollectionAggregator(actionTitle: String, val parent: ObjectAggregator? =
                     UiManager.openCollectionView(this)
                 }
             } else {
-                val le = LogEntry("")
+                val le = LogEntry(ResourceSpecification(""))
                 parent.update(le, subType)
             }
         }
     }
 
-    private fun handleList(resultList: ResultList) {
+    private fun handleList(resultList: ResultList, referrer: String) {
         if (resultList.resulttype != ResultType.VOID.type) {
             val result = resultList.result!!
             result.value.forEach {
-                invoke(it, this)
+                invoke(it, this, referrer = referrer)
             }
         }
     }
 
-    private fun handleObject(obj: TObject) {
+    private fun handleObject(obj: TObject, referrer: String) {
         dpm.addData(obj)
-        invokeLayoutLink(obj, this)
-        invokeIconLink(obj, this)
+        invokeLayoutLink(obj, this, referrer = referrer)
+        invokeIconLink(obj, this, referrer = referrer)
     }
 
     private fun handleIcon(obj: TransferObject?) {
         (dpm as CollectionDM).addIcon(obj)
     }
 
-    private fun handleDomainType(obj: DomainType) {
+    private fun handleDomainType(obj: DomainType, referrer: String) {
         obj.links.forEach {
             if (it.relation() == Relation.LAYOUT) {
-                invoke(it, this)
+                invoke(it, this, referrer = referrer)
             }
         }
         obj.members.forEach {
             val m = it.value
             if (m.isProperty()) {
-                invoke(m, this)
+                invoke(m, this, referrer = referrer)
             }
         }
     }
@@ -107,7 +109,7 @@ class CollectionAggregator(actionTitle: String, val parent: ObjectAggregator? =
         (dpm as CollectionDM).grid = grid
     }
 
-    private fun handleProperty(p: Property) {
+    private fun handleProperty(p: Property, referrer: String) {
         val dm = dpm as CollectionDM
         if (p.isPropertyDescription()) {
             dm.addPropertyDescription(p)
@@ -115,19 +117,19 @@ class CollectionAggregator(actionTitle: String, val parent: ObjectAggregator? =
             dm.addProperty(p)
             val pdl = p.descriptionLink()
             if (pdl != null) {
-                invoke(pdl, this)
+                invoke(pdl, this, referrer = referrer)
             }
         }
     }
 
-    private fun handleCollection(collection: Collection) {
+    private fun handleCollection(collection: Collection, referrer: String) {
         collection.links.forEach {
             if (it.relation() == Relation.DESCRIBED_BY) {
-                ResourceProxy().fetch(it, this)
+                ResourceProxy().fetch(it, this, referrer = referrer)
             }
         }
         collection.value.forEach {
-            ResourceProxy().fetch(it, this)
+            ResourceProxy().fetch(it, this, referrer = referrer)
         }
     }
 
diff --git a/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/core/aggregator/DomainTypesAggregator.kt b/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/core/aggregator/DomainTypesAggregator.kt
index a3b2fc6..07be0ed 100644
--- a/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/core/aggregator/DomainTypesAggregator.kt
+++ b/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/core/aggregator/DomainTypesAggregator.kt
@@ -63,7 +63,7 @@ class DomainTypesAggregator(val url: String) : BaseAggregator() {
             }
             (dpm as DiagramDM).incNumberOfProperties(propertyList.size)
             propertyList.forEach {
-                invoke(it.value, this)
+                invoke(it.value, this, referrer = "")
             }
         }
     }
@@ -102,7 +102,7 @@ class DomainTypesAggregator(val url: String) : BaseAggregator() {
         }
         (dpm as DiagramDM).numberOfClasses = domainTypeLinkList.size
         domainTypeLinkList.forEach {
-            invoke(it, this)
+            invoke(it, this, referrer = "")
         }
     }
 
diff --git a/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/core/aggregator/ObjectAggregator.kt b/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/core/aggregator/ObjectAggregator.kt
index c09a0e3..80225fd 100644
--- a/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/core/aggregator/ObjectAggregator.kt
+++ b/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/core/aggregator/ObjectAggregator.kt
@@ -43,12 +43,14 @@ class ObjectAggregator(val actionTitle: String) : AggregatorWithLayout() {
     }
 
     override fun update(logEntry: LogEntry, subType: String) {
+        super.update(logEntry, subType)
         if (!logEntry.isUpdatedFromParentedCollection()) {
+            val referrer = logEntry.url
             when (val obj = logEntry.getTransferObject()) {
-                is TObject -> handleObject(obj)
+                is TObject -> handleObject(obj, referrer)
                 is ResultObject -> handleResultObject(obj)
                 is Property -> handleProperty(obj)
-                is Layout -> handleLayout(obj, dpm as ObjectDM)
+                is Layout -> handleLayout(obj, dpm as ObjectDM, referrer)
                 is Grid -> handleGrid(obj)
                 is HttpError -> ErrorDialog(logEntry).open()
                 else -> log(logEntry)
@@ -71,25 +73,25 @@ class ObjectAggregator(val actionTitle: String) : AggregatorWithLayout() {
         }
     }
 
-    fun handleObject(obj: TObject) {
+    fun handleObject(obj: TObject, referrer : String) {
         // After ~/action/invoke is called, the actual object instance (containing properties) needs to be invoked as well.
         // Note that rel.self/href is identical and both are of type TObject. logEntry.url is different, though.
         if (obj.getProperties().size == 0) {
-            invokeInstance(obj)
+            invokeInstance(obj, referrer)
         } else {
             dpm.addData(obj)
         }
         if (collectionMap.isEmpty()) {
-            handleCollections(obj)
+            handleCollections(obj, referrer)
         }
-        invokeLayoutLink(obj, this)
+        invokeLayoutLink(obj, this, referrer = referrer)
     }
 
-    private fun invokeInstance(obj: TObject) {
+    private fun invokeInstance(obj: TObject, referrer: String) {
         val selfLink = obj.links.find { l ->
             l.relation() == Relation.SELF
         }
-        invoke(selfLink!!, this)
+        invoke(selfLink!!, this, referrer = referrer)
     }
 
     fun handleResultObject(resultObject: ResultObject) {
@@ -100,13 +102,13 @@ class ObjectAggregator(val actionTitle: String) : AggregatorWithLayout() {
         return dpm.getObject()
     }
 
-    private fun handleCollections(obj: TObject) {
+    private fun handleCollections(obj: TObject, referrer: String) {
         obj.getCollections().forEach {
             val key = it.id
             val aggregator = CollectionAggregator(key, this)
             collectionMap.put(key, aggregator)
             val link = it.links.first()
-            ResourceProxy().fetch(link, aggregator)
+            ResourceProxy().fetch(link, aggregator, referrer = referrer)
         }
     }
 
diff --git a/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/core/aggregator/RestfulDispatcher.kt b/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/core/aggregator/RestfulDispatcher.kt
index 1412c7f..13214f0 100644
--- a/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/core/aggregator/RestfulDispatcher.kt
+++ b/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/core/aggregator/RestfulDispatcher.kt
@@ -40,11 +40,11 @@ class RestfulDispatcher() : BaseAggregator() {
     }
 
     private fun invokeNavigation(it: Link) {
-        invoke(it, NavigationDispatcher())
+        invoke(it, NavigationDispatcher(), referrer = "")
     }
 
     private fun invokeSystem(it: Link) {
-        invoke(it, SystemAggregator())
+        invoke(it, SystemAggregator(), referrer = "")
     }
 
 }
diff --git a/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/core/event/EventStore.kt b/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/core/event/EventStore.kt
index b8fa60a..80f212f 100644
--- a/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/core/event/EventStore.kt
+++ b/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/core/event/EventStore.kt
@@ -52,7 +52,7 @@ object EventStore {
               method: String,
               body: String = "",
               aggregator: BaseAggregator? = null): LogEntry {
-        val entry = LogEntry(reSpec.url, method, request = body, subType = reSpec.subType)
+        val entry = LogEntry(reSpec, method, request = body)
         if (aggregator != null) {
             entry.addAggregator(aggregator)
         }
@@ -62,7 +62,7 @@ object EventStore {
     }
 
     fun add(reSpec: ResourceSpecification) {
-        val entry = LogEntry(url = reSpec.url)
+        val entry = LogEntry(reSpec)
         log(entry)
         updateStatus(entry)
     }
diff --git a/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/core/event/LogEntry.kt b/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/core/event/LogEntry.kt
index a7db164..b53d774 100644
--- a/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/core/event/LogEntry.kt
+++ b/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/core/event/LogEntry.kt
@@ -52,11 +52,13 @@ enum class EventState(val id: String, val iconName: String, val style: ButtonSty
 
 @Serializable
 data class LogEntry(
-        val url: String,
+        @Contextual val rs: ResourceSpecification,
         val method: String? = "",
         val request: String = "",
-        val subType: String = Constants.subTypeJson,
         @Contextual val createdAt: Date = Date()) {
+    val url:String = rs.url
+    val referrer = rs.referrerUrl
+    val subType = rs.subType
     var state = EventState.INITIAL
     var title: String = ""
     var requestLength: Int = 0 // must be accessible (public) for LogEntryTable
@@ -99,7 +101,7 @@ data class LogEntry(
 
     // alternative constructor for UI events (eg. from user interaction)
     @JsName("secondaryConstructor")
-    constructor(title: String, aggregator: BaseAggregator) : this("", "", "") {
+    constructor(title: String, aggregator: BaseAggregator) : this(ResourceSpecification(""), "", "") {
         this.title = title
         this.addAggregator(aggregator)
         state = EventState.VIEW
@@ -178,7 +180,6 @@ data class LogEntry(
         }
     }
 
-
 // region response
     /**
      * This is for access from the views only.
@@ -250,12 +251,9 @@ data class LogEntry(
         return null
     }
 
-    fun upLink(): Link? {
-        getLinks().forEach { if (it.relation() == Relation.UP) return it }
-        return null
-    }
-
     fun getLinks(): List<Link> {
+//        console.log("[LE.getLinks]")
+//        console.log(obj)
         return if (obj is HasLinks) {
             (obj as HasLinks).getLinks()
         } else {
diff --git a/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/core/event/LogEntryDecorator.kt b/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/core/event/LogEntryDecorator.kt
index 68e9626..f891eeb 100644
--- a/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/core/event/LogEntryDecorator.kt
+++ b/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/core/event/LogEntryDecorator.kt
@@ -73,6 +73,39 @@ class LogEntryDecorator(val logEntry: LogEntry) {
         return children
     }
 
+    fun findChildrenOfLogEntry(): List<LogEntry> {
+        console.log("[LED.findChildrenOfLogEntry]")
+        val children = mutableListOf<LogEntry>()
+        val links = logEntry.getLinks()
+        console.log("[links] ->")
+        console.log(links)
+        console.log(links.size)
+        links.forEach {
+            console.log(it.toString())
+            when (it.relation()) {
+                Relation.UP -> {
+                }
+                Relation.SELF -> {
+                }
+                else -> {
+                    val url = it.href
+                    console.log(url)
+                    val rsj = ResourceSpecification(url, Constants.subTypeJson)
+                    var le = EventStore.findBy(rsj)
+                    if (le == null) {
+                        val rsx = ResourceSpecification(url, Constants.subTypeXml)
+                        le = EventStore.findBy(rsx)
+                    }
+                    console.log(le.toString())
+                    if (le != null) children.add(le)
+                }
+            }
+        }
+        console.log("[children] ->")
+        console.log(children)
+        return children
+    }
+
     private fun findChildrenByReference(): Set<LogEntry> {
         val str = logEntry.response
         val children = mutableSetOf<LogEntry>()
@@ -86,6 +119,7 @@ class LogEntryDecorator(val logEntry: LogEntry) {
 
     fun findChildrenIn(aggregatedList: List<LogEntry>): List<LogEntry> {
         console.log("[LED.findChildrenIn]")
+        console.log(aggregatedList)
         val selfUrl = href
         val children = mutableListOf<LogEntry>()
         aggregatedList.forEach {
@@ -93,6 +127,7 @@ class LogEntryDecorator(val logEntry: LogEntry) {
                 children.add(it)
             }
         }
+        console.log(children)
         return children
     }
 
diff --git a/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/core/event/ResourceProxy.kt b/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/core/event/ResourceProxy.kt
index 733a1de..92d60a1 100644
--- a/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/core/event/ResourceProxy.kt
+++ b/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/core/event/ResourceProxy.kt
@@ -26,6 +26,7 @@ import org.apache.isis.client.kroviz.handler.ResponseHandler
 import org.apache.isis.client.kroviz.to.Link
 import org.apache.isis.client.kroviz.to.TObject
 import org.apache.isis.client.kroviz.ui.core.Constants
+import org.apache.isis.client.kroviz.ui.diagram.Node
 
 /**
  * Facade for RoXmlHttpRequest. If a resource is being fetched, it:
@@ -39,7 +40,7 @@ class ResourceProxy {
 
     // there may be more than one aggt - which may break this code
     // we are coming from a parented collection ...
-    // we can assume the object hat been loaded as part of the collection before
+    // we can assume the object has been loaded before as part of the collection
     fun load(tObject: TObject) {
         val aggregator = ObjectAggregator(tObject.title)
         // ASSUMPTION: there can be max one LogEntry for an Object
@@ -65,15 +66,22 @@ class ResourceProxy {
     fun fetch(link: Link,
               aggregator: BaseAggregator? = null,
               subType: String = Constants.subTypeJson,
-              isRest: Boolean = true) {
-        val rs = ResourceSpecification(link.href)
+              isRest: Boolean = true,
+              referrer: String = "") {
+        val rs = ResourceSpecification(link.href, referrerUrl = referrer)
         val isCached = when (val le = EventStore.findBy(rs)) {
             null -> false
             else -> le.isCached(rs, link.method)
         }
         when {
             isCached -> processCached(rs, aggregator)
-            !isCached && isRest -> RoXmlHttpRequest(aggregator).process(link, subType)
+            !isCached && isRest -> {
+                if (aggregator is AggregatorWithLayout) {
+                    val child = Node(link.href)
+//FIXME                    aggregator.root.add(child)
+                }
+                RoXmlHttpRequest(aggregator).process(link, subType)
+            }
             !isCached && !isRest -> RoXmlHttpRequest(aggregator).processNonREST(link, subType)
         }
     }
diff --git a/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/core/event/ResourceSpecification.kt b/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/core/event/ResourceSpecification.kt
index 90e8395..ee18faf 100644
--- a/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/core/event/ResourceSpecification.kt
+++ b/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/core/event/ResourceSpecification.kt
@@ -23,7 +23,8 @@ import org.apache.isis.client.kroviz.utils.StringUtils
 
 class ResourceSpecification(
         val url: String,
-        val subType: String = Constants.subTypeJson) {
+        val subType: String = Constants.subTypeJson,
+        val referrerUrl: String = "") {
 
     fun isRedundant(): Boolean {
         return when {
diff --git a/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/ui/diagram/LinkTreeDiagram.kt b/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/ui/diagram/LinkTreeDiagram.kt
index c6f6533..9e6c480 100644
--- a/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/ui/diagram/LinkTreeDiagram.kt
+++ b/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/ui/diagram/LinkTreeDiagram.kt
@@ -1,3 +1,21 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ */
 package org.apache.isis.client.kroviz.ui.diagram
 
 import org.apache.isis.client.kroviz.core.aggregator.BaseAggregator
@@ -21,13 +39,12 @@ object LinkTreeDiagram {
         val entryList: List<LogEntry> = EventStore.findAllBy(aggregator)
         val root = findRoot(entryList)
         if (root == null) {
-            code += "* /$NL"
+            code += "* / $NL"
             code += createNodes(entryList, 2)
         } else {
             code += root.asPumlNode(1)
             val led = LogEntryDecorator(root)
-            val childList = led.findChildrenIn(entryList)
-            console.log("[LTD.build]")
+            val childList = led.findChildrenOfLogEntry()
             console.log(aggregator)
             console.log(entryList)
             code += createChildNodes(childList, 2)
@@ -41,8 +58,8 @@ object LinkTreeDiagram {
         childList.forEach {
             code += createNode(it, level)
             val led = LogEntryDecorator(it)
-            val kidSet = led.findChildrenIn(childList)
-            code += createChildNodes(kidSet, level +1)
+            val kidSet = led.findChildrenOfLogEntry()
+            code += createChildNodes(kidSet, level + 1)
         }
         return code
     }
@@ -82,26 +99,32 @@ object LinkTreeDiagram {
 
     fun LogEntry.asPumlNode(level: Int): String {
         val led = LogEntryDecorator(this)
-        val title = StringUtils.shortTitle(this.url, protocolHostPort)
+        val url = this.url
+        val title = StringUtils.shortTitle(url, protocolHostPort)
         val type = led.selfType()
         val depth = "*".repeat(level)
-        var answer = "$depth:..//<<$type>>//..$NL**$title**$NL"
-        answer += "----$NL"
-        answer += traceInfo(this)
-        return answer + ";" + NL
+        val pc = PumlCode()
+        pc.add(depth).add(":")
+        pc.addStereotype(type)
+        pc.addLink(url, title)
+        pc.addHorizontalLine()
+        pc.add(traceInfo(this))
+        pc.addLine(";")
+        return pc.code
     }
 
-    private fun traceInfo(logEntry: LogEntry) : String {
+    private fun traceInfo(logEntry: LogEntry): String {
         val obj = logEntry.obj!!
-        var answer = "__" + obj::class.simpleName + "__" + NL
+        val className = obj::class.simpleName!!
+        val pc = PumlCode().addClass(className)
         if (obj is HasLinks) {
             obj.links.forEach {
-                answer += StringUtils.shortTitle(it.href, protocolHostPort) + NL
+                val url = it.href
+                val title = StringUtils.shortTitle(url, protocolHostPort)
+                pc.addLink(url, title)
             }
         }
-        console.log("[LTD.traceInfo]")
-        console.log(answer)
-        return answer
+        return pc.code
     }
 
 }
diff --git a/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/ui/diagram/Node.kt b/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/ui/diagram/Node.kt
new file mode 100644
index 0000000..19bc68c
--- /dev/null
+++ b/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/ui/diagram/Node.kt
@@ -0,0 +1,30 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ */
+package org.apache.isis.client.kroviz.ui.diagram
+
+class Node(val key: String) {
+
+    var parent: Node? = null
+    val children = mutableListOf<Node>()
+
+    fun add(child: Node) {
+        children.add(child)
+    }
+
+}
diff --git a/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/ui/diagram/PumlCode.kt b/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/ui/diagram/PumlCode.kt
new file mode 100644
index 0000000..ac5ea8d
--- /dev/null
+++ b/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/ui/diagram/PumlCode.kt
@@ -0,0 +1,78 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ */
+package org.apache.isis.client.kroviz.ui.diagram
+
+class PumlCode() {
+
+    private val NL = "\n"
+
+    var code = ""
+
+    fun add(s: String): PumlCode {
+        code += s
+        return this
+    }
+
+    fun addLine(s: String): PumlCode {
+        code += s + NL
+        return this
+    }
+
+    fun addStereotype(s: String): PumlCode {
+        var result = "<<" + s + ">>"
+        result = italic(result)
+        result = center(result)
+        code += result + NL
+        return this
+    }
+
+    fun addLink(url: String, title: String): PumlCode {
+        var result = "[[" + url + " "+ title + "]]"
+        result = bold(result)
+        code += result + NL
+        return this
+    }
+
+    fun addClass(s: String): PumlCode {
+        val result = underline("(C) "+ s)
+        code += result + NL
+        return this
+    }
+
+    private fun center(s: String): String {
+        return ".." + s + ".."
+    }
+
+    private fun italic(s: String): String {
+        return "//" + s + "//"
+    }
+
+    private fun bold(s: String): String {
+        return "**" + s + "**"
+    }
+
+    private fun underline(s: String): String {
+        return "__" + s + "__"
+    }
+
+    fun addHorizontalLine(): PumlCode {
+        code += "----" + NL
+        return this
+    }
+}

[isis] 03/07: ISIS-2846 link tree diagram works

Posted by jo...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

joergrade pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/isis.git

commit f848f38abbc4ec553bce83cae6315d483d48f4d4
Author: Jörg Rade <jo...@kuehne-nagel.com>
AuthorDate: Wed Sep 8 18:28:05 2021 +0200

    ISIS-2846 link tree diagram works
---
 .../kroviz/core/aggregator/AggregatorWithLayout.kt |   2 +
 .../client/kroviz/core/event/LogEntryDecorator.kt  | 156 ---------------------
 .../isis/client/kroviz/core/event/ResourceProxy.kt |  46 +++---
 .../client/kroviz/ui/diagram/LinkTreeDiagram.kt    | 131 +++++++----------
 .../apache/isis/client/kroviz/ui/diagram/Node.kt   |   7 +-
 .../isis/client/kroviz/ui/diagram/PumlCode.kt      |   5 +
 .../client/kroviz/ui/diagram/{Node.kt => Tree.kt}  |  28 +++-
 .../isis/client/kroviz/ui/dialog/EventLogDetail.kt |   8 +-
 .../isis/client/kroviz/core/event/LogEntryTest.kt  |   4 +-
 .../isis/client/kroviz/ui/diagram/TreeTest.kt      |  56 ++++++++
 10 files changed, 163 insertions(+), 280 deletions(-)

diff --git a/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/core/aggregator/AggregatorWithLayout.kt b/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/core/aggregator/AggregatorWithLayout.kt
index 4bea388..32ed837 100644
--- a/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/core/aggregator/AggregatorWithLayout.kt
+++ b/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/core/aggregator/AggregatorWithLayout.kt
@@ -6,11 +6,13 @@ import org.apache.isis.client.kroviz.layout.Layout
 import org.apache.isis.client.kroviz.to.Represention
 import org.apache.isis.client.kroviz.to.TObject
 import org.apache.isis.client.kroviz.ui.core.Constants
+import org.apache.isis.client.kroviz.ui.diagram.Tree
 
 abstract class AggregatorWithLayout : BaseAggregator() {
     // parentUrl is to be set in update
     // and to be used in subsequent invocations
     var parentUrl: String? = null
+    var tree: Tree? = null
 
     override fun update(logEntry: LogEntry, subType: String) {
         parentUrl = logEntry.url
diff --git a/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/core/event/LogEntryDecorator.kt b/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/core/event/LogEntryDecorator.kt
deleted file mode 100644
index f891eeb..0000000
--- a/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/core/event/LogEntryDecorator.kt
+++ /dev/null
@@ -1,156 +0,0 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *        http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- */
-package org.apache.isis.client.kroviz.core.event
-
-import org.apache.isis.client.kroviz.to.Link
-import org.apache.isis.client.kroviz.to.Relation
-import org.apache.isis.client.kroviz.ui.core.Constants
-
-class LogEntryDecorator(val logEntry: LogEntry) {
-
-    val href: String = logEntry.selfHref()
-    val links: List<Link> = logEntry.getLinks()
-    val linked: List<LogEntry> = EventStore.getLinked()
-
-    fun findChildren(): Set<LogEntry> {
-        val children = findChildrenByUpRelation()
-        children.plus(findChildrenByReference())
-        children.plus(findChildrenByLinks())
-        return children
-    }
-
-    private fun findChildrenByUpRelation(): Set<LogEntry> {
-        val children = mutableSetOf<LogEntry>()
-        linked.forEach {
-            it.getLinks().forEach { l ->
-                if ((l.relation() == Relation.UP) && (l.href == href)) {
-                    children.add(it)
-                }
-            }
-        }
-        return children
-    }
-
-    private fun findChildrenByLinks(): Set<LogEntry> {
-        console.log("[LED.findChildrenByLinks]")
-        val children = mutableSetOf<LogEntry>()
-        links.forEach {
-            console.log(it.toString())
-            val rel = it.relation()
-            when {
-                (rel == Relation.UP) -> {
-                }
-                (rel == Relation.SELF) -> {
-                }
-                else -> {
-                    val rsj = ResourceSpecification(it.href, Constants.subTypeJson)
-                    var le = EventStore.findBy(rsj)
-                    if (le == null) {
-                        val rsx = ResourceSpecification(it.href, Constants.subTypeXml)
-                        le = EventStore.findBy(rsx)
-                    }
-                    console.log(le.toString())
-                    if (le != null) children.add(le)
-                }
-            }
-        }
-        return children
-    }
-
-    fun findChildrenOfLogEntry(): List<LogEntry> {
-        console.log("[LED.findChildrenOfLogEntry]")
-        val children = mutableListOf<LogEntry>()
-        val links = logEntry.getLinks()
-        console.log("[links] ->")
-        console.log(links)
-        console.log(links.size)
-        links.forEach {
-            console.log(it.toString())
-            when (it.relation()) {
-                Relation.UP -> {
-                }
-                Relation.SELF -> {
-                }
-                else -> {
-                    val url = it.href
-                    console.log(url)
-                    val rsj = ResourceSpecification(url, Constants.subTypeJson)
-                    var le = EventStore.findBy(rsj)
-                    if (le == null) {
-                        val rsx = ResourceSpecification(url, Constants.subTypeXml)
-                        le = EventStore.findBy(rsx)
-                    }
-                    console.log(le.toString())
-                    if (le != null) children.add(le)
-                }
-            }
-        }
-        console.log("[children] ->")
-        console.log(children)
-        return children
-    }
-
-    private fun findChildrenByReference(): Set<LogEntry> {
-        val str = logEntry.response
-        val children = mutableSetOf<LogEntry>()
-        linked.forEach {
-            if (it != logEntry && str.contains(it.url)) {
-                children.add(it)
-            }
-        }
-        return children
-    }
-
-    fun findChildrenIn(aggregatedList: List<LogEntry>): List<LogEntry> {
-        console.log("[LED.findChildrenIn]")
-        console.log(aggregatedList)
-        val selfUrl = href
-        val children = mutableListOf<LogEntry>()
-        aggregatedList.forEach {
-            if (it.url != selfUrl && it.response.contains(selfUrl)) {
-                children.add(it)
-            }
-        }
-        console.log(children)
-        return children
-    }
-
-    fun selfType(): String {
-        val selfLink = logEntry.selfLink()
-        return if (selfLink != null) {
-            selfLink.representation().type
-        } else {
-            console.log("[LED.selfType]")
-            console.log(logEntry)
-            ""
-        }
-    }
-
-    fun findParent(): LogEntry? {
-        val url = logEntry.url
-        linked.forEach {
-            when {
-                it.selfHref() == url -> return null
-                it.response.contains(url) -> return it
-            }
-        }
-        return null
-    }
-
-}
diff --git a/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/core/event/ResourceProxy.kt b/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/core/event/ResourceProxy.kt
index 92d60a1..ad596a0 100644
--- a/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/core/event/ResourceProxy.kt
+++ b/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/core/event/ResourceProxy.kt
@@ -27,6 +27,7 @@ import org.apache.isis.client.kroviz.to.Link
 import org.apache.isis.client.kroviz.to.TObject
 import org.apache.isis.client.kroviz.ui.core.Constants
 import org.apache.isis.client.kroviz.ui.diagram.Node
+import org.apache.isis.client.kroviz.ui.diagram.Tree
 
 /**
  * Facade for RoXmlHttpRequest. If a resource is being fetched, it:
@@ -51,18 +52,6 @@ class ResourceProxy {
         }
     }
 
-    private fun processCached(rs: ResourceSpecification, aggregator: BaseAggregator?) {
-        val le = EventStore.findBy(rs)!!
-        le.retrieveResponse()
-        if (aggregator == null) {
-            ResponseHandler.handle(le)
-        } else {
-            aggregator.update(le, le.subType)
-        }
-        le.setCached()
-        EventStore.updateStatus(le)
-    }
-
     fun fetch(link: Link,
               aggregator: BaseAggregator? = null,
               subType: String = Constants.subTypeJson,
@@ -75,25 +64,36 @@ class ResourceProxy {
         }
         when {
             isCached -> processCached(rs, aggregator)
-            !isCached && isRest -> {
-                if (aggregator is AggregatorWithLayout) {
-                    val child = Node(link.href)
-//FIXME                    aggregator.root.add(child)
-                }
-                RoXmlHttpRequest(aggregator).process(link, subType)
-            }
+            !isCached && isRest -> process(aggregator, link, subType, referrer)
             !isCached && !isRest -> RoXmlHttpRequest(aggregator).processNonREST(link, subType)
         }
     }
 
-    private fun isNotRenderedYet(aggregator: BaseAggregator?): Boolean {
-        if (aggregator != null && aggregator is AggregatorWithLayout) {
-            return !aggregator.dpm.isRendered
+    private fun process(aggregator: BaseAggregator?, link: Link, subType: String, referrer: String) {
+        if (aggregator is AggregatorWithLayout) {
+            if (aggregator.tree == null) {
+                val root = Node(referrer, null)
+                aggregator.tree = Tree(root)
+            }
+            aggregator.tree!!.addChildToParent(link.href, referrer)
+
+        }
+        RoXmlHttpRequest(aggregator).process(link, subType)
+    }
+
+    private fun processCached(rs: ResourceSpecification, aggregator: BaseAggregator?) {
+        val le = EventStore.findBy(rs)!!
+        le.retrieveResponse()
+        if (aggregator == null) {
+            ResponseHandler.handle(le)
         } else {
-            return false
+            aggregator.update(le, le.subType)
         }
+        le.setCached()
+        EventStore.updateStatus(le)
     }
 
+
     fun invokeKroki(pumlCode: String, aggregator: SvgDispatcher) {
         RoXmlHttpRequest(aggregator).invokeKroki(pumlCode)
     }
diff --git a/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/ui/diagram/LinkTreeDiagram.kt b/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/ui/diagram/LinkTreeDiagram.kt
index 9e6c480..bc3789d 100644
--- a/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/ui/diagram/LinkTreeDiagram.kt
+++ b/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/ui/diagram/LinkTreeDiagram.kt
@@ -18,10 +18,10 @@
  */
 package org.apache.isis.client.kroviz.ui.diagram
 
+import org.apache.isis.client.kroviz.core.aggregator.AggregatorWithLayout
 import org.apache.isis.client.kroviz.core.aggregator.BaseAggregator
 import org.apache.isis.client.kroviz.core.event.EventStore
 import org.apache.isis.client.kroviz.core.event.LogEntry
-import org.apache.isis.client.kroviz.core.event.LogEntryDecorator
 import org.apache.isis.client.kroviz.core.event.ResourceSpecification
 import org.apache.isis.client.kroviz.to.HasLinks
 import org.apache.isis.client.kroviz.ui.core.UiManager
@@ -29,102 +29,71 @@ import org.apache.isis.client.kroviz.utils.StringUtils
 
 object LinkTreeDiagram {
 
-    private const val NL = "\n"
-    private const val prolog = "@startmindmap$NL"
-    private const val epilog = "@endmindmap$NL"
     private val protocolHostPort = UiManager.getUrl()
 
     fun build(aggregator: BaseAggregator): String {
-        var code = prolog
-        val entryList: List<LogEntry> = EventStore.findAllBy(aggregator)
-        val root = findRoot(entryList)
-        if (root == null) {
-            code += "* / $NL"
-            code += createNodes(entryList, 2)
-        } else {
-            code += root.asPumlNode(1)
-            val led = LogEntryDecorator(root)
-            val childList = led.findChildrenOfLogEntry()
-            console.log(aggregator)
-            console.log(entryList)
-            code += createChildNodes(childList, 2)
-        }
-        code += epilog
-        return code
-    }
-
-    private fun createChildNodes(childList: List<LogEntry>, level: Int): String {
-        var code = ""
-        childList.forEach {
-            code += createNode(it, level)
-            val led = LogEntryDecorator(it)
-            val kidSet = led.findChildrenOfLogEntry()
-            code += createChildNodes(kidSet, level + 1)
-        }
-        return code
-    }
-
-    private fun createNode(le: LogEntry, level: Int): String {
-        var code = ""
-        if (isInEventStore(le.url)) {
-            code += le.asPumlNode(level)
-        }
-        return code
-    }
-
-    private fun createNodes(entryList: List<LogEntry>, level: Int): String {
-        var code = ""
-        entryList.forEach {
-            code += createNode(it, level)
-        }
-        return code
-    }
-
-    private fun findRoot(entryList: List<LogEntry>): LogEntry? {
-        entryList.forEach {
-            val led = LogEntryDecorator(it)
-            val parent = led.findParent()
-            if (parent != null && !entryList.contains(parent)) {
-                return parent
-            }
+        console.log("[LTD.build]")
+        val pc = PumlCode()
+        if (aggregator is AggregatorWithLayout) {
+            val tree = aggregator.tree!!
+            val root = tree.root
+            console.log(root)
+            pc.code += toPumlCode(root, 1)
         }
-        return null
+        pc.mindmap()
+        console.log(pc.code)
+        return pc.code
     }
 
-    private fun isInEventStore(url: String): Boolean {
+    private fun toPumlCode(node: Node, level: Int): String {
+        val url = node.key
         val rs = ResourceSpecification(url)
         val le = EventStore.findBy(rs)
-        return (le != null)
-    }
-
-    fun LogEntry.asPumlNode(level: Int): String {
-        val led = LogEntryDecorator(this)
-        val url = this.url
-        val title = StringUtils.shortTitle(url, protocolHostPort)
-        val type = led.selfType()
-        val depth = "*".repeat(level)
         val pc = PumlCode()
-        pc.add(depth).add(":")
-        pc.addStereotype(type)
-        pc.addLink(url, title)
-        pc.addHorizontalLine()
-        pc.add(traceInfo(this))
-        pc.addLine(";")
+        if (le != null) {
+            val title = StringUtils.shortTitle(url, protocolHostPort)
+            val type = le.selfType()
+            val depth = "*".repeat(level)
+            pc.add(depth).add(":")
+            pc.addStereotype(type)
+            pc.addLink(url, title)
+            pc.addHorizontalLine()
+            pc.add(traceInfo(le))
+            pc.addLine(";")
+            node.children.forEach {
+                val childCode = toPumlCode(it, level + 1)
+                pc.add(childCode)
+            }
+        }
         return pc.code
     }
 
     private fun traceInfo(logEntry: LogEntry): String {
-        val obj = logEntry.obj!!
-        val className = obj::class.simpleName!!
-        val pc = PumlCode().addClass(className)
-        if (obj is HasLinks) {
-            obj.links.forEach {
-                val url = it.href
-                val title = StringUtils.shortTitle(url, protocolHostPort)
-                pc.addLink(url, title)
+        val pc = PumlCode()
+        val obj = logEntry.obj
+        if (obj != null) {
+            val className = obj::class.simpleName!!
+            pc.addClass(className)
+            if (obj is HasLinks) {
+                obj.links.forEach {
+                    val url = it.href
+                    val title = StringUtils.shortTitle(url, protocolHostPort)
+                    pc.addLink(url, title)
+                }
             }
         }
         return pc.code
     }
 
+    private fun LogEntry.selfType(): String {
+        val selfLink = this.selfLink()
+        return if (selfLink != null) {
+            selfLink.representation().type
+        } else {
+            console.log("[LE.selfType]")
+            console.log(this)
+            ""
+        }
+    }
+
 }
diff --git a/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/ui/diagram/Node.kt b/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/ui/diagram/Node.kt
index 19bc68c..79c0930 100644
--- a/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/ui/diagram/Node.kt
+++ b/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/ui/diagram/Node.kt
@@ -18,13 +18,8 @@
  */
 package org.apache.isis.client.kroviz.ui.diagram
 
-class Node(val key: String) {
+class Node(val key: String, val parent: Node?) {
 
-    var parent: Node? = null
     val children = mutableListOf<Node>()
 
-    fun add(child: Node) {
-        children.add(child)
-    }
-
 }
diff --git a/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/ui/diagram/PumlCode.kt b/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/ui/diagram/PumlCode.kt
index ac5ea8d..86410eb 100644
--- a/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/ui/diagram/PumlCode.kt
+++ b/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/ui/diagram/PumlCode.kt
@@ -55,6 +55,11 @@ class PumlCode() {
         return this
     }
 
+    fun mindmap(): PumlCode {
+        code += "@startmindmap$NL" + code + "@endmindmap$NL"
+        return this
+    }
+
     private fun center(s: String): String {
         return ".." + s + ".."
     }
diff --git a/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/ui/diagram/Node.kt b/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/ui/diagram/Tree.kt
similarity index 57%
copy from incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/ui/diagram/Node.kt
copy to incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/ui/diagram/Tree.kt
index 19bc68c..922bc94 100644
--- a/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/ui/diagram/Node.kt
+++ b/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/ui/diagram/Tree.kt
@@ -18,13 +18,31 @@
  */
 package org.apache.isis.client.kroviz.ui.diagram
 
-class Node(val key: String) {
+class Tree(val root: Node) {
 
-    var parent: Node? = null
-    val children = mutableListOf<Node>()
+    fun addChildToParent(childUrl: String, parentUrl: String) {
+        var p = find(parentUrl, root)
+        if (p == null) {
+            p = root
+        }
+        val c = Node(childUrl, p)
+        p.children.add(c)
+    }
 
-    fun add(child: Node) {
-        children.add(child)
+    fun find(url: String, node: Node): Node? {
+        if (node.key == url) {
+            return node
+        } else {
+            var answer: Node? = null
+            node.children.forEach {
+                if (it.key == url) {
+                    answer = it
+                } else {
+                    answer = find(url, it)
+                }
+            }
+            return answer
+        }
     }
 
 }
diff --git a/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/ui/dialog/EventLogDetail.kt b/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/ui/dialog/EventLogDetail.kt
index 6eb29f6..e72da92 100644
--- a/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/ui/dialog/EventLogDetail.kt
+++ b/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/ui/dialog/EventLogDetail.kt
@@ -20,7 +20,6 @@ package org.apache.isis.client.kroviz.ui.dialog
 
 import org.apache.isis.client.kroviz.core.event.EventStore
 import org.apache.isis.client.kroviz.core.event.LogEntry
-import org.apache.isis.client.kroviz.core.event.LogEntryDecorator
 import org.apache.isis.client.kroviz.core.event.ResourceSpecification
 import org.apache.isis.client.kroviz.to.ValueType
 import org.apache.isis.client.kroviz.to.bs3.Grid
@@ -41,7 +40,7 @@ class EventLogDetail(val logEntryFromTabulator: LogEntry) : Command() {
         // For a yet unknown reason, aggregators are not transmitted via tabulator.
         // As a WORKAROUND, we fetch the full blown LogEntry from the EventStore again.
         val rs = ResourceSpecification(logEntryFromTabulator.title)
-        logEntry = EventStore.findBy(rs)?: logEntryFromTabulator  // in case of xml, we use the entry passed in
+        logEntry = EventStore.findBy(rs) ?: logEntryFromTabulator  // in case of xml, we use the entry passed in
     }
 
     // callback parameter
@@ -55,15 +54,10 @@ class EventLogDetail(val logEntryFromTabulator: LogEntry) : Command() {
             XmlHelper.format(logEntry.response)
         }
 
-        val led = LogEntryDecorator(logEntry)
-        val children = led.findChildren()
-        var kids = ""
-        children.forEach { kids += it.url + "\n" }
         val formItems = mutableListOf<FormItem>()
         formItems.add(FormItem("Url", ValueType.TEXT, logEntry.title))
         formItems.add(FormItem("Response", ValueType.TEXT_AREA, responseStr, 10))
         formItems.add(FormItem("Aggregators", ValueType.TEXT, content = logEntry.aggregators))
-        formItems.add(FormItem("Children", ValueType.TEXT_AREA, kids, size = 5))
         formItems.add(FormItem("Link Tree Diagram", ValueType.BUTTON, null, callBack = this, callBackAction = LNK))
         formItems.add(FormItem("Console", ValueType.BUTTON, null, callBack = this, callBackAction = LOG))
 
diff --git a/incubator/clients/kroviz/src/test/kotlin/org/apache/isis/client/kroviz/core/event/LogEntryTest.kt b/incubator/clients/kroviz/src/test/kotlin/org/apache/isis/client/kroviz/core/event/LogEntryTest.kt
index 9ff7b10..dea66af 100644
--- a/incubator/clients/kroviz/src/test/kotlin/org/apache/isis/client/kroviz/core/event/LogEntryTest.kt
+++ b/incubator/clients/kroviz/src/test/kotlin/org/apache/isis/client/kroviz/core/event/LogEntryTest.kt
@@ -30,7 +30,7 @@ class LogEntryTest {
         val url = "https://kroki.io"
 
         // when
-        val le = LogEntry(url)
+        val le = LogEntry(ResourceSpecification(url))
 
         // then
         assertFalse(le.title.startsWith("/"))
@@ -39,7 +39,7 @@ class LogEntryTest {
     @Test
     fun testCalculate() {
         // given
-        val le = LogEntry("http://test/url")
+        val le = LogEntry(ResourceSpecification("http://test/url"))
 
         // when
         le.setSuccess()
diff --git a/incubator/clients/kroviz/src/test/kotlin/org/apache/isis/client/kroviz/ui/diagram/TreeTest.kt b/incubator/clients/kroviz/src/test/kotlin/org/apache/isis/client/kroviz/ui/diagram/TreeTest.kt
new file mode 100644
index 0000000..712bc86
--- /dev/null
+++ b/incubator/clients/kroviz/src/test/kotlin/org/apache/isis/client/kroviz/ui/diagram/TreeTest.kt
@@ -0,0 +1,56 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *       http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.isis.client.kroviz.ui.diagram
+
+import kotlin.test.*
+
+class TreeTest {
+
+    @BeforeTest
+    fun setup() {
+    }
+
+    @Test
+    fun testAddChildToParent() {
+        //given
+        val url_0 = "root"
+        val url_1 = "level_1"
+        val url_1_1 = "level_1_1"
+        val url_1_2 = "level_1_2"
+        val root = Node(url_0, null)
+        val tree = Tree(root)
+
+        //when
+        tree.addChildToParent(url_1, url_0)
+        tree.addChildToParent(url_1_1, url_1)
+        tree.addChildToParent(url_1_2, url_1)
+
+        //then
+        val r = tree.find(url_0, root)!!
+        assertEquals(1, r.children.size)
+        assertNull(r.parent)
+
+        val c = tree.find(url_1, root)!!
+        assertNotNull(c.parent)
+        assertEquals(2, c.children.size)
+        assertEquals(url_1_1, c.children.first().key)
+        assertEquals(url_1_2, c.children.last().key)
+    }
+
+}

[isis] 07/07: Merge branch 'master' of https://github.com/apache/isis

Posted by jo...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

joergrade pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/isis.git

commit 4b97e5535048ef6639e0b245dfe1dd533c30a827
Merge: 290c681 93e759e
Author: Jörg Rade <jo...@kuehne-nagel.com>
AuthorDate: Fri Sep 10 13:00:42 2021 +0200

    Merge branch 'master' of https://github.com/apache/isis

 .../ci-build-artifacts-no-push-gradle.yml          |   2 +-
 .gitignore                                         |   3 +
 STATUS                                             |   2 +
 .../modules/ROOT/pages/cutting-a-release.adoc      |  46 +-
 .../ROOT/pages/post-release-successful.adoc        |   2 +-
 .../powered-by/commapp/screenshot-1.png            | Bin 670918 -> 0 bytes
 .../powered-by/commapp/screenshot-2.png            | Bin 56933 -> 0 bytes
 .../powered-by/cqnz/cqnz-advert.png                | Bin 759997 -> 0 bytes
 .../powered-by/estatio/est-home-page.png           | Bin 1650322 -> 0 bytes
 .../powered-by/estatio/est-invoice.png             | Bin 1065937 -> 0 bytes
 .../estatio/est-payment-batch-manager.png          | Bin 1133462 -> 0 bytes
 .../powered-by/estatio/estatio-1.png               | Bin 261553 -> 0 bytes
 .../gesconsultor-grc/fig-1-custom-viewer.png       | Bin 1169636 -> 0 bytes
 .../fig-2-custom-drag-n-drop-interface.png         | Bin 1495279 -> 0 bytes
 .../fig-3-custom-ui-analyzing-risk-scenarios.png   | Bin 2218476 -> 0 bytes
 .../gesconsultor-grc/fig-4-managing-projects.png   | Bin 995701 -> 0 bytes
 .../transportplanner/TransportDemand.png           | Bin 429799 -> 0 bytes
 .../resources/attachments/IsisCheatSheet.docx      | Bin 25748 -> 0 bytes
 .../resources/attachments/IsisCheatSheet.odt       | Bin 0 -> 37885 bytes
 .../resources/attachments/IsisCheatSheet.pdf       | Bin 194943 -> 104881 bytes
 .../modules/resources/images/IsisCheatSheet.png    | Bin 384831 -> 712251 bytes
 .../docs/modules/resources/pages/cheatsheet.adoc   |   4 +-
 .../docs/modules/support/images/slack/040.png      | Bin 2878486 -> 485188 bytes
 .../applib/pages/index/clock/VirtualClock.adoc     |  22 +
 .../applib/pages/index/graph/tree/TreeNode.adoc    |  10 +-
 .../index/services/i18n/TranslationService.adoc    |   4 +-
 .../services/iactnlayer/InteractionContext.adoc    |   6 +-
 .../applib/pages/index/types/TargetActionType.adoc |   2 +-
 .../applib/pages/index/types/TargetClassType.adoc  |   2 +-
 .../index/util/schema/InteractionDtoUtils.adoc     |   4 +-
 .../modules/applib/pages/index/value/Blob.adoc     |  10 +-
 .../index/secman/applib/SecmanConfiguration.adoc   |  13 +-
 ...PermissionsEvaluationServiceAllowBeatsVeto.adoc |   2 +-
 ...PermissionsEvaluationServiceVetoBeatsAllow.adoc |   2 +-
 .../IsisModulePersistenceJdoDatanucleus.adoc       |   2 +-
 .../applib/classrules/ArchitectureDomainRules.adoc |  14 +
 antora/components/relnotes/modules/ROOT/nav.adoc   |   1 +
 .../modules/ROOT/pages/2020/2.0.0-M3/relnotes.adoc | 149 +++++-
 .../modules/ROOT/pages/2020/2.0.0-M4/relnotes.adoc |  17 +-
 .../modules/ROOT/pages/2021/2.0.0-M5/relnotes.adoc |  30 +-
 .../modules/ROOT/pages/2021/2.0.0-M6/mignotes.adoc |   6 +-
 .../modules/ROOT/pages/2021/2.0.0-M6/relnotes.adoc | 291 +++++++++++-
 .../modules/ROOT/pages/2021/2.0.0-M7/mignotes.adoc |  71 +++
 .../modules/ROOT/pages/2021/2.0.0-M7/relnotes.adoc |   8 +
 .../relnotes/modules/ROOT/pages/about.adoc         |  20 +-
 antora/playbooks/site.yml                          |   4 +-
 antora/supplemental-ui/doap_isis.rdf               |   8 +
 .../img/home/built-with/EclipseLink.png            | Bin 0 -> 3365 bytes
 antora/supplemental-ui/index.html                  | 108 ++---
 antora/supplemental-ui/js/home/main.js             |   1 +
 .../org/apache/isis/applib/AbstractViewModel.java  |   1 -
 .../java/org/apache/isis/applib/Identifier.java    |  10 +-
 .../isis/applib/RecreatableDomainObject.java       |   1 -
 .../java/org/apache/isis/applib/ViewModel.java     |  13 +-
 .../adapters/AbstractValueSemanticsProvider.java   |   1 -
 .../isis/applib/adapters/DefaultsProvider.java     |   1 -
 .../isis/applib/adapters/EncoderDecoder.java       |   1 -
 .../isis/applib/adapters/EncodingException.java    |   1 -
 .../org/apache/isis/applib/adapters/Parser.java    |   1 -
 .../isis/applib/adapters/ParsingException.java     |   1 -
 .../org/apache/isis/applib/annotation/Action.java  |  26 +-
 .../isis/applib/annotation/ActionLayout.java       |   8 +-
 .../apache/isis/applib/annotation/Collection.java  |   2 +-
 .../isis/applib/annotation/CollectionLayout.java   |  12 +-
 .../apache/isis/applib/annotation/Defaulted.java   |   1 -
 .../org/apache/isis/applib/annotation/Domain.java  |  81 ++++
 .../isis/applib/annotation/DomainObject.java       |  20 +-
 .../isis/applib/annotation/DomainObjectLayout.java |   1 -
 .../isis/applib/annotation/DomainService.java      |  12 -
 .../applib/annotation/DomainServiceLayout.java     |   1 -
 .../org/apache/isis/applib/annotation/Facets.java  |  65 ---
 .../isis/applib/annotation/Introspection.java      | 142 ++++++
 .../isis/applib/annotation/MemberSupport.java      |  11 +-
 .../isis/applib/annotation/ObjectLifecycle.java    |  50 ++
 .../isis/applib/annotation/ObjectSupport.java      |  50 ++
 .../apache/isis/applib/annotation/Parameter.java   |   1 -
 .../isis/applib/annotation/ParameterLayout.java    |  13 -
 .../isis/applib/annotation/PriorityPrecedence.java |   1 -
 .../isis/applib/annotation/Programmatic.java       |   3 +
 .../apache/isis/applib/annotation/Projecting.java  |   5 +-
 .../apache/isis/applib/annotation/Property.java    |   2 +-
 .../isis/applib/annotation/PropertyLayout.java     |   6 +-
 .../apache/isis/applib/annotation/SemanticsOf.java |   8 -
 .../org/apache/isis/applib/annotation/Title.java   |   3 +-
 .../org/apache/isis/applib/annotation/Where.java   |   1 -
 .../isis/applib/domain/DomainObjectList.java       |   3 +-
 .../events/ActionArgumentUsabilityEvent.java       |   1 -
 .../events/ActionArgumentVisibilityEvent.java      |   1 -
 .../applib/exceptions/RecoverableException.java    |   1 -
 .../applib/exceptions/UnrecoverableException.java  |   1 -
 .../recoverable/InteractionException.java          |   1 -
 .../recoverable/InvalidEntryException.java         |   1 -
 .../recoverable/TextEntryParseException.java       |   1 -
 .../unrecoverable/DomainModelException.java        |   1 -
 .../unrecoverable/MetaModelException.java          |   1 -
 .../unrecoverable/NoAuthenticatorException.java    |   1 -
 .../unrecoverable/ObjectNotFoundException.java     |   1 -
 .../unrecoverable/ObjectPersistenceException.java  |   1 -
 .../unrecoverable/ReflectiveActionException.java   |   1 -
 .../unrecoverable/RepositoryException.java         |   1 -
 .../unrecoverable/UnexpectedCallException.java     |   1 -
 .../unrecoverable/UnknownTypeException.java        |   1 -
 .../isis/applib/jaxb/JodaTimeJaxbAdapters.java     |   4 +-
 .../layout/component/CollectionLayoutData.java     |   2 +-
 .../layout/component/PropertyLayoutData.java       |   2 +-
 .../isis/applib/mixins/dto/Dto_downloadXml.java    |   6 +-
 .../isis/applib/mixins/dto/Dto_downloadXsd.java    |   7 +-
 .../mixins/layout/Object_downloadLayoutXml.java    |   9 +-
 .../metamodel/Object_downloadMetamodelXml.java     |   6 +-
 .../mixins/metamodel/Object_rebuildMetamodel.java  |   3 +-
 .../applib/mixins/rest/Object_openRestApi.java     |   3 +-
 .../DomainChangeRecord_openTargetObject.java       |   9 +-
 .../java/org/apache/isis/applib/query/Query.java   |   1 -
 .../applib/query/_AllInstancesQueryDefault.java    |   1 -
 .../apache/isis/applib/query/_QueryAbstract.java   |   1 -
 .../services/appfeatui/ApplicationFeatureMenu.java |   2 +
 .../appfeatui/ApplicationFeatureViewModel.java     |  11 +-
 .../services/appfeatui/ApplicationNamespace.java   |   3 +-
 .../appfeatui/ApplicationTypeProperty.java         |   7 +-
 .../apache/isis/applib/services/bookmark/Oid.java  |   9 -
 .../services/bookmarkui/BookmarkUiService.java     |   1 -
 .../isis/applib/services/command/package-info.java |   1 -
 .../services/confview/ConfigurationMenu.java       |  20 +-
 .../services/confview/ConfigurationProperty.java   |   1 -
 .../confview/ConfigurationViewService.java         |   1 -
 .../services/confview/ConfigurationViewmodel.java  |   3 +-
 .../applib/services/factory/FactoryService.java    |  42 +-
 .../applib/services/i18n/TranslationContext.java   |  38 +-
 .../isis/applib/services/iactn/Interaction.java    |   1 -
 .../services/iactnlayer/InteractionContext.java    |  14 +-
 .../applib/services/layout/LayoutServiceMenu.java  |  60 ++-
 .../applib/services/message/MessageService.java    |   1 -
 .../isis/applib/services/metamodel/BeanSort.java   |   7 +-
 .../services/metamodel/MetaModelServiceMenu.java   | 373 +++++++--------
 .../applib/services/registry/ServiceRegistry.java  |   1 -
 .../services/repository/RepositoryService.java     |  33 +-
 .../isis/applib/services/title/TitleService.java   |   1 -
 .../isis/applib/services/user/ImpersonateMenu.java | 148 +++---
 .../applib/services/user/ImpersonateStopMenu.java  |  24 +-
 .../isis/applib/services/userui/UserMenu.java      |  21 +-
 .../applib/services/wrapper/InvalidException.java  |   1 -
 .../applib/services/wrapper/WrapperFactory.java    |   1 -
 .../applib/services/wrapper/WrappingObject.java    |   1 -
 .../services/wrapper/control/AsyncControl.java     |  12 +-
 .../services/wrapper/events/AccessEvent.java       |   1 -
 .../wrapper/events/ActionArgumentEvent.java        |   1 -
 .../wrapper/events/ActionInvocationEvent.java      |   1 -
 .../wrapper/events/ActionUsabilityEvent.java       |   1 -
 .../wrapper/events/ActionVisibilityEvent.java      |   1 -
 .../wrapper/events/CollectionAccessEvent.java      |   1 -
 .../wrapper/events/CollectionAddToEvent.java       |   1 -
 .../wrapper/events/CollectionMethodEvent.java      |   1 -
 .../wrapper/events/CollectionRemoveFromEvent.java  |   1 -
 .../wrapper/events/CollectionUsabilityEvent.java   |   1 -
 .../wrapper/events/CollectionVisibilityEvent.java  |   1 -
 .../services/wrapper/events/InteractionEvent.java  |   1 -
 .../services/wrapper/events/ObjectTitleEvent.java  |   1 -
 .../wrapper/events/ObjectValidityEvent.java        |   1 -
 .../wrapper/events/ObjectVisibilityEvent.java      |   1 -
 .../services/wrapper/events/ParseValueEvent.java   |   1 -
 .../wrapper/events/PropertyAccessEvent.java        |   1 -
 .../wrapper/events/PropertyModifyEvent.java        |   1 -
 .../wrapper/events/PropertyUsabilityEvent.java     |   1 -
 .../wrapper/events/PropertyVisibilityEvent.java    |   1 -
 .../services/wrapper/events/UsabilityEvent.java    |   1 -
 .../services/wrapper/events/ValidityEvent.java     |   1 -
 .../services/wrapper/events/VisibilityEvent.java   |   1 -
 .../wrapper/listeners/InteractionAdapter.java      |   1 -
 .../wrapper/listeners/InteractionListener.java     |   1 -
 .../applib/services/xactn/TransactionService.java  |   1 -
 .../snapshot/SnapshottableWithInclusions.java      |   1 -
 .../isis/applib/spec/AbstractSpecification.java    |  23 +-
 .../isis/applib/spec/AbstractSpecification2.java   |  21 +-
 .../org/apache/isis/applib/spec/Specification.java |   1 -
 .../apache/isis/applib/spec/Specification2.java    |   1 -
 .../apache/isis/applib/spec/SpecificationAnd.java  |   1 -
 .../apache/isis/applib/spec/SpecificationNot.java  |   1 -
 .../apache/isis/applib/spec/SpecificationOr.java   |   1 -
 .../java/org/apache/isis/applib/util/Enums.java    |   1 -
 .../isis/applib/util/ObjectContract_Empty.java     |   1 -
 .../isis/applib/util/ObjectContract_Impl.java      |   1 -
 .../isis/applib/util/ObjectContract_Parser.java    |   1 -
 .../apache/isis/applib/util/ObjectContracts.java   |  27 +-
 .../org/apache/isis/applib/util/ReasonBuffer.java  |   1 -
 .../java/org/apache/isis/applib/util/Reasons.java  |   1 -
 .../org/apache/isis/applib/util/TitleBuffer.java   |   1 -
 .../isis/applib/util/TitleBufferException.java     |   1 -
 .../java/org/apache/isis/applib/value/Blob.java    |   1 -
 .../java/org/apache/isis/applib/value/Clob.java    |   1 -
 .../isis/applib/value/LocalResourcePath.java       |  25 +-
 .../java/org/apache/isis/applib/value/Markup.java  |   1 -
 .../isis/applib/value/NamedWithMimeType.java       |   1 -
 .../org/apache/isis/applib/value/Password.java     |   1 -
 .../org/apache/isis/applib/IdentifierTests.java    |   1 -
 .../org/apache/isis/applib/SomeDomainClass.java    |   1 -
 .../commons/internal/reflection/ReflectTest.java   |   1 -
 .../isis/applib/events/InteractionEventTest.java   |   1 -
 .../applib/services/bookmark/BookmarkTest.java     |  26 +-
 .../exceprecog/ExceptionRecognizerForTypeTest.java |   1 -
 .../exceprecog/ExceptionRecognizerGeneralTest.java |   1 -
 .../applib/spec/AbstractSpecification2Test.java    |   1 -
 .../applib/spec/AbstractSpecificationTest.java     |   1 -
 .../org/apache/isis/applib/util/EnumsTest.java     |   1 -
 .../apache/isis/applib/util/ReasonBufferTest.java  |   1 -
 .../org/apache/isis/applib/util/ReasonsTest.java   |   1 -
 .../apache/isis/applib/util/TitleBufferTest.java   |   1 -
 .../apache/isis/applib/util/TitleTestObject.java   |   1 -
 .../isis/applib/value/Blob_constructor_Test.java   |   1 -
 .../isis/applib/value/Clob_constructor_Test.java   |   1 -
 .../apache/isis/applib/value/Password_Test.java    |   1 -
 .../org/apache/isis/commons/collections/Can.java   | 119 +++--
 .../apache/isis/commons/collections/Can_Empty.java |  15 +-
 .../isis/commons/collections/Can_Multiple.java     |  25 +-
 .../isis/commons/collections/Can_Singleton.java    |  18 +-
 .../isis/commons/collections/ImmutableEnumSet.java |  12 +
 .../isis/commons/collections/_CanFactory.java      |  69 +++
 .../apache/isis/commons/internal/_Constants.java   |   1 -
 .../isis/commons/internal/assertions/_Assert.java  |   1 -
 .../isis/commons/internal/base/_Blackhole.java     |   1 -
 .../apache/isis/commons/internal/base/_Bytes.java  |   1 -
 .../internal/base/_Bytes_GZipCompressor.java       |   1 -
 .../internal/base/_Bytes_GZipCompressorSmart.java  |   1 -
 .../apache/isis/commons/internal/base/_Casts.java  |   1 -
 .../apache/isis/commons/internal/base/_Either.java |   1 -
 .../apache/isis/commons/internal/base/_Lazy.java   |   1 -
 .../isis/commons/internal/base/_Lazy_Simple.java   |   1 -
 .../commons/internal/base/_Lazy_ThreadSafe.java    |   1 -
 .../isis/commons/internal/base/_NullSafe.java      |   5 +-
 .../isis/commons/internal/base/_Optionals.java     |  20 +-
 .../apache/isis/commons/internal/base/_Refs.java   |   5 +-
 .../isis/commons/internal/base/_Strings.java       |  43 +-
 .../internal/base/_Strings_HtmlEscaper.java        |   1 -
 .../internal/base/_Strings_KeyValuePair.java       |  29 +-
 .../internal/base/_Strings_NaturalNames.java       |   1 -
 .../internal/base/_Strings_SplitIterator.java      |   1 -
 .../apache/isis/commons/internal/base/_Text.java   |   1 -
 .../apache/isis/commons/internal/base/_Timing.java |   1 -
 .../apache/isis/commons/internal/base/_Tuples.java |   1 -
 .../apache/isis/commons/internal/base/_With.java   |  48 +-
 .../isis/commons/internal/collections/_Arrays.java |   1 -
 .../internal/collections/_Arrays_Collector.java    |   1 -
 .../collections/_Arrays_CollectorUnknownSize.java  |   1 -
 .../commons/internal/collections/_Collections.java |   1 -
 .../collections/_Collections_Collector.java        |   1 -
 .../collections/_Collections_SortedSetOfList.java  |   1 -
 .../isis/commons/internal/collections/_Lists.java  |   1 -
 .../isis/commons/internal/collections/_Maps.java   |   1 -
 .../commons/internal/collections/_Multimaps.java   |   1 -
 .../isis/commons/internal/collections/_Sets.java   |   1 -
 .../commons/internal/collections/_Streams.java     |   1 -
 .../commons/internal/compare/_Comparators.java     |   1 -
 .../isis/commons/internal/context/_Context.java    |   1 -
 .../internal/context/_Context_ThreadLocal.java     |   1 -
 .../isis/commons/internal/context/_Plugin.java     |   1 -
 .../apache/isis/commons/internal/debug/_Probe.java |   1 -
 .../commons/internal/exceptions/_Exceptions.java   |   1 -
 .../factory/_InstanceCreationClassException.java   |   1 -
 .../factory/_InstanceCreationException.java        |   1 -
 .../commons/internal/factory/_InstanceUtil.java    |   1 -
 .../factory/_UnavailableClassException.java        |   1 -
 .../apache/isis/commons/internal/hash/_Hashes.java |   1 -
 .../isis/commons/internal/memento/_Mementos.java   |   1 -
 .../internal/memento/_Mementos_MementoDefault.java |   1 -
 .../commons/internal/reflection/_Annotations.java  |  65 +--
 .../commons/internal/reflection/_ClassCache.java   | 297 ++++++++++++
 .../commons/internal/reflection/_MethodCache.java  | 106 -----
 .../isis/commons/internal/reflection/_Reflect.java | 168 +++++--
 .../commons/internal/resources/_Serializables.java |  84 ++++
 .../internal/testing/_SerializationTester.java     |  29 +-
 .../apache/isis/commons/collections/CanTest.java   |  64 ++-
 .../isis/commons/internal/base/BytesTest.java      |   1 -
 .../isis/commons/internal/base/NullSafeTest.java   |   1 -
 .../isis/commons/internal/base/ReductionTest.java  |   1 -
 .../isis/commons/internal/base/StringsTest.java    |   1 -
 .../commons/internal/compare/ComparatorsTest.java  |   1 -
 .../commons/internal/reflection/ReflectTest.java   |  94 ++++
 core/adoc/modules/_overview/pages/about.adoc       | 477 ++-----------------
 .../apache/isis/core/config/IsisConfiguration.java |  34 +-
 .../isis/core/config/IsisModuleCoreConfig.java     |   2 +-
 .../IsisBeanFactoryPostProcessorForSpring.java     |   7 +-
 .../config/beans/IsisBeanTypeClassifierImpl.java   |  19 +-
 .../isis/core/config/messages/MessageRegistry.java |   1 -
 .../progmodel/ProgrammingModelConstants.java       | 365 +++++++++++++++
 .../isis/core/config/util/LogicalTypeNameUtil.java |  54 ---
 .../isis/core/config/viewer/web/DialogMode.java    |  26 ++
 .../core/config/viewer/web/WebAppContextPath.java  | 159 +++++++
 .../isis/core/config/viewer/wicket/DialogMode.java |  26 --
 .../config/viewer/wicket/WebAppContextPath.java    | 140 ------
 .../WebAppContextPath_setContextPath_Test.java     |   2 +
 .../core/interaction/session/MessageBroker.java    |   1 -
 .../interaction/InteractionDefaultTest_next.java   |   1 -
 .../config/IsisConfigurationLegacy.java            |   3 +-
 .../jmocking/InjectIntoJMockAction.java            |   1 -
 .../_testing/MetaModelContext_forTesting.java      |   8 +-
 .../_testing/MethodRemoverForTesting.java          |   8 +-
 .../core/metamodel/commons/ArrayExtensions.java    |   1 -
 .../isis/core/metamodel/commons/CanBeVoid.java     |   1 -
 .../metamodel/commons/CanonicalParameterUtil.java  |  27 +-
 .../core/metamodel/commons/ClassExtensions.java    |   1 -
 .../isis/core/metamodel/commons/ClassUtil.java     |   2 +-
 .../core/metamodel/commons/DateExtensions.java     |   1 -
 .../metamodel/commons/InputStreamExtensions.java   |   1 -
 .../core/metamodel/commons/ListExtensions.java     |   1 -
 .../isis/core/metamodel/commons/LocaleUtil.java    |   1 -
 .../isis/core/metamodel/commons/MapUtil.java       |   1 -
 .../core/metamodel/commons/MethodExtensions.java   |   1 -
 .../isis/core/metamodel/commons/MethodUtil.java    |  35 +-
 .../core/metamodel/commons/ObjectExtensions.java   |   1 -
 .../isis/core/metamodel/commons/ResourceUtil.java  |   1 -
 .../core/metamodel/commons/StringExtensions.java   |  65 +--
 .../metamodel/commons/ThrowableExtensions.java     |   1 -
 .../isis/core/metamodel/commons/ToString.java      |   1 -
 .../apache/isis/core/metamodel/consent/Allow.java  |  18 +-
 .../isis/core/metamodel/consent/Consent.java       |   1 -
 .../core/metamodel/consent/ConsentAbstract.java    |   1 -
 .../core/metamodel/consent/InteractionAdvisor.java |   1 -
 .../metamodel/consent/InteractionContextType.java  |   1 -
 .../metamodel/consent/InteractionInitiatedBy.java  |   1 -
 .../core/metamodel/consent/InteractionResult.java  |   1 -
 .../metamodel/consent/InteractionResultSet.java    |   1 -
 .../apache/isis/core/metamodel/consent/Veto.java   |   1 -
 .../apache/isis/core/metamodel/facetapi/Facet.java |   4 -
 .../core/metamodel/facetapi/FacetAbstract.java     |  44 +-
 .../isis/core/metamodel/facetapi/FacetHolder.java  |   8 +-
 .../metamodel/facetapi/FacetHolderAbstract.java    |  15 +-
 .../isis/core/metamodel/facetapi/FacetUtil.java    |   1 -
 .../metamodel/facetapi/FacetWithAttributes.java    |   1 -
 .../isis/core/metamodel/facetapi/FeatureType.java  |   1 -
 .../core/metamodel/facetapi/HasFacetHolder.java    |  13 +-
 .../core/metamodel/facetapi/MetaModelRefiner.java  |   1 -
 .../core/metamodel/facetapi/MethodRemover.java     |   1 -
 .../isis/core/metamodel/facets/ActionSupport.java  |  91 ++--
 .../isis/core/metamodel/facets/Annotations.java    | 237 ----------
 .../core/metamodel/facets/DomainEventHelper.java   |  15 +-
 .../isis/core/metamodel/facets/Evaluators.java     | 202 ++++++++
 .../isis/core/metamodel/facets/FacetFactory.java   |  91 ++--
 .../metamodel/facets/FacetFactoryAbstract.java     |   7 +-
 .../isis/core/metamodel/facets/FacetedMethod.java  |   3 +-
 .../core/metamodel/facets/HasImperativeAspect.java |  40 ++
 .../facets/HasPostConstructMethodCache.java        |  58 +++
 .../core/metamodel/facets/ImperativeAspect.java    |  63 +++
 .../core/metamodel/facets/ImperativeFacet.java     |  17 -
 .../metamodel/facets/ImperativeFacetMulti.java     |  34 --
 .../metamodel/facets/ObjectTypeFacetFactory.java   |  22 +-
 .../core/metamodel/facets/ParameterSupport.java    | 152 ++----
 .../metamodel/facets/PostConstructMethodCache.java |  30 --
 ...ropertyOrCollectionIdentifyingFacetFactory.java |   3 +-
 ...rCollectionIdentifyingFacetFactoryAbstract.java |   5 +-
 .../metamodel/facets/SingleClassValueFacet.java    |   1 -
 .../facets/SingleClassValueFacetAbstract.java      |   1 -
 .../core/metamodel/facets/SingleIntValueFacet.java |   1 -
 .../facets/SingleIntValueFacetAbstract.java        |   1 -
 .../metamodel/facets/SingleStringValueFacet.java   |   1 -
 .../facets/SingleStringValueFacetAbstract.java     |  10 -
 .../core/metamodel/facets/SingleValueFacet.java    |   1 -
 .../metamodel/facets/SingleValueFacetAbstract.java |   1 -
 .../isis/core/metamodel/facets/TypedHolder.java    |   1 -
 .../core/metamodel/facets/WhereValueFacet.java     |   1 -
 .../metamodel/facets/WhereValueFacetAbstract.java  |   6 -
 .../facets/actcoll/typeof/TypeOfFacet.java         |  25 +-
 .../facets/actcoll/typeof/TypeOfFacetAbstract.java |   1 -
 .../actcoll/typeof/TypeOfFacetDefaultToObject.java |   1 -
 .../typeof/TypeOfFacetInferredFromArray.java       |   3 +-
 .../typeof/TypeOfFacetInferredFromGenerics.java    |   3 +-
 .../action/ActionAnnotationFacetFactory.java       |  23 +-
 ...nChoicesForCollectionParameterFacetFactory.java |   3 +-
 .../action/associateWith/ChoicesFromFacet.java     |   1 -
 .../associateWith/ChoicesFromFacetAbstract.java    |   1 -
 .../ChoicesFromFacetForActionAnnotation.java       |   1 -
 .../action/explicit/ActionExplicitFacet.java       |   1 -
 .../explicit/ActionExplicitFacetAbstract.java      |   1 -
 .../ActionExplicitFacetForActionAnnotation.java    |   1 -
 .../hidden/HiddenFacetForActionAnnotation.java     |   1 -
 .../action/invocation/ActionDomainEventFacet.java  |   1 -
 .../invocation/ActionDomainEventFacetAbstract.java |   1 -
 .../invocation/ActionDomainEventFacetDefault.java  |   1 -
 .../ActionDomainEventFacetForActionAnnotation.java |   1 -
 .../action/invocation/ActionInvocationFacet.java   |   1 -
 .../invocation/ActionInvocationFacetAbstract.java  |   1 -
 ...ctionInvocationFacetForDomainEventAbstract.java |  49 +-
 ...ionFacetForDomainEventFromActionAnnotation.java |   1 -
 ...onInvocationFacetForDomainEventFromDefault.java |   1 -
 .../actions/action/invocation/CommandUtil.java     |   1 -
 .../PrototypeFacetForActionAnnotation.java         |   1 -
 ...ctionSemanticsFacetFallbackToNonIdempotent.java |   1 -
 .../ActionSemanticsFacetForActionAnnotation.java   |   1 -
 .../typeof/TypeOfFacetForActionAnnotation.java     |   1 -
 .../actions/contributing/ContributingFacet.java    |   1 -
 .../contributing/ContributingFacetAbstract.java    |   1 -
 ...tributingFacetDerivedFromMixinFacetFactory.java |   1 -
 .../actions/defaults/ActionDefaultsFacet.java      |  35 --
 .../defaults/ActionDefaultsFacetAbstract.java      |  42 --
 .../method/ActionDefaultsFacetViaMethod.java       |  89 ----
 .../ActionDefaultsFacetViaMethodFactory.java       |  84 ----
 .../FileAcceptFacetForActionAnnotation.java        |   1 -
 .../facets/actions/homepage/HomePageFacet.java     |   1 -
 .../actions/homepage/HomePageFacetAbstract.java    |   1 -
 .../facets/actions/homepage/HomePageFacetImpl.java |   1 -
 .../annotation/HomePageFacetAnnotation.java        |   1 -
 .../annotation/HomePageFacetAnnotationFactory.java |   1 -
 ...tionPositionFacetForActionLayoutAnnotation.java |   1 -
 .../layout/ActionPositionFacetForActionXml.java    |   1 -
 ...okmarkPolicyFacetForActionLayoutAnnotation.java |   1 -
 .../layout/BookmarkPolicyFacetForActionXml.java    |   1 -
 .../CssClassFaFacetForActionLayoutAnnotation.java  |   1 -
 .../layout/CssClassFaFacetForActionXml.java        |   1 -
 .../layout/CssClassFaFacetForMenuBarXml.java       |   1 -
 .../CssClassFacetForActionLayoutAnnotation.java    |   1 -
 .../actions/layout/CssClassFacetForActionXml.java  |   1 -
 .../actions/layout/CssClassFacetForMenuBarXml.java |   1 -
 .../HiddenFacetForActionLayoutAnnotation.java      |   1 -
 .../actions/layout/HiddenFacetForActionXml.java    |   1 -
 ...berDescribedFacetForActionLayoutAnnotation.java |   1 -
 .../layout/MemberDescribedFacetForActionXml.java   |   1 -
 .../layout/MemberDescribedFacetForMenuBarXml.java  |   1 -
 .../layout/MemberNamedFacetForActionXml.java       |   1 -
 .../layout/MemberNamedFacetForMenuBarXml.java      |   1 -
 .../NamedFacetForActionLayoutAnnotation.java       |   1 -
 .../PromptStyleFacetForActionLayoutAnnotation.java |   1 -
 .../layout/PromptStyleFacetForActionXml.java       |   1 -
 .../RedirectFacetFromActionLayoutAnnotation.java   |   1 -
 .../actions/layout/RedirectFacetFromActionXml.java |   1 -
 .../notinservicemenu/NotInServiceMenuFacet.java    |   1 -
 .../NotInServiceMenuFacetAbstract.java             |   1 -
 ...uFacetDerivedFromDomainServiceFacetFactory.java |   1 -
 .../actions/position/ActionPositionFacet.java      |   1 -
 .../position/ActionPositionFacetAbstract.java      |   6 -
 .../position/ActionPositionFacetFallback.java      |   1 -
 .../facets/actions/prototype/PrototypeFacet.java   |   1 -
 .../actions/prototype/PrototypeFacetAbstract.java  |   1 -
 .../facets/actions/redirect/RedirectFacet.java     |   1 -
 .../actions/redirect/RedirectFacetAbstract.java    |   6 -
 .../actions/redirect/RedirectFacetFallback.java    |   1 -
 .../actions/semantics/ActionSemanticsFacet.java    |   1 -
 .../semantics/ActionSemanticsFacetAbstract.java    |   1 -
 .../validate/ActionParameterValidationFacet.java   |   1 -
 .../ActionParameterValidationFacetAbstract.java    |   1 -
 .../actions/validate/ActionValidationFacet.java    |   1 -
 .../validate/ActionValidationFacetAbstract.java    |   1 -
 .../ActionParameterValidationFacetViaMethod.java   |   7 -
 .../method/ActionValidationFacetViaMethod.java     |  27 +-
 .../ActionValidationFacetViaMethodFactory.java     |  50 +-
 .../core/metamodel/facets/all/help/HelpFacet.java  |   1 -
 .../facets/all/help/HelpFacetAbstract.java         |   1 -
 .../metamodel/facets/all/hide/HiddenFacet.java     |   1 -
 .../named/MemberNamedFacetForStaticMemberName.java |   1 -
 .../facets/collections/CollectionFacet.java        |  21 +-
 .../collections/CollectionFacetAbstract.java       |   1 -
 .../CollectionAccessorFacetViaAccessor.java        |   7 -
 .../CollectionAccessorFacetViaAccessorFactory.java |  13 +-
 .../CollectionAnnotationFacetFactory.java          |   7 +-
 .../collection/defaultview/DefaultViewFacet.java   |   1 -
 .../defaultview/DefaultViewFacetAbstract.java      |   1 -
 .../hidden/HiddenFacetForCollectionAnnotation.java |   1 -
 .../modify/CollectionDomainEventFacet.java         |   1 -
 .../modify/CollectionDomainEventFacetAbstract.java |   1 -
 .../modify/CollectionDomainEventFacetDefault.java  |   1 -
 ...ionDomainEventFacetForCollectionAnnotation.java |   1 -
 ...fFacetOnCollectionFromCollectionAnnotation.java |   1 -
 .../javautilcollection/CollectionFacetFactory.java |   9 +-
 .../javautilcollection/JavaArrayFacet.java         |   1 -
 .../javautilcollection/JavaCollectionFacet.java    |   1 -
 ...CssClassFacetForCollectionLayoutAnnotation.java |   1 -
 .../layout/CssClassFacetForCollectionXml.java      |   1 -
 ...aultViewFacetForCollectionLayoutAnnotation.java |   1 -
 .../layout/DefaultViewFacetForCollectionXml.java   |   1 -
 .../HiddenFacetForCollectionLayoutAnnotation.java  |   1 -
 .../layout/HiddenFacetForCollectionXml.java        |   1 -
 ...escribedFacetForCollectionLayoutAnnotation.java |   1 -
 .../MemberDescribedFacetForCollectionXml.java      |   1 -
 ...berNamedFacetForCollectionLayoutAnnotation.java |   1 -
 .../layout/MemberNamedFacetForCollectionXml.java   |   1 -
 .../PagedFacetForCollectionLayoutAnnotation.java   |   1 -
 .../layout/PagedFacetForCollectionXml.java         |   1 -
 ...SortedByFacetForCollectionLayoutAnnotation.java |   1 -
 .../layout/SortedByFacetForCollectionXml.java      |   1 -
 .../parented/ParentedCollectionFacetDefault.java   |   1 -
 .../ParentedFacetSinceCollectionFactory.java       |   1 -
 .../facets/collections/sortedby/SortedByFacet.java |   1 -
 .../sortedby/SortedByFacetAbstract.java            |   1 -
 .../annotation/SortedByFacetAnnotationFactory.java |   1 -
 .../collparam/semantics/CollectionSemantics.java   |   4 +-
 .../semantics/CollectionSemanticsFacet.java        |   1 -
 .../semantics/CollectionSemanticsFacetDefault.java |   1 -
 .../facets/fallback/ActionChoicesFacetNone.java    |  42 --
 .../facets/fallback/ActionDefaultsFacetNone.java   |  37 --
 .../facets/fallback/FallbackFacetFactory.java      |   6 +-
 .../metamodel/facets/fallback/HelpFacetNone.java   |   1 -
 .../facets/fallback/MaxLengthFacetUnlimited.java   |   1 -
 .../facets/fallback/MultiLineFacetNone.java        |   1 -
 .../fallback/NamedFacetFallbackFromMemberName.java |   1 -
 .../metamodel/facets/fallback/TitleFacetNone.java  |   1 -
 .../metamodel/facets/jaxb/JaxbFacetFactory.java    |   1 -
 .../facets/jaxb/XmlAccessorTypeFacet.java          |   1 -
 .../facets/jaxb/XmlAccessorTypeFacetAbstract.java  |   1 -
 .../facets/jaxb/XmlAccessorTypeFacetDefault.java   |   1 -
 .../facets/jaxb/XmlJavaTypeAdapterFacet.java       |   1 -
 .../jaxb/XmlJavaTypeAdapterFacetAbstract.java      |   1 -
 .../jaxb/XmlJavaTypeAdapterFacetDefault.java       |   1 -
 .../metamodel/facets/jaxb/XmlTransientFacet.java   |   1 -
 .../facets/jaxb/XmlTransientFacetAbstract.java     |   1 -
 .../facets/jaxb/XmlTransientFacetDefault.java      |   1 -
 .../facets/members/cssclass/CssClassFacet.java     |   1 -
 .../members/cssclass/CssClassFacetAbstract.java    |   1 -
 .../members/cssclass/CssClassFacetSimple.java      |   1 -
 .../CssClassFacetOnActionFromConfiguredRegex.java  |   1 -
 ...assFacetOnActionFromConfiguredRegexFactory.java |   1 -
 .../facets/members/cssclassfa/CssClassFaFacet.java |   1 -
 .../cssclassfa/CssClassFaImperativeFacet.java      |   1 -
 .../CssClassFaImperativeFacetAbstract.java         |   1 -
 .../members/cssclassfa/CssClassFaStaticFacet.java  |   1 -
 .../cssclassfa/CssClassFaStaticFacetAbstract.java  |   1 -
 ...CssClassFaFacetOnMemberFromConfiguredRegex.java |   1 -
 .../CssClassFaFacetOnMemberPostProcessor.java      |   1 -
 .../DescribedAsFacetOnMemberFromProperties.java    |   1 -
 .../DescribedAsFacetOnMemberInferredFromType.java  |   1 -
 .../DescribedAsFacetForMemberViaMethodFactory.java |  54 +--
 .../facets/members/disabled/DisabledFacet.java     |   1 -
 .../members/disabled/DisabledFacetAbstract.java    |   1 -
 .../disabled/DisabledFacetForContributee.java      |   1 -
 .../disabled/method/DisableForContextFacet.java    |   1 -
 .../method/DisableForContextFacetAbstract.java     |   1 -
 .../method/DisableForContextFacetNone.java         |   1 -
 .../method/DisableForContextFacetViaMethod.java    |  17 +-
 .../DisableForContextFacetViaMethodFactory.java    |  76 +--
 .../facets/members/hidden/HiddenFacetAbstract.java |   1 -
 .../HiddenFacetAbstractAlwaysEverywhere.java       |   1 -
 .../members/hidden/HiddenFacetAbstractImpl.java    |   1 -
 .../HiddenFacetFromLayoutPropertiesAbstract.java   |   1 -
 .../members/hidden/method/HideForContextFacet.java |   1 -
 .../hidden/method/HideForContextFacetAbstract.java |   1 -
 .../hidden/method/HideForContextFacetNone.java     |   1 -
 .../method/HideForContextFacetViaMethod.java       |   7 -
 .../HideForContextFacetViaMethodFactory.java       |  70 +--
 .../members/layout/group/GroupIdAndName.java       |  13 +-
 ...utOrderFacetFromCollectionLayoutAnnotation.java |   1 -
 ...youtOrderFacetFromPropertyLayoutAnnotation.java |   1 -
 .../NamedFacetForMemberViaMethodFactory.java       |  53 +--
 .../facets/members/navigation/NavigationFacet.java |   1 -
 .../publish/command/CommandPublishingFacet.java    |   1 -
 .../command/CommandPublishingFacetAbstract.java    |   1 -
 .../CommandPublishingFacetFromConfiguration.java   |   1 -
 ...onPublishingActionFacetForActionAnnotation.java |   1 -
 ...ActionFacetForActionAnnotationAsConfigured.java |   1 -
 ...tionPublishingActionFacetFromConfiguration.java |   1 -
 .../execution/ExecutionPublishingFacet.java        |   1 -
 .../ExecutionPublishingFacetAbstract.java          |   1 -
 ...blishingPropertyFacetForPropertyAnnotation.java |   1 -
 ...onPublishingPropertyFacetFromConfiguration.java |   1 -
 ...mberAndPropertySupportFacetFactoryAbstract.java |  48 ++
 .../support/MemberSupportFacetFactoryAbstract.java |  85 ++++
 .../object/autocomplete/AutoCompleteFacet.java     |   1 -
 .../autocomplete/AutoCompleteFacetAbstract.java    |   1 -
 .../BookmarkPolicyFacetFallbackFactory.java        |   1 -
 .../facets/object/callbacks/CallbackFacet.java     |   5 +-
 .../object/callbacks/CallbackFacetAbstract.java    |  40 +-
 .../object/callbacks/CallbackFacetFactory.java     |  86 ++++
 .../object/callbacks/CreatedCallbackFacet.java     |   1 -
 .../callbacks/CreatedCallbackFacetAbstract.java    |  10 +-
 .../callbacks/CreatedCallbackFacetFactory.java     |  55 ---
 .../callbacks/CreatedCallbackFacetViaMethod.java   |   9 +-
 .../callbacks/CreatedLifecycleEventFacet.java      |   1 -
 ...fecycleEventFacetForDomainObjectAnnotation.java |   1 -
 .../object/callbacks/LifecycleEventFacet.java      |   1 -
 .../object/callbacks/LoadCallbackFacetFactory.java |  59 ---
 .../object/callbacks/LoadedCallbackFacet.java      |   1 -
 .../callbacks/LoadedCallbackFacetAbstract.java     |  10 +-
 .../callbacks/LoadedCallbackFacetViaMethod.java    |  13 +-
 .../callbacks/LoadedLifecycleEventFacet.java       |   1 -
 ...fecycleEventFacetForDomainObjectAnnotation.java |   1 -
 .../callbacks/PersistCallbackFacetFactory.java     |  83 ----
 .../PersistCallbackViaSaveMethodFacetFactory.java  |  83 ----
 .../object/callbacks/PersistedCallbackFacet.java   |   1 -
 .../callbacks/PersistedCallbackFacetAbstract.java  |  10 +-
 .../callbacks/PersistedCallbackFacetViaMethod.java |  13 +-
 .../callbacks/PersistedLifecycleEventFacet.java    |   1 -
 ...fecycleEventFacetForDomainObjectAnnotation.java |   1 -
 .../object/callbacks/PersistingCallbackFacet.java  |   1 -
 .../callbacks/PersistingCallbackFacetAbstract.java |  10 +-
 .../PersistingCallbackFacetViaMethod.java          |  13 +-
 .../callbacks/PersistingLifecycleEventFacet.java   |   1 -
 ...fecycleEventFacetForDomainObjectAnnotation.java |   1 -
 .../callbacks/RemoveCallbackFacetFactory.java      |  71 ---
 .../RemoveCallbackViaDeleteMethodFacetFactory.java |  70 ---
 .../object/callbacks/RemovingCallbackFacet.java    |   1 -
 .../callbacks/RemovingCallbackFacetAbstract.java   |  10 +-
 .../callbacks/RemovingCallbackFacetViaMethod.java  |  13 +-
 .../callbacks/RemovingLifecycleEventFacet.java     |   1 -
 ...fecycleEventFacetForDomainObjectAnnotation.java |   1 -
 .../callbacks/UpdateCallbackFacetFactory.java      |  73 ---
 .../object/callbacks/UpdatedCallbackFacet.java     |   1 -
 .../callbacks/UpdatedCallbackFacetAbstract.java    |  10 +-
 .../callbacks/UpdatedCallbackFacetViaMethod.java   |  13 +-
 .../callbacks/UpdatedLifecycleEventFacet.java      |   1 -
 ...fecycleEventFacetForDomainObjectAnnotation.java |   1 -
 .../object/callbacks/UpdatingCallbackFacet.java    |   1 -
 .../callbacks/UpdatingCallbackFacetAbstract.java   |  10 +-
 .../callbacks/UpdatingCallbackFacetViaMethod.java  |  12 +-
 .../callbacks/UpdatingLifecycleEventFacet.java     |   1 -
 ...fecycleEventFacetForDomainObjectAnnotation.java |   1 -
 .../choices/ChoicesFacetFromBoundedAbstract.java   |   1 -
 .../object/choices/enums/ChoicesFacetEnum.java     |   1 -
 .../facets/object/choices/enums/EnumFacet.java     |   1 -
 ...ingValueFacetUsingSemanticsProviderFactory.java |   6 +-
 .../choices/enums/EnumValueSemanticsProvider.java  |  48 +-
 .../cssclass/method/CssClassFacetMethod.java       |  65 ---
 .../method/CssClassFacetMethodFactory.java         |  56 ---
 .../method/CssClassFacetViaCssClassMethod.java     |  72 +++
 ...ssClassFaFacetForDomainObjectLayoutFactory.java |   1 -
 .../facets/object/defaults/DefaultedFacet.java     |   4 +-
 .../object/defaults/DefaultedFacetAbstract.java    |   6 -
 .../DefaultedFacetUsingDefaultsProvider.java       |   1 -
 .../object/defaults/DefaultsProviderUtil.java      |   1 -
 .../annotcfg/DefaultedFacetAnnotation.java         |   1 -
 ...tedFacetAnnotationElseConfigurationFactory.java |  24 +-
 .../annotcfg/DefaultedFacetFromConfiguration.java  |   1 -
 .../object/disabled/DisabledObjectFacet.java       |   1 -
 .../disabled/DisabledObjectFacetAbstract.java      |   9 +-
 .../method/DisabledObjectFacetViaMethod.java       |  67 ++-
 .../DisabledObjectFacetViaMethodFactory.java       |  94 ----
 .../DomainObjectAnnotationFacetFactory.java        |  44 +-
 ...AutoCompleteFacetForDomainObjectAnnotation.java |   1 -
 .../ChoicesFacetForDomainObjectAnnotation.java     |   1 -
 ...EventDefaultFacetForDomainObjectAnnotation.java |   1 -
 ...EventDefaultFacetForDomainObjectAnnotation.java |   1 -
 ...EventDefaultFacetForDomainObjectAnnotation.java |   1 -
 ...itingEnabledFacetForDomainObjectAnnotation.java |   1 -
 .../ImmutableFacetForDomainObjectAnnotation.java   |   1 -
 ...FacetForDomainObjectAnnotationAsConfigured.java |   1 -
 .../editing/ImmutableFacetFromConfiguration.java   |   1 -
 ...ectionPolicyFacetForDomainObjectAnnotation.java |  58 +++
 .../LogicalTypeFacetForDomainObjectAnnotation.java |  50 ++
 .../LogicalTypeFacetForDomainObjectAnnotation.java |  52 ---
 ...atableObjectFacetForDomainObjectAnnotation.java |   7 +-
 .../BookmarkPolicyFacetForDomainObjectXml.java     |   1 -
 ...lassFaFacetForDomainObjectLayoutAnnotation.java |   1 -
 .../CssClassFaFacetForDomainObjectXml.java         |   1 -
 ...sClassFacetForDomainObjectLayoutAnnotation.java |   4 +-
 .../CssClassFacetForDomainObjectXml.java           |   1 -
 ...ObjectLayoutAnnotationUsingCssClassUiEvent.java |   1 -
 .../DescribedAsFacetForDomainObjectXml.java        |   1 -
 ...mainObjectLayoutAnnotationUsingIconUiEvent.java |   1 -
 ...inObjectLayoutAnnotationUsingLayoutUiEvent.java |   1 -
 .../ObjectNamedFacetForDomainObjectXml.java        |   1 -
 ...ainObjectLayoutAnnotationUsingTitleUiEvent.java |   1 -
 .../facets/object/encodeable/EncodableFacet.java   |   1 -
 .../object/encodeable/EncodableFacetAbstract.java  |  13 +-
 .../object/encodeable/EncoderDecoderUtil.java      |   1 -
 .../annotcfg/EncodableFacetFromConfiguration.java  |   1 -
 .../encoder/EncodableFacetUsingEncoderDecoder.java |  12 +-
 .../facets/object/entity/EntityFacet.java          |   1 -
 .../facets/object/facets/FacetsFacet.java          |  47 --
 .../facets/object/facets/FacetsFacetAbstract.java  | 100 ----
 .../facets/annotation/FacetsFacetAnnotation.java   |  33 --
 .../annotation/FacetsFacetAnnotationFactory.java   |  59 ---
 .../facets/object/hidden/HiddenInstanceFacet.java  |   1 -
 .../facets/object/hidden/HiddenObjectFacet.java    |   1 -
 .../object/hidden/HiddenObjectFacetAbstract.java   |   5 +-
 .../facets/object/hidden/HiddenTypeFacet.java      |   1 -
 .../HiddenTypeFacetDerivedFromAuthorization.java   |   1 -
 ...enTypeFacetDerivedFromAuthorizationFactory.java |   1 -
 .../hidden/method/HiddenObjectFacetViaMethod.java  |  38 +-
 .../method/HiddenObjectFacetViaMethodFactory.java  |  98 ----
 .../metamodel/facets/object/icon/IconFacet.java    |   1 -
 .../facets/object/icon/IconFacetAbstract.java      |   1 -
 .../facets/object/icon/method/IconFacetMethod.java |  57 ---
 .../object/icon/method/IconFacetMethodFactory.java |  58 ---
 .../icon/method/IconFacetViaIconNameMethod.java    |  72 +++
 .../RemoveAnnotatedMethodsFacetFactory.java        |   9 +-
 ...oveDatanucleusPersistableTypesFacetFactory.java |   8 +-
 .../RemoveDnPrefixedMethodsFacetFactory.java       |  15 +-
 .../javalang/IteratorFilteringFacetFactory.java    |   1 -
 .../ignore/javalang/RemoveMethodsFacetFactory.java |  32 +-
 .../jdo/RemoveJdoEnhancementTypesFacetFactory.java |  11 +-
 .../jdo/RemoveJdoPrefixedMethodsFacetFactory.java  |  16 +-
 .../object/immutable/EditingEnabledFacet.java      |   1 -
 .../facets/object/immutable/ImmutableFacet.java    |   1 -
 .../object/immutable/ImmutableFacetAbstract.java   |   1 -
 .../CopyImmutableFacetOntoMembersFactory.java      |   1 -
 .../introspection/IntrospectionPolicyFacet.java    |  57 +++
 .../IntrospectionPolicyFacetAbstract.java          |  61 +++
 .../facets/object/layout/LayoutFacet.java          |   1 -
 .../facets/object/layout/LayoutFacetAbstract.java  |   1 -
 .../facets/object/layout/LayoutFacetFactory.java   |  58 ---
 .../facets/object/layout/LayoutFacetFallback.java  |   1 -
 .../facets/object/layout/LayoutFacetMethod.java    |  57 ---
 .../object/layout/LayoutFacetViaLayoutMethod.java  |  78 ++++
 .../logicaltype/LogicalTypeFacetAbstract.java      |   1 -
 ...ogicalTypeFacetDerivedFromClassNameFactory.java |   1 -
 .../LogicalTypeFacetInferredFromClassName.java     |   1 -
 ...icalTypeFacetInferredFromIoCNamingStrategy.java |   1 -
 .../LogicalTypeFacetOnStandaloneList.java          |   1 -
 .../metamodel/facets/object/mixin/MixinFacet.java  |   1 -
 .../facets/object/mixin/MixinFacetAbstract.java    |   1 -
 .../mixin/MixinFacetForDomainObjectAnnotation.java |   1 -
 .../object/navparent/NavigableParentFacet.java     |   1 -
 .../navparent/NavigableParentFacetAbstract.java    |   5 +-
 .../NavigableParentAnnotationFacetFactory.java     |  93 ++--
 .../method/NavigableParentFacetMethod.java         |  60 ---
 .../NavigableParentFacetViaGetterMethod.java       |  62 +++
 .../ObjectValidPropertiesFacet.java                |   1 -
 .../ObjectValidPropertiesFacetAbstract.java        |   1 -
 .../impl/ObjectValidPropertiesFacetImpl.java       |   1 -
 .../ObjectValidPropertiesFacetImplFactory.java     |   1 -
 .../metamodel/facets/object/paged/PagedFacet.java  |   1 -
 .../facets/object/paged/PagedFacetAbstract.java    |   1 -
 .../PagedFacetForPagedAnnotationOnType.java        |   1 -
 .../object/parented/ParentedCollectionFacet.java   |   1 -
 .../parented/ParentedCollectionFacetAbstract.java  |   1 -
 .../facets/object/parseable/ParseableFacet.java    |   1 -
 .../object/parseable/ParseableFacetAbstract.java   |   8 +-
 .../facets/object/parseable/ParserUtil.java        |   1 -
 .../annotcfg/ParseableFacetFromConfiguration.java  |   1 -
 .../parser/ParseableFacetUsingParser.java          |  11 +-
 .../facets/object/projection/ProjectionFacet.java  |   1 -
 .../object/projection/ProjectionFacetAbstract.java |   1 -
 .../ProjectionFacetFromProjectingProperty.java     |   1 -
 .../CssClassFacetInferredFromProjectionFacet.java  |   1 -
 .../ident/IconFacetDerivedFromProjectionFacet.java |   1 -
 .../TitleFacetDerivedFromProjectionFacet.java      |   1 -
 .../object/promptStyle/PromptStyleFacet.java       |   1 -
 .../promptStyle/PromptStyleFacetAbstract.java      |   1 -
 .../promptStyle/PromptStyleFacetAsConfigured.java  |   1 -
 ...tyDerivedFromRecreatableObjectFacetFactory.java |  57 ---
 ...cetOnPropertyInferredFromRecreatableObject.java |  51 --
 .../RecreatableObjectFacetAbstract.java            |  36 +-
 ...ObjectFacetDeclarativeInitializingAbstract.java |   5 +-
 .../recreatable/RecreatableObjectFacetFactory.java |  19 +-
 ...ctFacetForRecreatableDomainObjectInterface.java |   5 +-
 ...eObjectFacetForRecreatableObjectAnnotation.java |   5 +-
 ...leObjectFacetForRecreatableObjectInterface.java |   5 +-
 ...ableObjectFacetForXmlRootElementAnnotation.java |  23 +-
 .../metamodel/facets/object/recreatable/Util.java  |  33 --
 .../object/support/ObjectSupportFacetAbstract.java |   8 +
 .../object/support/ObjectSupportFacetFactory.java  | 149 ++++++
 .../metamodel/facets/object/title/TitleFacet.java  |   1 -
 .../facets/object/title/TitleFacetAbstract.java    |  33 +-
 .../annotation/TitleAnnotationFacetFactory.java    | 150 ++----
 .../annotation/TitleFacetViaTitleAnnotation.java   | 223 ++++++---
 .../TitleFacetInferredFromToStringMethod.java      |  46 +-
 .../title/methods/TitleFacetViaMethodsFactory.java | 118 -----
 .../title/methods/TitleFacetViaTitleMethod.java    |  47 +-
 .../object/title/parser/TitleFacetUsingParser.java |  17 +-
 .../validateobject/ValidateObjectFacet.java        |  55 ---
 .../ValidateObjectFacetAbstract.java               |  48 --
 .../method/ValidateObjectFacetMethod.java          |  79 ----
 .../method/ValidateObjectFacetMethodFactory.java   |  67 ---
 .../facets/object/value/EqualByContentFacet.java   |   1 -
 .../object/value/EqualByContentFacetAbstract.java  |   1 -
 .../EqualByContentFacetViaValueSemantics.java      |   1 -
 .../value/ImmutableFacetViaValueSemantics.java     |   1 -
 .../object/value/MaxLengthFacetUsingParser.java    |   9 +-
 .../value/TypicalLengthFacetUsingParser.java       |   8 +-
 .../metamodel/facets/object/value/ValueFacet.java  |   1 -
 .../facets/object/value/ValueFacetAbstract.java    |   2 +-
 .../facets/object/value/ValueFacetSimple.java      |   1 -
 .../value/annotcfg/ValueFacetAnnotation.java       |   1 -
 ...ValueFacetAnnotationOrConfigurationFactory.java |   1 -
 .../annotcfg/ValueFacetFromConfiguration.java      |   1 -
 .../vsp/ValueFacetUsingSemanticsProvider.java      |   1 -
 .../ValueFacetUsingSemanticsProviderFactory.java   |   1 -
 .../ValueSemanticsProviderAndFacetAbstract.java    |   1 -
 .../value/vsp/ValueSemanticsProviderUtil.java      |   1 -
 .../facets/object/viewmodel/ViewModelFacet.java    |  34 +-
 .../facets/object/wizard/WizardFacet.java          |  41 --
 .../facets/object/wizard/WizardFacetAbstract.java  |  36 --
 .../facets/objectvalue/choices/ChoicesFacet.java   |   1 -
 .../objectvalue/choices/ChoicesFacetAbstract.java  |   1 -
 .../objectvalue/fileaccept/FileAcceptFacet.java    |   1 -
 .../fileaccept/FileAcceptFacetAbstract.java        |   1 -
 .../facets/objectvalue/labelat/LabelAtFacet.java   |   1 -
 .../objectvalue/labelat/LabelAtFacetAbstract.java  |  10 +-
 .../LabelAtFacetInferredFromMultiLineFacet.java    |   1 -
 .../objectvalue/mandatory/MandatoryFacet.java      |   1 -
 .../mandatory/MandatoryFacetAbstract.java          |   1 -
 .../mandatory/MandatoryFacetDefault.java           |   1 -
 .../facets/objectvalue/maxlen/MaxLengthFacet.java  |   1 -
 .../objectvalue/maxlen/MaxLengthFacetAbstract.java |   8 +-
 .../objectvalue/multiline/MultiLineFacet.java      |   1 -
 .../multiline/MultiLineFacetAbstract.java          |   6 -
 .../MustSatisfySpecificationFacet.java             |   1 -
 .../MustSatisfySpecificationFacetAbstract.java     |   1 -
 .../facets/objectvalue/regex/RegExFacet.java       |   1 -
 .../objectvalue/regex/RegExFacetAbstract.java      |   1 -
 .../renderedadjusted/RenderedAdjustedFacet.java    |   1 -
 .../RenderedAdjustedFacetAbstract.java             |  15 +-
 .../objectvalue/typicallen/TypicalLengthFacet.java |   1 -
 .../typicallen/TypicalLengthFacetAbstract.java     |  22 +-
 .../ActionParameterAutoCompleteFacet.java          |   1 -
 .../ActionParameterAutoCompleteFacetAbstract.java  |   1 -
 .../ActionParameterAutoCompleteFacetViaMethod.java |  20 +-
 ...ParameterAutoCompleteFacetViaMethodFactory.java |  77 +---
 .../facets/param/choices/ActionChoicesFacet.java   |  39 --
 .../param/choices/ActionChoicesFacetAbstract.java  |  42 --
 .../param/choices/ActionParameterChoicesFacet.java |   1 -
 .../ActionParameterChoicesFacetAbstract.java       |   1 -
 .../choices/ActionParameterChoicesFacetNone.java   |   1 -
 ...ChoicesFacetDerivedFromChoicesFacetFactory.java |   1 -
 ...ameterChoicesFacetInferredFromChoicesFacet.java |   1 -
 .../method/ActionChoicesFacetViaMethod.java        | 109 -----
 .../method/ActionChoicesFacetViaMethodFactory.java |  97 ----
 .../ActionParameterChoicesFacetViaMethod.java      |  17 +-
 ...ctionParameterChoicesFacetViaMethodFactory.java |  78 +---
 .../defaults/ActionParameterDefaultsFacet.java     |   1 -
 .../ActionParameterDefaultsFacetAbstract.java      |   1 -
 ...arameterDefaultFacetDerivedFromTypeFactory.java |  69 ---
 ...arameterDefaultFacetInferredFromTypeFacets.java |  63 ---
 .../ActionParameterDefaultsFacetViaMethod.java     |  21 +-
 ...tionParameterDefaultsFacetViaMethodFactory.java |  79 +---
 ...escribedAsFacetOnParameterInferredFromType.java |   1 -
 .../disable/ActionParameterDisabledFacet.java      |   1 -
 .../ActionParameterDisabledFacetAbstract.java      |   1 -
 .../ActionParameterDisabledFacetViaMethod.java     |  27 +-
 ...tionParameterDisabledFacetViaMethodFactory.java |  74 +--
 .../param/hide/ActionParameterHiddenFacet.java     |   1 -
 .../hide/ActionParameterHiddenFacetAbstract.java   |   1 -
 .../ActionParameterHiddenFacetViaMethod.java       |  19 +-
 ...ActionParameterHiddenFacetViaMethodFactory.java |  70 +--
 .../CssClassFacetForParameterLayoutAnnotation.java |   1 -
 ...scribedAsFacetForParameterLayoutAnnotation.java |   1 -
 .../LabelAtFacetForParameterLayoutAnnotation.java  |   1 -
 ...MultiLineFacetForParameterLayoutAnnotation.java |   1 -
 .../NamedFacetForParameterLayoutAnnotation.java    |   1 -
 .../param/layout/ParameterLayoutFacetFactory.java  |   1 -
 ...dAdjustedFacetForParameterLayoutAnnotation.java |   1 -
 ...calLengthFacetForParameterLayoutAnnotation.java |   1 -
 .../MandatoryFacetOnParametersDefaultFactory.java  |   1 -
 .../parameter/ParameterAnnotationFacetFactory.java |   1 -
 .../FileAcceptFacetForParameterAnnotation.java     |   1 -
 .../MandatoryFacetForParameterAnnotation.java      |   1 -
 ...cetInvertedByNullableAnnotationOnParameter.java |   1 -
 .../MaxLengthFacetForParameterAnnotation.java      |   1 -
 ...fySpecificationFacetForParameterAnnotation.java |   1 -
 .../regex/RegExFacetForParameterAnnotation.java    |   1 -
 .../RegExFacetForPatternAnnotationOnParameter.java |   1 -
 ...ActionParameterSupportFacetFactoryAbstract.java |  94 ++++
 ...icalLengthFacetOnParameterInferredFromType.java |   1 -
 .../validate/ActionParameterValidationFacet.java   |   1 -
 .../ActionParameterValidationFacetAbstract.java    |   1 -
 .../ActionParameterValidationFacetViaMethod.java   |  27 +-
 ...onParameterValidationFacetViaMethodFactory.java |  76 +--
 .../PropertyOrCollectionAccessorFacet.java         |   1 -
 .../PropertyOrCollectionAccessorFacetAbstract.java |   1 -
 .../propcoll/memserexcl/SnapshotExcludeFacet.java  |   1 -
 .../memserexcl/SnapshotExcludeFacetAbstract.java   |   1 -
 .../accessor/PropertyAccessorFacetViaAccessor.java |   7 -
 .../PropertyAccessorFacetViaAccessorFactory.java   |  32 +-
 .../autocomplete/PropertyAutoCompleteFacet.java    |   1 -
 .../PropertyAutoCompleteFacetAbstract.java         |   1 -
 .../method/PropertyAutoCompleteFacetMethod.java    |   7 -
 .../PropertyAutoCompleteFacetMethodFactory.java    |  57 +--
 .../properties/businesskey/BusinessKeyFacet.java   |   1 -
 .../businesskey/BusinessKeyFacetAbstract.java      |   1 -
 .../properties/choices/PropertyChoicesFacet.java   |   1 -
 .../choices/PropertyChoicesFacetAbstract.java      |   1 -
 ...ropertyChoicesFacetDerivedFromChoicesFacet.java |   1 -
 ...ChoicesFacetDerivedFromChoicesFacetFactory.java |   1 -
 .../method/PropertyChoicesFacetViaMethod.java      |   8 -
 .../PropertyChoicesFacetViaMethodFactory.java      |  56 +--
 .../properties/defaults/PropertyDefaultFacet.java  |   1 -
 .../defaults/PropertyDefaultFacetAbstract.java     |   1 -
 .../defaults/PropertyDefaultFacetNone.java         |   1 -
 ...pertyDefaultFacetDerivedFromDefaultedFacet.java |   1 -
 ...PropertyDefaultFacetDerivedFromTypeFactory.java |   1 -
 .../method/PropertyDefaultFacetViaMethod.java      |   7 -
 .../PropertyDefaultFacetViaMethodFactory.java      |  61 +--
 ...FacetOnPropertyDerivedFromImmutableFactory.java |   1 -
 ...sabledFacetOnPropertyInferredFromImmutable.java |   1 -
 .../DisabledFacetOnPropertyInferredFactory.java    |   1 -
 ...edFacetOnPropertyInferredFromMissingSetter.java |   1 -
 .../MandatoryFacetOnProperyDefaultFactory.java     |   1 -
 .../properties/projection/ProjectingFacet.java     |   1 -
 .../projection/ProjectingFacetAbstract.java        |   1 -
 .../ProjectingFacetFromPropertyAnnotation.java     |   1 -
 .../property/PropertyAnnotationFacetFactory.java   |   5 +-
 .../DisabledFacetForPropertyAnnotation.java        |   1 -
 ...acetForPropertyAnnotationInvertedSemantics.java |   1 -
 .../EntityPropertyChangePublishingPolicyFacet.java |   1 -
 ...ropertyChangePublishingPolicyFacetAbstract.java |   1 -
 ...PublishingPolicyFacetForPropertyAnnotation.java |   1 -
 .../FileAcceptFacetForPropertyAnnotation.java      |   1 -
 .../hidden/HiddenFacetForPropertyAnnotation.java   |   1 -
 .../MandatoryFacetForPropertyAnnotation.java       |   1 -
 ...acetInvertedByNullableAnnotationOnProperty.java |   1 -
 .../MaxLengthFacetForPropertyAnnotation.java       |   1 -
 ...ropertyClearFacetForDomainEventFromDefault.java |   1 -
 ...rFacetForDomainEventFromPropertyAnnotation.java |   1 -
 .../property/modify/PropertyDomainEventFacet.java  |   1 -
 .../modify/PropertyDomainEventFacetAbstract.java   |   1 -
 .../modify/PropertyDomainEventFacetDefault.java    |   1 -
 ...pertyDomainEventFacetForPropertyAnnotation.java |   1 -
 ...opertySetterFacetForDomainEventFromDefault.java |   1 -
 ...rFacetForDomainEventFromPropertyAnnotation.java |   1 -
 ...tySetterOrClearFacetForDomainEventAbstract.java |  21 +-
 ...sfySpecificationFacetForPropertyAnnotation.java |   1 -
 .../RegExFacetForPatternAnnotationOnProperty.java  |   1 -
 .../regex/RegExFacetForPropertyAnnotation.java     |   1 -
 .../SnapshotExcludeFacetForPropertyAnnotation.java |   1 -
 .../CssClassFacetForPropertyLayoutAnnotation.java  |   1 -
 .../CssClassFacetForPropertyXml.java               |   1 -
 ...escribedAsFacetForPropertyLayoutAnnotation.java |   1 -
 .../HiddenFacetForPropertyLayoutAnnotation.java    |   1 -
 .../propertylayout/HiddenFacetForPropertyXml.java  |   1 -
 .../LabelAtFacetForPropertyLayoutAnnotation.java   |   1 -
 .../propertylayout/LabelAtFacetForPropertyXml.java |   1 -
 .../MemberDescribedFacetForPropertyXml.java        |   1 -
 .../MultiLineFacetForPropertyLayoutAnnotation.java |   1 -
 .../MultiLineFacetForPropertyXml.java              |   1 -
 .../NamedFacetForPropertyLayoutAnnotation.java     |   1 -
 ...romptStyleFacetForPropertyLayoutAnnotation.java |   1 -
 .../PromptStyleFacetForPropertyXml.java            |   1 -
 .../propertylayout/PropertyLayoutFacetFactory.java |   1 -
 ...edAdjustedFacetForPropertyLayoutAnnotation.java |   1 -
 .../RenderedAdjustedFacetForPropertyXml.java       |   1 -
 ...icalLengthFacetForPropertyLayoutAnnotation.java |   1 -
 .../TypicalLengthFacetForPropertyXml.java          |   1 -
 ...UnchangingFacetForPropertyLayoutAnnotation.java |   1 -
 .../UnchangingFacetForPropertyXml.java             |   1 -
 ...nderedAsDayBeforeFacetAnnotationOnProperty.java |   1 -
 .../renderunchanged/UnchangingFacet.java           |   1 -
 .../renderunchanged/UnchangingFacetAbstract.java   |   1 -
 .../properties/searchable/SearchableFacet.java     |   1 -
 .../searchable/SearchableFacetAbstract.java        |   1 -
 ...picalLengthFacetOnPropertyInferredFromType.java |   1 -
 .../update/PropertySetterFacetFactory.java         |  74 ++-
 .../update/SnapshotExcludeFacetInferred.java       |   1 -
 .../update/clear/PropertyClearFacet.java           |   1 -
 .../update/clear/PropertyClearFacetAbstract.java   |   1 -
 .../clear/PropertyClearFacetViaClearMethod.java    |  23 +-
 .../clear/PropertyClearFacetViaSetterMethod.java   |  24 +-
 .../update/clear/PropertyClearingAccessor.java     |   1 -
 .../update/init/PropertyInitializationFacet.java   |   1 -
 .../init/PropertyInitializationFacetAbstract.java  |   1 -
 ...PropertyInitializationFacetViaSetterMethod.java |   7 -
 .../update/modify/PropertySetterFacet.java         |   1 -
 .../update/modify/PropertySetterFacetAbstract.java |   1 -
 .../modify/PropertySetterFacetViaSetterMethod.java |  23 +-
 .../update/modify/PropertySettingAccessor.java     |   1 -
 .../validating/PropertyValidateFacet.java          |   1 -
 .../validating/PropertyValidateFacetAbstract.java  |   1 -
 .../validating/PropertyValidateFacetNone.java      |   1 -
 .../dflt/PropertyValidateFacetDefault.java         |   1 -
 .../dflt/PropertyValidateFacetDefaultFactory.java  |   1 -
 .../method/PropertyValidateFacetViaMethod.java     |  10 +-
 .../PropertyValidateFacetViaMethodFactory.java     |  52 +--
 .../facets/schema/chg/ChangesDtoValueFacet.java    |   1 -
 ...DtoValueFacetUsingSemanticsProviderFactory.java |   1 -
 .../chg/v2/ChangesDtoValueSemanticsProvider.java   |   1 -
 .../facets/schema/cmd/CommandDtoValueFacet.java    |   1 -
 ...DtoValueFacetUsingSemanticsProviderFactory.java |   1 -
 .../cmd/v2/CommandDtoValueSemanticsProvider.java   |   1 -
 .../schema/ixn/InteractionDtoValueFacet.java       |   1 -
 ...DtoValueFacetUsingSemanticsProviderFactory.java |   1 -
 .../v2/InteractionDtoValueSemanticsProvider.java   |   1 -
 .../core/metamodel/facets/value/JodaFunctions.java |   1 -
 .../ValueSemanticsProviderAbstractTemporal.java    |   1 -
 .../value/bigdecimal/BigDecimalValueFacet.java     |   1 -
 .../bigdecimal/BigDecimalValueFacetAbstract.java   |   1 -
 ...malValueFacetUsingSemanticsProviderFactory.java |   1 -
 .../BigDecimalValueSemanticsProvider.java          |   1 -
 .../value/biginteger/BigIntegerValueFacet.java     |   1 -
 ...gerValueFacetUsingSemanticsProviderFactory.java |   1 -
 .../BigIntegerValueSemanticsProvider.java          |   1 -
 .../facets/value/blobs/BlobValueFacet.java         |   1 -
 ...lobValueFacetUsingSemanticsProviderFactory.java |   1 -
 .../value/blobs/BlobValueSemanticsProvider.java    |   1 -
 ...iveValueFacetUsingSemanticsProviderFactory.java |   1 -
 .../BooleanPrimitiveValueSemanticsProvider.java    |   1 -
 .../facets/value/booleans/BooleanValueFacet.java   |   1 -
 .../BooleanValueSemanticsProviderAbstract.java     |   1 -
 ...perValueFacetUsingSemanticsProviderFactory.java |   1 -
 .../BooleanWrapperValueSemanticsProvider.java      |   1 -
 ...iveValueFacetUsingSemanticsProviderFactory.java |   1 -
 .../bytes/BytePrimitiveValueSemanticsProvider.java |   1 -
 .../facets/value/bytes/ByteValueFacet.java         |   1 -
 .../bytes/ByteValueSemanticsProviderAbstract.java  |   1 -
 ...perValueFacetUsingSemanticsProviderFactory.java |   1 -
 .../bytes/ByteWrapperValueSemanticsProvider.java   |   1 -
 ...iveValueFacetUsingSemanticsProviderFactory.java |   1 -
 .../chars/CharPrimitiveValueSemanticsProvider.java |   1 -
 .../facets/value/chars/CharValueFacet.java         |   1 -
 .../chars/CharValueSemanticsProviderAbstract.java  |   1 -
 ...perValueFacetUsingSemanticsProviderFactory.java |   1 -
 .../chars/CharWrapperValueSemanticsProvider.java   |   1 -
 .../facets/value/clobs/ClobValueFacet.java         |   1 -
 ...lobValueFacetUsingSemanticsProviderFactory.java |   1 -
 .../value/clobs/ClobValueSemanticsProvider.java    |   1 -
 .../facets/value/date/DateValueFacet.java          |   1 -
 .../value/datejodalocal/JodaLocalDateUtil.java     |   1 -
 .../datejodalocal/JodaLocalDateValueFacet.java     |   1 -
 ...ateValueFacetUsingSemanticsProviderFactory.java |   1 -
 .../JodaLocalDateValueSemanticsProvider.java       |   1 -
 ...ateValueFacetUsingSemanticsProviderFactory.java |   1 -
 .../datesql/JavaSqlDateValueSemanticsProvider.java |   1 -
 .../value/datetimejoda/JodaDateTimeValueFacet.java |   1 -
 ...imeValueFacetUsingSemanticsProviderFactory.java |   1 -
 .../JodaDateTimeValueSemanticsProvider.java        |   1 -
 .../datetimejodalocal/JodaLocalDateTimeUtil.java   |   1 -
 .../JodaLocalDateTimeValueFacet.java               |   1 -
 ...imeValueFacetUsingSemanticsProviderFactory.java |   1 -
 .../JodaLocalDateTimeValueSemanticsProvider.java   |   1 -
 ...ateValueFacetUsingSemanticsProviderFactory.java |   1 -
 .../JavaUtilDateValueSemanticsProvider.java        |   1 -
 .../doubles/DoubleFloatingPointValueFacet.java     |   1 -
 ...iveValueFacetUsingSemanticsProviderFactory.java |   1 -
 .../DoublePrimitiveValueSemanticsProvider.java     |   1 -
 .../DoubleValueSemanticsProviderAbstract.java      |   1 -
 ...perValueFacetUsingSemanticsProviderFactory.java |   1 -
 .../DoubleWrapperValueSemanticsProvider.java       |   1 -
 ...iveValueFacetUsingSemanticsProviderFactory.java |   1 -
 .../FloatPrimitiveValueSemanticsProvider.java      |   1 -
 .../FloatValueSemanticsProviderAbstract.java       |   1 -
 ...perValueFacetUsingSemanticsProviderFactory.java |   1 -
 .../floats/FloatWrapperValueSemanticsProvider.java |   1 -
 .../value/floats/FloatingPointValueFacet.java      |   1 -
 .../facets/value/image/ImageValueFacet.java        |   1 -
 .../image/ImageValueSemanticsProviderAbstract.java |   1 -
 ...ageValueFacetUsingSemanticsProviderFactory.java |   1 -
 .../JavaAwtImageValueSemanticsProvider.java        |   1 -
 ...iveValueFacetUsingSemanticsProviderFactory.java |   1 -
 .../IntPrimitiveValueSemanticsProvider.java        |   1 -
 .../integer/IntValueSemanticsProviderAbstract.java |   1 -
 ...perValueFacetUsingSemanticsProviderFactory.java |   1 -
 .../integer/IntWrapperValueSemanticsProvider.java  |   1 -
 .../facets/value/integer/IntegerValueFacet.java    |   1 -
 .../localrespath/LocalResourcePathValueFacet.java  |   1 -
 ...athValueFacetUsingSemanticsProviderFactory.java |   1 -
 .../LocalResourcePathValueSemanticsProvider.java   |  11 +-
 ...iveValueFacetUsingSemanticsProviderFactory.java |   1 -
 .../longs/LongPrimitiveValueSemanticsProvider.java |   1 -
 .../facets/value/longs/LongValueFacet.java         |   1 -
 .../longs/LongValueSemanticsProviderAbstract.java  |   1 -
 ...perValueFacetUsingSemanticsProviderFactory.java |   1 -
 .../longs/LongWrapperValueSemanticsProvider.java   |   1 -
 .../facets/value/markup/MarkupValueFacet.java      |   1 -
 ...kupValueFacetUsingSemanticsProviderFactory.java |   1 -
 .../value/markup/MarkupValueSemanticsProvider.java |   1 -
 .../facets/value/password/PasswordValueFacet.java  |   1 -
 ...ordValueFacetUsingSemanticsProviderFactory.java |   1 -
 .../password/PasswordValueSemanticsProvider.java   |   1 -
 ...iveValueFacetUsingSemanticsProviderFactory.java |   1 -
 .../ShortPrimitiveValueSemanticsProvider.java      |   1 -
 .../facets/value/shortint/ShortValueFacet.java     |   1 -
 .../ShortValueSemanticsProviderAbstract.java       |   1 -
 ...perValueFacetUsingSemanticsProviderFactory.java |   1 -
 .../ShortWrapperValueSemanticsProvider.java        |   1 -
 .../facets/value/string/StringValueFacet.java      |   1 -
 ...ingValueFacetUsingSemanticsProviderFactory.java |   1 -
 .../value/string/StringValueSemanticsProvider.java |   1 -
 ...ateValueFacetUsingSemanticsProviderFactory.java |   1 -
 .../localdate/LocalDateValueSemanticsProvider.java |   1 -
 ...imeValueFacetUsingSemanticsProviderFactory.java |   1 -
 .../LocalDateTimeValueSemanticsProvider.java       |   1 -
 ...imeValueFacetUsingSemanticsProviderFactory.java |   1 -
 .../localtime/LocalTimeValueSemanticsProvider.java |   1 -
 ...imeValueFacetUsingSemanticsProviderFactory.java |   1 -
 .../OffsetDateTimeValueSemanticsProvider.java      |   1 -
 ...imeValueFacetUsingSemanticsProviderFactory.java |   1 -
 .../OffsetTimeValueSemanticsProvider.java          |   1 -
 ...imeValueFacetUsingSemanticsProviderFactory.java |   1 -
 .../ZonedDateTimeValueSemanticsProvider.java       |   1 -
 .../JodaLocalTimeValueFacetSimpleFactory.java      |   1 -
 ...imeValueFacetUsingSemanticsProviderFactory.java |   1 -
 .../timesql/JavaSqlTimeValueSemanticsProvider.java |   1 -
 ...ampValueFacetUsingSemanticsProviderFactory.java |   1 -
 .../JavaSqlTimeStampValueSemanticsProvider.java    |   1 -
 .../facets/value/treenode/TreeNodeValueFacet.java  |   1 -
 ...odeValueFacetUsingSemanticsProviderFactory.java |   1 -
 .../treenode/TreeNodeValueSemanticsProvider.java   |   1 -
 .../metamodel/facets/value/url/URLValueFacet.java  |   1 -
 ...URLValueFacetUsingSemanticsProviderFactory.java |   1 -
 .../value/url/URLValueSemanticsProvider.java       |   1 -
 .../facets/value/uuid/UUIDValueFacet.java          |   1 -
 ...UIDValueFacetUsingSemanticsProviderFactory.java |   1 -
 .../value/uuid/UUIDValueSemanticsProvider.java     |   1 -
 .../metamodel/inspect/Object_inspectMetamodel.java |   3 +-
 .../core/metamodel/inspect/model/ActionNode.java   |   2 +-
 .../metamodel/inspect/model/CollectionNode.java    |   2 +-
 .../metamodel/inspect/model/FacetAttrNode.java     |   2 +-
 .../metamodel/inspect/model/FacetGroupNode.java    |   2 +-
 .../core/metamodel/inspect/model/FacetNode.java    |   2 +-
 .../isis/core/metamodel/inspect/model/MMNode.java  |  22 +-
 .../metamodel/inspect/model/ParameterNode.java     |   2 +-
 .../core/metamodel/inspect/model/PropertyNode.java |   2 +-
 .../core/metamodel/inspect/model/TypeNode.java     |   2 +-
 .../core/metamodel/interactions/AccessContext.java |   1 -
 .../interactions/ActionArgUsabilityContext.java    |   1 -
 .../interactions/ActionArgValidityContext.java     |   1 -
 .../interactions/ActionArgVisibilityContext.java   |   1 -
 .../interactions/ActionInteractionContext.java     |   1 -
 .../interactions/ActionUsabilityContext.java       |   1 -
 .../interactions/ActionValidityContext.java        |   1 -
 .../interactions/ActionVisibilityContext.java      |   1 -
 .../interactions/CollectionAccessContext.java      |   1 -
 .../interactions/CollectionUsabilityContext.java   |   1 -
 .../interactions/CollectionVisibilityContext.java  |   1 -
 .../interactions/DisablingInteractionAdvisor.java  |   1 -
 .../interactions/HidingInteractionAdvisor.java     |   1 -
 .../interactions/InteractionAdvisorFacet.java      |   1 -
 .../metamodel/interactions/InteractionContext.java |   1 -
 .../metamodel/interactions/InteractionUtils.java   |   1 -
 .../metamodel/interactions/ObjectTitleContext.java |   1 -
 .../interactions/ObjectValidityContext.java        |   1 -
 .../interactions/ObjectVisibilityContext.java      |   1 -
 .../metamodel/interactions/ParseValueContext.java  |   1 -
 .../interactions/PropertyAccessContext.java        |   1 -
 .../interactions/PropertyModifyContext.java        |   1 -
 .../interactions/PropertyUsabilityContext.java     |   1 -
 .../interactions/PropertyVisibilityContext.java    |   1 -
 .../metamodel/interactions/ProposedHolder.java     |   1 -
 .../metamodel/interactions/UsabilityContext.java   |   1 -
 .../interactions/ValidatingInteractionAdvisor.java |   1 -
 .../metamodel/interactions/ValidityContext.java    |   1 -
 .../metamodel/interactions/VisibilityContext.java  |   1 -
 .../isis/core/metamodel/layout/DeweyOrderSet.java  |   1 -
 .../MemberIdentifierComparator.java                |   1 -
 .../memberorderfacet/MemberOrderComparator.java    |   1 -
 .../OrderSetGroupNameComparator.java               |   1 -
 ...tionEnforcesMetamodelContributionValidator.java | 166 +++++++
 ...nnotationEnforcesSupportingMethodValidator.java | 122 -----
 .../methods/MethodFilteringFacetFactory.java       |   1 -
 .../isis/core/metamodel/methods/MethodFinder.java  | 331 ++++++++-----
 .../core/metamodel/methods/MethodFinderPAT.java    |  89 ++++
 .../core/metamodel/methods/MethodFinderUtils.java  | 351 --------------
 .../metamodel/methods/MethodLiteralConstants.java  | 143 ------
 .../methods/MethodPrefixBasedFacetFactory.java     |   1 -
 .../MethodPrefixBasedFacetFactoryAbstract.java     |  48 +-
 .../methods/OrphanedSupportingMethodValidator.java | 124 -----
 .../_OrphanedSupportingMethodValidator.java        |  75 +++
 .../objectmanager/create/ObjectCreator.java        |   1 -
 .../objectmanager/identify/ObjectBookmarker.java   |   1 -
 .../metamodel/objectmanager/load/ObjectLoader.java |   1 -
 .../objectmanager/query/ObjectBulkLoader.java      |   1 -
 .../DeriveMixinMembersPostProcessor.java           |   1 -
 .../ObjectSpecificationPostProcessor.java          |   1 -
 .../ObjectSpecificationPostProcessorAbstract.java  |   1 -
 .../DeriveDescribedAsFromTypePostProcessor.java    |   1 -
 .../authorization/AuthorizationFacet.java          |   1 -
 .../authorization/AuthorizationFacetAbstract.java  |   1 -
 .../authorization/AuthorizationFacetImpl.java      |   1 -
 .../AuthorizationFacetPostProcessor.java           |   1 -
 ...arameterChoicesFacetFromParentedCollection.java |   1 -
 ...meterDefaultsFacetFromAssociatedCollection.java |   1 -
 ...ectionParamDefaultsAndChoicesPostProcessor.java |   1 -
 .../TweakDomainEventsForMixinPostProcessor.java    |   1 -
 ...NavigationFacetFromHiddenTypePostProcessor.java |   1 -
 .../NavigationFacetDerivedFromHiddenType.java      |   1 -
 .../DeriveProjectionFacetsPostProcessor.java       |   1 -
 .../DeriveDisabledFromImmutablePostProcessor.java  |   1 -
 .../DeriveDisabledFromViewModelPostProcessor.java  |  83 ----
 ...iveChoicesFromExistingChoicesPostProcessor.java |   1 -
 .../DeriveDefaultFromTypePostProcessor.java        |  36 +-
 .../DeriveTypicalLengthFromTypePostProcessor.java  |   1 -
 .../core/metamodel/progmodel/ProgrammingModel.java |   1 -
 .../progmodel/ProgrammingModelAbstract.java        |   1 -
 .../dflt/ProgrammingModelFacetsJava11.java         | 385 ++++++++++++++++
 .../dflt/ProgrammingModelFacetsJava8.java          | 420 -----------------
 .../core/metamodel/services/CollectionHelper.java  |   1 -
 .../classsubstitutor/ClassSubstitutor.java         |   1 -
 .../classsubstitutor/ClassSubstitutorAbstract.java |   9 +-
 .../classsubstitutor/ClassSubstitutorDefault.java  |   1 -
 .../ClassSubstitutorForCollections.java            |   1 -
 .../ClassSubstitutorForDomainObjects.java          |   1 -
 .../classsubstitutor/ClassSubstitutorRegistry.java |   1 -
 ...ExceptionRecognizerForRecoverableException.java |   1 -
 .../services/metamodel/DomainMemberDefault.java    |  21 +-
 .../metamodel/MetaModelServiceDefault.java         |   7 +-
 .../services/registry/ServiceRegistryDefault.java  |   1 -
 .../services/title/TitleServiceDefault.java        |   1 -
 .../isis/core/metamodel/spec/ActionType.java       |   1 -
 .../isis/core/metamodel/spec/DefaultProvider.java  |   1 -
 .../apache/isis/core/metamodel/spec/Described.java |   1 -
 .../isis/core/metamodel/spec/Hierarchical.java     |   1 -
 .../isis/core/metamodel/spec/ManagedObject.java    |   1 -
 .../isis/core/metamodel/spec/ManagedObjects.java   |  56 +--
 .../spec/ObjectInstantiationException.java         |   1 -
 .../core/metamodel/spec/ObjectSpecification.java   |  16 +-
 .../spec/ObjectSpecificationException.java         |   1 -
 .../isis/core/metamodel/spec/Specification.java    |   1 -
 .../core/metamodel/spec/feature/CurrentHolder.java |   1 -
 .../spec/feature/MutableCurrentHolder.java         |   1 -
 .../core/metamodel/spec/feature/ObjectAction.java  |  21 +-
 .../spec/feature/ObjectActionContainer.java        |   1 -
 .../spec/feature/ObjectActionParameter.java        |   1 -
 .../metamodel/spec/feature/ObjectAssociation.java  |   1 -
 .../spec/feature/ObjectAssociationContainer.java   |   1 -
 .../core/metamodel/spec/feature/ObjectFeature.java |   1 -
 .../core/metamodel/spec/feature/ObjectMember.java  |  15 +-
 .../spec/feature/OneToManyActionParameter.java     |   1 -
 .../spec/feature/OneToManyAssociation.java         |   1 -
 .../metamodel/spec/feature/OneToManyFeature.java   |   1 -
 .../spec/feature/OneToOneActionParameter.java      |   1 -
 .../spec/feature/OneToOneAssociation.java          |   1 -
 .../metamodel/spec/feature/OneToOneFeature.java    |   1 -
 .../spec/feature/memento/ActionMemento.java        |   1 -
 .../feature/memento/ActionParameterMemento.java    |   1 -
 .../spec/feature/memento/CollectionMemento.java    |   1 -
 .../spec/feature/memento/PropertyMemento.java      |   1 -
 .../specloader/LogicalTypeResolverDefault.java     |   1 -
 .../specloader/ProgrammingModelServiceDefault.java |   4 +-
 .../specloader/SpecificationCacheDefault.java      |   1 -
 .../specloader/SpecificationLoaderDefault.java     |   6 +-
 .../specloader/facetprocessor/FacetProcessor.java  |  84 ++--
 .../specloader/specimpl/FacetedMethodsBuilder.java | 116 ++---
 .../specloader/specimpl/ObjectActionDefault.java   | 109 ++---
 .../specloader/specimpl/ObjectActionMixedIn.java   |  12 +
 .../specimpl/ObjectActionParameterAbstract.java    |   7 +-
 .../specimpl/ObjectAssociationAbstract.java        |   1 -
 .../specloader/specimpl/ObjectMemberAbstract.java  |   1 -
 .../specimpl/ObjectSpecificationAbstract.java      |   9 +-
 .../specimpl/OneToManyActionParameterDefault.java  |   1 -
 .../specimpl/OneToManyAssociationDefault.java      |  16 +-
 .../specimpl/OneToManyAssociationMixedIn.java      |  13 +
 .../specimpl/OneToOneActionParameterDefault.java   |   1 -
 .../specimpl/OneToOneAssociationDefault.java       |  16 +-
 .../specimpl/OneToOneAssociationMixedIn.java       |  13 +
 .../specimpl/_MixedInMemberNamingStrategy.java     |   3 +-
 .../specimpl/dflt/ObjectSpecificationDefault.java  |  53 +--
 .../validator/MetaModelInvalidException.java       |   1 -
 .../specloader/validator/MetaModelValidator.java   |   1 -
 .../validator/MetaModelValidatorAbstract.java      |   1 -
 .../core/metamodel/util/DeweyOrderComparator.java  |   1 -
 .../apache/isis/core/metamodel/util/EventUtil.java |   1 -
 .../core/metamodel/util/pchain/ParentChain.java    |   1 -
 .../metamodel/util/pchain/ParentChainDefault.java  |   1 -
 .../isis/core/metamodel/util/snapshot/Helper.java  |   1 -
 .../core/metamodel/util/snapshot/IsisSchema.java   |   1 -
 .../isis/core/metamodel/util/snapshot/Place.java   |   1 -
 .../core/metamodel/util/snapshot/XmlSchema.java    |   1 -
 .../core/metamodel/util/snapshot/XmlSnapshot.java  |   1 -
 .../core/metamodel/util/snapshot/XsMetaModel.java  |   1 -
 .../core/metamodel/commons/IoUtils_CopyTest.java   |   1 -
 .../commons/JavaClassUtilsTest_getBuiltIn.java     |   1 -
 .../core/metamodel/commons/LocaleUtilsTest.java    |   1 -
 .../isis/core/metamodel/commons/NameUtilTest.java  |   1 -
 .../isis/core/metamodel/commons/PrintLocale.java   |   1 -
 .../commons/StringUtilsTest_enumTitle.java         |   1 -
 .../commons/StringUtils_NaturalNameTest.java       |   1 -
 .../commons/StringUtils_NaturalizeTest.java        |   1 -
 .../commons/StringUtils_NormalizedTest.java        |   1 -
 .../commons/StringUtils_StripLeadingSlashTest.java |   1 -
 .../commons/StringUtils_StripNewLinesTest.java     |   1 -
 .../commons/StringUtils_camelLowerFirst.java       |   1 -
 .../commons/StringUtils_toLineSeparated.java       |   1 -
 .../commons/StringUtils_toLowerDashed.java         |   1 -
 .../metamodel/commons/TypesTest_filteredList.java  |   1 -
 .../metamodel/commons/matchers/IsisMatchers.java   |   1 -
 .../matchers/IsisMatchers_NonEmptyStringTest.java  |   1 -
 .../metamodel/consent/InteractionResultTest.java   |   1 -
 .../core/metamodel/facetapi/FacetAbstractTest.java |   4 +-
 .../facetapi/FeatureTypeTest_identifierFor.java    |   1 -
 .../facets/AbstractFacetFactoryJUnit4TestCase.java |   1 -
 .../metamodel/facets/AbstractFacetFactoryTest.java |   1 -
 .../metamodel/facets/CollectionFacetUtilsTest.java |  40 +-
 .../metamodel/facets/MethodFinderUtilsTest.java    |  34 +-
 .../metamodel/facets/ObjectAdapterUtilsTest.java   |   1 -
 .../apache/isis/core/metamodel/facets/Utils.java   |   1 -
 .../actions/ActionMethodsFacetFactoryTest.java     | 227 +--------
 .../actions/IteratorFilteringFacetFactoryTest.java |   4 +-
 .../action/ActionAnnotationFacetFactoryTest.java   |   6 +-
 ...nnotationFacetFactoryTest_ActionInvocation.java |  23 +-
 .../ActionAnnotationFacetFactoryTest_Hidden.java   |   6 +-
 ...ctionAnnotationFacetFactoryTest_Invocation.java |  29 +-
 ...ctionAnnotationFacetFactoryTest_RestrictTo.java |  20 +-
 ...ActionAnnotationFacetFactoryTest_Semantics.java |  19 +-
 .../ActionAnnotationFacetFactoryTest_TypeOf.java   |  18 +-
 ...notationFacetFactoryTest_commandPublishing.java |  22 +-
 ...tationFacetFactoryTest_executionPublishing.java |  49 +-
 ...icsFacetFallbackToNonIdempotentFactoryTest.java |   6 +-
 .../PrototypeFacetAnnotationFactoryTest.java       |   6 +-
 ...kmarkableAnnotationFacetFactoryTest_action.java |   4 +-
 ...nLayoutXmlLayoutAnnotationFacetFactoryTest.java |  13 +-
 ...etDerivedFromDomainServiceFacetFactoryTest.java |  11 +-
 .../CollectionFieldMethodsFacetFactoryTest.java    |  21 +-
 .../collections/JavaCollectionFacetTest.java       |   1 -
 .../CollectionAnnotationFacetFactoryTest.java      |  23 +-
 ...ollectionAnnotationFacetFactoryTest_typeOf.java |  12 +-
 ...etForCollectionLayoutAnnotationFactoryTest.java |   6 +-
 .../ViewModelSemanticCheckingFacetFactoryTest.java |   4 +-
 ...okmarkableAnnotationFacetFactoryTest_class.java |   4 +-
 .../callback/CallbackFacetFactoryTestAbstract.java |  60 +++
 .../callback/CreatedCallbackFacetFactoryTest.java  |  40 +-
 .../callback/DeleteCallbackFacetFactoryTest.java   |  68 ---
 .../callback/LoadCallbackFacetFactoryTest.java     |  67 ---
 .../callback/LoadedCallbackFacetFactoryTest.java   |  36 ++
 .../PersistAndSaveCallbackFacetFactoryTest.java    | 110 -----
 .../callback/PersistCallbackFacetFactoryTest.java  |  88 ----
 .../PersistedCallbackFacetFactoryTest.java         |  59 +++
 .../PersistingCallbackFacetFactoryTest.java        |  59 +++
 .../RemoveAndDeleteCallbackFacetFactoryTest.java   |  83 ----
 .../callback/RemoveCallbackFacetFactoryTest.java   |  68 ---
 .../callback/RemovingCallbackFacetFactoryTest.java |  57 +++
 .../callback/SaveCallbackFacetFactoryTest.java     |  88 ----
 .../callback/UpdateCallbackFacetFactoryTest.java   |  88 ----
 .../callback/UpdatedCallbackFacetFactoryTest.java  |  36 ++
 .../callback/UpdatingCallbackFacetFactoryTest.java |  36 ++
 .../object/defaults/DefaultedFacetFactoryTest.java |  27 +-
 .../ObjectDisabledMethodFacetFactoryTest.java      |  46 +-
 ...oicesFacetFromBoundedAnnotationFactoryTest.java |   4 +-
 .../DomainObjectAnnotationFacetFactoryTest.java    |  87 ++--
 .../ObjectTypeAnnotationFacetFactoryTest.java      |   3 +-
 .../DomainObjectLayoutFactoryTest.java             |  45 +-
 .../DomainServiceFacetAnnotationFactoryTest.java   |   3 +-
 .../DomainServiceLayoutFacetFactoryTest.java       |  13 +-
 .../hidden/ObjectHiddenMethodFacetFactoryTest.java |  58 +--
 .../cssclass/CssClassFacetMethodFactoryTest.java   |  42 +-
 .../ident/cssclass/CssClassFacetMethodTest.java    |  15 +-
 .../CssClassFacetMethodWithProblemTest.java        |  15 +-
 .../ident/icon/IconFacetMethodFactoryTest.java     |  43 +-
 .../object/ident/icon/IconFacetMethodTest.java     |  15 +-
 .../ident/layout/LayoutFacetFactoryTest.java       |  43 +-
 .../object/ident/layout/LayoutFacetMethodTest.java |  15 +-
 .../ident/title/TitleFacetViaMethodTest.java       |   6 +-
 .../title/TitleFacetViaMethodsFactoryTest.java     |  55 +--
 .../TitleAnnotationFacetFactoryTest.java           |  79 +++-
 .../TitleFacetViaTitleAnnotationTest.java          |  42 +-
 ...alTypeFacetDerivedFromClassNameFactoryTest.java |   1 -
 .../facets/object/mixin/MixinIntendedAs.java       |  14 +-
 .../navparent/NavigableParentFacetMethodTest.java  |   7 +-
 .../NavigableParentAnnotationFacetFactoryTest.java |   9 +-
 .../RecreatableObjectFacetFactoryTest.java         |   4 +-
 .../ObjectSupportFacetFactoryTestAbstract.java     |  77 ++++
 .../ObjectValidMethodFacetFactoryTest.java         |  65 ---
 ...eFacetAnnotationOrConfigurationFactoryTest.java |  56 ++-
 .../memberorder/DeweyOrderComparatorTest.java      |   1 -
 .../ordering/memberorder/DeweyOrderSetTest.java    |   1 -
 .../ordering/memberorder/LayoutOrderTest.java      |  10 +-
 ...cetForParameterLayoutAnnotationFactoryTest.java |   7 +-
 ...cetForParameterLayoutAnnotationFactoryTest.java |   7 +-
 .../facets/param/name/ParameterNameFacetTest.java  |  20 +-
 .../ParameterAnnotationFacetFactoryTest.java       |  47 +-
 ...lableAnnotationOnParameterFacetFactoryTest.java |  18 +-
 ...RegExAnnotationOnParameterFacetFactoryTest.java |  10 +-
 .../PropertyMethodsFacetFactoryTest.java           |  55 ++-
 ...sabledAnnotationOnPropertyFacetFactoryTest.java |   8 +-
 .../MandatoryAnnotationFacetFactoryTest.java       |   5 +-
 .../PropertyAnnotationFacetFactoryTest.java        |  58 ++-
 ...tionWithSnapshotOnPropertyFacetFactoryTest.java |   5 +-
 ...llableAnnotationOnPropertyFacetFactoryTest.java |  14 +-
 .../RegExAnnotationOnPropertyFacetFactoryTest.java |   8 +-
 ...acetForPropertyLayoutAnnotationFactoryTest.java |   5 +-
 ...acetForPropertyLayoutAnnotationFactoryTest.java |   8 +-
 ...ValidationDigitsAnnotationFacetFactoryTest.java |  11 +-
 .../DomainObjectWithMustSatisfyAnnotations.java    |   1 -
 .../DomainObjectWithoutMustSatisfyAnnotations.java |   1 -
 .../SpecificationAlwaysSatisfied.java              |   1 -
 .../specification/SpecificationAndTests.java       |   1 -
 .../specification/SpecificationNeverSatisfied.java |   1 -
 .../specification/SpecificationNotTests.java       |   1 -
 .../specification/SpecificationOrTests.java        |   1 -
 ...cificationRequiresFirstLetterToBeUpperCase.java |   1 -
 .../BigDecimalValueSemanticsProviderTest.java      |   1 -
 .../value/BigIntValueSemanticsProviderTest.java    |   1 -
 .../value/BlobValueSemanticsProviderTest.java      |   1 -
 .../value/BooleanValueSemanticsProviderTest.java   |   1 -
 .../value/ByteValueSemanticsProviderTest.java      |   1 -
 .../value/CharacterValueSemanticsProviderTest.java |   1 -
 .../value/ClobValueSemanticsProviderTest.java      |   1 -
 .../value/DoubleValueSemanticsProviderTest.java    |   1 -
 .../value/FloatValueSemanticsProviderTest.java     |   1 -
 .../value/IntValueSemanticsProviderTest.java       |   1 -
 .../JavaSqlDateValueSemanticsProviderTest.java     |   1 -
 .../JavaSqlTimeValueSemanticsProviderTest.java     |   1 -
 .../JavaUtilDateValueSemanticsProviderTest.java    |   1 -
 .../value/LongValueSemanticsProviderTest.java      |   1 -
 .../value/PasswordValueSemanticsProviderTest.java  |   1 -
 .../value/ShortValueSemanticsProviderTest.java     |   1 -
 .../value/StringValueSemanticsProviderTest.java    |   1 -
 .../ValueSemanticsProviderAbstractTestCase.java    |   1 -
 .../interactions/InteractionUtils_isA_Test.java    |   1 -
 .../objects/OneToManyAssociationDefaultTest.java   |   1 -
 .../objects/TypeExtractorMethodReturnTest.java     |   1 -
 .../TypeExtractorMethodsParametersTest.java        |   1 -
 .../core/metamodel/objects/dom/Interface1.java     |   1 -
 .../objects/dom/JavaActionTestObject.java          |   1 -
 .../dom/JavaObjectWithBasicProgramConventions.java |   1 -
 .../dom/JavaObjectWithOneToOneAssociations.java    |   1 -
 .../objects/dom/JavaReferencedObject.java          |   1 -
 .../metamodel/objects/dom/TestDomainObject.java    |   1 -
 .../core/metamodel/objects/dom/TestObject.java     |   1 -
 .../objects/dom/TestObjectAsAggregated.java        |   1 -
 .../metamodel/objects/dom/TestObjectAsService.java |   1 -
 .../objects/dom/TestObjectWithCollection.java      |   1 -
 .../ServiceInjectorDefaultTest_usingFields.java    |   1 -
 ...erviceInjectorDefaultTest_validateServices.java |   1 -
 ...InjectorDefaultTest_validateServices_happy.java |  18 +-
 .../services/ServiceInjectorLegacyTest.java        |   1 -
 ...zerForRecoverableException_recognizes_Test.java |   1 -
 .../metamodel/specloader/ReflectorTestPojo.java    |   1 -
 .../SpecificationLoaderTestAbstract.java           |  22 +-
 .../specloader/SpecificationLoaderTest_array.java  |   1 -
 .../SpecificationLoaderTest_collection.java        |   1 -
 .../specloader/SpecificationLoaderTest_value.java  |   1 -
 .../ClassSubstitutorTest_getClass.java             |   1 -
 .../specimpl/MixedInMemberNamingStrategyTest.java  |  14 +-
 ...ionParameterAbstractTest_getId_and_getName.java |   1 -
 .../specimpl/ObjectAssociationAbstractTest.java    |  22 +-
 ...ObjectAssociationAbstractTest_alwaysHidden.java |   6 +-
 .../specimpl/OneToOneAssociationAbstractTest.java  |   1 -
 .../testspec/ObjectSpecificationStub.java          |  11 -
 core/pom.xml                                       |  24 +-
 .../core/runtime/context/IsisAppCommonContext.java |   2 +-
 .../isis/core/runtime/memento/ObjectMemento.java   |   1 -
 .../factory/FactoryServiceDefault.java             |   1 -
 .../i18n/po/TranslationServicePoMenu.java          |  11 +-
 .../interaction/InteractionDtoFactoryDefault.java  |   1 -
 .../menubars/MenuBarsLoaderServiceDefault.java     |   2 +-
 .../publish/ExecutionPublisherDefault.java         |   1 -
 .../repository/RepositoryServiceDefault.java       |   1 -
 .../session/InteractionServiceDefault.java         |   1 -
 .../dispatchers/InteractionEventDispatcher.java    |   1 -
 .../InteractionEventDispatcherTypeSafe.java        |   1 -
 .../AbstractCollectionInvocationHandler.java       |   1 -
 .../handlers/CollectionInvocationHandler.java      |   1 -
 .../handlers/DelegatingInvocationHandler.java      |   1 -
 .../DelegatingInvocationHandlerDefault.java        |   1 -
 .../handlers/DomainObjectInvocationHandler.java    |   1 -
 .../wrapper/handlers/MapInvocationHandler.java     |   1 -
 .../wrapper/handlers/ProxyContextHandler.java      |   1 -
 .../wrapper/proxy/ProxyCreator.java                |   1 -
 .../runtimeservices/urlencoding/MementosTest.java  |   1 -
 .../wrapper/dom/claims/Approver.java               |   1 -
 .../wrapper/dom/claims/Claimant.java               |   1 -
 .../wrapper/dom/employees/Employee.java            |   1 -
 .../wrapper/dom/employees/EmployeeRepository.java  |   1 -
 .../dom/employees/EmployeeRepositoryImpl.java      |   1 -
 .../authentication/AuthenticationRequest.java      |   1 -
 .../AuthenticationRequestAbstract.java             |   1 -
 .../AuthenticationRequestPassword.java             |   1 -
 .../security/authentication/Authenticator.java     |   1 -
 .../AuthenticationRequestLogonFixture.java         |   1 -
 .../security/authentication/logout/LogoutMenu.java |   1 -
 .../manager/AuthenticationManager.java             |   1 -
 .../authentication/manager/UserMementoRefiner.java |   1 -
 .../AuthenticationRequestSingleUser.java           |   1 -
 .../standard/AuthenticatorAbstract.java            |   1 -
 .../standard/RandomCodeGenerator.java              |   1 -
 .../authentication/standard/Registrar.java         |   1 -
 .../core/security/authorization/Authorizor.java    |   1 -
 .../standard/AuthorizationConstants.java           |   1 -
 .../AuthenticationManager_authenticators_Test.java |   1 -
 .../SimpleSessionEncodabilityNoRolesTest.java      |   1 -
 .../SimpleSessionEncodabilityTestAbstract.java     |   1 -
 .../SimpleSessionEncodabilityWithRolesTest.java    |   1 -
 ...rdAuthenticationManager_AuthenticationTest.java |   1 -
 .../TemplateResourceCachingFilter.java             |   1 -
 .../templresources/TemplateResourceServlet.java    |   3 +-
 ...plateResourceServlet_HtmlTemplateVariables.java |   8 +-
 .../core/webapp/routing/ForwardingServlet.java     |   1 -
 .../isis/core/webapp/routing/RedirectFilter.java   |   1 -
 .../isis/core/webapp/routing/RedirectServlet.java  |   1 -
 .../webappctx/IsisWebAppContextInitializer.java    |   2 +-
 examples/demo/domain/pom.xml                       |   5 +
 .../main/java/demoapp/dom/DemoModuleCommon.java    |   4 -
 .../src/main/java/demoapp/dom/DemoModuleJpa.java   |   2 +
 .../HasAsciiDocDescription_description.java        |   3 +-
 .../HasAsciiDocDescription_sources.java            |   3 +-
 .../_infra/resources/AsciiDocReaderService.java    |  74 ++-
 .../_infra/resources/MarkdownReaderService.java    |   3 +-
 .../dom/_infra/seed/SeedServiceAbstract.java       |   2 +-
 .../java/demoapp/dom/_infra/utils/HtmlUtils.java   |   1 -
 .../java/demoapp/dom/_infra/utils/LogUtils.java    |   1 -
 .../domain/_commands/ExposePersistedCommands.java  |   2 +-
 .../dom/domain/_interactions/InteractionDtoVm.java |   5 +-
 .../associateWith/ActionAssociateWithVm.java       |  13 +-
 .../ActionAssociateWithVm_updateOtherProperty.java |   5 +-
 .../child/ActionAssociateWithChildVm.java          |   5 +-
 .../child/ActionAssociateWithVm_makeFavorite.java  |   3 +-
 .../ActionAssociateWithVm_noLongerFavorite.java    |   3 +-
 .../ActionAssociateWithVm_noLongerFavorites.java   |   3 +-
 ...ommandPublishingEntity_mixinUpdateProperty.java |   7 +-
 ...gEntity_mixinUpdatePropertyCommandDisabled.java |   6 +-
 ...ngEntity_mixinUpdatePropertyMetaAnnotation.java |   5 +-
 ...ixinUpdatePropertyMetaAnnotationOverridden.java |   5 +-
 .../jdo/ActionCommandPublishingJdo.java            |  14 +-
 .../jpa/ActionCommandPublishingJpa.java            |  18 +-
 .../Action/domainEvent/ActionDomainEventVm.java    |  11 +-
 .../ActionDomainEventVm_mixinUpdateText.java       |   5 +-
 .../ActionDomainEventVm_controlUpdateText.java     |   3 +-
 ...nDomainEventVm_controlUpdateTextInvocation.java |   8 +-
 ...cutionPublishingEntity_mixinUpdateProperty.java |   7 +-
 ...ngEntity_mixinUpdatePropertyMetaAnnotation.java |   7 +-
 ...ixinUpdatePropertyMetaAnnotationOverridden.java |   7 +-
 .../jdo/ActionExecutionPublishingJdo.java          |  12 +-
 .../jpa/ActionExecutionPublishingJpa.java          |  16 +-
 .../actions/Action/hidden/ActionHiddenVm.java      |  17 +-
 ...onHiddenVm_mixinUpdateTextAndHiddenNowhere.java |   5 +-
 ...iddenVm_mixinUpdateTextButHiddenEverywhere.java |   5 +-
 ...ddenVm_mixinUpdateTextButHiddenObjectForms.java |   5 +-
 ...ActionHiddenVm_mixinUpdateTextNoAnnotation.java |   5 +-
 .../Action/restrictTo/ActionRestrictToVm.java      |  19 +-
 ...ctionRestrictToVm_mixinUpdateMetaAnnotated.java |   5 +-
 ...ictToVm_mixinUpdateMetaAnnotatedOverridden.java |   5 +-
 ...ActionRestrictToVm_mixinUpdateNoAnnotation.java |   5 +-
 ...ctToVm_mixinUpdateRestrictToNoRestrictions.java |   5 +-
 ...trictToVm_mixinUpdateRestrictToPrototyping.java |   5 +-
 .../Action/semantics/ActionSemanticsVm.java        |  21 +-
 ...ticsVm_mixinIncrementByAmountNonIdempotent.java |   5 +-
 ...tionSemanticsVm_mixinIncrementNoAnnotation.java |   5 +-
 ...ionSemanticsVm_mixinIncrementNonIdempotent.java |   6 +-
 ...csVm_mixinIncrementNonIdempotentAreYouSure.java |   6 +-
 ...Vm_mixinSetToValueForPropertyMetaAnnotated.java |   5 +-
 ...tToValueForPropertyMetaAnnotatedOverridden.java |   5 +-
 ...inSetToValueForPropertySemanticsIdempotent.java |   5 +-
 ...ueForPropertySemanticsIdempotentAreYouSure.java |   5 +-
 .../actions/Action/typeOf/ActionTypeOfVm.java      |   8 +-
 .../Action/typeOf/child/ActionTypeOfChildVm.java   |  10 +-
 .../actions/ActionLayout/ActionLayoutMenu.java     |  19 +-
 .../position/ActionLayoutPositionVm.java           |   6 +-
 .../ActionLayoutPositionVm_annotatedBelow.java     |   5 +-
 .../ActionLayoutPositionVm_annotatedPanel.java     |   5 +-
 ...ionLayoutPositionVm_annotatedPanelDropDown.java |   5 +-
 .../ActionLayoutPositionVm_annotatedRight.java     |   5 +-
 .../ActionLayoutPositionVm_layoutBelow.java        |   5 +-
 .../ActionLayoutPositionVm_layoutPanel.java        |   5 +-
 ...ActionLayoutPositionVm_layoutPanelDropDown.java |   5 +-
 .../ActionLayoutPositionVm_layoutRight.java        |   5 +-
 .../promptStyle/ActionLayoutPromptStyleVm.java     |   8 +-
 .../ActionLayoutPromptStyleVm_annotatedInline.java |   5 +-
 ...ayoutPromptStyleVm_annotatedInlineAsIfEdit.java |   5 +-
 .../ActionLayoutPromptStyleVm_annotatedModal.java  |   5 +-
 ...ActionLayoutPromptStyleVm_annotatedSidebar.java |   5 +-
 .../ActionLayoutPromptStyleVm_layoutDialog.java    |   5 +-
 .../ActionLayoutPromptStyleVm_layoutInline.java    |   5 +-
 ...onLayoutPromptStyleVm_layoutInlineAsIfEdit.java |   5 +-
 .../progmodel/assoc/AssociatedActionDemo.java      |   3 +-
 .../domain/actions/progmodel/assoc/DemoItem.java   |   3 +-
 .../domain/actions/progmodel/depargs/DemoItem.java |   3 +-
 .../DependentArgsActionDemo_bulkAction.java        |  18 +-
 .../DependentArgsActionDemo_useAutoComplete.java   |  16 +-
 .../DependentArgsActionDemo_useChoices.java        |  12 +-
 .../DependentArgsActionDemo_useChoices2.java       |  12 +-
 .../DependentArgsActionDemo_useDefault.java        |   6 +-
 .../DependentArgsActionDemo_useDisable.java        |  12 +-
 .../depargs/DependentArgsActionDemo_useHide.java   |  14 +-
 .../DependentArgsActionDemo_useIndependent.java    |  17 +-
 .../domain/actions/progmodel/depargs/Parity.java   |   4 +-
 .../collections/Collection/CollectionMenu.java     |  12 +-
 .../domainEvent/CollectionDomainEventVm.java       |   3 +-
 .../CollectionDomainEventVm_addChild.java          |   5 +-
 .../CollectionDomainEventVm_removeChild.java       |  12 +-
 .../child/CollectionDomainEventChildVm.java        |   3 +-
 .../CollectionDomainEventVm_controlChildren.java   |   3 +-
 ...ionDomainEventVm_controlChildrenVisibility.java |   8 +-
 .../CollectionLayout/CollectionLayoutMenu.java     |  21 +-
 .../objects/DomainObject/DomainObjectMenu.java     |  19 +-
 ...PublishingEntity_updatePropertyUsingAction.java |   7 +-
 .../DomainObjectEntityChangePublishingVm.java      |   3 +-
 ...omainObjectEntityChangePublishingVm_create.java |  26 +-
 ...omainObjectEntityChangePublishingVm_delete.java |  26 +-
 ...inObjectEntityChangePublishingVm_updateAll.java |  22 +-
 ...ainObjectEntityChangePublishingDisabledJpa.java |   6 +-
 ...mainObjectEntityChangePublishingEnabledJpa.java |   6 +-
 ...ityChangePublishingEnabledMetaAnnotatedJpa.java |   6 +-
 ...ngePublishingEnabledMetaAnnotOverriddenJpa.java |   6 +-
 .../jaxbrefentity/StatefulVmJaxbRefsEntity.java    |  20 +-
 .../viewmodels/jaxbrefentity/jdo/JaxbRefJdo.java   |   2 +-
 .../viewmodels/jaxbrefentity/jpa/JaxbRefJpa.java   |   6 +-
 .../viewmodels/usingjaxb/StatefulVmUsingJaxb.java  |  11 +-
 .../DomainObjectLayout/DomainObjectLayoutMenu.java |  21 +-
 .../objects/other/embedded/EmbeddedTypeVm.java     |   3 +-
 .../other/embedded/jdo/ComplexNumberJdo.java       |  12 +-
 .../other/embedded/jdo/NumberConstantJdo.java      |   8 +-
 .../embedded/jdo/NumberConstantJdoRepository.java  |   3 +-
 .../jdo/NumberConstantJdo_updateNumber.java        |   5 +-
 .../other/embedded/jpa/ComplexNumberJpa.java       |  12 +-
 .../other/embedded/jpa/NumberConstantJpa.java      |  12 +-
 .../embedded/jpa/NumberConstantJpaRepository.java  |   3 +-
 .../jpa/NumberConstantJpa_updateNumber.java        |   5 +-
 .../other/mixins/CountHolder_updateCount.java      |   7 +-
 .../objects/other/mixins/FibonacciNumberVm.java    |   3 +-
 .../dom/domain/objects/other/mixins/MixinVm.java   |   3 +-
 .../jdo/PropertyCommandPublishingJdo.java          |   5 +-
 .../jpa/PropertyCommandPublishingJpa.java          |   9 +-
 .../domainEvent/PropertyDomainEventVm.java         |   8 +-
 .../PropertyDomainEventVm_controlText.java         |   3 +-
 .../PropertyDomainEventVm_controlTextEditing.java  |   8 +-
 .../Property/editing/PropertyEditingVm.java        |   6 +-
 ...tyExecutionPublishingEnabledMetaAnnotation.java |   2 +-
 .../jdo/PropertyExecutionPublishingJdo.java        |   5 +-
 .../jpa/PropertyExecutionPublishingJpa.java        |   9 +-
 .../Property/fileAccept/PropertyFileAcceptVm.java  |   6 +-
 ...FileAcceptVm_updateClobWithParameterLayout.java |   5 +-
 ...pertyFileAcceptVm_updateWithMetaAnnotation.java |   5 +-
 ...cceptVm_updateWithMetaAnnotationOverridden.java |   5 +-
 ...ertyFileAcceptVm_updateWithParameterLayout.java |   5 +-
 .../Property/hidden/PropertyHiddenVm.java          |   8 +-
 .../hidden/PropertyHiddenVm_returnsChildren.java   |   6 +-
 .../hidden/child/PropertyHiddenChildVm.java        |  10 +-
 .../Property/maxLength/PropertyMaxLengthVm.java    |   6 +-
 ...opertyMaxLengthVm_updateWithMetaAnnotation.java |   5 +-
 ...engthVm_updateWithMetaAnnotationOverridden.java |   5 +-
 ...pertyMaxLengthVm_updateWithParameterLayout.java |   5 +-
 .../mustSatisfy/PropertyMustSatisfyVm.java         |   6 +-
 ...ertyMustSatisfyVm_updateWithMetaAnnotation.java |   5 +-
 ...tisfyVm_updateWithMetaAnnotationOverridden.java |   5 +-
 ...rtyMustSatisfyVm_updateWithParameterLayout.java |   5 +-
 .../optionality/PropertyOptionalityVm.java         |   6 +-
 ...alityVm_updateMandatoryWithParameterLayout.java |   5 +-
 ...ertyOptionalityVm_updateWithMetaAnnotation.java |   5 +-
 ...alityVm_updateWithMetaAnnotationOverridden.java |   5 +-
 ...rtyOptionalityVm_updateWithParameterLayout.java |   5 +-
 .../Property/projecting/PropertyProjectingVm.java  |   8 +-
 .../projecting/jpa/PropertyProjectingChildJpa.java |   6 +-
 .../regexPattern/PropertyRegexPatternVm.java       |   6 +-
 ...rtyRegexPatternVm_updateWithMetaAnnotation.java |   5 +-
 ...tternVm_updateWithMetaAnnotationOverridden.java |   5 +-
 ...tyRegexPatternVm_updateWithParameterLayout.java |   5 +-
 .../Property/snapshot/PropertySnapshotVm.java      |   8 +-
 .../PropertySnapshotVm_takeXmlSnapshot.java        |   5 +-
 .../snapshot/SnapshotExcludedMetaAnnotation.java   |   2 +-
 .../snapshot/SnapshotIncludedMetaAnnotation.java   |   2 +-
 .../cssClass/PropertyLayoutCssClassVm.java         |   6 +-
 ...yLayoutCssClassVm_updateWithMetaAnnotation.java |   5 +-
 ...ClassVm_updateWithMetaAnnotationOverridden.java |   5 +-
 ...LayoutCssClassVm_updateWithParameterLayout.java |   5 +-
 .../describedAs/PropertyLayoutDescribedAsVm.java   |   6 +-
 ...youtDescribedAsVm_updateWithMetaAnnotation.java |   5 +-
 ...bedAsVm_updateWithMetaAnnotationOverridden.java |   5 +-
 ...outDescribedAsVm_updateWithParameterLayout.java |   5 +-
 .../hidden/PropertyLayoutHiddenVm.java             |   8 +-
 .../PropertyLayoutHiddenVm_returnsChildren.java    |   6 +-
 .../hidden/child/PropertyLayoutHiddenChildVm.java  |  10 +-
 .../PropertyLayoutLabelPositionVm.java             |   6 +-
 ...rtyLayoutLabelPositionVm_updateVariantLeft.java |   5 +-
 ...rtyLayoutLabelPositionVm_updateVariantNone.java |   5 +-
 ...tLabelPositionVm_updateVariantNotSpecified.java |   5 +-
 ...tyLayoutLabelPositionVm_updateVariantRight.java |   5 +-
 ...ertyLayoutLabelPositionVm_updateVariantTop.java |   5 +-
 ...utLabelPositionVm_updateWithMetaAnnotation.java |   5 +-
 ...itionVm_updateWithMetaAnnotationOverridden.java |   5 +-
 ...tLabelPositionVm_updateWithParameterLayout.java |   5 +-
 .../multiLine/PropertyLayoutMultiLineVm.java       |   6 +-
 ...LayoutMultiLineVm_updateWithMetaAnnotation.java |   5 +-
 ...iLineVm_updateWithMetaAnnotationOverridden.java |   5 +-
 ...ayoutMultiLineVm_updateWithParameterLayout.java |   5 +-
 .../named/PropertyLayoutNamedVm.java               |   3 +-
 ...ertyLayoutNamedVm_updateWithMetaAnnotation.java |   5 +-
 ...NamedVm_updateWithMetaAnnotationOverridden.java |   5 +-
 ...rtyLayoutNamedVm_updateWithParameterLayout.java |   5 +-
 .../PropertyLayout/navigable/FileNodeType.java     |   3 +-
 .../PropertyLayout/navigable/FileNodeVm.java       |   9 +-
 .../navigable/FileTreeNodeService.java             |   8 +-
 .../renderDay/PropertyLayoutRenderDayVm.java       |   8 +-
 .../PropertyLayoutRenderDayVm_downloadAsXml.java   |   6 +-
 ...enderDayVm_updateEndDateWithMetaAnnotation.java |   5 +-
 ..._updateEndDateWithMetaAnnotationOverridden.java |   5 +-
 ...nderDayVm_updateEndDateWithParameterLayout.java |   5 +-
 .../repainting/PropertyLayoutRepaintingVm.java     |   6 +-
 .../PropertyLayoutTypicalLengthVm.java             |   6 +-
 ...utTypicalLengthVm_updateWithMetaAnnotation.java |   5 +-
 ...engthVm_updateWithMetaAnnotationOverridden.java |   5 +-
 ...tTypicalLengthVm_updateWithParameterLayout.java |   5 +-
 .../featured/customui/vm/WhereInTheWorldMenu.java  |  13 +-
 .../featured/layout/describedAs/DescribedAsVm.java |  25 +-
 .../demoapp/dom/featured/layout/tabs/TabDemo.java  |  10 +-
 .../java/demoapp/dom/homepage/DemoHomePage.java    |   3 +-
 .../src/main/java/demoapp/dom/menubars.layout.xml  |   1 +
 .../demoapp/dom/services/core/ServicesMenu.java    |   5 +-
 .../ErrorReportingServiceDemoVm.java               |   3 +-
 .../eventbusservice/EventBusServiceDemoVm.java     |   3 +-
 .../core/eventbusservice/EventLogEntryJdo.java     |   7 +-
 .../core/eventbusservice/EventLogEntryJpa.java     |   7 +-
 .../core/messageservice/MessageServiceDemoVm.java  |   3 +-
 ...pperFactoryEntity_mixinUpdatePropertyAsync.java |   5 +-
 ...pperFactoryEntity_updatePropertyAsyncMixin.java |   5 +-
 .../core/wrapperFactory/jdo/WrapperFactoryJdo.java |  15 +-
 .../core/wrapperFactory/jpa/WrapperFactoryJpa.java |  19 +-
 .../xmlSnapshotService/XmlSnapshotParentVm.java    |  12 +-
 .../XmlSnapshotParentVm_takeXmlSnapshot.java       |  10 +-
 .../child/XmlSnapshotChildVm.java                  |   3 +-
 .../xmlSnapshotService/peer/XmlSnapshotPeerVm.java |   5 +-
 .../peer/child/XmlSnapshotPeerChildVm.java         |   3 +-
 .../services/extensions/secman/ExtSecManMenu.java  |   2 -
 .../extensions/secman/apptenancy/AppTenancyVm.java |  12 +-
 .../ApplicationTenancyEvaluatorForDemo.java        |   3 +-
 .../secman/apptenancy/jdo/TenantedJdo.java         |   8 +-
 .../secman/apptenancy/jpa/TenantedJpa.java         |  12 +-
 .../secman/appuser/seed/AppUserSeeding.java        |   6 +-
 .../demoapp/dom/types/isis/blobs/IsisBlobs.java    |   8 +-
 ...sBlobHolder_updateReadOnlyOptionalProperty.java |   8 +-
 .../IsisBlobHolder_updateReadOnlyProperty.java     |   6 +-
 ...obHolder_updateReadOnlyPropertyWithChoices.java |  12 +-
 .../dom/types/isis/blobs/jdo/IsisBlobJdo.java      |   3 +-
 .../dom/types/isis/blobs/jpa/IsisBlobJpa.java      |   6 +-
 .../dom/types/isis/blobs/vm/IsisBlobVm.java        |  10 +-
 .../demoapp/dom/types/isis/clobs/IsisClobs.java    |   8 +-
 ...sClobHolder_updateReadOnlyOptionalProperty.java |   4 +-
 .../IsisClobHolder_updateReadOnlyProperty.java     |   6 +-
 ...obHolder_updateReadOnlyPropertyWithChoices.java |  12 +-
 .../dom/types/isis/clobs/jdo/IsisClobJdo.java      |   3 +-
 .../dom/types/isis/clobs/jpa/IsisClobJpa.java      |  20 +-
 .../dom/types/isis/clobs/vm/IsisClobVm.java        |   5 +-
 .../localresourcepaths/IsisLocalResourcePaths.java |   9 +-
 ...ePathHolder_updateReadOnlyOptionalProperty.java |   7 +-
 ...lResourcePathHolder_updateReadOnlyProperty.java |   6 +-
 ...thHolder_updateReadOnlyPropertyWithChoices.java |  12 +-
 .../jdo/IsisLocalResourcePathJdo.java              |   3 +-
 .../jpa/IsisLocalResourcePathJpa.java              |   9 +-
 .../vm/IsisLocalResourcePathVm.java                |   5 +-
 .../dom/types/isis/markups/IsisMarkups.java        |   7 +-
 ...arkupHolder_updateReadOnlyOptionalProperty.java |   8 +-
 .../IsisMarkupHolder_updateReadOnlyProperty.java   |   6 +-
 ...upHolder_updateReadOnlyPropertyWithChoices.java |  12 +-
 .../dom/types/isis/markups/jdo/IsisMarkupJdo.java  |   9 +-
 .../dom/types/isis/markups/jpa/IsisMarkupJpa.java  |  12 +-
 .../dom/types/isis/markups/vm/IsisMarkupVm.java    |  10 +-
 .../dom/types/isis/passwords/IsisPasswords.java    |   9 +-
 ...swordHolder_updateReadOnlyOptionalProperty.java |   8 +-
 .../IsisPasswordHolder_updateReadOnlyProperty.java |   6 +-
 ...rdHolder_updateReadOnlyPropertyWithChoices.java |  12 +-
 .../types/isis/passwords/jdo/IsisPasswordJdo.java  |   3 +-
 .../types/isis/passwords/jpa/IsisPasswordJpa.java  |   9 +-
 .../types/isis/passwords/vm/IsisPasswordVm.java    |   5 +-
 .../dom/types/isisext/IsisExtTypesMenu.java        |   9 +-
 .../dom/types/isisext/asciidocs/IsisAsciiDocs.java |   7 +-
 ...iiDocHolder_updateReadOnlyOptionalProperty.java |   8 +-
 .../IsisAsciiDocHolder_updateReadOnlyProperty.java |   6 +-
 ...ocHolder_updateReadOnlyPropertyWithChoices.java |  12 +-
 .../isisext/asciidocs/jdo/IsisAsciiDocJdo.java     |  11 +-
 .../isisext/asciidocs/jpa/IsisAsciiDocJpa.java     |  15 +-
 .../types/isisext/asciidocs/vm/IsisAsciiDocVm.java |  10 +-
 .../isisext/cal/IsisCalendarEvents-common.adoc     |  68 +++
 .../cal/IsisCalendarEvents-description.adoc        |  31 ++
 .../dom/types/isisext/cal/IsisCalendarEvents.java  |  81 ++++
 .../isisext/cal/IsisCalendarEvents.layout.xml      |  56 +++
 .../cal/holder/IsisCalendarEventHolder.java        |  39 ++
 .../cal/holder/IsisCalendarEventHolder2.java       |  75 +++
 .../IsisCalendarEventHolder_actionReturning.java   |  40 ++
 ...endarEventHolder_actionReturningCollection.java |  51 ++
 .../IsisCalendarEventHolder_mixinProperty.java     |  42 ++
 ...EventHolder_updateReadOnlyOptionalProperty.java |  59 +++
 ...CalendarEventHolder_updateReadOnlyProperty.java |  54 +++
 ...ntHolder_updateReadOnlyPropertyWithChoices.java |  69 +++
 .../isisext/cal/jdo/IsisCalendarEventEntities.java |  42 ++
 .../cal/jdo/IsisCalendarEventJdo-description.adoc  |  18 +
 .../isisext/cal/jdo/IsisCalendarEventJdo.java      |  84 ++++
 .../isisext/cal/jpa/IsisCalendarEventEntities.java |  42 ++
 .../cal/jpa/IsisCalendarEventJpa-description.adoc  |  21 +
 .../isisext/cal/jpa/IsisCalendarEventJpa.java      |  96 ++++
 .../cal/persistence/IsisCalendarEventEntity.java   |  42 ++
 .../persistence/IsisCalendarEventEntity.layout.xml |  56 +++
 .../cal/persistence/IsisCalendarEventSeeding.java  |  39 ++
 .../cal/samples/IsisCalendarEventSamples.java      |  43 ++
 .../cal/vm/IsisCalendarEventVm-description.adoc    |  19 +
 .../types/isisext/cal/vm/IsisCalendarEventVm.java  |  84 ++++
 .../isisext/cal/vm/IsisCalendarEventVm.layout.xml  |  56 +++
 .../dom/types/isisext/markdowns/IsisMarkdowns.java |   7 +-
 ...kdownHolder_updateReadOnlyOptionalProperty.java |   8 +-
 .../IsisMarkdownHolder_updateReadOnlyProperty.java |   6 +-
 ...wnHolder_updateReadOnlyPropertyWithChoices.java |  12 +-
 .../isisext/markdowns/jdo/IsisMarkdownJdo.java     |   8 +-
 .../isisext/markdowns/jpa/IsisMarkdownJpa.java     |  12 +-
 .../types/isisext/markdowns/vm/IsisMarkdownVm.java |  10 +-
 .../demoapp/dom/types/isisext/sse/DemoTask.java    |   5 +-
 .../javaawt/images/JavaAwtBufferedImages.java      |   9 +-
 ...ImageHolder_updateReadOnlyOptionalProperty.java |   8 +-
 ...BufferedImageHolder_updateReadOnlyProperty.java |   6 +-
 ...geHolder_updateReadOnlyPropertyWithChoices.java |  12 +-
 .../images/jdo/JavaAwtBufferedImageJdo.java        |   8 +-
 .../images/jpa/JavaAwtBufferedImageJpa.java        |  12 +-
 .../samples/JavaAwtBufferedImagesSamples.java      |   3 +-
 .../javaawt/images/vm/JavaAwtBufferedImageVm.java  |   8 +-
 .../types/javalang/JavaLangWrapperTypesMenu.java   |   2 -
 .../types/javalang/booleans/WrapperBooleans.java   |  21 +-
 ...oleanHolder_updateReadOnlyOptionalProperty.java |   8 +-
 ...rapperBooleanHolder_updateReadOnlyProperty.java |   6 +-
 ...anHolder_updateReadOnlyPropertyWithChoices.java |  12 +-
 .../javalang/booleans/jpa/WrapperBooleanJpa.java   |   6 +-
 .../javalang/booleans/vm/WrapperBooleanVm.java     |   5 +-
 .../dom/types/javalang/bytes/WrapperBytes.java     |   9 +-
 ...rByteHolder_updateReadOnlyOptionalProperty.java |   8 +-
 .../WrapperByteHolder_updateReadOnlyProperty.java  |   6 +-
 ...teHolder_updateReadOnlyPropertyWithChoices.java |  12 +-
 .../types/javalang/bytes/jpa/WrapperByteJpa.java   |   6 +-
 .../dom/types/javalang/bytes/vm/WrapperByteVm.java |   5 +-
 .../javalang/characters/WrapperCharacters.java     |   8 +-
 ...acterHolder_updateReadOnlyOptionalProperty.java |   7 +-
 ...pperCharacterHolder_updateReadOnlyProperty.java |   5 +-
 ...erHolder_updateReadOnlyPropertyWithChoices.java |  10 +-
 .../characters/jpa/WrapperCharacterJpa.java        |   6 +-
 .../javalang/characters/vm/WrapperCharacterVm.java |   5 +-
 .../dom/types/javalang/doubles/WrapperDoubles.java |   8 +-
 ...oubleHolder_updateReadOnlyOptionalProperty.java |   8 +-
 ...WrapperDoubleHolder_updateReadOnlyProperty.java |   6 +-
 ...leHolder_updateReadOnlyPropertyWithChoices.java |  12 +-
 .../javalang/doubles/jpa/WrapperDoubleJpa.java     |   6 +-
 .../types/javalang/doubles/vm/WrapperDoubleVm.java |   5 +-
 .../dom/types/javalang/floats/WrapperFloats.java   |   8 +-
 ...FloatHolder_updateReadOnlyOptionalProperty.java |   8 +-
 .../WrapperFloatHolder_updateReadOnlyProperty.java |   6 +-
 ...atHolder_updateReadOnlyPropertyWithChoices.java |  12 +-
 .../types/javalang/floats/jpa/WrapperFloatJpa.java |   6 +-
 .../types/javalang/floats/vm/WrapperFloatVm.java   |   5 +-
 .../types/javalang/integers/WrapperIntegers.java   |   8 +-
 ...tegerHolder_updateReadOnlyOptionalProperty.java |   7 +-
 ...rapperIntegerHolder_updateReadOnlyProperty.java |   6 +-
 ...erHolder_updateReadOnlyPropertyWithChoices.java |  12 +-
 .../javalang/integers/jpa/WrapperIntegerJpa.java   |   6 +-
 .../javalang/integers/vm/WrapperIntegerVm.java     |   5 +-
 .../dom/types/javalang/longs/WrapperLongs.java     |   8 +-
 ...rLongHolder_updateReadOnlyOptionalProperty.java |   8 +-
 .../WrapperLongHolder_updateReadOnlyProperty.java  |   6 +-
 ...ngHolder_updateReadOnlyPropertyWithChoices.java |  12 +-
 .../types/javalang/longs/jpa/WrapperLongJpa.java   |   6 +-
 .../dom/types/javalang/longs/vm/WrapperLongVm.java |   5 +-
 .../dom/types/javalang/shorts/WrapperShorts.java   |   8 +-
 ...ShortHolder_updateReadOnlyOptionalProperty.java |   8 +-
 .../WrapperShortHolder_updateReadOnlyProperty.java |   6 +-
 ...rtHolder_updateReadOnlyPropertyWithChoices.java |  12 +-
 .../types/javalang/shorts/jpa/WrapperShortJpa.java |   6 +-
 .../types/javalang/shorts/vm/WrapperShortVm.java   |   5 +-
 .../types/javalang/strings/JavaLangStrings.java    |   8 +-
 ...tringHolder_updateReadOnlyOptionalProperty.java |   8 +-
 ...avaLangStringHolder_updateReadOnlyProperty.java |   6 +-
 ...ngHolder_updateReadOnlyPropertyWithChoices.java |  12 +-
 .../javalang/strings/jpa/JavaLangStringJpa.java    |   6 +-
 .../strings/samples/JavaLangStringSamples.java     |  11 +-
 .../javalang/strings/vm/JavaLangStringVm.java      |   5 +-
 .../dom/types/javalang/voids/JavaLangVoids.java    |   7 +-
 .../dom/types/javamath/JavaMathTypesMenu.java      |   2 -
 .../javamath/bigdecimals/JavaMathBigDecimals.java  |   8 +-
 ...cimalHolder_updateReadOnlyOptionalProperty.java |   8 +-
 ...athBigDecimalHolder_updateReadOnlyProperty.java |   6 +-
 ...alHolder_updateReadOnlyPropertyWithChoices.java |  12 +-
 .../bigdecimals/jpa/JavaMathBigDecimalJpa.java     |   6 +-
 .../bigdecimals/vm/JavaMathBigDecimalVm.java       |   5 +-
 .../javamath/bigintegers/JavaMathBigIntegers.java  |   8 +-
 ...tegerHolder_updateReadOnlyOptionalProperty.java |   8 +-
 ...athBigIntegerHolder_updateReadOnlyProperty.java |   6 +-
 ...erHolder_updateReadOnlyPropertyWithChoices.java |  12 +-
 .../bigintegers/jpa/JavaMathBigIntegerJpa.java     |   6 +-
 .../bigintegers/vm/JavaMathBigIntegerVm.java       |   5 +-
 .../dom/types/javanet/JavaNetTypesMenu.java        |   2 -
 .../dom/types/javanet/urls/JavaNetUrls.java        |   8 +-
 ...etUrlHolder_updateReadOnlyOptionalProperty.java |   8 +-
 .../JavaNetUrlHolder_updateReadOnlyProperty.java   |   6 +-
 ...rlHolder_updateReadOnlyPropertyWithChoices.java |  12 +-
 .../dom/types/javanet/urls/jpa/JavaNetUrlJpa.java  |   6 +-
 .../dom/types/javanet/urls/vm/JavaNetUrlVm.java    |   5 +-
 .../dom/types/javasql/JavaSqlTypesMenu.java        |   2 -
 .../types/javasql/javasqldate/JavaSqlDates.java    |   8 +-
 ...lDateHolder_updateReadOnlyOptionalProperty.java |   8 +-
 .../JavaSqlDateHolder_updateReadOnlyProperty.java  |   6 +-
 ...teHolder_updateReadOnlyPropertyWithChoices.java |  12 +-
 .../javasql/javasqldate/jpa/JavaSqlDateJpa.java    |   6 +-
 .../javasql/javasqldate/vm/JavaSqlDateVm.java      |   5 +-
 .../javasqltimestamp/JavaSqlTimestamps.java        |   8 +-
 ...stampHolder_updateReadOnlyOptionalProperty.java |   8 +-
 ...aSqlTimestampHolder_updateReadOnlyProperty.java |   6 +-
 ...mpHolder_updateReadOnlyPropertyWithChoices.java |  12 +-
 .../javasqltimestamp/jpa/JavaSqlTimestampJpa.java  |   6 +-
 .../javasqltimestamp/vm/JavaSqlTimestampVm.java    |   5 +-
 .../javatimelocaldate/JavaTimeLocalDates.java      |   8 +-
 ...lDateHolder_updateReadOnlyOptionalProperty.java |   8 +-
 ...TimeLocalDateHolder_updateReadOnlyProperty.java |   6 +-
 ...teHolder_updateReadOnlyPropertyWithChoices.java |  12 +-
 .../jpa/JavaTimeLocalDateJpa.java                  |   6 +-
 .../javatimelocaldate/vm/JavaTimeLocalDateVm.java  |   5 +-
 .../JavaTimeLocalDateTimes.java                    |   8 +-
 ...eTimeHolder_updateReadOnlyOptionalProperty.java |   8 +-
 ...LocalDateTimeHolder_updateReadOnlyProperty.java |   6 +-
 ...meHolder_updateReadOnlyPropertyWithChoices.java |  12 +-
 .../jpa/JavaTimeLocalDateTimeJpa.java              |   6 +-
 .../vm/JavaTimeLocalDateTimeVm.java                |   5 +-
 .../JavaTimeOffsetDateTimes.java                   |   8 +-
 ...eTimeHolder_updateReadOnlyOptionalProperty.java |   8 +-
 ...ffsetDateTimeHolder_updateReadOnlyProperty.java |   6 +-
 ...meHolder_updateReadOnlyPropertyWithChoices.java |  12 +-
 .../jpa/JavaTimeOffsetDateTimeJpa.java             |   6 +-
 .../vm/JavaTimeOffsetDateTimeVm.java               |   5 +-
 .../javatimeoffsettime/JavaTimeOffsetTimes.java    |   8 +-
 ...tTimeHolder_updateReadOnlyOptionalProperty.java |   8 +-
 ...imeOffsetTimeHolder_updateReadOnlyProperty.java |   6 +-
 ...meHolder_updateReadOnlyPropertyWithChoices.java |  12 +-
 .../jpa/JavaTimeOffsetTimeJpa.java                 |   6 +-
 .../vm/JavaTimeOffsetTimeVm.java                   |   5 +-
 .../JavaTimeZonedDateTimes.java                    |   8 +-
 ...eTimeHolder_updateReadOnlyOptionalProperty.java |   8 +-
 ...ZonedDateTimeHolder_updateReadOnlyProperty.java |   6 +-
 ...meHolder_updateReadOnlyPropertyWithChoices.java |  12 +-
 .../jpa/JavaTimeZonedDateTimeJpa.java              |   6 +-
 .../samples/JavaTimeZonedDateTimeSamples.java      |  14 +-
 .../vm/JavaTimeZonedDateTimeVm.java                |   5 +-
 .../dom/types/javautil/JavaUtilTypesMenu.java      |   2 -
 .../types/javautil/javautildate/JavaUtilDates.java |   8 +-
 ...lDateHolder_updateReadOnlyOptionalProperty.java |   8 +-
 .../JavaUtilDateHolder_updateReadOnlyProperty.java |   6 +-
 ...teHolder_updateReadOnlyPropertyWithChoices.java |  12 +-
 .../javautil/javautildate/jpa/JavaUtilDateJpa.java |   6 +-
 .../javautil/javautildate/vm/JavaUtilDateVm.java   |   5 +-
 .../dom/types/javautil/uuids/JavaUtilUuids.java    |   8 +-
 ...lUuidHolder_updateReadOnlyOptionalProperty.java |   8 +-
 .../JavaUtilUuidHolder_updateReadOnlyProperty.java |   6 +-
 ...idHolder_updateReadOnlyPropertyWithChoices.java |  12 +-
 .../types/javautil/uuids/jpa/JavaUtilUuidJpa.java  |   6 +-
 .../types/javautil/uuids/vm/JavaUtilUuidVm.java    |   5 +-
 .../dom/types/jodatime/JodaTimeTypesMenu.java      |  12 +-
 .../types/jodatime/jodadatetime/JodaDateTimes.java |   8 +-
 ...eTimeHolder_updateReadOnlyOptionalProperty.java |   8 +-
 .../JodaDateTimeHolder_updateReadOnlyProperty.java |   6 +-
 ...meHolder_updateReadOnlyPropertyWithChoices.java |  12 +-
 .../jodatime/jodadatetime/vm/JodaDateTimeVm.java   |   5 +-
 .../jodatime/jodalocaldate/JodaLocalDates.java     |   8 +-
 ...lDateHolder_updateReadOnlyOptionalProperty.java |   8 +-
 ...JodaLocalDateHolder_updateReadOnlyProperty.java |   6 +-
 ...teHolder_updateReadOnlyPropertyWithChoices.java |  12 +-
 .../jodatime/jodalocaldate/vm/JodaLocalDateVm.java |   5 +-
 .../jodalocaldatetime/JodaLocalDateTimes.java      |   8 +-
 ...eTimeHolder_updateReadOnlyOptionalProperty.java |   8 +-
 ...LocalDateTimeHolder_updateReadOnlyProperty.java |   6 +-
 ...meHolder_updateReadOnlyPropertyWithChoices.java |  12 +-
 .../jodalocaldatetime/vm/JodaLocalDateTimeVm.java  |   5 +-
 .../jodatime/jodalocaltime/JodaLocalTimes.java     |   8 +-
 ...lTimeHolder_updateReadOnlyOptionalProperty.java |   8 +-
 ...JodaLocalTimeHolder_updateReadOnlyProperty.java |   6 +-
 ...meHolder_updateReadOnlyPropertyWithChoices.java |  12 +-
 .../jodatime/jodalocaltime/vm/JodaLocalTimeVm.java |   5 +-
 .../primitive/booleans/PrimitiveBooleans.java      |   8 +-
 ...mitiveBooleanHolder_updateReadOnlyProperty.java |   6 +-
 ...anHolder_updateReadOnlyPropertyWithChoices.java |  12 +-
 .../booleans/jpa/PrimitiveBooleanJpa.java          |   6 +-
 .../primitive/booleans/vm/PrimitiveBooleanVm.java  |   5 +-
 .../dom/types/primitive/bytes/PrimitiveBytes.java  |   8 +-
 ...PrimitiveByteHolder_updateReadOnlyProperty.java |   6 +-
 ...teHolder_updateReadOnlyPropertyWithChoices.java |  15 +-
 .../primitive/bytes/jpa/PrimitiveByteJpa.java      |   6 +-
 .../types/primitive/bytes/vm/PrimitiveByteVm.java  |   5 +-
 .../dom/types/primitive/chars/PrimitiveChars.java  |   8 +-
 ...PrimitiveCharHolder_updateReadOnlyProperty.java |   6 +-
 ...arHolder_updateReadOnlyPropertyWithChoices.java |  15 +-
 .../primitive/chars/jpa/PrimitiveCharJpa.java      |   6 +-
 .../types/primitive/chars/vm/PrimitiveCharVm.java  |   5 +-
 .../types/primitive/doubles/PrimitiveDoubles.java  |   8 +-
 ...imitiveDoubleHolder_updateReadOnlyProperty.java |   6 +-
 ...leHolder_updateReadOnlyPropertyWithChoices.java |  15 +-
 .../primitive/doubles/jpa/PrimitiveDoubleJpa.java  |   6 +-
 .../primitive/doubles/vm/PrimitiveDoubleVm.java    |   5 +-
 .../types/primitive/floats/PrimitiveFloats.java    |   8 +-
 ...rimitiveFloatHolder_updateReadOnlyProperty.java |   6 +-
 ...atHolder_updateReadOnlyPropertyWithChoices.java |  15 +-
 .../primitive/floats/jpa/PrimitiveFloatJpa.java    |   6 +-
 .../primitive/floats/vm/PrimitiveFloatVm.java      |   5 +-
 .../dom/types/primitive/ints/PrimitiveInts.java    |   8 +-
 .../PrimitiveIntHolder_updateReadOnlyProperty.java |   6 +-
 ...ntHolder_updateReadOnlyPropertyWithChoices.java |  15 +-
 .../types/primitive/ints/jpa/PrimitiveIntJpa.java  |   6 +-
 .../types/primitive/ints/vm/PrimitiveIntVm.java    |   5 +-
 .../dom/types/primitive/longs/PrimitiveLongs.java  |   8 +-
 ...PrimitiveLongHolder_updateReadOnlyProperty.java |   6 +-
 ...ngHolder_updateReadOnlyPropertyWithChoices.java |  15 +-
 .../primitive/longs/jpa/PrimitiveLongJpa.java      |   6 +-
 .../types/primitive/longs/vm/PrimitiveLongVm.java  |   5 +-
 .../types/primitive/shorts/PrimitiveShorts.java    |   8 +-
 ...rimitiveShortHolder_updateReadOnlyProperty.java |   6 +-
 ...rtHolder_updateReadOnlyPropertyWithChoices.java |  15 +-
 .../primitive/shorts/jpa/PrimitiveShortJpa.java    |   6 +-
 .../primitive/shorts/vm/PrimitiveShortVm.java      |   5 +-
 .../demo/domain/src/main/resources/application.yml |   2 +-
 examples/demo/pom.xml                              |   4 +-
 examples/demo/vaadin/pom.xml                       |   6 +-
 .../PrototypeActionsVisibilityAdvisor.java         |  19 +-
 examples/demo/wicket/common/pom.xml                |   5 +
 .../wicket/common/ui/DemoAppWicketCommon.java      |  38 ++
 .../common/ui/custom/WhereInTheWorldPanel.java     |   1 -
 .../webapp/wicket/jdo/DemoAppWicketJdo.java        |  15 +-
 examples/demo/wicket/jpa/pom.xml                   |  20 -
 .../webapp/wicket/jpa/DemoAppWicketJpa.java        |  15 +-
 .../commandlog/model/command/CommandModel.java     |  20 +-
 .../commandlog/jdo/entities/CommandJdo.java        |  25 +-
 .../jdo/mixins/Object_recentCommands.java          |   6 +-
 .../commandlog/jdo/ui/CommandServiceMenu.java      |  13 +-
 .../commandlog/jpa/entities/CommandJpa.java        |  17 +-
 .../primary/mixins/Object_openOnSecondary.java     |  11 +-
 .../primary/ui/CommandReplayOnPrimaryService.java  | 194 ++++----
 .../ui/CommandReplayOnSecondaryService.java        |  51 +-
 extensions/pom.xml                                 |   8 -
 .../secman/applib/SecmanAutoConfiguration.java     |   2 +-
 .../feature/api/ApplicationFeatureChoices.java     |  12 +-
 .../app/ApplicationOrphanedPermissionManager.java  |   4 +-
 ...OrphanedPermissionManager_relocateSelected.java |   5 +-
 .../permission/dom/ApplicationPermission.java      |   5 +-
 .../dom/mixins/ApplicationPermission_allow.java    |   5 +-
 .../dom/mixins/ApplicationPermission_changing.java |   5 +-
 .../dom/mixins/ApplicationPermission_delete.java   |   3 +-
 .../dom/mixins/ApplicationPermission_feature.java  |  12 +-
 .../mixins/ApplicationPermission_updateRole.java   |  12 +-
 .../dom/mixins/ApplicationPermission_veto.java     |   6 +-
 .../dom/mixins/ApplicationPermission_viewing.java  |   5 +-
 .../permission/menu/ApplicationPermissionMenu.java |  39 +-
 .../secman/applib/role/dom/ApplicationRole.java    |   5 +-
 .../dom/mixins/ApplicationRole_addPermission.java  |  15 +-
 .../role/dom/mixins/ApplicationRole_addUser.java   |   6 +-
 .../role/dom/mixins/ApplicationRole_delete.java    |   6 +-
 .../mixins/ApplicationRole_removePermissions.java  |   3 +-
 .../dom/mixins/ApplicationRole_removeUsers.java    |   7 +-
 .../mixins/ApplicationRole_updateDescription.java  |   8 +-
 .../dom/mixins/ApplicationRole_updateName.java     |   7 +-
 .../applib/role/menu/ApplicationRoleMenu.java      |  70 +--
 .../seed/IsisAppFeatureRoleAndPermissions.java     |   7 -
 .../seed/IsisConfigurationRoleAndPermissions.java  |   2 -
 .../applib/tenancy/dom/ApplicationTenancy.java     |   5 +-
 .../dom/mixins/ApplicationTenancy_addChild.java    |   3 +-
 .../dom/mixins/ApplicationTenancy_addUser.java     |   6 +-
 .../dom/mixins/ApplicationTenancy_delete.java      |   3 +-
 .../dom/mixins/ApplicationTenancy_removeChild.java |  12 +-
 .../dom/mixins/ApplicationTenancy_removeUser.java  |  12 +-
 .../dom/mixins/ApplicationTenancy_updateName.java  |   8 +-
 .../dom/mixins/ApplicationTenancy_users.java       |   3 +-
 .../tenancy/menu/ApplicationTenancyMenu.java       |  78 ++--
 .../applib/user/app/ApplicationUserManager.java    |   3 +-
 .../mixins/ApplicationUserManager_allUsers.java    |   3 +-
 .../ApplicationUserManager_newDelegateUser.java    |   6 +-
 .../ApplicationUserManager_newLocalUser.java       |   9 +-
 .../user/contributions/HasUsername_open.java       |  15 +-
 .../secman/applib/user/dom/ApplicationUser.java    |  15 +-
 .../dom/ApplicationUserRepositoryAbstract.java     |   5 +-
 .../user/dom/mixins/ApplicationUser_addRole.java   |   9 +-
 .../user/dom/mixins/ApplicationUser_delete.java    |   6 +-
 .../user/dom/mixins/ApplicationUser_duplicate.java |   7 +-
 .../user/dom/mixins/ApplicationUser_lock.java      |   6 +-
 .../dom/mixins/ApplicationUser_removeRoles.java    |   3 +-
 .../dom/mixins/ApplicationUser_resetPassword.java  |   9 +-
 .../user/dom/mixins/ApplicationUser_unlock.java    |   6 +-
 .../mixins/ApplicationUser_updateAccountType.java  |   7 +-
 .../dom/mixins/ApplicationUser_updateAtPath.java   |   6 +-
 .../mixins/ApplicationUser_updateEmailAddress.java |   9 +-
 .../mixins/ApplicationUser_updateFaxNumber.java    |  12 +-
 .../dom/mixins/ApplicationUser_updateName.java     |  27 +-
 .../dom/mixins/ApplicationUser_updatePassword.java |  18 +-
 .../mixins/ApplicationUser_updatePhoneNumber.java  |  12 +-
 .../dom/mixins/ApplicationUser_updateUsername.java |   8 +-
 ...ApplicationUser_effectiveMemberPermissions.java |   3 +-
 ...ationUser_filterEffectiveMemberPermissions.java |   6 +-
 .../dom/mixins/perms/UserPermissionViewModel.java  |   8 +-
 .../applib/user/menu/ApplicationUserMenu.java      |  38 +-
 .../secman/applib/user/menu/MeService.java         |  48 +-
 .../TableColumnVisibilityServiceForSecman.java     |   6 +-
 .../fullcalendar/applib/CalendarEventable.java     |   5 +-
 .../fullcalendar/applib/Calendarable.java          |   4 +-
 .../spi/CalendarableDereferencingService.java      |  10 +-
 .../fullcalendar/applib/value/CalendarEvent.java   | 113 +++--
 .../value/CalendarEventSemanticsProvider.java      |   8 +-
 extensions/vw/fullcalendar/ui/pom.xml              |   6 +
 ...g.apache.isis.viewer.wicket.ui.ComponentFactory |   2 -
 .../ui/component/EventProviderAbstract.java        |  16 +-
 .../ui/component/IsisModuleExtFullCalendarUi.java  |   7 +-
 .../CalendarableCollectionAsFullCalendar.java      |   3 +-
 ...alendarableCollectionAsFullCalendarFactory.java |   8 +-
 .../CalendarEventableCollectionAsFullCalendar.java |   3 +-
 ...arEventableCollectionAsFullCalendarFactory.java |   8 +-
 .../demomodule/dom/PdfJsDemoObjectWithBlob.java    |  10 +-
 .../examples/facets/jsr303/Jsr303FacetFactory.java |   1 -
 .../facets/jsr303/Jsr303ProgModelFacets.java       |   1 -
 .../jsr303/Jsr303PropertyValidationFacet.java      |   1 -
 .../examples/facets/jsr303/CustomPattern.java      |   1 -
 .../facets/jsr303/CustomPatternValidator.java      |   1 -
 .../examples/facets/jsr303/CustomPatterns.java     |   1 -
 .../facets/jsr303/DomainObjectVanilla.java         |   1 -
 .../jsr303/DomainObjectWithBuiltInValidation.java  |   1 -
 .../jsr303/DomainObjectWithCustomValidation.java   |   1 -
 .../facets/jsr303/Jsr303FacetFacetHolder.java      |   1 -
 .../jsr303/Jsr303FacetFactoryFeatureTypes.java     |   1 -
 .../jsr303/Jsr303FacetFactoryInstantiation.java    |   1 -
 .../jsr303/Jsr303FacetFactoryProcessObject.java    |   1 -
 .../jsr303/Jsr303FacetFactoryProcessProperty.java  |   1 -
 .../facets/jsr303/Jsr303FacetInstantiation.java    |   1 -
 .../jsr303/Jsr303FacetValidatingInteraction.java   |   1 -
 .../vaadin/ui/pages/login/VaadinLoginView.java     |   2 +-
 .../viewer/IsisModuleIncViewerVaadinViewer.java    |   1 -
 isis-parent/pom.xml                                |   6 +-
 mappings/pom.xml                                   |   8 -
 .../restclient/auth/BasicAuthFilter.java           |  16 +-
 mavendeps/adoc/modules/mavendeps/pages/about.adoc  | 129 +-----
 .../setup-and-configure-mavendeps-jdo.adoc         |   4 +-
 .../setup-and-configure-mavendeps-jpa.adoc         |   4 +-
 .../typesafe-queries-and-fetchgroups.adoc          |   4 +-
 .../datanucleus/config/JdoEntityTypeRegistry.java  |  98 ----
 .../entities/DnObjectProviderForIsis.java          |   2 +-
 .../jdosupport/JdoSupportServiceDefault.java       |   1 -
 .../datanucleus/metamodel/JdoMetamodelUtil.java    |  63 ---
 .../metamodel/facets/entity/JdoEntityFacet.java    |   4 +-
 .../mixins/Persistable_downloadJdoMetadata.java    |   5 +-
 .../applib/IsisLocalResourcePathConverter.java     |   6 +-
 .../changetracking/_SimpleChangingEntities.java    |   1 -
 .../jdo/metamodel/beans/JdoBeanTypeClassifier.java |   6 +-
 .../JdoDiscriminatorAnnotationFacetFactory.java    |   1 -
 ...nferredFromJdoPersistenceCapableAnnotation.java |   1 -
 .../version/JdoVersionAnnotationFacetFactory.java  |   1 -
 .../MandatoryFacetFromJdoColumnAnnotation.java     |   1 -
 ...etInferredFromAbsenceOfJdoColumnAnnotation.java |   1 -
 .../jdo/metamodel/menu/JdoMetamodelMenu.java       |  19 +-
 ...atastoreIdentityAnnotationFacetFactoryTest.java |  17 +-
 ...JdoDiscriminatorAnnotationFacetFactoryTest.java |  11 +-
 ...GivenJdoPersistenceCapableFacetFactoryTest.java |  21 +-
 .../JdoVersionAnnotationFacetFactoryTest.java      |  11 +-
 ...vedFromJdoColumnAnnotationFacetFactoryTest.java |  17 +-
 ...vedFromJdoColumnAnnotationFacetFactoryTest.java |  26 +-
 ...JdoNotPersistentAnnotationFacetFactoryTest.java |  11 +-
 ...venJdoPrimaryKeyAnnotationFacetFactoryTest.java |  17 +-
 .../ObjectReflectorDefaultTest_object.java         |   9 +-
 .../SpecificationLoaderTestAbstract.java           |  22 +-
 .../testing/AbstractFacetFactoryTest.java          |   1 -
 .../persistence/jdo/metamodel/testing/Utils.java   |   1 -
 .../JpaEntityInjectionPointResolver.java           |  79 ----
 .../jpa/applib/types/BlobJpaEmbeddable.java        |   1 -
 .../jpa/applib/types/ClobJpaEmbeddable.java        |   1 -
 .../jpa/eclipselink/config/ElSettings.java         |   7 +-
 .../isis/testdomain/config/IsisConfigBeanTest.java |   9 +-
 .../config/IsisConfigBeanTest_usingHeadless.java   |   6 +-
 .../resources/application-config-test.properties   |   2 +-
 .../DomainModelTest_usingBadDomain.java            |  89 ++--
 ...nModelTest_usingBadDomain_noActionEnforced.java |  90 ----
 ...elTest_usingBadDomain_noAnnotationEnforced.java |  84 ++++
 .../DomainModelTest_usingGoodDomain.java           | 163 ++++++-
 .../testdomain/conf/Configuration_headless.java    |  14 +-
 .../isis/testdomain/jdo/entities/JdoProduct.java   |   3 +-
 .../isis/testdomain/jpa/entities/JpaProduct.java   |   3 +-
 .../isis/testdomain/model/bad/AmbiguousTitle.java  |   4 +-
 .../model/bad/InvalidOrphanedActionSupport.java    |   3 +-
 .../bad/InvalidOrphanedCollectionSupport.java      |   3 +-
 .../model/bad/InvalidOrphanedPropertySupport.java  |   3 +-
 ...validOrphanedActionSupportNoActionEnforced.java |  32 --
 ...dOrphanedActionSupportNoAnnotationEnforced.java |  32 ++
 .../isis/testdomain/model/good/MixinConcrete.java  |   6 +-
 .../ProperActionWithNameStartingWithSetOrGet.java  |   6 +-
 .../testdomain/model/good/ProperFullyAbstract.java |  52 +++
 .../testdomain/model/good/ProperFullyImpl.java     |  74 +++
 .../good/ProperMemberInheritanceAbstract.java      |  23 +-
 .../good/ProperMemberInheritanceInterface.java     |   5 +-
 .../testdomain/model/good/ProperMemberSupport.java | 116 ++---
 .../model/good/ProperMemberSupport_action.java     |  35 +-
 .../model/good/ProperMemberSupport_action2.java    |  35 +-
 .../model/good/ProperMemberSupport_action3.java    |  35 +-
 .../model/good/ProperMemberSupport_action4.java    |  33 +-
 .../model/good/ProperMemberSupport_action5.java    |   8 +-
 .../model/good/ProperMemberSupport_collection.java |  12 +-
 .../good/ProperMemberSupport_collection2.java      |  12 +-
 .../good/ProperMemberSupport_collection3.java      |   9 +-
 .../model/good/ProperMemberSupport_property.java   |  15 +-
 .../model/good/ProperMemberSupport_property2.java  |  15 +-
 .../model/good/ProperMemberSupport_property3.java  |   9 +-
 .../model/good/ProperParameterSupport.java         |  45 +-
 .../model/good/ProperPrefixedMember.java           |   3 +-
 .../model/good/ProperServiceWithMixin.java         |   3 +-
 ...lWithAnnotationOptionalUsingPrivateSupport.java | 108 +++++
 .../good/ViewModelWithEncapsulatedMembers.java     |  82 ++++
 .../interaction/InteractionDemo_biArgDisabled.java |   6 +-
 .../interaction/InteractionDemo_biArgEnabled.java  |   9 +-
 .../InteractionDemo_biListOfString.java            |  15 +-
 .../interaction/InteractionDemo_multiEnum.java     |  12 +-
 .../interaction/InteractionDemo_multiInt.java      |  21 +-
 .../interaction/InteractionDemo_negotiate.java     |   6 +-
 .../interaction/InteractionDemo_noArgDisabled.java |   6 +-
 .../interaction/InteractionDemo_noArgEnabled.java  |   3 +-
 .../InteractionNpmDemo_biArgDisabled.java          |  12 +-
 .../InteractionNpmDemo_biArgEnabled.java           |   9 +-
 .../interaction/DomainObjectTesterFactory.java     | 513 +++++++++++++++++++++
 .../testdomain/util/rest/RestEndpointService.java  |   2 +-
 scripts/jira-release-notes.sh                      |  20 +-
 scripts/verify-isis-release.sh                     |   7 +-
 .../bypass/authentication/AuthenticatorBypass.java |   1 -
 .../bypass/authorization/AuthorizorBypass.java     |   1 -
 .../shiro/IsisPermissionTest_setParts.java         |   1 -
 starters/pom.xml                                   |  10 +-
 .../BulkUpdateManagerForDemoToDoItem.java          |  19 +-
 .../demoapp/todomodule/dom/ExcelDemoToDoItem.java  |   8 +-
 subdomains/pom.xml                                 |   8 -
 .../adoc/modules/archtestsupport/pages/about.adoc  |  12 +
 .../applib/classrules/ArchitectureDomainRules.java |  66 ++-
 .../applib/classrules/ArchitectureJdoRules.java    |  65 ++-
 .../applib/classrules/ArchitectureJpaRules.java    |  17 +-
 .../applib/classrules/CommonPredicates.java        |  24 +
 .../applib/entity/jpa/dom/JpaEntity2.java          |   4 +-
 .../demomodule/dom/FakeDataDemoObjectWithAll.java  |  63 +--
 .../IsisIntegrationTestAbstractWithFixtures.java   |   5 +-
 .../applib/events/FixturesInstalledEvent.java      |   1 -
 .../applib/events/FixturesInstallingEvent.java     |   1 -
 .../applib/fixturescripts/FixtureScripts.java      |  61 +--
 .../h2console/ui/services/H2ManagerMenu.java       |   4 +-
 .../applib/validate/DomainModelValidator.java      |  63 ++-
 testing/pom.xml                                    |   8 -
 .../applib/jmocking/InjectIntoJMockAction.java     |   1 -
 .../CollaboratingUsingConstructorInjection.java    |   1 -
 .../CollaboratingUsingSetterInjection.java         |   1 -
 .../applib/jmocking/Collaborator.java              |   1 -
 .../jmocking/JMockActionsTest_returnArgument.java  |   1 -
 .../jmocking/JMockActionsTest_returnEach.java      |   1 -
 .../applib/jmocking/JUnitRuleMockery2Test.java     |   1 -
 ..._autoWiring_constructorInjection_happyCase.java |   1 -
 ...y2Test_autoWiring_sadCase_noClassUnderTest.java |   1 -
 ...est_autoWiring_sadCase_twoClassesUnderTest.java |   1 -
 ...2Test_autoWiring_setterInjection_happyCase.java |   1 -
 ...RuleMockery2Test_mockAnnotatedWithAllowing.java |   1 -
 ...RuleMockery2Test_mockAnnotatedWithIgnoring.java |   1 -
 ...kery2Test_mockAnnotatedWithNever_happyCase.java |   1 -
 ...ockery2Test_mockAnnotatedWithNever_sadCase.java |   1 -
 ...ockery2Test_mockAnnotatedWithOne_happyCase.java |   1 -
 ...eMockery2Test_mockAnnotatedWithOne_sadCase.java |   1 -
 tooling/javamodel/pom.xml                          |   2 +-
 tooling/pom.xml                                    |   2 +-
 .../valuetypes/asciidoc/applib/value/AsciiDoc.java |  10 +-
 .../asciidoc/applib/value/Converter.java           |  52 ++-
 .../metamodel/facets/AsciiDocValueFacet.java       |   1 -
 .../facets/AsciiDocValueSemanticsProvider.java     |   1 -
 valuetypes/asciidoc/persistence/jdo-dn5/pom.xml    |  38 --
 valuetypes/asciidoc/persistence/jdo/pom.xml        |  38 ++
 .../IsisModuleValAsciidocPersistenceJdoDn5.java    |   0
 .../jdo/dn5/converters/IsisAsciiDocConverter.java  |   0
 .../src/main/resources/META-INF/MANIFEST.MF        |   0
 .../{jdo-dn5 => jdo}/src/main/resources/plugin.xml |   0
 valuetypes/asciidoc/persistence/pom.xml            |   2 +-
 valuetypes/asciidoc/ui/pom.xml                     |   4 +-
 .../wkt/components/AsciiDocPanelFactoriesWkt.java  |   1 -
 .../schema/chg/v2/ChangesDtoPanelFactoriesWkt.java |   1 -
 .../schema/cmd/v2/CommandDtoPanelFactoriesWkt.java |   1 -
 .../ixn/v2/InteractionDtoPanelFactoriesWkt.java    |   1 -
 valuetypes/jodatime/applib/pom.xml                 |  49 ++
 .../applib/IsisModuleValJodatimeApplib.java        |  28 ++
 .../jodatime/applib/jaxb/JodatimeJaxbAdapters.java | 175 +++++++
 .../jodatime/applib/value/JodatimeConverters.java  | 128 +++++
 valuetypes/jodatime/pom.xml                        |  33 ++
 .../valuetypes/markdown/applib/value/Markdown.java |   4 -
 .../metamodel/facets/MarkdownValueFacet.java       |   1 -
 .../facets/MarkdownValueSemanticsProvider.java     |   1 -
 valuetypes/markdown/persistence/jdo-dn5/pom.xml    |  42 --
 valuetypes/markdown/persistence/jdo/pom.xml        |  42 ++
 .../IsisModuleValMarkdownPersistenceJdoDn5.java    |   0
 .../jdo/dn5/converters/IsisMarkdownConverter.java  |   0
 .../src/main/resources/META-INF/MANIFEST.MF        |   0
 .../{jdo-dn5 => jdo}/src/main/resources/plugin.xml |   0
 valuetypes/markdown/persistence/pom.xml            |   2 +-
 .../MarkdownPanelFactoriesForWicket.java           |   1 -
 valuetypes/pom.xml                                 |  19 +-
 .../sse/applib/annotations/SseSource.java          |   1 -
 .../valuetypes/sse/applib/service/SseChannel.java  |   1 -
 .../facets/SseAnnotationFacetFactory.java          |   1 -
 .../sse/metamodel/facets/SseObserveFacet.java      |   1 -
 .../metamodel/facets/SseObserveFacetAbstract.java  |   1 -
 ...eObserveFacetForServerSentEventsAnnotation.java |   1 -
 .../ui/wkt/markup/ListeningMarkupComponent.java    |   2 +-
 .../markup/ListeningMarkupComponent_observing.java |   5 +-
 .../ListeningMarkupPanelFactoriesForWicket.java    |   1 -
 .../ui/wkt/webmodule/ServerSentEventsServlet.java  |  13 +-
 .../common/applib/mixins/Object_impersonate.java   |  18 +-
 .../applib/mixins/Object_impersonateWithRoles.java |  24 +-
 .../restfulobjects/applib/JsonRepresentation.java  |  40 +-
 .../isis/viewer/restfulobjects/applib/Rel.java     |  29 +-
 .../restfulobjects/applib/RepresentationType.java  |  12 +-
 .../applib/dtos/ScalarValueDtoV1.java              |  46 --
 .../restfulobjects/applib/util/MediaTypes.java     |   1 -
 .../viewer/restfulobjects/applib/util/Parser.java  |  22 +-
 .../restfulobjects/rendering/IResourceContext.java |  11 +-
 .../restfulobjects/rendering/LinkBuilder.java      |   8 +-
 .../domainobjects/DomainObjectReprRenderer.java    |   2 +-
 .../rendering/domainobjects/JsonValueEncoder.java  |  36 +-
 .../domainobjects/ObjectActionReprRenderer.java    |   4 +-
 .../AbstractTypeFeatureReprRenderer.java           |   3 +
 .../domaintypes/DomainTypeReprRenderer.java        |   2 +-
 .../service/swagger/SwaggerServiceDefault.java     |   2 +-
 .../service/swagger/SwaggerServiceMenu.java        |  83 ++--
 ..._ensureCompatibleAcceptHeader_ContractTest.java |  34 +-
 .../IsisModuleViewerRestfulObjectsViewer.java      |   1 -
 .../viewer/context/ResourceContext.java            |  26 +-
 .../restfulobjects/viewer/mappers/FailureUtil.java |  36 +-
 .../resources/DomainObjectResourceServerside.java  |   8 +-
 .../viewer/resources/HomePageReprRenderer.java     |  40 +-
 .../resources/MenuBarsResourceServerside.java      |   2 +-
 .../viewer/resources/ResourceAbstract.java         |  40 +-
 .../IsisRestfulObjectsInteractionFilter.java       |  15 +-
 .../webmodule/auth/AuthenticationStrategy.java     |   1 -
 .../auth/AuthenticationStrategyDefault.java        |   1 -
 .../context/ResourceContext_getArg_Test.java       |  10 +-
 .../wicket/model/common/OnSelectionHandler.java    |   1 -
 .../wicket/model/isis/WicketViewerSettings.java    |   1 -
 .../model/isis/WicketViewerSettingsAccessor.java   |   1 -
 .../wicket/model/mementos/PageParameterNames.java  |   1 -
 .../wicket/model/modelhelpers/WhereAmIHelper.java  |   1 -
 .../viewer/wicket/model/models/AboutModel.java     |   1 -
 .../viewer/wicket/model/models/ActionModel.java    |   7 +-
 .../viewer/wicket/model/models/ActionPrompt.java   |   1 -
 .../wicket/model/models/BookmarkTreeNode.java      |   1 -
 .../model/models/BookmarkTreeNodeComparator.java   |   1 -
 .../wicket/model/models/BookmarkableModel.java     |   1 -
 .../wicket/model/models/BookmarkedPagesModel.java  |   1 -
 .../viewer/wicket/model/models/EntityModel.java    |  30 +-
 .../viewer/wicket/model/models/FormExecutor.java   |   1 -
 .../wicket/model/models/FormExecutorContext.java   |   1 -
 .../wicket/model/models/ImageResourceCache.java    |   1 -
 .../viewer/wicket/model/models/ModelAbstract.java  |   1 -
 .../isis/viewer/wicket/model/models/PageType.java  |   1 -
 .../viewer/wicket/model/models/ScalarModel.java    |  14 +-
 .../wicket/model/models/ScalarPropertyModel.java   |   4 -
 .../wicket/model/models/ServiceActionsModel.java   |   1 -
 .../viewer/wicket/model/models/ValueModel.java     |   1 -
 .../isis/viewer/wicket/model/models/VoidModel.java |   1 -
 .../viewer/wicket/model/models/WelcomeModel.java   |   1 -
 .../wicket/model/models/ActionModelTest.java       |   1 -
 .../models/LowestCommonSuperclassClosureTest.java  |   1 -
 .../isis/viewer/wicket/ui/ComponentFactory.java    |   1 -
 .../viewer/wicket/ui/ComponentFactoryAbstract.java |   1 -
 .../isis/viewer/wicket/ui/ComponentType.java       |   1 -
 .../actionresponse/ActionResultResponseType.java   |  83 ++--
 .../ui/app/registry/ComponentFactoryRegistrar.java |   1 -
 .../ui/app/registry/ComponentFactoryRegistry.java  |   1 -
 .../registry/ComponentFactoryRegistryAccessor.java |   1 -
 .../viewer/wicket/ui/components/LabelBase.java     |   2 +-
 .../wicket/ui/components/WebComponentBase.java     |   2 +-
 .../wicket/ui/components/about/AboutPanel.java     |   1 -
 .../ui/components/about/AboutPanelFactory.java     |   1 -
 .../ui/components/about/JarManifestPanel.java      |   1 -
 .../ui/components/actioninfo/ActionInfoPanel.java  |   1 -
 .../actioninfo/ActionInfoPanelFactory.java         |   1 -
 .../AdditionalLinksAsDropDownPanel.java            |   1 -
 .../AdditionalLinksAsListInlinePanel.java          |   1 -
 .../entityactions/AdditionalLinksPanel.java        |   1 -
 .../entityactions/EntityActionLinkFactory.java     |   1 -
 .../serviceactions/CssMenuItemPanelAbstract.java   |   1 -
 .../serviceactions/CssSubMenuItemsPanel.java       |   1 -
 .../serviceactions/MenuActionLinkFactory.java      |   1 -
 .../serviceactions/ServiceActionUtil.java          |   1 -
 .../serviceactions/ServiceActionsPanelFactory.java |   1 -
 .../serviceactions/TertiaryMenuPanelFactory.java   |   1 -
 .../actions/ActionParametersFormPanel.java         |   1 -
 .../actions/ActionParametersFormPanelFactory.java  |   1 -
 .../components/actions/ActionParametersPanel.java  |   1 -
 .../actions/ActionParametersPanelFactory.java      |   1 -
 .../bookmarkedpages/BookmarkedPagesPanel.java      |   1 -
 .../ui/components/collection/CollectionPanel.java  |   1 -
 .../selector/CollectionSelectorHelper.java         |   1 -
 .../selector/CollectionSelectorPanel.java          |   1 -
 .../CollectionContentsAsAjaxTablePanel.java        |   1 -
 .../CollectionContentsAsAjaxTablePanelFactory.java |   1 -
 .../CollectionContentsSortableDataProvider.java    |   1 -
 .../ajaxtable/columns/ColumnAbstract.java          |   1 -
 .../columns/ObjectAdapterPropertyColumn.java       |   1 -
 .../columns/ObjectAdapterTitleColumn.java          |   1 -
 .../columns/ObjectAdapterToggleboxColumn.java      |   1 -
 .../icons/CollectionContentsAsIconsPanel.java      |   1 -
 .../CollectionContentsAsIconsPanelFactory.java     |   1 -
 .../CollectionContentsMultipleViewsPanel.java      |   1 -
 ...ollectionContentsMultipleViewsPanelFactory.java |   1 -
 .../summary/CollectionContentsAsSummary.java       |   1 -
 .../CollectionContentsAsSummaryFactory.java        |   1 -
 .../unresolved/CollectionContentsHiddenPanel.java  |   1 -
 .../CollectionContentsHiddenPanelFactory.java      |   1 -
 .../ui/components/empty/EmptyCollectionPanel.java  |   1 -
 .../empty/EmptyCollectionPanelFactory.java         |   1 -
 .../entity/EntityComponentFactoryAbstract.java     |  21 +-
 .../entity/collection/EntityCollectionPanel.java   |   1 -
 .../collection/EntityCollectionPanelFactory.java   |   1 -
 .../entity/header/EntityHeaderPanel.java           |   1 -
 .../entity/header/EntityHeaderPanelFactory.java    |   1 -
 .../entity/icontitle/EntityIconAndTitlePanel.java  |   1 -
 .../icontitle/EntityIconAndTitlePanelFactory.java  |   1 -
 .../icontitle/EntityIconTitleAndCopyLinkPanel.java |   1 -
 .../EntityIconTitleAndCopyLinkPanelFactory.java    |   1 -
 .../ui/components/footer/FooterPanelFactory.java   |   1 -
 .../ui/components/header/HeaderPanelFactory.java   |   1 -
 .../ui/components/layout/bs3/BS3GridPanel.java     |   1 -
 .../components/layout/bs3/Bs3GridPanelFactory.java |   1 -
 .../wicket/ui/components/layout/bs3/Util.java      |   1 -
 .../components/property/PropertyEditFormPanel.java |   1 -
 .../property/PropertyEditFormPanelFactory.java     |   1 -
 .../ui/components/property/PropertyEditPanel.java  |   1 -
 .../property/PropertyEditPanelFactory.java         |   1 -
 .../scalars/ComponentFactoryScalarAbstract.java    |   1 -
 .../ui/components/scalars/ScalarPanelAbstract.java |   1 -
 .../scalars/ScalarPanelSelectAbstract.java         |   1 -
 .../scalars/ScalarPanelTextFieldAbstract.java      |   1 -
 .../ScalarPanelTextFieldDatePickerAbstract.java    |   1 -
 .../scalars/ScalarPanelTextFieldNumeric.java       |   1 -
 .../ScalarPanelTextFieldParseableAbstract.java     |   1 -
 .../components/scalars/blobclob/IsisBlobPanel.java |   1 -
 .../scalars/blobclob/IsisBlobPanelFactory.java     |   1 -
 .../components/scalars/blobclob/IsisClobPanel.java |   1 -
 .../scalars/blobclob/IsisClobPanelFactory.java     |   1 -
 .../components/scalars/bookmark/BookmarkPanel.java |   1 -
 .../scalars/bookmark/BookmarkPanelFactory.java     |   1 -
 .../scalars/image/JavaAwtImagePanel.java           |   1 -
 .../scalars/image/JavaAwtImagePanelFactory.java    |   1 -
 .../scalars/jdk8time/Jdk8LocalDatePanel.java       |   1 -
 .../jdk8time/Jdk8LocalDatePanelFactory.java        |   1 -
 .../scalars/jdk8time/Jdk8LocalDateTimePanel.java   |   1 -
 .../jdk8time/Jdk8LocalDateTimePanelFactory.java    |   1 -
 .../scalars/jdk8time/Jdk8OffsetDateTimePanel.java  |   1 -
 .../jdk8time/Jdk8OffsetDateTimePanelFactory.java   |   1 -
 .../scalars/jdkdates/JavaSqlDatePanel.java         |   1 -
 .../scalars/jdkdates/JavaSqlDatePanelFactory.java  |   1 -
 .../scalars/jdkdates/JavaSqlTimePanel.java         |   1 -
 .../scalars/jdkdates/JavaSqlTimePanelFactory.java  |   1 -
 .../scalars/jdkdates/JavaSqlTimestampPanel.java    |   1 -
 .../jdkdates/JavaSqlTimestampPanelFactory.java     |   1 -
 .../scalars/jdkdates/JavaUtilDatePanel.java        |   1 -
 .../scalars/jdkdates/JavaUtilDatePanelFactory.java |   1 -
 .../scalars/jdkmath/JavaMathBigDecimalPanel.java   |   1 -
 .../jdkmath/JavaMathBigDecimalPanelFactory.java    |   1 -
 .../scalars/jdkmath/JavaMathBigIntegerPanel.java   |   1 -
 .../jdkmath/JavaMathBigIntegerPanelFactory.java    |   1 -
 .../jodatime/ConverterForJodaLocalTime.java        |   1 -
 .../scalars/jodatime/JodaDateTimePanel.java        |   1 -
 .../scalars/jodatime/JodaDateTimePanelFactory.java |   1 -
 .../scalars/jodatime/JodaLocalDatePanel.java       |   1 -
 .../jodatime/JodaLocalDatePanelFactory.java        |   1 -
 .../scalars/jodatime/JodaLocalDateTimePanel.java   |   1 -
 .../jodatime/JodaLocalDateTimePanelFactory.java    |   1 -
 .../scalars/jodatime/JodaLocalTimePanel.java       |   1 -
 .../jodatime/JodaLocalTimePanelFactory.java        |   1 -
 .../components/scalars/markup/MarkupComponent.java |   1 -
 .../scalars/markup/MarkupPanelFactories.java       |   1 -
 .../scalars/markup/ParentedMarkupPanel.java        |   1 -
 .../scalars/markup/StandaloneMarkupPanel.java      |   1 -
 .../ui/components/scalars/oiddto/OidDtoPanel.java  |   1 -
 .../scalars/oiddto/OidDtoPanelFactory.java         |   1 -
 .../scalars/passwd/IsisPasswordPanel.java          |   1 -
 .../scalars/passwd/IsisPasswordPanelFactory.java   |   1 -
 .../components/scalars/primitive/BooleanPanel.java |   1 -
 .../scalars/primitive/BooleanPanelFactory.java     |   1 -
 .../ui/components/scalars/primitive/BytePanel.java |   1 -
 .../scalars/primitive/BytePanelFactory.java        |   1 -
 .../scalars/primitive/CharacterPanel.java          |   1 -
 .../scalars/primitive/CharacterPanelFactory.java   |   1 -
 .../components/scalars/primitive/DoublePanel.java  |   1 -
 .../scalars/primitive/DoublePanelFactory.java      |   1 -
 .../components/scalars/primitive/FloatPanel.java   |   1 -
 .../scalars/primitive/FloatPanelFactory.java       |   1 -
 .../components/scalars/primitive/IntegerPanel.java |   1 -
 .../scalars/primitive/IntegerPanelFactory.java     |   1 -
 .../ui/components/scalars/primitive/LongPanel.java |   1 -
 .../scalars/primitive/LongPanelFactory.java        |   1 -
 .../components/scalars/primitive/ShortPanel.java   |   1 -
 .../scalars/primitive/ShortPanelFactory.java       |   1 -
 .../scalars/reference/EntityLinkSelect2Panel.java  |   1 -
 .../scalars/reference/ReferencePanel.java          |   1 -
 .../scalars/reference/ReferencePanelFactory.java   |   1 -
 .../scalars/string/MultiLineStringPanel.java       |   1 -
 .../ui/components/scalars/string/StringPanel.java  |   1 -
 .../scalars/string/StringPanelFactory.java         |   1 -
 .../ui/components/scalars/uuid/UuidPanel.java      |   1 -
 .../components/scalars/uuid/UuidPanelFactory.java  |   1 -
 .../ui/components/scalars/value/ValuePanel.java    |   1 -
 .../scalars/value/ValuePanelFactory.java           |   1 -
 .../ValueChoicesSelect2PanelFactory.java           |   1 -
 .../StandaloneCollectionPanel.java                 |   1 -
 .../StandaloneCollectionPanelFactory.java          |   1 -
 .../components/tree/IsisToWicketTreeAdapter.java   |  82 ++--
 .../ui/components/tree/StandaloneTreePanel.java    |   1 -
 .../wicket/ui/components/tree/TreePanel.java       |   1 -
 .../ui/components/tree/TreePanelFactories.java     |   1 -
 .../components/tree/themes/TreeThemeProvider.java  |   1 -
 .../tree/themes/TreeThemeProviderDefault.java      |   1 -
 .../unknown/UnknownModelPanelFactory.java          |   1 -
 .../ui/components/value/StandaloneValuePanel.java  |   1 -
 .../value/StandaloneValuePanelFactory.java         |   1 -
 .../ui/components/voidreturn/VoidReturnPanel.java  |   1 -
 .../voidreturn/VoidReturnPanelFactory.java         |   1 -
 .../wicket/ui/components/welcome/WelcomePanel.java |   6 +-
 .../ui/components/welcome/WelcomePanelFactory.java |   1 -
 .../widgets/buttons/ContainedButtonPanel.java      |   1 -
 .../widgets/buttons/ToggleButtonsPanel.java        |   1 -
 .../widgets/checkbox/ContainedToggleboxPanel.java  |   1 -
 .../entitysimplelink/EntityLinkSimplePanel.java    |   1 -
 .../EntityLinkSimplePanelFactory.java              |   1 -
 .../widgets/formcomponent/CancelHintRequired.java  |   1 -
 .../formcomponent/FormComponentPanelAbstract.java  |   1 -
 .../widgets/formcomponent/FormFeedbackPanel.java   |   1 -
 .../widgets/linkandlabel/ActionLink.java           |   1 -
 .../wicket/ui/errors/ExceptionStackTracePanel.java |   1 -
 .../ui/pages/BookmarkedPagesModelProvider.java     |   1 -
 .../isis/viewer/wicket/ui/pages/PageAbstract.java  |   2 +-
 .../isis/viewer/wicket/ui/pages/PageClassList.java |   1 -
 .../viewer/wicket/ui/pages/PageClassRegistry.java  |   1 -
 .../wicket/ui/pages/PageClassRegistryAccessor.java |   1 -
 .../wicket/ui/pages/PageClassRegistrySpi.java      |   1 -
 .../wicket/ui/pages/PageNavigationService.java     |   1 -
 .../isis/viewer/wicket/ui/pages/WebPageBase.java   |   2 +-
 .../viewer/wicket/ui/pages/about/AboutPage.java    |   1 -
 .../accmngt/AccountManagementPageAbstract.java     |   1 -
 .../password_reset/PasswordResetEmailPanel.java    |   1 -
 .../accmngt/password_reset/PasswordResetPage.java  |   1 -
 .../accmngt/password_reset/PasswordResetPanel.java |   1 -
 .../ui/pages/accmngt/register/RegisterPage.java    |   1 -
 .../pages/accmngt/signup/RegistrationFormPage.java |   1 -
 .../accmngt/signup/RegistrationFormPanel.java      |   1 -
 .../viewer/wicket/ui/pages/entity/EntityPage.java  |   1 -
 .../viewer/wicket/ui/pages/error/ErrorPage.java    |   1 -
 .../isis/viewer/wicket/ui/pages/home/HomePage.java |   1 -
 .../wicket/ui/pages/login/IsisSignInPanel.java     |   1 -
 .../wicket/ui/pages/login/WicketLogoutPage.java    |   1 -
 .../wicket/ui/pages/login/WicketSignInPage.java    |   1 -
 .../wicket/ui/pages/mmverror/MmvErrorPage.java     |   1 -
 .../StandaloneCollectionPage.java                  |   1 -
 .../viewer/wicket/ui/pages/value/ValuePage.java    |   1 -
 .../wicket/ui/pages/voidreturn/VoidReturnPage.java |   1 -
 .../isis/viewer/wicket/ui/panels/FormAbstract.java |   1 -
 .../ui/panels/HasDynamicallyVisibleContent.java    |   1 -
 .../viewer/wicket/ui/panels/PanelAbstract.java     |   1 -
 .../isis/viewer/wicket/ui/panels/PanelBase.java    |   2 +-
 .../wicket/ui/panels/PromptFormPanelAbstract.java  |   1 -
 .../isis/viewer/wicket/ui/util/Components.java     |   1 -
 .../viewer/wicket/ui/util/CssClassAppender.java    |   1 -
 .../viewer/wicket/ui/util/CssClassRemover.java     |   1 -
 .../isis/viewer/wicket/ui/util/CssIdAppender.java  |   1 -
 .../isis/viewer/wicket/ui/util/SSESupport.java     |   1 -
 .../isis/viewer/wicket/ui/util/Tooltips.java       |   1 -
 .../wicket/ui/ComponentType_ConstantsTest.java     |   1 -
 .../isis/viewer/wicket/ui/fixtures/Customers.java  |   1 -
 .../viewer/IsisModuleViewerWicketViewer.java       |   1 -
 .../AuthenticatedWebSessionForIsis.java            |   1 -
 .../integration/ConverterForObjectAdapter.java     |   1 -
 .../ConverterForObjectAdapterMemento.java          |   1 -
 .../viewer/integration/IsisResourceSettings.java   |   1 -
 .../viewer/integration/WebRequestCycleForIsis.java |   1 -
 .../ComponentFactoryRegistrarDefault.java          |   1 -
 .../ComponentFactoryRegistryDefault.java           |   1 -
 .../registries/pages/PageClassListDefault.java     |   1 -
 .../registries/pages/PageClassRegistryDefault.java |   1 -
 .../pages/PageNavigationServiceDefault.java        |   1 -
 .../services/WicketViewerSettingsDefault.java      |   1 -
 .../viewer/services/mementos/ObjectMementoWkt.java |  91 ++--
 .../viewer/wicketapp/IsisWicketApplication.java    |  20 +-
 .../IsisWicketApplication_newPageFactory.java      |   1 -
 .../IsisWicketApplication_newSession.java          |   1 -
 ...ionForIsis_DownCastsInheritedFunctionality.java |   1 -
 ...thenticatedWebSessionForIsis_Instantiation.java |   1 -
 .../AuthenticatedWebSessionForIsis_SignIn.java     |   1 -
 ...uthenticatedWebSessionForIsis_TestAbstract.java |   1 -
 .../pages/PageClassListDefault_Instantiation.java  |   1 -
 ...ageClassListDefault_RegistrationAndCaching.java |   1 -
 .../wicketapp/IsisWicketApplication_Defaults.java  |   1 -
 .../wicketapp/IsisWicketApplication_Pages.java     |   1 -
 2531 files changed, 15300 insertions(+), 15986 deletions(-)

[isis] 06/07: ISIS-2846 link tree diagram / clean up

Posted by jo...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

joergrade pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/isis.git

commit 290c6817a7f436bcf70ca5cb9394b0c96c6f96e5
Author: Jörg Rade <jo...@kuehne-nagel.com>
AuthorDate: Fri Sep 10 12:56:48 2021 +0200

    ISIS-2846 link tree diagram / clean up
---
 .../apache/isis/client/kroviz/core/event/LogEntry.kt  |  4 ++--
 .../isis/client/kroviz/ui/diagram/LinkTreeDiagram.kt  | 19 +++++++++----------
 .../apache/isis/client/kroviz/ui/diagram/PumlCode.kt  | 16 +++++++++++++++-
 3 files changed, 26 insertions(+), 13 deletions(-)

diff --git a/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/core/event/LogEntry.kt b/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/core/event/LogEntry.kt
index 61e53c1..6e16d20 100644
--- a/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/core/event/LogEntry.kt
+++ b/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/core/event/LogEntry.kt
@@ -180,8 +180,8 @@ data class LogEntry(
             }
         }
         if (type == "") {
-            console.log("[LE.initType]")
-            console.log(this)
+            val stringList = url.split("/")
+            type = stringList.last()
         }
     }
 
diff --git a/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/ui/diagram/LinkTreeDiagram.kt b/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/ui/diagram/LinkTreeDiagram.kt
index 48685f4..e11cfc8 100644
--- a/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/ui/diagram/LinkTreeDiagram.kt
+++ b/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/ui/diagram/LinkTreeDiagram.kt
@@ -26,6 +26,7 @@ import org.apache.isis.client.kroviz.core.event.ResourceSpecification
 import org.apache.isis.client.kroviz.to.HasLinks
 import org.apache.isis.client.kroviz.to.Property
 import org.apache.isis.client.kroviz.to.Relation
+import org.apache.isis.client.kroviz.to.Represention
 import org.apache.isis.client.kroviz.ui.core.UiManager
 import org.apache.isis.client.kroviz.utils.StringUtils
 
@@ -40,7 +41,7 @@ object LinkTreeDiagram {
             val root = tree.root
             pc.code += toPumlCode(root, 1)
         }
-        pc.mindmap()
+        pc.toMindmap()
         return pc.code
     }
 
@@ -51,18 +52,16 @@ object LinkTreeDiagram {
         val pc = PumlCode()
         if (le != null) {
             val title = StringUtils.shortTitle(url, protocolHostPort)
-            val depth = "*".repeat(level)
-            pc.add(depth).add(":")
             pc.addStereotype(le.type)
             pc.addLink(url, title)
             pc.addHorizontalLine()
             pc.add(linkInfo(le))
-            pc.addLine(";")
+            pc.toMindmapNode(level)
             node.children.forEach {
                 val childCode = toPumlCode(it, level + 1)
                 pc.add(childCode)
             }
-            if (le.type == "property-description") {
+            if (le.type == Represention.PROPERTY_DESCRIPTION.type) {
                 val pdCode = propertyDescriptionInfo(le, level + 1)
                 pc.add(pdCode)
             }
@@ -86,19 +85,19 @@ object LinkTreeDiagram {
                 }
             }
         }
+        pc.trim()
         return pc.code
     }
 
-    private fun propertyDescriptionInfo(logEntry: LogEntry, level: Int) : String {
+    private fun propertyDescriptionInfo(logEntry: LogEntry, level: Int): String {
         val pc = PumlCode()
         val obj = logEntry.obj
         if (obj != null) {
-            val depth = "*".repeat(level)
-            pc.add(depth).add(":")
             val ets = (obj as Property).extensions!!
             pc.addLine("friendlyName: " + ets.friendlyName)
-            pc.addLine("descriptions: " + ets.description)
-            pc.addLine(";")
+            pc.addHorizontalLine()
+            pc.add("descriptions: " + ets.description)
+            pc.toMindmapNode(level)
         }
         return pc.code
     }
diff --git a/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/ui/diagram/PumlCode.kt b/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/ui/diagram/PumlCode.kt
index 86410eb..ebc57e6 100644
--- a/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/ui/diagram/PumlCode.kt
+++ b/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/ui/diagram/PumlCode.kt
@@ -55,11 +55,17 @@ class PumlCode() {
         return this
     }
 
-    fun mindmap(): PumlCode {
+    fun toMindmap(): PumlCode {
         code += "@startmindmap$NL" + code + "@endmindmap$NL"
         return this
     }
 
+    fun toMindmapNode(level:Int): PumlCode {
+        val depth = "*".repeat(level)
+        code = depth + ":" + code + ";" + NL
+        return this
+    }
+
     private fun center(s: String): String {
         return ".." + s + ".."
     }
@@ -80,4 +86,12 @@ class PumlCode() {
         code += "----" + NL
         return this
     }
+
+    fun trim(): PumlCode {
+        if (code.endsWith(NL)) {
+            code = code.dropLast(1)
+        }
+        return this
+    }
+
 }

[isis] 05/07: ISIS-2846 link tree diagram works correctly, including extension properties

Posted by jo...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

joergrade pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/isis.git

commit 8ce7c80b3ff75d6e2f520d1b6321f31e6c1839ae
Author: Jörg Rade <jo...@kuehne-nagel.com>
AuthorDate: Thu Sep 9 18:20:46 2021 +0200

    ISIS-2846 link tree diagram works correctly, including extension properties
---
 .../isis/client/kroviz/core/event/LogEntry.kt      | 11 +++++--
 .../client/kroviz/ui/diagram/LinkTreeDiagram.kt    | 34 ++++++++++++----------
 2 files changed, 27 insertions(+), 18 deletions(-)

diff --git a/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/core/event/LogEntry.kt b/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/core/event/LogEntry.kt
index b53d774..61e53c1 100644
--- a/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/core/event/LogEntry.kt
+++ b/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/core/event/LogEntry.kt
@@ -56,8 +56,9 @@ data class LogEntry(
         val method: String? = "",
         val request: String = "",
         @Contextual val createdAt: Date = Date()) {
-    val url:String = rs.url
-    val referrer = rs.referrerUrl
+    val url: String = rs.url
+
+    //    val referrer = rs.referrerUrl
     val subType = rs.subType
     var state = EventState.INITIAL
     var title: String = ""
@@ -175,9 +176,13 @@ data class LogEntry(
             val self = (obj as HasLinks).getLinks().firstOrNull() { it.relation() == Relation.SELF }
             if (self != null) {
                 val t = self.type.removePrefix("application/json;profile=\"urn:org.restfulobjects:repr-types/")
-                this.type = t.removeSuffix("\"")
+                type = t.removeSuffix("\"")
             }
         }
+        if (type == "") {
+            console.log("[LE.initType]")
+            console.log(this)
+        }
     }
 
 // region response
diff --git a/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/ui/diagram/LinkTreeDiagram.kt b/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/ui/diagram/LinkTreeDiagram.kt
index 4a09ec3..48685f4 100644
--- a/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/ui/diagram/LinkTreeDiagram.kt
+++ b/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/ui/diagram/LinkTreeDiagram.kt
@@ -24,6 +24,7 @@ import org.apache.isis.client.kroviz.core.event.EventStore
 import org.apache.isis.client.kroviz.core.event.LogEntry
 import org.apache.isis.client.kroviz.core.event.ResourceSpecification
 import org.apache.isis.client.kroviz.to.HasLinks
+import org.apache.isis.client.kroviz.to.Property
 import org.apache.isis.client.kroviz.to.Relation
 import org.apache.isis.client.kroviz.ui.core.UiManager
 import org.apache.isis.client.kroviz.utils.StringUtils
@@ -33,16 +34,13 @@ object LinkTreeDiagram {
     private val protocolHostPort = UiManager.getUrl()
 
     fun build(aggregator: BaseAggregator): String {
-        console.log("[LTD.build]")
         val pc = PumlCode()
         if (aggregator is AggregatorWithLayout) {
             val tree = aggregator.tree!!
             val root = tree.root
-            console.log(root)
             pc.code += toPumlCode(root, 1)
         }
         pc.mindmap()
-        console.log(pc.code)
         return pc.code
     }
 
@@ -53,23 +51,26 @@ object LinkTreeDiagram {
         val pc = PumlCode()
         if (le != null) {
             val title = StringUtils.shortTitle(url, protocolHostPort)
-            val type = le.selfType()
             val depth = "*".repeat(level)
             pc.add(depth).add(":")
-            pc.addStereotype(type)
+            pc.addStereotype(le.type)
             pc.addLink(url, title)
             pc.addHorizontalLine()
-            pc.add(traceInfo(le))
+            pc.add(linkInfo(le))
             pc.addLine(";")
             node.children.forEach {
                 val childCode = toPumlCode(it, level + 1)
                 pc.add(childCode)
             }
+            if (le.type == "property-description") {
+                val pdCode = propertyDescriptionInfo(le, level + 1)
+                pc.add(pdCode)
+            }
         }
         return pc.code
     }
 
-    private fun traceInfo(logEntry: LogEntry): String {
+    private fun linkInfo(logEntry: LogEntry): String {
         val pc = PumlCode()
         val obj = logEntry.obj
         if (obj != null) {
@@ -88,15 +89,18 @@ object LinkTreeDiagram {
         return pc.code
     }
 
-    private fun LogEntry.selfType(): String {
-        val selfLink = this.selfLink()
-        return if (selfLink != null) {
-            selfLink.representation().type
-        } else {
-            console.log("[LE.selfType]")
-            console.log(this)
-            ""
+    private fun propertyDescriptionInfo(logEntry: LogEntry, level: Int) : String {
+        val pc = PumlCode()
+        val obj = logEntry.obj
+        if (obj != null) {
+            val depth = "*".repeat(level)
+            pc.add(depth).add(":")
+            val ets = (obj as Property).extensions!!
+            pc.addLine("friendlyName: " + ets.friendlyName)
+            pc.addLine("descriptions: " + ets.description)
+            pc.addLine(";")
         }
+        return pc.code
     }
 
 }

[isis] 01/07: ISIS-2846 Create a LinkTreeDiagram (via PlantUML mindmap) from History/LogEntry

Posted by jo...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

joergrade pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/isis.git

commit f46347040f2abaadadf4bbec99bececd1a7462a4
Author: Jörg Rade <jo...@kuehne-nagel.com>
AuthorDate: Tue Aug 31 14:06:48 2021 +0200

    ISIS-2846 Create a LinkTreeDiagram (via PlantUML mindmap) from History/LogEntry
---
 .../isis/client/kroviz/core/event/LogEntry.kt      |   5 +
 .../client/kroviz/core/event/LogEntryDecorator.kt  |  84 ++++------------
 .../client/kroviz/ui/diagram/LinkTreeDiagram.kt    | 112 ++++++++++++++++-----
 .../isis/client/kroviz/ui/dialog/DiagramDialog.kt  |  27 ++++-
 .../isis/client/kroviz/ui/dialog/EventLogDetail.kt |  35 +++----
 .../client/kroviz/ui/panel/DynamicMenuBuilder.kt   |  15 +--
 .../apache/isis/client/kroviz/utils/StringUtils.kt |  12 +++
 .../kroviz/core/event/LogEntryDecoratorTest.kt     |  23 +++++
 .../isis/client/kroviz/util/StringUtilsTest.kt     |  24 +++++
 9 files changed, 212 insertions(+), 125 deletions(-)

diff --git a/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/core/event/LogEntry.kt b/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/core/event/LogEntry.kt
index 2fe5973..a7db164 100644
--- a/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/core/event/LogEntry.kt
+++ b/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/core/event/LogEntry.kt
@@ -250,6 +250,11 @@ data class LogEntry(
         return null
     }
 
+    fun upLink(): Link? {
+        getLinks().forEach { if (it.relation() == Relation.UP) return it }
+        return null
+    }
+
     fun getLinks(): List<Link> {
         return if (obj is HasLinks) {
             (obj as HasLinks).getLinks()
diff --git a/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/core/event/LogEntryDecorator.kt b/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/core/event/LogEntryDecorator.kt
index b5e41ac..68e9626 100644
--- a/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/core/event/LogEntryDecorator.kt
+++ b/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/core/event/LogEntryDecorator.kt
@@ -21,41 +21,12 @@ package org.apache.isis.client.kroviz.core.event
 import org.apache.isis.client.kroviz.to.Link
 import org.apache.isis.client.kroviz.to.Relation
 import org.apache.isis.client.kroviz.ui.core.Constants
-import org.apache.isis.client.kroviz.utils.StringUtils
 
 class LogEntryDecorator(val logEntry: LogEntry) {
 
-    val href: String
-    val links: List<Link>
-    val linked: List<LogEntry>
-
-    init {
-        href = logEntry.selfHref()
-        links = logEntry.getLinks()
-        linked = EventStore.getLinked()
-    }
-
-    fun findOrphans(children: Set<LogEntry>): Set<String> {
-        console.log("[LED.findOrphans] $href")
-        val kids = children.map { it.url }
-        val orphans = mutableSetOf<String>()
-        links.forEach {
-//            console.log(it)
-            val rel = it.relation()
-            when {
-                (rel == Relation.UP) -> {
-                }
-                (rel == Relation.SELF) -> {
-                }
-                else -> {
-                    val url = it.href
-                    if (!kids.contains(url))
-                        orphans.add(url)
-                }
-            }
-        }
-        return orphans
-    }
+    val href: String = logEntry.selfHref()
+    val links: List<Link> = logEntry.getLinks()
+    val linked: List<LogEntry> = EventStore.getLinked()
 
     fun findChildren(): Set<LogEntry> {
         val children = findChildrenByUpRelation()
@@ -77,7 +48,7 @@ class LogEntryDecorator(val logEntry: LogEntry) {
     }
 
     private fun findChildrenByLinks(): Set<LogEntry> {
-        console.log("[LED.findChildrenByLinks] $href")
+        console.log("[LED.findChildrenByLinks]")
         val children = mutableSetOf<LogEntry>()
         links.forEach {
             console.log(it.toString())
@@ -113,29 +84,30 @@ class LogEntryDecorator(val logEntry: LogEntry) {
         return children
     }
 
-    fun selfType(): String {
-        val selfLink = logEntry.selfLink()
-        if (selfLink != null) {
-            return selfLink.representation().type
-        } else return ""
-    }
-
-    private fun hasUp(): Boolean {
-        links.forEach {
-            if (it.relation() == Relation.UP) {
-                return true
+    fun findChildrenIn(aggregatedList: List<LogEntry>): List<LogEntry> {
+        console.log("[LED.findChildrenIn]")
+        val selfUrl = href
+        val children = mutableListOf<LogEntry>()
+        aggregatedList.forEach {
+            if (it.url != selfUrl && it.response.contains(selfUrl)) {
+                children.add(it)
             }
         }
-        return false
+        return children
     }
 
-    fun hasParent(): Boolean {
-        val answer = hasUp()
-        if (answer) return true
-        return findParent() != null
+    fun selfType(): String {
+        val selfLink = logEntry.selfLink()
+        return if (selfLink != null) {
+            selfLink.representation().type
+        } else {
+            console.log("[LED.selfType]")
+            console.log(logEntry)
+            ""
+        }
     }
 
-    private fun findParent(): LogEntry? {
+    fun findParent(): LogEntry? {
         val url = logEntry.url
         linked.forEach {
             when {
@@ -146,16 +118,4 @@ class LogEntryDecorator(val logEntry: LogEntry) {
         return null
     }
 
-    fun shortTitle(): String {
-        var result = logEntry.url
-        val signature = Constants.restInfix
-        if (logEntry.url.contains(signature)) {
-            // strip off protocol, host, port
-            //           val protocolHostPort = UiManager.getUrl()
-//            result = result.replace(protocolHostPort + signature, "")
-            result = StringUtils.removeHexCode(result)
-        }
-        return result
-    }
-
 }
diff --git a/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/ui/diagram/LinkTreeDiagram.kt b/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/ui/diagram/LinkTreeDiagram.kt
index d49321c..c6f6533 100644
--- a/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/ui/diagram/LinkTreeDiagram.kt
+++ b/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/ui/diagram/LinkTreeDiagram.kt
@@ -1,45 +1,107 @@
 package org.apache.isis.client.kroviz.ui.diagram
 
+import org.apache.isis.client.kroviz.core.aggregator.BaseAggregator
 import org.apache.isis.client.kroviz.core.event.EventStore
 import org.apache.isis.client.kroviz.core.event.LogEntry
 import org.apache.isis.client.kroviz.core.event.LogEntryDecorator
+import org.apache.isis.client.kroviz.core.event.ResourceSpecification
+import org.apache.isis.client.kroviz.to.HasLinks
+import org.apache.isis.client.kroviz.ui.core.UiManager
+import org.apache.isis.client.kroviz.utils.StringUtils
 
 object LinkTreeDiagram {
 
-    private val NL = "\n"
-    private val SEP = " | "
-    private val OPEN = "{"
-    private val CLOSE = "}"
-    private val PLUS = "+"
-
-    fun build(): String {
-        var code = "@startsalt$NL$OPEN$NL$OPEN T#$NL"
-        val roots: List<LogEntry> = findRoots()
-        roots.forEach {
-            code += iterateOverChildren(it, PLUS)
+    private const val NL = "\n"
+    private const val prolog = "@startmindmap$NL"
+    private const val epilog = "@endmindmap$NL"
+    private val protocolHostPort = UiManager.getUrl()
+
+    fun build(aggregator: BaseAggregator): String {
+        var code = prolog
+        val entryList: List<LogEntry> = EventStore.findAllBy(aggregator)
+        val root = findRoot(entryList)
+        if (root == null) {
+            code += "* /$NL"
+            code += createNodes(entryList, 2)
+        } else {
+            code += root.asPumlNode(1)
+            val led = LogEntryDecorator(root)
+            val childList = led.findChildrenIn(entryList)
+            console.log("[LTD.build]")
+            console.log(aggregator)
+            console.log(entryList)
+            code += createChildNodes(childList, 2)
+        }
+        code += epilog
+        return code
+    }
+
+    private fun createChildNodes(childList: List<LogEntry>, level: Int): String {
+        var code = ""
+        childList.forEach {
+            code += createNode(it, level)
+            val led = LogEntryDecorator(it)
+            val kidSet = led.findChildrenIn(childList)
+            code += createChildNodes(kidSet, level +1)
         }
-        code += "$CLOSE$NL$CLOSE$NL@endsalt"
         return code
     }
 
-    private fun findRoots(): List<LogEntry> {
-        val rootSet = mutableListOf<LogEntry>()
-        EventStore.getLinked().forEach { le ->
-            val led = LogEntryDecorator(le)
-            if (!led.hasParent()) rootSet.add(le)  // this may still include
+    private fun createNode(le: LogEntry, level: Int): String {
+        var code = ""
+        if (isInEventStore(le.url)) {
+            code += le.asPumlNode(level)
         }
-        return rootSet
+        return code
     }
 
-    private fun iterateOverChildren(logEntry: LogEntry, prefix: String): String {
-        val led = LogEntryDecorator(logEntry)
-        val children = led.findChildren()
-        val orphans = led.findOrphans(children)
-        var code = prefix + " " + led.shortTitle() + SEP + led.selfType() + SEP + orphans.toString() + NL
-        children.forEach {
-            code += iterateOverChildren(it, prefix + PLUS)
+    private fun createNodes(entryList: List<LogEntry>, level: Int): String {
+        var code = ""
+        entryList.forEach {
+            code += createNode(it, level)
         }
         return code
     }
 
+    private fun findRoot(entryList: List<LogEntry>): LogEntry? {
+        entryList.forEach {
+            val led = LogEntryDecorator(it)
+            val parent = led.findParent()
+            if (parent != null && !entryList.contains(parent)) {
+                return parent
+            }
+        }
+        return null
+    }
+
+    private fun isInEventStore(url: String): Boolean {
+        val rs = ResourceSpecification(url)
+        val le = EventStore.findBy(rs)
+        return (le != null)
+    }
+
+    fun LogEntry.asPumlNode(level: Int): String {
+        val led = LogEntryDecorator(this)
+        val title = StringUtils.shortTitle(this.url, protocolHostPort)
+        val type = led.selfType()
+        val depth = "*".repeat(level)
+        var answer = "$depth:..//<<$type>>//..$NL**$title**$NL"
+        answer += "----$NL"
+        answer += traceInfo(this)
+        return answer + ";" + NL
+    }
+
+    private fun traceInfo(logEntry: LogEntry) : String {
+        val obj = logEntry.obj!!
+        var answer = "__" + obj::class.simpleName + "__" + NL
+        if (obj is HasLinks) {
+            obj.links.forEach {
+                answer += StringUtils.shortTitle(it.href, protocolHostPort) + NL
+            }
+        }
+        console.log("[LTD.traceInfo]")
+        console.log(answer)
+        return answer
+    }
+
 }
diff --git a/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/ui/dialog/DiagramDialog.kt b/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/ui/dialog/DiagramDialog.kt
index 447b97a..750c3b1 100644
--- a/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/ui/dialog/DiagramDialog.kt
+++ b/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/ui/dialog/DiagramDialog.kt
@@ -56,7 +56,7 @@ class DiagramDialog(
         )
     }
 
-    override fun execute(action:String?) {
+    override fun execute(action: String?) {
         pin()
     }
 
@@ -84,14 +84,35 @@ class DiagramDialog(
 
     fun buildMenu(): List<KvisionHtmlLink> {
         val menu = mutableListOf<KvisionHtmlLink>()
+        menu.add(buildPinAction())
+        menu.add(buildDownloadAction())
+        return menu
+    }
+
+    private fun buildPinAction(): io.kvision.html.Link {
         val action = MenuFactory.buildActionLink(
                 label = "Pin",
                 menuTitle = "Pin")
         action.onClick {
             pin()
         }
-        menu.add(action)
-        return menu
+        return action
+    }
+
+    private fun buildDownloadAction(): io.kvision.html.Link {
+        val action = MenuFactory.buildActionLink(
+                label = "Download",
+                menuTitle = "Download")
+        action.onClick {
+            download()
+        }
+        return action
+    }
+
+    private fun download() {
+        val svgCode = getDiagramCode()
+        DownloadDialog(fileName = "diagram.svg", svgCode).open()
+        dialog.close()
     }
 
 }
diff --git a/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/ui/dialog/EventLogDetail.kt b/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/ui/dialog/EventLogDetail.kt
index f73a26a..6eb29f6 100644
--- a/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/ui/dialog/EventLogDetail.kt
+++ b/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/ui/dialog/EventLogDetail.kt
@@ -18,7 +18,6 @@
  */
 package org.apache.isis.client.kroviz.ui.dialog
 
-import org.apache.isis.client.kroviz.core.aggregator.CollectionAggregator
 import org.apache.isis.client.kroviz.core.event.EventStore
 import org.apache.isis.client.kroviz.core.event.LogEntry
 import org.apache.isis.client.kroviz.core.event.LogEntryDecorator
@@ -30,11 +29,13 @@ import org.apache.isis.client.kroviz.ui.core.FormItem
 import org.apache.isis.client.kroviz.ui.core.RoDialog
 import org.apache.isis.client.kroviz.ui.diagram.JsonDiagram
 import org.apache.isis.client.kroviz.ui.diagram.LayoutDiagram
+import org.apache.isis.client.kroviz.ui.diagram.LinkTreeDiagram
 import org.apache.isis.client.kroviz.utils.StringUtils
 import org.apache.isis.client.kroviz.utils.XmlHelper
 
 class EventLogDetail(val logEntryFromTabulator: LogEntry) : Command() {
     private var logEntry: LogEntry
+    private lateinit var dialog: RoDialog
 
     init {
         // For a yet unknown reason, aggregators are not transmitted via tabulator.
@@ -45,7 +46,7 @@ class EventLogDetail(val logEntryFromTabulator: LogEntry) : Command() {
 
     // callback parameter
     private val LOG: String = "log"
-    private val OBJ: String = "obj"
+    private val LNK: String = "lnk"
 
     fun open() {
         val responseStr = if (logEntry.subType == Constants.subTypeJson) {
@@ -58,23 +59,21 @@ class EventLogDetail(val logEntryFromTabulator: LogEntry) : Command() {
         val children = led.findChildren()
         var kids = ""
         children.forEach { kids += it.url + "\n" }
-        var orphans = ""
-        led.findOrphans(children).forEach { orphans += it + "\n" }
         val formItems = mutableListOf<FormItem>()
         formItems.add(FormItem("Url", ValueType.TEXT, logEntry.title))
         formItems.add(FormItem("Response", ValueType.TEXT_AREA, responseStr, 10))
         formItems.add(FormItem("Aggregators", ValueType.TEXT, content = logEntry.aggregators))
         formItems.add(FormItem("Children", ValueType.TEXT_AREA, kids, size = 5))
-        formItems.add(FormItem("Orphans", ValueType.TEXT_AREA, orphans, size = 5))
-        formItems.add(FormItem("Object Diagram", ValueType.BUTTON, null, callBack = this, callBackAction = OBJ))
+        formItems.add(FormItem("Link Tree Diagram", ValueType.BUTTON, null, callBack = this, callBackAction = LNK))
         formItems.add(FormItem("Console", ValueType.BUTTON, null, callBack = this, callBackAction = LOG))
 
-        RoDialog(
+        dialog = RoDialog(
                 caption = "Details :" + logEntry.title,
                 items = formItems,
                 command = this,
                 defaultAction = "Diagram",
-                widthPerc = 60).open()
+                widthPerc = 60)
+        dialog.open()
     }
 
     override fun execute(action: String?) {
@@ -83,8 +82,8 @@ class EventLogDetail(val logEntryFromTabulator: LogEntry) : Command() {
             action == LOG -> {
                 console.log(logEntry)
             }
-            action == OBJ -> {
-                objectDiagram()
+            action == LNK -> {
+                linkTreeDiagram()
             }
             else -> {
                 console.log(logEntry)
@@ -93,18 +92,12 @@ class EventLogDetail(val logEntryFromTabulator: LogEntry) : Command() {
         }
     }
 
-    private fun objectDiagram() {
+    private fun linkTreeDiagram() {
         logEntry.aggregators.forEach {
-            console.log(it)
-            if (it is CollectionAggregator) {
-                val displayModel = it.dpm
-                // https://github.com/moll/json-stringify-safe/blob/master/stringify.js
-                val jsonStr = JSON.stringify(displayModel)
-                console.log(jsonStr)
-                val pumlCode = JsonDiagram.build(jsonStr)
-                DiagramDialog("Object Diagram", pumlCode).open()
-            }
+            val code = LinkTreeDiagram.build(it)
+            DiagramDialog("Link Tree Diagram", code).open()
         }
+        dialog.close()
     }
 
     private fun defaultAction() {
@@ -118,7 +111,7 @@ class EventLogDetail(val logEntryFromTabulator: LogEntry) : Command() {
                 JsonDiagram.build(str)
             else -> "{}"
         }
-        DiagramDialog("Response Diagram", pumlCode).open()
+        DiagramDialog("Layout Diagram", pumlCode).open()
     }
 
 }
diff --git a/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/ui/panel/DynamicMenuBuilder.kt b/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/ui/panel/DynamicMenuBuilder.kt
index 055df30..7f01d61 100644
--- a/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/ui/panel/DynamicMenuBuilder.kt
+++ b/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/ui/panel/DynamicMenuBuilder.kt
@@ -25,8 +25,6 @@ import org.apache.isis.client.kroviz.core.event.ResourceProxy
 import org.apache.isis.client.kroviz.to.TObject
 import org.apache.isis.client.kroviz.ui.chart.ChartFactory
 import org.apache.isis.client.kroviz.ui.core.UiManager
-import org.apache.isis.client.kroviz.ui.diagram.LinkTreeDiagram
-import org.apache.isis.client.kroviz.ui.dialog.DiagramDialog
 import org.apache.isis.client.kroviz.ui.dialog.EventExportDialog
 import org.apache.isis.client.kroviz.utils.IconManager
 import org.apache.isis.client.kroviz.utils.StringUtils
@@ -40,7 +38,7 @@ class DynamicMenuBuilder {
             val title = StringUtils.deCamel(it.id)
             val icon = IconManager.find(title)
             val invokeLink = it.getInvokeLink()!!
-            val command =  { ResourceProxy().fetch(invokeLink) }
+            val command = { ResourceProxy().fetch(invokeLink) }
             val me = buildMenuEntry(icon, title, command)
             menu.add(me)
         }
@@ -50,10 +48,6 @@ class DynamicMenuBuilder {
     fun buildTableMenu(table: EventLogTable): dynamic {
         val menu = mutableListOf<dynamic>()
 
-        val a1 = buildMenuEntry("Hierarchy", "Link Tree Diagram",
-                { this.linkTreeDiagram() })
-        menu.add(a1)
-
         val a2 = buildMenuEntry("Export", "Export Events ...", {
             EventExportDialog().open()
         })
@@ -82,13 +76,6 @@ class DynamicMenuBuilder {
         }
     }
 
-    private fun linkTreeDiagram() {
-        val code = LinkTreeDiagram.build()
-        console.log("[DMB.linkTreeDiagram]")
-        console.log(code)
-        DiagramDialog("Link Tree Diagram", code).open()
-    }
-
     private fun downLoadCsv(table: EventLogTable) {
         table.tabulator.downloadCSV("data.csv")
     }
diff --git a/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/utils/StringUtils.kt b/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/utils/StringUtils.kt
index 311b8d7..a042665 100644
--- a/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/utils/StringUtils.kt
+++ b/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/utils/StringUtils.kt
@@ -21,6 +21,7 @@ package org.apache.isis.client.kroviz.utils
 import org.apache.isis.client.kroviz.to.Argument
 import org.apache.isis.client.kroviz.to.Link
 import org.apache.isis.client.kroviz.to.TObject
+import org.apache.isis.client.kroviz.ui.core.Constants
 
 object StringUtils {
 
@@ -62,6 +63,17 @@ object StringUtils {
         return if (input == outputWithoutWhiteSpace) input else output
     }
 
+    fun shortTitle(url: String, protocolHostPort: String): String {
+        var title = url
+        val signature = Constants.restInfix
+        if (title.contains(signature)) {
+            // strip off protocol, host, port
+            title = title.replace(protocolHostPort + signature, "")
+            title = StringUtils.removeHexCode(title)
+        }
+        return title
+    }
+
     fun removeHexCode(input: String): String {
         var output = ""
         val list: List<String> = input.split("/")
diff --git a/incubator/clients/kroviz/src/test/kotlin/org/apache/isis/client/kroviz/core/event/LogEntryDecoratorTest.kt b/incubator/clients/kroviz/src/test/kotlin/org/apache/isis/client/kroviz/core/event/LogEntryDecoratorTest.kt
new file mode 100644
index 0000000..2aa8a54
--- /dev/null
+++ b/incubator/clients/kroviz/src/test/kotlin/org/apache/isis/client/kroviz/core/event/LogEntryDecoratorTest.kt
@@ -0,0 +1,23 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ */
+package org.apache.isis.client.kroviz.core.event
+
+class LogEntryDecoratorTest {
+
+}
diff --git a/incubator/clients/kroviz/src/test/kotlin/org/apache/isis/client/kroviz/util/StringUtilsTest.kt b/incubator/clients/kroviz/src/test/kotlin/org/apache/isis/client/kroviz/util/StringUtilsTest.kt
new file mode 100644
index 0000000..ba15e96
--- /dev/null
+++ b/incubator/clients/kroviz/src/test/kotlin/org/apache/isis/client/kroviz/util/StringUtilsTest.kt
@@ -0,0 +1,24 @@
+package org.apache.isis.client.kroviz.util
+
+import org.apache.isis.client.kroviz.ui.core.Constants
+import org.apache.isis.client.kroviz.ui.core.UiManager
+import org.apache.isis.client.kroviz.utils.StringUtils
+import kotlin.test.Test
+import kotlin.test.assertEquals
+
+class StringUtilsTest {
+    @Test
+    fun testShortTitle() {
+        // given
+        UiManager.login(Constants.demoUrl, Constants.demoUser, Constants.demoPass)
+        val url = "http://localhost:8080/restful/domain-types/demo.JavaLangStrings/collections/entities"
+
+        // when
+        val actual = StringUtils.shortTitle(url, UiManager.getUrl())
+
+        // then
+        val expected = "/domain-types/demo.JavaLangStrings/collections/entities"
+        assertEquals(expected, actual)
+    }
+
+}

[isis] 04/07: ISIS-2846 link tree diagram works correctly

Posted by jo...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

joergrade pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/isis.git

commit d80c042343fe57798af6bbe5708262430800af36
Author: Jörg Rade <jo...@kuehne-nagel.com>
AuthorDate: Thu Sep 9 17:14:13 2021 +0200

    ISIS-2846 link tree diagram works correctly
---
 .../client/kroviz/ui/diagram/LinkTreeDiagram.kt    | 11 +++++----
 .../apache/isis/client/kroviz/ui/diagram/Node.kt   | 25 ---------------------
 .../apache/isis/client/kroviz/ui/diagram/Tree.kt   | 26 ++++++++++++++--------
 .../isis/client/kroviz/ui/diagram/TreeTest.kt      |  8 +++----
 4 files changed, 28 insertions(+), 42 deletions(-)

diff --git a/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/ui/diagram/LinkTreeDiagram.kt b/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/ui/diagram/LinkTreeDiagram.kt
index bc3789d..4a09ec3 100644
--- a/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/ui/diagram/LinkTreeDiagram.kt
+++ b/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/ui/diagram/LinkTreeDiagram.kt
@@ -24,6 +24,7 @@ import org.apache.isis.client.kroviz.core.event.EventStore
 import org.apache.isis.client.kroviz.core.event.LogEntry
 import org.apache.isis.client.kroviz.core.event.ResourceSpecification
 import org.apache.isis.client.kroviz.to.HasLinks
+import org.apache.isis.client.kroviz.to.Relation
 import org.apache.isis.client.kroviz.ui.core.UiManager
 import org.apache.isis.client.kroviz.utils.StringUtils
 
@@ -46,7 +47,7 @@ object LinkTreeDiagram {
     }
 
     private fun toPumlCode(node: Node, level: Int): String {
-        val url = node.key
+        val url = node.name
         val rs = ResourceSpecification(url)
         val le = EventStore.findBy(rs)
         val pc = PumlCode()
@@ -76,9 +77,11 @@ object LinkTreeDiagram {
             pc.addClass(className)
             if (obj is HasLinks) {
                 obj.links.forEach {
-                    val url = it.href
-                    val title = StringUtils.shortTitle(url, protocolHostPort)
-                    pc.addLink(url, title)
+                    if (it.relation() != Relation.SELF) {
+                        val url = it.href
+                        val title = StringUtils.shortTitle(url, protocolHostPort)
+                        pc.addLink(url, title)
+                    }
                 }
             }
         }
diff --git a/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/ui/diagram/Node.kt b/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/ui/diagram/Node.kt
deleted file mode 100644
index 79c0930..0000000
--- a/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/ui/diagram/Node.kt
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *        http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- */
-package org.apache.isis.client.kroviz.ui.diagram
-
-class Node(val key: String, val parent: Node?) {
-
-    val children = mutableListOf<Node>()
-
-}
diff --git a/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/ui/diagram/Tree.kt b/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/ui/diagram/Tree.kt
index 922bc94..4990d1b 100644
--- a/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/ui/diagram/Tree.kt
+++ b/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/ui/diagram/Tree.kt
@@ -21,28 +21,36 @@ package org.apache.isis.client.kroviz.ui.diagram
 class Tree(val root: Node) {
 
     fun addChildToParent(childUrl: String, parentUrl: String) {
-        var p = find(parentUrl, root)
+        var p = find(root, parentUrl)
         if (p == null) {
+            console.log("[Tree.addChildToParent] nothing found for parentUrl")
+            console.log(childUrl)
+            console.log(parentUrl)
             p = root
         }
         val c = Node(childUrl, p)
         p.children.add(c)
     }
 
-    fun find(url: String, node: Node): Node? {
-        if (node.key == url) {
+    fun find(node: Node, url: String): Node? {
+        if (node.name == url) {
             return node
         } else {
-            var answer: Node? = null
             node.children.forEach {
-                if (it.key == url) {
-                    answer = it
-                } else {
-                    answer = find(url, it)
+                val result: Node? = find(it, url)
+                if (result != null) {
+                    return result
                 }
             }
-            return answer
+            return null
         }
     }
 
 }
+
+class Node(val name: String, val parent: Node?) {
+
+    val children = mutableListOf<Node>()
+
+}
+
diff --git a/incubator/clients/kroviz/src/test/kotlin/org/apache/isis/client/kroviz/ui/diagram/TreeTest.kt b/incubator/clients/kroviz/src/test/kotlin/org/apache/isis/client/kroviz/ui/diagram/TreeTest.kt
index 712bc86..c906173 100644
--- a/incubator/clients/kroviz/src/test/kotlin/org/apache/isis/client/kroviz/ui/diagram/TreeTest.kt
+++ b/incubator/clients/kroviz/src/test/kotlin/org/apache/isis/client/kroviz/ui/diagram/TreeTest.kt
@@ -42,15 +42,15 @@ class TreeTest {
         tree.addChildToParent(url_1_2, url_1)
 
         //then
-        val r = tree.find(url_0, root)!!
+        val r = tree.find(root, url_0, )!!
         assertEquals(1, r.children.size)
         assertNull(r.parent)
 
-        val c = tree.find(url_1, root)!!
+        val c = tree.find(root, url_1, )!!
         assertNotNull(c.parent)
         assertEquals(2, c.children.size)
-        assertEquals(url_1_1, c.children.first().key)
-        assertEquals(url_1_2, c.children.last().key)
+        assertEquals(url_1_1, c.children.first().name)
+        assertEquals(url_1_2, c.children.last().name)
     }
 
 }