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/13 06:18:56 UTC

(causeway) branch main updated: CAUSEWAY-3859: removes _Refetchable (helper interface)

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 ad02b150ed5 CAUSEWAY-3859: removes _Refetchable (helper interface)
ad02b150ed5 is described below

commit ad02b150ed53040493f62f83643106ed9fa29772
Author: Andi Huber <ah...@apache.org>
AuthorDate: Thu Mar 13 07:18:52 2025 +0100

    CAUSEWAY-3859: removes _Refetchable (helper interface)
---
 .../core/metamodel/object/EntityPhase.java         |  8 ++--
 .../metamodel/object/EntityPhaseBookmarked.java    | 19 +++++---
 .../core/metamodel/object/EntityPhaseRemoved.java  | 20 +++-----
 .../metamodel/object/EntityPhaseTransient.java     | 17 +------
 .../core/metamodel/object/ManagedObject.java       | 19 ++++----
 .../core/metamodel/object/ManagedObjectEntity.java | 54 ++++++++++------------
 .../core/metamodel/object/ManagedObjects.java      |  4 +-
 .../core/metamodel/object/_Compliance.java         |  7 ++-
 .../core/metamodel/object/_Refetchable.java        | 27 -----------
 9 files changed, 60 insertions(+), 115 deletions(-)

diff --git a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/object/EntityPhase.java b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/object/EntityPhase.java
index 9449419b955..fbc6e8df820 100644
--- a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/object/EntityPhase.java
+++ b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/object/EntityPhase.java
@@ -19,13 +19,8 @@
 package org.apache.causeway.core.metamodel.object;
 
 import org.apache.causeway.applib.services.repository.EntityState;
-import org.apache.causeway.core.metamodel.context.HasMetaModelContext;
-import org.apache.causeway.core.metamodel.spec.HasObjectSpecification;
 
 public sealed interface EntityPhase
-extends
-    HasMetaModelContext,
-    HasObjectSpecification
 permits
     EntityPhaseTransient,
     EntityPhaseBookmarked,
@@ -34,4 +29,7 @@ public sealed interface EntityPhase
     EntityState getEntityState();
 
     Object getPojo();
+
+    /** side-effect free for toString, equals and hashCode */
+    Object peekAtPojo();
 }
diff --git a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/object/EntityPhaseBookmarked.java b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/object/EntityPhaseBookmarked.java
index 56ca6c2ba58..ed6133315b6 100644
--- a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/object/EntityPhaseBookmarked.java
+++ b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/object/EntityPhaseBookmarked.java
@@ -38,24 +38,29 @@
 
 import lombok.extern.log4j.Log4j2;
 
-/**
- * (package private) specialization corresponding to a attached {@link Specialization#ENTITY}
- * @see ManagedObject.Specialization#ENTITY
- */
 @Log4j2
 record EntityPhaseBookmarked(
     @NonNull ObjectSpecification objSpec,
     @NonNull TransientObjectRef<Object> pojoRef,
     @NonNull Bookmark bookmark)
-implements EntityPhase, _Refetchable {
+implements EntityPhase {
+
+    // bookmark not required
+    EntityPhaseBookmarked(
+            final ObjectSpecification objSpec,
+            final Object pojo) {
+        this(objSpec, new TransientObjectRef<>(pojo), null);
+    }
 
+    // bookmark required
     EntityPhaseBookmarked(
             final ObjectSpecification objSpec,
             final Object pojo,
-            final @NonNull Optional<Bookmark> bookmarkIfKnown) {
-        this(objSpec, new TransientObjectRef<>(pojo), bookmarkIfKnown.orElse(null));
+            final @NonNull Bookmark bookmark) {
+        this(objSpec, new TransientObjectRef<>(pojo), bookmark);
     }
 
+    // canonical constructor
     EntityPhaseBookmarked(
         final ObjectSpecification objSpec,
         final TransientObjectRef<Object> pojoRef,
diff --git a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/object/EntityPhaseRemoved.java b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/object/EntityPhaseRemoved.java
index 270e7b1c4d8..8ed3ceac7ed 100644
--- a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/object/EntityPhaseRemoved.java
+++ b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/object/EntityPhaseRemoved.java
@@ -21,26 +21,17 @@
 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.object.ManagedObject.Specialization;
-import org.apache.causeway.core.metamodel.spec.ObjectSpecification;
 
-/**
- * (package private) specialization corresponding to a removed {@link Specialization#ENTITY}
- * @see ManagedObject.Specialization#ENTITY
- */
-record EntityPhaseRemoved(
-        @NonNull ObjectSpecification objSpec)
+record EntityPhaseRemoved()
 implements EntityPhase {
 
-    EntityPhaseRemoved(
-            final ObjectSpecification objSpec) {
-        _Assert.assertTrue(objSpec.isEntity());
-        this.objSpec = objSpec;
+    @Override
+    public Object getPojo() {
+        return null;
     }
 
     @Override
-    public Object getPojo() {
+    public Object peekAtPojo() {
         return null;
     }
 
@@ -49,4 +40,5 @@ public Object getPojo() {
         return EntityState.REMOVED;
     }
 
+
 }
\ No newline at end of file
diff --git a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/object/EntityPhaseTransient.java b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/object/EntityPhaseTransient.java
index d0a50dd055c..76fc1ac55ab 100644
--- a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/object/EntityPhaseTransient.java
+++ b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/object/EntityPhaseTransient.java
@@ -22,17 +22,12 @@
 
 import org.apache.causeway.applib.services.repository.EntityState;
 import org.apache.causeway.commons.internal.assertions._Assert;
-import org.apache.causeway.core.metamodel.object.ManagedObject.Specialization;
 import org.apache.causeway.core.metamodel.spec.ObjectSpecification;
 
-/**
- * (package private) specialization corresponding to a detached {@link Specialization#ENTITY}
- * @see ManagedObject.Specialization#ENTITY
- */
 record EntityPhaseTransient(
     @NonNull ObjectSpecification objSpec,
     @NonNull Object pojo)
-implements EntityPhase, _Refetchable {
+implements EntityPhase {
 
     EntityPhaseTransient(
             final ObjectSpecification objSpec,
@@ -46,11 +41,6 @@ public ManagedObject.Specialization specialization() {
         return ManagedObject.Specialization.ENTITY;
     }
 
-//    @Override
-//    public String getTitle() {
-//        return "transient entity object";
-//    }
-
     @Override
     public Object getPojo() {
         return pojo;
@@ -66,9 +56,4 @@ public Object peekAtPojo() {
         return objSpec().entityFacetElseFail().getEntityState(pojo);
     }
 
-//    @Override
-//    public Optional<ObjectMemento> getMemento() {
-//        return Optional.ofNullable(ObjectMemento.singularOrEmpty(this));
-//    }
-
 }
\ No newline at end of file
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 4a254ac6c2b..dd80f5dfc47 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
@@ -469,25 +469,22 @@ static ManagedObject entity(
             final @NonNull ObjectSpecification spec,
             final @Nullable Object pojo,
             final @NonNull Optional<Bookmark> bookmarkIfKnown) {
-        if(pojo == null) {
-            return empty(spec);
-        }
+        if(pojo == null) return empty(spec);
+
         var bookmarkIfAny = bookmarkIfKnown
                 .or(()->spec.entityFacetElseFail().bookmarkFor(pojo));
         return bookmarkIfAny
-            .map(bookmark->entityHypridBookmarked(spec, pojo, bookmarkIfAny))
-            .orElseGet(()->entityHybirdTransient(spec, pojo));
+            .map(bookmark->entityBookmarked(spec, pojo, bookmark))
+            .orElseGet(()->entityTransient(spec, pojo));
     }
-    // bookmarked hybrid in its final state (cannot transition)
-    private static ManagedObject entityHypridBookmarked(
+    private static ManagedObject entityBookmarked(
             final @NonNull ObjectSpecification spec,
             final @NonNull Object pojo,
-            final @NonNull Optional<Bookmark> bookmarkIfKnown) {
+            final @NonNull Bookmark bookmark) {
         return new ManagedObjectEntity(
-                        new EntityPhaseBookmarked(spec, pojo, bookmarkIfKnown));
+                        new EntityPhaseBookmarked(spec, pojo, bookmark));
     }
-    // initially detached hybrid that can transition to bookmarked anytime on reassessment
-    private static ManagedObject entityHybirdTransient(
+    private static ManagedObject entityTransient(
             final @NonNull ObjectSpecification spec,
             final @Nullable Object pojo) {
         return pojo != null
diff --git a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/object/ManagedObjectEntity.java b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/object/ManagedObjectEntity.java
index dcb67cc64b7..8f2a312adab 100644
--- a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/object/ManagedObjectEntity.java
+++ b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/object/ManagedObjectEntity.java
@@ -48,11 +48,11 @@ record ManagedObjectEntity(
      * However, the pojo reference must be kept identical, unless the entity becomes 'removed',
      * in which case the pojo reference is invalidated and should no longer be accessible to callers.
      */
-    @NonNull TransientObjectRef<EntityPhase> variantRef,
-    @NonNull TransientObjectRef<MorphState> morphStateRef)
-implements ManagedObject, _Refetchable {
+    @NonNull TransientObjectRef<EntityPhase> phaseRef,
+    @NonNull TransientObjectRef<PhaseState> morphStateRef)
+implements ManagedObject {
 
-    private enum MorphState {
+    private enum PhaseState {
         /** Has no bookmark yet; can be transitioned to BOOKMARKED once
          *  for accompanied pojo, an OID becomes available. */
         TRANSIENT,
@@ -64,7 +64,7 @@ private enum MorphState {
         public boolean isTransient() { return this == TRANSIENT; }
         public boolean isBookmarked() { return this == BOOKMARKED; }
         public boolean isRemoved() { return this == REMOVED; }
-        static MorphState valueOf(final EntityState entityState) {
+        static PhaseState valueOf(final EntityState entityState) {
             return entityState.isRemoved()
                     ? REMOVED
                     : entityState.isAttached()
@@ -75,12 +75,12 @@ static MorphState valueOf(final EntityState entityState) {
 
     ManagedObjectEntity(
             final @NonNull EntityPhaseTransient transientPhase) {
-        this(transientPhase.objSpec(), new TransientObjectRef<>(transientPhase), new TransientObjectRef<>(MorphState.TRANSIENT));
+        this(transientPhase.objSpec(), new TransientObjectRef<>(transientPhase), new TransientObjectRef<>(PhaseState.TRANSIENT));
     }
 
     ManagedObjectEntity(
             final @NonNull EntityPhaseBookmarked bookmarkedPhase) {
-        this(bookmarkedPhase.objSpec(), new TransientObjectRef<>(bookmarkedPhase), new TransientObjectRef<>(MorphState.BOOKMARKED));
+        this(bookmarkedPhase.objSpec(), new TransientObjectRef<>(bookmarkedPhase), new TransientObjectRef<>(PhaseState.BOOKMARKED));
     }
 
     @Override
@@ -101,8 +101,7 @@ public Optional<ObjectMemento> getMemento() {
 
     @Override
     public Optional<Bookmark> getBookmark() {
-        var variant = variant();
-        return (variant instanceof EntityPhaseBookmarked bookmarked)
+        return (phase() instanceof EntityPhaseBookmarked bookmarked)
                 ? Optional.of(bookmarked.bookmark())
                 : Optional.empty();
     }
@@ -114,12 +113,12 @@ public boolean isBookmarkMemoized() {
 
     @Override
     public @NonNull EntityState getEntityState() {
-        var entityState = variant().getEntityState();
-        var newMorphState = MorphState.valueOf(entityState);
+        var entityState = phase().getEntityState();
+        var newMorphState = PhaseState.valueOf(entityState);
 
         if(morphStateRef.getObject()!=newMorphState) {
-            log.debug("about to transition to {} variant given {}", newMorphState.name(), entityState);
-            reassessVariant(entityState, peekAtPojo());
+            log.debug("about to transition to {} phase given {}", newMorphState.name(), entityState);
+            reassessPhase(entityState, peekAtPojo());
             if(newMorphState.isBookmarked()) {
                 _Assert.assertTrue(isBookmarkedPhase(), ()->"successful transition");
             } else if(newMorphState.isRemoved()) {
@@ -136,7 +135,7 @@ public Object getPojo() {
 
         // handle the 'deleted' / 'not found' case gracefully ...
         try {
-            var pojo = variant().getPojo();
+            var pojo = phase().getPojo();
             triggerReassessment();
             //if(pojo==null) makeRemoved(); seems reasonable, not tested yet
             return pojo;
@@ -147,11 +146,8 @@ public Object getPojo() {
         }
     }
 
-    @Override
     public Object peekAtPojo() {
-        return (variant() instanceof _Refetchable refetchable)
-                ? refetchable.peekAtPojo()
-                : null;
+        return phase().peekAtPojo();
     }
 
     @Override
@@ -171,8 +167,8 @@ public final String toString() {
 
     // -- HELPER
 
-    private EntityPhase variant() {
-        return variantRef.getObject();
+    private EntityPhase phase() {
+        return phaseRef.getObject();
     }
 
     private void triggerReassessment() {
@@ -182,24 +178,24 @@ private void triggerReassessment() {
     }
 
     private boolean isBookmarkedPhase() {
-        return variant() instanceof EntityPhaseBookmarked;
+        return phase() instanceof EntityPhaseBookmarked;
     }
 
     private boolean isTransientPhase() {
-        return variant() instanceof EntityPhaseTransient;
+        return phase() instanceof EntityPhaseTransient;
     }
 
     private boolean isRemovedPhase() {
-        return variant() instanceof EntityPhaseRemoved;
+        return phase() instanceof EntityPhaseRemoved;
     }
 
-    private synchronized void reassessVariant(final EntityState entityState, final Object pojo) {
+    private synchronized void reassessPhase(final EntityState entityState, final Object pojo) {
         if(isTransientPhase()
                 && entityState.hasOid()) {
             makeBookmarked(pojo);
             return;
         }
-        /* if the current EntityState is REMOVED, we handle variant transition
+        /* if the current EntityState is REMOVED, we handle phase transition
          * - from BOOKMARKED
          * - as well as from TRANSIENT
          * to REMOVED */
@@ -213,14 +209,14 @@ private synchronized void reassessVariant(final EntityState entityState, final O
 
     // transition to 'attached' state
     private void makeBookmarked(final Object pojo) {
-        var attached = new EntityPhaseBookmarked(objSpec(), pojo, Optional.empty());
-        variantRef.update(__->attached);
+        var attached = new EntityPhaseBookmarked(objSpec(), pojo);
+        phaseRef.update(__->attached);
     }
 
     // transition to 'removed' state
     private void makeRemoved() {
-        var removed = new EntityPhaseRemoved(objSpec());
-        variantRef.update(__->removed);
+        var removed = new EntityPhaseRemoved();
+        phaseRef.update(__->removed);
     }
 
 }
\ No newline at end of file
diff --git a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/object/ManagedObjects.java b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/object/ManagedObjects.java
index 4f13f96df94..d05be0e0394 100644
--- a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/object/ManagedObjects.java
+++ b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/object/ManagedObjects.java
@@ -293,8 +293,8 @@ public Stream<ManagedObject> stream(
     public Object peekAtPojoOf(final @Nullable ManagedObject obj) {
         return isNullOrUnspecifiedOrEmpty(obj)
                 ? null
-                : (obj instanceof _Refetchable)
-                    ? ((_Refetchable)obj).peekAtPojo()
+                : (obj instanceof ManagedObjectEntity entity)
+                    ? entity.peekAtPojo()
                     : obj.getPojo();
     }
 
diff --git a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/object/_Compliance.java b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/object/_Compliance.java
index e58e35aaad1..54d0d3551e7 100644
--- a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/object/_Compliance.java
+++ b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/object/_Compliance.java
@@ -66,8 +66,7 @@ boolean equals(final ManagedObject mo, final Object obj) {
         if(!mo.specialization().equals(other.specialization())) return false;
         if(!mo.objSpec().equals(other.objSpec())) return false;
 
-        var canGetPojosWithoutSideeffect = !mo.specialization().getPojoPolicy().isRefetchable();
-        if(canGetPojosWithoutSideeffect) {
+        if(!mo.specialization().getPojoPolicy().isRefetchable()) {
             // expected to work for packed variant just fine, as it compares lists
             return Objects.equals(mo.getPojo(), other.getPojo());
         }
@@ -79,8 +78,8 @@ boolean equals(final ManagedObject mo, final Object obj) {
                     other.getBookmark().orElseThrow(_Exceptions::unexpectedCodeReach));
         }
 
-        var a = (_Refetchable) mo;
-        var b = (_Refetchable) mo;
+        var a = (ManagedObjectEntity) mo;
+        var b = (ManagedObjectEntity) other;
         return Objects.equals(a.peekAtPojo(), b.peekAtPojo());
     }
 
diff --git a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/object/_Refetchable.java b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/object/_Refetchable.java
deleted file mode 100644
index 3f3d5fcc56f..00000000000
--- a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/object/_Refetchable.java
+++ /dev/null
@@ -1,27 +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.core.metamodel.object;
-
-/** don't expose outside this package */
-interface _Refetchable {
-
-    /** side-effect free for toString, equals and hashCode */
-    Object peekAtPojo();
-
-}