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 2022/09/14 10:12:04 UTC

[isis] branch master updated (530f8b699e -> 57ed655e0f)

This is an automated email from the ASF dual-hosted git repository.

ahuber pushed a change to branch master
in repository https://gitbox.apache.org/repos/asf/isis.git


    from 530f8b699e ISIS-3209: introduces isis-core-privileged
     new e4b8b6adf9 ISIS-3208: just renaming package private classes and enums
     new 57ed655e0f ISIS-3208: transient entities, might need a tx-flush, so we get an OID

The 2 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.


Summary of changes:
 .../applib/services/repository/EntityState.java    | 18 +++++++--------
 .../isis/core/metamodel/object/ManagedObject.java  |  6 ++---
 .../isis/core/metamodel/object/MmEntityUtil.java   | 18 +++++++++++++++
 .../object/_ManagedObjectEntityHybrid.java         | 26 +++++++++++-----------
 ...hed.java => _ManagedObjectEntityTransient.java} |  4 ++--
 .../executor/MemberExecutorServiceDefault.java     |  6 +++++
 .../jpa/integration/entity/JpaEntityFacet.java     |  5 ++++-
 7 files changed, 55 insertions(+), 28 deletions(-)
 rename core/metamodel/src/main/java/org/apache/isis/core/metamodel/object/{_ManagedObjectEntityDetached.java => _ManagedObjectEntityTransient.java} (96%)


[isis] 02/02: ISIS-3208: transient entities, might need a tx-flush, so we get an OID

Posted by ah...@apache.org.
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

commit 57ed655e0fbef810b174bd069d28797489364f52
Author: Andi Huber <ah...@apache.org>
AuthorDate: Wed Sep 14 12:11:57 2022 +0200

    ISIS-3208: transient entities, might need a tx-flush, so we get an OID
---
 .../isis/core/metamodel/object/MmEntityUtil.java       | 18 ++++++++++++++++++
 .../executor/MemberExecutorServiceDefault.java         |  6 ++++++
 .../jpa/integration/entity/JpaEntityFacet.java         |  5 ++++-
 3 files changed, 28 insertions(+), 1 deletion(-)

diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/object/MmEntityUtil.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/object/MmEntityUtil.java
index c3cbcf2294..b4da60d7e2 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/object/MmEntityUtil.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/object/MmEntityUtil.java
@@ -82,6 +82,24 @@ public final class MmEntityUtil {
         }
     }
 
+    /**
+     * Handles transient entities that have no OID yet, but get one once the current transaction flushes.
+     * As a side-effect transitions a transient entity to a bookmarked one. For bookmarked entities,
+     * or any non-entity types acts as a no-op.
+     */
+    public static void ifHasNoOidThenFlush(final @Nullable ManagedObject entity) {
+        if(ManagedObjects.isNullOrUnspecifiedOrEmpty(entity)
+                || !entity.getSpecialization().isEntity()
+                || entity.isBookmarkMemoized()) {
+            return;
+        }
+        if(!hasOid(entity)) {
+            entity.getTransactionService().flushTransaction();
+            // force reassessment: as a side-effect transitions the transient entity to a bookmarked one
+            entity.getEntityState();
+        }
+    }
+
     /**
      * @param managedObject
      * @return managedObject
diff --git a/core/runtimeservices/src/main/java/org/apache/isis/core/runtimeservices/executor/MemberExecutorServiceDefault.java b/core/runtimeservices/src/main/java/org/apache/isis/core/runtimeservices/executor/MemberExecutorServiceDefault.java
index 4d3606e525..2ea749f9e5 100644
--- a/core/runtimeservices/src/main/java/org/apache/isis/core/runtimeservices/executor/MemberExecutorServiceDefault.java
+++ b/core/runtimeservices/src/main/java/org/apache/isis/core/runtimeservices/executor/MemberExecutorServiceDefault.java
@@ -56,6 +56,7 @@ import org.apache.isis.core.metamodel.facets.properties.property.modify.Property
 import org.apache.isis.core.metamodel.interactions.InteractionHead;
 import org.apache.isis.core.metamodel.object.ManagedObject;
 import org.apache.isis.core.metamodel.object.ManagedObjects;
+import org.apache.isis.core.metamodel.object.MmEntityUtil;
 import org.apache.isis.core.metamodel.object.MmUnwrapUtil;
 import org.apache.isis.core.metamodel.object.MmVisibilityUtil;
 import org.apache.isis.core.metamodel.object.PackedManagedObject;
@@ -166,6 +167,11 @@ implements MemberExecutorService {
         // assert has bookmark, unless non-scalar
         ManagedObjects.asScalarNonEmpty(returnedAdapter)
         .filter(scalarNonEmpty->!scalarNonEmpty.getSpecialization().isOther()) // don't care
+        // if its a transient entity, flush the current transaction, so we get an OID
+        .filter(scalarNonEmpty->{
+            MmEntityUtil.ifHasNoOidThenFlush(scalarNonEmpty);
+            return true;
+        })
         .ifPresent(scalarNonEmpty->{
             _Assert.assertTrue(scalarNonEmpty.getBookmark().isPresent(), ()->String.format(
                     "bookmark required for non-empty scalars %s", scalarNonEmpty.getSpecification()));
diff --git a/persistence/jpa/integration/src/main/java/org/apache/isis/persistence/jpa/integration/entity/JpaEntityFacet.java b/persistence/jpa/integration/src/main/java/org/apache/isis/persistence/jpa/integration/entity/JpaEntityFacet.java
index 6b4d3b6593..3767849c6d 100644
--- a/persistence/jpa/integration/src/main/java/org/apache/isis/persistence/jpa/integration/entity/JpaEntityFacet.java
+++ b/persistence/jpa/integration/src/main/java/org/apache/isis/persistence/jpa/integration/entity/JpaEntityFacet.java
@@ -253,13 +253,16 @@ public class JpaEntityFacet
         }
 
         val entityManager = getEntityManager();
+        val primaryKey = getPersistenceUnitUtil(entityManager).getIdentifier(pojo);
 
         if (entityManager.contains(pojo)) {
+            if (primaryKey == null) {
+                return EntityState.PERSISTABLE_ATTACHED_NO_OID;
+            }
             return EntityState.PERSISTABLE_ATTACHED;
         }
 
         try {
-            val primaryKey = getPersistenceUnitUtil(entityManager).getIdentifier(pojo);
             if (primaryKey == null) {
                 return EntityState.PERSISTABLE_DETACHED;
             } else {


[isis] 01/02: ISIS-3208: just renaming package private classes and enums

Posted by ah...@apache.org.
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

commit e4b8b6adf9874d8fd5ba7a3131cbe91719db4961
Author: Andi Huber <ah...@apache.org>
AuthorDate: Wed Sep 14 09:27:28 2022 +0200

    ISIS-3208: just renaming package private classes and enums
---
 .../applib/services/repository/EntityState.java    | 18 +++++++--------
 .../isis/core/metamodel/object/ManagedObject.java  |  6 ++---
 .../object/_ManagedObjectEntityHybrid.java         | 26 +++++++++++-----------
 ...hed.java => _ManagedObjectEntityTransient.java} |  4 ++--
 4 files changed, 27 insertions(+), 27 deletions(-)

diff --git a/api/applib/src/main/java/org/apache/isis/applib/services/repository/EntityState.java b/api/applib/src/main/java/org/apache/isis/applib/services/repository/EntityState.java
index f11740e106..049649ae6d 100644
--- a/api/applib/src/main/java/org/apache/isis/applib/services/repository/EntityState.java
+++ b/api/applib/src/main/java/org/apache/isis/applib/services/repository/EntityState.java
@@ -50,7 +50,7 @@ public enum EntityState {
      */
     PERSISTABLE_REMOVED,
     /**
-     * DN/JDO specific on pre-store. Is attached, has no OID yet.
+     * Is attached, has no OID yet. On pre-store.
      */
     PERSISTABLE_ATTACHED_NO_OID,
     /**
@@ -86,6 +86,13 @@ public enum EntityState {
 
     // -- SPECIAL STATES
 
+    /**
+     * @apiNote Is attached, has no OID yet. (On pre-store.)
+     */
+    public boolean isAttachedNoOid() {
+        return this == PERSISTABLE_ATTACHED_NO_OID;
+    }
+
     public boolean isDetachedCannotReattach() {
         return (isDetached()
                 || isRemoved())
@@ -102,14 +109,7 @@ public enum EntityState {
                 || isRemoved();
     }
 
-    // -- JDO/JPA SPECIFIC STATES
-
-    /**
-     * @apiNote DN/JDO specific on pre-store. Is attached, has no OID yet.
-     */
-    public boolean isSpecicalJdoAttachedNoOid() {
-        return this == PERSISTABLE_ATTACHED_NO_OID;
-    }
+    // -- JPA SPECIFIC STATES
 
     /**
      * @apiNote JPA specific. Is detached, but has an OID.
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/object/ManagedObject.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/object/ManagedObject.java
index 2f1bff161f..898dfb013d 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/object/ManagedObject.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/object/ManagedObject.java
@@ -458,7 +458,7 @@ extends
                 .or(()->spec.entityFacetElseFail().bookmarkFor(pojo));
         return bookmarkIfAny
             .map(bookmark->entityHypridBookmarked(spec, pojo, bookmarkIfAny))
-            .orElseGet(()->entityHybirdDetached(spec, pojo));
+            .orElseGet(()->entityHybirdTransient(spec, pojo));
     }
     // bookmarked hybrid in its final state (cannot transition)
     private static ManagedObject entityHypridBookmarked(
@@ -469,12 +469,12 @@ extends
                         new _ManagedObjectEntityBookmarked(spec, pojo, bookmarkIfKnown));
     }
     // initially detached hybrid that can transition to bookmarked anytime on reassessment
-    private static ManagedObject entityHybirdDetached(
+    private static ManagedObject entityHybirdTransient(
             final @NonNull ObjectSpecification spec,
             final @Nullable Object pojo) {
         return pojo != null
                 ? new _ManagedObjectEntityHybrid(
-                        new _ManagedObjectEntityDetached(spec, pojo))
+                        new _ManagedObjectEntityTransient(spec, pojo))
                 : empty(spec);
     }
     /**
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/object/_ManagedObjectEntityHybrid.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/object/_ManagedObjectEntityHybrid.java
index 0742fcb4da..4cbf83b4bd 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/object/_ManagedObjectEntityHybrid.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/object/_ManagedObjectEntityHybrid.java
@@ -44,40 +44,40 @@ implements _Refetchable {
      * dynamically mutates from one to the other based on pojo's persistent state;
      * however, the pojo reference must be kept identical
      */
-    private @NonNull Either<_ManagedObjectEntityDetached, _ManagedObjectEntityBookmarked>
+    private @NonNull Either<_ManagedObjectEntityTransient, _ManagedObjectEntityBookmarked>
         eitherDetachedOrBookmarked;
 
     private enum MorphState {
         /** Has no bookmark yet; can be transitioned to BOOKMARKED once
          *  for accompanied pojo, an OID becomes available. */
-        DETACHED,
+        TRANSIENT,
         /** Final state, once we have an OID,
          * regardless of the accompanied pojo's persistent state. */
         BOOKMARKED;
-        public boolean isDetached() { return this == DETACHED; }
+        public boolean isTransient() { return this == TRANSIENT; }
 //        public boolean isBookmarked() { return this == BOOKMARKED; }
         static MorphState valueOf(final EntityState entityState) {
             return entityState.hasOid()
                     ? BOOKMARKED
-                    : DETACHED;
+                    : TRANSIENT;
         }
     }
 
     private MorphState morphState;
 
     _ManagedObjectEntityHybrid(
-            final @NonNull _ManagedObjectEntityDetached detached) {
-        super(ManagedObject.Specialization.ENTITY, detached.getSpecification());
-        this.eitherDetachedOrBookmarked = Either.left(detached);
-        this.morphState = MorphState.DETACHED;
+            final @NonNull _ManagedObjectEntityTransient _transient) {
+        super(ManagedObject.Specialization.ENTITY, _transient.getSpecification());
+        this.eitherDetachedOrBookmarked = Either.left(_transient);
+        this.morphState = MorphState.TRANSIENT;
     }
 
     _ManagedObjectEntityHybrid(
-            final @NonNull _ManagedObjectEntityBookmarked attached) {
-        super(ManagedObject.Specialization.ENTITY, attached.getSpecification());
-        this.eitherDetachedOrBookmarked = Either.right(attached);
+            final @NonNull _ManagedObjectEntityBookmarked bookmarked) {
+        super(ManagedObject.Specialization.ENTITY, bookmarked.getSpecification());
+        this.eitherDetachedOrBookmarked = Either.right(bookmarked);
         this.morphState = MorphState.BOOKMARKED;
-        _Assert.assertTrue(attached.getBookmark().isPresent(),
+        _Assert.assertTrue(bookmarked.getBookmark().isPresent(),
                 ()->"bookmarked entity must have bookmark");
     }
 
@@ -137,7 +137,7 @@ implements _Refetchable {
     // -- HELPER
 
     private void triggerReassessment() {
-        if(morphState.isDetached()) {
+        if(morphState.isTransient()) {
             _Blackhole.consume(getEntityState());
         }
     }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/object/_ManagedObjectEntityDetached.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/object/_ManagedObjectEntityTransient.java
similarity index 96%
rename from core/metamodel/src/main/java/org/apache/isis/core/metamodel/object/_ManagedObjectEntityDetached.java
rename to core/metamodel/src/main/java/org/apache/isis/core/metamodel/object/_ManagedObjectEntityTransient.java
index 70e536aeda..f1880fae5b 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/object/_ManagedObjectEntityDetached.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/object/_ManagedObjectEntityTransient.java
@@ -32,14 +32,14 @@ import lombok.experimental.Accessors;
  * (package private) specialization corresponding to a detached {@link Specialization#ENTITY}
  * @see ManagedObject.Specialization#ENTITY
  */
-final class _ManagedObjectEntityDetached
+final class _ManagedObjectEntityTransient
 extends _ManagedObjectSpecified
 implements Bookmarkable.NoBookmark, _Refetchable {
 
     @Getter(onMethod_ = {@Override}) @Accessors(makeFinal = true)
     private final @NonNull Object pojo;
 
-    _ManagedObjectEntityDetached(
+    _ManagedObjectEntityTransient(
             final ObjectSpecification spec,
             final Object pojo) {
         super(ManagedObject.Specialization.ENTITY, spec);