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/04/08 17:21:16 UTC

[isis] branch master updated: ISIS-2297: ManagedObject: don't expose internal bookmark memoization utility

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 dab4cbfac2 ISIS-2297: ManagedObject: don't expose internal bookmark memoization utility
dab4cbfac2 is described below

commit dab4cbfac251fd51c54395cfa3638fcd2f10ab1a
Author: Andi Huber <ah...@apache.org>
AuthorDate: Fri Apr 8 19:21:08 2022 +0200

    ISIS-2297: ManagedObject: don't expose internal bookmark memoization
    utility
---
 .../isis/core/metamodel/spec/ManagedObject.java    | 135 ++++++++++-----------
 .../isis/core/metamodel/spec/ManagedObjects.java   |  23 +---
 2 files changed, 65 insertions(+), 93 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 d57199aa03..8a92a5aa5f 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
@@ -314,20 +314,74 @@ public interface ManagedObject {
         return SimpleManagedObject.of(spec, null);
     }
 
+    // -- LAZY BOOKMARK HANDLING
+
+    static abstract class ManagedObjectWithBookmark
+    implements ManagedObject {
+
+        protected final _Lazy<Optional<Bookmark>> bookmarkLazy =
+                _Lazy.threadSafe(()->bookmark(this));
+
+        @Override
+        public final Optional<Bookmark> getBookmark() {
+            return bookmarkLazy.get();
+        }
+
+        @Override
+        public final boolean isBookmarkMemoized() {
+            return bookmarkLazy.isMemoized();
+        }
+
+        @Override
+        public final  Optional<Bookmark> getBookmarkRefreshed() {
+            // silently ignore invalidation, when the pojo is an entity
+            if(!getSpecification().isEntity()) {
+                bookmarkLazy.clear();
+            }
+            return getBookmark();
+        }
+
+        @Override
+        public final void replaceBookmark(final UnaryOperator<Bookmark> replacer) {
+            final Bookmark old = bookmarkLazy.isMemoized()
+                    ? bookmarkLazy.get().orElse(null)
+                    : null;
+            bookmarkLazy.clear();
+            bookmarkLazy.set(Optional.ofNullable(replacer.apply(old)));
+        }
+
+        // guards against, non identifiable objects
+        private Optional<Bookmark> bookmark(final @Nullable ManagedObject adapter) {
+
+            if(ManagedObjects.isNullOrUnspecifiedOrEmpty(adapter)
+                    || adapter.getSpecification().isValue()
+                    || !ManagedObjects.isIdentifiable(adapter)) {
+                return Optional.empty();
+            }
+
+            return ManagedObjects.spec(adapter)
+                    .map(ObjectSpecification::getMetaModelContext)
+                    .map(MetaModelContext::getObjectManager)
+                    .map(objectManager->objectManager.bookmarkObject(adapter));
+        }
+
+    }
+
     // -- SIMPLE
 
     //@Value
     //@RequiredArgsConstructor(staticName="of", access = AccessLevel.PRIVATE)
     @AllArgsConstructor(staticName="of", access = AccessLevel.PRIVATE)
-    @EqualsAndHashCode(of = "pojo")
+    @EqualsAndHashCode(of = "pojo", callSuper = false)
     @ToString(of = {"specification", "pojo"}) //ISIS-2317 make sure toString() is without side-effects
     @Getter
-    static final class SimpleManagedObject implements ManagedObject {
+    static final class SimpleManagedObject
+    extends ManagedObjectWithBookmark {
 
         public static ManagedObject identified(
-                @NonNull  final ObjectSpecification spec,
+                final @NonNull  ObjectSpecification spec,
                 final @Nullable Object pojo,
-                @NonNull  final Bookmark bookmark) {
+                final @NonNull  Bookmark bookmark) {
 
             if(pojo!=null) {
                 _Assert.assertFalse(_Collections.isCollectionOrArrayOrCanType(pojo.getClass()));
@@ -341,81 +395,29 @@ public interface ManagedObject {
         @NonNull private final ObjectSpecification specification;
         @Nullable private /*final*/ Object pojo;
 
-        @Override
-        public Optional<Bookmark> getBookmark() {
-            return bookmarkLazy.get();
-        }
-
-        @Override
-        public Optional<Bookmark> getBookmarkRefreshed() {
-            // silently ignore invalidation, when the pojo is an entity
-            if(!specification.isEntity()) {
-                bookmarkLazy.clear();
-            }
-            return getBookmark();
-        }
-
-        // -- LAZY ID HANDLING
-        private final _Lazy<Optional<Bookmark>> bookmarkLazy =
-                _Lazy.threadSafe(()->ManagedObjects.BookmarkUtil.bookmark(this));
-
-        @Override
-        public boolean isBookmarkMemoized() {
-            return bookmarkLazy.isMemoized();
-        }
-
         @Override
         public void replacePojo(final UnaryOperator<Object> replacer) {
             pojo = replacer.apply(pojo);
             assertSpecIsInSyncWithPojo();
         }
 
-        @Override
-        public void replaceBookmark(final UnaryOperator<Bookmark> replacer) {
-            final Bookmark old = bookmarkLazy.isMemoized()
-                    ? bookmarkLazy.get().orElse(null)
-                    : null;
-            bookmarkLazy.clear();
-            bookmarkLazy.set(Optional.ofNullable(replacer.apply(old)));
-        }
-
     }
 
     // -- LAZY
 
-    @EqualsAndHashCode(of = "pojo")
-    static final class LazyManagedObject implements ManagedObject {
+    @EqualsAndHashCode(of = "pojo", callSuper = false)
+    static final class LazyManagedObject
+    extends ManagedObjectWithBookmark {
 
         @NonNull private final Function<Class<?>, ObjectSpecification> specLoader;
 
         @Getter @NonNull private /*final*/ Object pojo;
 
-        @Override
-        public Optional<Bookmark> getBookmark() {
-            return bookmarkLazy.get();
-        }
-
-        @Override
-        public Optional<Bookmark> getBookmarkRefreshed() {
-            // silently ignore invalidation, when the pojo is an entity
-            if(!specification.get().isEntity()) {
-                bookmarkLazy.clear();
-            }
-            return getBookmark();
-        }
-
-        // -- LAZY ID HANDLING
-        private final _Lazy<Optional<Bookmark>> bookmarkLazy =
-                _Lazy.threadSafe(()->ManagedObjects.BookmarkUtil.bookmark(this));
-
-        @Override
-        public boolean isBookmarkMemoized() {
-            return bookmarkLazy.isMemoized();
-        }
-
         private final _Lazy<ObjectSpecification> specification = _Lazy.threadSafe(this::loadSpec);
 
-        public LazyManagedObject(final @NonNull Function<Class<?>, ObjectSpecification> specLoader, final @NonNull Object pojo) {
+        public LazyManagedObject(
+                final @NonNull Function<Class<?>, ObjectSpecification> specLoader,
+                final @NonNull Object pojo) {
             this.specLoader = specLoader;
             this.pojo = pojo;
         }
@@ -449,15 +451,6 @@ public interface ManagedObject {
             }
         }
 
-        @Override
-        public void replaceBookmark(final UnaryOperator<Bookmark> replacer) {
-            final Bookmark old = bookmarkLazy.isMemoized()
-                    ? bookmarkLazy.get().orElse(null)
-                    : null;
-            bookmarkLazy.clear();
-            bookmarkLazy.set(Optional.ofNullable(replacer.apply(old)));
-        }
-
     }
 
 
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 a919b7609c..54af11bf4f 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
@@ -55,7 +55,6 @@ import org.apache.isis.commons.internal.exceptions._Exceptions;
 import org.apache.isis.core.metamodel.commons.CanonicalInvoker;
 import org.apache.isis.core.metamodel.commons.ClassExtensions;
 import org.apache.isis.core.metamodel.consent.InteractionInitiatedBy;
-import org.apache.isis.core.metamodel.context.MetaModelContext;
 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;
@@ -225,7 +224,7 @@ public final class ManagedObjects {
             final @NonNull String separator) {
         return stringify(managedObject, separator)
                 .orElseGet(()->isSpecified(managedObject)
-                        ? managedObject.getSpecification().getLogicalTypeName() + separator +"?"
+                        ? managedObject.getSpecification().getLogicalTypeName() + separator + "?"
                         : "?" + separator + "?");
     }
 
@@ -588,26 +587,6 @@ public final class ManagedObjects {
         }
     }
 
-    // -- BOOKMARK UTILITIES
-
-    @UtilityClass
-    static final class BookmarkUtil {
-
-        Optional<Bookmark> bookmark(final @Nullable ManagedObject adapter) {
-
-            if(ManagedObjects.isNullOrUnspecifiedOrEmpty(adapter)
-                    || adapter.getSpecification().isValue()
-                    || !ManagedObjects.isIdentifiable(adapter)) {
-                return Optional.empty();
-            }
-
-            return ManagedObjects.spec(adapter)
-                    .map(ObjectSpecification::getMetaModelContext)
-                    .map(MetaModelContext::getObjectManager)
-                    .map(objectManager->objectManager.bookmarkObject(adapter));
-        }
-    }
-
     // -- ENTITY UTILITIES
 
     @UtilityClass