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