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/11/10 15:03:59 UTC

[isis] branch master updated: ISIS-2889: don't use EncodableFacet on value-types

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 3b9ea47  ISIS-2889: don't use EncodableFacet on value-types
3b9ea47 is described below

commit 3b9ea47d80b5d443c568df396cf349ab2c51f23c
Author: Andi Huber <ah...@apache.org>
AuthorDate: Wed Nov 10 16:03:50 2021 +0100

    ISIS-2889: don't use EncodableFacet on value-types
    
    - fixes JSON rendering of AsciiDoc
---
 .../semantics/AsciiDocValueSemantics.java          | 18 +++++++++--
 .../rendering/domainobjects/JsonValueEncoder.java  | 37 ++++++++++++++--------
 .../domainobjects/ObjectPropertyReprRenderer.java  |  8 ++++-
 3 files changed, 46 insertions(+), 17 deletions(-)

diff --git a/valuetypes/asciidoc/metamodel/src/main/java/org/apache/isis/valuetypes/asciidoc/metamodel/semantics/AsciiDocValueSemantics.java b/valuetypes/asciidoc/metamodel/src/main/java/org/apache/isis/valuetypes/asciidoc/metamodel/semantics/AsciiDocValueSemantics.java
index 133e615..e457924 100644
--- a/valuetypes/asciidoc/metamodel/src/main/java/org/apache/isis/valuetypes/asciidoc/metamodel/semantics/AsciiDocValueSemantics.java
+++ b/valuetypes/asciidoc/metamodel/src/main/java/org/apache/isis/valuetypes/asciidoc/metamodel/semantics/AsciiDocValueSemantics.java
@@ -22,9 +22,10 @@ import javax.inject.Named;
 
 import org.springframework.stereotype.Component;
 
-import org.apache.isis.applib.adapters.ValueSemanticsAbstract;
+import org.apache.isis.applib.adapters.EncoderDecoder;
 import org.apache.isis.applib.adapters.Parser;
 import org.apache.isis.applib.adapters.Renderer;
+import org.apache.isis.applib.adapters.ValueSemanticsAbstract;
 import org.apache.isis.applib.adapters.ValueSemanticsProvider;
 import org.apache.isis.schema.common.v2.ValueType;
 import org.apache.isis.valuetypes.asciidoc.applib.value.AsciiDoc;
@@ -35,7 +36,8 @@ public class AsciiDocValueSemantics
 extends ValueSemanticsAbstract<AsciiDoc>
 implements
     Renderer<AsciiDoc>,
-    Parser<AsciiDoc> {
+    Parser<AsciiDoc>,
+    EncoderDecoder<AsciiDoc> {
 
     @Override
     public Class<AsciiDoc> getCorrespondingClass() {
@@ -71,4 +73,16 @@ implements
         return 0;
     }
 
+    // -- ENCODER DECODER
+
+    @Override
+    public String toEncodedString(final AsciiDoc adoc) {
+        return parseableTextRepresentation(null, adoc);
+    }
+
+    @Override
+    public AsciiDoc fromEncodedString(final String encodedString) {
+        return AsciiDoc.valueOf(encodedString);
+    }
+
 }
diff --git a/viewers/restfulobjects/rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/domainobjects/JsonValueEncoder.java b/viewers/restfulobjects/rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/domainobjects/JsonValueEncoder.java
index 707c8e2..daf1c4a 100644
--- a/viewers/restfulobjects/rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/domainobjects/JsonValueEncoder.java
+++ b/viewers/restfulobjects/rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/domainobjects/JsonValueEncoder.java
@@ -25,7 +25,6 @@ import javax.annotation.PostConstruct;
 import javax.annotation.Priority;
 import javax.inject.Inject;
 import javax.inject.Named;
-import javax.inject.Singleton;
 
 import com.fasterxml.jackson.databind.node.NullNode;
 
@@ -33,13 +32,15 @@ import org.springframework.beans.factory.annotation.Qualifier;
 import org.springframework.lang.Nullable;
 import org.springframework.stereotype.Service;
 
+import org.apache.isis.applib.adapters.EncoderDecoder;
 import org.apache.isis.applib.annotation.PriorityPrecedence;
 import org.apache.isis.applib.exceptions.recoverable.TextEntryParseException;
 import org.apache.isis.commons.collections.Can;
 import org.apache.isis.commons.internal.collections._Maps;
-import org.apache.isis.commons.internal.exceptions._Exceptions;
 import org.apache.isis.core.metamodel.facets.object.encodeable.EncodableFacet;
+import org.apache.isis.core.metamodel.facets.object.value.ValueFacet;
 import org.apache.isis.core.metamodel.spec.ManagedObject;
+import org.apache.isis.core.metamodel.spec.ManagedObjects;
 import org.apache.isis.core.metamodel.spec.ObjectSpecification;
 import org.apache.isis.core.metamodel.specloader.SpecificationLoader;
 import org.apache.isis.viewer.restfulobjects.applib.JsonRepresentation;
@@ -47,7 +48,7 @@ import org.apache.isis.viewer.restfulobjects.applib.JsonRepresentation;
 import lombok.Getter;
 import lombok.NonNull;
 import lombok.val;
-
+import lombok.extern.log4j.Log4j2;
 
 /**
  * Similar to Isis' value encoding, but with additional support for JSON
@@ -57,7 +58,7 @@ import lombok.val;
 @Named("isis.viewer.ro.JsonValueEncoder")
 @Priority(PriorityPrecedence.EARLY)
 @Qualifier("Default")
-@Singleton
+@Log4j2
 public class JsonValueEncoder {
 
     @Inject private SpecificationLoader specificationLoader;
@@ -141,16 +142,24 @@ public class JsonValueEncoder {
         if(jsonValueConverter != null) {
             return jsonValueConverter.appendValueAndFormat(objectAdapter, format, repr, suppressExtensions);
         } else {
-            val encodableFacet = objectSpecification.getFacet(EncodableFacet.class);
-            if (encodableFacet == null) {
-                throw _Exceptions.illegalArgument(
-                        "objectSpec '%s' expected to have EncodableFacet "
-                        + "or a registered JsonValueConverter",
-                        objectSpecification.getLogicalTypeName());
-            }
-            Object value = objectAdapter != null
-                    ? encodableFacet.toEncodedString(objectAdapter)
-                            : NullNode.getInstance();
+
+            final Object value = ManagedObjects.isNullOrUnspecifiedOrEmpty(objectAdapter)
+                    ? NullNode.getInstance()
+                    : objectSpecification.lookupFacet(ValueFacet.class)
+                        .<EncoderDecoder>flatMap(ValueFacet::selectDefaultEncoderDecoder)
+                        .<Object>map(codec->
+                            codec.toEncodedString(objectAdapter.getPojo()))
+                        .orElseGet(()->{
+                            log.warn("{Could not resolve an EncoderDecoder for {}, "
+                                    + "falling back to rendering as 'null'. "
+                                    + "Make sure the framework has access to a ValueSemanticsProvider<{}> "
+                                    + "that implements EncoderDecoder<{}>}",
+                                    objectSpecification.getLogicalTypeName(),
+                                    objectSpecification.getCorrespondingClass().getSimpleName(),
+                                    objectSpecification.getCorrespondingClass().getSimpleName());
+                            return NullNode.getInstance();
+                        });
+
             repr.mapPut("value", value);
             appendFormats(repr, "string", "string", suppressExtensions);
             return value;
diff --git a/viewers/restfulobjects/rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/domainobjects/ObjectPropertyReprRenderer.java b/viewers/restfulobjects/rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/domainobjects/ObjectPropertyReprRenderer.java
index fbb15dd..c469200 100644
--- a/viewers/restfulobjects/rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/domainobjects/ObjectPropertyReprRenderer.java
+++ b/viewers/restfulobjects/rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/domainobjects/ObjectPropertyReprRenderer.java
@@ -117,7 +117,13 @@ extends AbstractObjectMemberReprRenderer<OneToOneAssociation> {
                 // look for facet on member, else on the value's spec
                 format = String.format("big-integer");
             }
-            return jsonValueEncoder.appendValueAndFormat(valueAdapterIfAny, spec, representation, format, resourceContext.suppressMemberExtensions());
+            return jsonValueEncoder
+                    .appendValueAndFormat(
+                            valueAdapterIfAny,
+                            spec,
+                            representation,
+                            format,
+                            resourceContext.suppressMemberExtensions());
         }
 
         boolean eagerlyRender =