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 d4fb2f44396 CAUSEWAY-2297: BSGrid#domainClass single source of truth 
via LayoutKey
d4fb2f44396 is described below

commit d4fb2f44396138a5594e0d29fd377748482f343c
Author: andi-huber <[email protected]>
AuthorDate: Thu Mar 5 06:15:18 2026 +0100

    CAUSEWAY-2297: BSGrid#domainClass single source of truth via LayoutKey
---
 .../applib/layout/grid/bootstrap/BSGrid.java       |  2 +-
 .../applib/services/grid/GridMarshaller.java       |  3 +-
 .../services/grid/FallbackGridProvider.java        | 17 +++++----
 .../core/metamodel/services/grid/GridLoader.java   |  5 +--
 .../metamodel/services/grid/GridMarshallerXml.java | 41 ++++++++++------------
 .../services/grid/GridServiceDefault.java          |  2 +-
 .../services/grid/GridXmlRoundtripTest.java        |  5 +--
 7 files changed, 37 insertions(+), 38 deletions(-)

diff --git 
a/api/applib/src/main/java/org/apache/causeway/applib/layout/grid/bootstrap/BSGrid.java
 
b/api/applib/src/main/java/org/apache/causeway/applib/layout/grid/bootstrap/BSGrid.java
index d04e339ccd4..b933c67d0d6 100644
--- 
a/api/applib/src/main/java/org/apache/causeway/applib/layout/grid/bootstrap/BSGrid.java
+++ 
b/api/applib/src/main/java/org/apache/causeway/applib/layout/grid/bootstrap/BSGrid.java
@@ -54,8 +54,8 @@
 public final class BSGrid implements BSElement, Dto, BSRowOwner {
     private static final long serialVersionUID = 1L;
 
-    @XmlTransient @Getter @Accessors(fluent=true) @Setter private Class<?> 
domainClass;
     @XmlTransient @Getter @Accessors(fluent=true) @Setter private LayoutKey 
layoutKey;
+    public Class<?> domainClass() { return layoutKey!=null ? 
layoutKey.domainClass() : null; }
 
     /**
      * Indicates whether or not this grid is a fallback.
diff --git 
a/api/applib/src/main/java/org/apache/causeway/applib/services/grid/GridMarshaller.java
 
b/api/applib/src/main/java/org/apache/causeway/applib/services/grid/GridMarshaller.java
index 2ffb317d705..fd15926da4d 100644
--- 
a/api/applib/src/main/java/org/apache/causeway/applib/services/grid/GridMarshaller.java
+++ 
b/api/applib/src/main/java/org/apache/causeway/applib/services/grid/GridMarshaller.java
@@ -24,6 +24,7 @@
 import org.jspecify.annotations.Nullable;
 
 import org.apache.causeway.applib.layout.grid.bootstrap.BSGrid;
+import org.apache.causeway.applib.services.grid.GridService.LayoutKey;
 import org.apache.causeway.applib.services.layout.LayoutService;
 import org.apache.causeway.applib.services.marshal.Marshaller;
 import org.apache.causeway.applib.value.NamedWithMimeType.CommonMimeType;
@@ -55,6 +56,6 @@ public interface GridMarshaller {
      * Returns a new de-serialized instance wrapped in a {@link Try}.
      * @throws UnsupportedOperationException when format is not supported (not 
wrapped)
      */
-    Try<BSGrid> unmarshal(Class<?> domainClass, @Nullable String content, 
@NonNull CommonMimeType format);
+    Try<BSGrid> unmarshal(LayoutKey layoutKey, @Nullable String content, 
@NonNull CommonMimeType format);
 
 }
diff --git 
a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/services/grid/FallbackGridProvider.java
 
b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/services/grid/FallbackGridProvider.java
index 239c646d95a..635db02267a 100644
--- 
a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/services/grid/FallbackGridProvider.java
+++ 
b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/services/grid/FallbackGridProvider.java
@@ -21,11 +21,14 @@
 import java.util.Arrays;
 import java.util.List;
 
+import org.jspecify.annotations.NonNull;
+
 import org.apache.causeway.applib.layout.component.DomainObjectLayoutData;
 import org.apache.causeway.applib.layout.component.FieldSet;
 import org.apache.causeway.applib.layout.grid.bootstrap.BSCol;
 import org.apache.causeway.applib.layout.grid.bootstrap.BSGrid;
 import org.apache.causeway.applib.layout.grid.bootstrap.BSRow;
+import org.apache.causeway.applib.services.grid.GridService.LayoutKey;
 import org.apache.causeway.applib.value.NamedWithMimeType.CommonMimeType;
 import org.apache.causeway.commons.functional.Try;
 import org.apache.causeway.commons.internal.resources._Resources;
@@ -36,19 +39,19 @@
 record FallbackGridProvider(
     GridLoadingContext context) {
 
-    public BSGrid defaultGrid(final Class<?> domainClass) {
-        final Try<String> content = 
loadFallbackLayoutAsStringUtf8(domainClass);
+    public BSGrid defaultGrid(final @NonNull LayoutKey layoutKey) {
+        final Try<String> content = 
loadFallbackLayoutAsStringUtf8(layoutKey.domainClass());
         try {
             return content.getValue()
                     .flatMap(xml -> 
context.gridMarshaller(CommonMimeType.XML).orElseThrow()
-                        .unmarshal(domainClass, xml, CommonMimeType.XML)
+                        .unmarshal(layoutKey, xml, CommonMimeType.XML)
                         .getValue())
                     .filter(BSGrid.class::isInstance)
                     .map(BSGrid.class::cast)
                     .map(bsGrid->bsGrid.fallback(true))
-                    .orElseGet(() -> fallback(domainClass));
+                    .orElseGet(() -> fallback(layoutKey));
         } catch (final Exception e) {
-            return fallback(domainClass);
+            return fallback(layoutKey);
         }
     }
 
@@ -62,9 +65,9 @@ private Try<String> loadFallbackLayoutAsStringUtf8(final 
Class<?> domainClass) {
     // only ever called if fail to load GridFallbackLayout.xml,
     // which *really* shouldn't happen
     //
-    private BSGrid fallback(final Class<?> domainClass) {
+    private BSGrid fallback(final LayoutKey layoutKey) {
         final BSGrid bsGrid = new BSGrid();
-        bsGrid.domainClass(domainClass).fallback(true);
+        bsGrid.layoutKey(layoutKey).fallback(true);
 
         final BSRow headerRow = new BSRow();
         bsGrid.getRows().add(headerRow);
diff --git 
a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/services/grid/GridLoader.java
 
b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/services/grid/GridLoader.java
index ddb30f5932f..8d148e27269 100644
--- 
a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/services/grid/GridLoader.java
+++ 
b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/services/grid/GridLoader.java
@@ -41,10 +41,7 @@ record GridLoader(
     public Try<BSGrid> tryLoad(final LayoutKey layoutKey, final LayoutResource 
layoutResource) {
         return gridLoadingContext.gridMarshaller(layoutResource.format())
             .orElseThrow()
-            .unmarshal(layoutKey.domainClass(), layoutResource.content(), 
layoutResource.format())
-            .mapSuccessAsNullable(grid->grid!=null
-                ? grid.layoutKey(layoutKey)
-                : grid);
+            .unmarshal(layoutKey, layoutResource.content(), 
layoutResource.format());
     }
 
 }
diff --git 
a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/services/grid/GridMarshallerXml.java
 
b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/services/grid/GridMarshallerXml.java
index 32353cfeda5..944c222f71a 100644
--- 
a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/services/grid/GridMarshallerXml.java
+++ 
b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/services/grid/GridMarshallerXml.java
@@ -20,7 +20,6 @@
 
 import java.util.EnumSet;
 import java.util.Map;
-import java.util.Objects;
 
 import jakarta.annotation.Priority;
 import jakarta.inject.Inject;
@@ -36,6 +35,7 @@
 import org.apache.causeway.applib.layout.grid.bootstrap.BSGrid;
 import org.apache.causeway.applib.layout.grid.bootstrap.BSUtil;
 import org.apache.causeway.applib.services.grid.GridMarshaller;
+import org.apache.causeway.applib.services.grid.GridService.LayoutKey;
 import org.apache.causeway.applib.services.jaxb.JaxbService;
 import org.apache.causeway.applib.value.NamedWithMimeType.CommonMimeType;
 import org.apache.causeway.commons.functional.Try;
@@ -71,37 +71,34 @@ public EnumSet<CommonMimeType> supportedFormats() {
     @Override
     public String marshal(final @NonNull BSGrid bsGrid, final @NonNull 
CommonMimeType format) {
         throwIfFormatNotSupported(format);
-        switch(format) {
-        case XML:{
-            return jaxbService.toXml(bsGrid,
-                    Map.of(jakarta.xml.bind.Marshaller.JAXB_SCHEMA_LOCATION,
-                        schemaLocationProvider.xsiSchemaLocation()));
-        }
-        default:
-            throw _Exceptions.unsupportedOperation("supported format %s is not 
implemented", format.name());
-        }
+        return switch (format) {
+        case XML -> jaxbService.toXml(bsGrid,
+                            
Map.of(jakarta.xml.bind.Marshaller.JAXB_SCHEMA_LOCATION,
+                                schemaLocationProvider.xsiSchemaLocation()));
+        default -> throw _Exceptions.unsupportedOperation("supported format %s 
is not implemented", format.name());
+        };
     }
 
     @Override
-    public Try<BSGrid> unmarshal(final Class<?> domainClass, @Nullable final 
String content, @NonNull final CommonMimeType format) {
+    public Try<BSGrid> unmarshal(
+            final @NonNull LayoutKey layoutKey,
+            final @Nullable String content,
+            final @NonNull CommonMimeType format) {
         throwIfFormatNotSupported(format);
-        switch(format) {
-        case XML:{
-            return Try.call(()->jaxbService.fromXml(BSGrid.class, content))
-                    
.mapSuccessWhenPresent(bsGrid->bsGrid.domainClass(Objects.requireNonNull(domainClass)))
-                    .mapSuccessWhenPresent(BSUtil::resolveOwners);
-        }
-        default:
-            throw _Exceptions.unsupportedOperation("supported format %s is not 
implemented", format.name());
-        }
+        return switch (format) {
+        case XML -> Try.call(()->jaxbService.fromXml(BSGrid.class, content))
+                            .mapSuccessWhenPresent(bsGrid->
+                                bsGrid.layoutKey(layoutKey))
+                            .mapSuccessWhenPresent(BSUtil::resolveOwners);
+        default -> throw _Exceptions.unsupportedOperation("supported format %s 
is not implemented", format.name());
+        };
     }
 
     // -- HELPER
 
     private void throwIfFormatNotSupported(final CommonMimeType format) {
-        if(!supportedFormats().contains(format)) {
+        if(!supportedFormats().contains(format))
             throw _Exceptions.unsupportedOperation("object layout file format 
%s not supported", format.name());
-        }
     }
 
 }
diff --git 
a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/services/grid/GridServiceDefault.java
 
b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/services/grid/GridServiceDefault.java
index 51318c26626..5683c703681 100644
--- 
a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/services/grid/GridServiceDefault.java
+++ 
b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/services/grid/GridServiceDefault.java
@@ -110,7 +110,7 @@ private Try<BSGrid> tryLoadNoCache(final LayoutKey 
layoutKey) {
             // on the success rail we optionally have a valid BSGrid, if 
absent use fallback and validate
             .mapSuccess(gridOpt->gridOpt.orElseGet(()->memberResolver.resolve(
                     layoutKey,
-                    fallback.defaultGrid(layoutKey.domainClass()))
+                    fallback.defaultGrid(layoutKey))
                 .<BSGrid>fold(a->a, b->{ onFallbackValidationFailure(b); 
return null; })));
     }
 
diff --git 
a/core/mmtest/src/test/java/org/apache/causeway/core/metamodel/services/grid/GridXmlRoundtripTest.java
 
b/core/mmtest/src/test/java/org/apache/causeway/core/metamodel/services/grid/GridXmlRoundtripTest.java
index 6663e554d8d..4498d7205c3 100644
--- 
a/core/mmtest/src/test/java/org/apache/causeway/core/metamodel/services/grid/GridXmlRoundtripTest.java
+++ 
b/core/mmtest/src/test/java/org/apache/causeway/core/metamodel/services/grid/GridXmlRoundtripTest.java
@@ -33,6 +33,7 @@
 import org.apache.causeway.applib.layout.grid.bootstrap.BSTab;
 import org.apache.causeway.applib.layout.grid.bootstrap.BSTabGroup;
 import org.apache.causeway.applib.services.grid.GridService;
+import org.apache.causeway.applib.services.grid.GridService.LayoutKey;
 import org.apache.causeway.applib.services.jaxb.CausewaySchemas;
 import org.apache.causeway.applib.services.jaxb.JaxbService;
 import org.apache.causeway.applib.value.NamedWithMimeType.CommonMimeType;
@@ -55,7 +56,7 @@ protected void afterSetUp() {
     void happy_case() throws Exception {
 
         final BSGrid bsGrid = new BSGrid();
-        bsGrid.domainClass(Object.class);
+        bsGrid.layoutKey(new LayoutKey(Object.class));
 
         // header
         final BSRow headerRow = new BSRow();
@@ -124,7 +125,7 @@ void happy_case() throws Exception {
 
         println(xml);
 
-        BSGrid bsGridRoundtripped = xmlMarshaller.unmarshal(Object.class, xml, 
CommonMimeType.XML)
+        BSGrid bsGridRoundtripped = xmlMarshaller.unmarshal(new 
LayoutKey(Object.class), xml, CommonMimeType.XML)
             .valueAsNonNullElseFail();
 
         String xmlRoundtripped = xmlMarshaller.marshal(bsGridRoundtripped, 
CommonMimeType.XML);

Reply via email to