You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@isis.apache.org by ah...@apache.org on 2019/01/10 07:41:19 UTC

[isis] branch 2033-IoC updated (94aea63 -> 595a8a0)

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

ahuber pushed a change to branch 2033-IoC
in repository https://gitbox.apache.org/repos/asf/isis.git.


    from 94aea63  cleanup previous merge
     add 15ae5b8  ISIS-1899: update docs - release process
     add 017eacb  ISIS-1899: updates docs for 1.17.0 release
     add 74a1c23  ISIS-1899: updates html template for 1.17.0
     add 53fc418  ISIS-1899: fixes some bad links
     add 7e573ad  ISIS-1899: updates to release notes and migration notes
     add 74f46ee  ISIS-1899: fixes index.html for 1.17.0
     add def829a  ISIS-2072: bumps core's parent to latest ASF version (21)
     add 3c2c5c6  ISIS-2078: extends @ActionLayout to allow modal vs sidebar promptStyle to be selected on an action-by-action basis
     add 7cc51fc  ISIS-2078: tidies up StandaloneCollectionPanel, no longer implements ActionPromptProvider
     add c6f8229  ISIS-2078: tidies up StandaloneCollectionPanel, removes unused div for modal dialog
     add 0d0a4a7  ISIS-2078: handles service actions (ie menu items) gracefully if there promptStyle is set to INLINE or INLINE_AS_IF_EDIT
     add 115c700  ISIS-2080: adds LayoutFacet with Method and Fallback implementations
     add f2841bc  ISIS-2080: adds GridService2 and GridLoaderService2 with support for loading different layouts
     add 3b90371  ISIS-2079: improves rebuildMetaModel mixin to return the object being rebuilt.
     add 37aeeeb  ISIS-2079: fixes rebuildMetaModel to return the mixee rather than itself (a mixin)
     add ee80c61  ISIS-2081: updates @ActionLayout and XML to allow redirect policy to be specified on a case-by-case basis.
     add 6b57899  ISIS-2080: updates docs for alternate layouts and also @ActionLayout#redirect
     add b7ebfb6  ISIS-2080: changes naming convention for alternative layout file name
     add c4bb64e  ISIS-2081: adds @DomainObjectLayout(layoutUiEvent=...)
     add 5fcad44  ISIS-2081: updates .adocs
     add 4573d5b  ISIS-2082: updates download.adoc, parameterize using __versions.adoc[].
     add 4a5363a  Merge branch 'master' into v2
     add 17ce576  fixes compile/unit test errors from merge.
     add ce55270  ISIS-2067: adds TODO to the migration-notes.adoc
     new 595a8a0  Merge remote-tracking branch 'apache/v2' into 2033-IoC

The 1 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:
 STATUS                                             |   4 +
 .../asciidoc/applib/layout/component/component.xsd |  12 ++
 .../documentation/src/main/asciidoc/doap_isis.rdf  |  48 ++++++
 .../cgcom/_cgcom_post-release-successful.adoc      |  23 +--
 .../rgant/_rgant-ActionLayout_bookmarking.adoc     |  15 +-
 .../guides/rgant/_rgant-ActionLayout_cssClass.adoc |  22 +--
 .../rgant/_rgant-ActionLayout_cssClassFa.adoc      |  21 +--
 .../rgant/_rgant-ActionLayout_describedAs.adoc     |  22 +--
 .../guides/rgant/_rgant-ActionLayout_hidden.adoc   |  31 ++--
 .../guides/rgant/_rgant-ActionLayout_named.adoc    |  29 ++--
 .../guides/rgant/_rgant-ActionLayout_position.adoc |  11 +-
 .../rgant/_rgant-ActionLayout_promptStyle.adoc     |  23 ++-
 .../guides/rgant/_rgant-ActionLayout_redirect.adoc |  62 ++++++++
 .../guides/rgant/_rgant-Action_hidden.adoc         |   9 +-
 .../guides/rgant/_rgant-Action_typeOf.adoc         |   8 +-
 .../rgant/_rgant-CollectionLayout_cssClass.adoc    |  16 +-
 .../rgant/_rgant-CollectionLayout_defaultView.adoc |  19 ++-
 .../rgant/_rgant-CollectionLayout_describedAs.adoc |  12 +-
 .../rgant/_rgant-CollectionLayout_hidden.adoc      |  32 ++--
 .../rgant/_rgant-CollectionLayout_named.adoc       |  36 ++---
 .../rgant/_rgant-CollectionLayout_paged.adoc       |  24 +--
 .../rgant/_rgant-CollectionLayout_sortedBy.adoc    |  14 +-
 .../guides/rgant/_rgant-Collection_editing.adoc    |  11 +-
 .../guides/rgant/_rgant-Collection_hidden.adoc     |  10 +-
 .../guides/rgant/_rgant-Collection_typeOf.adoc     |   6 +-
 .../guides/rgant/_rgant-DomainObjectLayout.adoc    |   6 +
 .../_rgant-DomainObjectLayout_bookmarking.adoc     |   3 +
 .../rgant/_rgant-DomainObjectLayout_cssClass.adoc  |  21 ++-
 .../_rgant-DomainObjectLayout_cssClassFa.adoc      |   9 +-
 .../_rgant-DomainObjectLayout_cssClassUiEvent.adoc |   4 +
 .../_rgant-DomainObjectLayout_describedAs.adoc     |  16 +-
 .../_rgant-DomainObjectLayout_iconUiEvent.adoc     |   7 +-
 .../_rgant-DomainObjectLayout_layoutUiEvent.adoc   | 114 ++++++++++++++
 .../rgant/_rgant-DomainObjectLayout_named.adoc     |  15 +-
 .../rgant/_rgant-DomainObjectLayout_paged.adoc     |   9 +-
 .../rgant/_rgant-DomainObjectLayout_plural.adoc    |   6 +-
 .../_rgant-DomainObjectLayout_titleUiEvent.adoc    |   5 +
 .../rgant/_rgant-DomainServiceLayout_named.adoc    |  13 +-
 .../guides/rgant/_rgant-DomainService_nature.adoc  |   9 +-
 .../rgant/_rgant-ParameterLayout_cssClass.adoc     |  13 +-
 .../_rgant-ParameterLayout_labelPosition.adoc      |  24 +--
 .../guides/rgant/_rgant-ParameterLayout_named.adoc |  14 +-
 .../guides/rgant/_rgant-Parameter_maxLength.adoc   |   8 +-
 .../rgant/_rgant-Parameter_regexPattern.adoc       |   7 +-
 .../rgant/_rgant-PropertyLayout_cssClass.adoc      |  26 ++--
 .../rgant/_rgant-PropertyLayout_describedAs.adoc   |  13 +-
 .../guides/rgant/_rgant-PropertyLayout_hidden.adoc |  35 ++---
 .../rgant/_rgant-PropertyLayout_labelPosition.adoc |  31 ++--
 .../rgant/_rgant-PropertyLayout_multiLine.adoc     |  20 +--
 .../guides/rgant/_rgant-PropertyLayout_named.adoc  |  38 ++---
 .../rgant/_rgant-PropertyLayout_promptStyle.adoc   |   1 -
 .../_rgant-PropertyLayout_renderedAsDayBefore.adoc |  13 +-
 .../rgant/_rgant-PropertyLayout_typicalLength.adoc |   4 +-
 .../guides/rgant/_rgant-Property_editing.adoc      |   8 +-
 .../guides/rgant/_rgant-Property_hidden.adoc       |  11 +-
 .../guides/rgant/_rgant-Property_maxLength.adoc    |  14 +-
 .../guides/rgant/_rgant-Property_regexPattern.adoc |  14 +-
 .../guides/rgant/_rgant-ViewModelLayout.adoc       |  27 +++-
 .../_rgant-ViewModelLayout_bookmarking.adoc}       |  10 +-
 .../rgant/_rgant-ViewModelLayout_cssClass.adoc     |  21 +--
 .../rgant/_rgant-ViewModelLayout_cssClassFa.adoc   |  30 +---
 ...=> _rgant-ViewModelLayout_cssClassUiEvent.adoc} |  14 +-
 .../rgant/_rgant-ViewModelLayout_describedAs.adoc  |  16 +-
 .../_rgant-ViewModelLayout_iconUiEvent.adoc}       |  24 +--
 ...c => _rgant-ViewModelLayout_layoutUiEvent.adoc} |  14 +-
 .../guides/rgant/_rgant-ViewModelLayout_named.adoc |  28 +---
 .../guides/rgant/_rgant-ViewModelLayout_paged.adoc |  28 +---
 .../rgant/_rgant-ViewModelLayout_plural.adoc       |  13 +-
 .../_rgant-ViewModelLayout_titleUiEvent.adoc}      |  11 +-
 .../guides/rgcfg/_rgcfg_configuring-core.adoc      |  36 +++++
 .../guides/rgcms/_rgcms_methods_reserved.adoc      |  14 +-
 .../rgcms/_rgcms_methods_reserved_cssClass.adoc    |  14 +-
 .../guides/rgcms/_rgcms_methods_reserved_hide.adoc |   3 +-
 .../rgcms/_rgcms_methods_reserved_iconName.adoc    |  20 ++-
 .../rgcms/_rgcms_methods_reserved_layout.adoc      |  48 ++++++
 .../rgcms/_rgcms_methods_reserved_title.adoc       |  23 +--
 .../guides/ugvro/_ugvro_layout-resources.adoc      |   4 +-
 .../guides/ugvw/_ugvw_layout_file-based.adoc       | 107 +++++++------
 .../guides/ugvw/images/layouts/customer-order.png  | Bin 6026 -> 5981 bytes
 adocs/documentation/src/main/asciidoc/index.html   |   7 +-
 .../_migration-notes_1.16.0-to-1.17.0.adoc         |  29 +++-
 .../release-notes/_release-notes_1.17.0.adoc       |  88 ++++++++++-
 .../main/asciidoc/release-notes/release-notes.adoc |  12 +-
 .../org/apache/isis/applib/IsisApplibModule.java   |   4 +
 .../isis/applib/annotation/ActionLayout.java       |   8 +
 .../isis/applib/annotation/DomainObjectLayout.java |  14 +-
 .../apache/isis/applib/annotation/PromptStyle.java |  18 ++-
 .../{BookmarkPolicy.java => Redirect.java}         |  34 +++--
 .../isis/applib/annotation/ViewModelLayout.java    |  52 ++++++-
 .../isis/applib/domain/DomainObjectList.java       |   4 +-
 .../applib/layout/component/ActionLayoutData.java  |  14 ++
 .../mixins/layout/Object_rebuildMetamodel.java     |   3 +-
 .../eventbus/LayoutUiEvent.java}                   |  55 +++----
 ...dLoaderService.java => GridLoaderService2.java} |  21 +--
 .../CommandWithDto.java => grid/GridService2.java} |  20 +--
 .../actions/layout/ActionLayoutFacetFactory.java   |  10 ++
 ...> RedirectFacetFromActionLayoutAnnotation.java} |  24 ++-
 ...ionXml.java => RedirectFacetFromActionXml.java} |  19 +--
 .../redirect/RedirectFacet.java}                   |  10 +-
 .../RedirectFacetAbstract.java}                    |  33 ++--
 .../redirect/RedirectFacetFallback.java}           |   9 +-
 ...ModelLayoutAnnotationUsingCssClassUiEvent.java} |  29 ++--
 .../DomainObjectLayoutFacetFactory.java            |  18 +++
 ...ViewModelLayoutAnnotationUsingIconUiEvent.java} |  29 ++--
 ...nObjectLayoutAnnotationUsingLayoutUiEvent.java} |  82 +++++-----
 ...iewModelLayoutAnnotationUsingLayoutUiEvent.java | 119 +++++++++++++++
 ...iewModelLayoutAnnotationUsingTitleUiEvent.java} |  41 +++--
 .../metamodel/facets/object/grid/GridFacet.java    |   3 +-
 .../facets/object/grid/GridFacetDefault.java       |  21 +--
 .../facets/object/grid/GridFacetFactory.java       |   4 +-
 .../layout/LayoutFacet.java}                       |  21 +--
 .../layout/LayoutFacetAbstract.java}               |  13 +-
 .../LayoutFacetFactory.java}                       |  22 +--
 .../layout/LayoutFacetFallback.java}               |  17 ++-
 .../LayoutFacetMethod.java}                        |  14 +-
 .../services/grid/GridLoaderServiceDefault.java    | 167 ++++++++++++++-------
 .../services/grid/GridServiceDefault.java          |  14 +-
 .../services/grid/GridSystemServiceAbstract.java   |   2 +
 .../services/layout/LayoutServiceDefault.java      |   2 +-
 .../dflt/ProgrammingModelFacetsJava5.java          |   2 +
 .../DomainObjectLayoutFactoryTest.java             |   2 +-
 .../LayoutFacetFactoryTest.java}                   |  28 ++--
 .../LayoutFacetMethodTest.java}                    |  28 ++--
 ...dLoaderServiceDefault_resourceNameFor_Test.java |   8 +-
 .../SpecificationLoaderTestAbstract.java           |   8 +-
 core/pom.xml                                       |   2 +-
 .../resources/DomainObjectResourceServerside.java  |   3 +-
 .../resources/DomainTypeResourceServerside.java    |   2 +-
 .../wicket/model/models/ActionPromptProvider.java  |   7 +-
 .../CollectionContentsAsAjaxTablePanel.java        |   7 +-
 .../links/EntityLinksSelectorPanelFactory.java     |   4 +-
 .../components/scalars/ScalarPanelAbstract2.java   |   7 +-
 .../StandaloneCollectionPanel.html                 |   2 -
 .../StandaloneCollectionPanel.java                 |  17 +--
 .../linkandlabel/ActionLinkFactoryAbstract.java    |  13 +-
 .../isis/viewer/wicket/ui/pages/PageAbstract.java  |  22 ++-
 .../viewer/wicket/ui/pages/entity/EntityPage.java  |   2 +-
 .../wicket/ui/panels/FormExecutorDefault.java      |  54 +++++--
 .../wicket/ui/panels/PromptFormAbstract.java       |  39 +++--
 migration-notes.adoc                               |  10 ++
 140 files changed, 1875 insertions(+), 1054 deletions(-)
 create mode 100644 adocs/documentation/src/main/asciidoc/guides/rgant/_rgant-ActionLayout_redirect.adoc
 create mode 100644 adocs/documentation/src/main/asciidoc/guides/rgant/_rgant-DomainObjectLayout_layoutUiEvent.adoc
 copy adocs/documentation/src/main/asciidoc/guides/{rgcms/_rgcms_classes_i18n_TranslatableString.adoc => rgant/_rgant-ViewModelLayout_bookmarking.adoc} (72%)
 copy adocs/documentation/src/main/asciidoc/guides/rgant/{_rgant_aaa.adoc => _rgant-ViewModelLayout_cssClassUiEvent.adoc} (57%)
 copy adocs/documentation/src/main/asciidoc/guides/{dg/_dg_hints-and-tips_enhance-only.adoc => rgant/_rgant-ViewModelLayout_iconUiEvent.adoc} (52%)
 copy adocs/documentation/src/main/asciidoc/guides/rgant/{_rgant_aaa.adoc => _rgant-ViewModelLayout_layoutUiEvent.adoc} (58%)
 copy adocs/documentation/src/main/asciidoc/guides/{rgcms/_rgcms_classes_contributee.adoc => rgant/_rgant-ViewModelLayout_titleUiEvent.adoc} (60%)
 create mode 100644 adocs/documentation/src/main/asciidoc/guides/rgcms/_rgcms_methods_reserved_layout.adoc
 copy core/applib/src/main/java/org/apache/isis/applib/annotation/{BookmarkPolicy.java => Redirect.java} (60%)
 copy core/applib/src/main/java/org/apache/isis/applib/{events/ui/CssClassUiEvent.java => services/eventbus/LayoutUiEvent.java} (62%)
 copy core/applib/src/main/java/org/apache/isis/applib/services/grid/{GridLoaderService.java => GridLoaderService2.java} (68%)
 copy core/applib/src/main/java/org/apache/isis/applib/services/{command/CommandWithDto.java => grid/GridService2.java} (67%)
 copy core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/layout/{NamedFacetForActionLayoutAnnotation.java => RedirectFacetFromActionLayoutAnnotation.java} (61%)
 copy core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/layout/{CssClassFacetForActionXml.java => RedirectFacetFromActionXml.java} (62%)
 copy core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/{object/paged/PagedFacet.java => actions/redirect/RedirectFacet.java} (77%)
 copy core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/{position/ActionPositionFacetAbstract.java => redirect/RedirectFacetAbstract.java} (61%)
 copy core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/{actcoll/typeof/TypeOfFacetDefaultToObject.java => actions/redirect/RedirectFacetFallback.java} (75%)
 copy core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobjectlayout/{CssClassFacetViaDomainObjectLayoutAnnotationUsingCssClassUiEvent.java => CssClassFacetViaViewModelLayoutAnnotationUsingCssClassUiEvent.java} (82%)
 copy core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobjectlayout/{IconFacetViaDomainObjectLayoutAnnotationUsingIconUiEvent.java => IconFacetViaViewModelLayoutAnnotationUsingIconUiEvent.java} (80%)
 copy core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobjectlayout/{IconFacetViaDomainObjectLayoutAnnotationUsingIconUiEvent.java => LayoutFacetViaDomainObjectLayoutAnnotationUsingLayoutUiEvent.java} (51%)
 create mode 100644 core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobjectlayout/LayoutFacetViaViewModelLayoutAnnotationUsingLayoutUiEvent.java
 copy core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobjectlayout/{TitleFacetViaDomainObjectLayoutAnnotationUsingTitleUiEvent.java => TitleFacetViaViewModelLayoutAnnotationUsingTitleUiEvent.java} (80%)
 copy core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/{actions/homepage/HomePageFacet.java => object/layout/LayoutFacet.java} (69%)
 copy core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/{actions/notinservicemenu/NotInServiceMenuFacetAbstract.java => object/layout/LayoutFacetAbstract.java} (74%)
 copy core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/{cssclass/method/CssClassFacetMethodFactory.java => layout/LayoutFacetFactory.java} (72%)
 copy core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/{fallback/TitleFacetNone.java => object/layout/LayoutFacetFallback.java} (69%)
 copy core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/{icon/method/IconFacetMethod.java => layout/LayoutFacetMethod.java} (80%)
 copy core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/object/ident/{icon/IconFacetMethodFactoryTest.java => layout/LayoutFacetFactoryTest.java} (68%)
 copy core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/object/ident/{icon/IconFacetMethodTest.java => layout/LayoutFacetMethodTest.java} (71%)


[isis] 01/01: Merge remote-tracking branch 'apache/v2' into 2033-IoC

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

ahuber pushed a commit to branch 2033-IoC
in repository https://gitbox.apache.org/repos/asf/isis.git

commit 595a8a0b64dbee4561aa19d090afa993f2458134
Merge: 94aea63 ce55270
Author: Andi Huber <ah...@apache.org>
AuthorDate: Thu Jan 10 08:41:11 2019 +0100

    Merge remote-tracking branch 'apache/v2' into 2033-IoC
    
    Conflicts:
    	core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobjectlayout/DomainObjectLayoutFacetFactory.java
    	core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/grid/GridFacetFactory.java
    	core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/grid/GridLoaderServiceDefault.java
    	core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/grid/GridServiceDefault.java
    	core/metamodel/src/test/java/org/apache/isis/core/metamodel/specloader/SpecificationLoaderTestAbstract.java
    	core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/pages/PageAbstract.java

 STATUS                                             |   4 +
 .../asciidoc/applib/layout/component/component.xsd |  12 ++
 .../documentation/src/main/asciidoc/doap_isis.rdf  |  48 ++++++
 .../cgcom/_cgcom_post-release-successful.adoc      |  23 +--
 .../rgant/_rgant-ActionLayout_bookmarking.adoc     |  15 +-
 .../guides/rgant/_rgant-ActionLayout_cssClass.adoc |  22 +--
 .../rgant/_rgant-ActionLayout_cssClassFa.adoc      |  21 +--
 .../rgant/_rgant-ActionLayout_describedAs.adoc     |  22 +--
 .../guides/rgant/_rgant-ActionLayout_hidden.adoc   |  31 ++--
 .../guides/rgant/_rgant-ActionLayout_named.adoc    |  29 ++--
 .../guides/rgant/_rgant-ActionLayout_position.adoc |  11 +-
 .../rgant/_rgant-ActionLayout_promptStyle.adoc     |  23 ++-
 .../guides/rgant/_rgant-ActionLayout_redirect.adoc |  62 ++++++++
 .../guides/rgant/_rgant-Action_hidden.adoc         |   9 +-
 .../guides/rgant/_rgant-Action_typeOf.adoc         |   8 +-
 .../rgant/_rgant-CollectionLayout_cssClass.adoc    |  16 +-
 .../rgant/_rgant-CollectionLayout_defaultView.adoc |  19 ++-
 .../rgant/_rgant-CollectionLayout_describedAs.adoc |  12 +-
 .../rgant/_rgant-CollectionLayout_hidden.adoc      |  32 ++--
 .../rgant/_rgant-CollectionLayout_named.adoc       |  36 ++---
 .../rgant/_rgant-CollectionLayout_paged.adoc       |  24 +--
 .../rgant/_rgant-CollectionLayout_sortedBy.adoc    |  14 +-
 .../guides/rgant/_rgant-Collection_editing.adoc    |  11 +-
 .../guides/rgant/_rgant-Collection_hidden.adoc     |  10 +-
 .../guides/rgant/_rgant-Collection_typeOf.adoc     |   6 +-
 .../guides/rgant/_rgant-DomainObjectLayout.adoc    |   6 +
 .../_rgant-DomainObjectLayout_bookmarking.adoc     |   3 +
 .../rgant/_rgant-DomainObjectLayout_cssClass.adoc  |  21 ++-
 .../_rgant-DomainObjectLayout_cssClassFa.adoc      |   9 +-
 .../_rgant-DomainObjectLayout_cssClassUiEvent.adoc |   4 +
 .../_rgant-DomainObjectLayout_describedAs.adoc     |  16 +-
 .../_rgant-DomainObjectLayout_iconUiEvent.adoc     |   7 +-
 .../_rgant-DomainObjectLayout_layoutUiEvent.adoc   | 114 ++++++++++++++
 .../rgant/_rgant-DomainObjectLayout_named.adoc     |  15 +-
 .../rgant/_rgant-DomainObjectLayout_paged.adoc     |   9 +-
 .../rgant/_rgant-DomainObjectLayout_plural.adoc    |   6 +-
 .../_rgant-DomainObjectLayout_titleUiEvent.adoc    |   5 +
 .../rgant/_rgant-DomainServiceLayout_named.adoc    |  13 +-
 .../guides/rgant/_rgant-DomainService_nature.adoc  |   9 +-
 .../rgant/_rgant-ParameterLayout_cssClass.adoc     |  13 +-
 .../_rgant-ParameterLayout_labelPosition.adoc      |  24 +--
 .../guides/rgant/_rgant-ParameterLayout_named.adoc |  14 +-
 .../guides/rgant/_rgant-Parameter_maxLength.adoc   |   8 +-
 .../rgant/_rgant-Parameter_regexPattern.adoc       |   7 +-
 .../rgant/_rgant-PropertyLayout_cssClass.adoc      |  26 ++--
 .../rgant/_rgant-PropertyLayout_describedAs.adoc   |  13 +-
 .../guides/rgant/_rgant-PropertyLayout_hidden.adoc |  35 ++---
 .../rgant/_rgant-PropertyLayout_labelPosition.adoc |  31 ++--
 .../rgant/_rgant-PropertyLayout_multiLine.adoc     |  20 +--
 .../guides/rgant/_rgant-PropertyLayout_named.adoc  |  38 ++---
 .../rgant/_rgant-PropertyLayout_promptStyle.adoc   |   1 -
 .../_rgant-PropertyLayout_renderedAsDayBefore.adoc |  13 +-
 .../rgant/_rgant-PropertyLayout_typicalLength.adoc |   4 +-
 .../guides/rgant/_rgant-Property_editing.adoc      |   8 +-
 .../guides/rgant/_rgant-Property_hidden.adoc       |  11 +-
 .../guides/rgant/_rgant-Property_maxLength.adoc    |  14 +-
 .../guides/rgant/_rgant-Property_regexPattern.adoc |  14 +-
 .../guides/rgant/_rgant-ViewModelLayout.adoc       |  27 +++-
 .../rgant/_rgant-ViewModelLayout_bookmarking.adoc} |  22 +--
 .../rgant/_rgant-ViewModelLayout_cssClass.adoc     |  21 +--
 .../rgant/_rgant-ViewModelLayout_cssClassFa.adoc   |  30 +---
 .../_rgant-ViewModelLayout_cssClassUiEvent.adoc}   |  24 +--
 .../rgant/_rgant-ViewModelLayout_describedAs.adoc  |  16 +-
 ...doc => _rgant-ViewModelLayout_iconUiEvent.adoc} |  28 +---
 .../_rgant-ViewModelLayout_layoutUiEvent.adoc}     |  24 +--
 .../guides/rgant/_rgant-ViewModelLayout_named.adoc |  28 +---
 .../guides/rgant/_rgant-ViewModelLayout_paged.adoc |  28 +---
 .../rgant/_rgant-ViewModelLayout_plural.adoc       |  13 +-
 .../_rgant-ViewModelLayout_titleUiEvent.adoc}      |  24 +--
 .../guides/rgcfg/_rgcfg_configuring-core.adoc      |  36 +++++
 .../guides/rgcms/_rgcms_methods_reserved.adoc      |  14 +-
 .../rgcms/_rgcms_methods_reserved_cssClass.adoc    |  14 +-
 .../guides/rgcms/_rgcms_methods_reserved_hide.adoc |   3 +-
 .../rgcms/_rgcms_methods_reserved_iconName.adoc    |  20 ++-
 .../rgcms/_rgcms_methods_reserved_layout.adoc      |  48 ++++++
 .../rgcms/_rgcms_methods_reserved_title.adoc       |  23 +--
 .../guides/ugvro/_ugvro_layout-resources.adoc      |   4 +-
 .../guides/ugvw/_ugvw_layout_file-based.adoc       | 107 +++++++------
 .../guides/ugvw/images/layouts/customer-order.png  | Bin 6026 -> 5981 bytes
 adocs/documentation/src/main/asciidoc/index.html   |   7 +-
 .../_migration-notes_1.16.0-to-1.17.0.adoc         |  29 +++-
 .../release-notes/_release-notes_1.17.0.adoc       |  88 ++++++++++-
 .../main/asciidoc/release-notes/release-notes.adoc |  12 +-
 .../org/apache/isis/applib/IsisApplibModule.java   |   4 +
 .../isis/applib/annotation/ActionLayout.java       |   8 +
 .../isis/applib/annotation/DomainObjectLayout.java |  14 +-
 .../apache/isis/applib/annotation/PromptStyle.java |  18 ++-
 .../apache/isis/applib/annotation/Redirect.java    |  49 ++++++
 .../isis/applib/annotation/ViewModelLayout.java    |  52 ++++++-
 .../isis/applib/domain/DomainObjectList.java       |   4 +-
 .../applib/layout/component/ActionLayoutData.java  |  14 ++
 .../mixins/layout/Object_rebuildMetamodel.java     |   3 +-
 .../applib/services/eventbus/LayoutUiEvent.java    | 103 +++++++++++++
 .../applib/services/grid/GridLoaderService2.java   |  31 ++++
 .../isis/applib/services/grid/GridService2.java    |  32 ++++
 .../actions/layout/ActionLayoutFacetFactory.java   |  10 ++
 .../RedirectFacetFromActionLayoutAnnotation.java   |  45 ++++++
 .../actions/layout/RedirectFacetFromActionXml.java |  43 ++++++
 .../redirect/RedirectFacet.java}                   |  21 +--
 .../actions/redirect/RedirectFacetAbstract.java    |  66 ++++++++
 .../redirect/RedirectFacetFallback.java}           |  25 +--
 ...wModelLayoutAnnotationUsingCssClassUiEvent.java | 119 +++++++++++++++
 .../DomainObjectLayoutFacetFactory.java            |  18 +++
 ...aViewModelLayoutAnnotationUsingIconUiEvent.java | 120 +++++++++++++++
 ...inObjectLayoutAnnotationUsingLayoutUiEvent.java | 119 +++++++++++++++
 ...iewModelLayoutAnnotationUsingLayoutUiEvent.java | 119 +++++++++++++++
 ...ViewModelLayoutAnnotationUsingTitleUiEvent.java | 140 +++++++++++++++++
 .../metamodel/facets/object/grid/GridFacet.java    |   3 +-
 .../facets/object/grid/GridFacetDefault.java       |  21 +--
 .../facets/object/grid/GridFacetFactory.java       |   4 +-
 .../GridFacet.java => layout/LayoutFacet.java}     |  29 ++--
 .../LayoutFacetAbstract.java}                      |  33 ++--
 .../facets/object/layout/LayoutFacetFactory.java   |  57 +++++++
 .../LayoutFacetFallback.java}                      |  37 ++---
 .../facets/object/layout/LayoutFacetMethod.java    |  55 +++++++
 .../services/grid/GridLoaderServiceDefault.java    | 167 ++++++++++++++-------
 .../services/grid/GridServiceDefault.java          |  14 +-
 .../services/grid/GridSystemServiceAbstract.java   |   2 +
 .../services/layout/LayoutServiceDefault.java      |   2 +-
 .../dflt/ProgrammingModelFacetsJava5.java          |   2 +
 .../DomainObjectLayoutFactoryTest.java             |   2 +-
 .../ident/layout/LayoutFacetFactoryTest.java       |  71 +++++++++
 .../object/ident/layout/LayoutFacetMethodTest.java |  84 +++++++++++
 ...dLoaderServiceDefault_resourceNameFor_Test.java |   8 +-
 .../SpecificationLoaderTestAbstract.java           |   8 +-
 core/pom.xml                                       |   2 +-
 .../resources/DomainObjectResourceServerside.java  |   3 +-
 .../resources/DomainTypeResourceServerside.java    |   2 +-
 .../wicket/model/models/ActionPromptProvider.java  |   7 +-
 .../CollectionContentsAsAjaxTablePanel.java        |   7 +-
 .../links/EntityLinksSelectorPanelFactory.java     |   4 +-
 .../components/scalars/ScalarPanelAbstract2.java   |   7 +-
 .../StandaloneCollectionPanel.html                 |   2 -
 .../StandaloneCollectionPanel.java                 |  17 +--
 .../linkandlabel/ActionLinkFactoryAbstract.java    |  13 +-
 .../isis/viewer/wicket/ui/pages/PageAbstract.java  |  22 ++-
 .../viewer/wicket/ui/pages/entity/EntityPage.java  |   2 +-
 .../wicket/ui/panels/FormExecutorDefault.java      |  54 +++++--
 .../wicket/ui/panels/PromptFormAbstract.java       |  39 +++--
 migration-notes.adoc                               |  10 ++
 140 files changed, 2801 insertions(+), 907 deletions(-)

diff --cc core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobjectlayout/CssClassFacetViaViewModelLayoutAnnotationUsingCssClassUiEvent.java
index 0000000,58cf372..88a9ecd
mode 000000,100644..100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobjectlayout/CssClassFacetViaViewModelLayoutAnnotationUsingCssClassUiEvent.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobjectlayout/CssClassFacetViaViewModelLayoutAnnotationUsingCssClassUiEvent.java
@@@ -1,0 -1,119 +1,119 @@@
+ /*
+  *  Licensed to the Apache Software Foundation (ASF) under one
+  *  or more contributor license agreements.  See the NOTICE file
+  *  distributed with this work for additional information
+  *  regarding copyright ownership.  The ASF licenses this file
+  *  to you under the Apache License, Version 2.0 (the
+  *  "License"); you may not use this file except in compliance
+  *  with the License.  You may obtain a copy of the License at
+  *
+  *        http://www.apache.org/licenses/LICENSE-2.0
+  *
+  *  Unless required by applicable law or agreed to in writing,
+  *  software distributed under the License is distributed on an
+  *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+  *  KIND, either express or implied.  See the License for the
+  *  specific language governing permissions and limitations
+  *  under the License.
+  */
+ 
+ package org.apache.isis.core.metamodel.facets.object.domainobjectlayout;
+ 
+ import java.util.List;
+ import java.util.Map;
+ 
+ import org.apache.isis.applib.NonRecoverableException;
+ import org.apache.isis.applib.annotation.ViewModelLayout;
+ import org.apache.isis.applib.events.ui.CssClassUiEvent;
+ import org.apache.isis.applib.services.eventbus.EventBusService;
++import org.apache.isis.applib.services.inject.ServiceInjector;
+ import org.apache.isis.commons.internal.base._Casts;
+ import org.apache.isis.config.IsisConfiguration;
+ import org.apache.isis.core.metamodel.facetapi.Facet;
+ import org.apache.isis.core.metamodel.facetapi.FacetAbstract;
+ import org.apache.isis.core.metamodel.facetapi.FacetHolder;
+ import org.apache.isis.core.metamodel.facets.members.cssclass.CssClassFacet;
+ import org.apache.isis.core.metamodel.facets.members.cssclass.CssClassFacetAbstract;
 -import org.apache.isis.core.metamodel.services.ServicesInjector;
+ import org.apache.isis.core.metamodel.spec.ManagedObject;
+ import org.apache.isis.core.metamodel.util.EventUtil;
+ 
+ public class CssClassFacetViaViewModelLayoutAnnotationUsingCssClassUiEvent extends FacetAbstract implements
+         CssClassFacet {
+ 
+     //private static final Logger LOG = LoggerFactory.getLogger(CssClassFacetViaViewModelLayoutAnnotationUsingCssClassUiEvent.class);
+ 
+     public static Facet create(
+             final List<ViewModelLayout> viewModelLayouts,
 -            final ServicesInjector servicesInjector,
++            final ServiceInjector serviceInjector,
+             final IsisConfiguration configuration, final FacetHolder facetHolder) {
+ 
+         return viewModelLayouts.stream()
+                 .map(ViewModelLayout::cssClassUiEvent)
+                 .filter(cssClassUiEventClass -> EventUtil.eventTypeIsPostable(
+                         cssClassUiEventClass,
+                         CssClassUiEvent.Noop.class,
+                         CssClassUiEvent.Default.class,
+                         "isis.reflector.facet.viewModelLayoutAnnotation.cssClassUiEvent.postForDefault",
+                         configuration))
+                 .findFirst()
+                 .map(cssClassUiEventClass -> {
 -                    final EventBusService eventBusService = servicesInjector.lookupServiceElseFail(EventBusService.class);
++                    final EventBusService eventBusService = serviceInjector.lookupServiceElseFail(EventBusService.class);
+                     return new CssClassFacetViaViewModelLayoutAnnotationUsingCssClassUiEvent(
+                             cssClassUiEventClass, eventBusService, facetHolder);
+                 })
+                 .orElse(null);
+     }
+ 
+     private final Class<? extends CssClassUiEvent<?>> cssClassUiEventClass;
+     private final EventBusService eventBusService;
+ 
+     public CssClassFacetViaViewModelLayoutAnnotationUsingCssClassUiEvent(
+             final Class<? extends CssClassUiEvent<?>> cssClassUiEventClass,
+             final EventBusService eventBusService,
+             final FacetHolder holder) {
+         super(CssClassFacetAbstract.type(), holder, Derivation.NOT_DERIVED);
+         this.cssClassUiEventClass = cssClassUiEventClass;
+         this.eventBusService = eventBusService;
+     }
+ 
+     @Override
+     public String cssClass(final ManagedObject owningAdapter) {
+ 
+         final CssClassUiEvent<Object> cssClassUiEvent = newCssClassUiEvent(owningAdapter);
+ 
+         eventBusService.post(cssClassUiEvent);
+ 
+         final String cssClass = cssClassUiEvent.getCssClass();
+ 
+         if(cssClass == null) {
+             // ie no subscribers out there...
+             final Facet underlyingFacet = getUnderlyingFacet();
+             if(underlyingFacet instanceof CssClassFacet) {
+                 final CssClassFacet underlyingCssClassFacet = (CssClassFacet) underlyingFacet;
+                 return underlyingCssClassFacet.cssClass(owningAdapter);
+             }
+         }
+ 
+         return cssClass;
+     }
+ 
+     private CssClassUiEvent<Object> newCssClassUiEvent(final ManagedObject owningAdapter) {
+         final Object domainObject = owningAdapter.getPojo();
+         return newCssClassUiEventForPojo(domainObject);
+     }
+ 
+     private CssClassUiEvent<Object> newCssClassUiEventForPojo(final Object domainObject) {
+         try {
+             final CssClassUiEvent<Object> cssClassUiEvent = _Casts.uncheckedCast(cssClassUiEventClass.newInstance());
+             cssClassUiEvent.setSource(domainObject);
+             return cssClassUiEvent;
+         } catch (InstantiationException | IllegalAccessException ex) {
+             throw new NonRecoverableException(ex);
+         }
+     }
+ 
+     @Override public void appendAttributesTo(final Map<String, Object> attributeMap) {
+         super.appendAttributesTo(attributeMap);
+         attributeMap.put("cssClassUiEventClass", cssClassUiEventClass);
+     }
+ }
diff --cc core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobjectlayout/DomainObjectLayoutFacetFactory.java
index 7af8f81,91addcd..c769757
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobjectlayout/DomainObjectLayoutFacetFactory.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobjectlayout/DomainObjectLayoutFacetFactory.java
@@@ -44,13 -44,31 +44,31 @@@ public class DomainObjectLayoutFacetFac
  
          FacetUtil.addFacet(
                  TitleFacetViaDomainObjectLayoutAnnotationUsingTitleUiEvent.create(
 -                        domainObjectLayouts, servicesInjector, getConfiguration(), facetHolder));
 +                        domainObjectLayouts, getServiceInjector(), getConfiguration(), facetHolder));
          FacetUtil.addFacet(
+                 TitleFacetViaViewModelLayoutAnnotationUsingTitleUiEvent.create(
 -                        viewModelLayouts, servicesInjector, getConfiguration(), facetHolder));
++                        viewModelLayouts, getServiceInjector(), getConfiguration(), facetHolder));
+ 
+         FacetUtil.addFacet(
                  IconFacetViaDomainObjectLayoutAnnotationUsingIconUiEvent.create(
 -                        domainObjectLayouts, servicesInjector, getConfiguration(), facetHolder));
 +                        domainObjectLayouts, getServiceInjector(), getConfiguration(), facetHolder));
          FacetUtil.addFacet(
+                 IconFacetViaViewModelLayoutAnnotationUsingIconUiEvent.create(
 -                        viewModelLayouts, servicesInjector, getConfiguration(), facetHolder));
++                        viewModelLayouts, getServiceInjector(), getConfiguration(), facetHolder));
+ 
+         FacetUtil.addFacet(
                  CssClassFacetViaDomainObjectLayoutAnnotationUsingCssClassUiEvent.create(
 -                        domainObjectLayouts, servicesInjector, getConfiguration(), facetHolder));
 +                        domainObjectLayouts, getServiceInjector(), getConfiguration(), facetHolder));
+         FacetUtil.addFacet(
+                 CssClassFacetViaViewModelLayoutAnnotationUsingCssClassUiEvent.create(
 -                        viewModelLayouts, servicesInjector, getConfiguration(), facetHolder));
++                        viewModelLayouts, getServiceInjector(), getConfiguration(), facetHolder));
+ 
+         FacetUtil.addFacet(
+                 LayoutFacetViaDomainObjectLayoutAnnotationUsingLayoutUiEvent.create(
 -                        domainObjectLayouts, servicesInjector, getConfiguration(), facetHolder));
++                        domainObjectLayouts, getServiceInjector(), getConfiguration(), facetHolder));
+         FacetUtil.addFacet(
+                 LayoutFacetViaViewModelLayoutAnnotationUsingLayoutUiEvent.create(
 -                        viewModelLayouts, servicesInjector, getConfiguration(), facetHolder));
++                        viewModelLayouts, getServiceInjector(), getConfiguration(), facetHolder));
  
          FacetUtil.addFacet(
                  CssClassFacetForDomainObjectLayoutAnnotation.create(domainObjectLayouts, facetHolder));
diff --cc core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobjectlayout/IconFacetViaViewModelLayoutAnnotationUsingIconUiEvent.java
index 0000000,abe591f..f877d73
mode 000000,100644..100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobjectlayout/IconFacetViaViewModelLayoutAnnotationUsingIconUiEvent.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobjectlayout/IconFacetViaViewModelLayoutAnnotationUsingIconUiEvent.java
@@@ -1,0 -1,120 +1,120 @@@
+ /*
+  *  Licensed to the Apache Software Foundation (ASF) under one
+  *  or more contributor license agreements.  See the NOTICE file
+  *  distributed with this work for additional information
+  *  regarding copyright ownership.  The ASF licenses this file
+  *  to you under the Apache License, Version 2.0 (the
+  *  "License"); you may not use this file except in compliance
+  *  with the License.  You may obtain a copy of the License at
+  *
+  *        http://www.apache.org/licenses/LICENSE-2.0
+  *
+  *  Unless required by applicable law or agreed to in writing,
+  *  software distributed under the License is distributed on an
+  *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+  *  KIND, either express or implied.  See the License for the
+  *  specific language governing permissions and limitations
+  *  under the License.
+  */
+ 
+ package org.apache.isis.core.metamodel.facets.object.domainobjectlayout;
+ 
+ import java.util.List;
+ import java.util.Map;
+ 
+ import org.apache.isis.applib.NonRecoverableException;
+ import org.apache.isis.applib.annotation.ViewModelLayout;
+ import org.apache.isis.applib.events.ui.IconUiEvent;
+ import org.apache.isis.applib.services.eventbus.EventBusService;
++import org.apache.isis.applib.services.inject.ServiceInjector;
+ import org.apache.isis.commons.internal.base._Casts;
+ import org.apache.isis.config.IsisConfiguration;
+ import org.apache.isis.core.metamodel.facetapi.Facet;
+ import org.apache.isis.core.metamodel.facetapi.FacetHolder;
+ import org.apache.isis.core.metamodel.facets.object.icon.IconFacet;
+ import org.apache.isis.core.metamodel.facets.object.icon.IconFacetAbstract;
 -import org.apache.isis.core.metamodel.services.ServicesInjector;
+ import org.apache.isis.core.metamodel.spec.ManagedObject;
+ import org.apache.isis.core.metamodel.util.EventUtil;
+ 
+ public class IconFacetViaViewModelLayoutAnnotationUsingIconUiEvent extends IconFacetAbstract {
+ 
+     //private static final Logger LOG = LoggerFactory.getLogger(IconFacetViaViewModelLayoutAnnotationUsingIconUiEvent.class);
+ 
+     public static Facet create(
+             final List<ViewModelLayout> viewModelLayouts,
 -            final ServicesInjector servicesInjector,
++            final ServiceInjector serviceInjector,
+             final IsisConfiguration configuration, final FacetHolder facetHolder) {
+ 
+         return viewModelLayouts.stream()
+                 .map(ViewModelLayout::iconUiEvent)
+                 .filter(iconUiEvent -> EventUtil.eventTypeIsPostable(
+                         iconUiEvent,
+                         IconUiEvent.Noop.class,
+                         IconUiEvent.Default.class,
+                         "isis.reflector.facet.viewModelLayoutAnnotation.iconUiEvent.postForDefault",
+                         configuration))
+                 .findFirst()
+                 .map(iconUiEvent -> {
+ 
 -                    final EventBusService eventBusService = servicesInjector.lookupServiceElseFail(EventBusService.class);
++                    final EventBusService eventBusService = serviceInjector.lookupServiceElseFail(EventBusService.class);
+ 
+                     return new IconFacetViaViewModelLayoutAnnotationUsingIconUiEvent(
+                             iconUiEvent, eventBusService, facetHolder);
+                 })
+                 .orElse(null);
+     }
+ 
+     private final Class<? extends IconUiEvent<?>> iconUiEventClass;
+     private final EventBusService eventBusService;
+ 
+     public IconFacetViaViewModelLayoutAnnotationUsingIconUiEvent(
+             final Class<? extends IconUiEvent<?>> iconUiEventClass,
+             final EventBusService eventBusService,
+             final FacetHolder holder) {
+         super(holder);
+         this.iconUiEventClass = iconUiEventClass;
+         this.eventBusService = eventBusService;
+     }
+ 
+     @Override
+     public String iconName(final ManagedObject owningAdapter) {
+ 
+         final IconUiEvent<Object> iconUiEvent = newIconUiEvent(owningAdapter);
+ 
+         eventBusService.post(iconUiEvent);
+ 
+         final String iconName = iconUiEvent.getIconName();
+ 
+         if(iconName == null) {
+             // ie no subscribers out there...
+             final Facet underlyingFacet = getUnderlyingFacet();
+             if(underlyingFacet instanceof IconFacet) {
+                 final IconFacet underlyingIconFacet = (IconFacet) underlyingFacet;
+                 return underlyingIconFacet.iconName(owningAdapter);
+             }
+         }
+ 
+         return iconName; // could be null
+     }
+ 
+     private IconUiEvent<Object> newIconUiEvent(final ManagedObject owningAdapter) {
+         final Object domainObject = owningAdapter.getPojo();
+         return newIconUiEventForPojo(domainObject);
+     }
+ 
+     private IconUiEvent<Object> newIconUiEventForPojo(final Object domainObject) {
+         try {
+             final IconUiEvent<Object> iconUiEvent = _Casts.uncheckedCast(iconUiEventClass.newInstance());
+             iconUiEvent.setSource(domainObject);
+             return iconUiEvent;
+         } catch (InstantiationException | IllegalAccessException ex) {
+             throw new NonRecoverableException(ex);
+         }
+     }
+ 
+     @Override public void appendAttributesTo(final Map<String, Object> attributeMap) {
+         super.appendAttributesTo(attributeMap);
+         attributeMap.put("iconUiEventClass", iconUiEventClass);
+     }
+ 
+ }
diff --cc core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobjectlayout/LayoutFacetViaDomainObjectLayoutAnnotationUsingLayoutUiEvent.java
index 0000000,2e79d11..2d0d22b
mode 000000,100644..100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobjectlayout/LayoutFacetViaDomainObjectLayoutAnnotationUsingLayoutUiEvent.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobjectlayout/LayoutFacetViaDomainObjectLayoutAnnotationUsingLayoutUiEvent.java
@@@ -1,0 -1,119 +1,119 @@@
+ /*
+  *  Licensed to the Apache Software Foundation (ASF) under one
+  *  or more contributor license agreements.  See the NOTICE file
+  *  distributed with this work for additional information
+  *  regarding copyright ownership.  The ASF licenses this file
+  *  to you under the Apache License, Version 2.0 (the
+  *  "License"); you may not use this file except in compliance
+  *  with the License.  You may obtain a copy of the License at
+  *
+  *        http://www.apache.org/licenses/LICENSE-2.0
+  *
+  *  Unless required by applicable law or agreed to in writing,
+  *  software distributed under the License is distributed on an
+  *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+  *  KIND, either express or implied.  See the License for the
+  *  specific language governing permissions and limitations
+  *  under the License.
+  */
+ 
+ package org.apache.isis.core.metamodel.facets.object.domainobjectlayout;
+ 
+ import java.util.List;
+ import java.util.Map;
+ 
+ import org.apache.isis.applib.NonRecoverableException;
+ import org.apache.isis.applib.annotation.DomainObjectLayout;
+ import org.apache.isis.applib.services.eventbus.EventBusService;
+ import org.apache.isis.applib.services.eventbus.LayoutUiEvent;
++import org.apache.isis.applib.services.inject.ServiceInjector;
+ import org.apache.isis.config.IsisConfiguration;
+ import org.apache.isis.core.metamodel.facetapi.Facet;
+ import org.apache.isis.core.metamodel.facetapi.FacetHolder;
+ import org.apache.isis.core.metamodel.facets.object.layout.LayoutFacet;
+ import org.apache.isis.core.metamodel.facets.object.layout.LayoutFacetAbstract;
 -import org.apache.isis.core.metamodel.services.ServicesInjector;
+ import org.apache.isis.core.metamodel.spec.ManagedObject;
+ import org.apache.isis.core.metamodel.util.EventUtil;
+ 
+ public class LayoutFacetViaDomainObjectLayoutAnnotationUsingLayoutUiEvent extends LayoutFacetAbstract implements
+         LayoutFacet {
+ 
+     //private static final Logger LOG = LoggerFactory.getLogger(LayoutFacetViaDomainObjectLayoutAnnotationUsingIconUiEvent.class);
+ 
+     public static Facet create(
+             final List<DomainObjectLayout> domainObjectLayouts,
 -            final ServicesInjector servicesInjector,
++            final ServiceInjector serviceInjector,
+             final IsisConfiguration configuration, final FacetHolder facetHolder) {
+ 
+         return domainObjectLayouts.stream()
+                 .map(DomainObjectLayout::layoutUiEvent)
+                 .filter(layoutUiEvent -> EventUtil.eventTypeIsPostable(
+                         layoutUiEvent,
+                         LayoutUiEvent.Noop.class,
+                         LayoutUiEvent.Default.class,
+                         "isis.reflector.facet.domainObjectLayoutAnnotation.layoutUiEvent.postForDefault",
+                         configuration))
+                 .findFirst()
+                 .map(layoutUiEvent -> {
+ 
 -                    final EventBusService eventBusService = servicesInjector.lookupServiceElseFail(EventBusService.class);
++                    final EventBusService eventBusService = serviceInjector.lookupServiceElseFail(EventBusService.class);
+ 
+                     return new LayoutFacetViaDomainObjectLayoutAnnotationUsingLayoutUiEvent(
+                             layoutUiEvent, eventBusService, facetHolder);
+                 })
+                 .orElse(null);
+     }
+ 
+     private final Class<? extends LayoutUiEvent<?>> layoutUiEventClass;
+     private final EventBusService eventBusService;
+ 
+     public LayoutFacetViaDomainObjectLayoutAnnotationUsingLayoutUiEvent(
+             final Class<? extends LayoutUiEvent<?>> layoutUiEventClass,
+             final EventBusService eventBusService,
+             final FacetHolder holder) {
+         super(holder);
+         this.layoutUiEventClass = layoutUiEventClass;
+         this.eventBusService = eventBusService;
+     }
+ 
+     @Override
+     public String layout(final ManagedObject owningAdapter) {
+ 
+         final LayoutUiEvent<Object> layoutUiEvent = newLayoutUiEvent(owningAdapter);
+ 
+         eventBusService.post(layoutUiEvent);
+ 
+         final String layout = layoutUiEvent.getLayout();
+ 
+         if(layout == null) {
+             // ie no subscribers out there...
+             final Facet underlyingFacet = getUnderlyingFacet();
+             if(underlyingFacet instanceof LayoutFacet) {
+                 final LayoutFacet underlyingLayoutFacet = (LayoutFacet) underlyingFacet;
+                 return underlyingLayoutFacet.layout(owningAdapter);
+             }
+         }
+ 
+         return layout;
+     }
+ 
+     private LayoutUiEvent<Object> newLayoutUiEvent(final ManagedObject owningAdapter) {
+         final Object domainObject = owningAdapter.getPojo();
+         return newLayoutUiEvent(domainObject);
+     }
+ 
+     private LayoutUiEvent<Object> newLayoutUiEvent(final Object domainObject) {
+         try {
+             final LayoutUiEvent<Object> layoutUiEvent = (LayoutUiEvent<Object>) layoutUiEventClass.newInstance();
+             layoutUiEvent.setSource(domainObject);
+             return layoutUiEvent;
+         } catch (InstantiationException | IllegalAccessException ex) {
+             throw new NonRecoverableException(ex);
+         }
+     }
+ 
+     @Override public void appendAttributesTo(final Map<String, Object> attributeMap) {
+         super.appendAttributesTo(attributeMap);
+         attributeMap.put("layoutUiEventClass", layoutUiEventClass);
+     }
+ }
diff --cc core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobjectlayout/LayoutFacetViaViewModelLayoutAnnotationUsingLayoutUiEvent.java
index 0000000,733b3e3..088add9
mode 000000,100644..100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobjectlayout/LayoutFacetViaViewModelLayoutAnnotationUsingLayoutUiEvent.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobjectlayout/LayoutFacetViaViewModelLayoutAnnotationUsingLayoutUiEvent.java
@@@ -1,0 -1,119 +1,119 @@@
+ /*
+  *  Licensed to the Apache Software Foundation (ASF) under one
+  *  or more contributor license agreements.  See the NOTICE file
+  *  distributed with this work for additional information
+  *  regarding copyright ownership.  The ASF licenses this file
+  *  to you under the Apache License, Version 2.0 (the
+  *  "License"); you may not use this file except in compliance
+  *  with the License.  You may obtain a copy of the License at
+  *
+  *        http://www.apache.org/licenses/LICENSE-2.0
+  *
+  *  Unless required by applicable law or agreed to in writing,
+  *  software distributed under the License is distributed on an
+  *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+  *  KIND, either express or implied.  See the License for the
+  *  specific language governing permissions and limitations
+  *  under the License.
+  */
+ 
+ package org.apache.isis.core.metamodel.facets.object.domainobjectlayout;
+ 
+ import java.util.List;
+ import java.util.Map;
+ 
+ import org.apache.isis.applib.NonRecoverableException;
+ import org.apache.isis.applib.annotation.ViewModelLayout;
+ import org.apache.isis.applib.services.eventbus.EventBusService;
+ import org.apache.isis.applib.services.eventbus.LayoutUiEvent;
++import org.apache.isis.applib.services.inject.ServiceInjector;
+ import org.apache.isis.config.IsisConfiguration;
+ import org.apache.isis.core.metamodel.facetapi.Facet;
+ import org.apache.isis.core.metamodel.facetapi.FacetHolder;
+ import org.apache.isis.core.metamodel.facets.object.layout.LayoutFacet;
+ import org.apache.isis.core.metamodel.facets.object.layout.LayoutFacetAbstract;
 -import org.apache.isis.core.metamodel.services.ServicesInjector;
+ import org.apache.isis.core.metamodel.spec.ManagedObject;
+ import org.apache.isis.core.metamodel.util.EventUtil;
+ 
+ public class LayoutFacetViaViewModelLayoutAnnotationUsingLayoutUiEvent extends LayoutFacetAbstract implements
+         LayoutFacet {
+ 
+     //private static final Logger LOG = LoggerFactory.getLogger(LayoutFacetViaViewModelLayoutAnnotationUsingIconUiEvent.class);
+ 
+     public static Facet create(
+             final List<ViewModelLayout> viewModelLayouts,
 -            final ServicesInjector servicesInjector,
++            final ServiceInjector serviceInjector,
+             final IsisConfiguration configuration, final FacetHolder facetHolder) {
+ 
+         return viewModelLayouts.stream()
+                 .map(ViewModelLayout::layoutUiEvent)
+                 .filter(layoutUiEvent -> EventUtil.eventTypeIsPostable(
+                         layoutUiEvent,
+                         LayoutUiEvent.Noop.class,
+                         LayoutUiEvent.Default.class,
+                         "isis.reflector.facet.viewModelLayoutAnnotation.layoutUiEvent.postForDefault",
+                         configuration))
+                 .findFirst()
+                 .map(layoutUiEvent -> {
+ 
 -                    final EventBusService eventBusService = servicesInjector.lookupServiceElseFail(EventBusService.class);
++                    final EventBusService eventBusService = serviceInjector.lookupServiceElseFail(EventBusService.class);
+ 
+                     return new LayoutFacetViaDomainObjectLayoutAnnotationUsingLayoutUiEvent(
+                             layoutUiEvent, eventBusService, facetHolder);
+                 })
+                 .orElse(null);
+     }
+ 
+     private final Class<? extends LayoutUiEvent<?>> layoutUiEventClass;
+     private final EventBusService eventBusService;
+ 
+     public LayoutFacetViaViewModelLayoutAnnotationUsingLayoutUiEvent(
+             final Class<? extends LayoutUiEvent<?>> layoutUiEventClass,
+             final EventBusService eventBusService,
+             final FacetHolder holder) {
+         super(holder);
+         this.layoutUiEventClass = layoutUiEventClass;
+         this.eventBusService = eventBusService;
+     }
+ 
+     @Override
+     public String layout(final ManagedObject owningAdapter) {
+ 
+         final LayoutUiEvent<Object> layoutUiEvent = newLayoutUiEvent(owningAdapter);
+ 
+         eventBusService.post(layoutUiEvent);
+ 
+         final String layout = layoutUiEvent.getLayout();
+ 
+         if(layout == null) {
+             // ie no subscribers out there...
+             final Facet underlyingFacet = getUnderlyingFacet();
+             if(underlyingFacet instanceof LayoutFacet) {
+                 final LayoutFacet underlyingLayoutFacet = (LayoutFacet) underlyingFacet;
+                 return underlyingLayoutFacet.layout(owningAdapter);
+             }
+         }
+ 
+         return layout;
+     }
+ 
+     private LayoutUiEvent<Object> newLayoutUiEvent(final ManagedObject owningAdapter) {
+         final Object domainObject = owningAdapter.getPojo();
+         return newLayoutUiEvent(domainObject);
+     }
+ 
+     private LayoutUiEvent<Object> newLayoutUiEvent(final Object domainObject) {
+         try {
+             final LayoutUiEvent<Object> layoutUiEvent = (LayoutUiEvent<Object>) layoutUiEventClass.newInstance();
+             layoutUiEvent.setSource(domainObject);
+             return layoutUiEvent;
+         } catch (InstantiationException | IllegalAccessException ex) {
+             throw new NonRecoverableException(ex);
+         }
+     }
+ 
+     @Override public void appendAttributesTo(final Map<String, Object> attributeMap) {
+         super.appendAttributesTo(attributeMap);
+         attributeMap.put("layoutUiEventClass", layoutUiEventClass);
+     }
+ }
diff --cc core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobjectlayout/TitleFacetViaViewModelLayoutAnnotationUsingTitleUiEvent.java
index 0000000,dcb67e7..4158992
mode 000000,100644..100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobjectlayout/TitleFacetViaViewModelLayoutAnnotationUsingTitleUiEvent.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobjectlayout/TitleFacetViaViewModelLayoutAnnotationUsingTitleUiEvent.java
@@@ -1,0 -1,141 +1,140 @@@
+ /*
+  *  Licensed to the Apache Software Foundation (ASF) under one
+  *  or more contributor license agreements.  See the NOTICE file
+  *  distributed with this work for additional information
+  *  regarding copyright ownership.  The ASF licenses this file
+  *  to you under the Apache License, Version 2.0 (the
+  *  "License"); you may not use this file except in compliance
+  *  with the License.  You may obtain a copy of the License at
+  *
+  *        http://www.apache.org/licenses/LICENSE-2.0
+  *
+  *  Unless required by applicable law or agreed to in writing,
+  *  software distributed under the License is distributed on an
+  *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+  *  KIND, either express or implied.  See the License for the
+  *  specific language governing permissions and limitations
+  *  under the License.
+  */
+ 
+ package org.apache.isis.core.metamodel.facets.object.domainobjectlayout;
+ 
+ import java.util.List;
+ import java.util.Map;
+ 
 -
+ import org.apache.isis.applib.NonRecoverableException;
+ import org.apache.isis.applib.annotation.ViewModelLayout;
+ import org.apache.isis.applib.events.ui.TitleUiEvent;
+ import org.apache.isis.applib.services.eventbus.EventBusService;
+ import org.apache.isis.applib.services.i18n.TranslatableString;
+ import org.apache.isis.applib.services.i18n.TranslationService;
++import org.apache.isis.applib.services.inject.ServiceInjector;
+ import org.apache.isis.commons.internal.base._Casts;
+ import org.apache.isis.config.IsisConfiguration;
+ import org.apache.isis.core.metamodel.facetapi.Facet;
+ import org.apache.isis.core.metamodel.facetapi.FacetHolder;
+ import org.apache.isis.core.metamodel.facets.object.title.TitleFacet;
+ import org.apache.isis.core.metamodel.facets.object.title.TitleFacetAbstract;
 -import org.apache.isis.core.metamodel.services.ServicesInjector;
+ import org.apache.isis.core.metamodel.spec.ManagedObject;
+ import org.apache.isis.core.metamodel.spec.ObjectSpecification;
+ import org.apache.isis.core.metamodel.util.EventUtil;
+ 
+ public class TitleFacetViaViewModelLayoutAnnotationUsingTitleUiEvent extends TitleFacetAbstract {
+ 
+     //private static final Logger LOG = LoggerFactory.getLogger(TitleFacetViaViewModelLayoutAnnotationUsingTitleUiEvent.class);
+ 
+     public static Facet create(
+             final List<ViewModelLayout> viewModelLayouts,
 -            final ServicesInjector servicesInjector,
++            final ServiceInjector serviceInjector,
+             final IsisConfiguration configuration, final FacetHolder facetHolder) {
+ 
+         return viewModelLayouts.stream()
+                 .map(ViewModelLayout::titleUiEvent)
+                 .filter(titleUiEvent -> EventUtil.eventTypeIsPostable(
+                         titleUiEvent,
+                         TitleUiEvent.Noop.class,
+                         TitleUiEvent.Default.class,
+                         "isis.reflector.facet.viewModelLayoutAnnotation.titleUiEvent.postForDefault",
+                         configuration))
+                 .findFirst()
+                 .map(titleUiEventClass -> {
 -                    final TranslationService translationService = servicesInjector.lookupService(TranslationService.class).orElse(null);
++                    final TranslationService translationService = serviceInjector.lookupService(TranslationService.class).orElse(null);
+ 
+                     final String translationContext;
+                     if(facetHolder instanceof ObjectSpecification) {
+                         final ObjectSpecification facetHolderAsSpec = (ObjectSpecification) facetHolder; // bit naughty...
+                         translationContext = facetHolderAsSpec.getCorrespondingClass().getCanonicalName();
+                     } else {
+                         translationContext = null;
+                     }
+ 
 -                    final EventBusService eventBusService = servicesInjector.lookupServiceElseFail(EventBusService.class);
++                    final EventBusService eventBusService = serviceInjector.lookupServiceElseFail(EventBusService.class);
+ 
+                     return new TitleFacetViaViewModelLayoutAnnotationUsingTitleUiEvent(
+                             titleUiEventClass, translationService, translationContext, eventBusService, facetHolder);
+                 })
+                 .orElse(null);
+     }
+ 
+     private final Class<? extends TitleUiEvent<?>> titleUiEventClass;
+     private final TranslationService translationService;
+     private final String translationContext;
+     private final EventBusService eventBusService;
+ 
+     public TitleFacetViaViewModelLayoutAnnotationUsingTitleUiEvent(
+             final Class<? extends TitleUiEvent<?>> titleUiEventClass,
+             final TranslationService translationService,
+             final String translationContext,
+             final EventBusService eventBusService,
+             final FacetHolder holder) {
+         super(holder);
+         this.titleUiEventClass = titleUiEventClass;
+         this.translationService = translationService;
+         this.translationContext = translationContext;
+         this.eventBusService = eventBusService;
+     }
+ 
+     @Override
+     public String title(final ManagedObject owningAdapter) {
+ 
+         final TitleUiEvent<Object> titleUiEvent = newTitleUiEvent(owningAdapter);
+ 
+         eventBusService.post(titleUiEvent);
+ 
+         final TranslatableString translatedTitle = titleUiEvent.getTranslatableTitle();
+         if(translatedTitle != null) {
+             return translatedTitle.translate(translationService, translationContext);
+         }
+         final String title = titleUiEvent.getTitle();
+ 
+         if(title == null) {
+             // ie no subscribers out there...
+             final Facet underlyingFacet = getUnderlyingFacet();
+             if(underlyingFacet instanceof TitleFacet) {
+                 final TitleFacet underlyingTitleFacet = (TitleFacet) underlyingFacet;
+                 return underlyingTitleFacet.title(owningAdapter);
+             }
+         }
+         return title;
+     }
+ 
+     private TitleUiEvent<Object> newTitleUiEvent(final ManagedObject owningAdapter) {
+         final Object domainObject = owningAdapter.getPojo();
+         return newTitleUiEvent(domainObject);
+     }
+ 
+     private TitleUiEvent<Object> newTitleUiEvent(final Object domainObject) {
+         try {
+             final TitleUiEvent<Object> titleUiEvent = _Casts.uncheckedCast(titleUiEventClass.newInstance());
+             titleUiEvent.setSource(domainObject);
+             return titleUiEvent;
+         } catch (InstantiationException | IllegalAccessException ex) {
+             throw new NonRecoverableException(ex);
+         }
+     }
+ 
+     @Override public void appendAttributesTo(final Map<String, Object> attributeMap) {
+         super.appendAttributesTo(attributeMap);
+         attributeMap.put("titleUiEventClass", titleUiEventClass);
+     }
+ }
diff --cc core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/grid/GridFacetFactory.java
index 3ec22a5,491b8aa..3a03a74
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/grid/GridFacetFactory.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/grid/GridFacetFactory.java
@@@ -34,7 -34,7 +34,7 @@@ public class GridFacetFactory extends F
      public void process(final ProcessClassContext processClassContext) {
          final FacetHolder facetHolder = processClassContext.getFacetHolder();
  
-         final GridService gridService = getServiceRegistry().lookupServiceElseFail(GridService.class);
 -        final GridService2 gridService = servicesInjector.lookupServiceElseFail(GridService2.class);
++        final GridService2 gridService = getServiceRegistry().lookupServiceElseFail(GridService2.class);
  
          FacetUtil.addFacet(GridFacetDefault.create(facetHolder, gridService));
      }
diff --cc core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/grid/GridLoaderServiceDefault.java
index 3602b51,57036ec..649b796
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/grid/GridLoaderServiceDefault.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/grid/GridLoaderServiceDefault.java
@@@ -33,9 -30,11 +34,9 @@@ import javax.xml.bind.JAXBException
  import org.slf4j.Logger;
  import org.slf4j.LoggerFactory;
  
 -import org.apache.isis.applib.annotation.DomainService;
 -import org.apache.isis.applib.annotation.NatureOfService;
  import org.apache.isis.applib.annotation.Programmatic;
  import org.apache.isis.applib.layout.grid.Grid;
- import org.apache.isis.applib.services.grid.GridLoaderService;
+ import org.apache.isis.applib.services.grid.GridLoaderService2;
  import org.apache.isis.applib.services.grid.GridSystemService;
  import org.apache.isis.applib.services.jaxb.JaxbService;
  import org.apache.isis.applib.services.message.MessageService;
@@@ -45,8 -45,11 +47,8 @@@ import org.apache.isis.commons.internal
  import org.apache.isis.commons.internal.context._Context;
  import org.apache.isis.commons.internal.resources._Resources;
  
 -@DomainService(
 -        nature = NatureOfService.DOMAIN,
 -        menuOrder = "" + Integer.MAX_VALUE
 -        )
 +@Singleton
- public class GridLoaderServiceDefault implements GridLoaderService {
+ public class GridLoaderServiceDefault implements GridLoaderService2 {
  
      private static final Logger LOG = LoggerFactory.getLogger(GridLoaderServiceDefault.class);
  
diff --cc core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/grid/GridServiceDefault.java
index 228ac39,4659492..929ed3f
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/grid/GridServiceDefault.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/grid/GridServiceDefault.java
@@@ -19,22 -19,22 +19,22 @@@ package org.apache.isis.core.metamodel.
  import java.util.List;
  import java.util.stream.Collectors;
  
 -import org.apache.isis.applib.annotation.DomainService;
 -import org.apache.isis.applib.annotation.NatureOfService;
 +import javax.enterprise.inject.Any;
 +import javax.enterprise.inject.Instance;
 +import javax.inject.Inject;
 +import javax.inject.Singleton;
 +
  import org.apache.isis.applib.annotation.Programmatic;
  import org.apache.isis.applib.layout.grid.Grid;
- import org.apache.isis.applib.services.grid.GridLoaderService;
- import org.apache.isis.applib.services.grid.GridService;
+ import org.apache.isis.applib.services.grid.GridLoaderService2;
+ import org.apache.isis.applib.services.grid.GridService2;
  import org.apache.isis.applib.services.grid.GridSystemService;
  import org.apache.isis.commons.internal.base._Casts;
  import org.apache.isis.commons.internal.base._NullSafe;
  import org.apache.isis.commons.internal.collections._Lists;
  
 -@DomainService(
 -        nature = NatureOfService.DOMAIN,
 -        menuOrder = "" + Integer.MAX_VALUE
 -        )
 +@Singleton
- public class GridServiceDefault implements GridService {
+ public class GridServiceDefault implements GridService2 {
  
      //private static final Logger LOG = LoggerFactory.getLogger(GridServiceDefault.class);
  
@@@ -188,20 -194,14 +194,20 @@@
          return filteredGridSystemServices;
      }
  
 +    // -- poor man's testing support
 +    
 +    List<GridSystemService<?>> gridSystemServicesForTest;
 +    Iterable<GridSystemService<?>> getGridSystemServices() {
 +        return gridSystemServices!=null 
 +                ? gridSystemServices
 +                        : gridSystemServicesForTest;
 +    }
 +    
      ////////////////////////////////////////////////////////
  
-     @Inject GridLoaderService gridLoaderService;
 -
 -
 -    @javax.inject.Inject
 -    GridLoaderService2 gridLoaderService;
 -
 -    @javax.inject.Inject
 -    List<GridSystemService<?>> gridSystemServices;
++    @Inject GridLoaderService2 gridLoaderService;
 +    @Inject @Any private Instance<GridSystemService<?>> gridSystemServices;
 +    
 +    
  
  }
diff --cc core/metamodel/src/test/java/org/apache/isis/core/metamodel/specloader/SpecificationLoaderTestAbstract.java
index cc86b23,cabd4be..452f099
--- a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/specloader/SpecificationLoaderTestAbstract.java
+++ b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/specloader/SpecificationLoaderTestAbstract.java
@@@ -19,25 -19,23 +19,25 @@@
  
  package org.apache.isis.core.metamodel.specloader;
  
 -import org.hamcrest.Description;
 -import org.jmock.Expectations;
 -import org.jmock.api.Action;
 -import org.jmock.api.Invocation;
 -import org.jmock.auto.Mock;
 -import org.junit.After;
 -import org.junit.Assert;
 -import org.junit.Before;
 -import org.junit.Rule;
 -import org.junit.Test;
 -import org.junit.rules.ExpectedException;
 +import javax.enterprise.inject.Produces;
 +import javax.inject.Inject;
 +
 +import org.jboss.weld.junit5.EnableWeld;
 +import org.jboss.weld.junit5.WeldInitiator;
 +import org.jboss.weld.junit5.WeldSetup;
 +import org.junit.jupiter.api.AfterEach;
 +import org.junit.jupiter.api.BeforeEach;
 +import org.junit.jupiter.api.Test;
 +import org.mockito.Mockito;
  
  import org.apache.isis.applib.AppManifest;
- import org.apache.isis.applib.services.grid.GridService;
+ import org.apache.isis.applib.services.grid.GridService2;
  import org.apache.isis.applib.services.i18n.TranslationService;
 +import org.apache.isis.applib.services.i18n.TranslationService.Mode;
  import org.apache.isis.applib.services.message.MessageService;
 +import org.apache.isis.commons.internal.base._Timing;
  import org.apache.isis.commons.internal.collections._Sets;
 +import org.apache.isis.core.metamodel.BeansForTesting;
  import org.apache.isis.core.metamodel.facetapi.Facet;
  import org.apache.isis.core.metamodel.facets.actcoll.typeof.TypeOfFacet;
  import org.apache.isis.core.metamodel.facets.all.describedas.DescribedAsFacet;
@@@ -49,76 -47,32 +49,76 @@@ import org.apache.isis.core.metamodel.p
  import org.apache.isis.core.metamodel.services.persistsession.PersistenceSessionServiceInternal;
  import org.apache.isis.core.metamodel.spec.ObjectSpecification;
  import org.apache.isis.core.security.authentication.AuthenticationSessionProvider;
 -import org.apache.isis.core.unittestsupport.jmocking.JUnitRuleMockery2;
 -import org.apache.isis.core.unittestsupport.jmocking.JUnitRuleMockery2.Mode;
  import org.apache.isis.progmodels.dflt.ProgrammingModelFacetsJava5;
  
 -public abstract class SpecificationLoaderTestAbstract {
 +import static org.junit.jupiter.api.Assertions.assertNotNull;
 +import static org.junit.jupiter.api.Assertions.assertNull;
 +import static org.mockito.Mockito.when;
  
 -    @Rule
 -    public JUnitRuleMockery2 context = JUnitRuleMockery2.createFor(Mode.INTERFACES_AND_CLASSES);
 +import lombok.val;
  
 -    @Rule
 -    public ExpectedException expectedException = ExpectedException.none();
 +@EnableWeld
 +abstract class SpecificationLoaderTestAbstract {
  
 -    @Mock
 -    private AuthenticationSessionProvider mockAuthenticationSessionProvider;
 -    @Mock
 -    private GridService2 mockGridService;
 -    @Mock
 -    private PersistenceSessionServiceInternal mockPersistenceSessionServiceInternal;
 -    @Mock
 -    private MessageService mockMessageService;
 -    @Mock
 -    private TranslationService mockTranslationService;
 -    
 -    ServicesInjector stubServicesInjector;
 +    static class Factories {
 +        
 +        @Produces
 +        AuthenticationSessionProvider mockAuthenticationSessionProvider() {
 +            return Mockito.mock(AuthenticationSessionProvider.class);
 +        }
 +        
 +        @Produces
-         GridService mockGridService() {
-             return Mockito.mock(GridService.class);
++        GridService2 mockGridService() {
++            return Mockito.mock(GridService2.class);
 +        }
 +        
 +        @Produces
 +        PersistenceSessionServiceInternal mockPersistenceSessionServiceInternal() {
 +            return Mockito.mock(PersistenceSessionServiceInternal.class);
 +        }
 +        
 +        @Produces
 +        MessageService mockMessageService() {
 +            return Mockito.mock(MessageService.class);
 +        }
 +        
 +        @Produces
 +        TranslationService mockTranslationService() {
 +            val mock = Mockito.mock(TranslationService.class);
 +            when(mock.getMode()).thenReturn(Mode.DISABLED);
 +            return mock;
 +        }
 +        
 +        @Produces
 +        SpecificationLoader getSpecificationLoader() {
 +            return new SpecificationLoader(
 +                    new ProgrammingModelFacetsJava5(DeprecatedPolicy.HONOUR),
 +                    new MetaModelValidatorDefault());
 +        }
 +        
 +    }
  
 +    @WeldSetup
 +    public WeldInitiator weld = WeldInitiator.from(
 +            
 +            BeansForTesting.builder()
 +            .injector()
 +            .addAll(
 +                    Factories.class
 +                    )
 +            .build()
 +            
 +            )
 +    .build();
 +    
 +    
 +    @Inject protected AuthenticationSessionProvider mockAuthenticationSessionProvider;
-     @Inject protected GridService mockGridService;
++    @Inject protected GridService2 mockGridService;
 +    @Inject protected PersistenceSessionServiceInternal mockPersistenceSessionServiceInternal;
 +    @Inject protected MessageService mockMessageService;
 +    @Inject protected SpecificationLoader specificationLoader;
 +    
 +    
      // is loaded by subclasses
      protected ObjectSpecification specification;
  
diff --cc core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/pages/PageAbstract.java
index 92cc8af,479991c..542fa7e
--- a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/pages/PageAbstract.java
+++ b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/pages/PageAbstract.java
@@@ -61,12 -62,12 +62,13 @@@ import org.apache.wicket.request.resour
  import org.slf4j.Logger;
  import org.slf4j.LoggerFactory;
  
+ import org.apache.isis.applib.annotation.PromptStyle;
  import org.apache.isis.applib.services.exceprecog.ExceptionRecognizer;
  import org.apache.isis.applib.services.exceprecog.ExceptionRecognizerComposite;
 +import org.apache.isis.applib.services.inject.ServiceInjector;
  import org.apache.isis.config.IsisConfiguration;
 +import org.apache.isis.config.beans.WebAppConfigBean;
  import org.apache.isis.config.property.ConfigPropertyEnum;
 -import org.apache.isis.core.metamodel.services.ServicesInjector;
  import org.apache.isis.core.runtime.system.context.IsisContext;
  import org.apache.isis.core.runtime.system.persistence.PersistenceSession;
  import org.apache.isis.core.runtime.system.session.IsisSessionFactory;
@@@ -458,16 -466,32 +460,32 @@@ public abstract class PageAbstract exte
      private ActionPromptModalWindow actionPromptModalWindow;
      private ActionPromptSidebar actionPromptSidebar;
  
-     @Override
-     public ActionPrompt getActionPrompt() {
+     public ActionPrompt getActionPrompt(final PromptStyle promptStyle) {
+         switch (promptStyle) {
+         case AS_CONFIGURED:
+         case DIALOG:
+         case INLINE:
+         case INLINE_AS_IF_EDIT:
+         default:
 -            final DialogMode dialogMode = CONFIG_DIALOG_MODE.from(getConfiguration());
 -            switch (dialogMode) {
 -                case SIDEBAR:
 -                    return actionPromptSidebar;
 -                case MODAL:
 -                default:
 -                    return actionPromptModalWindow;
 -            }
 +        final DialogMode dialogMode = CONFIG_DIALOG_MODE.from(getConfiguration());
 +        switch (dialogMode) {
 +            case SIDEBAR:
 +                return actionPromptSidebar;
 +            case MODAL:
 +            default:
 +        return actionPromptModalWindow;
 +    }
+         case DIALOG_SIDEBAR:
+             return actionPromptSidebar;
+         case DIALOG_MODAL:
+             return actionPromptModalWindow;
+         }
+     }
+ 
+     @Override
+     public void closePrompt(final AjaxRequestTarget target) {
+         actionPromptSidebar.closePrompt(target);
+         actionPromptModalWindow.closePrompt(target);
      }
  
      private void addActionPromptModalWindow(final MarkupContainer parent) {
diff --cc core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/panels/FormExecutorDefault.java
index b28422c,ee5c868..18cc3da
--- a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/panels/FormExecutorDefault.java
+++ b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/panels/FormExecutorDefault.java
@@@ -48,7 -47,9 +48,8 @@@ import org.apache.isis.commons.internal
  import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
  import org.apache.isis.core.metamodel.adapter.concurrency.ConcurrencyChecking;
  import org.apache.isis.core.metamodel.adapter.version.ConcurrencyException;
+ import org.apache.isis.core.metamodel.facets.actions.redirect.RedirectFacet;
  import org.apache.isis.core.metamodel.facets.properties.renderunchanged.UnchangingFacet;
 -import org.apache.isis.core.metamodel.services.ServicesInjector;
  import org.apache.isis.core.metamodel.specloader.SpecificationLoader;
  import org.apache.isis.core.runtime.system.context.IsisContext;
  import org.apache.isis.core.runtime.system.persistence.PersistenceSession;