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;