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 2021/12/06 08:31:19 UTC
[isis] branch master updated: ISIS-2910: fixes bookmark memoization
This is an automated email from the ASF dual-hosted git repository.
ahuber pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/isis.git
The following commit(s) were added to refs/heads/master by this push:
new 2042cd9 ISIS-2910: fixes bookmark memoization
2042cd9 is described below
commit 2042cd9e9bd9afcdf917c0c21e0ba2a6a736970d
Author: Andi Huber <ah...@apache.org>
AuthorDate: Mon Dec 6 09:30:59 2021 +0100
ISIS-2910: fixes bookmark memoization
- such that in case of viewmodels, no matter what, an AJAX request
always returns with a bookmark, recreateed from the viewmodel's latest
state
---
.../isis/core/metamodel/spec/ManagedObject.java | 31 +++++++++++++++++++---
.../isis/core/metamodel/spec/ManagedObjects.java | 5 ++++
.../isis/testdomain/jdo/JdoInventoryJaxbVm.java | 3 ++-
.../isis/testdomain/jdo/JdoTestFixtures.java | 2 +-
.../isis/testdomain/jpa/JpaInventoryJaxbVm.java | 3 ++-
.../isis/testdomain/jpa/JpaTestFixtures.java | 3 ++-
.../actionresponse/ActionResultResponseType.java | 23 +++++-----------
.../wicket/ui/panels/FormExecutorDefault.java | 6 ++---
8 files changed, 49 insertions(+), 27 deletions(-)
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/ManagedObject.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/ManagedObject.java
index 4c78824..26b627f 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/ManagedObject.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/ManagedObject.java
@@ -67,6 +67,16 @@ public interface ManagedObject {
*/
Optional<Bookmark> getBookmark();
+ /**
+ * 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();
+
boolean isBookmarkMemoized();
default Supplier<ManagedObject> asProvider() {
@@ -233,6 +243,15 @@ public interface ManagedObject {
return bookmarkLazy.get();
}
+ @Override
+ public Optional<Bookmark> getBookmarkRefreshed() {
+ // silently ignore invalidation, when the pojo is an entity
+ if(!specification.isEntity()) {
+ bookmarkLazy.clear();
+ }
+ return getBookmark();
+ }
+
// -- LAZY ID HANDLING
private final _Lazy<Optional<Bookmark>> bookmarkLazy =
_Lazy.threadSafe(()->ManagedObjects.BookmarkUtil.bookmark(this));
@@ -258,6 +277,15 @@ public interface ManagedObject {
return bookmarkLazy.get();
}
+ @Override
+ public Optional<Bookmark> getBookmarkRefreshed() {
+ // silently ignore invalidation, when the pojo is an entity
+ if(!specification.get().isEntity()) {
+ bookmarkLazy.clear();
+ }
+ return getBookmark();
+ }
+
// -- LAZY ID HANDLING
private final _Lazy<Optional<Bookmark>> bookmarkLazy =
_Lazy.threadSafe(()->ManagedObjects.BookmarkUtil.bookmark(this));
@@ -299,7 +327,4 @@ public interface ManagedObject {
}
-
-
-
}
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/ManagedObjects.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/ManagedObjects.java
index 7c16356..e6cf411 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/ManagedObjects.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/ManagedObjects.java
@@ -415,6 +415,11 @@ public final class ManagedObjects {
}
@Override
+ public Optional<Bookmark> getBookmarkRefreshed() {
+ return Optional.empty();
+ }
+
+ @Override
public boolean isBookmarkMemoized() {
return false;
}
diff --git a/regressiontests/stable/src/main/java/org/apache/isis/testdomain/jdo/JdoInventoryJaxbVm.java b/regressiontests/stable/src/main/java/org/apache/isis/testdomain/jdo/JdoInventoryJaxbVm.java
index 771e98e..55836ef 100644
--- a/regressiontests/stable/src/main/java/org/apache/isis/testdomain/jdo/JdoInventoryJaxbVm.java
+++ b/regressiontests/stable/src/main/java/org/apache/isis/testdomain/jdo/JdoInventoryJaxbVm.java
@@ -62,7 +62,8 @@ public class JdoInventoryJaxbVm {
private RepositoryService repository;
@ObjectSupport public String title() {
- return String.format("JdoInventoryJaxbVm; %d products", listProducts().size());
+ return String.format("%s; %s; %d products",
+ this.getClass().getSimpleName(), getName(), listProducts().size());
}
@Property(editing = Editing.ENABLED)
diff --git a/regressiontests/stable/src/main/java/org/apache/isis/testdomain/jdo/JdoTestFixtures.java b/regressiontests/stable/src/main/java/org/apache/isis/testdomain/jdo/JdoTestFixtures.java
index 381a390..abd573f 100644
--- a/regressiontests/stable/src/main/java/org/apache/isis/testdomain/jdo/JdoTestFixtures.java
+++ b/regressiontests/stable/src/main/java/org/apache/isis/testdomain/jdo/JdoTestFixtures.java
@@ -115,7 +115,7 @@ public class JdoTestFixtures {
public void assertPopulatedWithDefaults(
final JdoInventoryJaxbVm inventoryJaxbVm) {
- assertEquals("JdoInventoryJaxbVm; 3 products", inventoryJaxbVm.title());
+ assertEquals("JdoInventoryJaxbVm; Bookstore; 3 products", inventoryJaxbVm.title());
assertEquals("Bookstore", inventoryJaxbVm.getName());
val books = inventoryJaxbVm.listBooks();
assertEquals(3, books.size());
diff --git a/regressiontests/stable/src/main/java/org/apache/isis/testdomain/jpa/JpaInventoryJaxbVm.java b/regressiontests/stable/src/main/java/org/apache/isis/testdomain/jpa/JpaInventoryJaxbVm.java
index 6459c46..6dd35c9 100644
--- a/regressiontests/stable/src/main/java/org/apache/isis/testdomain/jpa/JpaInventoryJaxbVm.java
+++ b/regressiontests/stable/src/main/java/org/apache/isis/testdomain/jpa/JpaInventoryJaxbVm.java
@@ -63,7 +63,8 @@ public class JpaInventoryJaxbVm {
private RepositoryService repository;
@ObjectSupport public String title() {
- return String.format("JpaInventoryJaxbVm; %d products", listProducts().size());
+ return String.format("%s; %s; %d products",
+ this.getClass().getSimpleName(), getName(), listProducts().size());
}
@Property(editing = Editing.ENABLED)
diff --git a/regressiontests/stable/src/main/java/org/apache/isis/testdomain/jpa/JpaTestFixtures.java b/regressiontests/stable/src/main/java/org/apache/isis/testdomain/jpa/JpaTestFixtures.java
index 7636f3e..1aabcc5 100644
--- a/regressiontests/stable/src/main/java/org/apache/isis/testdomain/jpa/JpaTestFixtures.java
+++ b/regressiontests/stable/src/main/java/org/apache/isis/testdomain/jpa/JpaTestFixtures.java
@@ -115,7 +115,8 @@ public class JpaTestFixtures {
public void assertPopulatedWithDefaults(
final JpaInventoryJaxbVm inventoryJaxbVm) {
- assertEquals("JpaInventoryJaxbVm; 3 products", inventoryJaxbVm.title());
+
+ assertEquals("JpaInventoryJaxbVm; Bookstore; 3 products", inventoryJaxbVm.title());
assertEquals("Bookstore", inventoryJaxbVm.getName());
val books = inventoryJaxbVm.listBooks();
assertEquals(3, books.size());
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 2181e41..d55a8e6 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
@@ -38,7 +38,6 @@ import org.apache.isis.viewer.wicket.model.models.EntityCollectionModelStandalon
import org.apache.isis.viewer.wicket.model.models.PageType;
import org.apache.isis.viewer.wicket.model.models.ValueModel;
import org.apache.isis.viewer.wicket.model.models.VoidModel;
-import org.apache.isis.viewer.wicket.model.util.PageParameterUtils;
import org.apache.isis.viewer.wicket.ui.pages.PageClassRegistry;
import org.apache.isis.viewer.wicket.ui.pages.entity.EntityPage;
import org.apache.isis.viewer.wicket.ui.pages.standalonecollection.StandaloneCollectionPage;
@@ -57,17 +56,15 @@ public enum ActionResultResponseType {
final AjaxRequestTarget target,
final ManagedObject resultAdapter,
final Can<ManagedObject> args) {
- final var commonContext = actionModel.getCommonContext();
- final var actualAdapter = determineScalarAdapter(commonContext, resultAdapter); // intercepts collections
- return toEntityPage(actionModel, actualAdapter);
+ determineScalarAdapter(actionModel.getCommonContext(), resultAdapter); // intercepts collections
+ return toEntityPage(resultAdapter);
}
@Override
public ActionResultResponse interpretResult(
final ActionModel actionModel,
final ManagedObject targetAdapter) {
- final ActionResultResponse actionResultResponse = toEntityPage(actionModel, targetAdapter);
- return actionResultResponse;
+ return toEntityPage(targetAdapter);
}
},
COLLECTION {
@@ -230,6 +227,10 @@ public enum ActionResultResponseType {
.interpretResult(model, targetIfAny, typeAndAdapter.resultAdapter, args);
}
+ public static ActionResultResponse toEntityPage(final ManagedObject actualAdapter) {
+ return ActionResultResponse.toPage(EntityPage.class, actualAdapter.getBookmarkRefreshed().orElseThrow());
+ }
+
// -- HELPER
private static ManagedObject determineScalarAdapter(
@@ -250,16 +251,6 @@ public enum ActionResultResponseType {
}
}
- private static ActionResultResponse toEntityPage(
- final ActionModel model,
- final ManagedObject actualAdapter) {
-
- return ActionResultResponse.toPage(PageRedirectRequest.forPageClass(
- EntityPage.class,
- PageParameterUtils.createPageParametersForObject(actualAdapter)));
-
- }
-
@Value(staticConstructor = "of")
private static class TypeAndAdapter {
final ActionResultResponseType type;
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 d33eee9..7aa17f8 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
@@ -41,9 +41,7 @@ import org.apache.isis.viewer.wicket.model.models.ActionModel;
import org.apache.isis.viewer.wicket.model.models.FormExecutor;
import org.apache.isis.viewer.wicket.model.models.FormExecutorContext;
import org.apache.isis.viewer.wicket.model.models.ScalarPropertyModel;
-import org.apache.isis.viewer.wicket.ui.actionresponse.ActionResultResponse;
import org.apache.isis.viewer.wicket.ui.actionresponse.ActionResultResponseType;
-import org.apache.isis.viewer.wicket.ui.pages.entity.EntityPage;
import lombok.NonNull;
import lombok.val;
@@ -154,8 +152,8 @@ implements FormExecutor {
val resultResponse = actionOrPropertyModel.fold(
act->ActionResultResponseType
.determineAndInterpretResult(act, ajaxTarget, resultAdapter, act.snapshotArgs()),
- prop->ActionResultResponse
- .toPage(EntityPage.class, resultAdapter.getBookmark().orElseThrow()));
+ prop->ActionResultResponseType
+ .toEntityPage(resultAdapter));
_Debug.onCondition(XrayUi.isXrayEnabled(), ()->{
_Debug.log(10, "handle result ...");