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