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 2021/06/25 06:52:58 UTC

[isis] branch master updated: ISIS-1720: housekeeping: consolidate managed-object utilities

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 c51b2aa  ISIS-1720: housekeeping: consolidate managed-object utilities
c51b2aa is described below

commit c51b2aa045f84b7d1f9b29b04c6e824e3416cba6
Author: Andi Huber <ah...@apache.org>
AuthorDate: Fri Jun 25 08:52:46 2021 +0200

    ISIS-1720: housekeeping: consolidate managed-object utilities
---
 .../isis/core/metamodel/spec/ManagedObject.java    |  24 ++--
 .../metamodel/spec/ManagedObjectInternalUtil.java  | 153 ---------------------
 .../isis/core/metamodel/spec/ManagedObjects.java   | 120 ++++++++++++++++
 .../core/metamodel/spec/ObjectSpecification.java   |  16 ++-
 4 files changed, 144 insertions(+), 169 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 99562cc..3ef625e 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
@@ -28,6 +28,7 @@ import javax.annotation.Nullable;
 import org.apache.isis.applib.services.bookmark.Bookmark;
 import org.apache.isis.commons.internal.base._Lazy;
 import org.apache.isis.commons.internal.exceptions._Exceptions;
+import org.apache.isis.core.metamodel.context.MetaModelContext;
 import org.apache.isis.core.metamodel.facets.object.icon.ObjectIcon;
 import org.apache.isis.core.metamodel.objectmanager.ObjectManager;
 import org.apache.isis.core.metamodel.specloader.SpecificationLoader;
@@ -74,16 +75,21 @@ public interface ManagedObject {
     }
 
     default String titleString(final @NonNull Predicate<ManagedObject> isContextAdapter) {
-        return ManagedObjectInternalUtil.titleString(this, isContextAdapter);
+        return ManagedObjects.TitleUtil.titleString(this, isContextAdapter);
     }
 
-    // -- SHORTCUT - OBJECT MANAGER
+    // -- SHORTCUTS - MM CONTEXT
 
-    default ObjectManager getObjectManager() {
-        return ManagedObjectInternalUtil.objectManager(this)
+    default MetaModelContext getMetaModelContext() {
+        return ManagedObjects.spec(this)
+                .map(ObjectSpecification::getMetaModelContext)
                 .orElseThrow(()->_Exceptions
-                        .illegalArgument("Can only retrieve ObjectManager from ManagedObjects "
-                                + "that are 'specified'."));
+                        .illegalArgument("Can only retrieve MetaModelContext from ManagedObjects "
+                                + "that have an ObjectSpecification."));
+    }
+
+    default ObjectManager getObjectManager() {
+        return getMetaModelContext().getObjectManager();
     }
 
     // -- SHORTCUT - ELEMENT SPECIFICATION
@@ -180,7 +186,7 @@ public interface ManagedObject {
 
     /** has no ObjectSpecification and no value (pojo) */
     static ManagedObject unspecified() {
-        return ManagedObjectInternalUtil.UNSPECIFIED;
+        return ManagedObjects.UNSPECIFIED;
     }
 
     /** has an ObjectSpecification, but no value (pojo) */
@@ -215,7 +221,7 @@ public interface ManagedObject {
 
         // -- LAZY ID HANDLING
         private final _Lazy<Optional<Bookmark>> bookmarkLazy =
-                _Lazy.threadSafe(()->ManagedObjectInternalUtil.bookmark(this));
+                _Lazy.threadSafe(()->ManagedObjects.BookmarkUtil.bookmark(this));
 
         @Override
         public boolean isBookmarkMemoized() {
@@ -240,7 +246,7 @@ public interface ManagedObject {
 
         // -- LAZY ID HANDLING
         private final _Lazy<Optional<Bookmark>> bookmarkLazy =
-                _Lazy.threadSafe(()->ManagedObjectInternalUtil.bookmark(this));
+                _Lazy.threadSafe(()->ManagedObjects.BookmarkUtil.bookmark(this));
 
         @Override
         public boolean isBookmarkMemoized() {
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/ManagedObjectInternalUtil.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/ManagedObjectInternalUtil.java
deleted file mode 100644
index f28917e..0000000
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/ManagedObjectInternalUtil.java
+++ /dev/null
@@ -1,153 +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.spec;
-
-import java.util.Optional;
-import java.util.function.Predicate;
-
-import javax.annotation.Nullable;
-
-import org.apache.isis.applib.services.bookmark.Bookmark;
-import org.apache.isis.commons.internal.exceptions._Exceptions;
-import org.apache.isis.core.metamodel.context.MetaModelContext;
-import org.apache.isis.core.metamodel.facets.collections.CollectionFacet;
-import org.apache.isis.core.metamodel.objectmanager.ObjectManager;
-
-import lombok.NonNull;
-import lombok.val;
-import lombok.experimental.UtilityClass;
-import lombok.extern.log4j.Log4j2;
-
-/**
- * @since 2.0
- */
-@UtilityClass
-@Log4j2
-final class ManagedObjectInternalUtil {
-
-
-    static final ManagedObject UNSPECIFIED = new ManagedObject() {
-
-        @Override
-        public ObjectSpecification getSpecification() {
-            throw _Exceptions.unsupportedOperation();
-        }
-
-        @Override
-        public Object getPojo() {
-            return null;
-        }
-
-        @Override
-        public Optional<Bookmark> getBookmark() {
-            return Optional.empty();
-        }
-
-        @Override
-        public boolean isBookmarkMemoized() {
-            return false;
-        }
-
-    };
-
-    static Optional<ObjectManager> objectManager(final @Nullable ManagedObject adapter) {
-        return ManagedObjects.spec(adapter)
-            .map(ObjectSpecification::getMetaModelContext)
-            .map(MetaModelContext::getObjectManager);
-    }
-
-    static Optional<Bookmark> bookmark(final @Nullable ManagedObject adapter) {
-
-        if(!ManagedObjects.isIdentifiable(adapter)
-                && ManagedObjects.isSpecified(adapter)) {
-            log.warn("about to create a random UUID bookmark for {}; this is probably an invalid code-path taken (TODO)",
-                    adapter.getSpecification());
-        }
-
-        return objectManager(adapter)
-                    .map(objectManager->objectManager.bookmarkObject(adapter));
-
-//TODO[2686] strictly forbid dummy UUID bookmark creation
-//        return ManagedObjects.isIdentifiable(adapter)
-//                ? objectManager(adapter)
-//                        .map(objectManager->objectManager.bookmarkObject(adapter))
-//                : Optional.empty();
-    }
-
-    // -- TITLE SUPPORT
-
-    static String titleString(
-            final @Nullable ManagedObject managedObject,
-            final @NonNull Predicate<ManagedObject> isContextAdapter) {
-
-        if(!ManagedObjects.isSpecified(managedObject)) {
-            return "unspecified object";
-        }
-
-        if (managedObject.getSpecification().isParentedOrFreeCollection()) {
-            final CollectionFacet facet = managedObject.getSpecification().getFacet(CollectionFacet.class);
-            return collectionTitleString(managedObject, facet);
-        } else {
-            return objectTitleString(managedObject, isContextAdapter);
-        }
-    }
-
-    private static String objectTitleString(ManagedObject managedObject, Predicate<ManagedObject> isContextAdapter) {
-        if (managedObject.getPojo() instanceof String) {
-            return (String) managedObject.getPojo();
-        }
-        val spec = managedObject.getSpecification();
-        return Optional.ofNullable(spec.getTitle(isContextAdapter, managedObject))
-                .orElseGet(()->getDefaultTitle(managedObject));
-    }
-
-    private static String collectionTitleString(ManagedObject managedObject, final CollectionFacet facet) {
-        final int size = facet.size(managedObject);
-        final ObjectSpecification elementSpecification = managedObject.getElementSpecification().orElse(null);
-        if (elementSpecification == null || elementSpecification.getFullIdentifier().equals(Object.class.getName())) {
-            switch (size) {
-            case -1:
-                return "Objects";
-            case 0:
-                return "No objects";
-            case 1:
-                return "1 object";
-            default:
-                return size + " objects";
-            }
-        } else {
-            switch (size) {
-            case -1:
-                return elementSpecification.getPluralName();
-            case 0:
-                return "No " + elementSpecification.getPluralName();
-            case 1:
-                return "1 " + elementSpecification.getSingularName();
-            default:
-                return size + " " + elementSpecification.getPluralName();
-            }
-        }
-    }
-
-    private static String getDefaultTitle(ManagedObject managedObject) {
-        return "A" + (" " + managedObject.getSpecification().getSingularName()).toLowerCase();
-    }
-
-}
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 c8e1935..a7a9ac1 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
@@ -52,6 +52,7 @@ import org.apache.isis.core.metamodel.commons.ClassExtensions;
 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.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;
@@ -411,6 +412,125 @@ public final class ManagedObjects {
         return result;
     }
 
+    // -- UNSPECIFIED OBJECT
+
+    static final ManagedObject UNSPECIFIED = new ManagedObject() {
+
+        @Override
+        public ObjectSpecification getSpecification() {
+            throw _Exceptions.unsupportedOperation();
+        }
+
+        @Override
+        public Object getPojo() {
+            return null;
+        }
+
+        @Override
+        public Optional<Bookmark> getBookmark() {
+            return Optional.empty();
+        }
+
+        @Override
+        public boolean isBookmarkMemoized() {
+            return false;
+        }
+
+    };
+
+    // -- TITLE UTILITIES
+
+    @UtilityClass
+    static final class TitleUtil {
+
+        // -- TITLE SUPPORT
+
+        String titleString(
+                final @Nullable ManagedObject managedObject,
+                final @NonNull Predicate<ManagedObject> isContextAdapter) {
+
+            if(!ManagedObjects.isSpecified(managedObject)) {
+                return "unspecified object";
+            }
+
+            if (managedObject.getSpecification().isParentedOrFreeCollection()) {
+                final CollectionFacet facet = managedObject.getSpecification().getFacet(CollectionFacet.class);
+                return collectionTitleString(managedObject, facet);
+            } else {
+                return objectTitleString(managedObject, isContextAdapter);
+            }
+        }
+
+        // -- HELPER
+
+        private String objectTitleString(final ManagedObject managedObject, final Predicate<ManagedObject> isContextAdapter) {
+            if (managedObject.getPojo() instanceof String) {
+                return (String) managedObject.getPojo();
+            }
+            val spec = managedObject.getSpecification();
+            return Optional.ofNullable(spec.getTitle(isContextAdapter, managedObject))
+                    .orElseGet(()->getDefaultTitle(managedObject));
+        }
+
+        private String collectionTitleString(final ManagedObject managedObject, final CollectionFacet facet) {
+            final int size = facet.size(managedObject);
+            final ObjectSpecification elementSpecification = managedObject.getElementSpecification().orElse(null);
+            if (elementSpecification == null || elementSpecification.getFullIdentifier().equals(Object.class.getName())) {
+                switch (size) {
+                case -1:
+                    return "Objects";
+                case 0:
+                    return "No objects";
+                case 1:
+                    return "1 object";
+                default:
+                    return size + " objects";
+                }
+            } else {
+                switch (size) {
+                case -1:
+                    return elementSpecification.getPluralName();
+                case 0:
+                    return "No " + elementSpecification.getPluralName();
+                case 1:
+                    return "1 " + elementSpecification.getSingularName();
+                default:
+                    return size + " " + elementSpecification.getPluralName();
+                }
+            }
+        }
+
+        private String getDefaultTitle(final ManagedObject managedObject) {
+            return "A" + (" " + managedObject.getSpecification().getSingularName()).toLowerCase();
+        }
+    }
+
+    // -- BOOKMARK UTILITIES
+
+    @UtilityClass
+    static final class BookmarkUtil {
+
+        Optional<Bookmark> bookmark(final @Nullable ManagedObject adapter) {
+
+            if(!ManagedObjects.isIdentifiable(adapter)
+                    && ManagedObjects.isSpecified(adapter)) {
+                log.warn("about to create a random UUID bookmark for {}; this is probably an invalid code-path taken (TODO)",
+                        adapter.getSpecification());
+            }
+
+            return ManagedObjects.spec(adapter)
+                    .map(ObjectSpecification::getMetaModelContext)
+                    .map(MetaModelContext::getObjectManager)
+                    .map(objectManager->objectManager.bookmarkObject(adapter));
+
+    //TODO[2686] strictly forbid dummy UUID bookmark creation
+//            return ManagedObjects.isIdentifiable(adapter)
+//                    ? objectManager(adapter)
+//                            .map(objectManager->objectManager.bookmarkObject(adapter))
+//                    : Optional.empty();
+        }
+    }
+
     // -- ENTITY UTILITIES
 
     @UtilityClass
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/ObjectSpecification.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/ObjectSpecification.java
index cf12d39..7f47fc0 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/ObjectSpecification.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/ObjectSpecification.java
@@ -46,6 +46,7 @@ import org.apache.isis.core.metamodel.facetapi.FacetHolder;
 import org.apache.isis.core.metamodel.facets.all.described.DescribedAsFacet;
 import org.apache.isis.core.metamodel.facets.all.help.HelpFacet;
 import org.apache.isis.core.metamodel.facets.all.hide.HiddenFacet;
+import org.apache.isis.core.metamodel.facets.all.i8n.HasTranslation;
 import org.apache.isis.core.metamodel.facets.all.i8n.NounForm;
 import org.apache.isis.core.metamodel.facets.all.named.NamedFacet;
 import org.apache.isis.core.metamodel.facets.collections.CollectionFacet;
@@ -166,19 +167,20 @@ extends
 
     /**
      * Returns the (singular) name for objects of this specification.
-     *
      * <p>
-     * Corresponds to the {@link NamedFacet#translated(NounForm)} of {@link NamedFacet}; is
+     * Corresponds to the {@link HasTranslation#translated(NounForm)}
+     * with {@link NounForm#SINGULAR}
+     * of {@link NamedFacet}; is
      * not necessarily immutable.
      */
     String getSingularName();
 
     /**
      * Returns the plural name for objects of this specification.
-     *
-     * <p>
-     * Corresponds to the {@link PluralFacet#value() value} of
-     * {@link PluralFacet}; is not necessarily immutable.
+     * Corresponds to the {@link HasTranslation#translated(NounForm)}
+     * with {@link NounForm#PLURAL}
+     * of {@link NamedFacet}; is
+     * not necessarily immutable.
      */
     String getPluralName();
 
@@ -186,7 +188,7 @@ extends
      * Returns the description, if any, of the specification.
      *
      * <p>
-     * Corresponds to the {@link DescribedAsFacet#translated() value} of
+     * Corresponds to the {@link HasTranslation#preferredTranslated() value} of
      * {@link DescribedAsFacet}; is not necessarily immutable.
      */
     @Override