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

danhaywood pushed a commit to branch ISIS-3255
in repository https://gitbox.apache.org/repos/asf/isis.git

commit bbe77f5beee1d42b5f316e4888e357636993fce2
Author: Dan Haywood <[email protected]>
AuthorDate: Fri Nov 4 00:00:26 2022 +0000

    ISIS-3255: refining generation of config docs
---
 .../modules/ROOT/pages/updating-the-website.adoc   |   8 +
 core/config/generateConfigDocs.groovy              |  32 ++-
 core/config/pom.xml                                |  53 ++++-
 .../adoc/modules/config/pages/sections/Other.adoc  |  26 ++-
 .../config/pages/sections/causeway.applib.adoc     | 220 ++++++++++++++-------
 .../pages/sections/causeway.core.config.adoc       |   2 +-
 .../pages/sections/causeway.core.meta-model.adoc   |   4 +-
 .../causeway.core.meta-model.introspector.adoc     |  34 ++--
 .../causeway.core.meta-model.validator.adoc        |  24 +--
 .../sections/causeway.core.runtime-services.adoc   |  86 ++++----
 .../pages/sections/causeway.core.runtime.adoc      |   4 +-
 .../config/pages/sections/causeway.extensions.adoc | 155 ++++++++++-----
 .../sections/causeway.persistence.schema.adoc      |   8 +-
 .../pages/sections/causeway.security.keycloak.adoc |  77 +++++++-
 .../pages/sections/causeway.security.shiro.adoc    |   2 +-
 .../pages/sections/causeway.security.spring.adoc   |   4 +-
 .../config/pages/sections/causeway.testing.adoc    |  14 +-
 .../sections/causeway.viewer.restfulobjects.adoc   |  22 +--
 .../pages/sections/causeway.viewer.wicket.adoc     | 195 +++++++++++-------
 .../modules/config/pages/sections/datanucleus.adoc |   8 +-
 .../modules/config/pages/sections/eclipselink.adoc |  50 ++---
 .../modules/config/pages/sections/resteasy.adoc    |   2 +-
 .../core/config/CausewayConfiguration.java         |   2 +-
 extensions/core/excel/fixture/pom.xml              |   6 -
 .../ExecutionLogEntry_copyToOutbox.java            |   6 +-
 preview.sh                                         | 182 ++++++++++-------
 scripts/ci/_adoc-gen-config.sh                     |   5 +-
 27 files changed, 783 insertions(+), 448 deletions(-)

diff --git 
a/antora/components/comguide/modules/ROOT/pages/updating-the-website.adoc 
b/antora/components/comguide/modules/ROOT/pages/updating-the-website.adoc
index 5d58cf379a..dc04bfd6fb 100644
--- a/antora/components/comguide/modules/ROOT/pages/updating-the-website.adoc
+++ b/antora/components/comguide/modules/ROOT/pages/updating-the-website.adoc
@@ -9,6 +9,14 @@ This branch can then be used for documentation updates.
 
 == Update docs
 
+Prereqs:
+
+* jdk 11
+* mvn 3.x
+* groovy 3.x
+* pandoc 2.x
+* dos2unix
+
 In the regular `causeway` repo:
 
 * Check out the branch:
diff --git a/core/config/generateConfigDocs.groovy 
b/core/config/generateConfigDocs.groovy
index c6b81a5d18..411b120ef5 100644
--- a/core/config/generateConfigDocs.groovy
+++ b/core/config/generateConfigDocs.groovy
@@ -19,7 +19,7 @@
  */
 
 //
-// groovy generateConfigDocs -f 
"target/classes/META-INF/spring-configuration-metadata.json" -o /tmp
+// groovy generateConfigDocs -f 
"target/classes/META-INF/spring-configuration-metadata.json" -o /c/tmp
 
 import groovy.json.JsonSlurper
 
@@ -194,36 +194,18 @@ groups+= new PropertyGroup() {{
     searchOrder = 501
 }}
 
-groups+= new PropertyGroup() {{
-    prefix = "causeway.subdomains"
-    name = "Subdomains"
-    searchOrder = 501
-}}
-
 groups+= new PropertyGroup() {{
     prefix = "causeway.testing"
     name = "Testing"
     searchOrder = 501
 }}
 
-groups+= new PropertyGroup() {{
-    prefix = "causeway.mappings"
-    name = "Bounded Context Mappings"
-    searchOrder = 501
-}}
-
 groups+= new PropertyGroup() {{
     prefix = "causeway.incubator"
     name = "Incubator"
     searchOrder = 501
 }}
 
-groups+= new PropertyGroup() {{
-    prefix = "causeway.legacy"
-    name = "Legacy"
-    searchOrder = 501
-}}
-
 groups+= new PropertyGroup() {{
     prefix = "" // 'causeway.objects', 'causeway.environment'
     name = "Other"
@@ -369,8 +351,12 @@ static String toAsciidoc(String str) {
     if (str == null) return null;
 
     System.out.print(".");
-    str = str.replaceAll( /\{@link[ ]+?([^}]+?)[ ]+?([^}]+?)}/, '$2')
-    str = str.replaceAll( /\{@link (?:(?:[^}]|[.])+[.])*([^}]+)}/, '``$1``')
+    String orig = str;
+
+    str = str.replaceAll( /\{@link[ ]+(?:[^ }]+)[^}]+?[ ]+([^})]+)}/, '$1')    
      // {@link 
org.apache.causeway.applib.events.lifecycle.ObjectLoadedEvent.Noop 
ObjectLoadedEvent.Noop}: ObjectLoadedEvent.Noop
+    str = str.replaceAll( /\{@link[ ]+?(?:[^ }]+?[ ]+?([^})]+))}/, '$1')       
      // {@link Foo foo bar} and {@link Foo#bar foo bar} : "foo bar"
+    str = str.replaceAll( /\{@link[ ]+?(?:[^}]+?[ ]+?([^})]+))}/, '$1') // 
{@link Foo#bar(abc, def) foo bar} and {@link Foo#bar() foo bar} : "foo bar" ;
+    str = str.replaceAll( /\{@link (?:(?:[^} ]|[.])+[.])*([^}]+)}/, '``$1``')  
      // {@link org.apache.causeway.applib.annotation.Action#domainEvent()} : 
``Action#domainEvent()``
     str = str.replaceAll( /<tt>(?:(?:[^<]|[.])+[.])*([^<]+)<\/tt>/, '``$1``')
     str = str.replaceAll( /<code>(?:(?:[^<]|[.])+[.])*([^<]+)<\/code>/, 
'``$1``')
     str = str.replaceAll( /@apiNote -/, 'TIP:')
@@ -385,6 +371,10 @@ static String toAsciidoc(String str) {
     File tf = File.createTempFile("input",".html")
     tf.write(str)   // write to the file
 
+    if (str.contains("@link")) {
+        System.out.println(str);
+    }
+
     String cmd = "pandoc --wrap=none -f html -t asciidoc " + 
tf.getCanonicalPath()
     String adoc = cmd.execute().text
 
diff --git a/core/config/pom.xml b/core/config/pom.xml
index 910489d8dd..734cf3f516 100644
--- a/core/config/pom.xml
+++ b/core/config/pom.xml
@@ -7,9 +7,9 @@
   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
@@ -55,20 +55,43 @@
                 </excludes>
             </resource>
         </resources>
+        <plugins>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-compiler-plugin</artifactId>
+                <configuration>
+                    <annotationProcessorPaths>
+                        <path>
+                            <!--
+                            as per 
https://github.com/spring-projects/spring-boot/issues/30986, must be before the 
spring-boot-configuration-processor
+                            
https://docs.spring.io/spring-boot/docs/2.7.5/reference/html/configuration-metadata.html#appendix.configuration-metadata.annotation-processor
+                            -->
+                            <groupId>org.projectlombok</groupId>
+                            <artifactId>lombok</artifactId>
+                        </path>
+                        <path>
+                            <groupId>org.springframework.boot</groupId>
+                            
<artifactId>spring-boot-configuration-processor</artifactId>
+                            <version>${spring-boot.version}</version>
+                        </path>
+                    </annotationProcessorPaths>
+                </configuration>
+            </plugin>
+        </plugins>
     </build>
 
     <dependencies>
-    
+
        <dependency>
             <groupId>org.apache.causeway.core</groupId>
             <artifactId>causeway-applib</artifactId>
         </dependency>
-        
+
        <dependency>
             <groupId>org.apache.causeway.commons</groupId>
                        <artifactId>causeway-commons</artifactId>
         </dependency>
-        
+
         <dependency>
                        <groupId>org.hibernate</groupId>
                        <artifactId>hibernate-validator</artifactId>
@@ -87,17 +110,26 @@
                            </exclusion>
                        </exclusions>
                </dependency>
-        
-        
-               <!-- IDE support (optional) -->
+
+        <!--
+        as per https://github.com/spring-projects/spring-boot/issues/30986, 
must be before the spring-boot-configuration-processor
+        
https://docs.spring.io/spring-boot/docs/2.7.5/reference/html/configuration-metadata.html#appendix.configuration-metadata.annotation-processor
+        -->
+        <dependency>
+            <groupId>org.projectlombok</groupId>
+            <artifactId>lombok</artifactId>
+            <scope>provided</scope>
+        </dependency>
+
+        <!-- IDE support (optional) -->
                <dependency>
                        <groupId>org.springframework.boot</groupId>
                        
<artifactId>spring-boot-configuration-processor</artifactId>
                        <optional>true</optional>
                </dependency>
-        
+
         <!-- TESTING -->
-        
+
         <dependency>
             <groupId>org.apache.causeway.core</groupId>
             <artifactId>causeway-core-internaltestsupport</artifactId>
@@ -106,4 +138,5 @@
 
     </dependencies>
 
+
 </project>
diff --git a/core/config/src/main/adoc/modules/config/pages/sections/Other.adoc 
b/core/config/src/main/adoc/modules/config/pages/sections/Other.adoc
index 1d78fa1d94..2219349102 100644
--- a/core/config/src/main/adoc/modules/config/pages/sections/Other.adoc
+++ b/core/config/src/main/adoc/modules/config/pages/sections/Other.adoc
@@ -15,10 +15,34 @@ include::../section-hooks/Other~pre.adoc[]
 [[causeway]]
 causeway
 
-|
+| 
 | null
 
 
+|
+[[causeway.prototyping.h2-console.generate-random-web-admin-password]]
+causeway.prototyping.h2-console. +
+generate-random-web-admin-password
+
+|  true
+| Whether to generate a random password for access to the H2 Web-Console 
advanced features.
+
+If a password is generated, it is logged to the logging subsystem (Log4j2).
+
+Recommended (``true``) when ``#isWebAllowRemoteAccess()`` is also ``true``.
+
+
+|
+[[causeway.prototyping.h2-console.web-allow-remote-access]]
+causeway.prototyping.h2-console. +
+web-allow-remote-access
+
+| 
+| Whether to allow remote access to the H2 Web-Console, which is a potential 
security risk when no web-admin password is set.
+
+Corresponds to Spring Boot 'spring.h2.console.settings.web-allow-others'.
+
+
 
 |===
 
diff --git 
a/core/config/src/main/adoc/modules/config/pages/sections/causeway.applib.adoc 
b/core/config/src/main/adoc/modules/config/pages/sections/causeway.applib.adoc
index ec605e68f9..15732f32c0 100644
--- 
a/core/config/src/main/adoc/modules/config/pages/sections/causeway.applib.adoc
+++ 
b/core/config/src/main/adoc/modules/config/pages/sections/causeway.applib.adoc
@@ -17,7 +17,48 @@ causeway.applib.annotation. +
 action-layout.css-class-fa. +
 patterns
 
-|
+|  [add.*:fa-plus-square, all. +
+*:fa-list, approve. +
+*:fa-thumbs-o-up, assign. +
+*:fa-hand-o-right, calculate. +
+*:fa-calculator, cancel. +
+*:fa-stop, categorise. +
+*:fa-folder-open-o, change. +
+*:fa-edit, clear.*:fa-remove, copy. +
+*:fa-copy, create. +
+*:fa-plus, decline. +
+*:fa-thumbs-o-down, delete. +
+*:fa-trash, discard. +
+*:fa-trash-o, download. +
+*:fa-download, edit. +
+*:fa-edit, execute. +
+*:fa-bolt, export. +
+*:fa-download, first. +
+*:fa-star, find. +
+*:fa-search, install. +
+*:fa-wrench, list. +
+*:fa-list, import. +
+*:fa-upload, lookup. +
+*:fa-search, maintain. +
+*:fa-edit, move.*:fa-exchange, new. +
+*:fa-plus, next. +
+*:fa-step-forward, pause. +
+*:fa-pause, previous. +
+*:fa-step-backward, refresh. +
+*:fa-sync, remove. +
+*:fa-minus-square, renew. +
+*:fa-redo, reset.*:fa-redo, resume. +
+*:fa-play, run.*:fa-bolt, save. +
+*:fa-floppy-o, search. +
+*:fa-search, stop. +
+*:fa-stop, suspend. +
+*:fa-pause, switch. +
+*:fa-exchange, terminate. +
+*:fa-stop, update. +
+*:fa-edit, upload. +
+*:fa-upload, verify. +
+*:fa-check-circle, view. +
+*:fa-search]
 | Provides a mapping of patterns to font-awesome CSS classes, where the 
pattern is used to match against the name of the action method in order to 
determine a CSS class to use, for example on the action's menu icon if rendered 
by the Wicket viewer.
 
 Providing a default set of patterns encourages a common set of verbs to be 
used.
@@ -31,7 +72,7 @@ causeway.applib.annotation. +
 action-layout.css-class-fa. +
 patterns-as-map
 
-|
+| 
 | null
 
 
@@ -40,7 +81,9 @@ patterns-as-map
 causeway.applib.annotation. +
 action-layout.css-class.patterns
 
-|
+|  [delete.*:btn-danger, discard. +
+*:btn-warning, remove. +
+*:btn-warning]
 | Provides a mapping of patterns to CSS classes, where the pattern is used to 
match against the name of the action method in order to determine a CSS class 
to use, for example on the action's button if rendered by the Wicket viewer.
 
 Providing a default set of patterns encourages a common set of verbs to be 
used.
@@ -54,7 +97,7 @@ causeway.applib.annotation. +
 action-layout.css-class. +
 patterns-as-map
 
-|
+| 
 | null
 
 
@@ -63,8 +106,8 @@ patterns-as-map
 causeway.applib.annotation.action. +
 command-publishing
 
-|
-| TODO[2464] semantic renaming audit/dispatch -> publishing The default for 
whether action invocations should be reified as a ``Command``, to be sent to 
any registered ``CommandSubscriber``s, either for auditing or for replayed 
against a secondary system, eg for regression testing.
+| 
+| The default for whether action invocations should be reified as a 
``Command``, to be sent to any registered ``CommandSubscriber``s, typically for 
auditing purposes.
 
 This setting can be overridden on a case-by-case basis using 
``Action#commandPublishing()``.
 
@@ -74,7 +117,7 @@ This setting can be overridden on a case-by-case basis using 
``Action#commandPub
 causeway.applib.annotation.action. +
 domain-event.post-for-default
 
-|
+|  true
 | Influences whether an ``ActionDomainEvent`` should be published (on the 
internal ``EventBusService``) whenever an action is being interacted with.
 
 Up to five different events can be fired during an interaction, with the 
event's phase determining which (hide, disable, validate, executing and 
executed). Subscribers can influence the behaviour at each of these phases.
@@ -91,12 +134,12 @@ The algorithm for determining whether (and what type of) 
an event is actually se
 causeway.applib.annotation.action. +
 execution-publishing
 
-|
-| TODO[2464] semantic renaming audit/dispatch -> publishing The default for 
whether action invocations should be sent through to the 
``ExecutionSubscriber`` for publishing.
+| 
+| The default for whether action invocations should be sent through to the 
``ExecutionSubscriber`` for publishing.
 
-The service's publish method is called only once per transaction, with 
``Execution`` collecting details of the identity of the target object, the 
action invoked, the action arguments and the returned object (if any).
+The service's onExecution method is called only once per transaction, with 
``Execution`` collecting details of the identity of the target object, the 
action invoked, the action arguments and the returned object (if any).
 
-This setting can be overridden on a case-by-case basis using 
``Action#executionDispatch()``.
+This setting can be overridden on a case-by-case basis using 
``Action#executionPublishing() Action#executionPublishing()``.
 
 
 |
@@ -104,7 +147,7 @@ This setting can be overridden on a case-by-case basis 
using ``Action#executionD
 causeway.applib.annotation. +
 collection-layout.default-view
 
-|
+| 
 | Defines the initial view to display collections when rendered.
 
 The value of this can be overridden on a case-by-case basis using 
``CollectionLayout#defaultView()``. Note that this default configuration 
property is an enum and so defines only a fixed number of values, whereas the 
annotation returns a string; this is to allow for flexibility that individual 
viewers might support their own additional types. For example, the Wicket 
viewer supports
@@ -115,18 +158,28 @@ The value of this can be overridden on a case-by-case 
basis using ``CollectionLa
 causeway.applib.annotation. +
 collection-layout.paged
 
-|
+|  12
 | Defines the default number of objects that are shown in a "parented" 
collection of a domain object, result of invoking an action.
 
 This can be overridden on a case-by-case basis using 
``CollectionLayout#paged()``.
 
 
 |
-[[causeway.applib.annotation.collection.domain-event.post-for-default]]
-causeway.applib.annotation.collection. +
-domain-event.post-for-default
+[[causeway.applib.annotation.collection-layout.table-decoration]]
+causeway.applib.annotation. +
+collection-layout.table-decoration
+
+| 
+| Defines whether the table representation of a collection should be decorated 
using a client-side Javascript library, eg for client-side paging and filtering.
+
 
 |
+[[causeway.applib.annotation.collection.domain-event.post-for-default]]
+causeway.applib.annotation. +
+collection.domain-event. +
+post-for-default
+
+|  true
 | Influences whether an ``CollectionDomainEvent`` should be published (on the 
internal ``EventBusService``) whenever a collection is being interacted with.
 
 Up to two different events can be fired during an interaction, with the 
event's phase determining which (hide, disable)Subscribers can influence the 
behaviour at each of these phases.
@@ -145,7 +198,7 @@ domain-object-layout. +
 css-class-ui-event. +
 post-for-default
 
-|
+| 
 | Influences whether an ``CssClassUiEvent`` should be published (on the 
internal ``EventBusService``) whenever a domain object is about to be rendered 
in the UI - thereby allowing subscribers to optionally 
``CssClassUiEvent#setCssClass(String)`` change) the CSS classes that are used.
 
 The algorithm for determining whether (and what type of) an event is sent 
depends on the value of the ``DomainObjectLayout#cssClassUiEvent()`` 
@DomainObjectLayout(cssClassEvent=...)} for the domain object in question.
@@ -163,7 +216,7 @@ causeway.applib.annotation. +
 domain-object-layout.icon-ui-event. +
 post-for-default
 
-|
+| 
 | Influences whether an ``IconUiEvent`` should be published (on the internal 
``EventBusService``) whenever a domain object is about to be rendered in the UI 
- thereby allowing subscribers to optionally 
``IconUiEvent#setIconName(String)`` change) the icon that is used.
 
 The algorithm for determining whether (and what type of) an event is sent 
depends on the value of the ``DomainObjectLayout#iconUiEvent()`` 
@DomainObjectLayout(iconEvent=...)} for the domain object in question.
@@ -181,7 +234,7 @@ causeway.applib.annotation. +
 domain-object-layout. +
 layout-ui-event.post-for-default
 
-|
+| 
 | Influences whether an ``LayoutUiEvent`` should be published (on the internal 
``EventBusService``) whenever a domain object is about to be rendered in the UI 
- thereby allowing subscribers to optionally 
``LayoutUiEvent#setLayout(String)`` change) the layout that is used.
 
 If a different layout value has been set, then a layout in the form ``xml`` 
use used (where ``zzz`` is the name of the layout).
@@ -200,19 +253,29 @@ The default is ``false``, because otherwise the mere 
presence of ``@DomainObject
 causeway.applib.annotation. +
 domain-object-layout.paged
 
-|
+|  25
 | Defines the default number of objects that are shown in a "standalone" 
collection obtained as the result of invoking an action.
 
 This can be overridden on a case-by-case basis using 
``DomainObjectLayout#paged()``.
 
 
+|
+[[causeway.applib.annotation.domain-object-layout.table-decoration]]
+causeway.applib.annotation. +
+domain-object-layout. +
+table-decoration
+
+| 
+| Defines whether the table representation of a standalone collection of this 
domain class should be decorated using a client-side Javascript library, eg for 
client-side paging and filtering.
+
+
 |
 
[[causeway.applib.annotation.domain-object-layout.title-ui-event.post-for-default]]
 causeway.applib.annotation. +
 domain-object-layout. +
 title-ui-event.post-for-default
 
-|
+| 
 | Influences whether an ``TitleUiEvent`` should be published (on the internal 
``EventBusService``) whenever a domain object is about to be rendered in the UI 
- thereby allowing subscribers to optionally ``TitleUiEvent#setTitle(String)`` 
change) the title that is used.
 
 The algorithm for determining whether (and what type of) an event is sent 
depends on the value of the ``DomainObjectLayout#titleUiEvent()`` 
@DomainObjectLayout(titleEvent=...)} for the domain object in question.
@@ -231,10 +294,10 @@ domain-object. +
 created-lifecycle-event. +
 post-for-default
 
-|
+|  true
 | Influences whether an ``ObjectCreatedEvent`` should be published (on the 
internal ``EventBusService``) whenever a domain object has been created using 
``FactoryService``.
 
-The algorithm for determining whether (and what type of) an event is sent 
depends on the value of the @DomainObject(createdLifecycleEvent=...) for the 
domain object in question.
+The algorithm for determining whether (and what type of) an event is sent 
depends on the value of the ``DomainObject#createdLifecycleEvent() 
@DomainObject(createdLifecycleEvent=...)`` for the domain object in question.
 
 * If set to some subtype of ObjectCreatedEvent.Noop, then _no_ event is sent.
 * If set to some subtype of ObjectCreatedEvent.Default, then an event is sent 
_if and only if_ this configuration setting is set.
@@ -246,10 +309,10 @@ The algorithm for determining whether (and what type of) 
an event is sent depend
 causeway.applib.annotation. +
 domain-object.editing
 
-|
+| 
 | The default for whether the properties of domain objects can be edited, or 
whether instead they can be modified only using actions (or programmatically as 
a side-effect of actions on other objects).
 
-This setting can be overridden on a case-by-case basis using 
DomainObject#getEditing()
+This setting can be overridden on a case-by-case basis using 
``DomainObject#getEditing() DomainObject#getEditing()``
 
 
 |
@@ -258,8 +321,8 @@ causeway.applib.annotation. +
 domain-object. +
 entity-change-publishing
 
-|
-| TODO[2464] semantic renaming audit/dispatch -> publishing The default for 
whether _domain entities_ should be audited or not (meaning that any changes 
are sent through to ``EntityChangesSubscriber``s and sent through to 
``EntityPropertyChangeSubscriber``.
+| 
+| The default for whether _domain entities_ should be audited or not (meaning 
that any changes are sent through to ``EntityChangesSubscriber``s and sent 
through to ``EntityPropertyChangeSubscriber``.
 
 This setting can be overridden on a case-by-case basis using 
``DomainObject#entityChangePublishing()``
 
@@ -273,10 +336,10 @@ domain-object. +
 loaded-lifecycle-event. +
 post-for-default
 
-|
+|  true
 | Influences whether an ``ObjectLoadedEvent`` should be published (on the 
internal ``EventBusService``) whenever a domain _entity_ has been loaded from 
the persistence store.
 
-The algorithm for determining whether (and what type of) an event is sent 
depends on the value of the @DomainObject(loadedLifecycleEvent=...) for the 
domain object in question.
+The algorithm for determining whether (and what type of) an event is sent 
depends on the value of the ``DomainObject#loadedLifecycleEvent() 
@DomainObject(loadedLifecycleEvent=...)`` for the domain object in question.
 
 * If set to some subtype of ObjectLoadedEvent.Noop, then _no_ event is sent.
 * If set to some subtype of ObjectCreatedEvent.Default, then an event is sent 
_if and only if_ this configuration setting is set.
@@ -292,10 +355,10 @@ domain-object. +
 persisted-lifecycle-event. +
 post-for-default
 
-|
+|  true
 | Influences whether an ``ObjectPersistedEvent`` should be published (on the 
internal ``EventBusService``) whenever a domain _entity_ has been persisted 
(for the first time) to the persistence store.
 
-The algorithm for determining whether (and what type of) an event is sent 
depends on the value of the @DomainObject(persistedLifecycleEvent=...) for the 
domain object in question.
+The algorithm for determining whether (and what type of) an event is sent 
depends on the value of the ``DomainObject#persistedLifecycleEvent() 
@DomainObject(persistedLifecycleEvent=...)`` for the domain object in question.
 
 * If set to some subtype of ObjectPersistedEvent.Noop, then _no_ event is sent.
 * If set to some subtype of ObjectCreatedEvent.Default, then an event is sent 
_if and only if_ this configuration setting is set.
@@ -311,10 +374,10 @@ domain-object. +
 persisting-lifecycle-event. +
 post-for-default
 
-|
+|  true
 | Influences whether an ``ObjectPersistingEvent`` should be published (on the 
internal ``EventBusService``) whenever a domain _entity_ is about to be 
persisting (for the first time) to the persistence store.
 
-The algorithm for determining whether (and what type of) an event is sent 
depends on the value of the @DomainObject(persistingLifecycleEvent=...) for the 
domain object in question.
+The algorithm for determining whether (and what type of) an event is sent 
depends on the value of the ``DomainObject#persistingLifecycleEvent() 
@DomainObject(persistingLifecycleEvent=...)`` for the domain object in question.
 
 * If set to some subtype of ObjectPersistingEvent.Noop, then _no_ event is 
sent.
 * If set to some subtype of ObjectCreatedEvent.Default, then an event is sent 
_if and only if_ this configuration setting is set.
@@ -330,10 +393,10 @@ domain-object. +
 removing-lifecycle-event. +
 post-for-default
 
-|
+|  true
 | Influences whether an ``ObjectRemovingEvent`` should be published (on the 
internal ``EventBusService``) whenever a persistent domain _entity_ is about to 
be removed (that is, deleted) from the persistence store.
 
-The algorithm for determining whether (and what type of) an event is sent 
depends on the value of the @DomainObject(removingLifecycleEvent=...) for the 
domain object in question.
+The algorithm for determining whether (and what type of) an event is sent 
depends on the value of the ``DomainObject#removingLifecycleEvent() 
@DomainObject(removingLifecycleEvent=...)`` for the domain object in question.
 
 * If set to some subtype of ObjectRemovingEvent.Noop, then _no_ event is sent.
 * If set to some subtype of ObjectCreatedEvent.Default, then an event is sent 
_if and only if_ this configuration setting is set.
@@ -351,10 +414,10 @@ domain-object. +
 updated-lifecycle-event. +
 post-for-default
 
-|
+|  true
 | Influences whether an ``ObjectUpdatedEvent`` should be published (on the 
internal ``EventBusService``) whenever a persistent domain _entity_ has been 
updated in the persistence store.
 
-The algorithm for determining whether (and what type of) an event is sent 
depends on the value of the @DomainObject(updatedLifecycleEvent=...) for the 
domain object in question.
+The algorithm for determining whether (and what type of) an event is sent 
depends on the value of the ``DomainObject#updatedLifecycleEvent() 
@DomainObject(updatedLifecycleEvent=...)`` for the domain object in question.
 
 * If set to some subtype of ObjectUpdatedEvent.Noop, then _no_ event is sent.
 * If set to some subtype of ObjectCreatedEvent.Default, then an event is sent 
_if and only if_ this configuration setting is set.
@@ -370,10 +433,10 @@ domain-object. +
 updating-lifecycle-event. +
 post-for-default
 
-|
+|  true
 | Influences whether an ``ObjectUpdatingEvent`` should be published (on the 
internal ``EventBusService``) whenever a persistent domain _entity_ is about to 
be updated in the persistence store.
 
-The algorithm for determining whether (and what type of) an event is sent 
depends on the value of the @DomainObject(updatingLifecycleEvent=...) for the 
domain object in question.
+The algorithm for determining whether (and what type of) an event is sent 
depends on the value of the ``DomainObject#updatingLifecycleEvent() 
@DomainObject(updatingLifecycleEvent=...)`` for the domain object in question.
 
 * If set to some subtype of ObjectUpdatingEvent.Noop, then _no_ event is sent.
 * If set to some subtype of ObjectCreatedEvent.Default, then an event is sent 
_if and only if_ this configuration setting is set.
@@ -387,7 +450,7 @@ Note: this applies only to domain entities, not to view 
models.
 causeway.applib.annotation. +
 parameter-layout.label-position
 
-|
+| 
 | Defines the default position for the label for an action parameter.
 
 Can be overridden on a case-by-case basis using 
``ParameterLayout#labelPosition()``.
@@ -395,12 +458,24 @@ Can be overridden on a case-by-case basis using 
``ParameterLayout#labelPosition(
 If left as ``LabelPosition#NOT_SPECIFIED`` and not overridden, then the 
position depends upon the viewer implementation.
 
 
+|
+[[causeway.applib.annotation.parameter.dependent-defaults-policy]]
+causeway.applib.annotation. +
+parameter. +
+dependent-defaults-policy
+
+| 
+| Whether dependent parameters should be reset to their default if an earlier 
parameter changes its value, or whether instead a parameter value, once changed 
by the end-user, should never be overwritten even if the end-user changes an 
earlier parameter value.
+
+This setting can be overridden on a case-by-case basis using 
``Parameter#dependentDefaultsPolicy() Parameter#dependentDefaultsPolicy()``.
+
+
 |
 [[causeway.applib.annotation.property-layout.label-position]]
 causeway.applib.annotation. +
 property-layout.label-position
 
-|
+| 
 | Defines the default position for the label for a domain object property.
 
 Can be overridden on a case-by-case basis using 
``ParameterLayout#labelPosition()``.
@@ -410,21 +485,22 @@ If left as ``LabelPosition#NOT_SPECIFIED`` and not 
overridden, then the position
 
 |
 [[causeway.applib.annotation.property.command-publishing]]
-causeway.applib.annotation.property. +
-command-publishing
+causeway.applib.annotation. +
+property.command-publishing
 
-|
-| TODO[2464] semantic renaming audit/dispatch -> publishing The default for 
whether property edits should be reified as a ``Command``, to be sent to any 
registered ``CommandSubscriber``s, either for auditing or for replayed against 
a secondary system, eg for regression testing.
+| 
+| The default for whether property edits should be reified as a ``Command``, 
to be sent to any registered ``CommandSubscriber``s, either for auditing or for 
replayed against a secondary system, eg for regression testing.
 
-This setting can be overridden on a case-by-case basis using 
``Property#commandDispatch()``.
+This setting can be overridden on a case-by-case basis using 
``Property#commandPublishing()``.
 
 
 |
 [[causeway.applib.annotation.property.domain-event.post-for-default]]
-causeway.applib.annotation.property. +
-domain-event.post-for-default
+causeway.applib.annotation. +
+property.domain-event. +
+post-for-default
 
-|
+|  true
 | Influences whether an ``PropertyDomainEvent`` should be published (on the 
internal ``EventBusService``) whenever an property is being interacted with.
 
 Up to five different events can be fired during an interaction, with the 
event's phase determining which (hide, disable, validate, executing and 
executed). Subscribers can influence the behaviour at each of these phases.
@@ -438,15 +514,15 @@ The algorithm for determining whether (and what type of) 
an event is actually se
 
 |
 [[causeway.applib.annotation.property.execution-publishing]]
-causeway.applib.annotation.property. +
-execution-publishing
+causeway.applib.annotation. +
+property.execution-publishing
 
-|
-| TODO[2464] semantic renaming audit/dispatch -> publishing The default for 
whether property edits should be sent through to the ``ExecutionSubscriber`` 
for publishing.
+| 
+| The default for whether property edits should be sent through to the 
``ExecutionSubscriber`` for publishing.
 
-The service's publish method is called only once per transaction, with 
``Execution`` collecting details of the identity of the target object, the 
property edited, and the new value of the property.
+The service's ``ExecutionSubscriber#onExecution(Execution)`` publish} method 
is called only once per transaction, with ``Execution`` collecting details of 
the identity of the target object, the property edited, and the new value of 
the property.
 
-This setting can be overridden on a case-by-case basis using 
``Property#publishing()``.
+This setting can be overridden on a case-by-case basis using 
``Property#executionPublishing()``.
 
 
 |
@@ -456,10 +532,10 @@ view-model-layout. +
 css-class-ui-event. +
 post-for-default
 
-|
-| Influences whether an ``CssClassUiEvent`` should be published (on the 
internal ``EventBusService``) whenever a view model (annotated with @ViewModel) 
is about to be rendered in the UI - thereby allowing subscribers to optionally 
``CssClassUiEvent#setCssClass(String)`` change) the CSS classes that are used.
+|  true
+| Influences whether an ``CssClassUiEvent`` should be published (on the 
internal ``EventBusService``) whenever a view model (annotated with 
@DomainObject#nature of ``Nature#VIEW_MODEL``) is about to be rendered in the 
UI - thereby allowing subscribers to optionally 
``CssClassUiEvent#setCssClass(String)`` change) the CSS classes that are used.
 
-The algorithm for determining whether (and what type of) an event is sent 
depends on the value of the ``ViewModelLayout#cssClassUiEvent()`` 
@ViewModelLayout(cssClassEvent=...)} for the domain object in question:
+The algorithm for determining whether (and what type of) an event is sent 
depends on the value of the ``DomainObjectLayout#cssClassUiEvent() 
@DomainObjectLayout(cssClassEvent=...)`` for the domain object in question:
 
 * If set to some subtype of CssClassUiEvent.Noop, then _no_ event is sent.
 * If set to some subtype of CssClassUiEvent.Default, then an event is sent _if 
and only if_ this configuration setting is set.
@@ -472,10 +548,10 @@ causeway.applib.annotation. +
 view-model-layout.icon-ui-event. +
 post-for-default
 
-|
-| Influences whether an ``IconUiEvent`` should be published (on the internal 
``EventBusService``) whenever a view model (annotated with @ViewModel) is about 
to be rendered in the UI - thereby allowing subscribers to optionally 
``IconUiEvent#setIconName(String)`` change) the icon that is used.
+|  true
+| Influences whether an ``IconUiEvent`` should be published (on the internal 
``EventBusService``) whenever a view model (annotated with @DomainObject#nature 
of ``Nature#VIEW_MODEL``) is about to be rendered in the UI - thereby allowing 
subscribers to optionally ``IconUiEvent#setIconName(String)`` change) the icon 
that is used.
 
-The algorithm for determining whether (and what type of) an event is sent 
depends on the value of the ``ViewModelLayout#iconUiEvent()`` 
@ViewModelLayout(iconEvent=...)} for the domain object in question:
+The algorithm for determining whether (and what type of) an event is sent 
depends on the value of the ``DomainObjectLayout#iconUiEvent() 
@ViewModelLayout(iconEvent=...)`` for the domain object in question:
 
 * If set to some subtype of IconUiEvent.Noop, then _no_ event is sent.
 * If set to some subtype of IconUiEvent.Default, then an event is sent _if and 
only if_ this configuration setting is set.
@@ -488,12 +564,12 @@ causeway.applib.annotation. +
 view-model-layout.layout-ui-event. +
 post-for-default
 
-|
-| Influences whether an ``LayoutUiEvent`` should be published (on the internal 
``EventBusService``) whenever a view model (annotated with @ViewModel) is about 
to be rendered in the UI - thereby allowing subscribers to optionally 
``LayoutUiEvent#setLayout(String)`` change) the layout that is used.
+|  true
+| Influences whether an ``LayoutUiEvent`` should be published (on the internal 
``EventBusService``) whenever a view model (annotated with @DomainObject#nature 
of ``Nature#VIEW_MODEL``) is about to be rendered in the UI - thereby allowing 
subscribers to optionally ``LayoutUiEvent#setLayout(String)`` change) the 
layout that is used.
 
 If a different layout value has been set, then a layout in the form ``xml`` 
use used (where ``zzz`` is the name of the layout).
 
-The algorithm for determining whether (and what type of) an event is sent 
depends on the value of the ``ViewModelLayout#layoutUiEvent()`` 
@ViewModelLayout(layoutEvent=...)} for the domain object in question:
+The algorithm for determining whether (and what type of) an event is sent 
depends on the value of the ``DomainObjectLayout#layoutUiEvent() 
@DomainObjectLayout(layoutEvent=...)`` for the domain object in question:
 
 * If set to some subtype of LayoutUiEvent.Noop, then _no_ event is sent.
 * If set to some subtype of LayoutUiEvent.Default, then an event is sent _if 
and only if_ this configuration setting is set.
@@ -506,10 +582,10 @@ causeway.applib.annotation. +
 view-model-layout.title-ui-event. +
 post-for-default
 
-|
-| Influences whether an ``TitleUiEvent`` should be published (on the internal 
``EventBusService``) whenever a view model (annotated with @ViewModel) is about 
to be rendered in the UI - thereby allowing subscribers to optionally 
``TitleUiEvent#setTitle(String)`` change) the title that is used.
+|  true
+| Influences whether an ``TitleUiEvent`` should be published (on the internal 
``EventBusService``) whenever a view model (annotated with @DomainObject#nature 
of ``Nature#VIEW_MODEL``) is about to be rendered in the UI - thereby allowing 
subscribers to optionally ``TitleUiEvent#setTitle(String)`` change) the title 
that is used.
 
-The algorithm for determining whether (and what type of) an event is sent 
depends on the value of the ``ViewModelLayout#titleUiEvent()`` 
@ViewModelLayout(titleEvent=...)} for the domain object in question:
+The algorithm for determining whether (and what type of) an event is sent 
depends on the value of the ``DomainObjectLayout#titleUiEvent() 
@DomainObjectLayout(titleEvent=...)`` for the domain object in question:
 
 * If set to some subtype of TitleUiEvent.Noop, then _no_ event is sent.
 * If set to some subtype of TitleUiEvent.Default, then an event is sent _if 
and only if_ this configuration setting is set.
@@ -518,12 +594,12 @@ The algorithm for determining whether (and what type of) 
an event is sent depend
 
 |
 [[causeway.applib.annotation.view-model.validation.semantic-checking.enable]]
-causeway.applib.annotation.view-model. +
-validation.semantic-checking. +
-enable
+causeway.applib.annotation. +
+view-model.validation. +
+semantic-checking.enable
 
-|
-| Whether to check for inconsistencies between the usage of ``DomainObject``, 
``ViewModel``, ``DomainObjectLayout`` and ``ViewModelLayout``.
+| 
+| Whether to check for inconsistencies between the usage of ``DomainObject`` 
and ``DomainObjectLayout``.
 
 
 
diff --git 
a/core/config/src/main/adoc/modules/config/pages/sections/causeway.core.config.adoc
 
b/core/config/src/main/adoc/modules/config/pages/sections/causeway.core.config.adoc
index adf9b3cb34..b680e73c18 100644
--- 
a/core/config/src/main/adoc/modules/config/pages/sections/causeway.core.config.adoc
+++ 
b/core/config/src/main/adoc/modules/config/pages/sections/causeway.core.config.adoc
@@ -17,7 +17,7 @@ causeway.core.config. +
 configuration-property-visibility- +
 policy
 
-|
+| 
 | Configuration values might contain sensitive data, hence per default, 
configuration properties are only visible with the configuration-page when 
_prototyping_.
 
 Alternatively this policy can be set to either *always* show or *never* show.
diff --git 
a/core/config/src/main/adoc/modules/config/pages/sections/causeway.core.meta-model.adoc
 
b/core/config/src/main/adoc/modules/config/pages/sections/causeway.core.meta-model.adoc
index 942592b5a1..a27314a92c 100644
--- 
a/core/config/src/main/adoc/modules/config/pages/sections/causeway.core.meta-model.adoc
+++ 
b/core/config/src/main/adoc/modules/config/pages/sections/causeway.core.meta-model.adoc
@@ -16,7 +16,7 @@ include::../section-hooks/causeway.core.meta-model~pre.adoc[]
 causeway.core.meta-model. +
 filter-visibility
 
-|
+|  true
 | Whether domain objects to which the current user does not have visibility 
access should be rendered within collections or drop-down choices/autocompletes.
 
 One reason this filtering may be necessary is for multi-tenanted applications, 
whereby an end-user should only be able to "see" what data that they own. For 
efficiency, the application should only query for objects that the end-user 
owns. This configuration property acts as a safety net to prevent the end-user 
from viewing domain objects _even if_ those domain objects were rehydrated from 
the persistence store.
@@ -28,7 +28,7 @@ causeway.core.meta-model. +
 programming-model. +
 ignore-deprecated
 
-|
+| 
 | If set, then any aspects of the programming model (as implemented by 
``FacetFactory``s that have been indicated as deprecated will simply be 
ignored/excluded from the metamodel.
 
 
diff --git 
a/core/config/src/main/adoc/modules/config/pages/sections/causeway.core.meta-model.introspector.adoc
 
b/core/config/src/main/adoc/modules/config/pages/sections/causeway.core.meta-model.introspector.adoc
index f31ac6d99b..003482e0a4 100644
--- 
a/core/config/src/main/adoc/modules/config/pages/sections/causeway.core.meta-model.introspector.adoc
+++ 
b/core/config/src/main/adoc/modules/config/pages/sections/causeway.core.meta-model.introspector.adoc
@@ -13,10 +13,11 @@ 
include::../section-hooks/causeway.core.meta-model.introspector~pre.adoc[]
 |Description
 |
 [[causeway.core.meta-model.introspector.lock-after-full-introspection]]
-causeway.core.meta-model.introspector. +
+causeway.core.meta-model. +
+introspector. +
 lock-after-full-introspection
 
-|
+|  true
 | If true, then no new specifications will be allowed to be loaded once 
introspection has been complete.
 
 Only applies if the introspector is configured to perform full introspection 
up-front (either because of ``IntrospectionMode#FULL`` or 
``IntrospectionMode#LAZY_UNLESS_PRODUCTION`` when in production); otherwise is 
ignored.
@@ -24,10 +25,10 @@ Only applies if the introspector is configured to perform 
full introspection up-
 
 |
 [[causeway.core.meta-model.introspector.mode]]
-causeway.core.meta-model.introspector. +
-mode
+causeway.core.meta-model. +
+introspector.mode
 
-|
+| 
 | Whether all known types should be fully introspected as part of the 
bootstrapping, or should only be partially introspected initially.
 
 Leaving this as lazy means that there's a chance that metamodel validation 
errors will not be discovered during bootstrap. That said, metamodel validation 
is still run incrementally for any classes introspected lazily after initial 
bootstrapping (unless ``#isValidateIncrementally()`` is disabled.
@@ -35,21 +36,21 @@ Leaving this as lazy means that there's a chance that 
metamodel validation error
 
 |
 [[causeway.core.meta-model.introspector.parallelize]]
-causeway.core.meta-model.introspector. +
-parallelize
+causeway.core.meta-model. +
+introspector.parallelize
 
-|
-| Whether to perform introspection in parallel. Meant to speed up 
bootstrapping.
+| 
+| Whether to perform metamodel introspection in parallel, intended to speed up 
bootstrapping.
 
-For now this is _experimental_. Leave this disabled (the default).
+For now this is _experimental_. We recommend this is left as disabled (the 
default).
 
 
 |
 [[causeway.core.meta-model.introspector.policy]]
-causeway.core.meta-model.introspector. +
-policy
+causeway.core.meta-model. +
+introspector.policy
 
-|
+| 
 | Policy as to how introspection should process class members and supporting 
methods.
 
 Default is to only introspect public class members, while annotating these is 
optional.
@@ -57,15 +58,16 @@ Default is to only introspect public class members, while 
annotating these is op
 
 |
 [[causeway.core.meta-model.introspector.validate-incrementally]]
-causeway.core.meta-model.introspector. +
+causeway.core.meta-model. +
+introspector. +
 validate-incrementally
 
-|
+|  true
 | If true, then metamodel validation is performed after any new specification 
has been loaded (after the initial bootstrapping).
 
 This does _not_ apply if the introspector is configured to perform full 
introspection up-front AND when the metamodel is locked after initial 
bootstrapping (because in that case the lock check will simply prevent any new 
specs from being loaded). But it will apply otherwise.
 
-In particular, this setting _can_ still apply even if the introspection mode 
is set to full, because that in itself does not preclude some code from 
attempting to load some previously unknown type. For example, a fixture script 
could attempt to invoke an action on some new type using the ``WrapperFactory`` 
- this will cause introspection of that new type to be performed.
+In particular, this setting _can_ still apply even if the mode is set to full, 
because that in itself does not preclude some code from attempting to load some 
previously unknown type. For example, a fixture script could attempt to invoke 
an action on some new type using the ``WrapperFactory`` - this will cause 
introspection of that new type to be performed.
 
 
 
diff --git 
a/core/config/src/main/adoc/modules/config/pages/sections/causeway.core.meta-model.validator.adoc
 
b/core/config/src/main/adoc/modules/config/pages/sections/causeway.core.meta-model.validator.adoc
index e64b6a92a7..88d4841235 100644
--- 
a/core/config/src/main/adoc/modules/config/pages/sections/causeway.core.meta-model.validator.adoc
+++ 
b/core/config/src/main/adoc/modules/config/pages/sections/causeway.core.meta-model.validator.adoc
@@ -17,7 +17,7 @@ causeway.core.meta-model.validator. +
 action-collection-parameter- +
 choices
 
-|
+|  true
 | Whether to validate that any actions that accept action parameters have 
either a corresponding choices or auto-complete for that action parameter, or 
are associated with a collection of the appropriate type.
 
 
@@ -26,12 +26,12 @@ choices
 causeway.core.meta-model.validator. +
 allow-deprecated
 
-|
+|  true
 | This setting is used to determine whether the use of such deprecated 
features is allowed.
 
 If not allowed, then metamodel validation errors will be flagged.
 
-Note that this settings has no effect if the programming model has been 
configured to ignore deprecated features (because in this case the programming 
model facets simply won't be included in the introspection process.
+Note that this settings has no effect if the programming model has been 
configured to deprecated features (because in this case the programming model 
facets simply won't be included in the introspection process.
 
 
 |
@@ -39,7 +39,7 @@ Note that this settings has no effect if the programming 
model has been configur
 causeway.core.meta-model.validator. +
 explicit-logical-type-names
 
-|
+| 
 | Whether to ensure that the logical-type-name of all objects must be 
specified explicitly, using either ``Named``.
 
 It is _highly advisable_ to leave this set as enabled (the default). These 
logical-type-names should also (of course) be unique - among non-abstract types.
@@ -51,7 +51,7 @@ causeway.core.meta-model.validator. +
 jaxb-view-model. +
 date-time-type-adapter
 
-|
+|  true
 | If set, then ensures that for all properties of JAXB-style view models where 
the property's type is a date or time, then that property has been correctly 
annotated with @``XmlJavaTypeAdapter`` (so that the property's value can be 
converted into a serializable form).
 
 
@@ -60,7 +60,7 @@ date-time-type-adapter
 causeway.core.meta-model.validator. +
 jaxb-view-model.no-arg-constructor
 
-|
+| 
 | If set, then ensures that all JAXB-style view models have a no-arg 
constructor.
 
 
@@ -69,7 +69,7 @@ jaxb-view-model.no-arg-constructor
 causeway.core.meta-model.validator. +
 jaxb-view-model.not-abstract
 
-|
+|  true
 | If set, then ensures that all JAXB-style view models are concrete classes, 
not abstract.
 
 
@@ -78,7 +78,7 @@ jaxb-view-model.not-abstract
 causeway.core.meta-model.validator. +
 jaxb-view-model.not-inner-class
 
-|
+|  true
 | If set, then ensures that all JAXB-style view models are either top-level 
classes or nested static classes (in other words, checks that they are not 
anonymous, local nor nested non-static classes).
 
 
@@ -88,7 +88,7 @@ causeway.core.meta-model.validator. +
 jaxb-view-model. +
 reference-type-adapter
 
-|
+|  true
 | If set, then ensures that for all properties of JAXB-style view models where 
the property's type is an entity, then that entity's type has been correctly 
annotated with @``XmlJavaTypeAdapter`` (so that the property's value can be 
converted into a serializable form).
 
 
@@ -97,7 +97,7 @@ reference-type-adapter
 causeway.core.meta-model.validator. +
 jdoql.from-clause
 
-|
+|  true
 | If set, then ensures that the 'FROM' clause within any JDOQL ``@Query``s 
annotations relates to a known entity type, and moreover that that type is 
compatible with the type on which the annotation appears: meaning its either a 
supertype of or the same type as the annotated type.
 
 
@@ -106,7 +106,7 @@ jdoql.from-clause
 causeway.core.meta-model.validator. +
 jdoql.variables-clause
 
-|
+|  true
 | If set, then ensures that the 'VARIABLES' clause within any JDOQL 
``@Query``s relates to a known entity type.
 
 
@@ -115,7 +115,7 @@ jdoql.variables-clause
 causeway.core.meta-model.validator. +
 parallelize
 
-|
+|  true
 | Whether to perform metamodel validation in parallel.
 
 
diff --git 
a/core/config/src/main/adoc/modules/config/pages/sections/causeway.core.runtime-services.adoc
 
b/core/config/src/main/adoc/modules/config/pages/sections/causeway.core.runtime-services.adoc
index 831367b061..80ce5d2138 100644
--- 
a/core/config/src/main/adoc/modules/config/pages/sections/causeway.core.runtime-services.adoc
+++ 
b/core/config/src/main/adoc/modules/config/pages/sections/causeway.core.runtime-services.adoc
@@ -16,52 +16,52 @@ 
include::../section-hooks/causeway.core.runtime-services~pre.adoc[]
 causeway.core.runtime-services. +
 application-features.init
 
-|
+| 
 | Whether the ``ApplicationFeatureRepository`` (or the default implementation 
of that service, at least) should compute the set of ``ApplicationFeature`` 
that describe the metamodel eagerly, or lazily.
 
 
 |
 [[causeway.core.runtime-services.email.override.bcc]]
-causeway.core.runtime-services.email. +
-override.bcc
+causeway.core.runtime-services. +
+email.override.bcc
 
-|
+| 
 | Intended for testing purposes only, if set then the requested ``bcc:`` of 
the email will be ignored, and instead sent to this email address instead.
 
 
 |
 [[causeway.core.runtime-services.email.override.cc]]
-causeway.core.runtime-services.email. +
-override.cc
+causeway.core.runtime-services. +
+email.override.cc
 
-|
+| 
 | Intended for testing purposes only, if set then the requested ``cc:`` of the 
email will be ignored, and instead sent to this email address instead.
 
 
 |
 [[causeway.core.runtime-services.email.override.to]]
-causeway.core.runtime-services.email. +
-override.to
+causeway.core.runtime-services. +
+email.override.to
 
-|
+| 
 | Intended for testing purposes only, if set then the requested ``to:`` of the 
email will be ignored, and instead sent to this email address instead.
 
 
 |
 [[causeway.core.runtime-services.email.port]]
-causeway.core.runtime-services.email. +
-port
+causeway.core.runtime-services. +
+email.port
 
-|
+|  587
 | The port to use for sending email.
 
 
 |
 [[causeway.core.runtime-services.email.sender.address]]
-causeway.core.runtime-services.email. +
-sender.address
+causeway.core.runtime-services. +
+email.sender.address
 
-|
+| 
 | Specifies the email address of the user sending the email.
 
 If the username is not specified, is also used as the username to connect to 
the SMTP service.
@@ -71,10 +71,10 @@ This configuration property is mandatory (for the default 
implementation of the
 
 |
 [[causeway.core.runtime-services.email.sender.hostname]]
-causeway.core.runtime-services.email. +
-sender.hostname
+causeway.core.runtime-services. +
+email.sender.hostname
 
-|
+| 
 | Specifies the host running the SMTP service.
 
 If not specified, then the value used depends upon the email implementation. 
The default implementation will use the ``host`` system property.
@@ -82,10 +82,10 @@ If not specified, then the value used depends upon the 
email implementation. The
 
 |
 [[causeway.core.runtime-services.email.sender.password]]
-causeway.core.runtime-services.email. +
-sender.password
+causeway.core.runtime-services. +
+email.sender.password
 
-|
+| 
 | Specifies the password (corresponding to the username to connect to the SMTP 
service.
 
 This configuration property is mandatory (for the default implementation of 
the ``EmailService``, at least).
@@ -93,48 +93,48 @@ This configuration property is mandatory (for the default 
implementation of the
 
 |
 [[causeway.core.runtime-services.email.sender.username]]
-causeway.core.runtime-services.email. +
-sender.username
+causeway.core.runtime-services. +
+email.sender.username
 
-|
+| 
 | Specifies the username to use to connect to the SMTP service.
 
-If not specified, then the sender's email address will be used instead.
+If not specified, then the sender's address will be used instead.
 
 
 |
 [[causeway.core.runtime-services.email.socket-connection-timeout]]
-causeway.core.runtime-services.email. +
-socket-connection-timeout
+causeway.core.runtime-services. +
+email.socket-connection-timeout
 
-|
+|  2000
 | The maximum number of millseconds to wait to obtain a socket connection 
before timing out.
 
 
 |
 [[causeway.core.runtime-services.email.socket-timeout]]
-causeway.core.runtime-services.email. +
-socket-timeout
+causeway.core.runtime-services. +
+email.socket-timeout
 
-|
+|  2000
 | The maximum number of millseconds to wait to obtain a socket before timing 
out.
 
 
 |
 [[causeway.core.runtime-services.email.throw-exception-on-fail]]
-causeway.core.runtime-services.email. +
-throw-exception-on-fail
+causeway.core.runtime-services. +
+email.throw-exception-on-fail
 
-|
-| If an email fails to send, whether to propagate the exception (meaning that 
potentially the end-user might see the exception), or whether instead to just 
indicate failure through the return value of the method (List, List, String, 
String, DataSource...) that's being called.
+|  true
+| If an email fails to send, whether to propagate the exception (meaning that 
potentially the end-user might see the exception), or whether instead to just 
indicate failure through the return value of the method 
(``EmailService#send(List, List, List, String, String, DataSource...)`` that's 
being called.
 
 
 |
 [[causeway.core.runtime-services.email.tls.enabled]]
-causeway.core.runtime-services.email. +
-tls.enabled
+causeway.core.runtime-services. +
+email.tls.enabled
 
-|
+|  true
 | Whether TLS encryption should be started (that is, ``STARTTLS``).
 
 
@@ -143,7 +143,7 @@ tls.enabled
 causeway.core.runtime-services. +
 exception-recognizer.dae.disable
 
-|
+| 
 | Whether the ``ExceptionRecognizer`` implementation for Spring's 
DataAccessException - which attempts to sanitize any exceptions arising from 
object stores - should be disabled (meaning that exceptions will potentially 
propagate as more serious to the end user).
 
 
@@ -153,7 +153,7 @@ causeway.core.runtime-services. +
 repository-service. +
 disable-auto-flush
 
-|
+| 
 | Normally any queries are automatically preceded by flushing pending 
executions.
 
 This key allows this behaviour to be disabled.
@@ -166,7 +166,7 @@ NOTE: this key is redundant for JPA/EclipseLink, which 
supports its own auto-flu
 causeway.core.runtime-services. +
 translation.po.mode
 
-|
+| 
 | Specifies the initial mode for obtaining/discovering translations.
 
 There are three modes:
@@ -181,7 +181,7 @@ There are three modes:
 causeway.core.runtime-services. +
 translation.resource-location
 
-|
+| 
 | Specifies the relative resource path to look for translation files.
 
 If \{@code null} uses \{@code servletContext.getResource("/WEB-INF/")}.
diff --git 
a/core/config/src/main/adoc/modules/config/pages/sections/causeway.core.runtime.adoc
 
b/core/config/src/main/adoc/modules/config/pages/sections/causeway.core.runtime.adoc
index 4e2c7c3ff2..2da9ba5959 100644
--- 
a/core/config/src/main/adoc/modules/config/pages/sections/causeway.core.runtime.adoc
+++ 
b/core/config/src/main/adoc/modules/config/pages/sections/causeway.core.runtime.adoc
@@ -15,7 +15,7 @@ include::../section-hooks/causeway.core.runtime~pre.adoc[]
 [[causeway.core.runtime.locale]]
 causeway.core.runtime.locale
 
-|
+| 
 | If set, then overrides the application's ``Locale#getDefault()``
 
 
@@ -23,7 +23,7 @@ causeway.core.runtime.locale
 [[causeway.core.runtime.timezone]]
 causeway.core.runtime.timezone
 
-|
+| 
 | If set, then override's the application's timezone.
 
 
diff --git 
a/core/config/src/main/adoc/modules/config/pages/sections/causeway.extensions.adoc
 
b/core/config/src/main/adoc/modules/config/pages/sections/causeway.extensions.adoc
index a9d1ba2949..6d07b923b7 100644
--- 
a/core/config/src/main/adoc/modules/config/pages/sections/causeway.extensions.adoc
+++ 
b/core/config/src/main/adoc/modules/config/pages/sections/causeway.extensions.adoc
@@ -11,12 +11,25 @@ include::../section-hooks/causeway.extensions~pre.adoc[]
 |Property
 |Default
 |Description
+|
+[[causeway.extensions.command-log.publish-policy]]
+causeway.extensions.command-log. +
+publish-policy
+
+| 
+| Whether commands should be published always, or only if a change in the 
system's state has been detected.
+
+In general, the default of ``PublishPolicy#ALWAYS`` should be used, _unless_ 
the _Audit Trail_ extension is also in use, which is able to advise on whether 
the systems state has changed.
+
+Put another way, if this policy is set to 
``PublishPolicy#ONLY_IF_SYSTEM_CHANGED`` but the _Audit Trail_ extension is 
_not_ enabled, then nothing will be logged.
+
+
 |
 [[causeway.extensions.command-replay.analyser.exception.enabled]]
 causeway.extensions.command-replay. +
 analyser.exception.enabled
 
-|
+|  true
 | null
 
 
@@ -25,7 +38,7 @@ analyser.exception.enabled
 causeway.extensions.command-replay. +
 analyser.result.enabled
 
-|
+|  true
 | null
 
 
@@ -34,7 +47,7 @@ analyser.result.enabled
 causeway.extensions.command-replay. +
 batch-size
 
-|
+|  10
 | null
 
 
@@ -43,7 +56,7 @@ batch-size
 causeway.extensions.command-replay. +
 primary-access.base-url-restful
 
-|
+| 
 | null
 
 
@@ -52,7 +65,7 @@ primary-access.base-url-restful
 causeway.extensions.command-replay. +
 primary-access.base-url-wicket
 
-|
+| 
 | null
 
 
@@ -61,7 +74,7 @@ primary-access.base-url-wicket
 causeway.extensions.command-replay. +
 primary-access.password
 
-|
+| 
 | null
 
 
@@ -70,7 +83,7 @@ primary-access.password
 causeway.extensions.command-replay. +
 primary-access.user
 
-|
+| 
 | null
 
 
@@ -80,7 +93,7 @@ causeway.extensions.command-replay. +
 quartz-replicate-and-replay-job. +
 repeat-interval
 
-|
+|  10000
 | Number of milliseconds before running again.
 
 
@@ -90,7 +103,7 @@ causeway.extensions.command-replay. +
 quartz-replicate-and-replay-job. +
 start-delay
 
-|
+|  15000
 | Number of milliseconds before starting the job.
 
 
@@ -99,7 +112,8 @@ start-delay
 causeway.extensions.command-replay. +
 quartz-session.roles
 
-|
+|  causewayModuleExtCommandReplaySeco +
+ndaryRole
 | null
 
 
@@ -108,7 +122,8 @@ quartz-session.roles
 causeway.extensions.command-replay. +
 quartz-session.user
 
-|
+|  causewayModuleExtCommandReplaySeco +
+ndaryUser
 | The user that runs the replay session secondary.
 
 
@@ -117,7 +132,7 @@ quartz-session.user
 causeway.extensions.command-replay. +
 secondary-access.base-url-wicket
 
-|
+| 
 | null
 
 
@@ -126,8 +141,14 @@ secondary-access.base-url-wicket
 causeway.extensions.cors. +
 allow-credentials
 
-|
-| TODO missing java-doc
+| 
+| Whether the resource supports user credentials.
+
+This flag is exposed as part of 'Access-Control-Allow-Credentials' header in a 
pre-flight response. It helps browser determine whether or not an actual 
request can be made using credentials.
+
+By default this is not set (i.e. user credentials are not supported).
+
+For more information, check the usage of the ``credentials`` init parameter 
for https://github.com/eBay/cors-filter[EBay CORSFilter].
 
 
 |
@@ -135,8 +156,10 @@ allow-credentials
 causeway.extensions.cors. +
 allowed-headers
 
-|
-| Which HTTP headers are allowed in a CORS request.
+| 
+| Which HTTP headers can be allowed in a CORS request.
+
+These header will also be returned as part of 'Access-Control-Allow-Headers' 
header in a pre-flight response.
 
 For more information, check the usage of the ``headers`` init parameter for 
https://github.com/eBay/cors-filter[EBay CORSFilter].
 
@@ -146,9 +169,13 @@ For more information, check the usage of the ``headers`` 
init parameter for http
 causeway.extensions.cors. +
 allowed-methods
 
-|
+| 
 | Which HTTP methods are permitted in a CORS request.
 
+A comma separated list of HTTP methods that can be used to access the 
resource, using cross-origin requests. These are the methods which will also be 
included as part of 'Access-Control-Allow-Methods' header in a pre-flight 
response.
+
+Default is ``GET``, ``POST``, ``HEAD``, ``OPTIONS``.
+
 For more information, check the usage of the ``methods`` init parameter for 
https://github.com/eBay/cors-filter[EBay CORSFilter].
 
 
@@ -157,10 +184,12 @@ For more information, check the usage of the ``methods`` 
init parameter for http
 causeway.extensions.cors. +
 allowed-origins
 
-|
+|  *
 | Which origins are allowed to make CORS requests.
 
-The default is the wildcard ("*") but this can be made more restrictive if 
necessary.
+The default is the wildcard ("*"), meaning any origin is allowed to access the 
resource, but this can be made more restrictive if necessary using a whitelist 
of comma separated origins eg:
+
+``org``
 
 For more information, check the usage of the ``origins`` init parameter for 
https://github.com/eBay/cors-filter[EBay CORSFilter].
 
@@ -170,41 +199,69 @@ For more information, check the usage of the ``origins`` 
init parameter for http
 causeway.extensions.cors. +
 exposed-headers
 
-|
+|  Authorization
 | Which HTTP headers are exposed in a CORS request.
 
+A comma separated list of headers other than the simple response headers that 
browsers are allowed to access. These are the headers which will also be 
included as part of 'Access-Control-Expose-Headers' header in the pre-flight 
response.
+
+Default is none.
+
 For more information, check the usage of the ``headers`` init parameter for 
https://github.com/eBay/cors-filter[EBay CORSFilter].
 
 
+|
+[[causeway.extensions.execution-outbox.rest-api.max-pending]]
+causeway.extensions. +
+execution-outbox.rest-api. +
+max-pending
+
+|  100
+| The maximum number of interactions that will be returned when the REST API 
is polled.
+
+
 |
 [[causeway.extensions.secman.delegated-users.auto-create-policy]]
 causeway.extensions.secman. +
 delegated-users.auto-create-policy
 
-|
+| 
 | Whether delegated users should be autocreated as locked (the default) or 
unlocked.
 
 BE AWARE THAT if any users are auto-created as unlocked, then the set of roles 
that they are given should be highly restricted !!!
 
+NOTE also that this configuration policy is ignored if running secman with 
Spring OAuth2 or Keycloak as the authenticator; users are always auto-created.
+
+
+|
+[[causeway.extensions.secman.delegated-users.initial-role-names]]
+causeway.extensions.secman. +
+delegated-users.initial-role-names
+
+| 
+| The set of roles that users that have been automatically created are granted 
automatically.
+
+Typically the regular user role (as per ``role-name``, default value of 
``causeway-ext-secman-user``) will be one of the roles listed here, to provide 
the ability for the end-user to logout, among other things (!).
+
 
 |
 [[causeway.extensions.secman.permissions-evaluation-policy]]
 causeway.extensions.secman. +
 permissions-evaluation-policy
 
-|
+| 
 | If there are conflicting (allow vs veto) permissions at the same scope, then 
this policy determines whether to prefer to allow the permission or to veto it.
 
-This is only used if a ``PermissionsEvaluationService`` has not been declared 
explicitly.
+This is only used an implementation of secman's 
``PermissionsEvaluationService`` SPI has not been provided explicitly.
 
 
 |
 [[causeway.extensions.secman.seed.admin.namespace-permissions.additional]]
-causeway.extensions.secman.seed.admin. +
-namespace-permissions.additional
+causeway.extensions.secman.seed. +
+admin.namespace-permissions. +
+additional
 
-|
-| An (optional) additional set of namespaces that the admin role is granted.
+| 
+| An (optional) additional set of namespaces that the role is granted.
 
 These are in addition to the main namespaces granted.
 
@@ -213,11 +270,11 @@ These are in addition to the main namespaces granted.
 
 |
 [[causeway.extensions.secman.seed.admin.namespace-permissions.sticky]]
-causeway.extensions.secman.seed.admin. +
-namespace-permissions.sticky
+causeway.extensions.secman.seed. +
+admin.namespace-permissions.sticky
 
-|
-| The set of namespaces to which the admin role is granted.
+| 
+| The set of namespaces to which the role is granted.
 
 These namespaces are intended to be sufficient to allow users with this admin 
role to be able to administer the security module itself, for example to manage 
users and roles. The security user is not necessarily able to use the main 
business logic within the domain application itself, though.
 
@@ -230,35 +287,35 @@ WARNING: normally these should not be overridden. 
Instead, specify additional na
 
 |
 [[causeway.extensions.secman.seed.admin.password]]
-causeway.extensions.secman.seed.admin. +
-password
+causeway.extensions.secman.seed. +
+admin.password
 
-|
-| The corresponding password for admin user. @see #getUserName()
+| 
+| The corresponding password for user. @see #getUserName()
 
 
 |
 [[causeway.extensions.secman.seed.admin.role-name]]
-causeway.extensions.secman.seed.admin. +
-role-name
+causeway.extensions.secman.seed. +
+admin.role-name
 
-|
+| 
 | The name of security admin role.
 
-Users with this role (in particular, the default admin user are granted access 
to a set of namespaces (``NamespacePermissions#getSticky()`` and 
``NamespacePermissions#getAdditional()``) which are intended to be sufficient 
to allow users with this admin role to be able to administer the security 
module itself, for example to manage users and roles.
+Users with this role (in particular, the default user are granted access to a 
set of namespaces (``NamespacePermissions#getSticky()`` and 
``NamespacePermissions#getAdditional()``) which are intended to be sufficient 
to allow users with this admin role to be able to administer the security 
module itself, for example to manage users and roles.
 
 @see Admin#getUserName() @see NamespacePermissions#getSticky() @see 
NamespacePermissions#getAdditional()
 
 
 |
 [[causeway.extensions.secman.seed.admin.user-name]]
-causeway.extensions.secman.seed.admin. +
-user-name
+causeway.extensions.secman.seed. +
+admin.user-name
 
-|
+| 
 | The name of the security super user.
 
-This user is automatically made a member of the admin role, from which it is 
granted permissions to administer other users.
+This user is automatically made a member of the role, from which it is granted 
permissions to administer other users.
 
 The password for this user is set in ``Admin#getPassword()``.
 
@@ -270,7 +327,7 @@ The password for this user is set in 
``Admin#getPassword()``.
 causeway.extensions.secman.seed. +
 regular-user.role-name
 
-|
+| 
 | The role name for regular users of the application, granting them access to 
basic security features.
 
 The exact set of permissions is hard-wired in the 
``CausewayExtSecmanRegularUserRoleAndPermissions`` fixture.
@@ -281,10 +338,10 @@ The exact set of permissions is hard-wired in the 
``CausewayExtSecmanRegularUser
 causeway.extensions.secman. +
 user-menu-me-action-policy
 
-|
-| Whether the presence of SecMan should result in the automatic suppression of 
the ``UserMenu``'s me action.
+| 
+| Whether the presence of SecMan should result in the automatic suppression of 
the ``UserMenu``'s ``me#act() me()`` action.
 
-This is normally what is required as SecMan's ``ApplicationUser`` is a more 
comprehensive representation of the current user. If the default me action is 
not suppressed, then the end-user will see two actions with the name "me" in 
the tertiary menu.
+This is normally what is required as SecMan's ``ApplicationUser`` is a more 
comprehensive representation of the current user. If the default ``me#act() 
me()`` action is not suppressed, then the end-user will see two actions with 
the name "me" in the tertiary menu.
 
 
 |
@@ -293,7 +350,7 @@ causeway.extensions.secman. +
 user-registration. +
 initial-role-names
 
-|
+| 
 | The set of roles that users registering with the app are granted 
automatically.
 
 If using the wicket viewer, also requires 
causeway.viewer.wicket.suppress-signup to be set ``false``, along with any 
other of its other prereqs.
@@ -304,7 +361,7 @@ If using the wicket viewer, also requires 
causeway.viewer.wicket.suppress-signup
 causeway.extensions.session-log. +
 auto-logout-on-restart
 
-|
+|  true
 | null
 
 
diff --git 
a/core/config/src/main/adoc/modules/config/pages/sections/causeway.persistence.schema.adoc
 
b/core/config/src/main/adoc/modules/config/pages/sections/causeway.persistence.schema.adoc
index 3e702328fb..9811f8fec5 100644
--- 
a/core/config/src/main/adoc/modules/config/pages/sections/causeway.persistence.schema.adoc
+++ 
b/core/config/src/main/adoc/modules/config/pages/sections/causeway.persistence.schema.adoc
@@ -16,7 +16,7 @@ 
include::../section-hooks/causeway.persistence.schema~pre.adoc[]
 causeway.persistence.schema. +
 additional-orm-files
 
-|
+| 
 | Does lookup additional "mapping-files" in META-INF/orm-_name_.xml 
(equivalent to "mapping-file" entries in persistence.xml) and adds these to 
those that are already configured the _Spring Data_ way (if any). NOTE: not 
implemented for JDO
 
 
@@ -25,7 +25,7 @@ additional-orm-files
 causeway.persistence.schema. +
 auto-create-schemas
 
-|
+| 
 | List of additional schemas to be auto-created.
 
 Explicitly creates given list of schemas by using the specified 
``#getCreateSchemaSqlTemplate()`` to generate the actual SQL statement against 
the configured data-source.
@@ -38,10 +38,10 @@ This configuration mechanism does not consider any 
schema-auto-creation configur
 causeway.persistence.schema. +
 create-schema-sql-template
 
-|
+|  CREATE SCHEMA IF NOT EXISTS %S
 | Vendor specific SQL syntax to create a DB schema.
 
-This template is passed through schemaName) to make the actual SQL statement 
thats to be used against the configured data-source.
+This template is passed through ``String#format(String, Object...)`` to make 
the actual SQL statement thats to be used against the configured data-source.
 
 Default template is \{@literal CREATE SCHEMA IF NOT EXISTS %S} with the schema 
name converted to upper-case.
 
diff --git 
a/core/config/src/main/adoc/modules/config/pages/sections/causeway.security.keycloak.adoc
 
b/core/config/src/main/adoc/modules/config/pages/sections/causeway.security.keycloak.adoc
index b190b33410..86a5983b54 100644
--- 
a/core/config/src/main/adoc/modules/config/pages/sections/causeway.security.keycloak.adoc
+++ 
b/core/config/src/main/adoc/modules/config/pages/sections/causeway.security.keycloak.adoc
@@ -13,26 +13,75 @@ 
include::../section-hooks/causeway.security.keycloak~pre.adoc[]
 |Description
 |
 [[causeway.security.keycloak.base-url]]
-causeway.security.keycloak.base-url
+causeway.security.keycloak. +
+base-url
 
-|
+| 
 | The base URL for the keycloak server.
 
 For example, if running a keycloak using Docker container, such as:
 
 ....
-         docker run -p 9090:8080 \             -e KEYCLOAK_USER=admin \        
     -e KEYCLOAK_PASSWORD=admin \             quay.io/keycloak/keycloak:14.0.0
+         docker run -p 9090:8080 \             -e KEYCLOAK_USER=admin \        
     -e KEYCLOAK_PASSWORD=admin \             quay.io/keycloak/keycloak:19.0.1  
   
 ....
 
 , then the URL would be "http://localhost:9090/auth";.
 
 
+|
+[[causeway.security.keycloak.client-role-prefix]]
+causeway.security.keycloak. +
+client-role-prefix
+
+| 
+| If ``#isExtractClientRoles()`` client roles are to be extracted}, this 
allows the resultant role to be optionally prefixed.
+
+
+|
+[[causeway.security.keycloak.extract-client-roles]]
+causeway.security.keycloak. +
+extract-client-roles
+
+|  true
+| Whether to (attempt to) extract client roles and copy into the 
``DefaultOidcUser``.
+
+By default, client roles are extracted using the "User Client Role" mapping 
type, into a token claim name "resource_access.$\{client_id}.roles"
+
+This has been made a configuration option because some versions of Keycloak 
seemingly do not correctly extract these roles, see for example 
https://keycloak.discourse.group/t/resource-access-claim-missing-from-userinfo-until-i-change-the-name/1238/3[this
 discussion] and https://issues.redhat.com/browse/KEYCLOAK-9874[KEYCLOAK-9874].
+
+
+|
+[[causeway.security.keycloak.extract-realm-roles]]
+causeway.security.keycloak. +
+extract-realm-roles
+
+|  true
+| Whether to (attempt to) extract realm roles and copy into the 
``DefaultOidcUser``.
+
+By default, realm roles are obtained from the token claims using the "User 
Realm Role" mapping type, into a token claim name "realm_access.roles"
+
+This has been made a configuration option because some versions of Keycloak 
seemingly do not correctly extract these roles, see for example 
https://keycloak.discourse.group/t/resource-access-claim-missing-from-userinfo-until-i-change-the-name/1238/3[this
 discussion] and https://issues.redhat.com/browse/KEYCLOAK-9874[KEYCLOAK-9874].
+
+
+|
+[[causeway.security.keycloak.extract-roles]]
+causeway.security.keycloak. +
+extract-roles
+
+| 
+| Whether to (attempt to) extract any available roles and into the 
``DefaultOidcUser``.
+
+This is to support any custom mapping type which maps into a token claim name 
called simply "roles"
+
+This has been made a configuration option so that the workaround described in 
https://keycloak.discourse.group/t/resource-access-claim-missing-from-userinfo-until-i-change-the-name/1238/3[this
 discussion] and https://issues.redhat.com/browse/KEYCLOAK-9874[KEYCLOAK-9874] 
can be implemented.
+
+
 |
 [[causeway.security.keycloak.login-success-url]]
 causeway.security.keycloak. +
 login-success-url
 
-|
+|  /wicket
 | Specifies where users will be redirected after authenticating successfully 
if they have not visited a secured page prior to authenticating or \{@code 
alwaysUse} is true.
 
 
@@ -40,10 +89,28 @@ login-success-url
 [[causeway.security.keycloak.realm]]
 causeway.security.keycloak.realm
 
-|
+| 
 | The name of the realm for the Apache Causeway application, as configured in 
Keycloak.
 
 
+|
+[[causeway.security.keycloak.realm-role-prefix]]
+causeway.security.keycloak. +
+realm-role-prefix
+
+| 
+| If roles are to be extracted, this allows the resultant role to be 
optionally prefixed.
+
+
+|
+[[causeway.security.keycloak.role-prefix]]
+causeway.security.keycloak. +
+role-prefix
+
+| 
+| If ``#isExtractRoles()`` roles are to be extracted}, this allows the 
resultant role to be optionally prefixed.
+
+
 
 |===
 
diff --git 
a/core/config/src/main/adoc/modules/config/pages/sections/causeway.security.shiro.adoc
 
b/core/config/src/main/adoc/modules/config/pages/sections/causeway.security.shiro.adoc
index fb86bd87a3..ecc0ff0cf1 100644
--- 
a/core/config/src/main/adoc/modules/config/pages/sections/causeway.security.shiro.adoc
+++ 
b/core/config/src/main/adoc/modules/config/pages/sections/causeway.security.shiro.adoc
@@ -17,7 +17,7 @@ causeway.security.shiro. +
 auto-logout-if-already- +
 authenticated
 
-|
+| 
 | If the Shiro subject is found to be still authenticated, then will be logged 
out anyway and then re-authenticated.
 
 Applies only to the Restful Objects viewer.
diff --git 
a/core/config/src/main/adoc/modules/config/pages/sections/causeway.security.spring.adoc
 
b/core/config/src/main/adoc/modules/config/pages/sections/causeway.security.spring.adoc
index 36e38fcec2..23841ea9cf 100644
--- 
a/core/config/src/main/adoc/modules/config/pages/sections/causeway.security.spring.adoc
+++ 
b/core/config/src/main/adoc/modules/config/pages/sections/causeway.security.spring.adoc
@@ -16,10 +16,10 @@ 
include::../section-hooks/causeway.security.spring~pre.adoc[]
 causeway.security.spring. +
 allow-csrf-filters
 
-|
+| 
 | The framework on initialization by default disables any \{@code 
CsrfFilter}(s) it finds with _Spring Security_ registered filters.
 
-Setting this option to \{@literal true} allows \{@code CsrfFilter}(s) to be 
configured. Yet EXPERIMENTAL. @see 
org.springframework.security.web.csrf.CsrfFilter @see 
"https://www.baeldung.com/spring-security-registered-filters";
+Setting this option to \{@literal true} allows \{@code CsrfFilter}(s) to be 
configured. Yet EXPERIMENTAL. @see ``CsrfFilter`` @see 
"https://www.baeldung.com/spring-security-registered-filters";
 
 
 
diff --git 
a/core/config/src/main/adoc/modules/config/pages/sections/causeway.testing.adoc 
b/core/config/src/main/adoc/modules/config/pages/sections/causeway.testing.adoc
index bd66952bc6..c0aebc28e9 100644
--- 
a/core/config/src/main/adoc/modules/config/pages/sections/causeway.testing.adoc
+++ 
b/core/config/src/main/adoc/modules/config/pages/sections/causeway.testing.adoc
@@ -17,7 +17,7 @@ causeway.testing.fixtures. +
 fixture-scripts-specification. +
 context-class
 
-|
+| 
 | Specifies the base package from which to search for fixture scripts.
 
 Either this or packagePrefix must be specified. This property is used by 
preference.
@@ -31,7 +31,7 @@ causeway.testing.fixtures. +
 fixture-scripts-specification. +
 multiple-execution-strategy
 
-|
+| 
 | Indicates whether, if a fixture script (or more precisely any other fixture 
scripts of the same class) is encountered more than once in a graph of 
dependencies, it should be executed again or skipped.
 
 The default is to fixture scripts are executed only once per class.
@@ -45,7 +45,7 @@ causeway.testing.fixtures. +
 fixture-scripts-specification. +
 non-persisted-objects-strategy
 
-|
+| 
 | Indicates whether objects that are returned as a fixture result should be 
automatically persisted if required (the default) or not.
 
 
@@ -55,7 +55,7 @@ causeway.testing.fixtures. +
 fixture-scripts-specification. +
 package-prefix
 
-|
+| 
 | Specifies the base package from which to search for fixture scripts.
 
 Either this or ``#getContextClass()`` must be specified; 
``#getContextClass()`` is used by preference.
@@ -69,7 +69,7 @@ causeway.testing.fixtures. +
 fixture-scripts-specification. +
 recreate
 
-|
+| 
 | null
 
 
@@ -79,7 +79,7 @@ causeway.testing.fixtures. +
 fixture-scripts-specification. +
 run-script-default
 
-|
+| 
 | null
 
 
@@ -88,7 +88,7 @@ run-script-default
 causeway.testing.fixtures. +
 initial-script
 
-|
+| 
 | Indicates the fixture script class to run initially.
 
 Intended for use when prototyping against an in-memory database (but will run 
in production mode as well if required).
diff --git 
a/core/config/src/main/adoc/modules/config/pages/sections/causeway.viewer.restfulobjects.adoc
 
b/core/config/src/main/adoc/modules/config/pages/sections/causeway.viewer.restfulobjects.adoc
index d68d2235c5..460f8da29d 100644
--- 
a/core/config/src/main/adoc/modules/config/pages/sections/causeway.viewer.restfulobjects.adoc
+++ 
b/core/config/src/main/adoc/modules/config/pages/sections/causeway.viewer.restfulobjects.adoc
@@ -16,7 +16,7 @@ 
include::../section-hooks/causeway.viewer.restfulobjects~pre.adoc[]
 causeway.viewer.restfulobjects. +
 authentication.strategy-class-name
 
-|
+| 
 | Defaults to ``AuthenticationStrategyBasicAuth``.
 
 
@@ -25,7 +25,7 @@ authentication.strategy-class-name
 causeway.viewer.restfulobjects. +
 base-uri
 
-|
+| 
 | If left unset (the default), then the RO viewer will use the ``UriInfo`` 
(injected using ``Context``) to figure out the base Uri (used to render 
``href``s).
 
 This will be correct much of the time, but will almost certainly be wrong if 
there is a reverse proxy.
@@ -38,7 +38,7 @@ If set, eg ``com/``, then this value will be used instead.
 causeway.viewer.restfulobjects. +
 honor-ui-hints
 
-|
+| 
 | Whether to enable the ``x-ro-follow-links`` support, to minimize round trips.
 
 The RO viewer provides the capability for the client to set the optional 
``x-ro-follow-links`` query parameter, as described in section 34.4 of the RO 
spec v1.0. If used, the resultant representation includes the result of 
following the associated link, but through a server-side "join", somewhat akin 
to GraphQL.
@@ -51,7 +51,7 @@ By default this functionality is disabled, this configuration 
property enables t
 causeway.viewer.restfulobjects. +
 object-property-values-only
 
-|
+| 
 | When rendering domain objects, if set the representation returned is 
stripped back to a minimal set, excluding links to actions and collections and 
with a simplified representation of an object's properties.
 
 This is disabled by default. If enabled, then the representations returned are 
non-standard with respect to the RO Spec v1.0.
@@ -62,7 +62,7 @@ This is disabled by default. If enabled, then the 
representations returned are n
 causeway.viewer.restfulobjects. +
 strict-accept-checking
 
-|
+| 
 | If set, then any unrecognised ``Accept`` headers will result in an HTTP _Not 
Acceptable_ response code (406).
 
 
@@ -71,7 +71,7 @@ strict-accept-checking
 causeway.viewer.restfulobjects. +
 suppress-described-by-links
 
-|
+| 
 | If set, then the representations returned will omit any links to the formal 
domain-type representations.
 
 
@@ -80,7 +80,7 @@ suppress-described-by-links
 causeway.viewer.restfulobjects. +
 suppress-member-disabled-reason
 
-|
+| 
 | If set, then - should there be an interaction with an action, property or 
collection that is disabled - then this will prevent the ``disabledReason`` 
reason from being added to the returned representation.
 
 This is disabled by default. If enabled, then the representations returned are 
non-standard with respect to the RO Spec v1.0.
@@ -91,7 +91,7 @@ This is disabled by default. If enabled, then the 
representations returned are n
 causeway.viewer.restfulobjects. +
 suppress-member-extensions
 
-|
+| 
 | If set, then the ``x-causeway-format`` key (under ``extensions``) for 
properties will be suppressed.
 
 This is disabled by default. If enabled, then the representations returned are 
non-standard with respect to the RO Spec v1.0.
@@ -102,7 +102,7 @@ This is disabled by default. If enabled, then the 
representations returned are n
 causeway.viewer.restfulobjects. +
 suppress-member-id
 
-|
+| 
 | If set, then the ``id`` key for all members will be suppressed.
 
 This is disabled by default. If enabled, then the representations returned are 
non-standard with respect to the RO Spec v1.0.
@@ -113,7 +113,7 @@ This is disabled by default. If enabled, then the 
representations returned are n
 causeway.viewer.restfulobjects. +
 suppress-member-links
 
-|
+| 
 | If set, then the detail link (in other words ``]``) for all members will be 
suppressed.
 
 This is disabled by default. If enabled, then the representations returned are 
non-standard with respect to the RO Spec v1.0.
@@ -124,7 +124,7 @@ This is disabled by default. If enabled, then the 
representations returned are n
 causeway.viewer.restfulobjects. +
 suppress-update-link
 
-|
+| 
 | If set, then the update link (in other words `` ]`` to perform a bulk update 
of an object) will be suppressed.
 
 This is disabled by default. If enabled, then the representations returned are 
non-standard with respect to the RO Spec v1.0.
diff --git 
a/core/config/src/main/adoc/modules/config/pages/sections/causeway.viewer.wicket.adoc
 
b/core/config/src/main/adoc/modules/config/pages/sections/causeway.viewer.wicket.adoc
index 3dba7d2cb4..99cc315c25 100644
--- 
a/core/config/src/main/adoc/modules/config/pages/sections/causeway.viewer.wicket.adoc
+++ 
b/core/config/src/main/adoc/modules/config/pages/sections/causeway.viewer.wicket.adoc
@@ -13,9 +13,10 @@ include::../section-hooks/causeway.viewer.wicket~pre.adoc[]
 |Description
 |
 [[causeway.viewer.wicket.ajax-debug-mode]]
-causeway.viewer.wicket.ajax-debug-mode
+causeway.viewer.wicket. +
+ajax-debug-mode
 
-|
+| 
 | Whether the Ajax debug should be shown, by default this is disabled.
 
 
@@ -23,7 +24,9 @@ causeway.viewer.wicket.ajax-debug-mode
 [[causeway.viewer.wicket.app]]
 causeway.viewer.wicket.app
 
-|
+|  org.apache.causeway.viewer.wicket. +
+viewer.wicketapp. +
+CausewayWicketApplication
 | Specifies the subclass of ``CausewayWicketApplication`` that is used to 
bootstrap Wicket.
 
 There is usually very little reason to change this from its default.
@@ -34,7 +37,7 @@ There is usually very little reason to change this from its 
default.
 causeway.viewer.wicket.application. +
 about
 
-|
+| 
 | Label used on the about page.
 
 
@@ -43,7 +46,7 @@ about
 causeway.viewer.wicket.application. +
 brand-logo-header
 
-|
+| 
 | Either the location of the image file (relative to the class-path resource 
root), or an absolute URL.
 
 This is rendered on the header panel. An image with a size of 160x40 works 
well. If not specified, the application.name is used instead.
@@ -54,17 +57,18 @@ This is rendered on the header panel. An image with a size 
of 160x40 works well.
 causeway.viewer.wicket.application. +
 brand-logo-signin
 
-|
+| 
 | Either the location of the image file (relative to the class-path resource 
root), or an absolute URL.
 
-This is rendered on the sign-in page. An image with a size of 400x40 works 
well. If not specified, the application name is used instead.
+This is rendered on the sign-in page. An image with a size of 400x40 works 
well. If not specified, the name is used instead.
 
 
 |
 [[causeway.viewer.wicket.application.css]]
-causeway.viewer.wicket.application.css
+causeway.viewer.wicket.application. +
+css
 
-|
+| 
 | URL of file to read any custom CSS, relative to ``static`` package on the 
class path.
 
 A typical value is ``css``. This will result in this file being read from the 
``static/css`` directory (because static resources such as CSS are mounted by 
Spring by default under ``static`` package).
@@ -75,7 +79,7 @@ A typical value is ``css``. This will result in this file 
being read from the ``
 causeway.viewer.wicket.application. +
 favicon-url
 
-|
+| 
 | Specifies the URL to use of the favIcon.
 
 This is expected to be a local resource.
@@ -83,9 +87,10 @@ This is expected to be a local resource.
 
 |
 [[causeway.viewer.wicket.application.js]]
-causeway.viewer.wicket.application.js
+causeway.viewer.wicket.application. +
+js
 
-|
+| 
 | URL of file to read any custom JavaScript, relative to ``static`` package on 
the class path.
 
 A typical value is ``js``. This will result in this file being read from the 
``static/js`` directory (because static resources such as CSS are mounted by 
Spring by default under ``static`` package).
@@ -96,7 +101,7 @@ A typical value is ``js``. This will result in this file 
being read from the ``s
 causeway.viewer.wicket.application. +
 menubars-layout-xml
 
-|
+|  menubars.layout.xml
 | Specifies the file name containing the menubars.
 
 This is expected to be a local resource.
@@ -107,7 +112,7 @@ This is expected to be a local resource.
 causeway.viewer.wicket.application. +
 name
 
-|
+|  Apache Causeway ™
 | Identifies the application on the sign-in page (unless a sign-in image is 
configured) and on top-left in the header (unless a header image is configured).
 
 
@@ -116,7 +121,7 @@ name
 causeway.viewer.wicket.application. +
 version
 
-|
+| 
 | The version of the application, eg 1.0, 1.1, etc.
 
 If present, then this will be shown in the footer on every page as well as on 
the about page.
@@ -126,7 +131,7 @@ If present, then this will be shown in the footer on every 
page as well as on th
 [[causeway.viewer.wicket.base-path]]
 causeway.viewer.wicket.base-path
 
-|
+|  /wicket/
 | The base path at which the Wicket viewer is mounted.
 
 
@@ -135,7 +140,7 @@ causeway.viewer.wicket.base-path
 causeway.viewer.wicket. +
 bookmarked-pages.max-size
 
-|
+|  15
 | Specifies the maximum number of bookmarks to show.
 
 These are aged out on an MRU-LRU basis.
@@ -146,7 +151,7 @@ These are aged out on an MRU-LRU basis.
 causeway.viewer.wicket. +
 bookmarked-pages.show-chooser
 
-|
+|  true
 | Whether the panel providing linsk to previously visited object should be 
accessible from the top-left of the header.
 
 
@@ -156,7 +161,7 @@ causeway.viewer.wicket. +
 bookmarked-pages. +
 show-drop-down-on-footer
 
-|
+|  true
 | Whether the drop-down list of previously visited objects should be shown in 
the footer.
 
 
@@ -165,7 +170,7 @@ show-drop-down-on-footer
 causeway.viewer.wicket.breadcrumbs. +
 enabled
 
-|
+|  true
 | Whether to enable the 'where am i' feature, in other words the breadcrumbs.
 
 
@@ -174,16 +179,27 @@ enabled
 causeway.viewer.wicket.breadcrumbs. +
 max-parent-chain-length
 
-|
+|  64
 | null
 
 
+|
+[[causeway.viewer.wicket.clear-field-button-enabled]]
+causeway.viewer.wicket. +
+clear-field-button-enabled
+
+|  true
+| Whether the clear-field-button, that allows to clear a null-able (optional) 
field (a property or a dialog argument) is enabled for rendering or not.
+
+The default is to enable (show) the clear-field-button.
+
+
 |
 [[causeway.viewer.wicket.clear-original-destination]]
 causeway.viewer.wicket. +
 clear-original-destination
 
-|
+| 
 | If the end user uses a deep link to access the Wicket viewer, but is not 
authenticated, then this configuration property determines whether to continue 
through to that original destination once authenticated, or simply to go to the 
home page.
 
 The default behaviour is to honour the original destination requested.
@@ -193,7 +209,7 @@ The default behaviour is to honour the original destination 
requested.
 [[causeway.viewer.wicket.credit]]
 causeway.viewer.wicket.credit
 
-|
+| 
 | List of organisations or individuals to give credit to, shown as links and 
icons in the footer. A maximum of 3 credits can be specified.
 
 IntelliJ unfortunately does not provide IDE completion for lists of classes; 
YMMV.
@@ -206,29 +222,33 @@ NOTE: For further discussion, see for example 
https://stackoverflow.com/question
 causeway.viewer.wicket.date-picker. +
 max-date
 
-|
+|  2100-01-01T00:00:00.000Z
 | Defines the first date available in the date picker.
 
 As per http://eonasdan.github.io/bootstrap-datetimepicker/Options/#maxdate, in 
ISO format (per https://github.com/moment/moment/issues/1407).
 
+Use time zone 'Z', as the date/time picker UI component is not wired up to 
support time-zones.
+
 
 |
 [[causeway.viewer.wicket.date-picker.min-date]]
 causeway.viewer.wicket.date-picker. +
 min-date
 
-|
+|  1900-01-01T00:00:00.000Z
 | Defines the first date available in the date picker.
 
 As per http://eonasdan.github.io/bootstrap-datetimepicker/Options/#maxdate, in 
ISO format (per https://github.com/moment/moment/issues/1407).
 
+Use time zone 'Z', as the date/time picker UI component is not wired up to 
support time-zones.
+
 
 |
 [[causeway.viewer.wicket.development-utilities.enable]]
 causeway.viewer.wicket. +
 development-utilities.enable
 
-|
+| 
 | Determines whether debug bar and other stuff influenced by 
``DebugSettings#isDevelopmentUtilitiesEnabled()`` is enabled or not.
 
 By default, depends on the mode (prototyping = enabled, server = disabled). 
This property acts as an override.
@@ -238,7 +258,7 @@ By default, depends on the mode (prototyping = enabled, 
server = disabled). This
 [[causeway.viewer.wicket.dialog-mode]]
 causeway.viewer.wicket.dialog-mode
 
-|
+| 
 | Whether the dialog mode rendered when invoking actions on domain objects 
should be to use the sidebar (the default) or to use a modal dialog.
 
 This can be overridden on a case-by-case basis using 
``ActionLayout#promptStyle()``.
@@ -249,7 +269,7 @@ This can be overridden on a case-by-case basis using 
``ActionLayout#promptStyle(
 causeway.viewer.wicket. +
 dialog-mode-for-menu
 
-|
+| 
 | Whether the dialog mode rendered when invoking actions on domain services 
(that is, menus) should be to use a modal dialog (the default) or to use the 
sidebar panel.
 
 This can be overridden on a case-by-case basis using 
``ActionLayout#promptStyle()``.
@@ -257,9 +277,10 @@ This can be overridden on a case-by-case basis using 
``ActionLayout#promptStyle(
 
 |
 [[causeway.viewer.wicket.live-reload-url]]
-causeway.viewer.wicket.live-reload-url
+causeway.viewer.wicket. +
+live-reload-url
 
-|
+| 
 | If specified, then is rendered on each page to enable live reload.
 
 Configuring live reload also requires an appropriate plugin to the web browser 
(eg see http://livereload.com/[livereload.com] and a mechanism to trigger 
changes, eg by watching ``xml`` files.
@@ -271,7 +292,7 @@ causeway.viewer.wicket. +
 max-title-length-in-parented- +
 tables
 
-|
+|  -1
 | null
 
 
@@ -281,7 +302,7 @@ causeway.viewer.wicket. +
 max-title-length-in-standalone- +
 tables
 
-|
+|  -1
 | null
 
 
@@ -290,7 +311,7 @@ tables
 causeway.viewer.wicket. +
 max-title-length-in-tables
 
-|
+|  12
 | The maximum number of characters to use to render the title of a domain 
object (alongside the icon) in any table, if not otherwise overridden by either 
``#getMaxTitleLengthInParentedTables()`` or 
``#getMaxTitleLengthInStandaloneTables()``.
 
 If truncated, then the remainder of the title will be replaced with ellipses 
(...).
@@ -298,10 +319,10 @@ If truncated, then the remainder of the title will be 
replaced with ellipses (..
 
 |
 [[causeway.viewer.wicket.message-popups.error-delay]]
-causeway.viewer.wicket.message-popups. +
-error-delay
+causeway.viewer.wicket. +
+message-popups.error-delay
 
-|
+|  0ms
 | How long the error popup should display before disappearing.
 
 A value of 0 (the default) means do not disappear automatically.
@@ -309,10 +330,10 @@ A value of 0 (the default) means do not disappear 
automatically.
 
 |
 [[causeway.viewer.wicket.message-popups.info-delay]]
-causeway.viewer.wicket.message-popups. +
-info-delay
+causeway.viewer.wicket. +
+message-popups.info-delay
 
-|
+|  3500ms
 | How long the info popup should display before disappearing.
 
 A value of 0 means do not disappear automatically.
@@ -320,19 +341,20 @@ A value of 0 means do not disappear automatically.
 
 |
 [[causeway.viewer.wicket.message-popups.offset]]
-causeway.viewer.wicket.message-popups. +
-offset
+causeway.viewer.wicket. +
+message-popups.offset
 
-|
+|  100
 | How far in from the edge the popup should display
 
 
 |
 [[causeway.viewer.wicket.message-popups.placement.horizontal]]
-causeway.viewer.wicket.message-popups. +
-placement.horizontal
+causeway.viewer.wicket. +
+message-popups.placement. +
+horizontal
 
-|
+| 
 | Whether to display popups aligned ot the left or right of the page.
 
 The default is to show them aligned to the right
@@ -340,10 +362,10 @@ The default is to show them aligned to the right
 
 |
 [[causeway.viewer.wicket.message-popups.placement.vertical]]
-causeway.viewer.wicket.message-popups. +
-placement.vertical
+causeway.viewer.wicket. +
+message-popups.placement.vertical
 
-|
+| 
 | Whether to display popups at the top or the bottom of the page.
 
 The default is to show them at the top.
@@ -351,10 +373,10 @@ The default is to show them at the top.
 
 |
 [[causeway.viewer.wicket.message-popups.warning-delay]]
-causeway.viewer.wicket.message-popups. +
-warning-delay
+causeway.viewer.wicket. +
+message-popups.warning-delay
 
-|
+|  0ms
 | How long the warning popup should display before disappearing.
 
 A value of 0 (the default) means do not disappear automatically.
@@ -366,7 +388,7 @@ causeway.viewer.wicket. +
 prevent-double-click-for-form- +
 submit
 
-|
+|  true
 | Whether to disable a form submit button after it has been clicked, to 
prevent users causing an error if they do a double click. This behaviour is 
enabled by default, but can be disabled using this flag.
 
 
@@ -376,7 +398,7 @@ causeway.viewer.wicket. +
 prevent-double-click-for-no-arg- +
 action
 
-|
+|  true
 | Whether to disable a no-arg action button after it has been clicked, to 
prevent users causing an error if they do a double click.
 
 This behaviour is enabled by default, but can be disabled using this flag.
@@ -384,9 +406,10 @@ This behaviour is enabled by default, but can be disabled 
using this flag.
 
 |
 [[causeway.viewer.wicket.prompt-style]]
-causeway.viewer.wicket.prompt-style
+causeway.viewer.wicket. +
+prompt-style
 
-|
+| 
 | Whether to use a modal dialog for property edits and for actions associated 
with properties.
 
 This can be overridden on a case-by-case basis using 
``@PropertyLayout#promptStyle`` and ``@ActionLayout#promptStyle``.
@@ -399,7 +422,7 @@ This behaviour is disabled by default; the viewer will use 
an inline prompt in t
 causeway.viewer.wicket. +
 redirect-even-if-same-object
 
-|
+| 
 | Whether to redirect to a new page, even if the object being shown (after an 
action invocation or a property edit) is the same as the previous page.
 
 This behaviour is disabled by default; the viewer will update the existing 
page if it can, making for a smoother user experience. If enabled then this 
reinstates the pre-1.15.0 behaviour of redirecting in all cases.
@@ -410,7 +433,7 @@ This behaviour is disabled by default; the viewer will 
update the existing page
 causeway.viewer.wicket.remember-me. +
 cookie-key
 
-|
+|  causewayWicketRememberMe
 | If the "remember me" feature is available, specifies the key to hold the 
encrypted credentials in the cookie.
 
 
@@ -419,7 +442,7 @@ cookie-key
 causeway.viewer.wicket.remember-me. +
 encryption-key
 
-|
+| 
 | If the "remember me" feature is available, optionally specifies an 
encryption key (a complex string acting as salt to the encryption algorithm) 
for computing the encrypted credentials.
 
 If not set, then (in production mode) the Wicket viewer will compute a random 
key each time it is started. This will mean that any credentials stored between 
sessions will become invalid.
@@ -434,10 +457,10 @@ In prototype mode this setting is effectively ignored, 
because the same key will
 causeway.viewer.wicket.remember-me. +
 suppress
 
-|
+| 
 | Whether the sign-in page should have a "remember me" link (the default), or 
if it should be suppressed.
 
-If "remember me" is available and checked, then the viewer will allow users to 
login based on encrypted credentials stored in a cookie. An encryption key can 
optionally be specified.
+If "remember me" is available and checked, then the viewer will allow users to 
login based on encrypted credentials stored in a cookie. An key can optionally 
be specified.
 
 
 |
@@ -446,7 +469,7 @@ causeway.viewer.wicket. +
 replace-disabled-tag-with-readonly- +
 tag
 
-|
+|  true
 | In Firefox and more recent versions of Chrome 54+, cannot copy out of 
disabled fields; instead we use the readonly attribute 
(https://www.w3.org/TR/2014/REC-html5-20141028/forms.html#the-readonly-attribute)
 
 This behaviour is enabled by default but can be disabled using this flag
@@ -456,7 +479,7 @@ This behaviour is enabled by default but can be disabled 
using this flag
 [[causeway.viewer.wicket.show-footer]]
 causeway.viewer.wicket.show-footer
 
-|
+|  true
 | Whether to show the footer menu bar.
 
 This is enabled by default.
@@ -467,7 +490,7 @@ This is enabled by default.
 causeway.viewer.wicket. +
 strip-wicket-tags
 
-|
+|  true
 | Whether Wicket tags should be stripped from the markup.
 
 By default this is enabled, in other words Wicket tags are stripped. Please be 
aware that if tags are _not_ stripped, then this may break CSS rules on some 
browsers.
@@ -478,7 +501,7 @@ By default this is enabled, in other words Wicket tags are 
stripped. Please be a
 causeway.viewer.wicket. +
 suppress-password-reset
 
-|
+| 
 | Whether to suppress the password reset link on the sign-in page.
 
 Although this is disabled by default (in other words the 'reset password' link 
is not suppressed), note that in addition the application must provide an 
implementation of the ``UserRegistrationService`` as well as a configured 
``EmailNotificationService`` (same conditions as for the 
``#isSuppressSignUp()`` sign-up link).
@@ -489,25 +512,46 @@ Although this is disabled by default (in other words the 
'reset password' link i
 causeway.viewer.wicket. +
 suppress-sign-up
 
-|
+| 
 | Whether to suppress the sign-up link on the sign-in page.
 
 Although this is disabled by default (in other words the sign-up link is not 
suppressed), note that in addition the application must provide an 
implementation of the ``UserRegistrationService`` as well as a configured 
``EmailNotificationService`` (same conditions as for the 
``#isSuppressPasswordReset()`` password reset link).
 
 
 |
-[[causeway.viewer.wicket.themes.enabled]]
-causeway.viewer.wicket.themes.enabled
+[[causeway.viewer.wicket.table.decoration.data-tables-net.options]]
+causeway.viewer.wicket.table. +
+decoration.data-tables-net.options
+
+| 
+| If specified, then the string is passed verbatim as the initialization 
options for the https://datatables.net table decoration (as defined by 
``DomainObjectLayout#tableDecoration()`` or by 
``CollectionLayout#tableDecoration()``).
+
+For example, a value of "info: false, pagingType: 'numbers'" will result in 
datatables.net being initialized using:
+
+....
+     $(document).ready(function () {       
$('table.table-decoration').DataTable({         info: false, pagingType: 
'numbers'       });     });     
+....
+
+thus switching off the info panel and using the simple 'numbers' paging type.
+
+@see https://datatables.net/examples/basic_init/index.html
+
 
 |
+[[causeway.viewer.wicket.themes.enabled]]
+causeway.viewer.wicket.themes. +
+enabled
+
+| 
 | A comma separated list of enabled theme names, as defined by 
https://bootswatch.com.
 
 
 |
 [[causeway.viewer.wicket.themes.initial]]
-causeway.viewer.wicket.themes.initial
+causeway.viewer.wicket.themes. +
+initial
 
-|
+|  Flatly
 | The initial theme to use.
 
 Expected to be in the list of ``#getEnabled()`` themes.
@@ -518,7 +562,7 @@ Expected to be in the list of ``#getEnabled()`` themes.
 causeway.viewer.wicket.themes. +
 show-chooser
 
-|
+| 
 | Whether the theme chooser widget should be available in the footer.
 
 
@@ -527,7 +571,7 @@ show-chooser
 causeway.viewer.wicket. +
 use-indicator-for-form-submit
 
-|
+|  true
 | Whether to show an indicator for a form submit button that it has been 
clicked.
 
 This behaviour is enabled by default.
@@ -538,7 +582,7 @@ This behaviour is enabled by default.
 causeway.viewer.wicket. +
 use-indicator-for-no-arg-action
 
-|
+|  true
 | Whether to show an indicator for a no-arg action button that it has been 
clicked.
 
 This behaviour is enabled by default.
@@ -546,9 +590,10 @@ This behaviour is enabled by default.
 
 |
 [[causeway.viewer.wicket.welcome.text]]
-causeway.viewer.wicket.welcome.text
+causeway.viewer.wicket.welcome. +
+text
 
-|
+| 
 | Text to be displayed on the application’s home page, used as a fallback if 
welcome.file is not specified. If a @HomePage action exists, then that will 
take precedence.
 
 
@@ -557,7 +602,7 @@ causeway.viewer.wicket.welcome.text
 causeway.viewer.wicket. +
 wicket-source-plugin
 
-|
+| 
 | Whether the Wicket source plugin should be enabled; if so, the markup 
includes links to the Wicket source.
 
 This behaviour is disabled by default. Please be aware that enabloing it can 
substantially impact performance.
diff --git 
a/core/config/src/main/adoc/modules/config/pages/sections/datanucleus.adoc 
b/core/config/src/main/adoc/modules/config/pages/sections/datanucleus.adoc
index e8ea744c04..d5e67ba7c8 100644
--- a/core/config/src/main/adoc/modules/config/pages/sections/datanucleus.adoc
+++ b/core/config/src/main/adoc/modules/config/pages/sections/datanucleus.adoc
@@ -35,7 +35,7 @@ For more details, see 
https://www.datanucleus.org/products/accessplatform_6_0/jd
 [[datanucleus.cache.level2.type]]
 datanucleus.cache.level2.type
 
-| 
+|  soft
 | Name of the type of Level 2 Cache to use.
 
 Can be used to interface with external caching products. Use "none" to turn 
off L2 caching; other values include "soft", "weak", "javax.cache".
@@ -55,7 +55,7 @@ datanucleus.identifier.case
 [[datanucleus.manage-relationships]]
 datanucleus.manage-relationships
 
-| 
+|  true
 | Whether DataNucleus will try to manage bidirectional relations, correcting 
the input objects so that all relations are consistent.
 
 This process runs when flush()/commit() is called. You can set it to false if 
you always set both sides of a relation when persisting/updating.
@@ -69,7 +69,7 @@ datanucleus. +
 persistence-by-reachability-at- +
 commit
 
-| 
+|  true
 | Whether to run the "persistence-by-reachability" algorithm at commit time.
 
 This means that objects that were reachable at a call to makePersistent() but 
that are no longer persistent will be removed from persistence. For performance 
improvements, consider turning this off.
@@ -146,7 +146,7 @@ For more details, see 
https://www.datanucleus.org/products/accessplatform_6_0/jd
 datanucleus.schema. +
 generate-database.mode
 
-| 
+|  none
 | Whether to eagerly create all tables at startup.
 
 For integration testing, this is generally preferred to using 
datanucleus.schema.autoCreateAll, because the ``autoCreateAll`` will only 
create tables lazily, when first persisted to. While lazily initialization is 
potentially quicker, it can cause issues (eg with rollup mapping to super class 
tables).
diff --git 
a/core/config/src/main/adoc/modules/config/pages/sections/eclipselink.adoc 
b/core/config/src/main/adoc/modules/config/pages/sections/eclipselink.adoc
index d56736bb5f..c83c5c5245 100644
--- a/core/config/src/main/adoc/modules/config/pages/sections/eclipselink.adoc
+++ b/core/config/src/main/adoc/modules/config/pages/sections/eclipselink.adoc
@@ -32,7 +32,7 @@ database-event-listener
 [[eclipselink.cache.shared]]
 eclipselink.cache.shared
 
-| 
+|  true
 | @see 
https://www.eclipse.org/eclipselink/documentation/2.7/jpa/extensions/persistenceproperties_ref.htm#CHDEJCJJ[eclipselink.cache.shared]
 docs
 
 
@@ -40,7 +40,7 @@ eclipselink.cache.shared
 [[eclipselink.cache.size]]
 eclipselink.cache.size
 
-| 
+|  100
 | @see 
https://www.eclipse.org/eclipselink/documentation/2.7/jpa/extensions/persistenceproperties_ref.htm#CHDIGIEC[eclipselink.cache.size]
 docs
 
 
@@ -57,7 +57,7 @@ eclipselink.cache.type
 eclipselink.concurrency.manager. +
 allow.concurrencyexception
 
-| 
+|  true
 | @see 
https://www.eclipse.org/eclipselink/documentation/2.7/jpa/extensions/persistenceproperties_ref.htm#concurrency.manager.allow.concurrencyexception[eclipselink.concurrency.manager.allow.concurrencyexception]
 docs
 
 
@@ -66,7 +66,7 @@ allow.concurrencyexception
 eclipselink.concurrency.manager. +
 allow.interruptedexception
 
-| 
+|  true
 | @see 
https://www.eclipse.org/eclipselink/documentation/2.7/jpa/extensions/persistenceproperties_ref.htm#concurrency.manager.allow.interruptedexception[eclipselink.concurrency.manager.allow.interruptedexception]
 docs
 
 
@@ -75,7 +75,7 @@ allow.interruptedexception
 eclipselink.concurrency.manager. +
 allow.readlockstacktrace
 
-| 
+|  true
 | @see 
https://www.eclipse.org/eclipselink/documentation/2.7/jpa/extensions/persistenceproperties_ref.htm#concurrency.manager.allow.readlockstacktrace[eclipselink.concurrency.manager.allow.readlockstacktrace]
 docs
 
 
@@ -84,7 +84,7 @@ allow.readlockstacktrace
 eclipselink.concurrency.manager. +
 maxfrequencytodumpmassivemessage
 
-| 
+|  60000
 | @see 
https://www.eclipse.org/eclipselink/documentation/2.7/jpa/extensions/persistenceproperties_ref.htm#concurrency.manager.maxfrequencytodumptinymessage[eclipselink.concurrency.manager.maxfrequencytodumpmassivemessage]
 docs
 
 
@@ -93,7 +93,7 @@ maxfrequencytodumpmassivemessage
 eclipselink.concurrency.manager. +
 maxfrequencytodumptinymessage
 
-| 
+|  40000
 | @see 
https://www.eclipse.org/eclipselink/documentation/2.7/jpa/extensions/persistenceproperties_ref.htm#concurrency.manager.maxfrequencytodumptinymessage[eclipselink.concurrency.manager.maxfrequencytodumptinymessage]
 docs
 
 
@@ -102,7 +102,7 @@ maxfrequencytodumptinymessage
 eclipselink.concurrency.manager. +
 maxsleeptime
 
-| 
+|  40000
 | @see 
https://www.eclipse.org/eclipselink/documentation/2.7/jpa/extensions/persistenceproperties_ref.htm#concurrency.manager.maxsleeptime[eclipselink.concurrency.manager.maxsleeptime]
 docs
 
 
@@ -128,7 +128,7 @@ create-ddl-jdbc-file-name
 [[eclipselink.ddl-generation]]
 eclipselink.ddl-generation
 
-| 
+|  none
 | @see 
https://www.eclipse.org/eclipselink/documentation/2.7/jpa/extensions/persistenceproperties_ref.htm#BABHEJJI[eclipselink.ddl-generation]
 docs
 
 
@@ -137,7 +137,7 @@ eclipselink.ddl-generation
 eclipselink.ddl-generation. +
 output-mode
 
-| 
+|  database
 | @see 
https://www.eclipse.org/eclipselink/documentation/2.7/jpa/extensions/persistenceproperties_ref.htm#BABCDHBB[eclipselink.ddl-generation.output-mode]
 docs
 
 
@@ -204,7 +204,7 @@ eclipselink.id-validation
 eclipselink.jdbc. +
 allow-native-sql-queries
 
-| 
+|  true
 | @see 
https://www.eclipse.org/eclipselink/documentation/2.7/jpa/extensions/persistenceproperties_ref.htm#CIHHJBFB[eclipselink.jdbc.allow-native-sql-queries]
 docs
 
 
@@ -212,7 +212,7 @@ allow-native-sql-queries
 [[eclipselink.jdbc.batch-writing]]
 eclipselink.jdbc.batch-writing
 
-| 
+|  none
 | @see 
https://www.eclipse.org/eclipselink/documentation/2.7/jpa/extensions/persistenceproperties_ref.htm#CIHIAGAF[eclipselink.jdbc.batch-writing]
 docs
 
 
@@ -229,7 +229,7 @@ size
 [[eclipselink.jdbc.cache-statements]]
 eclipselink.jdbc.cache-statements
 
-| 
+|  true
 | @see 
https://www.eclipse.org/eclipselink/documentation/2.7/jpa/extensions/persistenceproperties_ref.htm#CHDHAFAA[eclipselink.jdbc.cache-statements]
 docs
 
 
@@ -246,7 +246,7 @@ size
 [[eclipselink.jdbc.native-sql]]
 eclipselink.jdbc.native-sql
 
-| 
+|  true
 | @see 
https://www.eclipse.org/eclipselink/documentation/2.7/jpa/extensions/persistenceproperties_ref.htm[eclipselink.jdbc.native-sql]
 docs
 
 
@@ -263,7 +263,7 @@ upper-case-column-names
 [[eclipselink.jpql.validation]]
 eclipselink.jpql.validation
 
-| 
+|  EclipseLink
 | null
 
 
@@ -271,7 +271,7 @@ eclipselink.jpql.validation
 [[eclipselink.logging.connection]]
 eclipselink.logging.connection
 
-| 
+|  true
 | @see 
https://www.eclipse.org/eclipselink/documentation/2.7/jpa/extensions/persistenceproperties_ref.htm#CHDJCBIF[eclipselink.logging.connection]
 docs
 
 
@@ -279,7 +279,7 @@ eclipselink.logging.connection
 [[eclipselink.logging.exceptions]]
 eclipselink.logging.exceptions
 
-| 
+|  true
 | @see 
https://www.eclipse.org/eclipselink/documentation/2.7/jpa/extensions/persistenceproperties_ref.htm#BEIFJBIE[eclipselink.logging.exceptions]
 docs
 
 
@@ -303,7 +303,7 @@ eclipselink.logging.level
 [[eclipselink.logging.session]]
 eclipselink.logging.session
 
-| 
+|  true
 | @see 
https://www.eclipse.org/eclipselink/documentation/2.7/jpa/extensions/persistenceproperties_ref.htm#BEIHGGHH[eclipselink.logging.session]
 
 
@@ -311,7 +311,7 @@ eclipselink.logging.session
 [[eclipselink.logging.thread]]
 eclipselink.logging.thread
 
-| 
+|  true
 | @see 
https://www.eclipse.org/eclipselink/documentation/2.7/jpa/extensions/persistenceproperties_ref.htm#BEIFFGGB[eclipselink.logging.thread]
 
 
@@ -319,7 +319,7 @@ eclipselink.logging.thread
 [[eclipselink.logging.timestamp]]
 eclipselink.logging.timestamp
 
-| 
+|  true
 | @see 
https://www.eclipse.org/eclipselink/documentation/2.7/jpa/extensions/persistenceproperties_ref.htm#BEIJCEBJ[eclipselink.logging.timestamp]
 
 
@@ -327,7 +327,7 @@ eclipselink.logging.timestamp
 [[eclipselink.profiler]]
 eclipselink.profiler
 
-| 
+|  NoProfiler
 | The "``profiler``" property configures the type of profiler used to capture 
runtime statistics.
 
 *Allowed Values:*
@@ -403,7 +403,7 @@ eclipselink.weaving
 [[eclipselink.weaving.changetracking]]
 eclipselink.weaving.changetracking
 
-| 
+|  true
 | @see 
https://www.eclipse.org/eclipselink/documentation/2.7/jpa/extensions/persistenceproperties_ref.htm#CHDCEEFC[eclipse.weaving.changetracking]
 docs
 
 
@@ -419,7 +419,7 @@ eclipselink.weaving.eager
 [[eclipselink.weaving.fetchgroups]]
 eclipselink.weaving.fetchgroups
 
-| 
+|  true
 | @see 
https://www.eclipse.org/eclipselink/documentation/2.7/jpa/extensions/persistenceproperties_ref.htm#CHDDIFGE[eclipse.weaving.fetchgroups]
 docs
 
 
@@ -427,7 +427,7 @@ eclipselink.weaving.fetchgroups
 [[eclipselink.weaving.internal]]
 eclipselink.weaving.internal
 
-| 
+|  true
 | @see 
https://www.eclipse.org/eclipselink/documentation/2.7/jpa/extensions/persistenceproperties_ref.htm#BABJICDJ[eclipse.weaving.internal]
 docs
 
 
@@ -435,7 +435,7 @@ eclipselink.weaving.internal
 [[eclipselink.weaving.lazy]]
 eclipselink.weaving.lazy
 
-| 
+|  true
 | @see 
https://www.eclipse.org/eclipselink/documentation/2.7/jpa/extensions/persistenceproperties_ref.htm#BABDBIFE[eclipse.weaving.lazy]
 docs
 
 
diff --git 
a/core/config/src/main/adoc/modules/config/pages/sections/resteasy.adoc 
b/core/config/src/main/adoc/modules/config/pages/sections/resteasy.adoc
index 2fdc595c96..87573ec1e9 100644
--- a/core/config/src/main/adoc/modules/config/pages/sections/resteasy.adoc
+++ b/core/config/src/main/adoc/modules/config/pages/sections/resteasy.adoc
@@ -35,7 +35,7 @@ There should be very little reason to change this from its 
default.
 [[resteasy.jaxrs.default-path]]
 resteasy.jaxrs.default-path
 
-| 
+|  /restful
 | The path at which the RO viewer should be mounted.
 
 Note that this is used rather than ``prefix`` because there is _NO_ 
implementation of ``Application``, so we rely on it being automatically created.
diff --git 
a/core/config/src/main/java/org/apache/causeway/core/config/CausewayConfiguration.java
 
b/core/config/src/main/java/org/apache/causeway/core/config/CausewayConfiguration.java
index caf986e5e0..4fee76a0bc 100644
--- 
a/core/config/src/main/java/org/apache/causeway/core/config/CausewayConfiguration.java
+++ 
b/core/config/src/main/java/org/apache/causeway/core/config/CausewayConfiguration.java
@@ -790,7 +790,7 @@ public class CausewayConfiguration {
                      * <p>
                      *     The algorithm for determining whether (and what 
type of) an event is actually sent depends
                      *     on the value of the {@link 
org.apache.causeway.applib.annotation.Action#domainEvent()} for the
-                     *     action in question:
+                     *     action in question
                      * </p>
                      *
                      * <ul>
diff --git a/extensions/core/excel/fixture/pom.xml 
b/extensions/core/excel/fixture/pom.xml
index 9fbb65bf79..5b3e5837ff 100644
--- a/extensions/core/excel/fixture/pom.xml
+++ b/extensions/core/excel/fixture/pom.xml
@@ -97,12 +97,6 @@ under the License.
                        
<artifactId>causeway-persistence-jdo-datanucleus</artifactId>
         </dependency>
 
-        <dependency>
-            <groupId>org.projectlombok</groupId>
-            <artifactId>lombok</artifactId>
-            <scope>provided</scope>
-        </dependency>
-
     </dependencies>
 
 </project>
diff --git 
a/extensions/core/executionrepublisher/applib/src/main/java/org/apache/causeway/extensions/executionrepublisher/applib/contributions/ExecutionLogEntry_copyToOutbox.java
 
b/extensions/core/executionrepublisher/applib/src/main/java/org/apache/causeway/extensions/executionrepublisher/applib/contributions/ExecutionLogEntry_copyToOutbox.java
index 870b1731a6..7e5173724a 100644
--- 
a/extensions/core/executionrepublisher/applib/src/main/java/org/apache/causeway/extensions/executionrepublisher/applib/contributions/ExecutionLogEntry_copyToOutbox.java
+++ 
b/extensions/core/executionrepublisher/applib/src/main/java/org/apache/causeway/extensions/executionrepublisher/applib/contributions/ExecutionLogEntry_copyToOutbox.java
@@ -22,10 +22,7 @@ package 
org.apache.causeway.extensions.executionrepublisher.applib.contributions
 
 import javax.inject.Inject;
 
-import org.apache.causeway.applib.annotation.Action;
-import org.apache.causeway.applib.annotation.ActionLayout;
-import org.apache.causeway.applib.annotation.MemberSupport;
-import org.apache.causeway.applib.annotation.SemanticsOf;
+import org.apache.causeway.applib.annotation.*;
 import 
org.apache.causeway.extensions.executionlog.applib.dom.ExecutionLogEntry;
 import 
org.apache.causeway.extensions.executionlog.applib.dom.ExecutionLogEntryType;
 import 
org.apache.causeway.extensions.executionoutbox.applib.dom.ExecutionOutboxEntry;
@@ -80,6 +77,7 @@ public class ExecutionLogEntry_copyToOutbox {
         return executionLogEntry;
     }
 
+    @Programmatic
     static ExecutionOutboxEntryType map(ExecutionLogEntryType executionType) {
         return executionType == ExecutionLogEntryType.ACTION_INVOCATION
                 ? ExecutionOutboxEntryType.ACTION_INVOCATION
diff --git a/preview.sh b/preview.sh
index 361e237725..f519e9e6b3 100644
--- a/preview.sh
+++ b/preview.sh
@@ -20,6 +20,29 @@
 #
 #
 
+BASENAME_0=$(basename $0)
+
+usage() {
+ echo ""                                          >&2
+ echo "$BASENAME_0 options:                     " >&2
+ echo "                                         " >&2
+ echo "  Skip options:                          " >&2
+ echo "  -e|-E skip|only examples               " >&2
+ echo "  -k|-K skip|only stale example check    " >&2
+ echo "  -b|-B skip|only mvn -pl core/config    " >&2
+ echo "  -c|-C skip|only config doc generation  " >&2
+ echo "  -d|-D skip|only projdoc generation     " >&2
+ echo "  -l|-L skip|only fix adoc line endings  " >&2
+ echo "  -a|-A skip|only Antora generation      " >&2
+ echo "  -s|-S skip|only serving generated site " >&2
+ echo ""                                          >&2
+ echo "  -y skip clear project site             " >&2
+ echo "  -z skip cache (template)               " >&2
+ echo ""                                          >&2
+ echo "  -f antora/playbooks/site-xxx.yml       " >&2
+ exit 1
+}
+
 export ANTORA_CACHE_DIR=.antora-cache-dir
 export ANTORA_TARGET_SITE=antora/target/site
 
@@ -36,115 +59,132 @@ BRANCH=$(git branch --show-current)
 DATE=$(date +%Y%m%d-%H%M)
 export REVISION="${BRANCH}.${DATE}"
 
-while getopts 'ECDAKSLecdaksxylhf:' opt
+
+while getopts 'bBECDAKSLecdakszylhf:' opt
 do
   case $opt in
-    E) export SKIP_EXAMPLES=false
+    E) export EXAMPLES=exec
        forcing=true ;;
-    C) export SKIP_CONFIGS=false
+    B) export BUILD_CONFIGS=exec
        forcing=true ;;
-    D) export SKIP_PROJDOC_GENERATION=false
+    C) export CONFIGS=exec
        forcing=true ;;
-    L) export SKIP_FIX_ADOC_LINE_ENDINGS=false
+    D) export PROJDOC_GENERATION=exec
        forcing=true ;;
-    A) export SKIP_ANTORA_GENERATION=false
-       export SKIP_CLEAR_CACHE=false
-       export SKIP_CLEAR_PREVIOUS=false
+    L) export FIX_ADOC_LINE_ENDINGS=exec
        forcing=true ;;
-    K) export SKIP_STALE_EXAMPLE_CHECK=false
+    A) export ANTORA_GENERATION=exec
+       export CLEAR_CACHE=exec
+       export CLEAR_PREVIOUS=exec
        forcing=true ;;
-    S) export SKIP_SERVE=false
+    K) export STALE_EXAMPLE_CHECK=exec
+       forcing=true ;;
+    S) export SERVE=exec
        forcing=true ;;
 
-    e) export SKIP_EXAMPLES=true ;;
-    c) export SKIP_CONFIGS=true ;;
-    d) export SKIP_PROJDOC_GENERATION=true ;;
-    l) export SKIP_FIX_ADOC_LINE_ENDINGS=true ;;
-    a) export SKIP_ANTORA_GENERATION=true
-       export SKIP_CLEAR_CACHE=true
-       export SKIP_CLEAR_PREVIOUS=true
+    e) export EXAMPLES=skip ;;
+    b) export BUILD_CONFIGS=skip ;;
+    c) export CONFIGS=skip ;;
+    d) export PROJDOC_GENERATION=skip ;;
+    l) export FIX_ADOC_LINE_ENDINGS=skip ;;
+    a) export ANTORA_GENERATION=skip
+       export CLEAR_CACHE=skip
+       export CLEAR_PREVIOUS=skip
       ;;
-    k) export SKIP_STALE_EXAMPLE_CHECK=true ;;
-    s) export SKIP_SERVE=true ;;
+    k) export STALE_EXAMPLE_CHECK=skip ;;
+    s) export SERVE=skip ;;
+
+    z) export CLEAR_CACHE=skip ;;
+    y) export CLEAR_PREVIOUS=skip ;;
 
-    x) export SKIP_CLEAR_CACHE=true ;;
-    y) export SKIP_CLEAR_PREVIOUS=true ;;
     f) PLAYBOOK_FILE=$OPTARG ;;
-    h) echo ""
-       echo "preview.sh options:"
-       echo ""
-       echo "  Skip options:"
-       echo "  -e skip examples"
-       echo "  -k skip stale example check"
-       echo "  -c skip config doc generation"
-       echo "  -d skip projdoc generation"
-       echo "  -l skip fix adoc line endings"
-       echo "  -a skip Antora generation"
-       echo "  -s skip serving generated site"
-       echo ""
-       echo "  Force options (override skip):"
-       echo "  -E force examples"
-       echo "  -K force stale example check"
-       echo "  -C force config doc generation"
-       echo "  -D force projdoc generation"
-       echo "  -L force fix adoc line endings"
-       echo "  -A force Antora generation"
-       echo "  -S force serving generated site"
-       echo ""
-       echo "  -f antora/playbooks/site-xxx.yml"
+    h) usage
        exit 1
        ;;
     *) echo "unknown option $opt - aborting" >&2
+       usage
        exit 1
       ;;
   esac
 done
 
 if [ "$forcing" = "true" ]; then
-    if [ -z "$SKIP_EXAMPLES" ]; then
-      export SKIP_EXAMPLES=true
+    if [ -z "$EXAMPLES" ]; then
+      export EXAMPLES=skip
     fi
-    if [ -z "$SKIP_CONFIGS" ]; then
-      export SKIP_CONFIGS=true
+    if [ -z "$BUILD_CONFIGS" ]; then
+      export BUILD_CONFIGS=skip
     fi
-    if [ -z "$SKIP_PROJDOC_GENERATION" ]; then
-      export SKIP_PROJDOC_GENERATION=true
+    if [ -z "$CONFIGS" ]; then
+      export CONFIGS=skip
     fi
-    if [ -z "$SKIP_FIX_ADOC_LINE_ENDINGS" ]; then
-      export SKIP_FIX_ADOC_LINE_ENDINGS=true
+    if [ -z "$PROJDOC_GENERATION" ]; then
+      export PROJDOC_GENERATION=skip
     fi
-    if [ -z "$SKIP_ANTORA_GENERATION" ]; then
-      export SKIP_ANTORA_GENERATION=true
-      export SKIP_CLEAR_CACHE=true
-      export SKIP_CLEAR_PREVIOUS=true
+    if [ -z "$FIX_ADOC_LINE_ENDINGS" ]; then
+      export FIX_ADOC_LINE_ENDINGS=skip
     fi
-    if [ -z "$SKIP_STALE_EXAMPLE_CHECK" ]; then
-      export SKIP_STALE_EXAMPLE_CHECK=true
+    if [ -z "$ANTORA_GENERATION" ]; then
+      export ANTORA_GENERATION=skip
+      export CLEAR_CACHE=skip
+      export CLEAR_PREVIOUS=skip
     fi
-    if [ -z "$SKIP_SERVE" ]; then
-      export SKIP_SERVE=true
+    if [ -z "$STALE_EXAMPLE_CHECK" ]; then
+      export STALE_EXAMPLE_CHECK=skip
+    fi
+    if [ -z "$SERVE" ]; then
+      export SERVE=skip
     fi
 fi
 
 echo ""
-echo "SKIP_EXAMPLES              : $SKIP_EXAMPLES"
-echo "SKIP_STALE_EXAMPLE_CHECK   : $SKIP_STALE_EXAMPLE_CHECK"
-echo "SKIP_PROJDOC_GENERATION    : $SKIP_PROJDOC_GENERATION"
-echo "SKIP_FIX_ADOC_LINE_ENDINGS : $SKIP_FIX_ADOC_LINE_ENDINGS"
-echo "SKIP_CONFIGS               : $SKIP_CONFIGS"
-echo "SKIP_ANTORA_GENERATION     : $SKIP_ANTORA_GENERATION"
-echo "SKIP_SERVE                 : $SKIP_SERVE"
-echo "SKIP_CLEAR_PREVIOUS (site) : $SKIP_CLEAR_PREVIOUS"
-echo "SKIP_CLEAR_CACHE (template): $SKIP_SKIP_CLEAR_CACHE"
+echo "-e|-E skip|only examples              : $EXAMPLES"
+echo "-k|-K skip|only stale example check   : $STALE_EXAMPLE_CHECK"
+echo "-b|-B skip|only mvn -pl core/config   : $BUILD_CONFIGS"
+echo "-c|-C skip|only configs               : $CONFIGS"
+echo "-d|-D skip|only projdoc generation    : $PROJDOC_GENERATION"
+echo "-l|-L skip|only fix adoc line endings : $FIX_ADOC_LINE_ENDINGS"
+echo "-a|-A skip|only antora generation     : $ANTORA_GENERATION"
+echo "-s|-S skip|only serve                 : $SERVE"
+echo "-y    skip clearing previous site     : $CLEAR_PREVIOUS"
+echo "-z    skip clear cache (template)     : $CLEAR_CACHE"
 echo ""
 
-if [[ "$SKIP_CLEAR_CACHE" == "true" ]]; then
+if [[ "$EXAMPLES" == "skip" ]]; then
+  export SKIP_EXAMPLES=true
+fi
+if [[ "$CONFIGS" == "skip" ]]; then
+  export SKIP_CONFIGS=true
+fi
+if [[ "$STALE_EXAMPLE_CHECK" == "skip" ]]; then
+  export SKIP_STALE_EXAMPLE_CHECK=true
+fi
+if [[ "$PROJDOC_GENERATION" == "skip" ]]; then
+  export SKIP_PROJDOC_GENERATION=true
+fi
+if [[ "$FIX_ADOC_LINE_ENDINGS" == "skip" ]]; then
+  export SKIP_FIX_ADOC_LINE_ENDINGS=true
+fi
+if [[ "$ANTORA_GENERATION" == "skip" ]]; then
+  export SKIP_ANTORA_GENERATION=true
+fi
+if [[ "$SERVE" == "skip" ]]; then
+  export SKIP_SERVE=true
+fi
+
+if [[ "$BUILD_CONFIGS" == "skip" ]]; then
+  echo "skipping mvn -pl core/config"
+else
+  mvn clean install -pl core/config
+fi
+
+if [[ "$CLEAR_CACHE" == "skip" ]]; then
   echo "skipping clearing the Antora cache"
 else
   rm -rf $ANTORA_CACHE_DIR
 fi
 
-if [[ "$SKIP_CLEAR_PREVIOUS" == "true" ]]; then
+if [[ "$CLEAR_PREVIOUS" == "skip" ]]; then
   echo "skipping clearing any previous build site"
 else
   rm -rf $ANTORA_TARGET_SITE
@@ -161,7 +201,7 @@ SECONDS=0
 echo "\$PLAYBOOK_FILE = $PLAYBOOK_FILE"
 bash build-site.sh $PLAYBOOK_FILE || exit 1
 
-if [[ "$SKIP_SERVE" == "true" ]]; then
+if [[ "$SERVE" == "skip" ]]; then
   echo "skipping serving"
 else
   echo ""
diff --git a/scripts/ci/_adoc-gen-config.sh b/scripts/ci/_adoc-gen-config.sh
index 878b7dc13f..153a9bd862 100644
--- a/scripts/ci/_adoc-gen-config.sh
+++ b/scripts/ci/_adoc-gen-config.sh
@@ -46,13 +46,14 @@ echo ""
 echo "\$GROOVY_CMD   : ${GROOVY_CMD}"
 echo "\$DOS2UNIX_CMD : ${DOS2UNIX_CMD}"
 echo ""
- 
-# for now meant to run with nightly builds only 
+
+# for now meant to run with nightly builds only
 if [ -z "${GROOVY_CMD}" ]; then
   echo "doc gen: no groovy, skipping"
 else
   if [ ! -f 
"$PROJECT_ROOT_PATH/core/config/target/classes/META-INF/spring-configuration-metadata.json"
 ]; then
     echo "doc gen: no spring-configuration-metadata.json to parse: skipping"
+    echo "         
$PROJECT_ROOT_PATH/core/config/target/classes/META-INF/spring-configuration-metadata.json"
   else
     # generate automated site content (adoc files)
     echo "doc gen: generating config .adoc from Spring metadata ..."

Reply via email to