You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@isis.apache.org by da...@apache.org on 2020/01/20 09:52:36 UTC

[isis] branch master updated (3441feb -> 7f064b7)

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

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


    from 3441feb  ISIS-2158: minor code improvements
     new 2e806f3  ISIS-2264: adds some documentation for IsisConfiguration
     new ba48396  ISIS-2264: adds some more docs
     new 1ac7e1f  ISIS-2062: adds some documentation for config props, is all
     new 7f064b7  ISIS-2062: sync adoc

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


Summary of changes:
 .../applib-ant/examples/annotation/Action.java     |   2 +-
 .../org/apache/isis/applib/annotation/Action.java  |   2 +-
 .../concurrent/ConcurrentTaskListTest.java         |   4 +-
 .../config/examples/generated/isis.applib.adoc     | 143 ++++--
 .../examples/generated/isis.core.meta-model.adoc   |   8 +-
 .../generated/isis.core.meta-model.validator.adoc  |  33 +-
 .../apache/isis/core/config/IsisConfiguration.java | 507 +++++++++++++++++++--
 .../core/metamodel/progmodel/ProgrammingModel.java |  16 +-
 .../metamodel/JdoProgrammingModelPlugin.java       |   7 +-
 9 files changed, 633 insertions(+), 89 deletions(-)


[isis] 02/04: ISIS-2264: adds some more docs

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

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

commit ba48396fd782290af3d5b44948047ec9bc69f25c
Author: danhaywood <da...@haywood-associates.co.uk>
AuthorDate: Sun Jan 19 18:02:25 2020 +0000

    ISIS-2264: adds some more docs
---
 .../org/apache/isis/core/config/IsisConfiguration.java     | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/core/config/src/main/java/org/apache/isis/core/config/IsisConfiguration.java b/core/config/src/main/java/org/apache/isis/core/config/IsisConfiguration.java
index f0df9c1..0e647be 100644
--- a/core/config/src/main/java/org/apache/isis/core/config/IsisConfiguration.java
+++ b/core/config/src/main/java/org/apache/isis/core/config/IsisConfiguration.java
@@ -1146,7 +1146,7 @@ public class IsisConfiguration {
             @Data
             public static class ParameterLayout implements Applib.Annotation.ConfigPropsForPropertyOrParameterLayout {
                 /**
-                 * Defines the default position for the label for an action parameter..
+                 * Defines the default position for the label for an action parameter.
                  *
                  * <p>
                  *     Can be overridden on a case-by-case basis using
@@ -1172,6 +1172,18 @@ public class IsisConfiguration {
         @Data
         public static class MetaModel {
 
+            /**
+             * Whether domain objects to which the current user does not have visibility access should be rendered
+             * within collections or drop-down choices/autocompletes.
+             *
+             * <p>
+             *     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 <i>even if</i> those domain objects were rehydrated
+             *     from the persistence store.
+             * </p>
+             */
             private boolean filterVisibility = true;
 
             private final ProgrammingModel programmingModel = new ProgrammingModel();


[isis] 01/04: ISIS-2264: adds some documentation for IsisConfiguration

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

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

commit 2e806f34af1af9a24e3cf8d9763c18f6e8d6f581
Author: danhaywood <da...@haywood-associates.co.uk>
AuthorDate: Sun Jan 19 17:41:57 2020 +0000

    ISIS-2264: adds some documentation for IsisConfiguration
---
 .../org/apache/isis/applib/annotation/Action.java  |   2 +-
 .../apache/isis/core/config/IsisConfiguration.java | 414 +++++++++++++++++++--
 2 files changed, 385 insertions(+), 31 deletions(-)

diff --git a/api/applib/src/main/java/org/apache/isis/applib/annotation/Action.java b/api/applib/src/main/java/org/apache/isis/applib/annotation/Action.java
index 85590ab..b9347b8 100644
--- a/api/applib/src/main/java/org/apache/isis/applib/annotation/Action.java
+++ b/api/applib/src/main/java/org/apache/isis/applib/annotation/Action.java
@@ -124,7 +124,7 @@ public @interface Action {
      *
      * <p>
      *     Specifying a processor requires that the implementation of {@link CommandService} provides a
-     *     custom implementation of {@link org.apache.isis.applib.services.command.Command} that additional extends
+     *     custom implementation of {@link org.apache.isis.applib.services.command.Command} that additionally extends
      *     from {@link CommandWithDto}.
      * </p>
      *
diff --git a/core/config/src/main/java/org/apache/isis/core/config/IsisConfiguration.java b/core/config/src/main/java/org/apache/isis/core/config/IsisConfiguration.java
index f80aa27..f0df9c1 100644
--- a/core/config/src/main/java/org/apache/isis/core/config/IsisConfiguration.java
+++ b/core/config/src/main/java/org/apache/isis/core/config/IsisConfiguration.java
@@ -22,11 +22,14 @@ import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collections;
 import java.util.HashMap;
+import java.util.LinkedHashMap;
 import java.util.List;
 import java.util.Locale;
 import java.util.Map;
+import java.util.Objects;
 import java.util.Optional;
 import java.util.regex.Pattern;
+import java.util.stream.Collectors;
 
 import javax.inject.Inject;
 import javax.inject.Named;
@@ -38,10 +41,21 @@ import org.springframework.boot.context.properties.ConfigurationProperties;
 import org.springframework.core.env.ConfigurableEnvironment;
 import org.springframework.validation.annotation.Validated;
 
+import org.apache.isis.applib.annotation.Action;
+import org.apache.isis.applib.annotation.ActionLayout;
+import org.apache.isis.applib.annotation.Collection;
+import org.apache.isis.applib.annotation.CollectionLayout;
+import org.apache.isis.applib.annotation.DomainObject;
+import org.apache.isis.applib.annotation.DomainObjectLayout;
 import org.apache.isis.applib.annotation.LabelPosition;
+import org.apache.isis.applib.annotation.ParameterLayout;
 import org.apache.isis.applib.annotation.PromptStyle;
+import org.apache.isis.applib.events.domain.ActionDomainEvent;
+import org.apache.isis.applib.services.command.CommandWithDto;
 import org.apache.isis.applib.services.i18n.TranslationService;
+import org.apache.isis.applib.services.iactn.Interaction;
 import org.apache.isis.applib.services.publish.PublishedObjects;
+import org.apache.isis.core.commons.internal.base._Strings;
 import org.apache.isis.core.config.metamodel.facets.AuditObjectsConfiguration;
 import org.apache.isis.core.config.metamodel.facets.CommandActionsConfiguration;
 import org.apache.isis.core.config.metamodel.facets.CommandPropertiesConfiguration;
@@ -55,6 +69,7 @@ import org.apache.isis.core.config.metamodel.specloader.IntrospectionMode;
 import org.apache.isis.core.config.viewer.wicket.DialogMode;
 
 import lombok.Data;
+import lombok.Value;
 
 
 /**
@@ -104,6 +119,14 @@ public class IsisConfiguration {
             private final DomainObject domainObject = new DomainObject();
 
             public interface ConfigPropsForPropertyOrParameterLayout {
+                /**
+                 * Defines the default position for the label if not specified through an annotation.
+                 *
+                 * <p>
+                 *     If left as {@link LabelPosition#NOT_SPECIFIED} and not overridden, then the position depends
+                 *     upon the viewer implementation.
+                 * </p>
+                 */
                 LabelPosition getLabelPosition();
             }
 
@@ -115,7 +138,7 @@ public class IsisConfiguration {
                  * sent through to the {@link org.apache.isis.applib.services.audit.AuditerService}.
                  *
                  * <p>
-                 * This setting can be overridden on a case-by-case basis using {@link DomainObject#getAuditing() DomainObject#getAuditing()}
+                 * This setting can be overridden on a case-by-case basis using {@link org.apache.isis.applib.annotation.DomainObject#auditing()} DomainObject#getAuditing()}
                  * </p>
                  *
                  * <p>
@@ -135,9 +158,8 @@ public class IsisConfiguration {
                 private EditingObjectsConfiguration editing = EditingObjectsConfiguration.TRUE;
 
                 /**
-                 * The default for whether the properties of domain objects can be edited, or whether instead changed
-                 * objects should be sent through to the {@link org.apache.isis.applib.services.publish.PublisherService}
-                 * for publishing.
+                 * The default for whether the identities of changed objects should be sent through to the
+                 * {@link org.apache.isis.applib.services.publish.PublisherService} for publishing.
                  *
                  * <p>
                  *     The service's {@link org.apache.isis.applib.services.publish.PublisherService#publish(PublishedObjects) publish}
@@ -146,7 +168,7 @@ public class IsisConfiguration {
                  * </p>
                  *
                  * <p>
-                 *  This setting can be overridden on a case-by-case basis using {@link DomainObject#getPublishing() DomainObject#getPublishing()}.
+                 *  This setting can be overridden on a case-by-case basis using {@link org.apache.isis.applib.annotation.DomainObject#publishing()}.
                  * </p>
                  */
                 private PublishObjectsConfiguration publishing = PublishObjectsConfiguration.NONE;
@@ -157,10 +179,10 @@ public class IsisConfiguration {
                     /**
                      * Influences whether an {@link org.apache.isis.applib.events.lifecycle.ObjectCreatedEvent} should
                      * be published (on the internal {@link org.apache.isis.applib.services.eventbus.EventBusService})
-                     * whenever a domain object has been created using {@link org.apache.isis.applib.services.factory.FactoryService}..
+                     * whenever a domain object has been created using {@link org.apache.isis.applib.services.factory.FactoryService}.
                      *
                      * <p>
-                     *     The algorithm for determining whether an event is sent depends on the value of the
+                     *     The algorithm for determining whether (and what type of) an event is sent depends on the value of the
                      *     {@link org.apache.isis.applib.annotation.DomainObject#createdLifecycleEvent() @DomainObject(createdLifecycleEvent=...)} for the
                      *     domain object in question.
                      * </p>
@@ -193,7 +215,7 @@ public class IsisConfiguration {
                      * whenever a domain <i>entity</i> has been loaded from the persistence store.
                      *
                      * <p>
-                     *     The algorithm for determining whether an event is sent depends on the value of the
+                     *     The algorithm for determining whether (and what type of) an event is sent depends on the value of the
                      *     {@link org.apache.isis.applib.annotation.DomainObject#loadedLifecycleEvent() @DomainObject(loadedLifecycleEvent=...)} for the
                      *     domain object in question.
                      * </p>
@@ -230,7 +252,7 @@ public class IsisConfiguration {
                      * whenever a domain <i>entity</i> is about to be persisting (for the first time) to the persistence store.
                      *
                      * <p>
-                     *     The algorithm for determining whether an event is sent depends on the value of the
+                     *     The algorithm for determining whether (and what type of) an event is sent depends on the value of the
                      *     {@link org.apache.isis.applib.annotation.DomainObject#persistingLifecycleEvent() @DomainObject(persistingLifecycleEvent=...)} for the
                      *     domain object in question.
                      * </p>
@@ -267,7 +289,7 @@ public class IsisConfiguration {
                      * whenever a domain <i>entity</i> has been persisted (for the first time) to the persistence store.
                      *
                      * <p>
-                     *     The algorithm for determining whether an event is sent depends on the value of the
+                     *     The algorithm for determining whether (and what type of) an event is sent depends on the value of the
                      *     {@link org.apache.isis.applib.annotation.DomainObject#persistedLifecycleEvent() @DomainObject(persistedLifecycleEvent=...)} for the
                      *     domain object in question.
                      * </p>
@@ -305,7 +327,7 @@ public class IsisConfiguration {
                      * from the persistence store.
                      *
                      * <p>
-                     *     The algorithm for determining whether an event is sent depends on the value of the
+                     *     The algorithm for determining whether (and what type of) an event is sent depends on the value of the
                      *     {@link org.apache.isis.applib.annotation.DomainObject#removingLifecycleEvent() @DomainObject(removingLifecycleEvent=...)} for the
                      *     domain object in question.
                      * </p>
@@ -347,7 +369,7 @@ public class IsisConfiguration {
                      * whenever a persistent domain <i>entity</i> has been updated in the persistence store.
                      *
                      * <p>
-                     *     The algorithm for determining whether an event is sent depends on the value of the
+                     *     The algorithm for determining whether (and what type of) an event is sent depends on the value of the
                      *     {@link org.apache.isis.applib.annotation.DomainObject#updatedLifecycleEvent() @DomainObject(updatedLifecycleEvent=...)} for the
                      *     domain object in question.
                      * </p>
@@ -384,7 +406,7 @@ public class IsisConfiguration {
                      * whenever a persistent domain <i>entity</i> is about to be updated in the persistence store.
                      *
                      * <p>
-                     *     The algorithm for determining whether an event is sent depends on the value of the
+                     *     The algorithm for determining whether (and what type of) an event is sent depends on the value of the
                      *     {@link org.apache.isis.applib.annotation.DomainObject#updatingLifecycleEvent() @DomainObject(updatingLifecycleEvent=...)} for the
                      *     domain object in question.
                      * </p>
@@ -418,6 +440,14 @@ public class IsisConfiguration {
             @Data
             public static class DomainObjectLayout {
 
+                /**
+                 * Defines the default number of objects that are shown in a &quot;standalone&quot; collection obtained as the
+                 * result of invoking an action.
+                 *
+                 * <p>
+                 *     This can be overridden on a case-by-case basis using {@link org.apache.isis.applib.annotation.DomainObjectLayout#paged()}.
+                 * </p>
+                 */
                 private int paged = 25;
 
                 private final CssClassUiEvent cssClassUiEvent = new CssClassUiEvent();
@@ -431,7 +461,7 @@ public class IsisConfiguration {
                      * the CSS classes that are used.
                      *
                      * <p>
-                     *     The algorithm for determining whether an event is sent depends on the value of the
+                     *     The algorithm for determining whether (and what type of) an event is sent depends on the value of the
                      *     {@link org.apache.isis.applib.annotation.DomainObjectLayout#cssClassUiEvent()}  @DomainObjectLayout(cssClassEvent=...)} for the
                      *     domain object in question.
                      * </p>
@@ -466,7 +496,7 @@ public class IsisConfiguration {
                      * the icon that is used.
                      *
                      * <p>
-                     *     The algorithm for determining whether an event is sent depends on the value of the
+                     *     The algorithm for determining whether (and what type of) an event is sent depends on the value of the
                      *     {@link org.apache.isis.applib.annotation.DomainObjectLayout#iconUiEvent()}  @DomainObjectLayout(iconEvent=...)} for the
                      *     domain object in question.
                      * </p>
@@ -506,7 +536,7 @@ public class IsisConfiguration {
                      * </p>
                      *
                      * <p>
-                     *     The algorithm for determining whether an event is sent depends on the value of the
+                     *     The algorithm for determining whether (and what type of) an event is sent depends on the value of the
                      *     {@link org.apache.isis.applib.annotation.DomainObjectLayout#layoutUiEvent()}  @DomainObjectLayout(layoutEvent=...)} for the
                      *     domain object in question.
                      * </p>
@@ -541,7 +571,7 @@ public class IsisConfiguration {
                      * the title that is used.
                      *
                      * <p>
-                     *     The algorithm for determining whether an event is sent depends on the value of the
+                     *     The algorithm for determining whether (and what type of) an event is sent depends on the value of the
                      *     {@link org.apache.isis.applib.annotation.DomainObjectLayout#titleUiEvent()}  @DomainObjectLayout(titleEvent=...)} for the
                      *     domain object in question.
                      * </p>
@@ -564,13 +594,31 @@ public class IsisConfiguration {
                      */
                     private boolean postForDefault = true;
                 }
-
             }
 
             private final Action action = new Action();
             @Data
             public static class Action {
 
+                /**
+                 * The default for whether action invocations should be reified as a
+                 * {@link org.apache.isis.applib.services.command.Command} using the
+                 * {@link org.apache.isis.applib.services.command.spi.CommandService}, possibly so that the actual
+                 * execution of the action can be deferred until later (background execution) or replayed against a
+                 * copy of the system.
+                 *
+                 * <p>
+                 *     In particular, the {@link org.apache.isis.applib.services.command.CommandWithDto} implementation
+                 *     of {@link org.apache.isis.applib.services.command.Command} represents the action invocation
+                 *     memento (obtained using {@link CommandWithDto#asDto()}) as a
+                 *     {@link org.apache.isis.schema.cmd.v2.CommandDto}.
+                 * </p>
+                 *
+                 * <p>
+                 *  This setting can be overridden on a case-by-case basis using
+                 *  {@link org.apache.isis.applib.annotation.Action#command()}.
+                 * </p>
+                 */
                 private CommandActionsConfiguration command = CommandActionsConfiguration.NONE;
 
                 /**
@@ -583,9 +631,59 @@ public class IsisConfiguration {
                 private final DomainEvent domainEvent = new DomainEvent();
                 @Data
                 public static class DomainEvent {
+                    /**
+                     * Influences whether an {@link org.apache.isis.applib.events.domain.ActionDomainEvent} should
+                     * be published (on the internal {@link org.apache.isis.applib.services.eventbus.EventBusService})
+                     * whenever an action is being interacted with.
+                     *
+                     * <p>
+                     *     Up to five different events can be fired during an interaction, with the event's
+                     *     {@link org.apache.isis.applib.events.domain.ActionDomainEvent#getEventPhase() phase}
+                     *     determining which (hide, disable, validate, executing and executed).  Subscribers can
+                     *     influence the behaviour at each of these phases.
+                     * </p>
+                     *
+                     * <p>
+                     *     The algorithm for determining whether (and what type of) an event is actually sent depends
+                     *     on the value of the {@link org.apache.isis.applib.annotation.Action#domainEvent()} for the
+                     *     action in question:
+                     * </p>
+                     *
+                     * <ul>
+                     *     <li>
+                     *         If set to some subtype of
+                     *         {@link org.apache.isis.applib.events.domain.ActionDomainEvent.Noop ActionDomainEvent.Noop},
+                     *         then <i>no</i> event is sent.
+                     *     </li>
+                     *     <li>
+                     *         If set to some subtype of
+                     *         {@link org.apache.isis.applib.events.domain.ActionDomainEvent.Default ActionDomainEvent.Default},
+                     *         then an event is sent <i>if and only if</i> this configuration setting is set.
+                     *     </li>
+                     *     <li>
+                     *         If set to any other subtype, then an event <i>is</i> sent.
+                     *     </li>
+                     * </ul>
+                     */
                     private boolean postForDefault = true;
                 }
 
+                /**
+                 * The default for whether action invocations should be sent through to the
+                 * {@link org.apache.isis.applib.services.publish.PublisherService} for publishing.
+                 *
+                 * <p>
+                 *     The service's {@link org.apache.isis.applib.services.publish.PublisherService#publish(Interaction.Execution) publish}
+                 *     method is called only once per transaction, with
+                 *     {@link org.apache.isis.applib.services.iactn.Interaction.Execution} collecting details of
+                 *     the identity of the target object, the action invoked, the action arguments and the returned
+                 *     object (if any).
+                 * </p>
+                 *
+                 * <p>
+                 *  This setting can be overridden on a case-by-case basis using {@link org.apache.isis.applib.annotation.Action#publishing()}.
+                 * </p>
+                 */
                 private PublishActionsConfiguration publishing = PublishActionsConfiguration.NONE;
 
             }
@@ -597,13 +695,91 @@ public class IsisConfiguration {
                 private final CssClass cssClass = new CssClass();
                 @Data
                 public static class CssClass {
-                    private Map<Pattern, String> patterns = new HashMap<>();
+                    /**
+                     * 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.
+                     *
+                     * <p>
+                     *     Providing a default set of patterns encourages a common set of verbs to be used.
+                     * </p>
+                     *
+                     * <p>
+                     *     The CSS class for individual actions can be overridden using
+                     *     {@link org.apache.isis.applib.annotation.ActionLayout#cssClass()}.
+                     * </p>
+                     */
+                    private Map<Pattern, String> patterns = asMap(
+                                    "delete.*:btn-danger",
+                                    "discard.*:btn-warning",
+                                    "remove.*:btn-warning"
+                    );
                 }
 
                 private final CssClassFa cssClassFa = new CssClassFa();
                 @Data
                 public static class CssClassFa {
-                    private Map<Pattern, String> patterns = new HashMap<>();
+                    /**
+                     * 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.
+                     *
+                     * <p>
+                     *     Providing a default set of patterns encourages a common set of verbs to be used.
+                     * </p>
+                     *
+                     * <p>
+                     *     The font awesome class for individual actions can be overridden using
+                     *     {@link org.apache.isis.applib.annotation.ActionLayout#cssClassFa()}.
+                     * </p>
+                     */
+                    private Map<Pattern, String> patterns = asMap(
+                            "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-pencil-square-o",
+                            "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-refresh",
+                            "remove.*:fa-minus-square",
+                            "renew.*:fa-repeat",
+                            "reset.*:fa-repeat",
+                            "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");
                 }
             }
 
@@ -611,13 +787,82 @@ public class IsisConfiguration {
             @Data
             public static class Property {
 
+                /**
+                 * The default for whether property edits should be reified as a
+                 * {@link org.apache.isis.applib.services.command.Command} using the
+                 * {@link org.apache.isis.applib.services.command.spi.CommandService}, possibly so that the actual
+                 * execution of the property edit can be deferred until later (background execution) or replayed
+                 * against a copy of the system.
+                 *
+                 * <p>
+                 *     In particular, the {@link org.apache.isis.applib.services.command.CommandWithDto} implementation
+                 *     of {@link org.apache.isis.applib.services.command.Command} represents the action invocation
+                 *     memento (obtained using {@link CommandWithDto#asDto()}) as a
+                 *     {@link org.apache.isis.schema.cmd.v2.CommandDto}.
+                 * </p>
+                 *
+                 * <p>
+                 *  This setting can be overridden on a case-by-case basis using
+                 *  {@link org.apache.isis.applib.annotation.Action#command()}.
+                 * </p>
+                 */
                 private CommandPropertiesConfiguration command = CommandPropertiesConfiguration.NONE;
 
+                /**
+                 * The default for whether property edits should be sent through to the
+                 * {@link org.apache.isis.applib.services.publish.PublisherService} for publishing.
+                 *
+                 * <p>
+                 *     The service's {@link org.apache.isis.applib.services.publish.PublisherService#publish(Interaction.Execution) publish}
+                 *     method is called only once per transaction, with
+                 *     {@link org.apache.isis.applib.services.iactn.Interaction.Execution} collecting details of
+                 *     the identity of the target object, the property edited, and the new value of the property.
+                 * </p>
+                 *
+                 * <p>
+                 *  This setting can be overridden on a case-by-case basis using {
+                 *  @link org.apache.isis.applib.annotation.Property#publishing()}.
+                 * </p>
+                 */
                 private PublishPropertiesConfiguration publishing = PublishPropertiesConfiguration.NONE;
 
                 private final DomainEvent domainEvent = new DomainEvent();
                 @Data
                 public static class DomainEvent {
+                    /**
+                     * Influences whether an {@link org.apache.isis.applib.events.domain.PropertyDomainEvent} should
+                     * be published (on the internal {@link org.apache.isis.applib.services.eventbus.EventBusService})
+                     * whenever an property is being interacted with.
+                     *
+                     * <p>
+                     *     Up to five different events can be fired during an interaction, with the event's
+                     *     {@link org.apache.isis.applib.events.domain.PropertyDomainEvent#getEventPhase() phase}
+                     *     determining which (hide, disable, validate, executing and executed).  Subscribers can
+                     *     influence the behaviour at each of these phases.
+                     * </p>
+                     *
+                     * <p>
+                     *     The algorithm for determining whether (and what type of) an event is actually sent depends
+                     *     on the value of the {@link org.apache.isis.applib.annotation.Property#domainEvent()} for the
+                     *     property in question:
+                     * </p>
+                     *
+                     * <ul>
+                     *     <li>
+                     *         If set to some subtype of
+                     *         {@link org.apache.isis.applib.events.domain.PropertyDomainEvent.Noop propertyDomainEvent.Noop},
+                     *         then <i>no</i> event is sent.
+                     *     </li>
+                     *     <li>
+                     *         If set to some subtype of
+                     *         {@link org.apache.isis.applib.events.domain.PropertyDomainEvent.Default propertyDomainEvent.Default},
+                     *         then an event is sent <i>if and only if</i> this configuration setting is set.
+                     *     </li>
+                     *     <li>
+                     *         If set to any other subtype, then an event <i>is</i> sent.
+                     *     </li>
+                     * </ul>
+                     */
                     private boolean postForDefault = true;
                 }
 
@@ -626,6 +871,19 @@ public class IsisConfiguration {
             private final PropertyLayout propertyLayout = new PropertyLayout();
             @Data
             public static class PropertyLayout implements Applib.Annotation.ConfigPropsForPropertyOrParameterLayout {
+                /**
+                 * Defines the default position for the label for a domain object property.
+                 *
+                 * <p>
+                 *     Can be overridden on a case-by-case basis using
+                 *     {@link org.apache.isis.applib.annotation.ParameterLayout#labelPosition()}.
+                 * </p>
+                 *
+                 * <p>
+                 *     If left as {@link LabelPosition#NOT_SPECIFIED} and not overridden, then the position depends
+                 *     upon the viewer implementation.
+                 * </p>
+                 */
                 private LabelPosition labelPosition = LabelPosition.NOT_SPECIFIED;
             }
 
@@ -636,6 +894,40 @@ public class IsisConfiguration {
                 private final DomainEvent domainEvent = new DomainEvent();
                 @Data
                 public static class DomainEvent {
+                    /**
+                     * Influences whether an {@link org.apache.isis.applib.events.domain.CollectionDomainEvent} should
+                     * be published (on the internal {@link org.apache.isis.applib.services.eventbus.EventBusService})
+                     * whenever a collection is being interacted with.
+                     *
+                     * <p>
+                     *     Up to two different events can be fired during an interaction, with the event's
+                     *     {@link org.apache.isis.applib.events.domain.CollectionDomainEvent#getEventPhase() phase}
+                     *     determining which (hide, disable)Subscribers can influence the behaviour at each of these
+                     *     phases.
+                     * </p>
+                     *
+                     * <p>
+                     *     The algorithm for determining whether (and what type of) an event is actually sent depends
+                     *     on the value of the {@link org.apache.isis.applib.annotation.Collection#domainEvent()} for the
+                     *     collection action in question:
+                     * </p>
+                     *
+                     * <ul>
+                     *     <li>
+                     *         If set to some subtype of
+                     *         {@link org.apache.isis.applib.events.domain.CollectionDomainEvent.Noop CollectionDomainEvent.Noop},
+                     *         then <i>no</i> event is sent.
+                     *     </li>
+                     *     <li>
+                     *         If set to some subtype of
+                     *         {@link org.apache.isis.applib.events.domain.CollectionDomainEvent.Default CollectionDomainEvent.Default},
+                     *         then an event is sent <i>if and only if</i> this configuration setting is set.
+                     *     </li>
+                     *     <li>
+                     *         If set to any other subtype, then an event <i>is</i> sent.
+                     *     </li>
+                     * </ul>
+                     */
                     private boolean postForDefault = true;
                 }
             }
@@ -643,8 +935,32 @@ public class IsisConfiguration {
             private final CollectionLayout collectionLayout = new CollectionLayout();
             @Data
             public static class CollectionLayout {
+
+                /**
+                 * Defines the initial view to display collections when rendered.
+                 *
+                 * <p>
+                 *     The value of this can be overridden on a case-by-case basis using
+                 *     {@link org.apache.isis.applib.annotation.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 <codefullcalendar</code> which can render objects that have a date on top of a calendar
+                 *     view.
+                 * </p>
+                 */
                 private DefaultViewConfiguration defaultView = DefaultViewConfiguration.HIDDEN;
 
+                /**
+                 * Defines the default number of objects that are shown in a &quot;parented&quot; collection of a
+                 * domain object,
+                 * result of invoking an action.
+                 *
+                 * <p>
+                 *     This can be overridden on a case-by-case basis using
+                 *     {@link org.apache.isis.applib.annotation.CollectionLayout#paged()}.
+                 * </p>
+                 */
                 private int paged = 12;
             }
 
@@ -657,6 +973,13 @@ public class IsisConfiguration {
                     private final SemanticChecking semanticChecking = new SemanticChecking();
                     @Data
                     public static class SemanticChecking {
+                        /**
+                         * Whether to check for inconsistencies between the usage of
+                         * {@link org.apache.isis.applib.annotation.DomainObject},
+                         * {@link org.apache.isis.applib.annotation.ViewModel},
+                         * {@link org.apache.isis.applib.annotation.DomainObjectLayout} and
+                         * {@link org.apache.isis.applib.annotation.ViewModelLayout}.
+                          */
                         private boolean enable = false;
                     }
                 }
@@ -679,9 +1002,9 @@ public class IsisConfiguration {
                      * classes that are used.
                      *
                      * <p>
-                     *     The algorithm for determining whether an event is sent depends on the value of the
+                     *     The algorithm for determining whether (and what type of) an event is sent depends on the value of the
                      *     {@link org.apache.isis.applib.annotation.ViewModelLayout#cssClassUiEvent()}  @ViewModelLayout(cssClassEvent=...)} for the
-                     *     domain object in question.
+                     *     domain object in question:
                      * </p>
                      *
                      * <ul>
@@ -716,9 +1039,9 @@ public class IsisConfiguration {
                      * is used.
                      *
                      * <p>
-                     *     The algorithm for determining whether an event is sent depends on the value of the
+                     *     The algorithm for determining whether (and what type of) an event is sent depends on the value of the
                      *     {@link org.apache.isis.applib.annotation.ViewModelLayout#iconUiEvent()}  @ViewModelLayout(iconEvent=...)} for the
-                     *     domain object in question.
+                     *     domain object in question:
                      * </p>
                      *
                      * <ul>
@@ -757,9 +1080,9 @@ public class IsisConfiguration {
                      * </p>
                      *
                      * <p>
-                     *     The algorithm for determining whether an event is sent depends on the value of the
+                     *     The algorithm for determining whether (and what type of) an event is sent depends on the value of the
                      *     {@link org.apache.isis.applib.annotation.ViewModelLayout#layoutUiEvent()}  @ViewModelLayout(layoutEvent=...)} for the
-                     *     domain object in question.
+                     *     domain object in question:
                      * </p>
                      *
                      * <ul>
@@ -794,9 +1117,9 @@ public class IsisConfiguration {
                      * the title that is used.
                      *
                      * <p>
-                     *     The algorithm for determining whether an event is sent depends on the value of the
+                     *     The algorithm for determining whether (and what type of) an event is sent depends on the value of the
                      *     {@link org.apache.isis.applib.annotation.ViewModelLayout#titleUiEvent()}  @ViewModelLayout(titleEvent=...)} for the
-                     *     domain object in question.
+                     *     domain object in question:
                      * </p>
                      *
                      * <ul>
@@ -822,6 +1145,19 @@ public class IsisConfiguration {
             private final ParameterLayout parameterLayout = new ParameterLayout();
             @Data
             public static class ParameterLayout implements Applib.Annotation.ConfigPropsForPropertyOrParameterLayout {
+                /**
+                 * Defines the default position for the label for an action parameter..
+                 *
+                 * <p>
+                 *     Can be overridden on a case-by-case basis using
+                 *     {@link org.apache.isis.applib.annotation.ParameterLayout#labelPosition()}.
+                 * </p>
+                 *
+                 * <p>
+                 *     If left as {@link LabelPosition#NOT_SPECIFIED} and not overridden, then the position depends
+                 *     upon the viewer implementation.
+                 * </p>
+                 */
                 private LabelPosition labelPosition = LabelPosition.NOT_SPECIFIED;
             }
 
@@ -1890,8 +2226,6 @@ public class IsisConfiguration {
                 private Optional<String> currency = Optional.empty();
             }
         }
-
-
     }
 
 
@@ -1921,5 +2255,25 @@ public class IsisConfiguration {
         return new ArrayList<>(Arrays.asList(values));
     }
 
+    @Value
+    static class PatternToString {
+        private final Pattern pattern;
+        private final String string;
+    }
+    private static Map<Pattern, String> asMap(String... mappings) {
+        return new LinkedHashMap<>(Arrays.stream(mappings).map(mapping -> {
+            final String[] parts = mapping.split(":");
+            if (parts.length != 2) {
+                return null;
+            }
+            try {
+                return new PatternToString(Pattern.compile(parts[0]), parts[1]);
+            } catch(Exception ex) {
+                return null;
+            }
+        }).filter(Objects::nonNull)
+        .collect(Collectors.toMap(PatternToString::getPattern, PatternToString::getString)));
+    }
+
 
 }


[isis] 03/04: ISIS-2062: adds some documentation for config props, is all

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

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

commit 1ac7e1fc172d10950970e17814ed4a323211a636
Author: danhaywood <da...@haywood-associates.co.uk>
AuthorDate: Mon Jan 20 09:35:57 2020 +0000

    ISIS-2062: adds some documentation for config props, is all
---
 .../apache/isis/core/config/IsisConfiguration.java | 81 ++++++++++++++++++++++
 .../core/metamodel/progmodel/ProgrammingModel.java | 16 ++---
 .../metamodel/JdoProgrammingModelPlugin.java       |  7 +-
 3 files changed, 91 insertions(+), 13 deletions(-)

diff --git a/core/config/src/main/java/org/apache/isis/core/config/IsisConfiguration.java b/core/config/src/main/java/org/apache/isis/core/config/IsisConfiguration.java
index 0e647be..0a36b62 100644
--- a/core/config/src/main/java/org/apache/isis/core/config/IsisConfiguration.java
+++ b/core/config/src/main/java/org/apache/isis/core/config/IsisConfiguration.java
@@ -47,6 +47,7 @@ import org.apache.isis.applib.annotation.Collection;
 import org.apache.isis.applib.annotation.CollectionLayout;
 import org.apache.isis.applib.annotation.DomainObject;
 import org.apache.isis.applib.annotation.DomainObjectLayout;
+import org.apache.isis.applib.annotation.DomainService;
 import org.apache.isis.applib.annotation.LabelPosition;
 import org.apache.isis.applib.annotation.ParameterLayout;
 import org.apache.isis.applib.annotation.PromptStyle;
@@ -1189,6 +1190,11 @@ public class IsisConfiguration {
             private final ProgrammingModel programmingModel = new ProgrammingModel();
             @Data
             public static class ProgrammingModel {
+
+                /**
+                 * If set, then any aspects of the programming model (as implemented by <code>FacetFactory</code>s that
+                 * have been indicated as deprecated will simply be ignored/excluded from the metamodel.
+                 */
                 private boolean ignoreDeprecated = false;
             }
 
@@ -1256,17 +1262,92 @@ public class IsisConfiguration {
                  */
                 private boolean parallelize = true;
 
+                /**
+                 * This setting is used to determine whether the use of such deprecated features is
+                 * allowed.
+                 *
+                 * <p>
+                 *     If not allowed, then metamodel validation errors will be flagged.
+                 * </p>
+                 *
+                 * <p>
+                 *     Note that this settings has no effect if the programming model has been configured to
+                 *     {@link ProgrammingModel#isIgnoreDeprecated() ignore deprecated} features (because in this case
+                 *     the programming model facets simply won't be included in the introspection process.
+                 * </p>
+                 */
                 private boolean allowDeprecated = true;
+
+                /**
+                 * Whether to ensure that the object type of all objects (which can be set either explicitly using
+                 * {@link DomainObject#objectType()} or {@link DomainService#objectType()}, or can be inferred
+                 * implicitly using a variety of mechanisms) must be unique with respect to all other object types.
+                 *
+                 * <p>
+                 *     It is <i>highly advisable</i> to leave this set as enabled (the default), and to also use
+                 *     explicit types (see {@link #isExplicitObjectType()}.
+                 * </p>
+                 */
                 private boolean ensureUniqueObjectTypes = true;
+
+                // TODO: to remove
                 private boolean checkModuleExtent = true;
+                /**
+                 * If set, then checks that the supports <code>hideXxx</code> and <code>disableXxx</code> methods for
+                 * actions do not have take parameters.
+                 *
+                 * <p>
+                 *     Historically, the programming model allowed these methods to accept the same number of
+                 *     parameters as the action method to which they relate, the rationale being for similarity with
+                 *     the <code>validateXxx</code> method.  However, since these parameters serve no function, the
+                 *     programming model has been simplified so that these supporting methods are discovered if they
+                 *     have exactly no parameters.
+                 * </p>
+                 *
+                 * <p>
+                 *     Note that this aspect of the programming model relates to the <code>hideXxx</code> and
+                 *     <code>disableXxx</code> supporting methods that relate to the entire method.  Do not confuse
+                 *     these with the <code>hideNXxx</code> and <code>disableNXxx</code> supporting methods, which
+                 *     relate to the N-th parameter, and allow up to N-1 parameters to be passed in (allowing the Nth
+                 *     parameter to be dynamically hidden or disabled).
+                 * </p>
+                 */
                 private boolean noParamsOnly = false;
+
+                /**
+                 * 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.
+                 */
                 private boolean actionCollectionParameterChoices = true;
 
+                /**
+                 * If set, checks that any domain services have only actions associated with them, not properties
+                 * or collections.
+                 *
+                 * @deprecated - in that in the future the programming model will simply not search for properties or collections of domain services.
+                 */
                 @Deprecated
                 private boolean serviceActionsOnly = true;
+
+                /**
+                 * If set, then domain services actions are not contributed to domain objects.
+                 *
+                 * @deprecated - in that in the future the programming model will simply not support contributed actions from domain services.
+                 */
                 @Deprecated
                 private boolean mixinsOnly = true;
 
+                /**
+                 * Whether to ensure that the object type of all objects must be specified explicitly, using either
+                 * {@link DomainObject#objectType()} or {@link DomainService#objectType()}.
+                 *
+                 * <p>
+                 *     It is <i>highly advisable</i> to leave this set as enabled (the default).  These object types
+                 *     should also (of course) be unique - that can be checked by setting the
+                 *     {@link #isEnsureUniqueObjectTypes()} config property.
+                 * </p>
+                 */
                 private boolean explicitObjectType = false;
 
                 private final JaxbViewModel jaxbViewModel = new JaxbViewModel();
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/progmodel/ProgrammingModel.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/progmodel/ProgrammingModel.java
index 0144278..97cbfd2 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/progmodel/ProgrammingModel.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/progmodel/ProgrammingModel.java
@@ -35,7 +35,7 @@ public interface ProgrammingModel {
 
     // -- ENUM TYPES
     
-    static enum Marker {
+    enum Marker {
         DEPRECATED, 
         INCUBATING,
         JDO,
@@ -49,7 +49,7 @@ public interface ProgrammingModel {
      * Order is defined by {@link FacetProcessingOrder#ordinal()}
      *
      */
-    static enum FacetProcessingOrder {
+    enum FacetProcessingOrder {
         
         A1_FALLBACK_DEFAULTS,
         A2_AFTER_FALLBACK_DEFAULTS,
@@ -85,7 +85,7 @@ public interface ProgrammingModel {
      * Order is defined by {@link ValidationOrder#ordinal()}
      *
      */
-    static enum ValidationOrder {
+    enum ValidationOrder {
         
         A0_BEFORE_BUILTIN,
         A1_BUILTIN,
@@ -101,7 +101,7 @@ public interface ProgrammingModel {
      * Order is defined by {@link PostProcessingOrder#ordinal()}
      *
      */
-    static enum PostProcessingOrder {
+    enum PostProcessingOrder {
         
         A0_BEFORE_BUILTIN,
         A1_BUILTIN,
@@ -134,7 +134,7 @@ public interface ProgrammingModel {
     
     // -- SHORTCUTS
     
-    /** shortcut for see {@link #addFactory(FacetProcessingOrder, Class, Supplier, Marker...)}*/
+    /** shortcut for see {@link #addFactory(FacetProcessingOrder, FacetFactory, Marker...)}*/
     default <T extends FacetFactory> void addFactory(
             FacetProcessingOrder order, 
             Class<T> type, 
@@ -144,7 +144,7 @@ public interface ProgrammingModel {
         addFactory(order, supplier.get(), markers);
     }
     
-    /** shortcut for see {@link #addValidator(ValidationOrder, Class, Supplier, Marker...)} */
+    /** shortcut for see {@link #addValidator(ValidationOrder, MetaModelValidator, Marker...)} */
     default void addValidator(
             MetaModelValidator validator, 
             Marker ... markers) {
@@ -154,7 +154,7 @@ public interface ProgrammingModel {
     }
 
     
-    /** shortcut for see {@link #addValidator(ValidationOrder, Class, Supplier, Marker...)} */
+    /** shortcut for see {@link #addValidator(MetaModelValidator, Marker...)} */
     default void addValidator(MetaModelValidatorVisiting.Visitor visitor, Marker ... markers) {
         addValidator(MetaModelValidatorVisiting.of(visitor), markers);
     }
@@ -165,7 +165,7 @@ public interface ProgrammingModel {
         addValidator(MetaModelValidatorVisiting.of(visitor, specPredicate), markers);
     }
 
-    /** shortcut for see {@link #addPostProcessor(PostProcessingOrder, Class, Supplier, Marker...)}*/
+    /** shortcut for see {@link #addPostProcessor(PostProcessingOrder, ObjectSpecificationPostProcessor, Marker...)}*/
     default <T extends ObjectSpecificationPostProcessor> void addPostProcessor(
             PostProcessingOrder order, 
             Class<T> type, 
diff --git a/persistence/jdo/datanucleus-5/src/main/java/org/apache/isis/persistence/jdo/datanucleus5/metamodel/JdoProgrammingModelPlugin.java b/persistence/jdo/datanucleus-5/src/main/java/org/apache/isis/persistence/jdo/datanucleus5/metamodel/JdoProgrammingModelPlugin.java
index cab6d21..3736f1a 100644
--- a/persistence/jdo/datanucleus-5/src/main/java/org/apache/isis/persistence/jdo/datanucleus5/metamodel/JdoProgrammingModelPlugin.java
+++ b/persistence/jdo/datanucleus-5/src/main/java/org/apache/isis/persistence/jdo/datanucleus5/metamodel/JdoProgrammingModelPlugin.java
@@ -236,6 +236,7 @@ public class JdoProgrammingModelPlugin implements MetaModelRefiner {
                 }
                 final String packageName = aPackage.getName();
 
+                //noinspection StatementWithEmptyBody
                 if (objSpec.isValue() || objSpec.isAbstract() || objSpec.isMixin() ||
                         objSpec.isParentedOrFreeCollection() ||
                         objSpec.getFullIdentifier().startsWith("java") ||
@@ -243,11 +244,7 @@ public class JdoProgrammingModelPlugin implements MetaModelRefiner {
                         objSpec.getFullIdentifier().startsWith("org.apache.isis")) {
                     // ignore
                 } else {
-                    List<String> classNames = domainObjectClassNamesByPackage.get(packageName);
-                    if (classNames == null) {
-                        classNames = _Lists.newArrayList();
-                        domainObjectClassNamesByPackage.put(packageName, classNames);
-                    }
+                    List<String> classNames = domainObjectClassNamesByPackage.computeIfAbsent(packageName, k -> _Lists.newArrayList());
                     classNames.add(objSpec.getFullIdentifier());
                 }
                 return true;


[isis] 04/04: ISIS-2062: sync adoc

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

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

commit 7f064b7f31f0ae7ac0db4bd89992299fc97880da
Author: danhaywood <da...@haywood-associates.co.uk>
AuthorDate: Mon Jan 20 09:51:11 2020 +0000

    ISIS-2062: sync adoc
    
    also lombok fix for one class.
---
 .../applib-ant/examples/annotation/Action.java     |   2 +-
 .../concurrent/ConcurrentTaskListTest.java         |   4 +-
 .../config/examples/generated/isis.applib.adoc     | 143 ++++++++++++++++-----
 .../examples/generated/isis.core.meta-model.adoc   |   8 +-
 .../generated/isis.core.meta-model.validator.adoc  |  33 ++++-
 5 files changed, 145 insertions(+), 45 deletions(-)

diff --git a/api/applib/src/main/adoc/modules/applib-ant/examples/annotation/Action.java b/api/applib/src/main/adoc/modules/applib-ant/examples/annotation/Action.java
index 85590ab..b9347b8 100644
--- a/api/applib/src/main/adoc/modules/applib-ant/examples/annotation/Action.java
+++ b/api/applib/src/main/adoc/modules/applib-ant/examples/annotation/Action.java
@@ -124,7 +124,7 @@ public @interface Action {
      *
      * <p>
      *     Specifying a processor requires that the implementation of {@link CommandService} provides a
-     *     custom implementation of {@link org.apache.isis.applib.services.command.Command} that additional extends
+     *     custom implementation of {@link org.apache.isis.applib.services.command.Command} that additionally extends
      *     from {@link CommandWithDto}.
      * </p>
      *
diff --git a/core/commons/src/test/java/org/apache/isis/core/commons/internal/concurrent/ConcurrentTaskListTest.java b/core/commons/src/test/java/org/apache/isis/core/commons/internal/concurrent/ConcurrentTaskListTest.java
index 664af9c..e4c9b25 100644
--- a/core/commons/src/test/java/org/apache/isis/core/commons/internal/concurrent/ConcurrentTaskListTest.java
+++ b/core/commons/src/test/java/org/apache/isis/core/commons/internal/concurrent/ConcurrentTaskListTest.java
@@ -32,8 +32,8 @@ class ConcurrentTaskListTest {
     void tasksShouldAllBeExecuted() {
         
         val counter = new LongAdder();
-        
-        val tasks = _ConcurrentTaskList.named("Test")
+
+        _ConcurrentTaskList tasks = _ConcurrentTaskList.named("Test")
                 .addRunnable("1", counter::increment)
                 .addRunnable("2", counter::increment)
                 .addRunnable("3", counter::increment)
diff --git a/core/config/src/main/adoc/modules/config/examples/generated/isis.applib.adoc b/core/config/src/main/adoc/modules/config/examples/generated/isis.applib.adoc
index 64201e0..e8454b3 100644
--- a/core/config/src/main/adoc/modules/config/examples/generated/isis.applib.adoc
+++ b/core/config/src/main/adoc/modules/config/examples/generated/isis.applib.adoc
@@ -2,23 +2,47 @@
 action-layout.css-class-fa. +
 patterns
 | 
-| 
+| 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.
+
+The font awesome class for individual actions can be overridden using `org.apache.isis.applib.annotation.ActionLayout#cssClassFa()`.
+
 
 | isis.applib.annotation. +
 action-layout.css-class. +
 patterns
 | 
-| 
+| 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.
+
+The CSS class for individual actions can be overridden using `org.apache.isis.applib.annotation.ActionLayout#cssClass()`.
+
 
 | isis.applib.annotation.action. +
 command
 | 
-| 
+| The default for whether action invocations should be reified as a using the `org.apache.isis.applib.services.command.spi.CommandService, possibly so that the actual execution of the action can be deferred until later (background execution) or replayed against a copy of the system.
+
+In particular, the implementation of \{@link org.apache.isis.applib.services.command.Command represents the action invocation memento (obtained using as a \{@link org.apache.isis.schema.cmd.v2.CommandDto.
+
+This setting can be overridden on a case-by-case basis using \{@link org.apache.isis.applib.annotation.Action#command()`.
+
 
 | isis.applib.annotation.action. +
 domain-event.post-for-default
 |  true
-| 
+| Influences whether an should be published (on the internal \{@link org.apache.isis.applib.services.eventbus.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.
+
+The algorithm for determining whether (and what type of) an event is actually sent depends on the value of the for the action in question:
+
+* If set to some subtype of \{@link org.apache.isis.applib.events.domain.ActionDomainEvent.Noop ActionDomainEvent.Noop, then _no_ event is sent.
+* If set to some subtype of ActionDomainEvent.Default, then an event is sent _if and only if_ this configuration setting is set.
+* If set to any other subtype, then an event _is_ sent.
+
 
 | isis.applib.annotation.action. +
 explicit
@@ -29,24 +53,44 @@ explicit
 | isis.applib.annotation.action. +
 publishing
 | 
-| 
+| The default for whether action invocations should be sent through to the for publishing.
+
+The service's \{@link org.apache.isis.applib.services.publish.PublisherService#publish(Interaction.Execution) publish method is called only once per transaction, with 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 \{@link org.apache.isis.applib.annotation.Action#publishing().
+
 
 | isis.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 `org.apache.isis.applib.annotation.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 which can render objects that have a date on top of a calendar view.
+
 
 | isis.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 `org.apache.isis.applib.annotation.CollectionLayout#paged()`.
+
 
 | isis.applib.annotation. +
 collection.domain-event. +
 post-for-default
 |  true
-| 
+| Influences whether an should be published (on the internal \{@link org.apache.isis.applib.services.eventbus.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.
+
+The algorithm for determining whether (and what type of) an event is actually sent depends on the value of the for the collection action in question:
+
+* If set to some subtype of \{@link org.apache.isis.applib.events.domain.CollectionDomainEvent.Noop CollectionDomainEvent.Noop, then _no_ event is sent.
+* If set to some subtype of CollectionDomainEvent.Default, then an event is sent _if and only if_ this configuration setting is set.
+* If set to any other subtype, then an event _is_ sent.
+
 
 | isis.applib.annotation. +
 domain-object-layout. +
@@ -55,7 +99,7 @@ post-for-default
 |  true
 | Influences whether an should be published (on the internal `org.apache.isis.applib.services.eventbus.EventBusService) whenever a domain object is about to be rendered in the UI - thereby allowing subscribers to optionally change) the CSS classes that are used.
 
-The algorithm for determining whether an event is sent depends on the value of the \{@link org.apache.isis.applib.annotation.DomainObjectLayout#cssClassUiEvent() @DomainObjectLayout(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 \{@link org.apache.isis.applib.annotation.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.
@@ -69,7 +113,7 @@ post-for-default
 |  true
 | Influences whether an should be published (on the internal `org.apache.isis.applib.services.eventbus.EventBusService) whenever a domain object is about to be rendered in the UI - thereby allowing subscribers to optionally change) the icon that is used.
 
-The algorithm for determining whether an event is sent depends on the value of the \{@link org.apache.isis.applib.annotation.DomainObjectLayout#iconUiEvent() @DomainObjectLayout(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 \{@link org.apache.isis.applib.annotation.DomainObjectLayout#iconUiEvent() @DomainObjectLayout(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.
@@ -85,7 +129,7 @@ post-for-default
 
 If a different layout value has been set, then a layout in the form `Xxx.layout-zzz.xml` use used (where `zzz` is the name of the layout).
 
-The algorithm for determining whether an event is sent depends on the value of the \{@link org.apache.isis.applib.annotation.DomainObjectLayout#layoutUiEvent() @DomainObjectLayout(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 \{@link org.apache.isis.applib.annotation.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.
@@ -95,7 +139,10 @@ The algorithm for determining whether an event is sent depends on the value of t
 | isis.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 `org.apache.isis.applib.annotation.DomainObjectLayout#paged()`.
+
 
 | isis.applib.annotation. +
 domain-object-layout. +
@@ -104,7 +151,7 @@ post-for-default
 |  true
 | Influences whether an should be published (on the internal `org.apache.isis.applib.services.eventbus.EventBusService) whenever a domain object is about to be rendered in the UI - thereby allowing subscribers to optionally change) the title that is used.
 
-The algorithm for determining whether an event is sent depends on the value of the \{@link org.apache.isis.applib.annotation.DomainObjectLayout#titleUiEvent() @DomainObjectLayout(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 \{@link org.apache.isis.applib.annotation.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.
@@ -116,7 +163,7 @@ domain-object.auditing
 | 
 | The default for whether _domain entities_ should be audited or not (meaning that any changes are sent through to the
 
-This setting can be overridden on a case-by-case basis using \{@link DomainObject#getAuditing() DomainObject#getAuditing()
+This setting can be overridden on a case-by-case basis using `org.apache.isis.applib.annotation.DomainObject#auditing() DomainObject#getAuditing()`
 
 Note: this applies only to domain entities, not view models.
 
@@ -128,7 +175,7 @@ post-for-default
 |  true
 | Influences whether an should be published (on the internal \{@link org.apache.isis.applib.services.eventbus.EventBusService) whenever a domain object has been created using
 
-The algorithm for determining whether an event is sent depends on the value of the \{@link org.apache.isis.applib.annotation.DomainObject#createdLifecycleEvent() @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 \{@link org.apache.isis.applib.annotation.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.
@@ -150,7 +197,7 @@ post-for-default
 |  true
 | Influences whether an should be published (on the internal \{@link org.apache.isis.applib.services.eventbus.EventBusService) whenever a domain _entity_ has been loaded from the persistence store.
 
-The algorithm for determining whether 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=...) 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.
@@ -166,7 +213,7 @@ post-for-default
 |  true
 | Influences whether an should be published (on the internal \{@link org.apache.isis.applib.services.eventbus.EventBusService) whenever a domain _entity_ has been persisted (for the first time) to the persistence store.
 
-The algorithm for determining whether 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=...) 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.
@@ -182,7 +229,7 @@ post-for-default
 |  true
 | Influences whether an should be published (on the internal \{@link org.apache.isis.applib.services.eventbus.EventBusService) whenever a domain _entity_ is about to be persisting (for the first time) to the persistence store.
 
-The algorithm for determining whether 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=...) 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.
@@ -194,11 +241,11 @@ Note: this applies only to domain entities, not to view models.
 | isis.applib.annotation. +
 domain-object.publishing
 | 
-| The default for whether the properties of domain objects can be edited, or whether instead changed objects should be sent through to the for publishing.
+| The default for whether the identities of changed objects should be sent through to the for publishing.
 
 The service's \{@link org.apache.isis.applib.services.publish.PublisherService#publish(PublishedObjects) publish method is called only once per transaction, with collecting details of all changed domain objects.
 
-This setting can be overridden on a case-by-case basis using \{@link DomainObject#getPublishing() DomainObject#getPublishing().
+This setting can be overridden on a case-by-case basis using \{@link org.apache.isis.applib.annotation.DomainObject#publishing().
 
 
 | isis.applib.annotation. +
@@ -208,7 +255,7 @@ post-for-default
 |  true
 | Influences whether an should be published (on the internal \{@link org.apache.isis.applib.services.eventbus.EventBusService) whenever a persistent domain _entity_ is about to be removed (that is, deleted) from the persistence store.
 
-The algorithm for determining whether 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=...) 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.
@@ -226,7 +273,7 @@ post-for-default
 |  true
 | Influences whether an should be published (on the internal \{@link org.apache.isis.applib.services.eventbus.EventBusService) whenever a persistent domain _entity_ has been updated in the persistence store.
 
-The algorithm for determining whether 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=...) 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.
@@ -242,7 +289,7 @@ post-for-default
 |  true
 | Influences whether an should be published (on the internal \{@link org.apache.isis.applib.services.eventbus.EventBusService) whenever a persistent domain _entity_ is about to be updated in the persistence store.
 
-The algorithm for determining whether 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=...) 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.
@@ -255,29 +302,58 @@ Note: this applies only to domain entities, not to view models.
 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
+
+If left as \{@link LabelPosition#NOT_SPECIFIED and not overridden, then the position depends upon the viewer implementation.
+
 
 | isis.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
+
+If left as \{@link LabelPosition#NOT_SPECIFIED and not overridden, then the position depends upon the viewer implementation.
+
 
 | isis.applib.annotation. +
 property.command
 | 
-| 
+| The default for whether property edits should be reified as a using the `org.apache.isis.applib.services.command.spi.CommandService, possibly so that the actual execution of the property edit can be deferred until later (background execution) or replayed against a copy of the system.
+
+In particular, the implementation of \{@link org.apache.isis.applib.services.command.Command represents the action invocation memento (obtained using as a \{@link org.apache.isis.schema.cmd.v2.CommandDto.
+
+This setting can be overridden on a case-by-case basis using \{@link org.apache.isis.applib.annotation.Action#command()`.
+
 
 | isis.applib.annotation. +
 property.domain-event. +
 post-for-default
 |  true
-| 
+| Influences whether an should be published (on the internal \{@link org.apache.isis.applib.services.eventbus.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.
+
+The algorithm for determining whether (and what type of) an event is actually sent depends on the value of the for the property in question:
+
+* If set to some subtype of \{@link org.apache.isis.applib.events.domain.PropertyDomainEvent.Noop propertyDomainEvent.Noop, then _no_ event is sent.
+* If set to some subtype of propertyDomainEvent.Default, then an event is sent _if and only if_ this configuration setting is set.
+* If set to any other subtype, then an event _is_ sent.
+
 
 | isis.applib.annotation. +
 property.publishing
 | 
-| 
+| The default for whether property edits should be sent through to the for publishing.
+
+The service's \{@link org.apache.isis.applib.services.publish.PublisherService#publish(Interaction.Execution) publish method is called only once per transaction, with 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 \{ @link org.apache.isis.applib.annotation.Property#publishing().
+
 
 | isis.applib.annotation. +
 view-model-layout. +
@@ -286,7 +362,7 @@ post-for-default
 |  true
 | Influences whether an should be published (on the internal `org.apache.isis.applib.services.eventbus.EventBusService) whenever a view model (annotated with @ViewModel) is about to be rendered in the UI - thereby allowing subscribers to optionally change) the CSS classes that are used.
 
-The algorithm for determining whether an event is sent depends on the value of the \{@link org.apache.isis.applib.annotation.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 \{@link org.apache.isis.applib.annotation.ViewModelLayout#cssClassUiEvent() @ViewModelLayout(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.
@@ -300,7 +376,7 @@ post-for-default
 |  true
 | Influences whether an should be published (on the internal `org.apache.isis.applib.services.eventbus.EventBusService) whenever a view model (annotated with @ViewModel) is about to be rendered in the UI - thereby allowing subscribers to optionally change) the icon that is used.
 
-The algorithm for determining whether an event is sent depends on the value of the \{@link org.apache.isis.applib.annotation.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 \{@link org.apache.isis.applib.annotation.ViewModelLayout#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.
@@ -316,7 +392,7 @@ post-for-default
 
 If a different layout value has been set, then a layout in the form `Xxx.layout-zzz.xml` use used (where `zzz` is the name of the layout).
 
-The algorithm for determining whether an event is sent depends on the value of the \{@link org.apache.isis.applib.annotation.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 \{@link org.apache.isis.applib.annotation.ViewModelLayout#layoutUiEvent() @ViewModelLayout(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.
@@ -330,7 +406,7 @@ post-for-default
 |  true
 | Influences whether an should be published (on the internal `org.apache.isis.applib.services.eventbus.EventBusService) whenever a view model (annotated with @ViewModel) is about to be rendered in the UI - thereby allowing subscribers to optionally change) the title that is used.
 
-The algorithm for determining whether an event is sent depends on the value of the \{@link org.apache.isis.applib.annotation.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 \{@link org.apache.isis.applib.annotation.ViewModelLayout#titleUiEvent() @ViewModelLayout(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.
@@ -341,5 +417,6 @@ The algorithm for determining whether an event is sent depends on the value of t
 view-model.validation. +
 semantic-checking.enable
 | 
-| 
+| Whether to check for inconsistencies between the usage of \{@link org.apache.isis.applib.annotation.ViewModel, and \{@link org.apache.isis.applib.annotation.ViewModelLayout.
+
 
diff --git a/core/config/src/main/adoc/modules/config/examples/generated/isis.core.meta-model.adoc b/core/config/src/main/adoc/modules/config/examples/generated/isis.core.meta-model.adoc
index f0596d8..2fa09ad 100644
--- a/core/config/src/main/adoc/modules/config/examples/generated/isis.core.meta-model.adoc
+++ b/core/config/src/main/adoc/modules/config/examples/generated/isis.core.meta-model.adoc
@@ -1,11 +1,15 @@
 | isis.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.
+
 
 | isis.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/examples/generated/isis.core.meta-model.validator.adoc b/core/config/src/main/adoc/modules/config/examples/generated/isis.core.meta-model.validator.adoc
index 453ae53..fffd6f6 100644
--- a/core/config/src/main/adoc/modules/config/examples/generated/isis.core.meta-model.validator.adoc
+++ b/core/config/src/main/adoc/modules/config/examples/generated/isis.core.meta-model.validator.adoc
@@ -3,12 +3,18 @@ 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.
+
 
 | isis.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.
+
 
 | isis.core.meta-model. +
 validator.check-module-extent
@@ -19,13 +25,19 @@ validator.check-module-extent
 validator. +
 ensure-unique-object-types
 |  true
-| 
+| Whether to ensure that the object type of all objects (which can be set either explicitly using or `DomainService#objectType(), or can be inferred implicitly using a variety of mechanisms) must be unique with respect to all other object types.
+
+It is _highly advisable_ to leave this set as enabled (the default), and to also use explicit types (see \{@link #isExplicitObjectType()`.
+
 
 | isis.core.meta-model. +
 validator. +
 explicit-object-type
 | 
-| 
+| Whether to ensure that the object type of all objects must be specified explicitly, using either or `DomainService#objectType().
+
+It is _highly advisable_ to leave this set as enabled (the default). These object types should also (of course) be unique - that can be checked by setting the \{@link #isEnsureUniqueObjectTypes()` config property.
+
 
 | isis.core.meta-model. +
 validator.jaxb-view-model. +
@@ -71,7 +83,12 @@ variables-clause
 | isis.core.meta-model. +
 validator.no-params-only
 | 
-| 
+| If set, then checks that the supports `hideXxx` and `disableXxx` methods for actions do not have take parameters.
+
+Historically, the programming model allowed these methods to accept the same number of parameters as the action method to which they relate, the rationale being for similarity with the `validateXxx` method. However, since these parameters serve no function, the programming model has been simplified so that these supporting methods are discovered if they have exactly no parameters.
+
+Note that this aspect of the programming model relates to the `hideXxx` and `disableXxx` supporting methods that relate to the entire method. Do not confuse these with the `hideNXxx` and `disableNXxx` supporting methods, which relate to the N-th parameter, and allow up to N-1 parameters to be passed in (allowing the Nth parameter to be dynamically hidden or disabled).
+
 
 | isis.core.meta-model. +
 validator.parallelize
@@ -82,11 +99,13 @@ validator.parallelize
 | isis.core.meta-model. +
 validator.mixins-only
 |  true
-| 
+| If set, then domain services actions are not contributed to domain objects. @deprecated - in that in the future the programming model will simply not support contributed actions from domain services.
+
 
 | isis.core.meta-model. +
 validator. +
 service-actions-only
 |  true
-| 
+| If set, checks that any domain services have only actions associated with them, not properties or collections. @deprecated - in that in the future the programming model will simply not search for properties or collections of domain services.
+