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 78e5c4824f5 CAUSEWAY-3859: Java record refactoring (part 51)
78e5c4824f5 is described below

commit 78e5c4824f534855ca48c861bae440f8ca06f8ed
Author: Andi Huber <[email protected]>
AuthorDate: Wed Feb 26 12:39:03 2025 +0100

    CAUSEWAY-3859: Java record refactoring (part 51)
---
 .../metamodel/object/BookmarkedObjectHolder.java   |  85 +++++++++++
 .../wicket/model/models/ManagedObjectModel.java    | 165 ---------------------
 .../viewer/wicket/model/models/UiObjectWkt.java    |   4 +-
 .../model/models/coll/CollectionModelAbstract.java |   4 +-
 .../models/interaction/BookmarkedObjectWkt.java    |  46 +++---
 .../interaction/HasBookmarkedOwnerAbstract.java    |   4 +-
 6 files changed, 110 insertions(+), 198 deletions(-)

diff --git 
a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/object/BookmarkedObjectHolder.java
 
b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/object/BookmarkedObjectHolder.java
new file mode 100644
index 00000000000..89b1aa334b3
--- /dev/null
+++ 
b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/object/BookmarkedObjectHolder.java
@@ -0,0 +1,85 @@
+/*
+ *  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.core.metamodel.object;
+
+import java.io.Serializable;
+import java.util.Objects;
+
+import org.jspecify.annotations.NonNull;
+import org.jspecify.annotations.Nullable;
+
+import org.apache.causeway.applib.services.bookmark.Bookmark;
+import org.apache.causeway.core.metamodel.context.MetaModelContext;
+import org.apache.causeway.core.metamodel.objectmanager.ObjectManager;
+
+/**
+ * Transiently holds a detachable {@link ManagedObject},
+ * that is lazily created based on the given immutable {@link Bookmark}.
+ */
+public final class BookmarkedObjectHolder implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+    private final Bookmark bookmark;
+    private transient ManagedObject managedObject;
+
+    public BookmarkedObjectHolder(final @NonNull Bookmark bookmark, final 
@Nullable ManagedObject managedObject) {
+        this.bookmark = bookmark;
+        this.managedObject = managedObject;
+    }
+
+    public Bookmark bookmark() {
+        return bookmark;
+    }
+
+    public ManagedObject managedObject() {
+        return managedObject!=null
+            ? managedObject
+            : (this.managedObject = 
objectManager().loadObjectElseFail(bookmark));
+    }
+
+    public void detach() {
+        this.managedObject = null;
+    }
+
+    // -- CONTRACT
+
+    @Override
+    public final int hashCode() {
+        return bookmark.hashCode();
+    }
+
+    @Override
+    public final boolean equals(final Object obj) {
+        return obj instanceof BookmarkedObjectHolder other
+            ? Objects.equals(this.bookmark, other.bookmark)
+            : false;
+    }
+
+    @Override
+    public String toString() {
+        return "ManagedObjectHolder[%s]".formatted(bookmark);
+    }
+
+    // -- HELPER
+
+    private ObjectManager objectManager() {
+        return MetaModelContext.instanceElseFail().getObjectManager();
+    }
+
+}
diff --git 
a/viewers/wicket/model/src/main/java/org/apache/causeway/viewer/wicket/model/models/ManagedObjectModel.java
 
b/viewers/wicket/model/src/main/java/org/apache/causeway/viewer/wicket/model/models/ManagedObjectModel.java
deleted file mode 100644
index 04dfd099106..00000000000
--- 
a/viewers/wicket/model/src/main/java/org/apache/causeway/viewer/wicket/model/models/ManagedObjectModel.java
+++ /dev/null
@@ -1,165 +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;
-
-import java.util.Objects;
-import java.util.Optional;
-
-import org.jspecify.annotations.Nullable;
-
-import org.apache.causeway.applib.id.LogicalType;
-import org.apache.causeway.applib.services.bookmark.Bookmark;
-import org.apache.causeway.core.metamodel.object.ManagedObject;
-import org.apache.causeway.core.metamodel.object.ManagedObjects;
-import org.apache.causeway.core.metamodel.object.PackedManagedObject;
-import org.apache.causeway.core.metamodel.objectmanager.memento.ObjectMemento;
-import org.apache.causeway.core.metamodel.spec.ObjectSpecification;
-
-import lombok.Synchronized;
-
-/**
- * @since 2.0
- */
-public final class ManagedObjectModel
-extends ModelAbstract<ManagedObject> {
-
-    private static final long serialVersionUID = 1L;
-
-    private ObjectMemento memento;
-
-    protected ManagedObjectModel() {
-        this(null);
-    }
-
-    protected ManagedObjectModel(
-            final @Nullable ObjectMemento initialMemento) {
-        super();
-        this.memento = initialMemento;
-    }
-
-    @Override
-    protected ManagedObject load() {
-        if (memento == null) {
-            return null;
-        }
-        return getObjectManager().demementify(memento);
-    }
-
-    @Override
-    public void setObject(final ManagedObject adapter) {
-
-        if(ManagedObjects.isNullOrUnspecifiedOrEmpty(adapter)) {
-            super.setObject(null);
-            memento = null;
-            return;
-        }
-
-        super.setObject(adapter);
-
-        if(adapter instanceof PackedManagedObject) {
-            setObjectCollection((PackedManagedObject)adapter);
-        } else {
-            memento = adapter.getMemento().orElseThrow();
-        }
-    }
-
-    public void setObjectCollection(final PackedManagedObject adapter) {
-
-        if(ManagedObjects.isNullOrUnspecifiedOrEmpty(adapter)) {
-            super.setObject(null);
-            memento = null;
-            return;
-        }
-
-        super.setObject(adapter);
-        memento = adapter.getMemento().orElseThrow();
-    }
-
-    public final Bookmark asBookmarkIfSupported() {
-        return memento!=null
-                ? memento.bookmark()
-                : null;
-    }
-
-    public final String oidStringIfSupported() {
-        return memento!=null
-                ? memento.toString()
-                : null;
-    }
-
-    /**
-     * free of side-effects, used for serialization
-     * @implNote overriding this must be consistent with {@link 
#getTypeOfSpecification()}
-     */
-    public Optional<LogicalType> getLogicalElementType() {
-        return Optional.ofNullable(memento)
-                .map(ObjectMemento::logicalType);
-    }
-
-    private transient ObjectSpecification elementTypeSpec;
-    private transient boolean isObjectSpecMemoized = false;
-    /**
-     * @implNote can be overridden by sub-models (eg {@link UiAttributeWkt}) 
that know the type of
-     * the adapter without there being one. Overriding this must be consistent
-     * with {@link #getLogicalElementType()}
-     */
-    @Synchronized
-    public ObjectSpecification getTypeOfSpecification() {
-        if(!isObjectSpecMemoized) {
-            var logicalType = getLogicalElementType().orElse(null);
-            elementTypeSpec = 
super.getSpecificationLoader().specForLogicalType(logicalType).orElse(null);
-            isObjectSpecMemoized = true;
-        }
-        return elementTypeSpec;
-    }
-
-    public boolean isEmpty() {
-        return memento == null;
-    }
-
-    // -- CONTRACT
-
-    @Override
-    public final int hashCode() {
-        return Objects.hashCode(memento);
-    }
-
-    @Override
-    public final boolean equals(final Object obj) {
-        if(obj instanceof ManagedObjectModel) {
-            var other = (ManagedObjectModel) obj;
-            return Objects.equals(this.memento, other.memento);
-        }
-        return false;
-    }
-
-    // -- DEPRECATIONS
-
-//    private ObjectMemento memento() {
-//        return memento;
-//    }
-//
-//    private void memento(final ObjectMemento memento) {
-//        var manageObject = 
super.getMetaModelContext().reconstructObject(memento);
-//        super.setObject(manageObject);
-//        this.memento = memento;
-//        this.elementTypeSpec = null; // invalidate
-//    }
-
-}
diff --git 
a/viewers/wicket/model/src/main/java/org/apache/causeway/viewer/wicket/model/models/UiObjectWkt.java
 
b/viewers/wicket/model/src/main/java/org/apache/causeway/viewer/wicket/model/models/UiObjectWkt.java
index fefef975110..065d3360c3d 100644
--- 
a/viewers/wicket/model/src/main/java/org/apache/causeway/viewer/wicket/model/models/UiObjectWkt.java
+++ 
b/viewers/wicket/model/src/main/java/org/apache/causeway/viewer/wicket/model/models/UiObjectWkt.java
@@ -225,11 +225,11 @@ public UiAttributeWkt getPropertyModel(
         // (that is loading entities only if required),
         // this guard only triggers, once the first property model gets looked 
up;
         // in other words: this guard only works if every entity has at least 
a property
-        var ownerPojo = bookmarkedObjectModel.asManagedObject()
+        var ownerPojo = bookmarkedObjectModel.managedObject()
                 .getPojo();
         if(ownerPojo==null) {
             throw new ObjectNotFoundException(
-                    bookmarkedObjectModel.getBookmark().identifier());
+                    bookmarkedObjectModel.bookmark().identifier());
         }
 
         var propIdentifier = property.getFeatureIdentifier();
diff --git 
a/viewers/wicket/model/src/main/java/org/apache/causeway/viewer/wicket/model/models/coll/CollectionModelAbstract.java
 
b/viewers/wicket/model/src/main/java/org/apache/causeway/viewer/wicket/model/models/coll/CollectionModelAbstract.java
index c2b4f6c658b..3935c887441 100644
--- 
a/viewers/wicket/model/src/main/java/org/apache/causeway/viewer/wicket/model/models/coll/CollectionModelAbstract.java
+++ 
b/viewers/wicket/model/src/main/java/org/apache/causeway/viewer/wicket/model/models/coll/CollectionModelAbstract.java
@@ -70,7 +70,7 @@ protected CollectionModelAbstract(
 
     @Override
     protected DataTableInteractive load() {
-        var tableInteractive = 
tableMemento.getDataTableModel(bookmarkedObject.asManagedObject());
+        var tableInteractive = 
tableMemento.getDataTableModel(bookmarkedObject.managedObject());
         tableMemento.setupBindings(tableInteractive);
         return tableInteractive;
     }
@@ -98,7 +98,7 @@ public Identifier getIdentifier() {
 
     @Override
     public final ManagedObject getParentObject() {
-        return bookmarkedObject.asManagedObject();
+        return bookmarkedObject.managedObject();
     }
 
     /* XXX[CAUSEWAY-3798] do not override (as it was for the hidden table)
diff --git 
a/viewers/wicket/model/src/main/java/org/apache/causeway/viewer/wicket/model/models/interaction/BookmarkedObjectWkt.java
 
b/viewers/wicket/model/src/main/java/org/apache/causeway/viewer/wicket/model/models/interaction/BookmarkedObjectWkt.java
index 645c9d27580..fe184a6f69a 100644
--- 
a/viewers/wicket/model/src/main/java/org/apache/causeway/viewer/wicket/model/models/interaction/BookmarkedObjectWkt.java
+++ 
b/viewers/wicket/model/src/main/java/org/apache/causeway/viewer/wicket/model/models/interaction/BookmarkedObjectWkt.java
@@ -18,59 +18,51 @@
  */
 package org.apache.causeway.viewer.wicket.model.models.interaction;
 
+import org.apache.wicket.model.IModel;
+import org.jspecify.annotations.NonNull;
 import org.jspecify.annotations.Nullable;
 
 import org.apache.causeway.applib.services.bookmark.Bookmark;
 import org.apache.causeway.commons.internal.exceptions._Exceptions;
 import org.apache.causeway.core.metamodel.object.ManagedObject;
-import org.apache.causeway.viewer.wicket.model.models.ModelAbstract;
-
-import lombok.Getter;
-import org.jspecify.annotations.NonNull;
+import org.apache.causeway.core.metamodel.object.BookmarkedObjectHolder;
 
-public final class BookmarkedObjectWkt
-extends ModelAbstract<ManagedObject> {
-
-    private static final long serialVersionUID = 1L;
-    @Getter private final @NonNull Bookmark bookmark;
+public record BookmarkedObjectWkt(
+    @NonNull BookmarkedObjectHolder moHolder)
+implements IModel<ManagedObject> {
 
     /** overwrites any current cache entry, only safe when no other 
views/models reference the same ManagedObject */
     public static BookmarkedObjectWkt ofAdapter(
             final @NonNull ManagedObject domainObject) {
         var bookmark = domainObject.getBookmarkElseFail();
-        return new BookmarkedObjectWkt(bookmark, domainObject);
+        return new BookmarkedObjectWkt(new BookmarkedObjectHolder(bookmark, 
domainObject));
     }
 
     public static BookmarkedObjectWkt ofBookmark(final @Nullable Bookmark 
bookmark) {
-        return new BookmarkedObjectWkt(bookmark);
+        return new BookmarkedObjectWkt(new BookmarkedObjectHolder(bookmark, 
null));
     }
 
-    private BookmarkedObjectWkt(final @NonNull Bookmark bookmark) {
-        super();
-        this.bookmark = bookmark;
+    public Bookmark bookmark() {
+        return moHolder.bookmark();
     }
 
-    private BookmarkedObjectWkt(
-            final @NonNull Bookmark bookmark,
-            final @Nullable ManagedObject domainObject) {
-        super(domainObject);
-        this.bookmark = bookmark;
+    public ManagedObject managedObject() {
+        return moHolder.managedObject();
     }
 
-    public final ManagedObject asManagedObject() {
-        var entityOrViewmodel = super.getObject();
-        return entityOrViewmodel;
+    @Override
+    public ManagedObject getObject() {
+        return managedObject();
     }
 
     @Override
-    public final void setObject(final ManagedObject object) {
-        throw _Exceptions.unsupportedOperation("ManagedObjectWkt is 
immuatable");
+    public void setObject(final ManagedObject object) {
+        throw _Exceptions.unsupportedOperation("BookmarkedObjectWkt is 
immuatable");
     }
 
     @Override
-    protected final ManagedObject load() {
-        var adapter = 
getMetaModelContext().getObjectManager().loadObjectElseFail(bookmark);
-        return adapter;
+    public void detach() {
+        moHolder.detach();
     }
 
 }
diff --git 
a/viewers/wicket/model/src/main/java/org/apache/causeway/viewer/wicket/model/models/interaction/HasBookmarkedOwnerAbstract.java
 
b/viewers/wicket/model/src/main/java/org/apache/causeway/viewer/wicket/model/models/interaction/HasBookmarkedOwnerAbstract.java
index d8ae56b384d..49ade1b5d58 100644
--- 
a/viewers/wicket/model/src/main/java/org/apache/causeway/viewer/wicket/model/models/interaction/HasBookmarkedOwnerAbstract.java
+++ 
b/viewers/wicket/model/src/main/java/org/apache/causeway/viewer/wicket/model/models/interaction/HasBookmarkedOwnerAbstract.java
@@ -39,12 +39,12 @@ public abstract class HasBookmarkedOwnerAbstract<T>
 
     @Override
     public final Bookmark getOwnerBookmark() {
-        return bookmarkedObject.getBookmark();
+        return bookmarkedObject.bookmark();
     }
 
     @Override
     public final ManagedObject getBookmarkedOwner() {
-        return bookmarkedObject.asManagedObject();
+        return bookmarkedObject.managedObject();
     }
 
     public final BookmarkedObjectWkt bookmarkedObjectModel() {

Reply via email to