You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@isis.apache.org by da...@apache.org on 2021/06/28 18:37:20 UTC

[isis] 01/01: ISIS-2779: adds bookmarkers and loaders for serializable view models.

This is an automated email from the ASF dual-hosted git repository.

danhaywood pushed a commit to branch ISIS-2779
in repository https://gitbox.apache.org/repos/asf/isis.git

commit 3f77d87569d9d1f7cfd6df45208b06c811ff271b
Author: danhaywood <da...@haywood-associates.co.uk>
AuthorDate: Mon Jun 28 19:36:40 2021 +0100

    ISIS-2779: adds bookmarkers and loaders for serializable view models.
---
 .../objectmanager/identify/ObjectBookmarker.java   |  1 +
 .../identify/ObjectBookmarker_builtinHandlers.java | 30 ++++++++++++++++--
 .../metamodel/objectmanager/load/ObjectLoader.java |  1 +
 .../load/ObjectLoader_builtinHandlers.java         | 37 ++++++++++++++++++++++
 4 files changed, 67 insertions(+), 2 deletions(-)

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
index 5cc6b12..8addc57 100644
--- 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
@@ -46,6 +46,7 @@ public interface ObjectBookmarker {
                 new ObjectBookmarker_builtinHandlers.GuardAgainstOid(),
                 new ObjectBookmarker_builtinHandlers.BookmarkForServices(),
                 new ObjectBookmarker_builtinHandlers.BookmarkForValues(),
+                new ObjectBookmarker_builtinHandlers.BookmarkForSerializable(),
                 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
index a910832..bc22d18 100644
--- 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
@@ -18,10 +18,15 @@
  */
 package org.apache.isis.core.metamodel.objectmanager.identify;
 
+import java.io.ByteArrayOutputStream;
+import java.io.ObjectOutputStream;
+import java.nio.charset.StandardCharsets;
 import java.util.UUID;
 
 import org.apache.isis.applib.services.bookmark.Bookmark;
 import org.apache.isis.applib.services.bookmark.Oid;
+import org.apache.isis.commons.internal.base._Bytes;
+import org.apache.isis.commons.internal.base._Strings;
 import org.apache.isis.commons.internal.exceptions._Exceptions;
 import org.apache.isis.core.metamodel.facets.object.entity.EntityFacet;
 import org.apache.isis.core.metamodel.facets.object.value.ValueFacet;
@@ -29,6 +34,7 @@ import org.apache.isis.core.metamodel.facets.object.viewmodel.ViewModelFacet;
 import org.apache.isis.core.metamodel.objectmanager.identify.ObjectBookmarker.Handler;
 import org.apache.isis.core.metamodel.spec.ManagedObject;
 
+import lombok.SneakyThrows;
 import lombok.val;
 
 class ObjectBookmarker_builtinHandlers {
@@ -110,6 +116,28 @@ class ObjectBookmarker_builtinHandlers {
 
     }
 
+    static class BookmarkForSerializable implements Handler {
+
+        @Override
+        public boolean isHandling(ManagedObject managedObject) {
+            val spec = managedObject.getSpecification();
+            return spec.isViewModel() && java.io.Serializable.class.isAssignableFrom(spec.getCorrespondingClass());
+        }
+
+        @SneakyThrows
+        @Override
+        public Bookmark handle(ManagedObject managedObject) {
+            val spec = managedObject.getSpecification();
+            val baos = new ByteArrayOutputStream();
+            val oos = new ObjectOutputStream(baos);
+            oos.writeObject(managedObject.getPojo());
+            val identifier = _Strings.ofBytes(_Bytes.asUrlBase64.apply(baos.toByteArray()), StandardCharsets.UTF_8);
+            oos.close();
+            return Bookmark.forLogicalTypeAndIdentifier(spec.getLogicalType(), identifier);
+        }
+
+    }
+
     static class BookmarkForViewModels implements Handler {
 
         @Override
@@ -140,8 +168,6 @@ class ObjectBookmarker_builtinHandlers {
             val identifier = UUID.randomUUID().toString();
             return Bookmark.forLogicalTypeAndIdentifier(spec.getLogicalType(), identifier);
         }
-
     }
 
-
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/objectmanager/load/ObjectLoader.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/objectmanager/load/ObjectLoader.java
index 69a824e..536818a 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/objectmanager/load/ObjectLoader.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/objectmanager/load/ObjectLoader.java
@@ -62,6 +62,7 @@ public interface ObjectLoader {
                 new ObjectLoader_builtinHandlers.GuardAgainstNull(mmc),
                 new ObjectLoader_builtinHandlers.LoadService(mmc),
                 new ObjectLoader_builtinHandlers.LoadValue(mmc),
+                new ObjectLoader_builtinHandlers.LoadSerializable(mmc),
                 new ObjectLoader_builtinHandlers.LoadViewModel(mmc),
                 new ObjectLoader_builtinHandlers.LoadEntity(mmc),
                 new ObjectLoader_builtinHandlers.LoadOther(mmc));
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/objectmanager/load/ObjectLoader_builtinHandlers.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/objectmanager/load/ObjectLoader_builtinHandlers.java
index 1d2b680..1611c34 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/objectmanager/load/ObjectLoader_builtinHandlers.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/objectmanager/load/ObjectLoader_builtinHandlers.java
@@ -18,10 +18,15 @@
  */
 package org.apache.isis.core.metamodel.objectmanager.load;
 
+import java.io.ByteArrayInputStream;
+import java.io.ObjectInputStream;
 import java.lang.reflect.Array;
 import java.lang.reflect.Modifier;
+import java.nio.charset.StandardCharsets;
 
 import org.apache.isis.commons.collections.Can;
+import org.apache.isis.commons.internal.base._Bytes;
+import org.apache.isis.commons.internal.base._Strings;
 import org.apache.isis.commons.internal.exceptions._Exceptions;
 import org.apache.isis.commons.internal.ioc._ManagedBeanAdapter;
 import org.apache.isis.core.metamodel.context.MetaModelContext;
@@ -31,6 +36,7 @@ import org.apache.isis.core.metamodel.spec.ManagedObject;
 import org.apache.isis.core.metamodel.spec.ObjectSpecification;
 
 import lombok.NonNull;
+import lombok.SneakyThrows;
 import lombok.Value;
 import lombok.val;
 
@@ -136,6 +142,37 @@ final class ObjectLoader_builtinHandlers {
     // -- VIEW MODELS
 
     @Value
+    public static class LoadSerializable implements ObjectLoader.Handler {
+
+        private final @NonNull MetaModelContext metaModelContext;
+
+        @Override
+        public boolean isHandling(final ObjectLoader.Request objectLoadRequest) {
+
+            val spec = objectLoadRequest.getObjectSpecification();
+            return spec.isViewModel()
+                   && java.io.Serializable.class.isAssignableFrom(spec.getCorrespondingClass());
+        }
+
+        @SneakyThrows
+        @Override
+        public ManagedObject handle(final ObjectLoader.Request objectLoadRequest) {
+
+            val spec = objectLoadRequest.getObjectSpecification();
+
+            val memento = objectLoadRequest.getObjectIdentifier();
+            val bytes = _Bytes.ofUrlBase64.apply(_Strings.toBytes(memento, StandardCharsets.UTF_8));
+            val ois = new ObjectInputStream(new ByteArrayInputStream(bytes));
+            val viewModelPojo = ois.readObject();
+            ois.close();
+            metaModelContext.getServiceInjector().injectServicesInto(viewModelPojo);
+
+            return ManagedObject.of(spec, viewModelPojo);
+        }
+
+    }
+
+    @Value
     public static class LoadViewModel implements ObjectLoader.Handler {
 
         private final @NonNull MetaModelContext metaModelContext;