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/29 06:01:50 UTC
[isis] 01/06: 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-2733
in repository https://gitbox.apache.org/repos/asf/isis.git
commit a14037633ad506c7b754f31125c1a5a8067855e5
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.
(cherry picked from commit 4235fcf6dcb1f2a5edc1ff46d57176b41afd8cd2)
(cherry picked from commit 6a39aae328fbcb34b1b64d773bf1d9ae6ef84c61)
---
.../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;