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);