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]
}
}