You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@causeway.apache.org by ah...@apache.org on 2025/03/12 05:56:12 UTC

(causeway) branch main updated: CAUSEWAY-3859: flattens ManagedObjectEntityTransient into a record

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 ad928d2bbd7 CAUSEWAY-3859: flattens ManagedObjectEntityTransient into a record
ad928d2bbd7 is described below

commit ad928d2bbd7dc0e68d8447d0e61d4659aefac7e6
Author: Andi Huber <ah...@apache.org>
AuthorDate: Wed Mar 12 06:53:31 2025 +0100

    CAUSEWAY-3859: flattens ManagedObjectEntityTransient into a record
---
 .../core/metamodel/object/Bookmarkable.java        |  2 +-
 .../core/metamodel/object/ManagedObject.java       |  3 +-
 ...ient.java => ManagedObjectEntityTransient.java} | 66 ++++++++++++++--------
 .../object/_ManagedObjectEntityAbstract.java       | 21 ++-----
 .../object/_ManagedObjectEntityBookmarked.java     |  8 +--
 .../object/_ManagedObjectEntityHybrid.java         |  4 +-
 .../objectmanager/memento/ObjectMemento.java       | 12 ++++
 7 files changed, 68 insertions(+), 48 deletions(-)

diff --git a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/object/Bookmarkable.java b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/object/Bookmarkable.java
index 6188dccc83c..9a202bc84c8 100644
--- a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/object/Bookmarkable.java
+++ b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/object/Bookmarkable.java
@@ -59,7 +59,7 @@ default Optional<Bookmark> refreshBookmark() {
                 bookmarkRefreshable.invalidateBookmark();
                 return bookmarkRefreshable.getBookmark();
             })
-            .orElse(getBookmark());
+            .orElseGet(this::getBookmark);
     }
 
     /**
diff --git a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/object/ManagedObject.java b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/object/ManagedObject.java
index 988b53ee1be..e7ffaa78f12 100644
--- a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/object/ManagedObject.java
+++ b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/object/ManagedObject.java
@@ -63,6 +63,7 @@ public sealed interface ManagedObject
     ManagedObjectValue,
     ManagedObjectService,
     ManagedObjectViewmodel,
+    ManagedObjectEntityTransient,
     _ManagedObjectEntityAbstract,
     PackedManagedObject {
 
@@ -492,7 +493,7 @@ private static ManagedObject entityHybirdTransient(
             final @Nullable Object pojo) {
         return pojo != null
                 ? new _ManagedObjectEntityHybrid(
-                        new _ManagedObjectEntityTransient(spec, pojo))
+                        new ManagedObjectEntityTransient(spec, pojo))
                 : empty(spec);
     }
     /**
diff --git a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/object/_ManagedObjectEntityTransient.java b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/object/ManagedObjectEntityTransient.java
similarity index 54%
rename from core/metamodel/src/main/java/org/apache/causeway/core/metamodel/object/_ManagedObjectEntityTransient.java
rename to core/metamodel/src/main/java/org/apache/causeway/core/metamodel/object/ManagedObjectEntityTransient.java
index e9175614a7a..d45b03136d2 100644
--- a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/object/_ManagedObjectEntityTransient.java
+++ b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/object/ManagedObjectEntityTransient.java
@@ -18,38 +18,45 @@
  */
 package org.apache.causeway.core.metamodel.object;
 
+import java.util.Optional;
+
+import org.jspecify.annotations.NonNull;
+
 import org.apache.causeway.applib.services.repository.EntityState;
 import org.apache.causeway.commons.internal.assertions._Assert;
-import org.apache.causeway.core.metamodel.facets.object.entity.EntityFacet;
-import org.apache.causeway.core.metamodel.object.ManagedObject.Specialization;
+import org.apache.causeway.core.metamodel.objectmanager.memento.ObjectMemento;
 import org.apache.causeway.core.metamodel.spec.ObjectSpecification;
 
-import lombok.Getter;
-import org.jspecify.annotations.NonNull;
-import lombok.experimental.Accessors;
-
 /**
  * (package private) specialization corresponding to a detached {@link Specialization#ENTITY}
  * @see ManagedObject.Specialization#ENTITY
  */
-final class _ManagedObjectEntityTransient
-extends _ManagedObjectEntityAbstract
-implements Bookmarkable.NoBookmark, _Refetchable {
-
-    @Getter(onMethod_ = {@Override}) @Accessors(makeFinal = true)
-    private final @NonNull Object pojo;
+record ManagedObjectEntityTransient(
+    @NonNull ObjectSpecification objSpec,
+    @NonNull Object pojo)
+implements ManagedObject, Bookmarkable.NoBookmark, _Refetchable {
 
-    _ManagedObjectEntityTransient(
-            final ObjectSpecification spec,
+    ManagedObjectEntityTransient(
+            final ObjectSpecification objSpec,
             final Object pojo) {
-        super(ManagedObject.Specialization.ENTITY, spec);
-        _Assert.assertTrue(spec.isEntity());
-        this.pojo = assertCompliance(pojo);
+        _Assert.assertTrue(objSpec.isEntity());
+        this.objSpec = objSpec;
+        this.pojo = _Compliance.assertCompliance(objSpec, specialization(), pojo);
+    }
+
+    @Override
+    public Specialization specialization() {
+        return ManagedObject.Specialization.ENTITY;
     }
 
     @Override
     public String getTitle() {
-        return "detached entity object";
+        return "transient entity object";
+    }
+
+    @Override
+    public Object getPojo() {
+        return pojo;
     }
 
     @Override
@@ -59,14 +66,27 @@ public Object peekAtPojo() {
 
     @Override
     public @NonNull EntityState getEntityState() {
-        var entityFacet = entityFacet();
-        return entityFacet.getEntityState(pojo);
+        return objSpec().entityFacetElseFail().getEntityState(pojo);
     }
 
-    // -- HELPER
+    @Override
+    public Optional<ObjectMemento> getMemento() {
+        return Optional.ofNullable(ObjectMemento.singularOrEmpty(this));
+    }
 
-    private EntityFacet entityFacet() {
-        return objSpec().entityFacetElseFail();
+    @Override
+    public boolean equals(final Object obj) {
+        return _Compliance.equals(this, obj);
+    }
+
+    @Override
+    public int hashCode() {
+        return _Compliance.hashCode(this);
+    }
+
+    @Override
+    public String toString() {
+        return _Compliance.toString(this);
     }
 
 }
\ No newline at end of file
diff --git a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/object/_ManagedObjectEntityAbstract.java b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/object/_ManagedObjectEntityAbstract.java
index fcf6c661dc0..ab1a0782e3e 100644
--- a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/object/_ManagedObjectEntityAbstract.java
+++ b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/object/_ManagedObjectEntityAbstract.java
@@ -19,8 +19,8 @@
 package org.apache.causeway.core.metamodel.object;
 
 import java.util.Optional;
+
 import org.jspecify.annotations.NonNull;
-import org.jspecify.annotations.Nullable;
 
 import org.apache.causeway.core.metamodel.facets.object.title.TitleRenderRequest;
 import org.apache.causeway.core.metamodel.objectmanager.memento.ObjectMemento;
@@ -36,14 +36,10 @@ abstract non-sealed class _ManagedObjectEntityAbstract
 implements ManagedObject {
 
     @Getter(onMethod_ = {@Override}) @Accessors(fluent = true, makeFinal = true)
-    private final @NonNull Specialization specialization;
+    protected final @NonNull Specialization specialization;
 
     @Getter(onMethod_ = {@Override}) @Accessors(fluent = true, makeFinal = true)
-    private final @NonNull ObjectSpecification objSpec;
-
-    final <T> T assertCompliance(final @NonNull T pojo) {
-        return _Compliance.assertCompliance(objSpec, specialization, pojo);
-    }
+    protected final @NonNull ObjectSpecification objSpec;
 
     @Override
     public String getTitle() {
@@ -53,16 +49,7 @@ public String getTitle() {
 
     @Override
     public Optional<ObjectMemento> getMemento() {
-        return Optional.ofNullable(mementoForScalar(this));
-    }
-
-    private ObjectMemento mementoForScalar(final @Nullable ManagedObject adapter) {
-        MmAssertionUtils.assertPojoIsScalar(adapter);
-        return ObjectMemento.singular(adapter)
-                .orElseGet(()->
-                    ManagedObjects.isSpecified(adapter)
-                        ? ObjectMemento.empty(adapter.logicalType())
-                        : null);
+        return Optional.ofNullable(ObjectMemento.singularOrEmpty(this));
     }
 
     @Override
diff --git a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/object/_ManagedObjectEntityBookmarked.java b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/object/_ManagedObjectEntityBookmarked.java
index e6ac5bfedc7..faf9175daf8 100644
--- a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/object/_ManagedObjectEntityBookmarked.java
+++ b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/object/_ManagedObjectEntityBookmarked.java
@@ -49,11 +49,11 @@ final class _ManagedObjectEntityBookmarked
     private final @NonNull Bookmark bookmark;
 
     _ManagedObjectEntityBookmarked(
-            final ObjectSpecification spec,
+            final ObjectSpecification objSpec,
             final Object pojo,
             final @NonNull Optional<Bookmark> bookmarkIfKnown) {
-        super(ManagedObject.Specialization.ENTITY, spec);
-        this.pojo = assertCompliance(pojo);
+        super(ManagedObject.Specialization.ENTITY, objSpec);
+        this.pojo = _Compliance.assertCompliance(objSpec, specialization, pojo);
         //sanity check bookmark
         this.bookmark = entityFacet().validateBookmark(bookmarkIfKnown
                 .orElseGet(this::createBookmark));
@@ -99,7 +99,7 @@ public Object getPojo() {
         var refetchedPojo = refetchPojo(entityState);
         refetching = false;
 
-        return this.pojo = assertCompliance(refetchedPojo);
+        return this.pojo = _Compliance.assertCompliance(objSpec, specialization, refetchedPojo);
     }
 
     @Override
diff --git a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/object/_ManagedObjectEntityHybrid.java b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/object/_ManagedObjectEntityHybrid.java
index 167aac40f9e..780fd281bb6 100644
--- a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/object/_ManagedObjectEntityHybrid.java
+++ b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/object/_ManagedObjectEntityHybrid.java
@@ -74,7 +74,7 @@ static MorphState valueOf(final EntityState entityState) {
     private MorphState morphState;
 
     _ManagedObjectEntityHybrid(
-            final @NonNull _ManagedObjectEntityTransient _transient) {
+            final @NonNull ManagedObjectEntityTransient _transient) {
         super(ManagedObject.Specialization.ENTITY, _transient.objSpec());
         this.variant = _transient;
         this.morphState = MorphState.TRANSIENT;
@@ -161,7 +161,7 @@ private boolean isVariantBookmarked() {
     }
 
     private boolean isVariantTransient() {
-        return variant instanceof _ManagedObjectEntityTransient;
+        return variant instanceof ManagedObjectEntityTransient;
     }
 
     private boolean isVariantRemoved() {
diff --git a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/objectmanager/memento/ObjectMemento.java b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/objectmanager/memento/ObjectMemento.java
index 13c8b701d82..b23f5d5a818 100644
--- a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/objectmanager/memento/ObjectMemento.java
+++ b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/objectmanager/memento/ObjectMemento.java
@@ -34,6 +34,7 @@
 import org.apache.causeway.commons.internal.resources._Serializables;
 import org.apache.causeway.core.metamodel.object.ManagedObject;
 import org.apache.causeway.core.metamodel.object.ManagedObjects;
+import org.apache.causeway.core.metamodel.object.MmAssertionUtils;
 
 /**
  * @since 2.0
@@ -67,6 +68,17 @@ static Optional<ObjectMemento> singular(final @Nullable ManagedObject adapter) {
                 ? Optional.empty()
                 : Optional.of(ObjectMementoSingular.create(adapter));
     }
+    /**
+     * returns null for null
+     */
+    @Nullable static ObjectMemento singularOrEmpty(final @Nullable ManagedObject adapter) {
+        MmAssertionUtils.assertPojoIsScalar(adapter);
+        return !ManagedObjects.isNullOrUnspecifiedOrEmpty(adapter)
+                ? ObjectMementoSingular.create(adapter)
+                : ManagedObjects.isSpecified(adapter)
+                    ? ObjectMemento.empty(adapter.logicalType())
+                    : null;
+    }
     static ObjectMemento packed(
             final LogicalType logicalType,
             final ArrayList<ObjectMemento> listOfMementos) {