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/02/16 15:36:11 UTC

[isis] branch master updated: ISIS-2532: fixes entity re-attach logic for JPA

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 d56f75a  ISIS-2532: fixes entity re-attach logic for JPA
d56f75a is described below

commit d56f75a0ea51bc28620dce1422e0d11bf9652dcb
Author: Andi Huber <ah...@apache.org>
AuthorDate: Tue Feb 16 16:35:55 2021 +0100

    ISIS-2532: fixes entity re-attach logic for JPA
    
    by removing a guard that is only relevant for JDO
---
 .../facets/object/entity/EntityFacet.java          |  2 ++
 .../facets/object/entity/PersistenceStandard.java  | 34 ++++++++++++++++++++++
 .../isis/core/metamodel/spec/ManagedObjects.java   | 32 ++++++++++++++++++--
 .../metamodel/facets/entity/JdoEntityFacet.java    |  6 ++++
 .../metamodel/JpaEntityFacetFactory.java           |  6 ++++
 .../wicket/ui/panels/PromptFormAbstract.java       |  3 +-
 6 files changed, 79 insertions(+), 4 deletions(-)

diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/entity/EntityFacet.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/entity/EntityFacet.java
index 28b7f6e..8af30e9 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/entity/EntityFacet.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/entity/EntityFacet.java
@@ -55,4 +55,6 @@ public interface EntityFacet extends Facet {
 
     <T> T detach(T pojo);
     
+    PersistenceStandard getPersistenceStandard();
+    
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/entity/PersistenceStandard.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/entity/PersistenceStandard.java
new file mode 100644
index 0000000..13cf6ff
--- /dev/null
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/entity/PersistenceStandard.java
@@ -0,0 +1,34 @@
+/*
+ *  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.isis.core.metamodel.facets.object.entity;
+
+public enum PersistenceStandard {
+    JPA,
+    JDO,
+    OTHER,
+    ;
+    
+    public boolean isJpa() {
+        return this == JPA;
+    }
+    
+    public boolean isJdo() {
+        return this == JDO;
+    }
+}
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 04e3097..fa37065 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
@@ -52,6 +52,7 @@ import org.apache.isis.core.metamodel.commons.MethodUtil;
 import org.apache.isis.core.metamodel.consent.InteractionInitiatedBy;
 import org.apache.isis.core.metamodel.facets.collections.CollectionFacet;
 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.viewmodel.ViewModelFacet;
 import org.apache.isis.core.metamodel.interactions.InteractionUtils;
 import org.apache.isis.core.metamodel.interactions.ObjectVisibilityContext;
@@ -63,6 +64,7 @@ import lombok.NonNull;
 import lombok.SneakyThrows;
 import lombok.val;
 import lombok.experimental.UtilityClass;
+import lombok.extern.log4j.Log4j2;
 
 /**
  * A collection of utilities for {@link ManagedObject}. 
@@ -70,6 +72,7 @@ import lombok.experimental.UtilityClass;
  *
  */
 @UtilityClass
+@Log4j2
 public final class ManagedObjects {
     
     // -- CATEGORISATION
@@ -389,6 +392,24 @@ public final class ManagedObjects {
     public static final class EntityUtil {
         
         @NonNull
+        public static Optional<PersistenceStandard> getPersistenceStandard(@Nullable ManagedObject adapter) {
+            if(adapter==null) {
+                return Optional.empty();
+            }
+            val spec = adapter.getSpecification();
+            if(spec==null || !spec.isEntity()) {
+                return Optional.empty();
+            }
+
+            val entityFacet = spec.getFacet(EntityFacet.class);
+            if(entityFacet==null) {
+                return Optional.empty();
+            }
+            
+            return Optional.of(entityFacet.getPersistenceStandard());
+        }
+        
+        @NonNull
         public static EntityState getEntityState(@Nullable ManagedObject adapter) {
             if(adapter==null) {
                 return EntityState.NOT_PERSISTABLE;
@@ -466,11 +487,16 @@ public final class ManagedObjects {
                 return managedObject;
             }
             
-            // identification fails, on detached object, if rootOid was not previously memoized
-            if(!managedObject.isRootOidMemoized()) {
-                throw _Exceptions.illegalState("entity %s is required to have a memoized ID, "
+            // identification (on JDO) fails, when detached object, where rootOid was not previously memoized
+            if(EntityUtil.getPersistenceStandard(managedObject)
+                        .map(PersistenceStandard::isJdo)
+                        .orElse(false)
+                    && !managedObject.isRootOidMemoized()) {
+                val msg = String.format("entity %s is required to have a memoized ID, "
                         + "otherwise cannot re-attach", 
                         managedObject.getSpecification().getSpecId());
+                log.error(msg); // in case exception gets swallowed
+                throw _Exceptions.illegalState(msg);
             }
             
             val objectIdentifier = identify(managedObject)
diff --git a/persistence/jdo/datanucleus/src/main/java/org/apache/isis/persistence/jdo/datanucleus/metamodel/facets/entity/JdoEntityFacet.java b/persistence/jdo/datanucleus/src/main/java/org/apache/isis/persistence/jdo/datanucleus/metamodel/facets/entity/JdoEntityFacet.java
index fb64837..a8a757a 100644
--- a/persistence/jdo/datanucleus/src/main/java/org/apache/isis/persistence/jdo/datanucleus/metamodel/facets/entity/JdoEntityFacet.java
+++ b/persistence/jdo/datanucleus/src/main/java/org/apache/isis/persistence/jdo/datanucleus/metamodel/facets/entity/JdoEntityFacet.java
@@ -48,6 +48,7 @@ import org.apache.isis.core.metamodel.adapter.oid.Oid;
 import org.apache.isis.core.metamodel.facetapi.FacetAbstract;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
 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.objectmanager.ObjectManager;
 import org.apache.isis.core.metamodel.spec.ManagedObject;
 import org.apache.isis.core.metamodel.spec.ObjectSpecification;
@@ -76,6 +77,11 @@ implements EntityFacet {
         super(EntityFacet.class, holder, Derivation.NOT_DERIVED);
         super.setFacetAliasType(EntityFacet.class);
     }
+    
+    @Override
+    public PersistenceStandard getPersistenceStandard() {
+        return PersistenceStandard.JDO;
+    }
 
     @Override
     public String identifierFor(ObjectSpecification spec, Object pojo) {
diff --git a/persistence/jpa/integration/src/main/java/org/apache/isis/persistence/jpa/integration/metamodel/JpaEntityFacetFactory.java b/persistence/jpa/integration/src/main/java/org/apache/isis/persistence/jpa/integration/metamodel/JpaEntityFacetFactory.java
index 10d6f2a..c0ba41b 100644
--- a/persistence/jpa/integration/src/main/java/org/apache/isis/persistence/jpa/integration/metamodel/JpaEntityFacetFactory.java
+++ b/persistence/jpa/integration/src/main/java/org/apache/isis/persistence/jpa/integration/metamodel/JpaEntityFacetFactory.java
@@ -48,6 +48,7 @@ import org.apache.isis.core.metamodel.facetapi.FacetHolder;
 import org.apache.isis.core.metamodel.facetapi.FeatureType;
 import org.apache.isis.core.metamodel.facets.FacetFactoryAbstract;
 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.spec.ManagedObject;
 import org.apache.isis.core.metamodel.spec.ObjectSpecification;
 
@@ -104,6 +105,11 @@ public class JpaEntityFacetFactory extends FacetFactoryAbstract {
         @Override public boolean alwaysReplace() { return true;}
         
         // -- ENTITY FACET 
+        
+        @Override
+        public PersistenceStandard getPersistenceStandard() {
+            return PersistenceStandard.JPA;
+        }
 
         @Override
         public String identifierFor(ObjectSpecification spec, Object pojo) {
diff --git a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/panels/PromptFormAbstract.java b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/panels/PromptFormAbstract.java
index 41805fa..3859ea2 100644
--- a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/panels/PromptFormAbstract.java
+++ b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/panels/PromptFormAbstract.java
@@ -122,7 +122,8 @@ implements ScalarModelSubscriber {
             public void onSubmit(AjaxRequestTarget target) {
                 
                 _Probe.entryPoint(EntryPoint.USER_INTERACTION, "Wicket Ajax Request, "
-                        + "originating from User clicking OK on an inline editing form.");
+                        + "originating from User clicking OK on an inline editing form or"
+                        + "action prompt.");
                 
                 onOkSubmittedOf(target, getForm(), this);
             }