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);
}