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 2020/06/05 08:22:11 UTC

[isis] branch master updated: ISIS-2340: ManagedObjects: move and gather entity utility methods (1)

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 6d2d860  ISIS-2340: ManagedObjects: move and gather entity utility methods (1)
6d2d860 is described below

commit 6d2d86061912a5c49f8aab9c2296fbb6ae4b1497
Author: Andi Huber <ah...@apache.org>
AuthorDate: Fri Jun 5 10:22:00 2020 +0200

    ISIS-2340: ManagedObjects: move and gather entity utility methods (1)
---
 .../isis/core/metamodel/spec/ManagedObject.java    | 200 +++++++++------------
 .../isis/core/metamodel/spec/ManagedObjects.java   |  29 ++-
 .../repository/RepositoryServiceDefault.java       |   7 +-
 .../persistence/PersistenceSession5.java           |   3 +-
 4 files changed, 118 insertions(+), 121 deletions(-)

diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/ManagedObject.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/ManagedObject.java
index d99b8b3..b50e149 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/ManagedObject.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/ManagedObject.java
@@ -33,6 +33,7 @@ import org.apache.isis.core.metamodel.facets.object.entity.EntityFacet;
 import org.apache.isis.core.metamodel.objectmanager.ObjectManager;
 import org.apache.isis.core.metamodel.objectmanager.create.ObjectCreator;
 import org.apache.isis.core.metamodel.objectmanager.load.ObjectLoader;
+import org.apache.isis.core.metamodel.spec.ManagedObjects.EntityUtil;
 import org.apache.isis.core.metamodel.specloader.SpecificationLoader;
 import org.apache.isis.core.metamodel.specloader.SpecificationLoaderDefault;
 
@@ -68,92 +69,6 @@ public interface ManagedObject {
      */
     Optional<RootOid> getRootOid();
     
-    // -- EMPTY
-    
-    /** has no ObjectSpecification and no value */
-    static ManagedObject unspecified() {
-        return ManagedObjectInternalUtil.UNSPECIFIED;
-    }
-    
-    /** has an ObjectSpecification, but no value */
-    static ManagedObject empty(@NonNull final ObjectSpecification spec) {
-        return ManagedObject.of(spec, null);
-    }
-    
-
-    // -- SIMPLE
-
-    @Value 
-    @RequiredArgsConstructor(staticName="of") 
-    @EqualsAndHashCode(of = "pojo")
-    @ToString(of = {"specification", "pojo"}) //ISIS-2317 make sure toString() is without side-effects
-    static final class SimpleManagedObject implements ManagedObject {
-        
-        public static ManagedObject identified(
-                @NonNull  final ObjectSpecification spec, 
-                @Nullable final Object pojo, 
-                @NonNull  final RootOid rootOid) {
-            val managedObject = SimpleManagedObject.of(spec, pojo);
-            managedObject.rootOidLazy.set(Optional.of(rootOid));
-            return managedObject;
-        }
-        
-        @NonNull private final ObjectSpecification specification;
-        @Nullable private final Object pojo;
-
-        public Optional<RootOid> getRootOid() {
-            return rootOidLazy.get();
-        }
-        
-        // -- LAZY ID HANDLING
-        private final _Lazy<Optional<RootOid>> rootOidLazy = 
-                _Lazy.threadSafe(()->ManagedObjectInternalUtil.identify(this));  
-
-        
-    }
-
-    // -- LAZY
-
-    @EqualsAndHashCode(of = "pojo")
-    static final class LazyManagedObject implements ManagedObject {
-
-        @NonNull private final Function<Class<?>, ObjectSpecification> specLoader;  
-
-        @Getter @NonNull private final Object pojo;
-        
-        @Getter(lazy=true, onMethod = @__(@Override)) 
-        private final Optional<RootOid> rootOid = ManagedObjectInternalUtil.identify(this);
-
-        private final _Lazy<ObjectSpecification> specification = _Lazy.threadSafe(this::loadSpec);
-
-        public LazyManagedObject(@NonNull Function<Class<?>, ObjectSpecification> specLoader, @NonNull Object pojo) {
-            this.specLoader = specLoader;
-            this.pojo = pojo;
-        }
-        
-        @Override
-        public ObjectSpecification getSpecification() {
-            return specification.get();
-        }
-
-        @Override //ISIS-2317 make sure toString() is without side-effects
-        public String toString() {
-            if(specification.isMemoized()) {
-                return String.format("ManagedObject[spec=%s, pojo=%s]",
-                        ""+getSpecification(),
-                        ""+getPojo());
-            }
-            return String.format("ManagedObject[spec=%s, pojo=%s]",
-                    "[lazy not loaded]",
-                    ""+getPojo());
-        }
-        
-        private ObjectSpecification loadSpec() {
-            return specLoader.apply(pojo.getClass());
-        }
-
-    }
-
     // -- TITLE
 
     public default String titleString() {
@@ -209,8 +124,6 @@ public interface ManagedObject {
         return new SimpleManagedObject(specification, pojo);
     }
     
-    
-    
     /**
      * Optimized for cases, when the pojo's specification and rootOid are already available.
      */
@@ -238,38 +151,101 @@ public interface ManagedObject {
 
         return new LazyManagedObject(specLoader, pojo);
     }
-
-    // -- DEPRECATIONS (REFACTORING)
-
-    static String _instanceId(ManagedObject adapter) {
-        val identifier = ManagedObjects.identifyElseFail(adapter).getIdentifier();
-        return identifier; 
+    
+    // -- EMPTY
+    
+    /** has no ObjectSpecification and no value (pojo) */
+    static ManagedObject unspecified() {
+        return ManagedObjectInternalUtil.UNSPECIFIED;
     }
     
-    static EntityState _entityState(ManagedObject adapter) {
-        if(adapter==null) {
-            return EntityState.NOT_PERSISTABLE;
+    /** has an ObjectSpecification, but no value (pojo) */
+    static ManagedObject empty(@NonNull final ObjectSpecification spec) {
+        return ManagedObject.of(spec, null);
+    }
+
+    // -- SIMPLE
+
+    @Value 
+    @RequiredArgsConstructor(staticName="of") 
+    @EqualsAndHashCode(of = "pojo")
+    @ToString(of = {"specification", "pojo"}) //ISIS-2317 make sure toString() is without side-effects
+    static final class SimpleManagedObject implements ManagedObject {
+        
+        public static ManagedObject identified(
+                @NonNull  final ObjectSpecification spec, 
+                @Nullable final Object pojo, 
+                @NonNull  final RootOid rootOid) {
+            val managedObject = SimpleManagedObject.of(spec, pojo);
+            managedObject.rootOidLazy.set(Optional.of(rootOid));
+            return managedObject;
         }
-        return _entityState(adapter.getSpecification(), adapter.getPojo());
+        
+        @NonNull private final ObjectSpecification specification;
+        @Nullable private final Object pojo;
+
+        public Optional<RootOid> getRootOid() {
+            return rootOidLazy.get();
+        }
+        
+        // -- LAZY ID HANDLING
+        private final _Lazy<Optional<RootOid>> rootOidLazy = 
+                _Lazy.threadSafe(()->ManagedObjectInternalUtil.identify(this));  
+
+        
     }
-    
-    static EntityState _entityState(ObjectSpecification spec, Object pojo) {
 
-        if(spec==null || pojo==null || !spec.isEntity()) {
-            return EntityState.NOT_PERSISTABLE;
+    // -- LAZY
+
+    @EqualsAndHashCode(of = "pojo")
+    static final class LazyManagedObject implements ManagedObject {
+
+        @NonNull private final Function<Class<?>, ObjectSpecification> specLoader;  
+
+        @Getter @NonNull private final Object pojo;
+        
+        @Getter(lazy=true, onMethod = @__(@Override)) 
+        private final Optional<RootOid> rootOid = ManagedObjectInternalUtil.identify(this);
+
+        private final _Lazy<ObjectSpecification> specification = _Lazy.threadSafe(this::loadSpec);
+
+        public LazyManagedObject(@NonNull Function<Class<?>, ObjectSpecification> specLoader, @NonNull Object pojo) {
+            this.specLoader = specLoader;
+            this.pojo = pojo;
+        }
+        
+        @Override
+        public ObjectSpecification getSpecification() {
+            return specification.get();
         }
 
-        val entityFacet = spec.getFacet(EntityFacet.class);
-        if(entityFacet==null) {
-            throw _Exceptions.unrecoverable("Entity types must have an EntityFacet");
+        @Override //ISIS-2317 make sure toString() is without side-effects
+        public String toString() {
+            if(specification.isMemoized()) {
+                return String.format("ManagedObject[spec=%s, pojo=%s]",
+                        ""+getSpecification(),
+                        ""+getPojo());
+            }
+            return String.format("ManagedObject[spec=%s, pojo=%s]",
+                    "[lazy not loaded]",
+                    ""+getPojo());
+        }
+        
+        private ObjectSpecification loadSpec() {
+            return specLoader.apply(pojo.getClass());
         }
 
-        return entityFacet.getEntityState(pojo);
     }
-    
 
+    // -- DEPRECATIONS (REFACTORING)
+
+    static String _instanceId(ManagedObject adapter) {
+        val identifier = ManagedObjects.identifyElseFail(adapter).getIdentifier();
+        return identifier; 
+    }
+    
     static boolean _isDestroyed(ManagedObject adapter) {
-        return _entityState(adapter) == EntityState.PERSISTABLE_DESTROYED;
+        return EntityUtil.getEntityState(adapter) == EntityState.PERSISTABLE_DESTROYED;
     }
 
     static void _whenFirstIsBookmarkable_ensureSecondIsAsWell(
@@ -284,7 +260,7 @@ public interface ManagedObject {
                 return;
             }
 
-            val entityState = _entityState(second);
+            val entityState = EntityUtil.getEntityState(second);
             if(entityState != EntityState.PERSISTABLE_ATTACHED) {
                 throw _Exceptions.illegalArgument(
                         "can't set a reference to a transient object [%s] from a persistent one [%s]",
@@ -375,11 +351,5 @@ public interface ManagedObject {
         return adapter.getSpecification().getBeanSort().isCollection();
     }
 
-    
-
-
-
-
-
 
 }
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 c958ca7..337f884 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
@@ -49,6 +49,7 @@ import org.apache.isis.core.metamodel.commons.MethodExtensions;
 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.viewmodel.ViewModelFacet;
 import org.apache.isis.core.metamodel.interactions.InteractionUtils;
 import org.apache.isis.core.metamodel.interactions.ObjectVisibilityContext;
@@ -230,13 +231,37 @@ public final class ManagedObjects {
 
     // -- ENTITY UTILITIES
     
+    @UtilityClass
+    public static final class EntityUtil {
+        
+        public static EntityState getEntityState(@Nullable ManagedObject adapter) {
+            if(adapter==null) {
+                return EntityState.NOT_PERSISTABLE;
+            }
+            val spec = adapter.getSpecification();
+            val pojo = adapter.getPojo();
+            
+            if(spec==null || pojo==null || !spec.isEntity()) {
+                return EntityState.NOT_PERSISTABLE;
+            }
+
+            val entityFacet = spec.getFacet(EntityFacet.class);
+            if(entityFacet==null) {
+                throw _Exceptions.unrecoverable("Entity types must have an EntityFacet");
+            }
+
+            return entityFacet.getEntityState(pojo);
+        }
+        
+    }
+    
     /**
      * @param managedObject
      * @return managedObject
      * @throws AssertionError if managedObject is a detached entity  
      */
     public static ManagedObject requiresAttached(@NonNull ManagedObject managedObject) {
-        val entityState = ManagedObject._entityState(managedObject);
+        val entityState = EntityUtil.getEntityState(managedObject);
         if(entityState.isPersistable()) {
             // ensure we have an attached entity
             _Assert.assertEquals(
@@ -253,7 +278,7 @@ public final class ManagedObjects {
         if(isNullOrUnspecifiedOrEmpty(managedObject)) {
             return managedObject;
         }
-        val entityState = ManagedObject._entityState(managedObject);
+        val entityState = EntityUtil.getEntityState(managedObject);
         if(!entityState.isPersistable()) {
             return managedObject;
         }
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 6914b60..975781e 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
@@ -51,6 +51,7 @@ import org.apache.isis.core.config.IsisConfiguration;
 import org.apache.isis.core.metamodel.objectmanager.ObjectManager;
 import org.apache.isis.core.metamodel.objectmanager.query.ObjectBulkLoader;
 import org.apache.isis.core.metamodel.spec.ManagedObject;
+import org.apache.isis.core.metamodel.spec.ManagedObjects.EntityUtil;
 import org.apache.isis.core.metamodel.spec.ManagedObjects.UnwrapUtil;
 
 import lombok.val;
@@ -80,7 +81,7 @@ public class RepositoryServiceDefault implements RepositoryService {
     @Override
     public EntityState getEntityState(@Nullable final Object object) {
         val adapter = objectManager.adapt(unwrapped(object));
-        val entityState = ManagedObject._entityState(adapter);
+        val entityState = EntityUtil.getEntityState(adapter);
         return entityState;
     }
     
@@ -96,7 +97,7 @@ public class RepositoryServiceDefault implements RepositoryService {
         if(adapter == null) {
             throw new PersistFailedException("Object not known to framework (unable to create/obtain an adapter)");
         }
-        val entityState = ManagedObject._entityState(adapter);
+        val entityState = EntityUtil.getEntityState(adapter);
         val skip = !entityState.isDetached(); // only persist detached entities, otherwise skip
         if(skip) {
             return domainObject;
@@ -119,7 +120,7 @@ public class RepositoryServiceDefault implements RepositoryService {
             return; // noop
         }
         val adapter = objectManager.adapt(unwrapped(domainObject));
-        val entityState = ManagedObject._entityState(adapter);
+        val entityState = EntityUtil.getEntityState(adapter);
         if(entityState.isAttached()) {
             ManagedObject._destroyObjectInTransaction(adapter);   
         }
diff --git a/persistence/jdo/datanucleus-5/src/main/java/org/apache/isis/persistence/jdo/datanucleus5/persistence/PersistenceSession5.java b/persistence/jdo/datanucleus-5/src/main/java/org/apache/isis/persistence/jdo/datanucleus5/persistence/PersistenceSession5.java
index 2ea455f..cf4ef02 100644
--- a/persistence/jdo/datanucleus-5/src/main/java/org/apache/isis/persistence/jdo/datanucleus5/persistence/PersistenceSession5.java
+++ b/persistence/jdo/datanucleus-5/src/main/java/org/apache/isis/persistence/jdo/datanucleus5/persistence/PersistenceSession5.java
@@ -75,6 +75,7 @@ import org.apache.isis.core.metamodel.facets.object.callbacks.UpdatingCallbackFa
 import org.apache.isis.core.metamodel.facets.object.callbacks.UpdatingLifecycleEventFacet;
 import org.apache.isis.core.metamodel.services.container.query.QueryCardinality;
 import org.apache.isis.core.metamodel.spec.ManagedObject;
+import org.apache.isis.core.metamodel.spec.ManagedObjects.EntityUtil;
 import org.apache.isis.core.metamodel.spec.ObjectSpecification;
 import org.apache.isis.persistence.jdo.applib.exceptions.NotPersistableException;
 import org.apache.isis.persistence.jdo.applib.exceptions.UnsupportedFindException;
@@ -745,7 +746,7 @@ implements IsisLifecycleListener.PersistenceSessionLifecycleManagement {
     public void enlistCreatedAndRemapIfRequiredThenInvokeIsisInvokePersistingOrUpdatedCallback(final Persistable pojo) {
         val adapter = adapterFor(pojo);
         
-        val state = ManagedObject._entityState(adapter);
+        val state = EntityUtil.getEntityState(adapter);
 
         if (state.isAttached()) {
             // updating;