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 2022/08/28 19:42:50 UTC

[isis] branch master updated (fa377b0d03 -> 6ae99696eb)

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

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


    from fa377b0d03 ISIS-3167: site: diagram text box overflow glitch
     new a7b85c2845 ISIS-3167: declare the new ManagedObject contracts
     new 6ae99696eb ISIS-3167: update site index

The 2 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:
 .../pages/index/annotation/CollectionLayout.adoc   |   2 +-
 .../pages/index/annotation/Introspection.adoc      |   8 +-
 .../commons/pages/index/collections/Can.adoc       |   5 +
 .../index/metamodel/object/ManagedObject.adoc      | 169 +++++++++++++++++
 .../changetracking/EntityChangeTracker.adoc        |   8 +-
 .../jdo/IsisModuleExtCommandLogPersistenceJdo.adoc |  12 +-
 .../jpa/IsisModuleExtCommandLogPersistenceJpa.adoc |  14 +-
 ...IsisModuleExtExecutionOutboxPersistenceJdo.adoc |  12 +-
 ...IsisModuleExtExecutionOutboxPersistenceJpa.adoc |  14 +-
 .../jdo/IsisModuleExtSecmanPersistenceJdo.adoc     |  13 ++
 .../jpa/IsisModuleExtSecmanPersistenceJpa.adoc     |  14 +-
 ...IsisModulePersistenceJdoDatanucleusMixins.adoc} |   8 +-
 .../commons/applib/mixins/Object_impersonate.adoc  |   2 +-
 .../services/branding/BrandingUiService.adoc}      |  10 +-
 .../applib/services/header/HeaderUiService.adoc}   |   7 +-
 .../applib/services/menu/MenuUiService.adoc}       |  12 +-
 ...odelProvider.adoc => UserProfileUiService.adoc} |   6 +-
 .../valuerender/JsonValueEncoderService.adoc       |  14 +-
 core/adoc/modules/_overview/pages/about.adoc       |  94 +++++++---
 .../isis/core/metamodel/object/ManagedObject.java  | 199 ++++++++++++++++++++-
 .../core/metamodel/object/PackedManagedObject.java |   1 +
 .../metamodel/object/_ManagedObjectPacked.java     |  10 ++
 .../metamodel/object/_ManagedObjectSpecified.java  |   7 +
 .../object/_ManagedObjectUnspecified.java          |   9 +
 24 files changed, 571 insertions(+), 79 deletions(-)
 create mode 100644 antora/components/refguide-index/modules/core/pages/index/metamodel/object/ManagedObject.adoc
 copy antora/components/refguide-index/modules/{applib/pages/index/graph/SimpleEdge.adoc => persistence/pages/index/jdo/datanucleus/IsisModulePersistenceJdoDatanucleusMixins.adoc} (84%)
 copy antora/components/refguide-index/modules/{applib/pages/index/graph/SimpleEdge.adoc => viewer/pages/index/commons/applib/services/branding/BrandingUiService.adoc} (84%)
 copy antora/components/refguide-index/modules/{applib/pages/index/layout/component/MemberRegionOwner.adoc => viewer/pages/index/commons/applib/services/header/HeaderUiService.adoc} (89%)
 copy antora/components/refguide-index/modules/{applib/pages/index/graph/Edge.adoc => viewer/pages/index/commons/applib/services/menu/MenuUiService.adoc} (80%)
 rename antora/components/refguide-index/modules/viewer/pages/index/commons/applib/services/userprof/{UserProfileUiModelProvider.adoc => UserProfileUiService.adoc} (92%)


[isis] 02/02: ISIS-3167: update site index

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

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

commit 6ae99696eb7cf3509d372eb4e4f3f9c0da0c004c
Author: Andi Huber <ah...@apache.org>
AuthorDate: Sun Aug 28 21:42:41 2022 +0200

    ISIS-3167: update site index
---
 .../pages/index/annotation/CollectionLayout.adoc   |   2 +-
 .../pages/index/annotation/Introspection.adoc      |   8 +-
 .../commons/pages/index/collections/Can.adoc       |   5 +
 .../index/metamodel/object/ManagedObject.adoc      | 169 +++++++++++++++++++++
 .../changetracking/EntityChangeTracker.adoc        |   8 +-
 .../jdo/IsisModuleExtCommandLogPersistenceJdo.adoc |  12 +-
 .../jpa/IsisModuleExtCommandLogPersistenceJpa.adoc |  14 +-
 ...IsisModuleExtExecutionOutboxPersistenceJdo.adoc |  12 +-
 ...IsisModuleExtExecutionOutboxPersistenceJpa.adoc |  14 +-
 .../jdo/IsisModuleExtSecmanPersistenceJdo.adoc     |  13 ++
 .../jpa/IsisModuleExtSecmanPersistenceJpa.adoc     |  14 +-
 ...IsisModulePersistenceJdoDatanucleusMixins.adoc} |   6 +-
 .../commons/applib/mixins/Object_impersonate.adoc  |   2 +-
 .../services/branding/BrandingUiService.adoc}      |   8 +-
 .../applib/services/header/HeaderUiService.adoc}   |   7 +-
 .../applib/services/menu/MenuUiService.adoc}       |   9 +-
 ...odelProvider.adoc => UserProfileUiService.adoc} |   6 +-
 .../valuerender/JsonValueEncoderService.adoc       |  14 +-
 core/adoc/modules/_overview/pages/about.adoc       |  94 +++++++++---
 19 files changed, 346 insertions(+), 71 deletions(-)

diff --git a/antora/components/refguide-index/modules/applib/pages/index/annotation/CollectionLayout.adoc b/antora/components/refguide-index/modules/applib/pages/index/annotation/CollectionLayout.adoc
index b8e22f666e..26adbc472c 100644
--- a/antora/components/refguide-index/modules/applib/pages/index/annotation/CollectionLayout.adoc
+++ b/antora/components/refguide-index/modules/applib/pages/index/annotation/CollectionLayout.adoc
@@ -17,7 +17,7 @@ Layout hints for collections.
   int paged() default -1;     // <.>
   String sequence() default "";     // <.>
   @SuppressWarnings("rawtypes")
-Class sortedBy() default Comparator.class;     // <.>
+Class<? extends Comparator> sortedBy() default Comparator.class;     // <.>
 }
 ----
 
diff --git a/antora/components/refguide-index/modules/applib/pages/index/annotation/Introspection.adoc b/antora/components/refguide-index/modules/applib/pages/index/annotation/Introspection.adoc
index 593bec7e1c..1d32ac41c3 100644
--- a/antora/components/refguide-index/modules/applib/pages/index/annotation/Introspection.adoc
+++ b/antora/components/refguide-index/modules/applib/pages/index/annotation/Introspection.adoc
@@ -34,7 +34,7 @@ Introspection should be handled as per the default introspection policy configur
 <.> xref:#ENCAPSULATION_ENABLED[ENCAPSULATION_ENABLED]
 +
 --
-Introspect public and non-public members, while presence of at least one appropriate domain annotation is enforced.
+Introspect public and non-public members.
 --
 <.> xref:#ANNOTATION_REQUIRED[ANNOTATION_REQUIRED]
 +
@@ -64,10 +64,12 @@ If not configured, then encapsulation is disabled and presence of the _Domain.In
 [#ENCAPSULATION_ENABLED]
 === ENCAPSULATION_ENABLED
 
-Introspect public and non-public members, while presence of at least one appropriate domain annotation is enforced.
+Introspect public and non-public members.
 
 All methods intended to be part of the meta-model (whether representing a member or a supporting method) must be annotated. Members using one of xref:refguide:applib:index/annotation/Action.adoc[Action] , xref:refguide:applib:index/annotation/Property.adoc[Property] , xref:refguide:applib:index/annotation/Collection.adoc[Collection] , while supporting methods with _Domain.Include_ (usually as a meta-annotation on xref:refguide:applib:index/annotation/MemberSupport.adoc[MemberSupport] ).  [...]
 
+For mixins (where the mixin class itself is annotated with xref:refguide:applib:index/annotation/Action.adoc[Action] , xref:refguide:applib:index/annotation/Property.adoc[Property] or xref:refguide:applib:index/annotation/Collection.adoc[Collection] , then the member method should instead be annotated the same as the supporting methods, _Domain.Include_ or xref:refguide:applib:index/annotation/MemberSupport.adoc[MemberSupport] .
+
 [#ANNOTATION_REQUIRED]
 === ANNOTATION_REQUIRED
 
@@ -77,6 +79,8 @@ All public methods intended to represent members must be annotated (or meta-anno
 
 Any non-excluded public methods with a supporting method prefix do not need to be annotated and are automatically associated with their corresponding member method. If no corresponding member method can be found, meta-model validation will fail with an 'orphaned member support' method violation.
 
+For mixins (where the mixin class itself is annotated with xref:refguide:applib:index/annotation/Action.adoc[Action] , xref:refguide:applib:index/annotation/Property.adoc[Property] or xref:refguide:applib:index/annotation/Collection.adoc[Collection] , then the member method should instead be annotated the same as the supporting methods, _Domain.Include_ or xref:refguide:applib:index/annotation/MemberSupport.adoc[MemberSupport] .
+
 [#ANNOTATION_OPTIONAL]
 === ANNOTATION_OPTIONAL
 
diff --git a/antora/components/refguide-index/modules/commons/pages/index/collections/Can.adoc b/antora/components/refguide-index/modules/commons/pages/index/collections/Can.adoc
index 292ed292a6..780f7c031a 100644
--- a/antora/components/refguide-index/modules/commons/pages/index/collections/Can.adoc
+++ b/antora/components/refguide-index/modules/commons/pages/index/collections/Can.adoc
@@ -70,6 +70,7 @@ interface Can<T> {
   boolean isCardinalityMultiple()
   Collector<T, ?, Can<T>> toCan()
   List<T> toList()     // <.>
+  List<T> toArrayList()     // <.>
   Set<T> toSet()     // <.>
   Set<T> toSet(Consumer<T> onDuplicated)     // <.>
   C toCollection(Supplier<C> collectionFactory)     // <.>
@@ -253,6 +254,7 @@ Let _n_ be the number of elements in _other_ . Returns whether the first _n_ ele
 Let _n_ be the number of elements in _other_ . Returns whether the last _n_ elements of this _Can_ are element-wise equal to _other_ .
 --
 <.> xref:#toList_[toList()]
+<.> xref:#toArrayList_[toArrayList()]
 <.> xref:#toSet_[toSet()]
 <.> xref:#toSet_Consumer[toSet(Consumer)]
 <.> xref:#toCollection_Supplier[toCollection(Supplier)]
@@ -472,6 +474,9 @@ Let _n_ be the number of elements in _other_ . Returns whether the last _n_ elem
 [#toList_]
 === toList()
 
+[#toArrayList_]
+=== toArrayList()
+
 [#toSet_]
 === toSet()
 
diff --git a/antora/components/refguide-index/modules/core/pages/index/metamodel/object/ManagedObject.adoc b/antora/components/refguide-index/modules/core/pages/index/metamodel/object/ManagedObject.adoc
new file mode 100644
index 0000000000..73c1e45ff3
--- /dev/null
+++ b/antora/components/refguide-index/modules/core/pages/index/metamodel/object/ManagedObject.adoc
@@ -0,0 +1,169 @@
+= ManagedObject
+:Notice: 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 ag [...]
+
+Represents an instance of some element of the meta-model managed by the framework, that is _Spring_ managed beans, persistence-stack provided entities, view-models or instances of value types.
+
+== API
+
+[source,java]
+.ManagedObject.java
+----
+interface ManagedObject {
+  Specialization getSpecialization()     // <.>
+  ObjectSpecification getSpecification()     // <.>
+  Object getPojo()     // <.>
+  Optional<Bookmark> getBookmark()     // <.>
+  Optional<Bookmark> getBookmarkRefreshed()     // <.>
+  void refreshViewmodel(Supplier<Bookmark> bookmarkSupplier)     // <.>
+  boolean isBookmarkMemoized()
+  Supplier<ManagedObject> asSupplier()
+  void assertSpecIsInSyncWithPojo()
+  String titleString(UnaryOperator<TitleRenderRequest.TitleRenderRequestBuilder> onBuilder)
+  String titleString()
+  Optional<ObjectSpecification> getElementSpecification()     // <.>
+  String getTitle()
+  String getIconName()     // <.>
+  ObjectIcon getIcon()
+  ManagedObject notBookmarked(ObjectSpecification spec, Object pojo)
+  ManagedObject of(ObjectSpecification spec, Object pojo)     // <.>
+  ManagedObject bookmarked(ObjectSpecification spec, Object pojo, Bookmark bookmark)     // <.>
+  ManagedObject lazy(SpecificationLoader specLoader, Object pojo)     // <.>
+  ManagedObject unspecified()     // <.>
+  ManagedObject empty(ObjectSpecification spec)     // <.>
+}
+----
+
+<.> xref:#getSpecialization_[getSpecialization()]
++
+--
+Returns the specific _Specialization_ this xref:refguide:core:index/metamodel/object/ManagedObject.adoc[ManagedObject] implements, which governs this object's behavior.
+--
+<.> xref:#getSpecification_[getSpecification()]
++
+--
+Returns the specification that details the structure (meta-model) of this object.
+--
+<.> xref:#getPojo_[getPojo()]
++
+--
+Returns the adapted domain object, the 'plain old java' object this managed object represents with the framework.
+--
+<.> xref:#getBookmark_[getBookmark()]
++
+--
+Returns the object's bookmark as identified by the ObjectManager. Bookmarks are considered immutable, hence will be memoized once fetched.
+--
+<.> xref:#getBookmarkRefreshed_[getBookmarkRefreshed()]
++
+--
+Similar to _#getBookmark()_ , but invalidates any memoized xref:refguide:applib:index/services/bookmark/Bookmark.adoc[Bookmark] such that the xref:refguide:applib:index/services/bookmark/Bookmark.adoc[Bookmark] returned is recreated, reflecting the object's current state.
+--
+<.> xref:#refreshViewmodel_Supplier[refreshViewmodel(Supplier)]
++
+--
+If the underlying domain object is a viewmodel, refreshes any referenced entities. (Acts as a no-op otherwise.)
+--
+<.> xref:#getElementSpecification_[getElementSpecification()]
++
+--
+Used only for (standalone or parented) collections.
+--
+<.> xref:#getIconName_[getIconName()]
++
+--
+Returns the name of an icon to use if this object is to be displayed graphically.
+--
+<.> xref:#of_ObjectSpecification_Object[of(ObjectSpecification, Object)]
++
+--
+Optimized for cases, when the pojo's specification is already available. If _pojo_ is an entity, automatically memoizes its bookmark.
+--
+<.> xref:#bookmarked_ObjectSpecification_Object_Bookmark[bookmarked(ObjectSpecification, Object, Bookmark)]
++
+--
+Optimized for cases, when the pojo's specification and bookmark are already available.
+--
+<.> xref:#lazy_SpecificationLoader_Object[lazy(SpecificationLoader, Object)]
++
+--
+For cases, when the pojo's specification is not available and needs to be looked up.
+--
+<.> xref:#unspecified_[unspecified()]
++
+--
+has no ObjectSpecification and no value (pojo)
+--
+<.> xref:#empty_ObjectSpecification[empty(ObjectSpecification)]
++
+--
+has an ObjectSpecification, but no value (pojo)
+--
+
+== Members
+
+[#getSpecialization_]
+=== getSpecialization()
+
+Returns the specific _Specialization_ this xref:refguide:core:index/metamodel/object/ManagedObject.adoc[ManagedObject] implements, which governs this object's behavior.
+
+[#getSpecification_]
+=== getSpecification()
+
+Returns the specification that details the structure (meta-model) of this object.
+
+[#getPojo_]
+=== getPojo()
+
+Returns the adapted domain object, the 'plain old java' object this managed object represents with the framework.
+
+[#getBookmark_]
+=== getBookmark()
+
+Returns the object's bookmark as identified by the ObjectManager. Bookmarks are considered immutable, hence will be memoized once fetched.
+
+[#getBookmarkRefreshed_]
+=== getBookmarkRefreshed()
+
+Similar to _#getBookmark()_ , but invalidates any memoized xref:refguide:applib:index/services/bookmark/Bookmark.adoc[Bookmark] such that the xref:refguide:applib:index/services/bookmark/Bookmark.adoc[Bookmark] returned is recreated, reflecting the object's current state.
+
+[#refreshViewmodel_Supplier]
+=== refreshViewmodel(Supplier)
+
+If the underlying domain object is a viewmodel, refreshes any referenced entities. (Acts as a no-op otherwise.)
+
+[#getElementSpecification_]
+=== getElementSpecification()
+
+Used only for (standalone or parented) collections.
+
+[#getIconName_]
+=== getIconName()
+
+Returns the name of an icon to use if this object is to be displayed graphically.
+
+May return `null` if no icon is specified.
+
+[#of_ObjectSpecification_Object]
+=== of(ObjectSpecification, Object)
+
+Optimized for cases, when the pojo's specification is already available. If _pojo_ is an entity, automatically memoizes its bookmark.
+
+[#bookmarked_ObjectSpecification_Object_Bookmark]
+=== bookmarked(ObjectSpecification, Object, Bookmark)
+
+Optimized for cases, when the pojo's specification and bookmark are already available.
+
+[#lazy_SpecificationLoader_Object]
+=== lazy(SpecificationLoader, Object)
+
+For cases, when the pojo's specification is not available and needs to be looked up.
+
+[#unspecified_]
+=== unspecified()
+
+has no ObjectSpecification and no value (pojo)
+
+[#empty_ObjectSpecification]
+=== empty(ObjectSpecification)
+
+has an ObjectSpecification, but no value (pojo)
diff --git a/antora/components/refguide-index/modules/core/pages/index/transaction/changetracking/EntityChangeTracker.adoc b/antora/components/refguide-index/modules/core/pages/index/transaction/changetracking/EntityChangeTracker.adoc
index d7e7d0d6e5..8cef90f256 100644
--- a/antora/components/refguide-index/modules/core/pages/index/transaction/changetracking/EntityChangeTracker.adoc
+++ b/antora/components/refguide-index/modules/core/pages/index/transaction/changetracking/EntityChangeTracker.adoc
@@ -30,12 +30,12 @@ Publishing support: for object stores to enlist an object that has just been cre
 <.> xref:#enlistUpdating_ManagedObject_Can[enlistUpdating(ManagedObject, Can)]
 +
 --
-Publishing support: for object stores to enlist an object that is about to be updated, capturing the pre-modification values of the properties of the _ManagedObject_ .
+Publishing support: for object stores to enlist an object that is about to be updated, capturing the pre-modification values of the properties of the xref:refguide:core:index/metamodel/object/ManagedObject.adoc[ManagedObject] .
 --
 <.> xref:#enlistDeleting_ManagedObject[enlistDeleting(ManagedObject)]
 +
 --
-Publishing support: for object stores to enlist an object that is about to be deleted, capturing the pre-deletion value of the properties of the _ManagedObject_ .
+Publishing support: for object stores to enlist an object that is about to be deleted, capturing the pre-deletion value of the properties of the xref:refguide:core:index/metamodel/object/ManagedObject.adoc[ManagedObject] .
 --
 <.> xref:#incrementLoaded_ManagedObject[incrementLoaded(ManagedObject)]
 +
@@ -60,7 +60,7 @@ The post-modification values are captured when the transaction commits.
 [#enlistUpdating_ManagedObject_Can]
 === enlistUpdating(ManagedObject, Can)
 
-Publishing support: for object stores to enlist an object that is about to be updated, capturing the pre-modification values of the properties of the _ManagedObject_ .
+Publishing support: for object stores to enlist an object that is about to be updated, capturing the pre-modification values of the properties of the xref:refguide:core:index/metamodel/object/ManagedObject.adoc[ManagedObject] .
 
 The post-modification values are captured when the transaction commits.
 
@@ -69,7 +69,7 @@ Overload as an optimization for ORMs (specifically, JPA) where already have acce
 [#enlistDeleting_ManagedObject]
 === enlistDeleting(ManagedObject)
 
-Publishing support: for object stores to enlist an object that is about to be deleted, capturing the pre-deletion value of the properties of the _ManagedObject_ .
+Publishing support: for object stores to enlist an object that is about to be deleted, capturing the pre-deletion value of the properties of the xref:refguide:core:index/metamodel/object/ManagedObject.adoc[ManagedObject] .
 
 The post-modification values are captured when the transaction commits. In the case of deleted objects, a dummy value `'[DELETED]'` is used as the post-modification value.
 
diff --git a/antora/components/refguide-index/modules/extensions/pages/index/commandlog/jdo/IsisModuleExtCommandLogPersistenceJdo.adoc b/antora/components/refguide-index/modules/extensions/pages/index/commandlog/jdo/IsisModuleExtCommandLogPersistenceJdo.adoc
index 871b940515..0264ec2f59 100644
--- a/antora/components/refguide-index/modules/extensions/pages/index/commandlog/jdo/IsisModuleExtCommandLogPersistenceJdo.adoc
+++ b/antora/components/refguide-index/modules/extensions/pages/index/commandlog/jdo/IsisModuleExtCommandLogPersistenceJdo.adoc
@@ -9,19 +9,19 @@
 class IsisModuleExtCommandLogPersistenceJdo {
   public static final String NAMESPACE;
   public static final String SCHEMA;
-  FixtureScript getTeardownFixtureWillDelete()     // <.>
+  FixtureScript teardownFixture()     // <.>
 }
 ----
 
-<.> xref:#getTeardownFixtureWillDelete_[getTeardownFixtureWillDelete()]
+<.> xref:#teardownFixture_[teardownFixture()]
 +
 --
-For tests that need to delete the command table first. Should be run in the @BeforeEach of the test.
+Note that this is _NOT_ an implementation of the _ModuleWithFixtures#getTeardownFixture()_ API; but is provided to allow manual teardown if required.
 --
 
 == Members
 
-[#getTeardownFixtureWillDelete_]
-=== getTeardownFixtureWillDelete()
+[#teardownFixture_]
+=== teardownFixture()
 
-For tests that need to delete the command table first. Should be run in the @BeforeEach of the test.
+Note that this is _NOT_ an implementation of the _ModuleWithFixtures#getTeardownFixture()_ API; but is provided to allow manual teardown if required.
diff --git a/antora/components/refguide-index/modules/extensions/pages/index/commandlog/jpa/IsisModuleExtCommandLogPersistenceJpa.adoc b/antora/components/refguide-index/modules/extensions/pages/index/commandlog/jpa/IsisModuleExtCommandLogPersistenceJpa.adoc
index 4a99cf5085..86cd977177 100644
--- a/antora/components/refguide-index/modules/extensions/pages/index/commandlog/jpa/IsisModuleExtCommandLogPersistenceJpa.adoc
+++ b/antora/components/refguide-index/modules/extensions/pages/index/commandlog/jpa/IsisModuleExtCommandLogPersistenceJpa.adoc
@@ -9,7 +9,19 @@
 class IsisModuleExtCommandLogPersistenceJpa {
   public static final String NAMESPACE;
   public static final String SCHEMA;
-  FixtureScript getTeardownFixture()
+  FixtureScript teardownFixture()     // <.>
 }
 ----
 
+<.> xref:#teardownFixture_[teardownFixture()]
++
+--
+Note that this is _NOT_ an implementation of the _ModuleWithFixtures#getTeardownFixture()_ API; but is provided to allow manual teardown if required.
+--
+
+== Members
+
+[#teardownFixture_]
+=== teardownFixture()
+
+Note that this is _NOT_ an implementation of the _ModuleWithFixtures#getTeardownFixture()_ API; but is provided to allow manual teardown if required.
diff --git a/antora/components/refguide-index/modules/extensions/pages/index/executionoutbox/jdo/IsisModuleExtExecutionOutboxPersistenceJdo.adoc b/antora/components/refguide-index/modules/extensions/pages/index/executionoutbox/jdo/IsisModuleExtExecutionOutboxPersistenceJdo.adoc
index 90603f4652..5a5cf7fd89 100644
--- a/antora/components/refguide-index/modules/extensions/pages/index/executionoutbox/jdo/IsisModuleExtExecutionOutboxPersistenceJdo.adoc
+++ b/antora/components/refguide-index/modules/extensions/pages/index/executionoutbox/jdo/IsisModuleExtExecutionOutboxPersistenceJdo.adoc
@@ -9,19 +9,19 @@
 class IsisModuleExtExecutionOutboxPersistenceJdo {
   public static final String NAMESPACE;
   public static final String SCHEMA;
-  FixtureScript getTeardownFixtureWillDelete()     // <.>
+  FixtureScript teardownFixture()     // <.>
 }
 ----
 
-<.> xref:#getTeardownFixtureWillDelete_[getTeardownFixtureWillDelete()]
+<.> xref:#teardownFixture_[teardownFixture()]
 +
 --
-For tests that need to delete the command table first. Should be run in the @BeforeEach of the test.
+Note that this is _NOT_ an implementation of the _ModuleWithFixtures#getTeardownFixture()_ API; but is provided to allow manual teardown if required.
 --
 
 == Members
 
-[#getTeardownFixtureWillDelete_]
-=== getTeardownFixtureWillDelete()
+[#teardownFixture_]
+=== teardownFixture()
 
-For tests that need to delete the command table first. Should be run in the @BeforeEach of the test.
+Note that this is _NOT_ an implementation of the _ModuleWithFixtures#getTeardownFixture()_ API; but is provided to allow manual teardown if required.
diff --git a/antora/components/refguide-index/modules/extensions/pages/index/executionoutbox/jpa/IsisModuleExtExecutionOutboxPersistenceJpa.adoc b/antora/components/refguide-index/modules/extensions/pages/index/executionoutbox/jpa/IsisModuleExtExecutionOutboxPersistenceJpa.adoc
index 8d2bb293d1..5d84b68406 100644
--- a/antora/components/refguide-index/modules/extensions/pages/index/executionoutbox/jpa/IsisModuleExtExecutionOutboxPersistenceJpa.adoc
+++ b/antora/components/refguide-index/modules/extensions/pages/index/executionoutbox/jpa/IsisModuleExtExecutionOutboxPersistenceJpa.adoc
@@ -9,7 +9,19 @@
 class IsisModuleExtExecutionOutboxPersistenceJpa {
   public static final String NAMESPACE;
   public static final String SCHEMA;
-  FixtureScript getTeardownFixture()
+  FixtureScript teardownFixture()     // <.>
 }
 ----
 
+<.> xref:#teardownFixture_[teardownFixture()]
++
+--
+Note that this is _NOT_ an implementation of the _ModuleWithFixtures#getTeardownFixture()_ API; but is provided to allow manual teardown if required.
+--
+
+== Members
+
+[#teardownFixture_]
+=== teardownFixture()
+
+Note that this is _NOT_ an implementation of the _ModuleWithFixtures#getTeardownFixture()_ API; but is provided to allow manual teardown if required.
diff --git a/antora/components/refguide-index/modules/extensions/pages/index/secman/jdo/IsisModuleExtSecmanPersistenceJdo.adoc b/antora/components/refguide-index/modules/extensions/pages/index/secman/jdo/IsisModuleExtSecmanPersistenceJdo.adoc
index 2fa981c51c..24027b1c22 100644
--- a/antora/components/refguide-index/modules/extensions/pages/index/secman/jdo/IsisModuleExtSecmanPersistenceJdo.adoc
+++ b/antora/components/refguide-index/modules/extensions/pages/index/secman/jdo/IsisModuleExtSecmanPersistenceJdo.adoc
@@ -7,6 +7,19 @@
 .IsisModuleExtSecmanPersistenceJdo.java
 ----
 class IsisModuleExtSecmanPersistenceJdo {
+  FixtureScript teardownFixture()     // <.>
 }
 ----
 
+<.> xref:#teardownFixture_[teardownFixture()]
++
+--
+Note that this is _NOT_ an implementation of the _ModuleWithFixtures#getTeardownFixture()_ API; but is provided to allow manual teardown if required.
+--
+
+== Members
+
+[#teardownFixture_]
+=== teardownFixture()
+
+Note that this is _NOT_ an implementation of the _ModuleWithFixtures#getTeardownFixture()_ API; but is provided to allow manual teardown if required.
diff --git a/antora/components/refguide-index/modules/extensions/pages/index/secman/jpa/IsisModuleExtSecmanPersistenceJpa.adoc b/antora/components/refguide-index/modules/extensions/pages/index/secman/jpa/IsisModuleExtSecmanPersistenceJpa.adoc
index 59ccb21bca..9927483c68 100644
--- a/antora/components/refguide-index/modules/extensions/pages/index/secman/jpa/IsisModuleExtSecmanPersistenceJpa.adoc
+++ b/antora/components/refguide-index/modules/extensions/pages/index/secman/jpa/IsisModuleExtSecmanPersistenceJpa.adoc
@@ -7,7 +7,19 @@
 .IsisModuleExtSecmanPersistenceJpa.java
 ----
 class IsisModuleExtSecmanPersistenceJpa {
-  FixtureScript getTeardownFixture()
+  FixtureScript teardownFixture()     // <.>
 }
 ----
 
+<.> xref:#teardownFixture_[teardownFixture()]
++
+--
+Note that this is _NOT_ an implementation of the _ModuleWithFixtures#getTeardownFixture()_ API; but is provided to allow manual teardown if required.
+--
+
+== Members
+
+[#teardownFixture_]
+=== teardownFixture()
+
+Note that this is _NOT_ an implementation of the _ModuleWithFixtures#getTeardownFixture()_ API; but is provided to allow manual teardown if required.
diff --git a/antora/components/refguide-index/modules/extensions/pages/index/secman/jdo/IsisModuleExtSecmanPersistenceJdo.adoc b/antora/components/refguide-index/modules/persistence/pages/index/jdo/datanucleus/IsisModulePersistenceJdoDatanucleusMixins.adoc
similarity index 84%
copy from antora/components/refguide-index/modules/extensions/pages/index/secman/jdo/IsisModuleExtSecmanPersistenceJdo.adoc
copy to antora/components/refguide-index/modules/persistence/pages/index/jdo/datanucleus/IsisModulePersistenceJdoDatanucleusMixins.adoc
index 2fa981c51c..bbc1b5f53b 100644
--- a/antora/components/refguide-index/modules/extensions/pages/index/secman/jdo/IsisModuleExtSecmanPersistenceJdo.adoc
+++ b/antora/components/refguide-index/modules/persistence/pages/index/jdo/datanucleus/IsisModulePersistenceJdoDatanucleusMixins.adoc
@@ -1,12 +1,12 @@
-= IsisModuleExtSecmanPersistenceJdo
+= IsisModulePersistenceJdoDatanucleusMixins
 :Notice: 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 ag [...]
 
 == API
 
 [source,java]
-.IsisModuleExtSecmanPersistenceJdo.java
+.IsisModulePersistenceJdoDatanucleusMixins.java
 ----
-class IsisModuleExtSecmanPersistenceJdo {
+class IsisModulePersistenceJdoDatanucleusMixins {
 }
 ----
 
diff --git a/antora/components/refguide-index/modules/viewer/pages/index/commons/applib/mixins/Object_impersonate.adoc b/antora/components/refguide-index/modules/viewer/pages/index/commons/applib/mixins/Object_impersonate.adoc
index 0b1c9cc045..295352c843 100644
--- a/antora/components/refguide-index/modules/viewer/pages/index/commons/applib/mixins/Object_impersonate.adoc
+++ b/antora/components/refguide-index/modules/viewer/pages/index/commons/applib/mixins/Object_impersonate.adoc
@@ -1,7 +1,7 @@
 = Object_impersonate
 :Notice: 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 ag [...]
 
-Same as _ImpersonateMenu.impersonate#act(String)_ , but implemented as a mixin so that can be invoked while accessing an object.
+Same as _org.apache.isis.applib.services.user.ImpersonateMenu.impersonate#act(String)_ , but implemented as a mixin so that can be invoked while accessing an object.
 
 == API
 
diff --git a/antora/components/refguide-index/modules/extensions/pages/index/secman/jdo/IsisModuleExtSecmanPersistenceJdo.adoc b/antora/components/refguide-index/modules/viewer/pages/index/commons/applib/services/branding/BrandingUiService.adoc
similarity index 84%
copy from antora/components/refguide-index/modules/extensions/pages/index/secman/jdo/IsisModuleExtSecmanPersistenceJdo.adoc
copy to antora/components/refguide-index/modules/viewer/pages/index/commons/applib/services/branding/BrandingUiService.adoc
index 2fa981c51c..f23f609175 100644
--- a/antora/components/refguide-index/modules/extensions/pages/index/secman/jdo/IsisModuleExtSecmanPersistenceJdo.adoc
+++ b/antora/components/refguide-index/modules/viewer/pages/index/commons/applib/services/branding/BrandingUiService.adoc
@@ -1,12 +1,14 @@
-= IsisModuleExtSecmanPersistenceJdo
+= BrandingUiService
 :Notice: 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 ag [...]
 
 == API
 
 [source,java]
-.IsisModuleExtSecmanPersistenceJdo.java
+.BrandingUiService.java
 ----
-class IsisModuleExtSecmanPersistenceJdo {
+interface BrandingUiService {
+  BrandingUiModel getHeaderBranding()
+  BrandingUiModel getSignInBranding()
 }
 ----
 
diff --git a/antora/components/refguide-index/modules/extensions/pages/index/secman/jdo/IsisModuleExtSecmanPersistenceJdo.adoc b/antora/components/refguide-index/modules/viewer/pages/index/commons/applib/services/header/HeaderUiService.adoc
similarity index 87%
copy from antora/components/refguide-index/modules/extensions/pages/index/secman/jdo/IsisModuleExtSecmanPersistenceJdo.adoc
copy to antora/components/refguide-index/modules/viewer/pages/index/commons/applib/services/header/HeaderUiService.adoc
index 2fa981c51c..d66610cecb 100644
--- a/antora/components/refguide-index/modules/extensions/pages/index/secman/jdo/IsisModuleExtSecmanPersistenceJdo.adoc
+++ b/antora/components/refguide-index/modules/viewer/pages/index/commons/applib/services/header/HeaderUiService.adoc
@@ -1,12 +1,13 @@
-= IsisModuleExtSecmanPersistenceJdo
+= HeaderUiService
 :Notice: 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 ag [...]
 
 == API
 
 [source,java]
-.IsisModuleExtSecmanPersistenceJdo.java
+.HeaderUiService.java
 ----
-class IsisModuleExtSecmanPersistenceJdo {
+interface HeaderUiService {
+  HeaderUiModel getHeader()
 }
 ----
 
diff --git a/antora/components/refguide-index/modules/extensions/pages/index/secman/jpa/IsisModuleExtSecmanPersistenceJpa.adoc b/antora/components/refguide-index/modules/viewer/pages/index/commons/applib/services/menu/MenuUiService.adoc
similarity index 80%
copy from antora/components/refguide-index/modules/extensions/pages/index/secman/jpa/IsisModuleExtSecmanPersistenceJpa.adoc
copy to antora/components/refguide-index/modules/viewer/pages/index/commons/applib/services/menu/MenuUiService.adoc
index 59ccb21bca..eecf72e87f 100644
--- a/antora/components/refguide-index/modules/extensions/pages/index/secman/jpa/IsisModuleExtSecmanPersistenceJpa.adoc
+++ b/antora/components/refguide-index/modules/viewer/pages/index/commons/applib/services/menu/MenuUiService.adoc
@@ -1,13 +1,14 @@
-= IsisModuleExtSecmanPersistenceJpa
+= MenuUiService
 :Notice: 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 ag [...]
 
 == API
 
 [source,java]
-.IsisModuleExtSecmanPersistenceJpa.java
+.MenuUiService.java
 ----
-class IsisModuleExtSecmanPersistenceJpa {
-  FixtureScript getTeardownFixture()
+interface MenuUiService {
+  MenuUiModel getMenu(DomainServiceLayout.MenuBar menuBarSelect)
+  void buildMenuItems(MenuUiModel menuUiModel, MenuVisitor menuBuilder)
 }
 ----
 
diff --git a/antora/components/refguide-index/modules/viewer/pages/index/commons/applib/services/userprof/UserProfileUiModelProvider.adoc b/antora/components/refguide-index/modules/viewer/pages/index/commons/applib/services/userprof/UserProfileUiService.adoc
similarity index 92%
rename from antora/components/refguide-index/modules/viewer/pages/index/commons/applib/services/userprof/UserProfileUiModelProvider.adoc
rename to antora/components/refguide-index/modules/viewer/pages/index/commons/applib/services/userprof/UserProfileUiService.adoc
index 271caf8fbd..eb515291d3 100644
--- a/antora/components/refguide-index/modules/viewer/pages/index/commons/applib/services/userprof/UserProfileUiModelProvider.adoc
+++ b/antora/components/refguide-index/modules/viewer/pages/index/commons/applib/services/userprof/UserProfileUiService.adoc
@@ -1,4 +1,4 @@
-= UserProfileUiModelProvider
+= UserProfileUiService
 :Notice: 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 ag [...]
 
 Returns a UI model to represent the currently logged in user.
@@ -8,9 +8,9 @@ This is backed by the _org.apache.isis.applib.services.user.UserMemento_ obtaine
 == API
 
 [source,java]
-.UserProfileUiModelProvider.java
+.UserProfileUiService.java
 ----
-interface UserProfileUiModelProvider {
+interface UserProfileUiService {
   UserProfileUiModel userProfile()     // <.>
 }
 ----
diff --git a/antora/components/refguide-index/modules/viewer/pages/index/restfulobjects/rendering/service/valuerender/JsonValueEncoderService.adoc b/antora/components/refguide-index/modules/viewer/pages/index/restfulobjects/rendering/service/valuerender/JsonValueEncoderService.adoc
index 65b40681fe..cdffd96d4c 100644
--- a/antora/components/refguide-index/modules/viewer/pages/index/restfulobjects/rendering/service/valuerender/JsonValueEncoderService.adoc
+++ b/antora/components/refguide-index/modules/viewer/pages/index/restfulobjects/rendering/service/valuerender/JsonValueEncoderService.adoc
@@ -1,7 +1,7 @@
 = JsonValueEncoderService
 :Notice: 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 ag [...]
 
-Converts value representing _ManagedObject_ s to their corresponding JSON representation and back.
+Converts value representing xref:refguide:core:index/metamodel/object/ManagedObject.adoc[ManagedObject] s to their corresponding JSON representation and back.
 
 == API
 
@@ -20,17 +20,17 @@ interface JsonValueEncoderService {
 <.> xref:#asAdapter_ObjectSpecification_JsonRepresentation_JsonValueConverter_Context[asAdapter(ObjectSpecification, JsonRepresentation, JsonValueConverter_Context)]
 +
 --
-The value recovered from xref:refguide:viewer:index/restfulobjects/applib/JsonRepresentation.adoc[JsonRepresentation] as _ManagedObject_ honoring _Context_ , otherwise `null` .
+The value recovered from xref:refguide:viewer:index/restfulobjects/applib/JsonRepresentation.adoc[JsonRepresentation] as xref:refguide:core:index/metamodel/object/ManagedObject.adoc[ManagedObject] honoring _Context_ , otherwise `null` .
 --
 <.> xref:#appendValueAndFormat_ManagedObject_JsonRepresentation_JsonValueConverter_Context[appendValueAndFormat(ManagedObject, JsonRepresentation, JsonValueConverter_Context)]
 +
 --
-Appends given value type representing _ManagedObject_ to given xref:refguide:viewer:index/restfulobjects/applib/JsonRepresentation.adoc[JsonRepresentation] honoring _Context_ .
+Appends given value type representing xref:refguide:core:index/metamodel/object/ManagedObject.adoc[ManagedObject] to given xref:refguide:viewer:index/restfulobjects/applib/JsonRepresentation.adoc[JsonRepresentation] honoring _Context_ .
 --
 <.> xref:#asObject_ManagedObject_JsonValueConverter_Context[asObject(ManagedObject, JsonValueConverter_Context)]
 +
 --
-A _JsonNode_ or otherwise natively supported simple type from given _ManagedObject_ , honoring _Context_ .
+A _JsonNode_ or otherwise natively supported simple type from given xref:refguide:core:index/metamodel/object/ManagedObject.adoc[ManagedObject] , honoring _Context_ .
 --
 
 == Members
@@ -38,14 +38,14 @@ A _JsonNode_ or otherwise natively supported simple type from given _ManagedObje
 [#asAdapter_ObjectSpecification_JsonRepresentation_JsonValueConverter_Context]
 === asAdapter(ObjectSpecification, JsonRepresentation, JsonValueConverter_Context)
 
-The value recovered from xref:refguide:viewer:index/restfulobjects/applib/JsonRepresentation.adoc[JsonRepresentation] as _ManagedObject_ honoring _Context_ , otherwise `null` .
+The value recovered from xref:refguide:viewer:index/restfulobjects/applib/JsonRepresentation.adoc[JsonRepresentation] as xref:refguide:core:index/metamodel/object/ManagedObject.adoc[ManagedObject] honoring _Context_ , otherwise `null` .
 
 [#appendValueAndFormat_ManagedObject_JsonRepresentation_JsonValueConverter_Context]
 === appendValueAndFormat(ManagedObject, JsonRepresentation, JsonValueConverter_Context)
 
-Appends given value type representing _ManagedObject_ to given xref:refguide:viewer:index/restfulobjects/applib/JsonRepresentation.adoc[JsonRepresentation] honoring _Context_ .
+Appends given value type representing xref:refguide:core:index/metamodel/object/ManagedObject.adoc[ManagedObject] to given xref:refguide:viewer:index/restfulobjects/applib/JsonRepresentation.adoc[JsonRepresentation] honoring _Context_ .
 
 [#asObject_ManagedObject_JsonValueConverter_Context]
 === asObject(ManagedObject, JsonValueConverter_Context)
 
-A _JsonNode_ or otherwise natively supported simple type from given _ManagedObject_ , honoring _Context_ .
+A _JsonNode_ or otherwise natively supported simple type from given xref:refguide:core:index/metamodel/object/ManagedObject.adoc[ManagedObject] , honoring _Context_ .
diff --git a/core/adoc/modules/_overview/pages/about.adoc b/core/adoc/modules/_overview/pages/about.adoc
index 7af9eab836..b42a9b323e 100644
--- a/core/adoc/modules/_overview/pages/about.adoc
+++ b/core/adoc/modules/_overview/pages/about.adoc
@@ -731,7 +731,6 @@ Directory: /examples/demo/domain
 |.Components
 ****
 demoapp.dom.AppConfiguration +
-demoapp.dom._infra.DefaultTitleProvider +
 demoapp.dom._infra.LibraryPreloadingService +
 demoapp.dom._infra.resources.AsciiDocConverterService +
 demoapp.dom._infra.resources.AsciiDocReaderService +
@@ -1686,7 +1685,7 @@ org.jmock:jmock:jar:<managed> +
 
 .Document Index Entries
 ****
-xref:refguide:core:index/metamodel/services/command/CommandDtoFactory.adoc[CommandDtoFactory], xref:refguide:core:index/metamodel/services/ixn/InteractionDtoFactory.adoc[InteractionDtoFactory], xref:refguide:core:index/metamodel/services/publishing/CommandPublisher.adoc[CommandPublisher], xref:refguide:core:index/metamodel/services/publishing/ExecutionPublisher.adoc[ExecutionPublisher], xref:refguide:core:index/metamodel/services/schema/SchemaValueMarshaller.adoc[SchemaValueMarshaller],  [...]
+xref:refguide:core:index/metamodel/object/ManagedObject.adoc[ManagedObject], xref:refguide:core:index/metamodel/services/command/CommandDtoFactory.adoc[CommandDtoFactory], xref:refguide:core:index/metamodel/services/ixn/InteractionDtoFactory.adoc[InteractionDtoFactory], xref:refguide:core:index/metamodel/services/publishing/CommandPublisher.adoc[CommandPublisher], xref:refguide:core:index/metamodel/services/publishing/ExecutionPublisher.adoc[ExecutionPublisher], xref:refguide:core:index/ [...]
 ****
 
 |Apache Isis Core - Runtime
@@ -2149,7 +2148,7 @@ org.springframework.boot:spring-boot-starter-jdbc:jar:<managed> +
 
 .Document Index Entries
 ****
-xref:refguide:persistence:index/jdo/datanucleus/IsisModulePersistenceJdoDatanucleus.adoc[IsisModulePersistenceJdoDatanucleus], xref:refguide:persistence:index/jdo/datanucleus/changetracking/JdoLifecycleListener.adoc[JdoLifecycleListener], xref:refguide:persistence:index/jdo/datanucleus/dialect/DnJdoDialect.adoc[DnJdoDialect], xref:refguide:persistence:index/jdo/datanucleus/mixins/Persistable_datanucleusVersionLong.adoc[Persistable_datanucleusVersionLong], xref:refguide:persistence:index/ [...]
+xref:refguide:persistence:index/jdo/datanucleus/IsisModulePersistenceJdoDatanucleus.adoc[IsisModulePersistenceJdoDatanucleus], xref:refguide:persistence:index/jdo/datanucleus/IsisModulePersistenceJdoDatanucleusMixins.adoc[IsisModulePersistenceJdoDatanucleusMixins], xref:refguide:persistence:index/jdo/datanucleus/changetracking/JdoLifecycleListener.adoc[JdoLifecycleListener], xref:refguide:persistence:index/jdo/datanucleus/dialect/DnJdoDialect.adoc[DnJdoDialect], xref:refguide:persistence [...]
 ****
 
 |Apache Isis Persistence - JDO (integration)
@@ -2701,13 +2700,27 @@ skinparam rectangle<<4>> {
   FontColor #fffffe
   BorderColor #2E6295
 }
+skinparam rectangle<<5>> {
+  BackgroundColor #438dd5
+  FontColor #fffffe
+  BorderColor #2E6295
+}
+skinparam rectangle<<6>> {
+  BackgroundColor #438dd5
+  FontColor #fffffe
+  BorderColor #2E6295
+}
 package "Common\n[Software System]" {
-  rectangle "==Apache Isis Commons - Prism\n<size:10>[Container: packaging: jar]</size>" <<4>> as 4
+  rectangle "==Apache Isis Commons - Prism\n<size:10>[Container: packaging: jar]</size>" <<5>> as 5
   rectangle "==Apache Isis Viewer - Commons\n<size:10>[Container: packaging: pom]</size>" <<2>> as 2
-  rectangle "==Apache Isis Viewer - Commons Model\n<size:10>[Container: packaging: jar]</size>" <<3>> as 3
+  rectangle "==Apache Isis Viewer - Commons Applib\n<size:10>[Container: packaging: jar]</size>" <<3>> as 3
+  rectangle "==Apache Isis Viewer - Commons Model\n<size:10>[Container: packaging: jar]</size>" <<4>> as 4
+  rectangle "==Apache Isis Viewer - Commons Services\n<size:10>[Container: packaging: jar]</size>" <<6>> as 6
 }
-2 .[#707070].> 4 : ""
+2 .[#707070].> 5 : ""
 2 .[#707070].> 3 : ""
+2 .[#707070].> 4 : ""
+2 .[#707070].> 6 : ""
 @enduml
 ----
 .Projects/Modules (Common)
@@ -2725,32 +2738,38 @@ Directory: /viewers/commons
 ----
 |
 
-|Apache Isis Viewer - Commons Model
+|Apache Isis Viewer - Commons Applib
 [source,yaml]
 ----
 Group: org.apache.isis.viewer
-Artifact: isis-viewer-commons-model
+Artifact: isis-viewer-commons-applib
 Type: jar
-Directory: /viewers/commons/model
+Directory: /viewers/commons/applib
 ----
-|.Components
+|.Dependencies
 ****
-o.a.i.viewer.commons.model.branding.BrandingUiModelProvider +
-o.a.i.viewer.commons.model.header.HeaderUiModelProvider +
-o.a.i.viewer.commons.model.menu.MenuUiModelProvider +
-o.a.i.viewer.commons.model.userprofile.UserProfileUiModelProviderDefault +
+org.apache.isis.core:isis-core-metamodel:jar:<managed> +
 ****
 
-.Dependencies
+.Document Index Entries
 ****
-org.apache.isis.core:isis-core-internaltestsupport:jar:<managed> +
-org.apache.isis.core:isis-core-runtime:jar:<managed> +
-org.webjars:font-awesome:jar:6.1.2 +
+xref:refguide:viewer:index/commons/applib/mixins/Object_impersonate.adoc[Object_impersonate], xref:refguide:viewer:index/commons/applib/mixins/Object_impersonateWithRoles.adoc[Object_impersonateWithRoles], xref:refguide:viewer:index/commons/applib/services/branding/BrandingUiService.adoc[BrandingUiService], xref:refguide:viewer:index/commons/applib/services/header/HeaderUiService.adoc[HeaderUiService], xref:refguide:viewer:index/commons/applib/services/menu/MenuUiService.adoc[MenuUiServi [...]
 ****
 
-.Document Index Entries
+|Apache Isis Viewer - Commons Model
+[source,yaml]
+----
+Group: org.apache.isis.viewer
+Artifact: isis-viewer-commons-model
+Type: jar
+Directory: /viewers/commons/model
+----
+|.Dependencies
 ****
-xref:refguide:viewer:index/commons/applib/mixins/Object_impersonate.adoc[Object_impersonate], xref:refguide:viewer:index/commons/applib/mixins/Object_impersonateWithRoles.adoc[Object_impersonateWithRoles], xref:refguide:viewer:index/commons/applib/services/userprof/UserProfileUiModel.adoc[UserProfileUiModel], xref:refguide:viewer:index/commons/applib/services/userprof/UserProfileUiModelProvider.adoc[UserProfileUiModelProvider]
+org.apache.isis.core:isis-core-internaltestsupport:jar:<managed> +
+org.apache.isis.core:isis-core-runtime:jar:<managed> +
+org.apache.isis.viewer:isis-viewer-commons-applib:jar:<managed> +
+org.webjars:font-awesome:jar:6.1.2 +
 ****
 
 |Apache Isis Commons - Prism
@@ -2767,6 +2786,28 @@ Directory: /viewers/commons/prism
 ****
 org.webjars.bowergithub.prismjs:prism:jar:1.28.0 +
 ****
+
+|Apache Isis Viewer - Commons Services
+[source,yaml]
+----
+Group: org.apache.isis.viewer
+Artifact: isis-viewer-commons-services
+Type: jar
+Directory: /viewers/commons/services
+----
+|.Components
+****
+o.a.i.viewer.commons.services.branding.BrandingUiServiceDefault +
+o.a.i.viewer.commons.services.header.HeaderUiServiceDefault +
+o.a.i.viewer.commons.services.menu.MenuUiServiceDefault +
+o.a.i.viewer.commons.services.userprof.UserProfileUiServiceDefault +
+****
+
+.Dependencies
+****
+org.apache.isis.core:isis-core-runtime:jar:<managed> +
+org.apache.isis.viewer:isis-viewer-commons-model:jar:<managed> +
+****
 |===
 
 === Restful Objects
@@ -3007,7 +3048,7 @@ o.a.i.viewer.restfulobjects.viewer.resources.VersionResourceServerside +
 com.fasterxml.jackson.module:jackson-module-jaxb-annotations:jar:<managed> +
 org.apache.isis.core:isis-core-internaltestsupport:jar:<managed> +
 org.apache.isis.core:isis-core-webapp:jar:<managed> +
-org.apache.isis.viewer:isis-viewer-commons-model:jar:<managed> +
+org.apache.isis.viewer:isis-viewer-commons-services:jar:<managed> +
 org.apache.isis.viewer:isis-viewer-restfulobjects-rendering:jar:<managed> +
 ****
 
@@ -3151,7 +3192,9 @@ de.agilecoders.wicket:wicket-bootstrap-themes:jar:<managed> +
 de.agilecoders.wicket.webjars:wicket-webjars:jar:<managed> +
 javax.servlet:javax.servlet-api:jar:<managed> +
 org.apache.isis.core:isis-core-internaltestsupport:jar:<managed> +
-org.apache.isis.viewer:isis-viewer-commons-prism:jar:${project.version} +
+org.apache.isis.core:isis-core-runtimeservices:jar:<managed> +
+org.apache.isis.viewer:isis-viewer-commons-prism:jar:<managed> +
+org.apache.isis.viewer:isis-viewer-commons-services:jar:<managed> +
 org.apache.isis.viewer:isis-viewer-wicket-model:jar:<managed> +
 org.apache.wicket:wicket-auth-roles:jar:<managed> +
 org.apache.wicket:wicket-devutils:jar:<managed> +
@@ -5931,12 +5974,12 @@ skinparam rectangle<<11>> {
   FontColor #fffffe
   BorderColor #2E6295
 }
-skinparam rectangle<<23>> {
+skinparam rectangle<<12>> {
   BackgroundColor #438dd5
   FontColor #fffffe
   BorderColor #2E6295
 }
-skinparam rectangle<<12>> {
+skinparam rectangle<<23>> {
   BackgroundColor #438dd5
   FontColor #fffffe
   BorderColor #2E6295
@@ -6784,7 +6827,8 @@ com.vaadin:vaadin-spring:jar:<managed> +
 commons-fileupload:commons-fileupload:jar:1.4 +
 org.apache.isis.core:isis-core-runtimeservices:jar:<managed> +
 org.apache.isis.incubator.viewer:isis-viewer-vaadin-model:jar:<managed> +
-org.apache.isis.viewer:isis-viewer-commons-prism:jar:${project.version} +
+org.apache.isis.viewer:isis-viewer-commons-prism:jar:<managed> +
+org.apache.isis.viewer:isis-viewer-commons-services:jar:<managed> +
 ****
 
 |Apache Isis Inc - Viewer Vaadin (Viewer)


[isis] 01/02: ISIS-3167: declare the new ManagedObject contracts

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

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

commit a7b85c2845217ddab8112725f25fc4642018806e
Author: Andi Huber <ah...@apache.org>
AuthorDate: Sun Aug 28 21:42:28 2022 +0200

    ISIS-3167: declare the new ManagedObject contracts
---
 .../isis/core/metamodel/object/ManagedObject.java  | 199 ++++++++++++++++++++-
 .../core/metamodel/object/PackedManagedObject.java |   1 +
 .../metamodel/object/_ManagedObjectPacked.java     |  10 ++
 .../metamodel/object/_ManagedObjectSpecified.java  |   7 +
 .../object/_ManagedObjectUnspecified.java          |   9 +
 5 files changed, 225 insertions(+), 1 deletion(-)

diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/object/ManagedObject.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/object/ManagedObject.java
index 6a9858336f..172f71ec2b 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/object/ManagedObject.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/object/ManagedObject.java
@@ -25,6 +25,7 @@ import java.util.function.UnaryOperator;
 import org.springframework.lang.Nullable;
 
 import org.apache.isis.applib.services.bookmark.Bookmark;
+import org.apache.isis.commons.collections.Can;
 import org.apache.isis.commons.internal.assertions._Assert;
 import org.apache.isis.commons.internal.collections._Collections;
 import org.apache.isis.commons.internal.exceptions._Exceptions;
@@ -34,16 +35,212 @@ import org.apache.isis.core.metamodel.facets.object.title.TitleRenderRequest;
 import org.apache.isis.core.metamodel.spec.ObjectSpecification;
 import org.apache.isis.core.metamodel.specloader.SpecificationLoader;
 
+import lombok.Getter;
 import lombok.NonNull;
+import lombok.RequiredArgsConstructor;
 import lombok.val;
 
 /**
  * Represents an instance of some element of the meta-model managed by the framework,
- * that is IoC-container provided beans, persistence-stack provided entities, view-models
+ * that is <i>Spring</i> managed beans, persistence-stack provided entities, view-models
  * or instances of value types.
+ *
+ * @since 2.0 {@index}}
+ *
  */
 public interface ManagedObject extends HasMetaModelContext {
 
+    /**
+     * ManagedObject specializations have varying contract/behavior.
+     */
+    @Getter
+    @RequiredArgsConstructor
+    enum Specialization {
+        /**
+         * <h1>Contract</h1><ul>
+         * <li>Specification (null, immutable)</li>
+         * <li>Bookmark (n/a)</li>
+         * <li>Pojo (null, immutable)</li>
+         * </ul>
+         * @implNote realized by a singleton (static) {@link ManagedObject} instance;
+         */
+        UNSPECIFIED(TypePolicy.NO_TYPE, BookmarkPolicy.NO_BOOKMARK, PojoPolicy.NO_POJO),
+
+        /**
+         * <h1>Contract</h1><ul>
+         * <li>Specification (immutable,  allowed to correspond to abstract type)</li>
+         * <li>Bookmark (n/a)</li>
+         * <li>Pojo (null, immutable)</li>
+         * </ul>
+         */
+        EMPTY(TypePolicy.ABSTRACT_TYPE_ALLOWED, BookmarkPolicy.NO_BOOKMARK, PojoPolicy.NO_POJO),
+
+        /**
+         * <h1>Contract</h1><ul>
+         * <li>Specification (immutable,  NOT allowed to correspond to abstract type)</li>
+         * <li>Bookmark (immutable)</li>
+         * <li>Pojo (immutable)</li>
+         * </ul>
+         */
+        VALUE(TypePolicy.EXACT_TYPE_REQUIRED, BookmarkPolicy.IMMUTABLE, PojoPolicy.IMMUTABLE),
+
+        /**
+         * <h1>Contract</h1><ul>
+         * <li>Specification (immutable,  NOT allowed to correspond to abstract type)</li>
+         * <li>Bookmark (immutable)</li>
+         * <li>Pojo (immutable)</li>
+         * </ul>
+         */
+        SERVICE(TypePolicy.EXACT_TYPE_REQUIRED, BookmarkPolicy.IMMUTABLE, PojoPolicy.IMMUTABLE),
+
+        /**
+         * <h1>Contract</h1><ul>
+         * <li>Specification (immutable,  NOT allowed to correspond to abstract type)</li>
+         * <li>Bookmark (refreshable, as VM state changes manifest in change of ID)</li>
+         * <li>Pojo (mutable, but immutable obj. ref.)</li>
+         * </ul>
+         */
+        VIEWMODEL(TypePolicy.EXACT_TYPE_REQUIRED, BookmarkPolicy.REFRESHABLE, PojoPolicy.STATEFUL),
+
+        /**
+         * <h1>Contract</h1><ul>
+         * <li>Specification (immutable,  NOT allowed to correspond to abstract type)</li>
+         * <li>Bookmark (immutable,  entity must be persistent, it must have an ID,  fail otherwise)</li>
+         * <li>Pojo (refetchable)</li>
+         * </ul>
+         */
+        ENTITY(TypePolicy.EXACT_TYPE_REQUIRED, BookmarkPolicy.IMMUTABLE, PojoPolicy.REFETCHABLE),
+
+        /**
+         * <h1>Contract</h1><ul>
+         * <li>Element Specification (immutable,  allowed to correspond to abstract type)</li>
+         * <li>Bookmark (n/a)</li>
+         * <li>Pojo (unmod. Collection of pojos)</li>
+         * </ul>
+         */
+        PACKED(TypePolicy.ABSTRACT_TYPE_ALLOWED, BookmarkPolicy.NO_BOOKMARK, PojoPolicy.PACKED);
+
+        static enum TypePolicy {
+            /** has no type information */
+            NO_TYPE,
+            /** has type information, abstract types are allowed */
+            ABSTRACT_TYPE_ALLOWED,
+            /** has type information, exact types are required */
+            EXACT_TYPE_REQUIRED;
+            ////
+            /** has no type information */
+            public boolean isNoType() { return this == NO_TYPE; }
+            /** has type information, abstract types are allowed */
+            public boolean isAbstractTypeAllowed() { return this == ABSTRACT_TYPE_ALLOWED; }
+            /** has type information, exact types are required */
+            public boolean isExactTypeRequired() { return this == EXACT_TYPE_REQUIRED; }
+            /** has type information */
+            public boolean isTypeRequiredAny() { return !isNoType(); }
+        }
+        static enum BookmarkPolicy {
+            /** has no {@link Bookmark} */
+            NO_BOOKMARK,
+            /** has an immutable {@link Bookmark} */
+            IMMUTABLE,
+            /** has an refreshable {@link Bookmark}, that is a mutable object reference */
+            REFRESHABLE;
+            ////
+            /** has no {@link Bookmark} */
+            public boolean isNoBookmark() { return this == NO_BOOKMARK; }
+            /** has an immutable {@link Bookmark} */
+            public boolean isImmutable() { return this == IMMUTABLE; }
+            /** has an refreshable {@link Bookmark}, that is a mutable object reference */
+            public boolean isRefreshable() { return this == REFRESHABLE; }
+        }
+        static enum PojoPolicy {
+            /** has no pojo, immutable <code>null</code> */
+            NO_POJO,
+            /** has a non-null pojo, immutable, with immutable object reference */
+            IMMUTABLE,
+            /** has a stateful pojo, with immutable object reference */
+            STATEFUL,
+            /** has a stateful pojo, with mutable object reference */
+            REFETCHABLE,
+            /** has an unmodifiable collection of pojos; the collection's object reference is immutable;
+             * supports unpacking into a {@link Can} of {@link ManagedObject}s;*/
+            PACKED;
+            ////
+            /** has no pojo, immutable <code>null</code> */
+            public boolean isNoPojo() { return this == NO_POJO; }
+            /** has a non-null pojo, immutable, with immutable object reference */
+            public boolean isImmutable() { return this == IMMUTABLE; }
+            /** has a stateful pojo, with immutable object reference */
+            public boolean isStateful() { return this == STATEFUL; }
+            /** has a stateful pojo, with mutable object reference */
+            public boolean isRefetchable() { return this == REFETCHABLE; }
+            /** has an unmodifiable collection of pojos; the collection's object reference is immutable;
+             * supports unpacking into a {@link Can} of {@link ManagedObject}s;*/
+            public boolean isPacked() { return this == PACKED; }
+        }
+
+        private final TypePolicy typePolicy;
+        private final BookmarkPolicy bookmarkPolicy;
+        private final PojoPolicy pojoPolicy;
+
+        /**
+         * UNSPECIFIED
+         * @see TypePolicy#NO_TYPE
+         * @see BookmarkPolicy#NO_BOOKMARK
+         * @see PojoPolicy#NO_POJO
+         */
+        public boolean isUnspecified() { return this == UNSPECIFIED; }
+        /**
+         * EMPTY
+         * @see TypePolicy#ABSTRACT_TYPE_ALLOWED
+         * @see BookmarkPolicy#NO_BOOKMARK
+         * @see PojoPolicy#NO_POJO
+         */
+        public boolean isEmpty() { return this == EMPTY; }
+        /**
+         * VALUE
+         * @see TypePolicy#EXACT_TYPE_REQUIRED
+         * @see BookmarkPolicy#IMMUTABLE
+         * @see PojoPolicy#IMMUTABLE
+         */
+        public boolean isValue() { return this == VALUE; }
+        /**
+         * SERVICE
+         * @see TypePolicy#EXACT_TYPE_REQUIRED
+         * @see BookmarkPolicy#IMMUTABLE
+         * @see PojoPolicy#IMMUTABLE
+         */
+        public boolean isService() { return this == SERVICE; }
+        /**
+         * VIEWMODEL
+         * @see TypePolicy#EXACT_TYPE_REQUIRED
+         * @see BookmarkPolicy#REFRESHABLE
+         * @see PojoPolicy#STATEFUL
+         */
+        public boolean isViewmodel() { return this == VIEWMODEL; }
+        /**
+         * ENTITY
+         * @see TypePolicy#EXACT_TYPE_REQUIRED
+         * @see BookmarkPolicy#IMMUTABLE
+         * @see PojoPolicy#REFETCHABLE
+         */
+        public boolean isEntity() { return this == ENTITY; }
+        /**
+         * PACKED
+         * @see TypePolicy#ABSTRACT_TYPE_ALLOWED
+         * @see BookmarkPolicy#NO_BOOKMARK
+         * @see PojoPolicy#PACKED
+         */
+        public boolean isPacked() { return this == PACKED; }
+
+    }
+
+    /**
+     * Returns the specific {@link Specialization} this {@link ManagedObject} implements,
+     * which governs this object's behavior.
+     * @implNote FIXME[ISIS-3167] not fully implemented yet
+     */
+    Specialization getSpecialization();
+
     /**
      * Returns the specification that details the structure (meta-model) of this object.
      */
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/object/PackedManagedObject.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/object/PackedManagedObject.java
index ed3fd10b3d..46c3d57574 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/object/PackedManagedObject.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/object/PackedManagedObject.java
@@ -23,6 +23,7 @@ import org.apache.isis.core.metamodel.spec.ObjectSpecification;
 
 /**
  * 'Collection' of {@link ManagedObject}s.
+ * @see ManagedObject.Specialization#PACKED
  */
 public interface PackedManagedObject
 extends ManagedObject {
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/object/_ManagedObjectPacked.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/object/_ManagedObjectPacked.java
index d0fe434271..adbc6cf7f9 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/object/_ManagedObjectPacked.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/object/_ManagedObjectPacked.java
@@ -34,6 +34,10 @@ import lombok.NonNull;
 import lombok.RequiredArgsConstructor;
 import lombok.ToString;
 
+/**
+ * (package private) specialization corresponding to {@link Specialization#PACKED}
+ * @see ManagedObject.Specialization#PACKED
+ */
 @RequiredArgsConstructor
 @ToString
 final class _ManagedObjectPacked
@@ -43,6 +47,11 @@ implements PackedManagedObject {
     final @NonNull ObjectSpecification elementSpec;
     final @NonNull Can<ManagedObject> nonScalar;
 
+    @Override
+    public Specialization getSpecialization() {
+        return Specialization.PACKED;
+    }
+
     @Override
     public ObjectSpecification getSpecification() {
         return elementSpec;
@@ -50,6 +59,7 @@ implements PackedManagedObject {
 
     @Override
     public Object getPojo() {
+        // this algorithm preserves null pojos ...
         return Collections.unmodifiableList(
                 nonScalar.stream()
                 .map(ManagedObject::getPojo)
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/object/_ManagedObjectSpecified.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/object/_ManagedObjectSpecified.java
index 8536725ee7..49d2872b8e 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/object/_ManagedObjectSpecified.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/object/_ManagedObjectSpecified.java
@@ -20,11 +20,18 @@ package org.apache.isis.core.metamodel.object;
 
 import java.util.function.Supplier;
 
+import org.apache.isis.commons.internal.exceptions._Exceptions;
 import org.apache.isis.core.metamodel.context.MetaModelContext;
 
 abstract class _ManagedObjectSpecified
 implements ManagedObject {
 
+    @Override
+    public Specialization getSpecialization() {
+        //FIXME[ISIS-3167] implement for various sub types
+        throw _Exceptions.notImplemented();
+    }
+
     @Override
     public final MetaModelContext getMetaModelContext() {
         return getSpecification().getMetaModelContext();
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/object/_ManagedObjectUnspecified.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/object/_ManagedObjectUnspecified.java
index 49d6c014b1..84ba189070 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/object/_ManagedObjectUnspecified.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/object/_ManagedObjectUnspecified.java
@@ -28,11 +28,20 @@ import org.apache.isis.commons.internal.exceptions._Exceptions;
 import org.apache.isis.core.metamodel.context.MetaModelContext;
 import org.apache.isis.core.metamodel.spec.ObjectSpecification;
 
+/**
+ * (package private) specialization corresponding to {@link Specialization#PACKED}
+ * @see ManagedObject.Specialization#PACKED
+ */
 final class _ManagedObjectUnspecified
 implements ManagedObject {
 
     static final ManagedObject INSTANCE = new _ManagedObjectUnspecified();
 
+    @Override
+    public Specialization getSpecialization() {
+        return Specialization.UNSPECIFIED;
+    }
+
     @Override
     public ObjectSpecification getSpecification() {
         throw _Exceptions.unsupportedOperation();