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/causeway.git


The following commit(s) were added to refs/heads/master by this push:
     new 5e7602aa3c CAUSEWAY-3530: reverts detaching of DataTableModel
5e7602aa3c is described below

commit 5e7602aa3c5ece0f606ff2a117f3d7c12efe2ec2
Author: andi-huber <[email protected]>
AuthorDate: Mon Jul 17 10:04:16 2023 +0200

    CAUSEWAY-3530: reverts detaching of DataTableModel
---
 .../managed/nonscalar/DataTableModel.java          | 11 +++++-
 .../object/_ManagedObjectEntityHybrid.java         | 25 +++++++------
 .../object/_RecognizeObjectDeletedOrNotFound.java  | 42 ++++++++++++++++++++++
 .../specloader/specimpl/ObjectActionMixedIn.java   |  5 ++-
 .../models/interaction/coll/DataTableModelWkt.java | 18 ++--------
 5 files changed, 73 insertions(+), 28 deletions(-)

diff --git 
a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/interactions/managed/nonscalar/DataTableModel.java
 
b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/interactions/managed/nonscalar/DataTableModel.java
index 2c3ff3050d..306d334c40 100644
--- 
a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/interactions/managed/nonscalar/DataTableModel.java
+++ 
b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/interactions/managed/nonscalar/DataTableModel.java
@@ -25,10 +25,10 @@ import java.util.UUID;
 import java.util.concurrent.atomic.AtomicBoolean;
 import java.util.function.Supplier;
 
-import org.apache.causeway.applib.annotation.TableDecorator;
 import org.springframework.lang.Nullable;
 
 import org.apache.causeway.applib.Identifier;
+import org.apache.causeway.applib.annotation.TableDecorator;
 import org.apache.causeway.applib.annotation.Where;
 import org.apache.causeway.commons.collections.Can;
 import org.apache.causeway.commons.internal.binding._BindableAbstract;
@@ -66,6 +66,10 @@ implements MultiselectChoices {
 
     // -- FACTORIES
 
+    public static DataTableModel empty(final ManagedMember managedMember, 
final Where where) {
+        return new DataTableModel(managedMember, where, Can::empty);
+    }
+
     public static DataTableModel forCollection(
             final ManagedCollection managedCollection) {
         return new DataTableModel(managedCollection, 
managedCollection.getWhere(), ()->
@@ -294,6 +298,11 @@ implements MultiselectChoices {
 
         public DataTableModel getDataTableModel(final ManagedObject owner) {
 
+            if(owner.getPojo()==null) {
+                // owner (if entity) might have been deleted
+                throw _Exceptions.illegalArgument("cannot recreate from 
memento for deleted object");
+            }
+
             val memberId = featureId.getMemberLogicalName();
 
             if(featureId.getType().isPropertyOrCollection()) {
diff --git 
a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/object/_ManagedObjectEntityHybrid.java
 
b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/object/_ManagedObjectEntityHybrid.java
index d7e3670a7e..ebf304026f 100644
--- 
a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/object/_ManagedObjectEntityHybrid.java
+++ 
b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/object/_ManagedObjectEntityHybrid.java
@@ -20,13 +20,13 @@ package org.apache.causeway.core.metamodel.object;
 
 import java.util.Optional;
 
-import 
org.apache.causeway.applib.exceptions.unrecoverable.ObjectNotFoundException;
 import org.apache.causeway.applib.services.bookmark.Bookmark;
 import org.apache.causeway.applib.services.repository.EntityState;
 import org.apache.causeway.commons.internal.assertions._Assert;
 import org.apache.causeway.commons.internal.base._Blackhole;
 
 import lombok.NonNull;
+import lombok.SneakyThrows;
 import lombok.Synchronized;
 import lombok.val;
 import lombok.extern.log4j.Log4j2;
@@ -121,21 +121,26 @@ implements _Refetchable {
         return entityState;
     }
 
-    @Override
+    @Override @SneakyThrows
     public Object getPojo() {
         if(isVariantRemoved()) {
             return null; // don't reassess
         }
 
-        // handle the 'deleted' / 'not found' case gracefully
+        // handle the 'deleted' / 'not found' case gracefully ...
         try {
             val pojo = variant.getPojo();
             triggerReassessment();
             return pojo;
-        } catch (ObjectNotFoundException e) {
-            // if object not found, transition to 'removed' state
-            makeRemoved();
-            return null;
+        } catch (Throwable ex) {
+
+            if(_RecognizeObjectDeletedOrNotFound.recognize(ex)) {
+                // if object not found, transition to 'removed' state
+                makeRemoved();
+                return null;
+            }
+
+            throw ex;
         }
     }
 
@@ -181,9 +186,9 @@ implements _Refetchable {
             makeBookmarked(pojo);
             return;
         }
-        /* if the current EntityState is REMOVED, we handle variant transition 
-         * - from BOOKMARKED 
-         * - as well as from TRANSIENT 
+        /* if the current EntityState is REMOVED, we handle variant transition
+         * - from BOOKMARKED
+         * - as well as from TRANSIENT
          * to REMOVED */
         if((isVariantBookmarked()
                 || isVariantTransient())
diff --git 
a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/object/_RecognizeObjectDeletedOrNotFound.java
 
b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/object/_RecognizeObjectDeletedOrNotFound.java
new file mode 100644
index 0000000000..2a5fc7ce7c
--- /dev/null
+++ 
b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/object/_RecognizeObjectDeletedOrNotFound.java
@@ -0,0 +1,42 @@
+/*
+ *  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;
+
+import org.apache.causeway.commons.internal.exceptions._Exceptions;
+
+import lombok.NonNull;
+import lombok.experimental.UtilityClass;
+
+@UtilityClass
+class _RecognizeObjectDeletedOrNotFound {
+
+    /**
+     * Returns optionally the {@link Throwable} to throw, based on whether
+     * the Object-Deleted-Or-Not-Found case could not be detected.
+     * @return if empty, the Object-Deleted-Or-Not-Found case was detected
+     */
+    boolean recognize(final @NonNull Throwable throwable) {
+
+        return _Exceptions.streamCausalChain(throwable)
+            .map(Throwable::getClass)
+            .map(Class::getSimpleName)
+            .anyMatch(exName->exName.endsWith("ObjectNotFoundException"));
+    }
+
+}
diff --git 
a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/specloader/specimpl/ObjectActionMixedIn.java
 
b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/specloader/specimpl/ObjectActionMixedIn.java
index bdc4dd1dce..be592c5be6 100644
--- 
a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/specloader/specimpl/ObjectActionMixedIn.java
+++ 
b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/specloader/specimpl/ObjectActionMixedIn.java
@@ -172,7 +172,10 @@ implements MixedInMember {
         _Assert.assertEquals(target.getSpecification(), 
head.getTarget().getSpecification(),
                 "head has the wrong target (should be a mixed-in adapter, but 
is the mixee adapter)");
 
-        setupCommand(head, arguments);
+        if(!interactionInitiatedBy.isPassThrough()) {
+            // skip if is PASS_THROUGH
+            setupCommand(head, arguments);
+        }
         return mixinAction.executeInternal(
                 head, arguments,
                 interactionInitiatedBy);
diff --git 
a/viewers/wicket/model/src/main/java/org/apache/causeway/viewer/wicket/model/models/interaction/coll/DataTableModelWkt.java
 
b/viewers/wicket/model/src/main/java/org/apache/causeway/viewer/wicket/model/models/interaction/coll/DataTableModelWkt.java
index dc357ac1c7..fbed84afce 100644
--- 
a/viewers/wicket/model/src/main/java/org/apache/causeway/viewer/wicket/model/models/interaction/coll/DataTableModelWkt.java
+++ 
b/viewers/wicket/model/src/main/java/org/apache/causeway/viewer/wicket/model/models/interaction/coll/DataTableModelWkt.java
@@ -126,22 +126,8 @@ implements
 
     @Override
     public final void detach() {
-        if(isDataTableModelReuse()) return;
-        super.detach();
-    }
-
-    // -- HELPER
-
-    private final static String PROPERTY_NAME_MODEL_REUSE = 
"causeway.viewer.wicket.dataTableModelReuse";
-    /**
-     * experimental, undocumented feature:
-     * <p>
-     * when enabled, in support of optimized table sorting, don't detach;
-     * instead reuse the already populated model
-     */
-    private static boolean isDataTableModelReuse() {
-        return 
"true".equalsIgnoreCase(System.getenv(PROPERTY_NAME_MODEL_REUSE))
-                || 
"true".equalsIgnoreCase(System.getProperty(PROPERTY_NAME_MODEL_REUSE));
+        // don't detach the model, instead lazily re-fetch state of the 
contained elements
+        // at time of writing will otherwise break object deletion on JDO, see 
[CAUSEWAY-3530]
     }
 
 }

Reply via email to