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/11/30 09:08:56 UTC
[isis] branch master updated: ISIS-2903: fixes JDO re-attach issues for choice providers
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 a605d74 ISIS-2903: fixes JDO re-attach issues for choice providers
a605d74 is described below
commit a605d74e5a96c9fd79689959dc6ee13c95219f02
Author: Andi Huber <ah...@apache.org>
AuthorDate: Tue Nov 30 10:08:45 2021 +0100
ISIS-2903: fixes JDO re-attach issues for choice providers
---
.../commons/internal/base/_Lazy_ThreadSafe.java | 5 ++--
.../identify/ObjectBookmarker_builtinHandlers.java | 28 ++++++++++++++++++++++
.../isis/core/metamodel/spec/ManagedObjects.java | 23 ------------------
3 files changed, 31 insertions(+), 25 deletions(-)
diff --git a/commons/src/main/java/org/apache/isis/commons/internal/base/_Lazy_ThreadSafe.java b/commons/src/main/java/org/apache/isis/commons/internal/base/_Lazy_ThreadSafe.java
index f30df69..e84b716 100644
--- a/commons/src/main/java/org/apache/isis/commons/internal/base/_Lazy_ThreadSafe.java
+++ b/commons/src/main/java/org/apache/isis/commons/internal/base/_Lazy_ThreadSafe.java
@@ -43,8 +43,9 @@ final class _Lazy_ThreadSafe<T> implements _Lazy<T> {
@Override @Synchronized
public boolean isMemoized() {
- guardAgainstRecursiveCall();
- return memoized;
+ return getting
+ ? false // while getting always false
+ : memoized;
}
@Override @Synchronized
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/objectmanager/identify/ObjectBookmarker_builtinHandlers.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/objectmanager/identify/ObjectBookmarker_builtinHandlers.java
index b32c9cb..237bafa 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/objectmanager/identify/ObjectBookmarker_builtinHandlers.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/objectmanager/identify/ObjectBookmarker_builtinHandlers.java
@@ -26,17 +26,21 @@ import java.util.UUID;
import org.apache.isis.applib.services.bookmark.Bookmark;
import org.apache.isis.applib.services.bookmark.Oid;
import org.apache.isis.applib.value.semantics.EncoderDecoder;
+import org.apache.isis.commons.internal.assertions._Assert;
import org.apache.isis.commons.internal.base._Bytes;
import org.apache.isis.commons.internal.base._Strings;
import org.apache.isis.commons.internal.exceptions._Exceptions;
import org.apache.isis.core.metamodel.facets.object.entity.EntityFacet;
+import org.apache.isis.core.metamodel.facets.object.entity.PersistenceStandard;
import org.apache.isis.core.metamodel.facets.object.value.ValueFacet;
import org.apache.isis.core.metamodel.facets.object.viewmodel.ViewModelFacet;
import org.apache.isis.core.metamodel.objectmanager.identify.ObjectBookmarker.Handler;
import org.apache.isis.core.metamodel.spec.ManagedObject;
+import org.apache.isis.core.metamodel.spec.ManagedObjects.EntityUtil;
import lombok.SneakyThrows;
import lombok.val;
+import lombok.extern.log4j.Log4j2;
class ObjectBookmarker_builtinHandlers {
@@ -75,6 +79,7 @@ class ObjectBookmarker_builtinHandlers {
}
+ @Log4j2
static class BookmarkForEntities implements Handler {
@Override
@@ -95,6 +100,29 @@ class ObjectBookmarker_builtinHandlers {
val msg = String.format("entity '%s' has no EntityFacet associated", managedObject);
throw _Exceptions.unrecoverable(msg);
}
+
+ // special code path (on JDO), when detached entity with its OID not previously memoized
+ if(!managedObject.isBookmarkMemoized()
+ && EntityUtil.getPersistenceStandard(managedObject)
+ .map(PersistenceStandard::isJdo)
+ .orElse(false)
+ && !entityFacet.getEntityState(managedObject.getPojo()).isAttached()) {
+
+ // re-attach
+ entityFacet.persist(spec, managedObject.getPojo());
+
+ // fail early, if re-attach failed
+ _Assert.assertTrue(
+ entityFacet.getEntityState(managedObject.getPojo()).isAttached(),
+ ()->{
+ val msg = String.format("failed to re-attach (persist) JDO entity %s, "
+ + "while creating a Bookmark",
+ spec.getLogicalTypeName());
+ log.error(msg); // in case exception gets swallowed
+ return msg;
+ });
+ }
+
val identifier = entityFacet.identifierFor(spec, pojo);
return Bookmark.forLogicalTypeAndIdentifier(spec.getLogicalType(), identifier);
}
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 e30f532..0e1346c 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
@@ -337,7 +337,6 @@ public final class ManagedObjects {
return _NullSafe.streamAutodetect(collectionOrArray)
.map(pojo->ManagedObject.of(elementSpec, pojo)) // pojo is nullable here
-//TODO cannot reattach if id is not memoized
.map(ManagedObjects.EntityUtil::reattach)
.filter(ManagedObjects.VisibilityUtil.filterOn(interactionInitiatedBy))
.collect(Can.toCan());
@@ -626,28 +625,6 @@ public final class ManagedObjects {
}
val spec = managedObject.getSpecification();
-
- // identification (on JDO) fails, when detached object, where oid was not previously memoized
- if(EntityUtil.getPersistenceStandard(managedObject)
- .map(PersistenceStandard::isJdo)
- .orElse(false)
- && !managedObject.isBookmarkMemoized()) {
- val msg = String.format("entity %s is required to have a memoized ID, "
- + "otherwise cannot re-attach",
- spec.getLogicalTypeName());
- log.error(msg); // in case exception gets swallowed
- //throw _Exceptions.illegalState(msg);
-
- val entityFacet = spec.getFacet(EntityFacet.class);
-
- entityFacet.persist(spec, managedObject.getPojo());
-
- _Assert.assertTrue(
- entityFacet.getEntityState(managedObject.getPojo()).isAttached());
- managedObject.getBookmark();
- return managedObject;
- }
-
val objectManager = managedObject.getObjectManager();
return bookmark(managedObject)