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 =