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 5cfc8c8dfd9 CAUSEWAY-3859: Java record refactoring (part 47)
5cfc8c8dfd9 is described below

commit 5cfc8c8dfd9e7a360988c0938a891697229c1634
Author: Andi Huber <[email protected]>
AuthorDate: Wed Feb 26 09:58:42 2025 +0100

    CAUSEWAY-3859: Java record refactoring (part 47)
---
 .../metamodel/object/_ManagedObjectViewmodel.java  |  8 +--
 .../wicket/model/src/main/java/module-info.java    |  1 -
 .../viewer/wicket/model/links/MenuablesModel.java  | 54 ----------------
 ...ooleanModel.java => BooleanAttributeModel.java} | 33 +++-------
 .../wicket/model/models/ChainingObjectModel.java   | 22 ++-----
 .../wicket/model/models/DelegatingModel.java       | 71 ++++++++++++++++++++++
 .../viewer/wicket/model/models/UiAttributeWkt.java |  7 +--
 .../model/models/binding/BooleanBinding.java       | 69 ---------------------
 .../wicket/model/models/coll/DataRowToggleWkt.java | 34 +++++++----
 .../models/interaction/prop/UiPropertyWkt.java     |  3 +-
 .../entityactions/ActionLinksPanel.java            |  2 +-
 .../serviceactions/CssSubMenuItemsPanel.java       |  2 +-
 .../attributes/bool/BooleanAttributePanel.java     |  4 +-
 .../components/menuable/MenuablePanelAbstract.java | 16 +++--
 .../apache/causeway/viewer/wicket/ui/util/Wkt.java |  5 +-
 15 files changed, 131 insertions(+), 200 deletions(-)

diff --git 
a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/object/_ManagedObjectViewmodel.java
 
b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/object/_ManagedObjectViewmodel.java
index dff112ebe92..5f85fd9f3d4 100644
--- 
a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/object/_ManagedObjectViewmodel.java
+++ 
b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/object/_ManagedObjectViewmodel.java
@@ -97,12 +97,10 @@ private Optional<Bookmark> createBookmark() {
     @Override
     public final void refreshViewmodel(final @Nullable Supplier<Bookmark> 
bookmarkSupplier) {
         var shouldRefresh = getTransactionService().currentTransactionId()
-        .map(this::shouldRefresh)
-        .orElse(true); // if there is no current transaction, refresh 
regardless; unexpected state, might fail later
+            .map(this::shouldRefresh)
+            .orElse(true); // if there is no current transaction, refresh 
regardless; unexpected state, might fail later
 
-        if(!shouldRefresh) {
-            return;
-        }
+        if(!shouldRefresh) return;
 
         if(isBookmarkMemoized()) {
             reloadViewmodelFromMemoizedBookmark();
diff --git a/viewers/wicket/model/src/main/java/module-info.java 
b/viewers/wicket/model/src/main/java/module-info.java
index 64caf1367c5..843c3b1e60d 100644
--- a/viewers/wicket/model/src/main/java/module-info.java
+++ b/viewers/wicket/model/src/main/java/module-info.java
@@ -23,7 +23,6 @@
     exports org.apache.causeway.viewer.wicket.model.hints;
     exports org.apache.causeway.viewer.wicket.model.itemreuse;
     exports org.apache.causeway.viewer.wicket.model.models;
-    exports org.apache.causeway.viewer.wicket.model.models.binding;
     exports org.apache.causeway.viewer.wicket.model;
     exports org.apache.causeway.viewer.wicket.model.links;
     exports org.apache.causeway.viewer.wicket.model.models.interaction.act;
diff --git 
a/viewers/wicket/model/src/main/java/org/apache/causeway/viewer/wicket/model/links/MenuablesModel.java
 
b/viewers/wicket/model/src/main/java/org/apache/causeway/viewer/wicket/model/links/MenuablesModel.java
deleted file mode 100644
index ae75975d36d..00000000000
--- 
a/viewers/wicket/model/src/main/java/org/apache/causeway/viewer/wicket/model/links/MenuablesModel.java
+++ /dev/null
@@ -1,54 +0,0 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *        http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- */
-package org.apache.causeway.viewer.wicket.model.links;
-
-import java.util.stream.Stream;
-
-import org.apache.wicket.model.ChainingModel;
-
-import org.apache.causeway.commons.collections.Can;
-
-import org.jspecify.annotations.NonNull;
-
-public class MenuablesModel
-extends ChainingModel<Can<? extends Menuable>> {
-
-    private static final long serialVersionUID = 1L;
-
-    public MenuablesModel(final @NonNull Can<? extends Menuable> menuables) {
-        super(menuables);
-    }
-
-    @SuppressWarnings("unchecked")
-    @Override
-    public final Can<? extends Menuable> getObject() {
-        return ((Can<? extends Menuable>)super.getTarget());
-    }
-
-    public final Can<? extends Menuable> menuables() {
-        return getObject();
-    }
-
-    public final <T extends Menuable> Stream<T> streamMenuables(final Class<T> 
linkType) {
-        return menuables().stream()
-                .filter(linkType::isInstance)
-                .map(linkType::cast);
-    }
-
-}
diff --git 
a/viewers/wicket/model/src/main/java/org/apache/causeway/viewer/wicket/model/models/BooleanModel.java
 
b/viewers/wicket/model/src/main/java/org/apache/causeway/viewer/wicket/model/models/BooleanAttributeModel.java
similarity index 75%
rename from 
viewers/wicket/model/src/main/java/org/apache/causeway/viewer/wicket/model/models/BooleanModel.java
rename to 
viewers/wicket/model/src/main/java/org/apache/causeway/viewer/wicket/model/models/BooleanAttributeModel.java
index a6d99450233..c34fa994d01 100644
--- 
a/viewers/wicket/model/src/main/java/org/apache/causeway/viewer/wicket/model/models/BooleanModel.java
+++ 
b/viewers/wicket/model/src/main/java/org/apache/causeway/viewer/wicket/model/models/BooleanAttributeModel.java
@@ -18,30 +18,19 @@
  */
 package org.apache.causeway.viewer.wicket.model.models;
 
-import org.apache.wicket.model.ChainingModel;
 import org.apache.wicket.model.IModel;
 import org.apache.wicket.model.Model;
 
 import org.apache.causeway.core.metamodel.object.ManagedObject;
 
-import org.jspecify.annotations.NonNull;
+public record BooleanAttributeModel(
+    boolean isPrimitive,
+    UiAttributeWkt attributeModel) implements IModel<Boolean> {
 
-public class BooleanModel
-extends ChainingModel<Boolean> {
-
-    private static final long serialVersionUID = 1L;
-
-    public static BooleanModel forAttributeModel(final @NonNull UiAttributeWkt 
attributeModel) {
-        return new BooleanModel(attributeModel);
-    }
-
-    final boolean isPrimitive;
-
-    protected BooleanModel(final UiAttributeWkt attributeModel) {
-        super(attributeModel);
-
-        var spec = attributeModel().getElementType();
-        this.isPrimitive = spec.getFullIdentifier().equals("boolean");
+    public BooleanAttributeModel(final UiAttributeWkt attributeModel) {
+        this(
+            
attributeModel.getElementType().getFullIdentifier().equals("boolean"),
+            attributeModel);
     }
 
     @Override
@@ -82,7 +71,7 @@ public IModel<String> asStringModel(
             private static final long serialVersionUID = 1L;
 
             @Override public String getObject() {
-                final Boolean bool = BooleanModel.this.getObject();
+                final Boolean bool = BooleanAttributeModel.this.getObject();
                 return bool == null
                         ? notSetLiteral // '(not set)'
                         : bool
@@ -92,10 +81,4 @@ public IModel<String> asStringModel(
         };
     }
 
-    // -- HELPER
-
-    protected UiAttributeWkt attributeModel() {
-        return (UiAttributeWkt) super.getTarget();
-    }
-
 }
diff --git 
a/viewers/wicket/model/src/main/java/org/apache/causeway/viewer/wicket/model/models/ChainingObjectModel.java
 
b/viewers/wicket/model/src/main/java/org/apache/causeway/viewer/wicket/model/models/ChainingObjectModel.java
index 46a23b9f760..9fe882224c6 100644
--- 
a/viewers/wicket/model/src/main/java/org/apache/causeway/viewer/wicket/model/models/ChainingObjectModel.java
+++ 
b/viewers/wicket/model/src/main/java/org/apache/causeway/viewer/wicket/model/models/ChainingObjectModel.java
@@ -18,8 +18,6 @@
  */
 package org.apache.causeway.viewer.wicket.model.models;
 
-import org.apache.wicket.model.ChainingModel;
-
 import org.apache.causeway.commons.internal.exceptions._Exceptions;
 import org.apache.causeway.core.metamodel.commons.ViewOrEditMode;
 import org.apache.causeway.core.metamodel.object.ManagedObject;
@@ -29,27 +27,17 @@
 /**
  * Wraps a {@link UiAttributeWkt} to act as an {@link ObjectAdapterModel}.
  */
-public final class ChainingObjectModel
-extends ChainingModel<ManagedObject>
+public record ChainingObjectModel(
+    /**
+     * chaining idiom: the {@link UiAttributeWkt} we are chained to
+     */
+    UiAttributeWkt attributeModel)
 implements ObjectAdapterModel {
 
-    private static final long serialVersionUID = 1L;
-
     public static ChainingObjectModel chain(final UiAttributeWkt 
attributeModel) {
         return new ChainingObjectModel(attributeModel);
     }
 
-    private ChainingObjectModel(final UiAttributeWkt attributeModel) {
-        super(attributeModel);
-    }
-
-    /**
-     * chaining idiom: the {@link UiAttributeWkt} we are chained to
-     */
-    public UiAttributeWkt attributeModel() {
-        return (UiAttributeWkt) super.getTarget();
-    }
-
     /**
      * chaining idiom: the 'local' model derived from the chain
      */
diff --git 
a/viewers/wicket/model/src/main/java/org/apache/causeway/viewer/wicket/model/models/DelegatingModel.java
 
b/viewers/wicket/model/src/main/java/org/apache/causeway/viewer/wicket/model/models/DelegatingModel.java
new file mode 100644
index 00000000000..15fb80c9385
--- /dev/null
+++ 
b/viewers/wicket/model/src/main/java/org/apache/causeway/viewer/wicket/model/models/DelegatingModel.java
@@ -0,0 +1,71 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ */
+package org.apache.causeway.viewer.wicket.model.models;
+
+import org.apache.wicket.model.IModel;
+
+//TODO[causeway-viewer-wicket-model-CAUSEWAY-3859] intermediate refactoring 
helper, perhaps remove later
+public class DelegatingModel<T> implements IModel<T> {
+    private static final long serialVersionUID = 1L;
+
+    private IModel<T> delegate;
+
+    public DelegatingModel(final IModel<T> modelObject) {
+        this.delegate = modelObject;
+    }
+
+    @Override
+    public final void detach() {
+        if(delegate!=null) delegate.detach();
+    }
+
+    @Override
+    public final void setObject(final T object) {
+        delegate.setObject(object);
+    }
+
+    @Override
+    public final T getObject() {
+        return delegate!=null
+            ? delegate.getObject()
+            : null;
+    }
+
+    public final IModel<?> getChainedModel() {
+        return delegate;
+    }
+
+    @Override
+    public String toString() {
+        return new StringBuilder("Model:classname=[")
+            .append(getClass().getName()).append(']')
+            .append(":nestedModel=[").append(delegate).append(']')
+            .toString();
+    }
+
+    public final Object getInnermostModelOrObject() {
+        Object object = delegate;
+        while (object instanceof IModel) {
+            Object tmp = ((IModel<?>)object).getObject();
+            if (tmp == object) break;
+            object = tmp;
+        }
+        return object;
+    }
+}
diff --git 
a/viewers/wicket/model/src/main/java/org/apache/causeway/viewer/wicket/model/models/UiAttributeWkt.java
 
b/viewers/wicket/model/src/main/java/org/apache/causeway/viewer/wicket/model/models/UiAttributeWkt.java
index 26f7ea5a18b..e4acd515bd6 100644
--- 
a/viewers/wicket/model/src/main/java/org/apache/causeway/viewer/wicket/model/models/UiAttributeWkt.java
+++ 
b/viewers/wicket/model/src/main/java/org/apache/causeway/viewer/wicket/model/models/UiAttributeWkt.java
@@ -22,9 +22,9 @@
 import java.util.Optional;
 import java.util.OptionalInt;
 
-import org.apache.wicket.model.ChainingModel;
 import org.apache.wicket.model.IModel;
 import org.apache.wicket.util.convert.IConverter;
+import org.jspecify.annotations.NonNull;
 
 import org.apache.causeway.applib.annotation.PromptStyle;
 import org.apache.causeway.commons.collections.Can;
@@ -42,7 +42,6 @@
 import 
org.apache.causeway.viewer.wicket.model.value.ConverterBasedOnValueSemantics;
 
 import lombok.Getter;
-import org.jspecify.annotations.NonNull;
 import lombok.Setter;
 
 /**
@@ -64,8 +63,7 @@
  */
 //@Log4j2
 public abstract class UiAttributeWkt
-extends ChainingModel<ManagedObject>
-implements HasRenderingHints, UiAttribute, FormExecutorContext {
+implements IModel<ManagedObject>, HasRenderingHints, UiAttribute, 
FormExecutorContext {
 
     private static final long serialVersionUID = 1L;
 
@@ -98,7 +96,6 @@ protected UiAttributeWkt(
             final @NonNull UiObjectWkt parentEntityModel,
             final @NonNull ViewOrEditMode viewOrEdit,
             final @NonNull RenderingHint renderingHint) {
-        super(parentEntityModel); // the so called target model, we are 
chaining us to
         this.parentEntityModel = parentEntityModel;
         this.renderingHint = renderingHint;
         this.viewOrEditMode = viewOrEdit;
diff --git 
a/viewers/wicket/model/src/main/java/org/apache/causeway/viewer/wicket/model/models/binding/BooleanBinding.java
 
b/viewers/wicket/model/src/main/java/org/apache/causeway/viewer/wicket/model/models/binding/BooleanBinding.java
deleted file mode 100644
index c739874bfe5..00000000000
--- 
a/viewers/wicket/model/src/main/java/org/apache/causeway/viewer/wicket/model/models/binding/BooleanBinding.java
+++ /dev/null
@@ -1,69 +0,0 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *        http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- */
-package org.apache.causeway.viewer.wicket.model.models.binding;
-
-import java.util.Optional;
-
-import org.apache.wicket.model.ChainingModel;
-import org.apache.wicket.model.IModel;
-
-import org.jspecify.annotations.Nullable;
-
-import org.apache.causeway.commons.binding.Bindable;
-import org.apache.causeway.commons.internal.base._Casts;
-
-/**
- * Boolean {@link IModel} to bind to the associated {@code T} model`s
- * bindable boolean value.
- */
-public abstract class BooleanBinding<T>
-extends ChainingModel<Boolean> {
-
-    private static final long serialVersionUID = 1L;
-
-    protected BooleanBinding(final IModel<T> model) {
-        super(model);
-    }
-
-    @Override
-    public final Boolean getObject() {
-        return getBindable(modelObject())
-                .map(Bindable::getValue)
-                .orElse(null);
-    }
-
-    @Override
-    public final void setObject(final Boolean value) {
-        getBindable(modelObject())
-        .ifPresent(bindable->bindable.setValue(value));
-    }
-
-    protected abstract Optional<Bindable<Boolean>> getBindable(@Nullable T 
model);
-
-    /**
-     * For BulkToggleWkt returns its DataTableModel.<br>
-     * For DataRowToggleWkt returns its DataRow.
-     */
-    protected T modelObject() {
-        var model = _Casts.<IModel<T>>uncheckedCast(super.getTarget());
-        return model.getObject();
-    }
-
-}
-
diff --git 
a/viewers/wicket/model/src/main/java/org/apache/causeway/viewer/wicket/model/models/coll/DataRowToggleWkt.java
 
b/viewers/wicket/model/src/main/java/org/apache/causeway/viewer/wicket/model/models/coll/DataRowToggleWkt.java
index c76ad5a2b62..43cff8bafeb 100644
--- 
a/viewers/wicket/model/src/main/java/org/apache/causeway/viewer/wicket/model/models/coll/DataRowToggleWkt.java
+++ 
b/viewers/wicket/model/src/main/java/org/apache/causeway/viewer/wicket/model/models/coll/DataRowToggleWkt.java
@@ -27,27 +27,39 @@
 import org.apache.causeway.commons.binding.Bindable;
 import org.apache.causeway.core.metamodel.tabular.DataRow;
 import org.apache.causeway.core.metamodel.tabular.DataTableInteractive;
-import org.apache.causeway.viewer.wicket.model.models.binding.BooleanBinding;
 
 /**
  * Boolean {@link IModel} to bind to the associated {@link 
DataTableInteractive}'s
  * {@link DataRow} model to handle check-box selection.
  */
-public final class DataRowToggleWkt
-extends BooleanBinding<DataRow> {
+public record DataRowToggleWkt(
+    IModel<DataRow> delegate) implements IModel<Boolean> {
 
-    private static final long serialVersionUID = 1L;
-
-    public DataRowToggleWkt(final DataRowWkt dataRowWkt) {
-        super(dataRowWkt);
+    @Override
+    public final Boolean getObject() {
+        return getBindable(modelObject())
+            .map(Bindable::getValue)
+            .orElse(null);
     }
 
     @Override
-    protected Optional<Bindable<Boolean>> getBindable(
-            final @Nullable DataRow dataRow) {
+    public final void setObject(final Boolean value) {
+        getBindable(modelObject())
+            .ifPresent(bindable->bindable.setValue(value));
+    }
+
+    private Optional<Bindable<Boolean>> getBindable(
+        final @Nullable DataRow dataRow) {
         return dataRow!=null
-                ? Optional.ofNullable(dataRow.selectToggleBindable())
-                : Optional.empty();
+            ? Optional.ofNullable(dataRow.selectToggleBindable())
+            : Optional.empty();
+    }
+
+    /**
+     * For DataRowToggleWkt returns its DataRow.
+     */
+    private DataRow modelObject() {
+        return delegate.getObject();
     }
 
 }
diff --git 
a/viewers/wicket/model/src/main/java/org/apache/causeway/viewer/wicket/model/models/interaction/prop/UiPropertyWkt.java
 
b/viewers/wicket/model/src/main/java/org/apache/causeway/viewer/wicket/model/models/interaction/prop/UiPropertyWkt.java
index d4ff77c587a..ab9bd351d1e 100644
--- 
a/viewers/wicket/model/src/main/java/org/apache/causeway/viewer/wicket/model/models/interaction/prop/UiPropertyWkt.java
+++ 
b/viewers/wicket/model/src/main/java/org/apache/causeway/viewer/wicket/model/models/interaction/prop/UiPropertyWkt.java
@@ -28,6 +28,7 @@
 import org.apache.causeway.viewer.commons.model.attrib.UiProperty;
 import org.apache.causeway.viewer.commons.model.object.HasUiParentObject;
 import org.apache.causeway.viewer.commons.model.object.UiObject;
+import org.apache.causeway.viewer.wicket.model.models.DelegatingModel;
 
 /**
  * <i>Property Interaction</i> model bound to its owner {@link 
PropertyInteractionWkt}.
@@ -36,7 +37,7 @@
  * @see ChainingModel
  */
 public final class UiPropertyWkt
-extends ChainingModel<PropertyInteraction>
+extends DelegatingModel<PropertyInteraction>
 implements
     HasMetaModelContext,
     HasUiParentObject<UiObject>,
diff --git 
a/viewers/wicket/ui/src/main/java/org/apache/causeway/viewer/wicket/ui/components/actionlinks/entityactions/ActionLinksPanel.java
 
b/viewers/wicket/ui/src/main/java/org/apache/causeway/viewer/wicket/ui/components/actionlinks/entityactions/ActionLinksPanel.java
index 61054192420..4de7779200c 100644
--- 
a/viewers/wicket/ui/src/main/java/org/apache/causeway/viewer/wicket/ui/components/actionlinks/entityactions/ActionLinksPanel.java
+++ 
b/viewers/wicket/ui/src/main/java/org/apache/causeway/viewer/wicket/ui/components/actionlinks/entityactions/ActionLinksPanel.java
@@ -118,7 +118,7 @@ protected ActionLinksPanel(
     }
 
     protected final Stream<ActionLink> streamActionLinks() {
-        return menuablesModel().streamMenuables(ActionLink.class);
+        return streamMenuables(ActionLink.class);
     }
 
     protected final List<ActionLink> listOfActionLinks() {
diff --git 
a/viewers/wicket/ui/src/main/java/org/apache/causeway/viewer/wicket/ui/components/actionlinks/serviceactions/CssSubMenuItemsPanel.java
 
b/viewers/wicket/ui/src/main/java/org/apache/causeway/viewer/wicket/ui/components/actionlinks/serviceactions/CssSubMenuItemsPanel.java
index 9dc0e071e88..65dae68fc87 100644
--- 
a/viewers/wicket/ui/src/main/java/org/apache/causeway/viewer/wicket/ui/components/actionlinks/serviceactions/CssSubMenuItemsPanel.java
+++ 
b/viewers/wicket/ui/src/main/java/org/apache/causeway/viewer/wicket/ui/components/actionlinks/serviceactions/CssSubMenuItemsPanel.java
@@ -36,7 +36,7 @@ public CssSubMenuItemsPanel(final String id, final 
Can<CssMenuItem> menuables) {
         setRenderBodyOnly(true);
 
         Wkt.repeatingViewAdd(this, getId(),
-            menuablesModel().streamMenuables(CssMenuItem.class),
+            streamMenuables(CssMenuItem.class),
             (container, menuable)->menuable.addTo(container));
     }
 
diff --git 
a/viewers/wicket/ui/src/main/java/org/apache/causeway/viewer/wicket/ui/components/attributes/bool/BooleanAttributePanel.java
 
b/viewers/wicket/ui/src/main/java/org/apache/causeway/viewer/wicket/ui/components/attributes/bool/BooleanAttributePanel.java
index dfaec6f6a13..32144677f72 100644
--- 
a/viewers/wicket/ui/src/main/java/org/apache/causeway/viewer/wicket/ui/components/attributes/bool/BooleanAttributePanel.java
+++ 
b/viewers/wicket/ui/src/main/java/org/apache/causeway/viewer/wicket/ui/components/attributes/bool/BooleanAttributePanel.java
@@ -25,7 +25,7 @@
 
 import org.apache.causeway.commons.internal.exceptions._Exceptions;
 import org.apache.causeway.viewer.commons.model.components.UiString;
-import org.apache.causeway.viewer.wicket.model.models.BooleanModel;
+import org.apache.causeway.viewer.wicket.model.models.BooleanAttributeModel;
 import org.apache.causeway.viewer.wicket.model.models.UiAttributeWkt;
 import 
org.apache.causeway.viewer.wicket.ui.components.attributes.AttributePanelWithFormField;
 import 
org.apache.causeway.viewer.wicket.ui.components.attributes.AttributeFragmentFactory.CompactFragment;
@@ -59,7 +59,7 @@ protected Optional<InputFragment> getInputFragmentType() {
     protected FormComponent<Boolean> createFormComponent(final String id, 
final UiAttributeWkt attributeModel) {
         checkBox = Wkt.checkboxX(
                 id,
-                BooleanModel.forAttributeModel(attributeModel),
+                new BooleanAttributeModel(attributeModel),
                 attributeModel.isRequired(),
                 CheckBoxXConfig.Sizes.xl);
         return checkBox;
diff --git 
a/viewers/wicket/ui/src/main/java/org/apache/causeway/viewer/wicket/ui/components/menuable/MenuablePanelAbstract.java
 
b/viewers/wicket/ui/src/main/java/org/apache/causeway/viewer/wicket/ui/components/menuable/MenuablePanelAbstract.java
index 6b7668a4b6c..e8212739cbc 100644
--- 
a/viewers/wicket/ui/src/main/java/org/apache/causeway/viewer/wicket/ui/components/menuable/MenuablePanelAbstract.java
+++ 
b/viewers/wicket/ui/src/main/java/org/apache/causeway/viewer/wicket/ui/components/menuable/MenuablePanelAbstract.java
@@ -18,25 +18,31 @@
  */
 package org.apache.causeway.viewer.wicket.ui.components.menuable;
 
+import java.util.stream.Stream;
+
+import org.apache.wicket.model.IModel;
+import org.apache.wicket.model.Model;
+
 import org.apache.causeway.commons.collections.Can;
 import org.apache.causeway.viewer.wicket.model.links.Menuable;
-import org.apache.causeway.viewer.wicket.model.links.MenuablesModel;
 import org.apache.causeway.viewer.wicket.ui.panels.PanelAbstract;
 
 /**
  * Common panel for drop-downs and sub-menus.
  */
 public abstract class MenuablePanelAbstract
-extends PanelAbstract<Can<? extends Menuable>, MenuablesModel> {
+extends PanelAbstract<Can<? extends Menuable>, IModel<Can<? extends 
Menuable>>> {
 
     private static final long serialVersionUID = 1L;
 
     protected MenuablePanelAbstract(final String id, final Can<? extends 
Menuable> menuables) {
-        super(id, new MenuablesModel(menuables));
+        super(id, Model.of(menuables));
     }
 
-    public final MenuablesModel menuablesModel() {
-        return getModel();
+    protected final <T extends Menuable> Stream<T> streamMenuables(final 
Class<T> linkType) {
+        return getModelObject().stream()
+                .filter(linkType::isInstance)
+                .map(linkType::cast);
     }
 
 }
diff --git 
a/viewers/wicket/ui/src/main/java/org/apache/causeway/viewer/wicket/ui/util/Wkt.java
 
b/viewers/wicket/ui/src/main/java/org/apache/causeway/viewer/wicket/ui/util/Wkt.java
index d0f5a1488f5..3bd8340a21a 100644
--- 
a/viewers/wicket/ui/src/main/java/org/apache/causeway/viewer/wicket/ui/util/Wkt.java
+++ 
b/viewers/wicket/ui/src/main/java/org/apache/causeway/viewer/wicket/ui/util/Wkt.java
@@ -532,9 +532,8 @@ public static AjaxCheckBox checkbox(
              * enforce a page-reload as side-effect.
              */
             private boolean hasMemoizedDataRow(final IModel<Boolean> model) {
-                if(model instanceof DataRowToggleWkt) {
-                    var chainedModel = 
((DataRowToggleWkt)model).getChainedModel();
-                    if(chainedModel instanceof DataRowWkt dataRowWkt) {
+                if(model instanceof DataRowToggleWkt dataRowToggleWkt) {
+                    if(dataRowToggleWkt.delegate() instanceof DataRowWkt 
dataRowWkt) {
                         return dataRowWkt.isTableDataLoaded();
                     }
                 }

Reply via email to