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/05/28 16:41:14 UTC

[isis] branch master updated: ISIS-2706: be indifferent on whether detached or removed (if possible)

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 e19286f  ISIS-2706: be indifferent on whether detached or removed (if possible)
e19286f is described below

commit e19286f46ca72fbbba391f641de52f3c76aa981d
Author: Andi Huber <ah...@apache.org>
AuthorDate: Fri May 28 18:41:00 2021 +0200

    ISIS-2706: be indifferent on whether detached or removed (if possible)
---
 .../applib/services/repository/EntityState.java    | 19 +++++-
 .../services/repository/RepositoryService.java     | 69 +++++++++++-----------
 .../services/title/TitleServiceDefault.java        |  4 +-
 .../isis/core/metamodel/spec/ManagedObjects.java   | 11 ++--
 .../repository/RepositoryServiceDefault.java       |  4 +-
 .../changetracking/_PropertyChangeRecord.java      |  2 +-
 .../entities/DnEntityStateProvider.java            |  2 +-
 .../applib/fixturescripts/FixtureScripts.java      | 11 ++--
 .../wicket/ui/panels/FormExecutorDefault.java      |  6 +-
 9 files changed, 73 insertions(+), 55 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 8beccd0..03a23de 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
@@ -48,7 +48,7 @@ public enum EntityState {
      * Object with this state is an entity that has been removed from the
      * database. Objects in this state may no longer be interacted with.
      */
-    PERSISTABLE_DESTROYED,
+    PERSISTABLE_REMOVED,
     ;
 
     /**
@@ -76,9 +76,22 @@ public enum EntityState {
     /**
      * Object with this state is an entity that has been removed from the
      * database.  Objects in this state may no longer be interacted with.
+     * <p>
+     * Only supported by JDO. Will always return false with JPA.
      */
-    public boolean isDestroyed() {
-        return this == PERSISTABLE_DESTROYED;
+    public boolean isRemoved() {
+        return this == PERSISTABLE_REMOVED;
     }
 
+    public boolean isDetachedOrRemoved() {
+        return this == PERSISTABLE_REMOVED
+                || this == PERSISTABLE_DETACHED;
+    }
+
+    public boolean isAttachedOrRemoved() {
+        return this == PERSISTABLE_REMOVED
+                || this == PERSISTABLE_REMOVED;
+    }
+
+
 }
diff --git a/api/applib/src/main/java/org/apache/isis/applib/services/repository/RepositoryService.java b/api/applib/src/main/java/org/apache/isis/applib/services/repository/RepositoryService.java
index e5fdc0f..58bc801 100644
--- a/api/applib/src/main/java/org/apache/isis/applib/services/repository/RepositoryService.java
+++ b/api/applib/src/main/java/org/apache/isis/applib/services/repository/RepositoryService.java
@@ -30,7 +30,6 @@ import org.apache.isis.applib.query.QueryRange;
 
 import lombok.NonNull;
 import lombok.SneakyThrows;
-import lombok.val;
 
 /**
  * Collects together methods for creating, persisting and searching for
@@ -416,40 +415,40 @@ public interface RepositoryService {
         return detachedEntity(ofType);
     }
 
-    /**
-     * Determines if the specified object is persistent (that it is stored
-     * permanently outside of the virtual machine
-     * in the object store).
-     *
-     * <p>
-     *     This method can also return <code>true</code> if the object has been
-     *     {@link #isDeleted(Object) deleted} from the object store.
-     * </p>
-     *
-     * @deprecated due to ambiguous semantic, use
-     *             {@link #getEntityState(Object)} instead
-     *
-     * @see #getEntityState(Object)
-     */
-    @Deprecated
-    default boolean isPersistent(Object domainObject) {
-        val entityState = getEntityState(domainObject);
-        return entityState.isAttached() || entityState.isDestroyed();
-    }
-
-    /**
-     * Determines if the specified object has been deleted from the object store.
-     *
-     * @deprecated due to ambiguous semantic, use
-     *             {@link #getEntityState(Object)} instead
-     *
-     * @see #getEntityState(Object)
-     */
-    @Deprecated
-    default boolean isDeleted(Object domainObject) {
-        val entityState = getEntityState(domainObject);
-        return entityState.isDestroyed();
-    }
+//    /**
+//     * Determines if the specified object is persistent (that it is stored
+//     * permanently outside of the virtual machine
+//     * in the object store).
+//     *
+//     * <p>
+//     *     This method can also return <code>true</code> if the object has been
+//     *     {@link #isDeleted(Object) deleted} from the object store.
+//     * </p>
+//     *
+//     * @deprecated due to ambiguous semantic, use
+//     *             {@link #getEntityState(Object)} instead
+//     *
+//     * @see #getEntityState(Object)
+//     */
+//    @Deprecated
+//    default boolean isPersistent(Object domainObject) {
+//        val entityState = getEntityState(domainObject);
+//        return entityState.isAttached() || entityState.isDestroyed();
+//    }
+//
+//    /**
+//     * Determines if the specified object has been deleted from the object store.
+//     *
+//     * @deprecated due to ambiguous semantic, use
+//     *             {@link #getEntityState(Object)} instead
+//     *
+//     * @see #getEntityState(Object)
+//     */
+//    @Deprecated
+//    default boolean isDeleted(Object domainObject) {
+//        val entityState = getEntityState(domainObject);
+//        return entityState.isDestroyed();
+//    }
 
 
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/title/TitleServiceDefault.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/title/TitleServiceDefault.java
index 7e38207..900f7fc 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/title/TitleServiceDefault.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/title/TitleServiceDefault.java
@@ -63,8 +63,8 @@ public class TitleServiceDefault implements TitleService {
             return "[UNSPECIFIED]";
         }
 
-        if(EntityUtil.isDestroyed(objectAdapter)) {
-            return "[DELETED]";
+        if(EntityUtil.isDetachedOrRemoved(objectAdapter)) {
+            return "[DETACHED]";
         } else {
             return objectAdapter.getSpecification().getTitle(null, objectAdapter);
         }
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 de9dbc2..a37d618 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
@@ -525,12 +525,13 @@ public final class ManagedObjects {
             return EntityUtil.getEntityState(adapter).isAttached();
         }
 
-        public static boolean isDetached(@Nullable ManagedObject adapter) {
-            return EntityUtil.getEntityState(adapter).isDetached();
+        public static boolean isDetachedOrRemoved(@Nullable ManagedObject adapter) {
+            return EntityUtil.getEntityState(adapter).isDetachedOrRemoved();
         }
 
-        public static boolean isDestroyed(@Nullable ManagedObject adapter) {
-            return EntityUtil.getEntityState(adapter).isDestroyed();
+        /** only supported by JDO - always false with JPA */
+        public static boolean isRemoved(@Nullable ManagedObject adapter) {
+            return EntityUtil.getEntityState(adapter).isRemoved();
         }
 
     }
@@ -602,7 +603,7 @@ public final class ManagedObjects {
             }
             val spec = adapter.getSpecification();
             if(spec.isEntity()) {
-                if(EntityUtil.isDestroyed(adapter)) {
+                if(EntityUtil.isDetachedOrRemoved(adapter)) {
                     return false;
                 }
             }
diff --git a/core/runtimeservices/src/main/java/org/apache/isis/core/runtimeservices/repository/RepositoryServiceDefault.java b/core/runtimeservices/src/main/java/org/apache/isis/core/runtimeservices/repository/RepositoryServiceDefault.java
index 9fb583c..22a3dea 100644
--- a/core/runtimeservices/src/main/java/org/apache/isis/core/runtimeservices/repository/RepositoryServiceDefault.java
+++ b/core/runtimeservices/src/main/java/org/apache/isis/core/runtimeservices/repository/RepositoryServiceDefault.java
@@ -99,7 +99,9 @@ public class RepositoryServiceDefault implements RepositoryService {
             throw new PersistFailedException("Object not known to framework (unable to create/obtain an adapter)");
         }
         // only persist detached entities, otherwise skip
-        if(!EntityUtil.isDetached(adapter)) {
+        val entityState = EntityUtil.getEntityState(adapter);
+        if(!entityState.isPersistable()
+                || entityState.isAttached()) {
             return domainObject;
         }
         EntityUtil.persistInCurrentTransaction(adapter);
diff --git a/core/transaction/src/main/java/org/apache/isis/core/transaction/changetracking/_PropertyChangeRecord.java b/core/transaction/src/main/java/org/apache/isis/core/transaction/changetracking/_PropertyChangeRecord.java
index 9373ee6..ddc6921 100644
--- a/core/transaction/src/main/java/org/apache/isis/core/transaction/changetracking/_PropertyChangeRecord.java
+++ b/core/transaction/src/main/java/org/apache/isis/core/transaction/changetracking/_PropertyChangeRecord.java
@@ -73,7 +73,7 @@ final class _PropertyChangeRecord {
     }
 
     void updatePostValue() {
-        preAndPostValue = EntityUtil.isDestroyed(entity)
+        preAndPostValue = EntityUtil.isRemoved(entity)
                 // don't touch the object!!!
                 // JDO, for example, will complain otherwise...
                 ? preAndPostValue.withPost(IsisTransactionPlaceholder.DELETED)
diff --git a/persistence/jdo/datanucleus/src/main/java/org/apache/isis/persistence/jdo/datanucleus/entities/DnEntityStateProvider.java b/persistence/jdo/datanucleus/src/main/java/org/apache/isis/persistence/jdo/datanucleus/entities/DnEntityStateProvider.java
index ecce3de..2a78a7d 100644
--- a/persistence/jdo/datanucleus/src/main/java/org/apache/isis/persistence/jdo/datanucleus/entities/DnEntityStateProvider.java
+++ b/persistence/jdo/datanucleus/src/main/java/org/apache/isis/persistence/jdo/datanucleus/entities/DnEntityStateProvider.java
@@ -69,7 +69,7 @@ public class DnEntityStateProvider implements JdoFacetContext {
             val persistable = (Persistable) pojo;
             val isDeleted = persistable.dnIsDeleted();
             if(isDeleted) {
-                return EntityState.PERSISTABLE_DESTROYED;
+                return EntityState.PERSISTABLE_REMOVED;
             }
             val isPersistent = persistable.dnIsPersistent();
             if(isPersistent) {
diff --git a/testing/fixtures/applib/src/main/java/org/apache/isis/testing/fixtures/applib/fixturescripts/FixtureScripts.java b/testing/fixtures/applib/src/main/java/org/apache/isis/testing/fixtures/applib/fixturescripts/FixtureScripts.java
index 2fc65c2..b87a79c 100644
--- a/testing/fixtures/applib/src/main/java/org/apache/isis/testing/fixtures/applib/fixturescripts/FixtureScripts.java
+++ b/testing/fixtures/applib/src/main/java/org/apache/isis/testing/fixtures/applib/fixturescripts/FixtureScripts.java
@@ -79,8 +79,8 @@ public class FixtureScripts {
     //  @Inject private FactoryService factoryService;
     @Inject private TitleService titleService;
     @Inject private JaxbService jaxbService;
-    //  @Inject private BookmarkService bookmarkService;
-    @Inject private ServiceRegistry serviceRegistry;
+    // @Inject private BookmarkService bookmarkService;
+    // @Inject private ServiceRegistry serviceRegistry;
     @Inject private ServiceInjector serviceInjector;
     @Inject private RepositoryService repositoryService;
     @Inject private TransactionService transactionService;
@@ -205,7 +205,7 @@ public class FixtureScripts {
             final ServiceRegistry serviceRegistry) {
 
         this.specification = fixtureScriptsSpecificationProvider.orElse(() -> FixtureScriptsSpecification.builder(PACKAGE_PREFIX).build()).getSpecification();
-        this.serviceRegistry = serviceRegistry;
+        // this.serviceRegistry = serviceRegistry;
 
         val packagePrefix = specification.getPackagePrefix();
         fixtureScriptByFriendlyName =
@@ -466,7 +466,9 @@ public class FixtureScripts {
         if(object == null) {
             return null;
         }
-        if (object instanceof ViewModel || repositoryService.isPersistent(object)) {
+
+        if (object instanceof ViewModel
+                || repositoryService.getEntityState(object).isAttachedOrRemoved()) {
             // continue
         } else {
             switch(getNonPersistedObjectsStrategy()) {
@@ -513,6 +515,7 @@ public class FixtureScripts {
 
     }
 
+
     // -- DEPRECATIONS
 
     /**
diff --git a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/panels/FormExecutorDefault.java b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/panels/FormExecutorDefault.java
index d0c495a..2537eee 100644
--- a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/panels/FormExecutorDefault.java
+++ b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/panels/FormExecutorDefault.java
@@ -147,7 +147,7 @@ implements FormExecutor {
                     // should circuit the redirect check later on; there's no need to reset the adapter
                     // (this also provides a workaround for view models wrapping now-deleted entities)
                     targetAdapter = ManagedObject.empty(targetAdapter.getSpecification());
-                } else if(EntityUtil.isDestroyed(targetAdapter)) {
+                } else if(EntityUtil.isDetachedOrRemoved(targetAdapter)) {
                     // if this was an entity delete action
                     // then we don't re-fetch / re-create the targetAdapter
                     targetAdapter = ManagedObject.empty(targetAdapter.getSpecification());
@@ -175,7 +175,7 @@ implements FormExecutor {
                     targetEntityModel.setObject(resultAdapter);
                     targetAdapter = targetEntityModel.getManagedObject();
                 }
-                if(!EntityUtil.isDestroyed(targetAdapter)) {
+                if(!EntityUtil.isDetachedOrRemoved(targetAdapter)) {
                     targetEntityModel.resetPropertyModels();
                 }
 
@@ -284,7 +284,7 @@ implements FormExecutor {
             }
 
             private boolean isUnchanging(final IsisBlobOrClobPanelAbstract<?> object) {
-                final ScalarModel scalarModel = (ScalarModel) object.getModel();
+                final ScalarModel scalarModel = object.getModel();
                 final UnchangingFacet unchangingFacet = scalarModel.getFacet(UnchangingFacet.class);
                 return unchangingFacet != null && unchangingFacet.value();
             }