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 ec452b50e5 ISIS-3167: refactors bookmarkable specifics into their own 
interface
ec452b50e5 is described below

commit ec452b50e5b7c2f49cc53930a602aed51a23cf8b
Author: Andi Huber <[email protected]>
AuthorDate: Thu Sep 1 04:49:30 2022 +0200

    ISIS-3167: refactors bookmarkable specifics into their own interface
---
 .../isis/core/metamodel/object/Bookmarkable.java   | 64 ++++++++++++++++++++++
 .../isis/core/metamodel/object/ManagedObject.java  | 54 ++++++++----------
 .../core/metamodel/object/_ManagedObjectEmpty.java | 19 +------
 .../core/metamodel/object/_ManagedObjectMixin.java | 19 +------
 ...edObjectEmpty.java => _ManagedObjectOther.java} | 48 +++++++---------
 .../metamodel/object/_ManagedObjectPacked.java     | 20 +------
 .../object/_ManagedObjectUnspecified.java          | 18 +-----
 7 files changed, 114 insertions(+), 128 deletions(-)

diff --git 
a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/object/Bookmarkable.java
 
b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/object/Bookmarkable.java
new file mode 100644
index 0000000000..69ce59eb42
--- /dev/null
+++ 
b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/object/Bookmarkable.java
@@ -0,0 +1,64 @@
+/*
+ *  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.object;
+
+import java.util.Optional;
+
+import org.apache.isis.applib.services.bookmark.Bookmark;
+import 
org.apache.isis.core.metamodel.object.ManagedObject.Specialization.BookmarkPolicy;
+import org.apache.isis.core.metamodel.objectmanager.ObjectManager;
+
+public interface Bookmarkable {
+
+    BookmarkPolicy getBookmarkPolicy();
+
+    default boolean isBookmarkSupported() {
+        return !getBookmarkPolicy().isNoBookmark();
+    }
+
+    /**
+     * Returns the object's bookmark as identified by the {@link 
ObjectManager}.
+     * Bookmarks are immutable, hence will be memoized once fetched.
+     */
+    Optional<Bookmark> getBookmark();
+
+    boolean isBookmarkMemoized();
+
+    /**
+     * Similar to {@link #getBookmark()}, but invalidates any memoized {@link 
Bookmark}
+     * such that the {@link Bookmark} returned is recreated, reflecting the 
object's current state.
+     * @implNote
+     * As this is not required, in fact not recommended for entities,
+     * (but might be necessary for viewmodels, when their state has changed),
+     * we silently ignore bookmark invalidation attempts for entities.
+     */
+    Optional<Bookmark> getBookmarkRefreshed();
+
+    /**
+     * Implements {@link Bookmarkable} reflecting
+     * {@link 
org.apache.isis.core.metamodel.object.ManagedObject.Specialization.BookmarkPolicy#NO_BOOKMARK}
+     */
+    static interface NoBookmark extends Bookmarkable {
+        @Override default boolean isBookmarkSupported() { return false; }
+        @Override default Optional<Bookmark> getBookmark() { return 
Optional.empty(); }
+        @Override default Optional<Bookmark> getBookmarkRefreshed() { return 
Optional.empty(); }
+        @Override default boolean isBookmarkMemoized() { return false; }
+    }
+
+}
diff --git 
a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/object/ManagedObject.java
 
b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/object/ManagedObject.java
index cb120a4912..4bd665f95e 100644
--- 
a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/object/ManagedObject.java
+++ 
b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/object/ManagedObject.java
@@ -32,6 +32,7 @@ import 
org.apache.isis.commons.internal.exceptions._Exceptions;
 import org.apache.isis.core.metamodel.context.HasMetaModelContext;
 import org.apache.isis.core.metamodel.facets.object.icon.ObjectIcon;
 import org.apache.isis.core.metamodel.facets.object.title.TitleRenderRequest;
+import 
org.apache.isis.core.metamodel.object.ManagedObject.Specialization.BookmarkPolicy;
 import org.apache.isis.core.metamodel.spec.ObjectSpecification;
 import org.apache.isis.core.metamodel.specloader.SpecificationLoader;
 
@@ -49,7 +50,10 @@ import lombok.extern.log4j.Log4j2;
  * @since 2.0 {@index}}
  *
  */
-public interface ManagedObject extends HasMetaModelContext {
+public interface ManagedObject
+extends
+    Bookmarkable,
+    HasMetaModelContext {
 
     /**
      * ManagedObject specializations have varying contract/behavior.
@@ -308,6 +312,9 @@ public interface ManagedObject extends HasMetaModelContext {
      * which governs this object's behavior.
      */
     Specialization getSpecialization();
+    @Override default BookmarkPolicy getBookmarkPolicy() {
+        return getSpecialization().getBookmarkPolicy();
+    }
 
     /**
      * Returns the specification that details the structure (meta-model) of 
this object.
@@ -320,22 +327,6 @@ public interface ManagedObject extends HasMetaModelContext 
{
      */
     Object getPojo();
 
-    /**
-     * Returns the object's bookmark as identified by the ObjectManager.
-     * Bookmarks are considered immutable, hence will be memoized once fetched.
-     */
-    Optional<Bookmark> getBookmark();
-
-    /**
-     * Similar to {@link #getBookmark()}, but invalidates any memoized {@link 
Bookmark}
-     * such that the {@link Bookmark} returned is recreated, reflecting the 
object's current state.
-     * @implNote
-     * As this is not required, in fact not recommended for entities,
-     * (but might be necessary for viewmodels, when their state has changed),
-     * we silently ignore bookmark invalidation attempts for entities.
-     */
-    Optional<Bookmark> getBookmarkRefreshed();
-
     /**
      * If the underlying domain object is a viewmodel, refreshes any 
referenced entities.
      * (Acts as a no-op otherwise.)
@@ -343,8 +334,6 @@ public interface ManagedObject extends HasMetaModelContext {
      */
     void refreshViewmodel(@Nullable Supplier<Bookmark> bookmarkSupplier);
 
-    boolean isBookmarkMemoized();
-
     Supplier<ManagedObject> asSupplier();
 
     /**
@@ -412,6 +401,7 @@ public interface ManagedObject extends HasMetaModelContext {
     }
     /**
      * EMPTY
+     * @param spec - required
      * @see ManagedObject.Specialization.TypePolicy#ABSTRACT_TYPE_ALLOWED
      * @see ManagedObject.Specialization.BookmarkPolicy#NO_BOOKMARK
      * @see ManagedObject.Specialization.PojoPolicy#NO_POJO
@@ -421,8 +411,8 @@ public interface ManagedObject extends HasMetaModelContext {
     }
     /**
      * VALUE
-     * @param pojo
-     * @param spec
+     * @param spec - required
+     * @param pojo - if <code>null</code> maps to {@link 
#empty(ObjectSpecification)}
      * @see ManagedObject.Specialization.TypePolicy#EXACT_TYPE_REQUIRED
      * @see ManagedObject.Specialization.BookmarkPolicy#IMMUTABLE
      * @see ManagedObject.Specialization.PojoPolicy#IMMUTABLE
@@ -436,8 +426,8 @@ public interface ManagedObject extends HasMetaModelContext {
     }
     /**
      * SERVICE
-     * @param pojo
-     * @param spec
+     * @param spec - required
+     * @param pojo - required
      * @see ManagedObject.Specialization.TypePolicy#EXACT_TYPE_REQUIRED
      * @see ManagedObject.Specialization.BookmarkPolicy#IMMUTABLE
      * @see ManagedObject.Specialization.PojoPolicy#IMMUTABLE
@@ -449,8 +439,8 @@ public interface ManagedObject extends HasMetaModelContext {
     }
     /**
      * VIEWMODEL
-     * @param pojo
-     * @param spec
+     * @param spec - required
+     * @param pojo - if <code>null</code> maps to {@link 
#empty(ObjectSpecification)}
      * @see ManagedObject.Specialization.TypePolicy#EXACT_TYPE_REQUIRED
      * @see ManagedObject.Specialization.BookmarkPolicy#REFRESHABLE
      * @see ManagedObject.Specialization.PojoPolicy#STATEFUL
@@ -466,8 +456,8 @@ public interface ManagedObject extends HasMetaModelContext {
     }
     /**
      * ENTITY
-     * @param pojo
-     * @param spec
+     * @param spec - required
+     * @param pojo - if <code>null</code> maps to {@link 
#empty(ObjectSpecification)}
      * @see ManagedObject.Specialization.TypePolicy#EXACT_TYPE_REQUIRED
      * @see ManagedObject.Specialization.BookmarkPolicy#IMMUTABLE
      * @see ManagedObject.Specialization.PojoPolicy#REFETCHABLE
@@ -481,8 +471,8 @@ public interface ManagedObject extends HasMetaModelContext {
     }
     /**
      * MIXIN
-     * @param pojo
-     * @param spec
+     * @param spec - required
+     * @param pojo - required
      * @see ManagedObject.Specialization.TypePolicy#EXACT_TYPE_REQUIRED
      * @see ManagedObject.Specialization.BookmarkPolicy#NO_BOOKMARK
      * @see ManagedObject.Specialization.PojoPolicy#STATEFUL
@@ -494,8 +484,8 @@ public interface ManagedObject extends HasMetaModelContext {
     }
     /**
      * OTHER
-     * @param pojo
-     * @param spec
+     * @param spec - required
+     * @param pojo - if <code>null</code> maps to {@link 
#empty(ObjectSpecification)}
      * @see ManagedObject.Specialization.TypePolicy#EXACT_TYPE_REQUIRED
      * @see ManagedObject.Specialization.BookmarkPolicy#NO_BOOKMARK
      * @see ManagedObject.Specialization.PojoPolicy#STATEFUL
@@ -509,6 +499,8 @@ public interface ManagedObject extends HasMetaModelContext {
     }
     /**
      * PACKED
+     * @param elementSpec - required
+     * @param nonScalar - if <code>null</code> uses {@link Can#empty()} instead
      * @see ManagedObject.Specialization.TypePolicy#ABSTRACT_TYPE_ALLOWED
      * @see ManagedObject.Specialization.BookmarkPolicy#NO_BOOKMARK
      * @see ManagedObject.Specialization.PojoPolicy#PACKED
diff --git 
a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/object/_ManagedObjectEmpty.java
 
b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/object/_ManagedObjectEmpty.java
index d40fe5abaf..285211fabf 100644
--- 
a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/object/_ManagedObjectEmpty.java
+++ 
b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/object/_ManagedObjectEmpty.java
@@ -18,7 +18,6 @@
  */
 package org.apache.isis.core.metamodel.object;
 
-import java.util.Optional;
 import java.util.function.Supplier;
 
 import org.apache.isis.applib.services.bookmark.Bookmark;
@@ -32,7 +31,8 @@ import lombok.Getter;
  */
 @Getter
 final class _ManagedObjectEmpty
-extends _ManagedObjectSpecified {
+extends _ManagedObjectSpecified
+implements Bookmarkable.NoBookmark {
 
     _ManagedObjectEmpty(
             final ObjectSpecification spec) {
@@ -44,23 +44,8 @@ extends _ManagedObjectSpecified {
         return null;
     }
 
-    @Override
-    public Optional<Bookmark> getBookmark() {
-        return Optional.empty();
-    }
-
-    @Override
-    public Optional<Bookmark> getBookmarkRefreshed() {
-        return Optional.empty();
-    }
-
     @Override
     public void refreshViewmodel(final Supplier<Bookmark> bookmarkSupplier) {
     }
 
-    @Override
-    public boolean isBookmarkMemoized() {
-        return false;
-    }
-
 }
\ No newline at end of file
diff --git 
a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/object/_ManagedObjectMixin.java
 
b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/object/_ManagedObjectMixin.java
index b4c13a3e99..15fb7fafbd 100644
--- 
a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/object/_ManagedObjectMixin.java
+++ 
b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/object/_ManagedObjectMixin.java
@@ -18,7 +18,6 @@
  */
 package org.apache.isis.core.metamodel.object;
 
-import java.util.Optional;
 import java.util.function.Supplier;
 
 import org.apache.isis.applib.services.bookmark.Bookmark;
@@ -36,7 +35,8 @@ import lombok.experimental.Accessors;
  */
 @Getter
 final class _ManagedObjectMixin
-extends _ManagedObjectSpecified {
+extends _ManagedObjectSpecified
+implements Bookmarkable.NoBookmark {
 
     @Getter(onMethod_ = {@Override}) @Accessors(makeFinal = true)
     private final @NonNull Object pojo;
@@ -49,26 +49,11 @@ extends _ManagedObjectSpecified {
         this.pojo = assertCompliance(pojo);
     }
 
-    @Override
-    public Optional<Bookmark> getBookmark() {
-        return Optional.empty(); // bookmark n/a for mixins
-    }
-
-    @Override
-    public Optional<Bookmark> getBookmarkRefreshed() {
-        return Optional.empty(); // bookmark n/a for mixins
-    }
-
     @Override
     public void refreshViewmodel(final Supplier<Bookmark> bookmarkSupplier) {
         // no-op for mixins
     }
 
-    @Override
-    public boolean isBookmarkMemoized() {
-        return false;
-    }
-
     @Override
     public final String getTitle() {
         // mixins have no title
diff --git 
a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/object/_ManagedObjectEmpty.java
 
b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/object/_ManagedObjectOther.java
similarity index 65%
copy from 
core/metamodel/src/main/java/org/apache/isis/core/metamodel/object/_ManagedObjectEmpty.java
copy to 
core/metamodel/src/main/java/org/apache/isis/core/metamodel/object/_ManagedObjectOther.java
index d40fe5abaf..91702895cd 100644
--- 
a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/object/_ManagedObjectEmpty.java
+++ 
b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/object/_ManagedObjectOther.java
@@ -18,49 +18,39 @@
  */
 package org.apache.isis.core.metamodel.object;
 
-import java.util.Optional;
 import java.util.function.Supplier;
 
 import org.apache.isis.applib.services.bookmark.Bookmark;
 import org.apache.isis.core.metamodel.spec.ObjectSpecification;
 
 import lombok.Getter;
+import lombok.NonNull;
+import lombok.experimental.Accessors;
 
 /**
- * (package private) specialization corresponding to {@link 
Specialization#EMPTY}
- * @see ManagedObject.Specialization#EMPTY
+ * (package private) specialization corresponding to {@link 
Specialization#OTHER}
+ * @see ManagedObject.Specialization#MIXIN
  */
 @Getter
-final class _ManagedObjectEmpty
-extends _ManagedObjectSpecified {
-
-    _ManagedObjectEmpty(
-            final ObjectSpecification spec) {
-        super(ManagedObject.Specialization.EMPTY, spec);
-    }
-
-    @Override
-    public Object getPojo() {
-        return null;
-    }
-
-    @Override
-    public Optional<Bookmark> getBookmark() {
-        return Optional.empty();
-    }
-
-    @Override
-    public Optional<Bookmark> getBookmarkRefreshed() {
-        return Optional.empty();
+final class _ManagedObjectOther
+extends _ManagedObjectSpecified
+implements Bookmarkable.NoBookmark {
+
+    @Getter(onMethod_ = {@Override}) @Accessors(makeFinal = true)
+    private final @NonNull Object pojo;
+
+    _ManagedObjectOther(
+            final ObjectSpecification spec,
+            final Object pojo) {
+        super(ManagedObject.Specialization.OTHER, spec);
+        //_Assert.assertTrue(spec.isOther()); //TODO later
+        //this.pojo = assertCompliance(pojo); //TODO later
+        this.pojo = pojo;
     }
 
     @Override
     public void refreshViewmodel(final Supplier<Bookmark> bookmarkSupplier) {
-    }
-
-    @Override
-    public boolean isBookmarkMemoized() {
-        return false;
+        // no-op for other
     }
 
 }
\ No newline at end of file
diff --git 
a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/object/_ManagedObjectPacked.java
 
b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/object/_ManagedObjectPacked.java
index 5438f1a990..35d1eeec64 100644
--- 
a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/object/_ManagedObjectPacked.java
+++ 
b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/object/_ManagedObjectPacked.java
@@ -19,7 +19,6 @@
 package org.apache.isis.core.metamodel.object;
 
 import java.util.Collections;
-import java.util.Optional;
 import java.util.function.Supplier;
 import java.util.stream.Collectors;
 
@@ -37,7 +36,9 @@ import lombok.NonNull;
  */
 final class _ManagedObjectPacked
 extends _ManagedObjectSpecified
-implements PackedManagedObject {
+implements
+    Bookmarkable.NoBookmark,
+    PackedManagedObject {
 
     private final @NonNull Can<ManagedObject> nonScalar;
 
@@ -59,21 +60,6 @@ implements PackedManagedObject {
                 .collect(Collectors.toList()));
     }
 
-    @Override
-    public Optional<Bookmark> getBookmark() {
-        return Optional.empty();
-    }
-
-    @Override
-    public Optional<Bookmark> getBookmarkRefreshed() {
-        return Optional.empty();
-    }
-
-    @Override
-    public boolean isBookmarkMemoized() {
-        return false;
-    }
-
     @Override
     public Can<ManagedObject> unpack(){
         return nonScalar;
diff --git 
a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/object/_ManagedObjectUnspecified.java
 
b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/object/_ManagedObjectUnspecified.java
index a4992373d1..dafa611d87 100644
--- 
a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/object/_ManagedObjectUnspecified.java
+++ 
b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/object/_ManagedObjectUnspecified.java
@@ -19,7 +19,6 @@
 package org.apache.isis.core.metamodel.object;
 
 import java.util.Objects;
-import java.util.Optional;
 import java.util.function.Supplier;
 
 import org.springframework.lang.Nullable;
@@ -36,7 +35,7 @@ import lombok.NonNull;
  * @see ManagedObject.Specialization#UNSPECIFIED
  */
 final class _ManagedObjectUnspecified
-implements ManagedObject {
+implements ManagedObject, Bookmarkable.NoBookmark {
 
     static final ManagedObject INSTANCE = new _ManagedObjectUnspecified();
 
@@ -55,21 +54,6 @@ implements ManagedObject {
         return null;
     }
 
-    @Override
-    public Optional<Bookmark> getBookmark() {
-        return Optional.empty();
-    }
-
-    @Override
-    public Optional<Bookmark> getBookmarkRefreshed() {
-        return Optional.empty();
-    }
-
-    @Override
-    public boolean isBookmarkMemoized() {
-        return false;
-    }
-
     @Override
     public void refreshViewmodel(final @Nullable Supplier<Bookmark> 
bookmarkSupplier) {
     }

Reply via email to