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/08/29 08:16:07 UTC

[isis] branch master updated: ISIS-3167: further prepare removal of lazy specs in ManagedObject

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 122b4e914a ISIS-3167: further prepare removal of lazy specs in ManagedObject
122b4e914a is described below

commit 122b4e914aee375ccc22dfa89e4a95ae27d11160
Author: Andi Huber <ah...@apache.org>
AuthorDate: Mon Aug 29 10:15:58 2022 +0200

    ISIS-3167: further prepare removal of lazy specs in ManagedObject
---
 .../_testing/MetaModelContext_forTesting.java      |  4 +++-
 .../context/MetaModelContext_usingIoc.java         |  8 +++++--
 .../isis/core/metamodel/object/ManagedObjects.java |  3 +++
 .../runtimeservices/memento/_ObjectMemento.java    | 22 ++++++++++---------
 .../xmlsnapshot/XmlSnapshotBuilder.java            | 25 ++++++++++++++++------
 5 files changed, 42 insertions(+), 20 deletions(-)

diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/_testing/MetaModelContext_forTesting.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/_testing/MetaModelContext_forTesting.java
index 18973bef07..d8b0dae0d9 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/_testing/MetaModelContext_forTesting.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/_testing/MetaModelContext_forTesting.java
@@ -507,7 +507,9 @@ implements MetaModelContext {
         if(ProgrammingModelConstants.TypeVetoMarker.anyMatchOn(managedBeanAdapter.getBeanClass())) {
             return Optional.empty();
         }
-        return Optional.of(ManagedObject.lazy(getSpecificationLoader(), servicePojo));
+        return getSpecificationLoader()
+            .specForType(servicePojo.getClass())
+            .map(serviceSpec->ManagedObject.service(serviceSpec, servicePojo));
     }
 
     // -- RECURSIVE INITIALIZATION FIX
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/context/MetaModelContext_usingIoc.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/context/MetaModelContext_usingIoc.java
index d54c633833..4660ff3c77 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/context/MetaModelContext_usingIoc.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/context/MetaModelContext_usingIoc.java
@@ -183,8 +183,12 @@ class MetaModelContext_usingIoc implements MetaModelContext {
                 .orElseThrow(()->_Exceptions.unrecoverable(
                         "Cannot get service instance of type '%s'",
                         managedBeanAdapter.getBeanClass()));
-
-        return ManagedObject.lazy(getSpecificationLoader(), servicePojo);
+        return getSpecificationLoader()
+                .specForType(servicePojo.getClass())
+                .map(serviceSpec->ManagedObject.service(serviceSpec, servicePojo))
+                .orElseThrow(()->_Exceptions.unrecoverable(
+                        "Cannot wrap vetoed service of type '%s'",
+                        managedBeanAdapter.getBeanClass()));
     }
 
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/object/ManagedObjects.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/object/ManagedObjects.java
index 8623d56a1e..977e275cba 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/object/ManagedObjects.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/object/ManagedObjects.java
@@ -343,7 +343,10 @@ public final class ManagedObjects {
     /**
      * Optionally the common {@link ObjectSpecification} based on whether provided {@code objects}
      * have any at all.
+     * @deprecated this is a hack - the MM has strict type-of metadata for non-scalars,
+     * resorting to runtime introspection does not conform with our design decisions
      */
+    @Deprecated
     public static Optional<ObjectSpecification> commonSpecification(
             final @Nullable Can<ManagedObject> objects) {
 
diff --git a/core/runtimeservices/src/main/java/org/apache/isis/core/runtimeservices/memento/_ObjectMemento.java b/core/runtimeservices/src/main/java/org/apache/isis/core/runtimeservices/memento/_ObjectMemento.java
index bc151d117c..f15aa0204a 100644
--- a/core/runtimeservices/src/main/java/org/apache/isis/core/runtimeservices/memento/_ObjectMemento.java
+++ b/core/runtimeservices/src/main/java/org/apache/isis/core/runtimeservices/memento/_ObjectMemento.java
@@ -31,7 +31,6 @@ import org.apache.isis.applib.id.LogicalType;
 import org.apache.isis.applib.services.bookmark.Bookmark;
 import org.apache.isis.applib.services.bookmark.Oid;
 import org.apache.isis.applib.services.hint.HintIdProvider;
-import org.apache.isis.commons.collections.Can;
 import org.apache.isis.commons.internal.base._Casts;
 import org.apache.isis.commons.internal.base._NullSafe;
 import org.apache.isis.commons.internal.exceptions._Exceptions;
@@ -123,15 +122,18 @@ final class _ObjectMemento implements HasLogicalType, Serializable {
                     final _ObjectMemento memento,
                     final MetaModelContext mmc) {
 
-                final Can<ManagedObject> managedObjects =
-                        _NullSafe.stream(memento.list)
-                        .map(Functions.toManagedObject(mmc))
-                        .collect(Can.toCan());
-
-                val commonSpec = ManagedObjects.commonSpecification(managedObjects)
-                        .orElseGet(()->mmc.getSpecificationLoader().loadSpecification(Object.class));
-
-                return ManagedObject.packed(commonSpec, managedObjects);
+                // I believe this code path is no longer reachable
+                throw _Exceptions.unexpectedCodeReach();
+
+//                final Can<ManagedObject> managedObjects =
+//                        _NullSafe.stream(memento.list)
+//                        .map(Functions.toManagedObject(mmc))
+//                        .collect(Can.toCan());
+//
+//                val commonSpec = ManagedObjects.commonSpecification(managedObjects)
+//                        .orElseGet(()->mmc.getSpecificationLoader().loadSpecification(Object.class));
+//
+//                return ManagedObject.packed(commonSpec, managedObjects);
             }
 
             @Override
diff --git a/core/runtimeservices/src/main/java/org/apache/isis/core/runtimeservices/xmlsnapshot/XmlSnapshotBuilder.java b/core/runtimeservices/src/main/java/org/apache/isis/core/runtimeservices/xmlsnapshot/XmlSnapshotBuilder.java
index 675c86a8b5..ac1bae20da 100644
--- a/core/runtimeservices/src/main/java/org/apache/isis/core/runtimeservices/xmlsnapshot/XmlSnapshotBuilder.java
+++ b/core/runtimeservices/src/main/java/org/apache/isis/core/runtimeservices/xmlsnapshot/XmlSnapshotBuilder.java
@@ -20,28 +20,37 @@ package org.apache.isis.core.runtimeservices.xmlsnapshot;
 
 import java.util.List;
 
+import org.springframework.lang.Nullable;
+
 import org.apache.isis.commons.internal.collections._Lists;
 import org.apache.isis.core.metamodel.object.ManagedObject;
 import org.apache.isis.core.metamodel.specloader.SpecificationLoader;
 import org.apache.isis.core.metamodel.util.snapshot.XmlSchema;
 import org.apache.isis.core.metamodel.util.snapshot.XmlSnapshot;
 
+import lombok.NonNull;
 import lombok.RequiredArgsConstructor;
 
 /**
- * Builds an {@link XmlSnapshot} using a fluent use through a builder:
+ * Builds a {@link XmlSnapshot} fluently with a builder:
  *
  * <pre>
- * XmlSnapshot snapshot = XmlSnapshotBuilder.create(customer).includePath(&quot;placeOfBirth&quot;).includePath(&quot;orders/product&quot;).build();
+ * XmlSnapshot snapshot = XmlSnapshotBuilder
+ *     .create(customer)
+ *     .includePath(&quot;placeOfBirth&quot;)
+ *     .includePath(&quot;orders/product&quot;)
+ *     .build();
  * Element customerAsXml = snapshot.toXml();
  * </pre>
  */
 @RequiredArgsConstructor
 public class XmlSnapshotBuilder {
 
-    private final SpecificationLoader specificationLoader;
-    private final Object domainObject;
-    private XmlSchema schema;
+    private final @NonNull SpecificationLoader specificationLoader;
+
+    /** required, must also be a scalar */
+    private final @NonNull Object domainObject;
+    private @Nullable XmlSchema schema;
 
     static class PathAndAnnotation {
         public PathAndAnnotation(final String path, final String annotation) {
@@ -70,8 +79,10 @@ public class XmlSnapshotBuilder {
     }
 
     public XmlSnapshot build() {
-        final ManagedObject adapter = ManagedObject.lazy(specificationLoader, domainObject);
-        final XmlSnapshot snapshot = (schema != null) ? new XmlSnapshot(adapter, schema) : new XmlSnapshot(adapter);
+        final ManagedObject adapter = ManagedObject.wrapScalar(specificationLoader, domainObject);
+        final XmlSnapshot snapshot = (schema != null)
+                ? new XmlSnapshot(adapter, schema)
+                : new XmlSnapshot(adapter);
         for (final XmlSnapshotBuilder.PathAndAnnotation paa : paths) {
             if (paa.annotation != null) {
                 snapshot.include(paa.path, paa.annotation);