You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@isis.apache.org by ah...@apache.org on 2022/09/04 06:33:14 UTC
[isis] 01/01: ISIS-3202: factors bookmark invalidation into separate interface
This is an automated email from the ASF dual-hosted git repository.
ahuber pushed a commit to branch 3202_executor_not_persisting_jpa
in repository https://gitbox.apache.org/repos/asf/isis.git
commit 3c42a3178f8b29d7a0f136eec800aa116bea2429
Author: Andi Huber <ah...@apache.org>
AuthorDate: Sun Sep 4 08:33:05 2022 +0200
ISIS-3202: factors bookmark invalidation into separate interface
---
.../isis/core/metamodel/object/Bookmarkable.java | 26 +++++++++-------
.../isis/core/metamodel/object/ManagedObject.java | 3 +-
...ed.java => _ManagedObjectEntityBookmarked.java} | 9 ++----
.../object/_ManagedObjectEntityHybrid.java | 35 ++++++++++------------
.../metamodel/object/_ManagedObjectService.java | 5 ----
.../core/metamodel/object/_ManagedObjectValue.java | 5 ----
.../metamodel/object/_ManagedObjectViewmodel.java | 7 +++--
.../actionresponse/ActionResultResponseType.java | 3 +-
.../widgets/linkandlabel/ActionLink.java | 5 +++-
.../wicket/ui/panels/FormExecutorDefault.java | 1 +
10 files changed, 46 insertions(+), 53 deletions(-)
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/object/Bookmarkable.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/object/Bookmarkable.java
index 69ce59eb42..55ecfe9f99 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/object/Bookmarkable.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/object/Bookmarkable.java
@@ -21,6 +21,7 @@ package org.apache.isis.core.metamodel.object;
import java.util.Optional;
import org.apache.isis.applib.services.bookmark.Bookmark;
+import org.apache.isis.commons.internal.base._Casts;
import org.apache.isis.core.metamodel.object.ManagedObject.Specialization.BookmarkPolicy;
import org.apache.isis.core.metamodel.objectmanager.ObjectManager;
@@ -40,15 +41,10 @@ public interface Bookmarkable {
boolean isBookmarkMemoized();
- /**
- * Similar to {@link #getBookmark()}, but invalidates any memoized {@link Bookmark}
- * such that the {@link Bookmark} returned is recreated, reflecting the object's current state.
- * @implNote
- * As this is not required, in fact not recommended for entities,
- * (but might be necessary for viewmodels, when their state has changed),
- * we silently ignore bookmark invalidation attempts for entities.
- */
- Optional<Bookmark> getBookmarkRefreshed();
+ default void invalidateBookmark() {
+ _Casts.castTo(BookmarkRefreshable.class, this)
+ .ifPresent(Bookmarkable.BookmarkRefreshable::invalidateBookmark);
+ }
/**
* Implements {@link Bookmarkable} reflecting
@@ -57,8 +53,18 @@ public interface Bookmarkable {
static interface NoBookmark extends Bookmarkable {
@Override default boolean isBookmarkSupported() { return false; }
@Override default Optional<Bookmark> getBookmark() { return Optional.empty(); }
- @Override default Optional<Bookmark> getBookmarkRefreshed() { return Optional.empty(); }
@Override default boolean isBookmarkMemoized() { return false; }
}
+ static interface BookmarkRefreshable extends Bookmarkable {
+ /**
+ * Invalidates any memoized {@link Bookmark} for (lazy) recreation,
+ * reflecting the object's current state.
+ * @apiNote only makes sense in the context of mutable viewmodels
+ */
+ @Override
+ void invalidateBookmark();
+
+ }
+
}
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/object/ManagedObject.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/object/ManagedObject.java
index 74c031850a..cb7f36fd0e 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/object/ManagedObject.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/object/ManagedObject.java
@@ -460,7 +460,7 @@ extends
final @NonNull Object pojo,
final @NonNull Optional<Bookmark> bookmarkIfKnown) {
return new _ManagedObjectEntityHybrid(
- new _ManagedObjectEntityAttached(spec, pojo, bookmarkIfKnown));
+ new _ManagedObjectEntityBookmarked(spec, pojo, bookmarkIfKnown));
}
//FIXME java-doc
static ManagedObject entityDetached(
@@ -632,4 +632,5 @@ extends
return ManagedObject.identified(spec, pojo, bookmark);
}
+
}
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/object/_ManagedObjectEntityAttached.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/object/_ManagedObjectEntityBookmarked.java
similarity index 95%
rename from core/metamodel/src/main/java/org/apache/isis/core/metamodel/object/_ManagedObjectEntityAttached.java
rename to core/metamodel/src/main/java/org/apache/isis/core/metamodel/object/_ManagedObjectEntityBookmarked.java
index 72e8633e1d..386fa2173b 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/object/_ManagedObjectEntityAttached.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/object/_ManagedObjectEntityBookmarked.java
@@ -40,14 +40,14 @@ import lombok.extern.log4j.Log4j2;
* @see ManagedObject.Specialization#ENTITY
*/
@Log4j2
-final class _ManagedObjectEntityAttached
+final class _ManagedObjectEntityBookmarked
extends _ManagedObjectSpecified
implements _Refetchable {
private /*final*/ @Nullable Object pojo;
private final @NonNull Bookmark bookmark;
- _ManagedObjectEntityAttached(
+ _ManagedObjectEntityBookmarked(
final ObjectSpecification spec,
final Object pojo,
final @NonNull Optional<Bookmark> bookmarkIfKnown) {
@@ -62,11 +62,6 @@ implements _Refetchable {
return Optional.of(bookmark);
}
- @Override
- public Optional<Bookmark> getBookmarkRefreshed() {
- return getBookmark(); // no-op for entities
- }
-
@Override
public boolean isBookmarkMemoized() {
return true;
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/object/_ManagedObjectEntityHybrid.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/object/_ManagedObjectEntityHybrid.java
index d0356438de..82765eb98d 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/object/_ManagedObjectEntityHybrid.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/object/_ManagedObjectEntityHybrid.java
@@ -42,25 +42,25 @@ extends _ManagedObjectSpecified
implements _Refetchable {
/**
- * dynamically mutates from one to the other based on pojos persistent state;
- * however the pojo reference must be kept identical
+ * dynamically mutates from one to the other based on pojo's persistent state;
+ * however, the pojo reference must be kept identical
*/
- private @NonNull Either<_ManagedObjectEntityDetached, _ManagedObjectEntityAttached>
- eitherDetachedOrAttached;
+ private @NonNull Either<_ManagedObjectEntityDetached, _ManagedObjectEntityBookmarked>
+ eitherDetachedOrBookmarked;
private EntityState entityState;
_ManagedObjectEntityHybrid(
final @NonNull _ManagedObjectEntityDetached detached) {
super(ManagedObject.Specialization.ENTITY, detached.getSpecification());
- this.eitherDetachedOrAttached = Either.left(detached);
+ this.eitherDetachedOrBookmarked = Either.left(detached);
this.entityState = EntityState.PERSISTABLE_DETACHED;
}
_ManagedObjectEntityHybrid(
- final @NonNull _ManagedObjectEntityAttached attached) {
+ final @NonNull _ManagedObjectEntityBookmarked attached) {
super(ManagedObject.Specialization.ENTITY, attached.getSpecification());
- this.eitherDetachedOrAttached = Either.right(attached);
+ this.eitherDetachedOrBookmarked = Either.right(attached);
this.entityState = EntityState.PERSISTABLE_ATTACHED;
this.bookmarkRef.set(attached.getBookmark().orElseThrow());
}
@@ -73,11 +73,6 @@ implements _Refetchable {
return Optional.ofNullable(bookmarkRef.get());
}
- @Override
- public Optional<Bookmark> getBookmarkRefreshed() {
- return getBookmark(); // identity op
- }
-
@Override
public boolean isBookmarkMemoized() {
return bookmarkRef.get()!=null;
@@ -86,7 +81,7 @@ implements _Refetchable {
@Override
public @NonNull EntityState getEntityState() {
- val entityState = eitherDetachedOrAttached
+ val entityState = eitherDetachedOrBookmarked
.fold(ManagedObject::getEntityState, ManagedObject::getEntityState);
if(this.entityState!=entityState) {
@@ -105,7 +100,7 @@ implements _Refetchable {
@Override
public Object getPojo() {
- val pojo = eitherDetachedOrAttached
+ val pojo = eitherDetachedOrBookmarked
.fold(ManagedObject::getPojo, ManagedObject::getPojo);
triggerReassessment();
@@ -115,7 +110,7 @@ implements _Refetchable {
@Override
public Object peekAtPojo() {
- return eitherDetachedOrAttached
+ return eitherDetachedOrBookmarked
.fold(_Refetchable::peekAtPojo, _Refetchable::peekAtPojo);
}
@@ -136,11 +131,11 @@ implements _Refetchable {
private final AtomicReference<Bookmark> bookmarkRef = new AtomicReference<Bookmark>();
private boolean isVariantAttached() {
- return eitherDetachedOrAttached.isRight();
+ return eitherDetachedOrBookmarked.isRight();
}
private boolean isVariantDetached() {
- return eitherDetachedOrAttached.isLeft();
+ return eitherDetachedOrBookmarked.isLeft();
}
@Synchronized
@@ -161,15 +156,15 @@ implements _Refetchable {
val bookmark = isBookmarkMemoized()
? Optional.ofNullable(bookmarkRef.get())
: getSpecification().entityFacetElseFail().bookmarkFor(pojo);
- val attached = new _ManagedObjectEntityAttached(getSpecification(), pojo, bookmark);
- eitherDetachedOrAttached = Either.right(attached);
+ val attached = new _ManagedObjectEntityBookmarked(getSpecification(), pojo, bookmark);
+ eitherDetachedOrBookmarked = Either.right(attached);
// set in any case
bookmarkRef.set(attached.getBookmark().orElseThrow());
}
// morph into detached
private void detach(final Object pojo) {
- eitherDetachedOrAttached = Either.left(
+ eitherDetachedOrBookmarked = Either.left(
new _ManagedObjectEntityDetached(getSpecification(), pojo));
}
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/object/_ManagedObjectService.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/object/_ManagedObjectService.java
index e9049f583a..982b9e0437 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/object/_ManagedObjectService.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/object/_ManagedObjectService.java
@@ -61,11 +61,6 @@ extends _ManagedObjectSpecified {
return bookmarkLazy.get();
}
- @Override
- public Optional<Bookmark> getBookmarkRefreshed() {
- return getBookmark(); // no-op for services
- }
-
@Override
public boolean isBookmarkMemoized() {
return bookmarkLazy.isMemoized();
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/object/_ManagedObjectValue.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/object/_ManagedObjectValue.java
index 6d2cc94cb4..6d8bf7520d 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/object/_ManagedObjectValue.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/object/_ManagedObjectValue.java
@@ -58,11 +58,6 @@ extends _ManagedObjectSpecified {
return bookmarkLazy.get();
}
- @Override
- public Optional<Bookmark> getBookmarkRefreshed() {
- return getBookmark(); // no-op for values
- }
-
@Override
public boolean isBookmarkMemoized() {
return bookmarkLazy.isMemoized();
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/object/_ManagedObjectViewmodel.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/object/_ManagedObjectViewmodel.java
index 441163221e..555d6332db 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/object/_ManagedObjectViewmodel.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/object/_ManagedObjectViewmodel.java
@@ -43,7 +43,9 @@ import lombok.val;
*/
final class _ManagedObjectViewmodel
extends _ManagedObjectSpecified
-implements _RefreshableViewmodel {
+implements
+ Bookmarkable.BookmarkRefreshable,
+ _RefreshableViewmodel {
@Getter(onMethod_ = {@Override})
@Nullable private /*final*/ Object pojo;
@@ -74,9 +76,8 @@ implements _RefreshableViewmodel {
}
@Override
- public final Optional<Bookmark> getBookmarkRefreshed() {
+ public void invalidateBookmark() {
bookmarkLazy.clear();
- return getBookmark();
}
private void replaceBookmark(final UnaryOperator<Bookmark> replacer) {
diff --git a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/actionresponse/ActionResultResponseType.java b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/actionresponse/ActionResultResponseType.java
index 5c4084cca8..6f4de9587d 100644
--- a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/actionresponse/ActionResultResponseType.java
+++ b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/actionresponse/ActionResultResponseType.java
@@ -233,7 +233,8 @@ public enum ActionResultResponseType {
}
public static ActionResultResponse toEntityPage(final ManagedObject entityOrViewmodel) {
- return ActionResultResponse.toPage(EntityPage.class, entityOrViewmodel.getBookmarkRefreshed().orElseThrow());
+ entityOrViewmodel.invalidateBookmark();
+ return ActionResultResponse.toPage(EntityPage.class, entityOrViewmodel.getBookmark().orElseThrow());
}
// -- HELPER
diff --git a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/linkandlabel/ActionLink.java b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/linkandlabel/ActionLink.java
index 3dd662b1d6..3899309c78 100644
--- a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/linkandlabel/ActionLink.java
+++ b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/linkandlabel/ActionLink.java
@@ -199,7 +199,10 @@ extends IndicatingAjaxLink<ManagedObject> {
// the EventBus' exception handler will automatically veto. This results in a growl message rather than
// an error page, but is probably 'good enough').
val targetAdapter = actionModel.getParentObject();
- val bookmark = targetAdapter.getBookmarkRefreshed().orElseThrow();
+
+ targetAdapter.invalidateBookmark();
+
+ val bookmark = targetAdapter.getBookmark().orElseThrow();
getCommonContext().getTransactionService().flushTransaction();
// "redirect-after-post"
diff --git a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/panels/FormExecutorDefault.java b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/panels/FormExecutorDefault.java
index bb3c128a58..a04a5d577d 100644
--- a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/panels/FormExecutorDefault.java
+++ b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/panels/FormExecutorDefault.java
@@ -173,6 +173,7 @@ implements FormExecutor {
});
// redirect using associated strategy
+ // XXX note: on property edit, triggers SQL update (on JPA)
resultResponse
.getHandlingStrategy()
.handleResults(getCommonContext(), resultResponse);