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)