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 ...");