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/09/05 03:13:56 UTC

[isis] 02/02: ISIS-3199: simplify ObjectBookmarker

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

commit f40ecae87c8f8bb6a48767b31e904376bb32fe36
Author: Andi Huber <ah...@apache.org>
AuthorDate: Mon Sep 5 05:13:48 2022 +0200

    ISIS-3199: simplify ObjectBookmarker
---
 .../metamodel/object/_ManagedObjectViewmodel.java  |  20 +--
 .../metamodel/objectmanager/ObjectBookmarker.java  |  89 +++++++++++++
 .../metamodel/objectmanager/ObjectManager.java     |   1 -
 .../objectmanager/ObjectManagerDefault.java        |   1 -
 .../objectmanager/identify/ObjectBookmarker.java   |  60 ---------
 .../identify/ObjectBookmarker_builtinHandlers.java | 141 ---------------------
 6 files changed, 92 insertions(+), 220 deletions(-)

diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/object/_ManagedObjectViewmodel.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/object/_ManagedObjectViewmodel.java
index 555d6332db..e461326085 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/object/_ManagedObjectViewmodel.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/object/_ManagedObjectViewmodel.java
@@ -30,7 +30,6 @@ import org.apache.isis.applib.services.bookmark.Bookmark;
 import org.apache.isis.commons.internal.assertions._Assert;
 import org.apache.isis.commons.internal.base._Lazy;
 import org.apache.isis.commons.internal.debug._XrayEvent;
-import org.apache.isis.core.metamodel.context.MetaModelContext;
 import org.apache.isis.core.metamodel.spec.ObjectSpecification;
 
 import lombok.Getter;
@@ -51,7 +50,7 @@ implements
     @Nullable private /*final*/ Object pojo;
 
     protected final _Lazy<Optional<Bookmark>> bookmarkLazy =
-            _Lazy.threadSafe(()->bookmark(this));
+            _Lazy.threadSafe(()->createBookmark());
 
     _ManagedObjectViewmodel(
             final ObjectSpecification spec,
@@ -88,21 +87,8 @@ implements
         bookmarkLazy.set(Optional.ofNullable(replacer.apply(old)));
     }
 
-    // guards against non-identifiable objects;
-    // historically, we allowed non-identifiable to be handled by the objectManager,
-    // which as a fallback creates 'random' UUIDs
-    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)
-                .flatMap(objectManager->objectManager.bookmarkObject(adapter));
+    private Optional<Bookmark> createBookmark() {
+        return Optional.ofNullable(getSpecification().viewmodelFacetElseFail().serializeToBookmark(this));
     }
 
     // -- REFRESH OPTIMIZATION
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/objectmanager/ObjectBookmarker.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/objectmanager/ObjectBookmarker.java
new file mode 100644
index 0000000000..f1c92af48e
--- /dev/null
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/objectmanager/ObjectBookmarker.java
@@ -0,0 +1,89 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ */
+package org.apache.isis.core.metamodel.objectmanager;
+
+import java.util.List;
+import java.util.Optional;
+
+import org.apache.isis.applib.services.bookmark.Bookmark;
+import org.apache.isis.applib.services.bookmark.Oid;
+import org.apache.isis.commons.handler.ChainOfResponsibility;
+import org.apache.isis.core.metamodel.object.Bookmarkable;
+import org.apache.isis.core.metamodel.object.ManagedObject;
+
+/**
+ * @since 2.0
+ */
+public interface ObjectBookmarker {
+
+    Optional<Bookmark> bookmarkObject(ManagedObject managedObject);
+
+    // -- HANDLER
+
+    public interface Handler extends ChainOfResponsibility.Handler<ManagedObject, Optional<Bookmark>> {}
+
+    // -- FACTORY
+
+    public static ObjectBookmarker createDefault() {
+        return managedObject ->
+            ChainOfResponsibility.named(
+                    "ObjectBookmarker",
+                    handlers)
+            .handle(managedObject);
+    }
+
+    // -- HANDLERS
+
+    static final List<Handler> handlers = List.of(BuiltinHandlers.values());
+
+    enum BuiltinHandlers implements Handler {
+        GuardAgainstOid {
+            @Override public boolean isHandling(final ManagedObject managedObject) {
+                return managedObject.getPojo() instanceof Oid;
+            }
+            @Override
+            public Optional<Bookmark> handle(final ManagedObject managedObject) {
+                throw new IllegalArgumentException("Cannot create a Bookmark for pojo, "
+                        + "when pojo is instance of Bookmark. You might want to ask "
+                        + "ObjectAdapterByIdProvider for an ObjectAdapter instead.");
+            }
+        },
+        BookmarkForBookmarkable {
+            @Override
+            public boolean isHandling(final ManagedObject managedObject) {
+                return managedObject instanceof Bookmarkable;
+            }
+            @Override
+            public Optional<Bookmark> handle(final ManagedObject managedObject) {
+                return managedObject.getBookmark();
+            }
+        },
+        BookmarkForOthers {
+            @Override
+            public boolean isHandling(final ManagedObject managedObject) {
+                return true; // try to handle anything
+            }
+            @Override
+            public Optional<Bookmark> handle(final ManagedObject managedObject) {
+                return Optional.empty();
+            }
+        };
+    }
+
+}
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/objectmanager/ObjectManager.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/objectmanager/ObjectManager.java
index 9e35cd752c..5e66ca88d3 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/objectmanager/ObjectManager.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/objectmanager/ObjectManager.java
@@ -32,7 +32,6 @@ import org.apache.isis.core.metamodel.context.MetaModelContext;
 import org.apache.isis.core.metamodel.object.ManagedObject;
 import org.apache.isis.core.metamodel.objectmanager.create.ObjectCreator;
 import org.apache.isis.core.metamodel.objectmanager.detach.ObjectDetacher;
-import org.apache.isis.core.metamodel.objectmanager.identify.ObjectBookmarker;
 import org.apache.isis.core.metamodel.objectmanager.load.ObjectLoader;
 import org.apache.isis.core.metamodel.objectmanager.memento.ObjectMemorizer;
 import org.apache.isis.core.metamodel.objectmanager.query.ObjectBulkLoader;
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/objectmanager/ObjectManagerDefault.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/objectmanager/ObjectManagerDefault.java
index eb8e58db25..29165f0e72 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/objectmanager/ObjectManagerDefault.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/objectmanager/ObjectManagerDefault.java
@@ -31,7 +31,6 @@ import org.apache.isis.core.metamodel.IsisModuleCoreMetamodel;
 import org.apache.isis.core.metamodel.context.MetaModelContext;
 import org.apache.isis.core.metamodel.objectmanager.create.ObjectCreator;
 import org.apache.isis.core.metamodel.objectmanager.detach.ObjectDetacher;
-import org.apache.isis.core.metamodel.objectmanager.identify.ObjectBookmarker;
 import org.apache.isis.core.metamodel.objectmanager.load.ObjectLoader;
 import org.apache.isis.core.metamodel.objectmanager.memento.ObjectMemorizer;
 import org.apache.isis.core.metamodel.objectmanager.query.ObjectBulkLoader;
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/objectmanager/identify/ObjectBookmarker.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/objectmanager/identify/ObjectBookmarker.java
deleted file mode 100644
index 125ce1b609..0000000000
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/objectmanager/identify/ObjectBookmarker.java
+++ /dev/null
@@ -1,60 +0,0 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *        http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- */
-package org.apache.isis.core.metamodel.objectmanager.identify;
-
-import java.util.List;
-import java.util.Optional;
-
-import org.apache.isis.applib.services.bookmark.Bookmark;
-import org.apache.isis.commons.handler.ChainOfResponsibility;
-import org.apache.isis.commons.internal.collections._Lists;
-import org.apache.isis.core.metamodel.object.ManagedObject;
-
-/**
- * @since 2.0
- */
-public interface ObjectBookmarker {
-
-    Optional<Bookmark> bookmarkObject(ManagedObject managedObject);
-
-    // -- HANDLER
-
-    public interface Handler extends ChainOfResponsibility.Handler<ManagedObject, Optional<Bookmark>> {}
-
-    // -- FACTORY
-
-    public static ObjectBookmarker createDefault() {
-        return managedObject ->
-            ChainOfResponsibility.named(
-                    "ObjectBookmarker",
-                    handlers)
-            .handle(managedObject);
-    }
-
-    static final List<Handler> handlers =
-            _Lists.of(
-                    new ObjectBookmarker_builtinHandlers.GuardAgainstOid(),
-                    new ObjectBookmarker_builtinHandlers.BookmarkForNonScalar(),
-                    new ObjectBookmarker_builtinHandlers.BookmarkForServices(),
-                    new ObjectBookmarker_builtinHandlers.BookmarkForValues(),
-                    new ObjectBookmarker_builtinHandlers.BookmarkForViewModels(),
-                    new ObjectBookmarker_builtinHandlers.BookmarkForEntities(),
-                    new ObjectBookmarker_builtinHandlers.BookmarkForOthers());
-
-}
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/objectmanager/identify/ObjectBookmarker_builtinHandlers.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/objectmanager/identify/ObjectBookmarker_builtinHandlers.java
deleted file mode 100644
index 491497826e..0000000000
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/objectmanager/identify/ObjectBookmarker_builtinHandlers.java
+++ /dev/null
@@ -1,141 +0,0 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *        http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- */
-package org.apache.isis.core.metamodel.objectmanager.identify;
-
-import java.util.Optional;
-
-import org.apache.isis.applib.services.bookmark.Bookmark;
-import org.apache.isis.applib.services.bookmark.Oid;
-import org.apache.isis.commons.internal.assertions._Assert;
-import org.apache.isis.core.metamodel.object.ManagedObject;
-import org.apache.isis.core.metamodel.object.PackedManagedObject;
-import org.apache.isis.core.metamodel.objectmanager.identify.ObjectBookmarker.Handler;
-
-import lombok.SneakyThrows;
-import lombok.val;
-
-class ObjectBookmarker_builtinHandlers {
-
-    static class GuardAgainstOid implements Handler {
-
-        @Override
-        public boolean isHandling(final ManagedObject managedObject) {
-            return managedObject.getPojo() instanceof Oid;
-        }
-
-        @Override
-        public Optional<Bookmark> handle(final ManagedObject managedObject) {
-            throw new IllegalArgumentException("Cannot create a Bookmark for pojo, "
-                    + "when pojo is instance of Bookmark. You might want to ask "
-                    + "ObjectAdapterByIdProvider for an ObjectAdapter instead.");
-        }
-
-    }
-
-    static class BookmarkForNonScalar implements Handler {
-
-        @Override
-        public boolean isHandling(final ManagedObject managedObject) {
-            return managedObject instanceof PackedManagedObject;
-        }
-
-        @Override
-        public Optional<Bookmark> handle(final ManagedObject managedObject) {
-            return Optional.empty();
-        }
-
-    }
-
-    static class BookmarkForServices implements Handler {
-
-        @Override
-        public boolean isHandling(final ManagedObject managedObject) {
-            return managedObject.getSpecialization().isService();
-        }
-
-        @Override
-        public Optional<Bookmark> handle(final ManagedObject managedObject) {
-            return managedObject.getBookmark();
-        }
-    }
-
-    static class BookmarkForEntities implements Handler {
-
-        @Override
-        public boolean isHandling(final ManagedObject managedObject) {
-            return managedObject.getSpecialization().isEntity();
-        }
-
-        @Override
-        public Optional<Bookmark> handle(final ManagedObject managedObject) {
-            return managedObject.getBookmark(); // could be empty that is detached or transient
-        }
-
-    }
-
-    static class BookmarkForValues implements Handler {
-
-        @Override
-        public boolean isHandling(final ManagedObject managedObject) {
-            return managedObject.getSpecialization().isValue();
-        }
-
-        @SneakyThrows
-        @Override
-        public Optional<Bookmark> handle(final ManagedObject managedObject) {
-            _Assert.assertTrue(managedObject.isBookmarkSupported(), ()->"is bookmarkable");
-            return managedObject.getBookmark();
-        }
-
-    }
-
-    static class BookmarkForViewModels implements Handler {
-
-        @Override
-        public boolean isHandling(final ManagedObject managedObject) {
-            return managedObject.getSpecialization().isViewmodel();
-        }
-
-        @Override
-        public Optional<Bookmark> handle(final ManagedObject managedObject) {
-
-            if(managedObject.isBookmarkMemoized()) {
-                return managedObject.getBookmark();
-            }
-
-            val spec = managedObject.getSpecification();
-            return Optional.ofNullable(spec.viewmodelFacetElseFail().serializeToBookmark(managedObject));
-        }
-
-    }
-
-    static class BookmarkForOthers implements Handler {
-
-        @Override
-        public boolean isHandling(final ManagedObject managedObject) {
-            return true; // try to handle anything
-        }
-
-        @Override
-        public Optional<Bookmark> handle(final ManagedObject managedObject) {
-            return Optional.empty();
-        }
-    }
-
-}