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

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


The following commit(s) were added to refs/heads/main by this push:
     new 4acf470186a CAUSEWAY-3913: fluent ownership accessors [Layout]
4acf470186a is described below

commit 4acf470186aff83b2880789263ac23e18805bc34
Author: a.huber <[email protected]>
AuthorDate: Sun Oct 26 08:22:26 2025 +0100

    CAUSEWAY-3913: fluent ownership accessors [Layout]
    
    - to indicate that its not part of the dto spec
---
 .../applib/layout/component/ActionLayoutData.java      |  3 ++-
 .../applib/layout/component/ActionLayoutDataOwner.java |  5 ++++-
 .../applib/layout/component/CollectionLayoutData.java  |  5 +++--
 .../layout/component/CollectionLayoutDataOwner.java    |  5 ++++-
 .../layout/component/DomainObjectLayoutData.java       |  5 +++--
 .../layout/component/DomainObjectLayoutDataOwner.java  |  5 ++++-
 .../causeway/applib/layout/component/FieldSet.java     |  5 +++--
 .../applib/layout/component/FieldSetOwner.java         |  5 ++++-
 .../applib/layout/component/MemberRegionOwner.java     |  3 ++-
 .../apache/causeway/applib/layout/component/Owned.java |  2 +-
 .../apache/causeway/applib/layout/component/Owner.java | 10 +++++++++-
 .../applib/layout/component/PropertyLayoutData.java    |  5 +++--
 .../layout/component/ServiceActionLayoutDataOwner.java |  5 ++++-
 .../grid/bootstrap/BSElementOwnerResolvingWalker.java  | 18 +++++++++---------
 .../layout/grid/bootstrap/BSGridTransformer.java       | 11 ++++++-----
 .../causeway/applib/layout/grid/bootstrap/BSRow.java   |  3 ++-
 .../applib/layout/grid/bootstrap/BSRowContent.java     |  3 ++-
 .../layout/grid/bootstrap/BSRowContentOwner.java       |  3 ++-
 .../applib/layout/grid/bootstrap/BSRowOwner.java       |  3 ++-
 .../causeway/applib/layout/grid/bootstrap/BSTab.java   |  3 ++-
 .../applib/layout/grid/bootstrap/BSTabGroup.java       |  3 ++-
 .../causeway/applib/layout/grid/bootstrap/BSUtil.java  | 16 ++++++++--------
 .../layout/menubars/bootstrap/BSMenuSection.java       |  2 +-
 .../services/grid/GridSystemServiceAbstract.java       | 16 +++++++---------
 .../grid/bootstrap/GridSystemServiceBootstrap.java     |  8 ++++----
 25 files changed, 93 insertions(+), 59 deletions(-)

diff --git 
a/api/applib/src/main/java/org/apache/causeway/applib/layout/component/ActionLayoutData.java
 
b/api/applib/src/main/java/org/apache/causeway/applib/layout/component/ActionLayoutData.java
index 0becb426e12..eb47268c841 100644
--- 
a/api/applib/src/main/java/org/apache/causeway/applib/layout/component/ActionLayoutData.java
+++ 
b/api/applib/src/main/java/org/apache/causeway/applib/layout/component/ActionLayoutData.java
@@ -34,6 +34,7 @@
 
 import lombok.Getter;
 import lombok.Setter;
+import lombok.experimental.Accessors;
 
 /**
  * Describes the layout of a single action, broadly corresponding to
@@ -99,7 +100,7 @@ public ActionLayoutData(final String id) {
      * <p>Set programmatically by framework after reading in from XML.
      */
     @XmlTransient
-    @Getter @Setter
+    @Getter @Setter @Accessors(fluent=true)
     private ActionLayoutDataOwner owner;
 
     /**
diff --git 
a/api/applib/src/main/java/org/apache/causeway/applib/layout/component/ActionLayoutDataOwner.java
 
b/api/applib/src/main/java/org/apache/causeway/applib/layout/component/ActionLayoutDataOwner.java
index a899f78996e..233048457e0 100644
--- 
a/api/applib/src/main/java/org/apache/causeway/applib/layout/component/ActionLayoutDataOwner.java
+++ 
b/api/applib/src/main/java/org/apache/causeway/applib/layout/component/ActionLayoutDataOwner.java
@@ -20,9 +20,12 @@
 
 import java.util.List;
 
+import org.apache.causeway.applib.layout.grid.bootstrap.BSCol;
+
 /**
  * @since 1.x {@index}
  */
-public interface ActionLayoutDataOwner extends Owner {
+public sealed interface ActionLayoutDataOwner extends Owner
+permits BSCol, CollectionLayoutData, FieldSet, PropertyLayoutData {
     List<ActionLayoutData> getActions();
 }
diff --git 
a/api/applib/src/main/java/org/apache/causeway/applib/layout/component/CollectionLayoutData.java
 
b/api/applib/src/main/java/org/apache/causeway/applib/layout/component/CollectionLayoutData.java
index a32926c2928..3d1cab3af6a 100644
--- 
a/api/applib/src/main/java/org/apache/causeway/applib/layout/component/CollectionLayoutData.java
+++ 
b/api/applib/src/main/java/org/apache/causeway/applib/layout/component/CollectionLayoutData.java
@@ -36,6 +36,7 @@
 
 import lombok.Getter;
 import lombok.Setter;
+import lombok.experimental.Accessors;
 
 /**
  * Describes the layout of a single collection, broadly corresponds to the
@@ -49,7 +50,7 @@
         "named", "describedAs", "cssClass", "defaultView", "hidden", "paged",
         "sortedBy", "tableDecorator", "actions", "metadataError", "link"})
 @XmlAccessorType(XmlAccessType.FIELD)
-public class CollectionLayoutData
+public final class CollectionLayoutData
 implements MemberRegion<CollectionLayoutDataOwner>,
 ActionLayoutDataOwner,
 Serializable,
@@ -113,7 +114,7 @@ public CollectionLayoutData(final String id) {
      * <p>Set programmatically by framework after reading in from XML.
      */
     @XmlTransient
-    @Getter @Setter
+    @Getter @Setter @Accessors(fluent=true)
     private CollectionLayoutDataOwner owner;
 
     /**
diff --git 
a/api/applib/src/main/java/org/apache/causeway/applib/layout/component/CollectionLayoutDataOwner.java
 
b/api/applib/src/main/java/org/apache/causeway/applib/layout/component/CollectionLayoutDataOwner.java
index 933e17cf0e4..c427c52c656 100644
--- 
a/api/applib/src/main/java/org/apache/causeway/applib/layout/component/CollectionLayoutDataOwner.java
+++ 
b/api/applib/src/main/java/org/apache/causeway/applib/layout/component/CollectionLayoutDataOwner.java
@@ -20,9 +20,12 @@
 
 import java.util.List;
 
+import org.apache.causeway.applib.layout.grid.bootstrap.BSCol;
+
 /**
  * @since 1.x {@index}
  */
-public interface CollectionLayoutDataOwner extends MemberRegionOwner {
+public sealed interface CollectionLayoutDataOwner extends MemberRegionOwner
+permits BSCol {
     List<CollectionLayoutData> getCollections();
 }
diff --git 
a/api/applib/src/main/java/org/apache/causeway/applib/layout/component/DomainObjectLayoutData.java
 
b/api/applib/src/main/java/org/apache/causeway/applib/layout/component/DomainObjectLayoutData.java
index 48bb9f53472..37afde789af 100644
--- 
a/api/applib/src/main/java/org/apache/causeway/applib/layout/component/DomainObjectLayoutData.java
+++ 
b/api/applib/src/main/java/org/apache/causeway/applib/layout/component/DomainObjectLayoutData.java
@@ -34,6 +34,7 @@
 
 import lombok.Getter;
 import lombok.Setter;
+import lombok.experimental.Accessors;
 
 /**
  * Describes the layout of the title and icon of a domain object, broadly 
corresponding to {@link 
org.apache.causeway.applib.annotation.DomainObjectLayout}.
@@ -45,7 +46,7 @@
     "named", "describedAs", "cssClass", "cssClassFa", "cssClassFaPosition",
     "paged", "tableDecorator", "metadataError", "link"})
 @XmlAccessorType(XmlAccessType.FIELD)
-public class DomainObjectLayoutData implements Serializable, 
Owned<DomainObjectLayoutDataOwner>,
+public final class DomainObjectLayoutData implements Serializable, 
Owned<DomainObjectLayoutDataOwner>,
 HasBookmarking, HasCssClass, HasCssClassFa, HasDescribedAs, HasNamed {
     private static final long serialVersionUID = 1L;
 
@@ -95,7 +96,7 @@ public DomainObjectLayoutData() {}
      * <p>Set programmatically by framework after reading in from XML.
      */
     @XmlTransient
-    @Getter @Setter
+    @Getter @Setter @Accessors(fluent=true)
     private DomainObjectLayoutDataOwner owner;
 
     /**
diff --git 
a/api/applib/src/main/java/org/apache/causeway/applib/layout/component/DomainObjectLayoutDataOwner.java
 
b/api/applib/src/main/java/org/apache/causeway/applib/layout/component/DomainObjectLayoutDataOwner.java
index c5eba7f56f4..a64a59df4d9 100644
--- 
a/api/applib/src/main/java/org/apache/causeway/applib/layout/component/DomainObjectLayoutDataOwner.java
+++ 
b/api/applib/src/main/java/org/apache/causeway/applib/layout/component/DomainObjectLayoutDataOwner.java
@@ -18,10 +18,13 @@
  */
 package org.apache.causeway.applib.layout.component;
 
+import org.apache.causeway.applib.layout.grid.bootstrap.BSCol;
+
 /**
  * @since 1.x {@index}
  */
-public interface DomainObjectLayoutDataOwner extends Owner {
+public sealed interface DomainObjectLayoutDataOwner extends Owner
+permits BSCol {
 
     DomainObjectLayoutData getDomainObject();
     void setDomainObject(DomainObjectLayoutData domainObjectLayoutData);
diff --git 
a/api/applib/src/main/java/org/apache/causeway/applib/layout/component/FieldSet.java
 
b/api/applib/src/main/java/org/apache/causeway/applib/layout/component/FieldSet.java
index 4eae6fe39ea..c73280f8161 100644
--- 
a/api/applib/src/main/java/org/apache/causeway/applib/layout/component/FieldSet.java
+++ 
b/api/applib/src/main/java/org/apache/causeway/applib/layout/component/FieldSet.java
@@ -35,6 +35,7 @@
 
 import lombok.Getter;
 import lombok.Setter;
+import lombok.experimental.Accessors;
 
 /**
  * A {@link MemberRegion region} of the page containing a set of
@@ -48,7 +49,7 @@
         name = "fieldSet",
         propOrder = {"name", "actions", "properties", "metadataError"})
 @XmlAccessorType(XmlAccessType.FIELD)
-public class FieldSet
+public final class FieldSet
 implements MemberRegion<FieldSetOwner>, ActionLayoutDataOwner, Serializable {
     private static final long serialVersionUID = 1L;
 
@@ -109,7 +110,7 @@ public FieldSet(final String name) {
      * <p>Set programmatically by framework after reading in from XML.
      */
     @XmlTransient
-    @Getter @Setter
+    @Getter @Setter @Accessors(fluent=true)
     private FieldSetOwner owner;
 
     /**
diff --git 
a/api/applib/src/main/java/org/apache/causeway/applib/layout/component/FieldSetOwner.java
 
b/api/applib/src/main/java/org/apache/causeway/applib/layout/component/FieldSetOwner.java
index ea46b8848c2..14389eaa56a 100644
--- 
a/api/applib/src/main/java/org/apache/causeway/applib/layout/component/FieldSetOwner.java
+++ 
b/api/applib/src/main/java/org/apache/causeway/applib/layout/component/FieldSetOwner.java
@@ -20,9 +20,12 @@
 
 import java.util.List;
 
+import org.apache.causeway.applib.layout.grid.bootstrap.BSCol;
+
 /**
  * @since 1.x {@index}
  */
-public interface FieldSetOwner extends MemberRegionOwner {
+public sealed interface FieldSetOwner extends MemberRegionOwner
+permits BSCol {
     List<FieldSet> getFieldSets();
 }
diff --git 
a/api/applib/src/main/java/org/apache/causeway/applib/layout/component/MemberRegionOwner.java
 
b/api/applib/src/main/java/org/apache/causeway/applib/layout/component/MemberRegionOwner.java
index f24ba23e0e1..0b58cfdb12d 100644
--- 
a/api/applib/src/main/java/org/apache/causeway/applib/layout/component/MemberRegionOwner.java
+++ 
b/api/applib/src/main/java/org/apache/causeway/applib/layout/component/MemberRegionOwner.java
@@ -21,6 +21,7 @@
 /**
  * @since 1.x {@index}
  */
-public interface MemberRegionOwner extends Owner {
+public sealed interface MemberRegionOwner extends Owner
+permits CollectionLayoutDataOwner, FieldSetOwner {
 
 }
diff --git 
a/api/applib/src/main/java/org/apache/causeway/applib/layout/component/Owned.java
 
b/api/applib/src/main/java/org/apache/causeway/applib/layout/component/Owned.java
index f3ce4230ae0..27253f959cf 100644
--- 
a/api/applib/src/main/java/org/apache/causeway/applib/layout/component/Owned.java
+++ 
b/api/applib/src/main/java/org/apache/causeway/applib/layout/component/Owned.java
@@ -22,5 +22,5 @@
  * @since 1.x {@index}
  */
 public interface Owned<T extends Owner> {
-    T getOwner();
+    T owner();
 }
diff --git 
a/api/applib/src/main/java/org/apache/causeway/applib/layout/component/Owner.java
 
b/api/applib/src/main/java/org/apache/causeway/applib/layout/component/Owner.java
index 7e1bedcde97..c4d039d92cc 100644
--- 
a/api/applib/src/main/java/org/apache/causeway/applib/layout/component/Owner.java
+++ 
b/api/applib/src/main/java/org/apache/causeway/applib/layout/component/Owner.java
@@ -18,9 +18,17 @@
  */
 package org.apache.causeway.applib.layout.component;
 
+import org.apache.causeway.applib.layout.grid.bootstrap.BSRowContentOwner;
+import org.apache.causeway.applib.layout.grid.bootstrap.BSRowOwner;
+import org.apache.causeway.applib.layout.grid.bootstrap.BSTabGroupOwner;
+import org.apache.causeway.applib.layout.grid.bootstrap.BSTabOwner;
+
 /**
  * @since 1.x {@index}
  */
-public interface Owner {
+public sealed interface Owner
+permits ActionLayoutDataOwner, BSRowContentOwner, BSRowOwner, BSTabGroupOwner,
+BSTabOwner, DomainObjectLayoutDataOwner, MemberRegionOwner,
+ServiceActionLayoutDataOwner {
 
 }
diff --git 
a/api/applib/src/main/java/org/apache/causeway/applib/layout/component/PropertyLayoutData.java
 
b/api/applib/src/main/java/org/apache/causeway/applib/layout/component/PropertyLayoutData.java
index 42414597436..648302b9c3b 100644
--- 
a/api/applib/src/main/java/org/apache/causeway/applib/layout/component/PropertyLayoutData.java
+++ 
b/api/applib/src/main/java/org/apache/causeway/applib/layout/component/PropertyLayoutData.java
@@ -38,6 +38,7 @@
 
 import lombok.Getter;
 import lombok.Setter;
+import lombok.experimental.Accessors;
 
 /**
  * Describes the layout of a single property, broadly corresponds to the 
{@link org.apache.causeway.applib.annotation.PropertyLayout} annotation.
@@ -49,7 +50,7 @@
     name = "property",
     propOrder = {"named", "describedAs", "actions", "metadataError", "link"})
 @XmlAccessorType(XmlAccessType.FIELD)
-public class PropertyLayoutData
+public final class PropertyLayoutData
 implements ActionLayoutDataOwner, Serializable, Owned<FieldSet>,
 HasCssClass, HasDescribedAs, HasHidden, HasNamed  {
     private static final long serialVersionUID = 1L;
@@ -115,7 +116,7 @@ public PropertyLayoutData(final String id) {
      * <p>Set programmatically by framework after reading in from XML.
      */
     @XmlTransient
-    @Getter @Setter
+    @Getter @Setter @Accessors(fluent=true)
     private FieldSet owner;
 
     /**
diff --git 
a/api/applib/src/main/java/org/apache/causeway/applib/layout/component/ServiceActionLayoutDataOwner.java
 
b/api/applib/src/main/java/org/apache/causeway/applib/layout/component/ServiceActionLayoutDataOwner.java
index bf2ea1b58a4..72b4a029908 100644
--- 
a/api/applib/src/main/java/org/apache/causeway/applib/layout/component/ServiceActionLayoutDataOwner.java
+++ 
b/api/applib/src/main/java/org/apache/causeway/applib/layout/component/ServiceActionLayoutDataOwner.java
@@ -20,9 +20,12 @@
 
 import java.util.List;
 
+import org.apache.causeway.applib.layout.menubars.bootstrap.BSMenuSection;
+
 /**
  * @since 1.x {@index}
  */
-public interface ServiceActionLayoutDataOwner extends Owner {
+public sealed interface ServiceActionLayoutDataOwner extends Owner
+permits BSMenuSection {
     List<ServiceActionLayoutData> getServiceActions();
 }
diff --git 
a/api/applib/src/main/java/org/apache/causeway/applib/layout/grid/bootstrap/BSElementOwnerResolvingWalker.java
 
b/api/applib/src/main/java/org/apache/causeway/applib/layout/grid/bootstrap/BSElementOwnerResolvingWalker.java
index d3a8098ad90..a485b732053 100644
--- 
a/api/applib/src/main/java/org/apache/causeway/applib/layout/grid/bootstrap/BSElementOwnerResolvingWalker.java
+++ 
b/api/applib/src/main/java/org/apache/causeway/applib/layout/grid/bootstrap/BSElementOwnerResolvingWalker.java
@@ -36,14 +36,14 @@ public void walk() {
 
     private void traverseRows(final BSRowOwner rowOwner) {
         for (BSRow bsRow : rowOwner.getRows()) {
-            bsRow.setOwner(rowOwner);
+            bsRow.owner(rowOwner);
             traverseCols(bsRow);
         }
     }
 
     private void traverseCols(final BSRow bsRow) {
         for (BSRowContent rowContent : bsRow.getRowContents()) {
-            rowContent.setOwner(bsRow);
+            rowContent.owner(bsRow);
             if(rowContent instanceof BSCol bsCol) {
                 traverseDomainObject(bsCol);
                 traverseTabGroups(bsCol);
@@ -58,19 +58,19 @@ private void traverseCols(final BSRow bsRow) {
     private void traverseDomainObject(final BSCol bsCol) {
         var domainObject = bsCol.getDomainObject();
         if(domainObject == null) return;
-        domainObject.setOwner(bsCol);
+        domainObject.owner(bsCol);
     }
 
     private void traverseTabGroups(final BSTabGroupOwner bsTabGroupOwner) {
         for (BSTabGroup bsTabGroup : bsTabGroupOwner.getTabGroups()) {
-            bsTabGroup.setOwner(bsTabGroupOwner);
+            bsTabGroup.owner(bsTabGroupOwner);
             traverseTabs(bsTabGroup);
         }
     }
 
     private void traverseTabs(final BSTabOwner bsTabOwner) {
         for (BSTab tab : bsTabOwner.getTabs()) {
-            tab.setOwner(bsTabOwner);
+            tab.owner(bsTabOwner);
             traverseRows(tab);
         }
     }
@@ -78,18 +78,18 @@ private void traverseTabs(final BSTabOwner bsTabOwner) {
     private void traverseActions(final ActionLayoutDataOwner 
actionLayoutDataOwner) {
         if(actionLayoutDataOwner.getActions() == null) return;
         for (final ActionLayoutData actionLayoutData : 
actionLayoutDataOwner.getActions()) {
-            actionLayoutData.setOwner(actionLayoutDataOwner);
+            actionLayoutData.owner(actionLayoutDataOwner);
         }
     }
 
     private void traverseFieldSets(final FieldSetOwner fieldSetOwner) {
         final List<FieldSet> fieldSets = fieldSetOwner.getFieldSets();
         for (FieldSet fieldSet : fieldSets) {
-            fieldSet.setOwner(fieldSetOwner);
+            fieldSet.owner(fieldSetOwner);
             traverseActions(fieldSet);
             final List<PropertyLayoutData> properties = 
fieldSet.getProperties();
             for (final PropertyLayoutData property : properties) {
-                property.setOwner(fieldSet);
+                property.owner(fieldSet);
                 traverseActions(property);
             }
         }
@@ -99,7 +99,7 @@ private void traverseCollections(
         final CollectionLayoutDataOwner owner) {
         final List<CollectionLayoutData> collections = owner.getCollections();
         for (CollectionLayoutData collection : collections) {
-            collection.setOwner(owner);
+            collection.owner(owner);
             traverseActions(collection);
         }
     }
diff --git 
a/api/applib/src/main/java/org/apache/causeway/applib/layout/grid/bootstrap/BSGridTransformer.java
 
b/api/applib/src/main/java/org/apache/causeway/applib/layout/grid/bootstrap/BSGridTransformer.java
index 236784b51a7..36605c7360d 100644
--- 
a/api/applib/src/main/java/org/apache/causeway/applib/layout/grid/bootstrap/BSGridTransformer.java
+++ 
b/api/applib/src/main/java/org/apache/causeway/applib/layout/grid/bootstrap/BSGridTransformer.java
@@ -44,6 +44,7 @@ static final class Flag {
         public BSGrid apply(final BSGrid bsGrid) {
             var emptyTabs = new ArrayList<BSTab>();
 
+            // first phase: collect all empty tabs for removal
             bsGrid.visit(new BSElement.Visitor() {
 
                 final Stack<Flag> stack = new Stack<Flag>();
@@ -67,8 +68,7 @@ public BSGrid apply(final BSGrid bsGrid) {
                 @Override public void postVisit(final BSTab bsTab) {
                     var flag = stack.pop();
                     if(!flag.keep) {
-                        // collecting into list, so we don't risk a 
ConcurrentModificationException,
-                        // when racing with the underlying iterator
+                        // collecting empty tabs
                         emptyTabs.add(bsTab);
                     }
                 }
@@ -77,6 +77,7 @@ private void keep() {
                 }
             });
 
+            // second phase: removal of tabs not to keep
             emptyTabs.forEach(tab->
                 BSUtil.remove(tab)
                     .map(BSTabGroup.class::cast)
@@ -159,12 +160,12 @@ public void visit(final BSTabGroup bsTabGroup) {
                     // opt-out semantics: absence of the attribute results in 
participation
                     if(!bsTabGroup.isCollapseIfOne(true)) return;
 
-                    var parent = (BSCol) bsTabGroup.getOwner();
-                    parent.getTabGroups().remove(bsTabGroup);
+                    var col = (BSCol) bsTabGroup.owner();
+                    col.getTabGroups().remove(bsTabGroup);
                     // relocate rows from tab to owning col
                     bsTabGroup.getTabs().get(0).getRows()
                         .forEach(row->{
-                            parent.getRows().add(row);
+                            col.getRows().add(row);
                         });
                 }
             });
diff --git 
a/api/applib/src/main/java/org/apache/causeway/applib/layout/grid/bootstrap/BSRow.java
 
b/api/applib/src/main/java/org/apache/causeway/applib/layout/grid/bootstrap/BSRow.java
index f335f1a9fa2..bf3984b3af3 100644
--- 
a/api/applib/src/main/java/org/apache/causeway/applib/layout/grid/bootstrap/BSRow.java
+++ 
b/api/applib/src/main/java/org/apache/causeway/applib/layout/grid/bootstrap/BSRow.java
@@ -31,6 +31,7 @@
 import lombok.Getter;
 import lombok.NoArgsConstructor;
 import lombok.Setter;
+import lombok.experimental.Accessors;
 
 /**
  * Contains a row of content, either on the top-level {@link BSGrid page} or 
at any other lower-level element that can
@@ -72,7 +73,7 @@ public final class BSRow extends BSElementAbstract implements 
HasElementId, BSRo
      * <p>Set programmatically by framework after reading in from XML.
      */
     @XmlTransient
-    @Getter @Setter
+    @Getter @Setter @Accessors(fluent=true)
     private BSRowOwner owner;
 
     @Override public String toString() {
diff --git 
a/api/applib/src/main/java/org/apache/causeway/applib/layout/grid/bootstrap/BSRowContent.java
 
b/api/applib/src/main/java/org/apache/causeway/applib/layout/grid/bootstrap/BSRowContent.java
index 4f355c868f7..d02352d1ef1 100644
--- 
a/api/applib/src/main/java/org/apache/causeway/applib/layout/grid/bootstrap/BSRowContent.java
+++ 
b/api/applib/src/main/java/org/apache/causeway/applib/layout/grid/bootstrap/BSRowContent.java
@@ -23,6 +23,7 @@
 
 import lombok.Getter;
 import lombok.Setter;
+import lombok.experimental.Accessors;
 
 /**
  * Common superclass for any content of a row.
@@ -49,7 +50,7 @@ public sealed abstract class BSRowContent extends 
BSElementAbstract
      * <p>Set programmatically by framework after reading in from XML.
      */
     @XmlTransient
-    @Getter @Setter
+    @Getter @Setter @Accessors(fluent=true)
     private BSRowContentOwner owner;
 
 }
diff --git 
a/api/applib/src/main/java/org/apache/causeway/applib/layout/grid/bootstrap/BSRowContentOwner.java
 
b/api/applib/src/main/java/org/apache/causeway/applib/layout/grid/bootstrap/BSRowContentOwner.java
index 542cf8b234b..bd2cb595151 100644
--- 
a/api/applib/src/main/java/org/apache/causeway/applib/layout/grid/bootstrap/BSRowContentOwner.java
+++ 
b/api/applib/src/main/java/org/apache/causeway/applib/layout/grid/bootstrap/BSRowContentOwner.java
@@ -25,7 +25,8 @@
 /**
  * @since 1.x {@index}
  */
-public interface BSRowContentOwner extends Owner {
+public sealed interface BSRowContentOwner extends Owner
+permits BSRow {
 
     List<BSRowContent> getRowContents();
 
diff --git 
a/api/applib/src/main/java/org/apache/causeway/applib/layout/grid/bootstrap/BSRowOwner.java
 
b/api/applib/src/main/java/org/apache/causeway/applib/layout/grid/bootstrap/BSRowOwner.java
index f62bc730a2d..4394a5f017e 100644
--- 
a/api/applib/src/main/java/org/apache/causeway/applib/layout/grid/bootstrap/BSRowOwner.java
+++ 
b/api/applib/src/main/java/org/apache/causeway/applib/layout/grid/bootstrap/BSRowOwner.java
@@ -25,7 +25,8 @@
 /**
  * @since 1.x {@index}
  */
-public interface BSRowOwner extends Owner {
+public sealed interface BSRowOwner extends Owner
+permits BSCol, BSGrid, BSTab {
 
     List<BSRow> getRows();
 }
diff --git 
a/api/applib/src/main/java/org/apache/causeway/applib/layout/grid/bootstrap/BSTab.java
 
b/api/applib/src/main/java/org/apache/causeway/applib/layout/grid/bootstrap/BSTab.java
index b7b021e3d7c..6b26ef98f2d 100644
--- 
a/api/applib/src/main/java/org/apache/causeway/applib/layout/grid/bootstrap/BSTab.java
+++ 
b/api/applib/src/main/java/org/apache/causeway/applib/layout/grid/bootstrap/BSTab.java
@@ -28,6 +28,7 @@
 
 import lombok.Getter;
 import lombok.Setter;
+import lombok.experimental.Accessors;
 
 /**
  * Represents a tab within a {@link BSTabGroup tab group}.
@@ -56,7 +57,7 @@ public final class BSTab extends BSElementAbstract implements 
BSRowOwner {
      * <p>Set programmatically by framework after reading in from XML.
      */
     @XmlTransient
-    @Getter @Setter
+    @Getter @Setter @Accessors(fluent=true)
     private BSTabOwner owner;
 
     @Override public String toString() {
diff --git 
a/api/applib/src/main/java/org/apache/causeway/applib/layout/grid/bootstrap/BSTabGroup.java
 
b/api/applib/src/main/java/org/apache/causeway/applib/layout/grid/bootstrap/BSTabGroup.java
index 9a946141969..47ed9b3f4cc 100644
--- 
a/api/applib/src/main/java/org/apache/causeway/applib/layout/grid/bootstrap/BSTabGroup.java
+++ 
b/api/applib/src/main/java/org/apache/causeway/applib/layout/grid/bootstrap/BSTabGroup.java
@@ -28,6 +28,7 @@
 
 import lombok.Getter;
 import lombok.Setter;
+import lombok.experimental.Accessors;
 
 /**
  * Represents a tab group containing one or more {@link BSTab tab}s.
@@ -72,7 +73,7 @@ public boolean isCollapseIfOne(boolean _default) {
      * <p>Set programmatically by framework after reading in from XML.
      */
     @XmlTransient
-    @Getter @Setter
+    @Getter @Setter @Accessors(fluent=true)
     private BSTabGroupOwner owner;
 
     /**
diff --git 
a/api/applib/src/main/java/org/apache/causeway/applib/layout/grid/bootstrap/BSUtil.java
 
b/api/applib/src/main/java/org/apache/causeway/applib/layout/grid/bootstrap/BSUtil.java
index 93652a1c232..e03d859cbdc 100644
--- 
a/api/applib/src/main/java/org/apache/causeway/applib/layout/grid/bootstrap/BSUtil.java
+++ 
b/api/applib/src/main/java/org/apache/causeway/applib/layout/grid/bootstrap/BSUtil.java
@@ -85,30 +85,30 @@ public BSGrid resolveOwners(final BSGrid grid) {
 
     /** removes the tab from its owner and returns the owner */
     public Optional<BSTabOwner> remove(BSTab tab) {
-        var ownerOpt = Optional.ofNullable(tab.getOwner());
+        var ownerOpt = Optional.ofNullable(tab.owner());
         ownerOpt.ifPresent(owner->owner.getTabs().remove(tab));
-        tab.setOwner(null);
+        tab.owner(null);
         return ownerOpt;
     }
     /** removes the col from its owner and returns the owner */
     public Optional<BSRowContentOwner> remove(BSCol col) {
-        var ownerOpt = Optional.ofNullable(col.getOwner());
+        var ownerOpt = Optional.ofNullable(col.owner());
         ownerOpt.ifPresent(owner->owner.getRowContents().remove(col));
-        col.setOwner(null);
+        col.owner(null);
         return ownerOpt;
     }
     /** removes the tabGroup from its owner and returns the owner */
     public Optional<BSTabGroupOwner> remove(BSTabGroup tabGroup) {
-        var ownerOpt = Optional.ofNullable(tabGroup.getOwner());
+        var ownerOpt = Optional.ofNullable(tabGroup.owner());
         ownerOpt.ifPresent(owner->owner.getTabGroups().remove(tabGroup));
-        tabGroup.setOwner(null);
+        tabGroup.owner(null);
         return ownerOpt;
     }
     /** removes the row from its owner and returns the owner */
     public Optional<BSRowOwner> remove(BSRow row) {
-        var ownerOpt = Optional.ofNullable(row.getOwner());
+        var ownerOpt = Optional.ofNullable(row.owner());
         ownerOpt.ifPresent(owner->owner.getRows().remove(row));
-        row.setOwner(null);
+        row.owner(null);
         return ownerOpt;
     }
 
diff --git 
a/api/applib/src/main/java/org/apache/causeway/applib/layout/menubars/bootstrap/BSMenuSection.java
 
b/api/applib/src/main/java/org/apache/causeway/applib/layout/menubars/bootstrap/BSMenuSection.java
index 42a6cdc7770..71fd07d2ec1 100644
--- 
a/api/applib/src/main/java/org/apache/causeway/applib/layout/menubars/bootstrap/BSMenuSection.java
+++ 
b/api/applib/src/main/java/org/apache/causeway/applib/layout/menubars/bootstrap/BSMenuSection.java
@@ -41,7 +41,7 @@
  */
 @XmlType(name = "section", propOrder = {"named", "serviceActions"})
 @XmlAccessorType(XmlAccessType.FIELD)
-public class BSMenuSection implements MenuSection, Serializable, 
ServiceActionLayoutDataOwner {
+public final class BSMenuSection implements MenuSection, Serializable, 
ServiceActionLayoutDataOwner {
     private static final long serialVersionUID = 1L;
 
     public BSMenuSection() {}
diff --git 
a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/services/grid/GridSystemServiceAbstract.java
 
b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/services/grid/GridSystemServiceAbstract.java
index 841a5263737..1b3dc7feac4 100644
--- 
a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/services/grid/GridSystemServiceAbstract.java
+++ 
b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/services/grid/GridSystemServiceAbstract.java
@@ -180,11 +180,9 @@ public void visit(final DomainObjectLayoutData 
domainObjectLayoutData) {
             @Override
             public void visit(final ActionLayoutData actionLayoutData) {
 
-                var actionLayoutDataOwner = actionLayoutData.getOwner();
+                var actionLayoutDataOwner = actionLayoutData.owner();
                 var objectAction = 
objectActionById.get(actionLayoutData.getId());
-                if(objectAction == null) {
-                    return;
-                }
+                if(objectAction == null) return;
 
                 {
                     GroupIdAndName groupIdAndName = null;
@@ -311,7 +309,7 @@ public void visit(final PropertyLayoutData 
propertyLayoutData) {
                 // Layout group-name based on owning property group, Layout 
sequence monotonically increasing
                 // nb for any given field set the sequence won't reset to 
zero; however this is what we want so that
                 // table columns are shown correctly (by fieldset, then 
property order within that fieldset).
-                final FieldSet fieldSet = propertyLayoutData.getOwner();
+                final FieldSet fieldSet = propertyLayoutData.owner();
 
                 
updateFacet(LayoutOrderFacetForLayoutXml.create(propertySequence.incrementAndGet(),
 oneToOneAssociation, precedence));
 
@@ -381,22 +379,22 @@ public void minimal(final G grid, final Class<?> 
domainClass) {
         grid.visit(new Grid.Visitor() {
             @Override
             public void visit(final ActionLayoutData actionLayoutData) {
-                
actionLayoutData.getOwner().getActions().remove(actionLayoutData);
+                actionLayoutData.owner().getActions().remove(actionLayoutData);
             }
 
             @Override
             public void visit(final CollectionLayoutData collectionLayoutData) 
{
-                
collectionLayoutData.getOwner().getCollections().remove(collectionLayoutData);
+                
collectionLayoutData.owner().getCollections().remove(collectionLayoutData);
             }
 
             @Override
             public void visit(final PropertyLayoutData propertyLayoutData) {
-                
propertyLayoutData.getOwner().getProperties().remove(propertyLayoutData);
+                
propertyLayoutData.owner().getProperties().remove(propertyLayoutData);
             }
 
             @Override
             public void visit(final DomainObjectLayoutData 
domainObjectLayoutData) {
-                final DomainObjectLayoutDataOwner owner = 
domainObjectLayoutData.getOwner();
+                final DomainObjectLayoutDataOwner owner = 
domainObjectLayoutData.owner();
                 owner.setDomainObject(new DomainObjectLayoutData());
             }
         });
diff --git 
a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/services/grid/bootstrap/GridSystemServiceBootstrap.java
 
b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/services/grid/bootstrap/GridSystemServiceBootstrap.java
index 3f9f2a1d8c8..e3c1928b877 100644
--- 
a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/services/grid/bootstrap/GridSystemServiceBootstrap.java
+++ 
b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/services/grid/bootstrap/GridSystemServiceBootstrap.java
@@ -423,7 +423,7 @@ protected boolean validateAndNormalize(
                     propertyLayoutDataList.forEach(propertyLayoutData->{
                         final ActionLayoutDataOwner owner = position == 
ActionLayout.Position.PANEL
                                     || position == 
ActionLayout.Position.PANEL_DROPDOWN
-                            ? propertyLayoutData.getOwner()
+                            ? propertyLayoutData.owner()
                             : propertyLayoutData;
                         var actionLayoutData = new ActionLayoutData(actionId);
                         actionLayoutData.setPosition(position);
@@ -540,7 +540,7 @@ private void addPropertiesTo(
             }
             var propertyLayoutData = layoutFactory.apply(propertyId);
             fieldSet.getProperties().add(propertyLayoutData);
-            propertyLayoutData.setOwner(fieldSet);
+            propertyLayoutData.owner(fieldSet);
             onNewLayoutData.accept(propertyId, propertyLayoutData);
         }
     }
@@ -576,7 +576,7 @@ private void addUnreferencedCollectionsTo(
                 var newTab = new BSTab();
                 newTab.setName(featureCanonicalFriendlyName);
                 tabGroup.getTabs().add(newTab);
-                newTab.setOwner(tabGroup);
+                newTab.owner(tabGroup);
                 return newTab;
             });
 
@@ -623,7 +623,7 @@ private void addActionTo(
             final ActionLayoutDataOwner owner,
             final ActionLayoutData actionLayoutData) {
         owner.getActions().add(actionLayoutData);
-        actionLayoutData.setOwner(owner);
+        actionLayoutData.owner(owner);
     }
 
 }

Reply via email to