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/19 06:17:16 UTC

[isis] branch master updated: ISIS-3127: [RO] simplify JsonValueConverter

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 7095441fc3 ISIS-3127: [RO] simplify JsonValueConverter
7095441fc3 is described below

commit 7095441fc3542df99c28e03bda69a682ed0907a5
Author: andi-huber <ah...@apache.org>
AuthorDate: Fri Aug 19 08:17:07 2022 +0200

    ISIS-3127: [RO] simplify JsonValueConverter
---
 .../domainobjects/JsonValueConverter.java          | 101 +++++++++++
 ...er_Converters.java => JsonValueConverters.java} | 188 ++++++++++-----------
 .../rendering/domainobjects/JsonValueEncoder.java  |  62 +------
 3 files changed, 194 insertions(+), 157 deletions(-)

diff --git a/viewers/restfulobjects/rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/domainobjects/JsonValueConverter.java b/viewers/restfulobjects/rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/domainobjects/JsonValueConverter.java
new file mode 100644
index 0000000000..b081babb2d
--- /dev/null
+++ b/viewers/restfulobjects/rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/domainobjects/JsonValueConverter.java
@@ -0,0 +1,101 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ */
+package org.apache.isis.viewer.restfulobjects.rendering.domainobjects;
+
+import com.fasterxml.jackson.databind.node.NullNode;
+
+import org.springframework.lang.Nullable;
+
+import org.apache.isis.commons.collections.Can;
+import org.apache.isis.core.metamodel.spec.ManagedObject;
+import org.apache.isis.viewer.restfulobjects.applib.JsonRepresentation;
+
+import lombok.Getter;
+
+public interface JsonValueConverter {
+
+    /**
+     * The value as pojo, otherwise <tt>null</tt>.
+     */
+    @Nullable
+    Object recoverValueAsPojo(JsonRepresentation repr, String format);
+
+    Object asObject(ManagedObject objectAdapter, String format);
+
+    Object appendValueAndFormat(
+            final ManagedObject objectAdapter,
+            final String formatOverride,
+            final JsonRepresentation repr,
+            final boolean suppressExtensions);
+
+    Can<Class<?>> getClasses();
+
+    static abstract class Abstract implements JsonValueConverter {
+        protected final String format;
+        protected final String xIsisFormat;
+
+        @Getter private final Can<Class<?>> classes;
+
+        public Abstract(final String format, final String xIsisFormat, final Class<?>... classes) {
+            this.format = format;
+            this.xIsisFormat = xIsisFormat;
+            this.classes = Can.ofArray(classes);
+        }
+
+        @Override
+        public Object appendValueAndFormat(
+                final ManagedObject objectAdapter,
+                final String formatOverride,
+                final JsonRepresentation repr,
+                final boolean suppressExtensions) {
+
+            final Object value = unwrapAsObjectElseNullNode(objectAdapter);
+            repr.mapPut("value", value);
+            appendFormats(repr, effectiveFormat(formatOverride), this.xIsisFormat, suppressExtensions);
+            return value;
+        }
+
+        @Override
+        public final Object asObject(final ManagedObject objectAdapter, final String format) {
+            return objectAdapter.getPojo();
+        }
+
+        protected final String effectiveFormat(final String formatOverride) {
+            return formatOverride!=null ? formatOverride : this.format;
+        }
+
+        static Object unwrapAsObjectElseNullNode(final ManagedObject adapter) {
+            return adapter != null? adapter.getPojo(): NullNode.getInstance();
+        }
+
+        static void appendFormats(
+                final JsonRepresentation repr,
+                final String format,
+                final String xIsisFormat,
+                final boolean suppressExtensions) {
+            if(format != null) {
+                repr.mapPutString("format", format);
+            }
+            if(!suppressExtensions && xIsisFormat != null) {
+                repr.mapPutString("extensions.x-isis-format", xIsisFormat);
+            }
+        }
+    }
+
+}
diff --git a/viewers/restfulobjects/rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/domainobjects/JsonValueEncoder_Converters.java b/viewers/restfulobjects/rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/domainobjects/JsonValueConverters.java
similarity index 75%
rename from viewers/restfulobjects/rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/domainobjects/JsonValueEncoder_Converters.java
rename to viewers/restfulobjects/rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/domainobjects/JsonValueConverters.java
index 29a9f21485..9b9c28a942 100644
--- a/viewers/restfulobjects/rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/domainobjects/JsonValueEncoder_Converters.java
+++ b/viewers/restfulobjects/rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/domainobjects/JsonValueConverters.java
@@ -22,7 +22,6 @@ import java.math.BigDecimal;
 import java.math.BigInteger;
 import java.util.Arrays;
 import java.util.List;
-import java.util.function.Function;
 
 import org.joda.time.DateTime;
 import org.joda.time.LocalDate;
@@ -34,7 +33,6 @@ import org.joda.time.format.ISODateTimeFormat;
 import org.apache.isis.commons.internal.collections._Lists;
 import org.apache.isis.core.metamodel.spec.ManagedObject;
 import org.apache.isis.viewer.restfulobjects.applib.JsonRepresentation;
-import org.apache.isis.viewer.restfulobjects.rendering.domainobjects.JsonValueEncoder.JsonValueConverter;
 
 import lombok.val;
 
@@ -42,17 +40,17 @@ import lombok.val;
  * Similar to Isis' value encoding, but with additional support for JSON
  * primitives.
  */
-public final class JsonValueEncoder_Converters {
+public final class JsonValueConverters {
 
-    public List<JsonValueConverter> asList(final Function<Object, ManagedObject> pojoToAdapter) {
+    public List<JsonValueConverter> asList() {
 
         val converters = _Lists.<JsonValueConverter>newArrayList();
 
-        converters.add(new JsonValueConverter(null, "string", String.class){
+        converters.add(new JsonValueConverter.Abstract(null, "string", String.class){
             @Override
-            public ManagedObject asAdapter(final JsonRepresentation repr, final String format) {
+            public Object recoverValueAsPojo(final JsonRepresentation repr, final String format) {
                 if (repr.isString()) {
-                    return pojoToAdapter.apply(repr.asString());
+                    return repr.asString();
                 }
                 return null;
             }
@@ -69,11 +67,11 @@ public final class JsonValueEncoder_Converters {
             }
         });
 
-        converters.add(new JsonValueConverter(null, "boolean", boolean.class, Boolean.class){
+        converters.add(new JsonValueConverter.Abstract(null, "boolean", boolean.class, Boolean.class){
             @Override
-            public ManagedObject asAdapter(final JsonRepresentation repr, final String format) {
+            public Object recoverValueAsPojo(final JsonRepresentation repr, final String format) {
                 if (repr.isBoolean()) {
-                    return pojoToAdapter.apply(repr.asBoolean());
+                    return repr.asBoolean();
                 }
                 return null;
             }
@@ -91,20 +89,20 @@ public final class JsonValueEncoder_Converters {
             }
         });
 
-        converters.add(new JsonValueConverter("int", "byte", byte.class, Byte.class){
+        converters.add(new JsonValueConverter.Abstract("int", "byte", byte.class, Byte.class){
             @Override
-            public ManagedObject asAdapter(final JsonRepresentation repr, final String format) {
+            public Object recoverValueAsPojo(final JsonRepresentation repr, final String format) {
                 if (repr.isNumber()) {
-                    return pojoToAdapter.apply(repr.asNumber().byteValue());
+                    return repr.asNumber().byteValue();
                 }
                 if (repr.isInt()) {
-                    return pojoToAdapter.apply((byte)(int)repr.asInt());
+                    return (byte)(int)repr.asInt();
                 }
                 if (repr.isLong()) {
-                    return pojoToAdapter.apply((byte)(long)repr.asLong());
+                    return (byte)(long)repr.asLong();
                 }
                 if (repr.isBigInteger()) {
-                    return pojoToAdapter.apply(repr.asBigInteger().byteValue());
+                    return repr.asBigInteger().byteValue();
                 }
                 return null;
             }
@@ -122,20 +120,20 @@ public final class JsonValueEncoder_Converters {
             }
         });
 
-        converters.add(new JsonValueConverter("int", "short", short.class, Short.class){
+        converters.add(new JsonValueConverter.Abstract("int", "short", short.class, Short.class){
             @Override
-            public ManagedObject asAdapter(final JsonRepresentation repr, final String format) {
+            public Object recoverValueAsPojo(final JsonRepresentation repr, final String format) {
                 if (repr.isNumber()) {
-                    return pojoToAdapter.apply(repr.asNumber().shortValue());
+                    return repr.asNumber().shortValue();
                 }
                 if (repr.isInt()) {
-                    return pojoToAdapter.apply((short)(int)repr.asInt());
+                    return (short)(int)repr.asInt();
                 }
                 if (repr.isLong()) {
-                    return pojoToAdapter.apply((short)(long)repr.asLong());
+                    return (short)(long)repr.asLong();
                 }
                 if (repr.isBigInteger()) {
-                    return pojoToAdapter.apply(repr.asBigInteger().shortValue());
+                    return repr.asBigInteger().shortValue();
                 }
                 return null;
             }
@@ -153,20 +151,20 @@ public final class JsonValueEncoder_Converters {
             }
         });
 
-        converters.add(new JsonValueConverter("int", "int", int.class, Integer.class){
+        converters.add(new JsonValueConverter.Abstract("int", "int", int.class, Integer.class){
             @Override
-            public ManagedObject asAdapter(final JsonRepresentation repr, final String format) {
+            public Object recoverValueAsPojo(final JsonRepresentation repr, final String format) {
                 if (repr.isInt()) {
-                    return pojoToAdapter.apply(repr.asInt());
+                    return repr.asInt();
                 }
                 if (repr.isLong()) {
-                    return pojoToAdapter.apply(repr.asLong().intValue());
+                    return repr.asLong().intValue();
                 }
                 if (repr.isBigInteger()) {
-                    return pojoToAdapter.apply(repr.asBigInteger().intValue());
+                    return repr.asBigInteger().intValue();
                 }
                 if (repr.isNumber()) {
-                    return pojoToAdapter.apply(repr.asNumber().intValue());
+                    return repr.asNumber().intValue();
                 }
                 return null;
             }
@@ -184,20 +182,20 @@ public final class JsonValueEncoder_Converters {
             }
         });
 
-        converters.add(new JsonValueConverter("int", "long", long.class, Long.class){
+        converters.add(new JsonValueConverter.Abstract("int", "long", long.class, Long.class){
             @Override
-            public ManagedObject asAdapter(final JsonRepresentation repr, final String format) {
+            public Object recoverValueAsPojo(final JsonRepresentation repr, final String format) {
                 if (repr.isLong()) {
-                    return pojoToAdapter.apply(repr.asLong());
+                    return repr.asLong();
                 }
                 if (repr.isInt()) {
-                    return pojoToAdapter.apply(repr.asLong());
+                    return repr.asLong();
                 }
                 if (repr.isBigInteger()) {
-                    return pojoToAdapter.apply(repr.asBigInteger().longValue());
+                    return repr.asBigInteger().longValue();
                 }
                 if (repr.isNumber()) {
-                    return pojoToAdapter.apply(repr.asNumber().longValue());
+                    return repr.asNumber().longValue();
                 }
                 return null;
             }
@@ -216,23 +214,23 @@ public final class JsonValueEncoder_Converters {
             }
         });
 
-        converters.add(new JsonValueConverter("decimal", "float", float.class, Float.class){
+        converters.add(new JsonValueConverter.Abstract("decimal", "float", float.class, Float.class){
             @Override
-            public ManagedObject asAdapter(final JsonRepresentation repr, final String format) {
+            public Object recoverValueAsPojo(final JsonRepresentation repr, final String format) {
                 if (repr.isDecimal()) {
-                    return pojoToAdapter.apply(repr.asDouble().floatValue());
+                    return repr.asDouble().floatValue();
                 }
                 if (repr.isNumber()) {
-                    return pojoToAdapter.apply(repr.asNumber().floatValue());
+                    return repr.asNumber().floatValue();
                 }
                 if (repr.isLong()) {
-                    return pojoToAdapter.apply(repr.asLong().floatValue());
+                    return repr.asLong().floatValue();
                 }
                 if (repr.isInt()) {
-                    return pojoToAdapter.apply(repr.asInt().floatValue());
+                    return repr.asInt().floatValue();
                 }
                 if (repr.isBigInteger()) {
-                    return pojoToAdapter.apply(repr.asBigInteger().floatValue());
+                    return repr.asBigInteger().floatValue();
                 }
                 return null;
             }
@@ -251,26 +249,26 @@ public final class JsonValueEncoder_Converters {
             }
         });
 
-        converters.add(new JsonValueConverter("decimal", "double", double.class, Double.class){
+        converters.add(new JsonValueConverter.Abstract("decimal", "double", double.class, Double.class){
             @Override
-            public ManagedObject asAdapter(final JsonRepresentation repr, final String format) {
+            public Object recoverValueAsPojo(final JsonRepresentation repr, final String format) {
                 if (repr.isDecimal()) {
-                    return pojoToAdapter.apply(repr.asDouble());
+                    return repr.asDouble();
                 }
                 if (repr.isLong()) {
-                    return pojoToAdapter.apply(repr.asLong().doubleValue());
+                    return repr.asLong().doubleValue();
                 }
                 if (repr.isInt()) {
-                    return pojoToAdapter.apply(repr.asInt().doubleValue());
+                    return repr.asInt().doubleValue();
                 }
                 if (repr.isBigInteger()) {
-                    return pojoToAdapter.apply(repr.asBigInteger().doubleValue());
+                    return repr.asBigInteger().doubleValue();
                 }
                 if (repr.isBigDecimal()) {
-                    return pojoToAdapter.apply(repr.asBigDecimal().doubleValue());
+                    return repr.asBigDecimal().doubleValue();
                 }
                 if (repr.isNumber()) {
-                    return pojoToAdapter.apply(repr.asNumber().doubleValue());
+                    return repr.asNumber().doubleValue();
                 }
                 return null;
             }
@@ -289,13 +287,13 @@ public final class JsonValueEncoder_Converters {
             }
         });
 
-        converters.add(new JsonValueConverter(null, "char", char.class, Character.class){
+        converters.add(new JsonValueConverter.Abstract(null, "char", char.class, Character.class){
             @Override
-            public ManagedObject asAdapter(final JsonRepresentation repr, final String format) {
+            public Object recoverValueAsPojo(final JsonRepresentation repr, final String format) {
                 if (repr.isString()) {
                     final String str = repr.asString();
                     if(str != null && str.length()>0) {
-                        return pojoToAdapter.apply(str.charAt(0));
+                        return str.charAt(0);
                     }
                 }
                 // in case a char literal was provided
@@ -303,7 +301,7 @@ public final class JsonValueEncoder_Converters {
                     final Integer x = repr.asInt();
                     if(Character.MIN_VALUE <= x && x <= Character.MAX_VALUE) {
                         char c = (char) x.intValue();
-                        return pojoToAdapter.apply(c);
+                        return c;
                     }
                 }
                 return null;
@@ -323,23 +321,23 @@ public final class JsonValueEncoder_Converters {
             }
         });
 
-        converters.add(new JsonValueConverter("big-integer(18)", "javamathbiginteger", BigInteger.class){
+        converters.add(new JsonValueConverter.Abstract("big-integer(18)", "javamathbiginteger", BigInteger.class){
             @Override
-            public ManagedObject asAdapter(final JsonRepresentation repr, final String format) {
+            public Object recoverValueAsPojo(final JsonRepresentation repr, final String format) {
                 if (repr.isString()) {
-                    return pojoToAdapter.apply(new BigInteger(repr.asString()));
+                    return new BigInteger(repr.asString());
                 }
                 if (repr.isBigInteger()) {
-                    return pojoToAdapter.apply(repr.asBigInteger(format));
+                    return repr.asBigInteger(format);
                 }
                 if (repr.isLong()) {
-                    return pojoToAdapter.apply(BigInteger.valueOf(repr.asLong()));
+                    return BigInteger.valueOf(repr.asLong());
                 }
                 if (repr.isInt()) {
-                    return pojoToAdapter.apply(BigInteger.valueOf(repr.asInt()));
+                    return BigInteger.valueOf(repr.asInt());
                 }
                 if (repr.isNumber()) {
-                    return pojoToAdapter.apply(BigInteger.valueOf(repr.asNumber().longValue()));
+                    return BigInteger.valueOf(repr.asNumber().longValue());
                 }
                 return null;
             }
@@ -358,26 +356,26 @@ public final class JsonValueEncoder_Converters {
             }
         });
 
-        converters.add(new JsonValueConverter("big-decimal", "javamathbigdecimal", BigDecimal.class){
+        converters.add(new JsonValueConverter.Abstract("big-decimal", "javamathbigdecimal", BigDecimal.class){
             @Override
-            public ManagedObject asAdapter(final JsonRepresentation repr, final String format) {
+            public Object recoverValueAsPojo(final JsonRepresentation repr, final String format) {
                 if (repr.isString()) {
-                    return pojoToAdapter.apply(new BigDecimal(repr.asString()));
+                    return new BigDecimal(repr.asString());
                 }
                 if (repr.isBigDecimal()) {
-                    return pojoToAdapter.apply(repr.asBigDecimal(format));
+                    return repr.asBigDecimal(format);
                 }
                 if (repr.isBigInteger()) {
-                    return pojoToAdapter.apply(new BigDecimal(repr.asBigInteger()));
+                    return new BigDecimal(repr.asBigInteger());
                 }
                 if (repr.isDecimal()) {
-                    return pojoToAdapter.apply(BigDecimal.valueOf(repr.asDouble()));
+                    return BigDecimal.valueOf(repr.asDouble());
                 }
                 if (repr.isLong()) {
-                    return pojoToAdapter.apply(BigDecimal.valueOf(repr.asLong()));
+                    return BigDecimal.valueOf(repr.asLong());
                 }
                 if (repr.isInt()) {
-                    return pojoToAdapter.apply(BigDecimal.valueOf(repr.asInt()));
+                    return BigDecimal.valueOf(repr.asInt());
                 }
                 return null;
             }
@@ -396,7 +394,7 @@ public final class JsonValueEncoder_Converters {
             }
         });
 
-        converters.add(new JsonValueConverter("date", "jodalocaldate", LocalDate.class){
+        converters.add(new JsonValueConverter.Abstract("date", "jodalocaldate", LocalDate.class){
 
             // these formatters do NOT use withZoneUTC()
             final List<DateTimeFormatter> formatters = Arrays.asList(
@@ -407,13 +405,13 @@ public final class JsonValueEncoder_Converters {
                     );
 
             @Override
-            public ManagedObject asAdapter(final JsonRepresentation repr, final String format) {
+            public Object recoverValueAsPojo(final JsonRepresentation repr, final String format) {
                 if (repr.isString()) {
                     final String dateStr = repr.asString();
                     for (DateTimeFormatter formatter : formatters) {
                         try {
                             final LocalDate parsedDate = formatter.parseLocalDate(dateStr);
-                            return pojoToAdapter.apply(parsedDate);
+                            return parsedDate;
                         } catch (IllegalArgumentException ex) {
                             // fall through
                         }
@@ -438,7 +436,7 @@ public final class JsonValueEncoder_Converters {
             }
         });
 
-        converters.add(new JsonValueConverter("date-time", "jodalocaldatetime", LocalDateTime.class){
+        converters.add(new JsonValueConverter.Abstract("date-time", "jodalocaldatetime", LocalDateTime.class){
 
             final List<DateTimeFormatter> formatters = Arrays.asList(
                     ISODateTimeFormat.dateTimeNoMillis().withZoneUTC(),
@@ -449,13 +447,13 @@ public final class JsonValueEncoder_Converters {
                     );
 
             @Override
-            public ManagedObject asAdapter(final JsonRepresentation repr, final String format) {
+            public Object recoverValueAsPojo(final JsonRepresentation repr, final String format) {
                 if (repr.isString()) {
                     final String dateStr = repr.asString();
                     for (DateTimeFormatter formatter : formatters) {
                         try {
                             final LocalDateTime parsedDate = formatter.parseLocalDateTime(dateStr);
-                            return pojoToAdapter.apply(parsedDate);
+                            return parsedDate;
                         } catch (IllegalArgumentException ex) {
                             // fall through
                         }
@@ -480,7 +478,7 @@ public final class JsonValueEncoder_Converters {
             }
         });
 
-        converters.add(new JsonValueConverter("date-time", "jodadatetime", DateTime.class){
+        converters.add(new JsonValueConverter.Abstract("date-time", "jodadatetime", DateTime.class){
 
             final List<DateTimeFormatter> formatters = Arrays.asList(
                     ISODateTimeFormat.dateTimeNoMillis().withZoneUTC(),
@@ -491,13 +489,13 @@ public final class JsonValueEncoder_Converters {
                     );
 
             @Override
-            public ManagedObject asAdapter(final JsonRepresentation repr, final String format) {
+            public Object recoverValueAsPojo(final JsonRepresentation repr, final String format) {
                 if (repr.isString()) {
                     final String dateStr = repr.asString();
                     for (DateTimeFormatter formatter : formatters) {
                         try {
                             final DateTime parsedDate = formatter.parseDateTime(dateStr);
-                            return pojoToAdapter.apply(parsedDate);
+                            return parsedDate;
                         } catch (IllegalArgumentException ex) {
                             // fall through
                         }
@@ -522,7 +520,7 @@ public final class JsonValueEncoder_Converters {
             }
         });
 
-        converters.add(new JsonValueConverter("date-time", "javautildate", java.util.Date.class){
+        converters.add(new JsonValueConverter.Abstract("date-time", "javautildate", java.util.Date.class){
 
             final List<DateTimeFormatter> formatters = Arrays.asList(
                     ISODateTimeFormat.dateTimeNoMillis().withZoneUTC(),
@@ -532,14 +530,14 @@ public final class JsonValueEncoder_Converters {
                     JsonRepresentation.yyyyMMddTHHmmssZ.withZoneUTC()
                     );
             @Override
-            public ManagedObject asAdapter(final JsonRepresentation repr, final String format) {
+            public Object recoverValueAsPojo(final JsonRepresentation repr, final String format) {
                 if (repr.isString()) {
                     final String dateStr = repr.asString();
                     for (DateTimeFormatter formatter : formatters) {
                         try {
                             final DateTime parseDateTime = formatter.parseDateTime(dateStr);
                             final java.util.Date parsedDate = parseDateTime.toDate();
-                            return pojoToAdapter.apply(parsedDate);
+                            return parsedDate;
                         } catch (IllegalArgumentException ex) {
                             // fall through
                         }
@@ -565,7 +563,7 @@ public final class JsonValueEncoder_Converters {
             }
         });
 
-        converters.add(new JsonValueConverter("date", "javasqldate", java.sql.Date.class){
+        converters.add(new JsonValueConverter.Abstract("date", "javasqldate", java.sql.Date.class){
 
             final List<DateTimeFormatter> formatters = Arrays.asList(
                     ISODateTimeFormat.date().withZoneUTC(),
@@ -573,14 +571,14 @@ public final class JsonValueEncoder_Converters {
                     JsonRepresentation.yyyyMMdd.withZoneUTC()
                     );
             @Override
-            public ManagedObject asAdapter(final JsonRepresentation repr, final String format) {
+            public Object recoverValueAsPojo(final JsonRepresentation repr, final String format) {
                 if (repr.isString()) {
                     final String dateStr = repr.asString();
                     for (DateTimeFormatter formatter : formatters) {
                         try {
                             final DateTime parseDateTime = formatter.parseDateTime(dateStr);
                             final java.sql.Date parsedDate = new java.sql.Date(parseDateTime.getMillis());
-                            return pojoToAdapter.apply(parsedDate);
+                            return parsedDate;
                         } catch (IllegalArgumentException ex) {
                             // fall through
                         }
@@ -605,7 +603,7 @@ public final class JsonValueEncoder_Converters {
             }
         });
 
-        converters.add(new JsonValueConverter("time", "javasqltime", java.sql.Time.class){
+        converters.add(new JsonValueConverter.Abstract("time", "javasqltime", java.sql.Time.class){
 
             final List<DateTimeFormatter> formatters = Arrays.asList(
                     ISODateTimeFormat.hourMinuteSecond().withZoneUTC(),
@@ -614,14 +612,14 @@ public final class JsonValueEncoder_Converters {
                     JsonRepresentation._HHmmss.withZoneUTC()
                     );
             @Override
-            public ManagedObject asAdapter(final JsonRepresentation repr, final String format) {
+            public Object recoverValueAsPojo(final JsonRepresentation repr, final String format) {
                 if (repr.isString()) {
                     final String dateStr = repr.asString();
                     for (DateTimeFormatter formatter : formatters) {
                         try {
                             final DateTime parseDateTime = formatter.parseDateTime(dateStr);
                             final java.sql.Time parsedTime = new java.sql.Time(parseDateTime.getMillis());
-                            return pojoToAdapter.apply(parsedTime);
+                            return parsedTime;
                         } catch (IllegalArgumentException ex) {
                             // fall through
                         }
@@ -646,21 +644,21 @@ public final class JsonValueEncoder_Converters {
             }
         });
 
-        converters.add(new JsonValueConverter("utc-millisec", "javasqltimestamp", java.sql.Timestamp.class){
+        converters.add(new JsonValueConverter.Abstract("utc-millisec", "javasqltimestamp", java.sql.Timestamp.class){
 
             @Override
-            public ManagedObject asAdapter(final JsonRepresentation repr, final String format) {
+            public Object recoverValueAsPojo(final JsonRepresentation repr, final String format) {
                 if (repr.isLong()) {
                     final Long millis = repr.asLong();
                     final java.sql.Timestamp parsedTimestamp = new java.sql.Timestamp(millis);
-                    return pojoToAdapter.apply(parsedTimestamp);
+                    return parsedTimestamp;
                 }
                 if (repr.isString()) {
                     final String dateStr = repr.asString();
                     try {
                         final Long parseMillis = Long.parseLong(dateStr);
                         final java.sql.Timestamp parsedTimestamp = new java.sql.Timestamp(parseMillis);
-                        return pojoToAdapter.apply(parsedTimestamp);
+                        return parsedTimestamp;
                     } catch (IllegalArgumentException ex) {
                         // fall through
                     }
@@ -687,14 +685,4 @@ public final class JsonValueEncoder_Converters {
         return converters;
     }
 
-
-    static void appendFormats(final JsonRepresentation repr, final String format, final String xIsisFormat,
-            final boolean suppressExtensions) {
-        JsonValueEncoder.appendFormats(repr, format, xIsisFormat, suppressExtensions);
-    }
-
-    static Object unwrapAsObjectElseNullNode(final ManagedObject adapter) {
-        return JsonValueEncoder.unwrapAsObjectElseNullNode(adapter);
-    }
-
 }
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 072e58bd41..389453f6ca 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
@@ -20,7 +20,6 @@ package org.apache.isis.viewer.restfulobjects.rendering.domainobjects;
 
 import java.util.Map;
 import java.util.Optional;
-import java.util.function.Function;
 
 import javax.annotation.PostConstruct;
 import javax.annotation.Priority;
@@ -36,7 +35,6 @@ import org.springframework.stereotype.Service;
 import org.apache.isis.applib.annotation.PriorityPrecedence;
 import org.apache.isis.applib.exceptions.recoverable.TextEntryParseException;
 import org.apache.isis.applib.value.semantics.ValueDecomposition;
-import org.apache.isis.commons.collections.Can;
 import org.apache.isis.commons.internal.base._Casts;
 import org.apache.isis.commons.internal.collections._Maps;
 import org.apache.isis.core.metamodel.facets.object.value.ValueSerializer.Format;
@@ -48,7 +46,6 @@ import org.apache.isis.core.metamodel.util.Facets;
 import org.apache.isis.viewer.restfulobjects.applib.IsisModuleViewerRestfulObjectsApplib;
 import org.apache.isis.viewer.restfulobjects.applib.JsonRepresentation;
 
-import lombok.Getter;
 import lombok.NonNull;
 import lombok.val;
 import lombok.extern.log4j.Log4j2;
@@ -68,12 +65,7 @@ public class JsonValueEncoder {
 
     @PostConstruct
     public void init() {
-
-        //XXX no lombok val here
-        Function<Object, ManagedObject> pojoToAdapter = pojo ->
-            ManagedObject.lazy(specificationLoader, pojo);
-
-        new JsonValueEncoder_Converters().asList(pojoToAdapter)
+        new JsonValueConverters().asList()
             .forEach(this::registerConverter);
     }
 
@@ -113,9 +105,9 @@ public class JsonValueEncoder {
             throw new IllegalArgumentException("Unable to parse value");
         }
 
-        final ManagedObject asAdapter = jvc.asAdapter(argValueRepr, format);
-        if(asAdapter != null) {
-            return asAdapter;
+        val valueAsPojo = jvc.recoverValueAsPojo(argValueRepr, format);
+        if(valueAsPojo != null) {
+            return ManagedObject.lazy(specificationLoader, valueAsPojo);
         }
 
         // last attempt
@@ -199,7 +191,7 @@ public class JsonValueEncoder {
                 .toEncodedString(Format.JSON, _Casts.uncheckedCast(adapter.getPojo()));
     }
 
-
+    @Deprecated
     static void appendFormats(final JsonRepresentation repr, final String format, final String xIsisFormat, final boolean suppressExtensions) {
         if(format != null) {
             repr.mapPutString("format", format);
@@ -209,56 +201,12 @@ public class JsonValueEncoder {
         }
     }
 
-    static Object unwrapAsObjectElseNullNode(final ManagedObject adapter) {
-        return adapter != null? adapter.getPojo(): NullNode.getInstance();
-    }
-
     // -- NESTED TYPE DECLARATIONS
 
     public static class ExpectedStringRepresentingValueException extends IllegalArgumentException {
         private static final long serialVersionUID = 1L;
     }
 
-    public static abstract class JsonValueConverter {
-
-        protected final String format;
-        protected final String xIsisFormat;
-
-        @Getter private final Can<Class<?>> classes;
-
-        public JsonValueConverter(final String format, final String xIsisFormat, final Class<?>... classes) {
-            this.format = format;
-            this.xIsisFormat = xIsisFormat;
-            this.classes = Can.ofArray(classes);
-        }
-
-        /**
-         * The value, otherwise <tt>null</tt>.
-         */
-        public abstract ManagedObject asAdapter(JsonRepresentation repr, String format);
-
-        public Object appendValueAndFormat(
-                final ManagedObject objectAdapter,
-                final String formatOverride,
-                final JsonRepresentation repr,
-                final boolean suppressExtensions) {
-
-            final Object value = unwrapAsObjectElseNullNode(objectAdapter);
-            repr.mapPut("value", value);
-            appendFormats(repr, effectiveFormat(formatOverride), this.xIsisFormat, suppressExtensions);
-            return value;
-        }
-
-        protected String effectiveFormat(final String formatOverride) {
-            return formatOverride!=null ? formatOverride : this.format;
-        }
-
-        public Object asObject(final ManagedObject objectAdapter, final String format) {
-            return objectAdapter.getPojo();
-        }
-    }
-
-
     /**
      * JUnit support
      */