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 14:21:28 UTC

[isis] branch master updated: ISIS-3127: [RO] make JsonValueEncoder an overridable service

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 76cf90add6 ISIS-3127: [RO] make JsonValueEncoder an overridable service
76cf90add6 is described below

commit 76cf90add6ed20f6f7c7e9352438ef00e0c99a83
Author: andi-huber <ah...@apache.org>
AuthorDate: Fri Aug 19 16:21:20 2022 +0200

    ISIS-3127: [RO] make JsonValueEncoder an overridable service
---
 .../isis/testdomain/rest/JsonValueEncoderTest.java |  6 +--
 .../IsisModuleRestfulObjectsRendering.java         |  4 +-
 .../rendering/ReprRendererAbstract.java            |  6 +--
 .../domainobjects/DomainObjectReprRenderer.java    |  4 +-
 .../domainobjects/ObjectPropertyReprRenderer.java  |  1 +
 .../domainobjects/ScalarValueReprRenderer.java     |  1 +
 .../valuerender}/JsonValueConverter.java           | 11 +----
 .../valuerender/JsonValueEncoderService.java       | 57 ++++++++++++++++++++++
 .../JsonValueEncoderServiceDefault.java}           | 29 +++++------
 .../valuerender/_JsonValueConverters.java}         |  4 +-
 .../JsonValueEncoderTest_asAdapter.java            | 16 +++---
 .../JsonValueEncoderTest_asObject.java             |  6 ++-
 .../viewer/resources/JsonParserHelper.java         |  6 +--
 13 files changed, 101 insertions(+), 50 deletions(-)

diff --git a/regressiontests/stable-rest/src/test/java/org/apache/isis/testdomain/rest/JsonValueEncoderTest.java b/regressiontests/stable-rest/src/test/java/org/apache/isis/testdomain/rest/JsonValueEncoderTest.java
index da1a0ea318..e68f167b9c 100644
--- a/regressiontests/stable-rest/src/test/java/org/apache/isis/testdomain/rest/JsonValueEncoderTest.java
+++ b/regressiontests/stable-rest/src/test/java/org/apache/isis/testdomain/rest/JsonValueEncoderTest.java
@@ -38,8 +38,8 @@ import org.apache.isis.core.metamodel.context.MetaModelContext;
 import org.apache.isis.testdomain.conf.Configuration_headless;
 import org.apache.isis.viewer.restfulobjects.applib.JsonRepresentation;
 import org.apache.isis.viewer.restfulobjects.jaxrsresteasy4.IsisModuleViewerRestfulObjectsJaxrsResteasy4;
-import org.apache.isis.viewer.restfulobjects.rendering.domainobjects.JsonValueConverter.Context;
-import org.apache.isis.viewer.restfulobjects.rendering.domainobjects.JsonValueEncoder;
+import org.apache.isis.viewer.restfulobjects.rendering.service.valuerender.JsonValueEncoderServiceDefault;
+import org.apache.isis.viewer.restfulobjects.rendering.service.valuerender.JsonValueConverter.Context;
 
 import static org.hamcrest.MatcherAssert.assertThat;
 import static org.hamcrest.Matchers.is;
@@ -420,7 +420,7 @@ class JsonValueEncoderTest {
     private JsonRepresentation representationFor(
             final Object value, final Context context, final Consumer<Object> valueAsObjectVerifier) {
         val valueAdapter = mmc.getObjectManager().adapt(value);
-        val jsonValueEncoder = JsonValueEncoder.forTesting(mmc.getSpecificationLoader());
+        val jsonValueEncoder = JsonValueEncoderServiceDefault.forTesting(mmc.getSpecificationLoader());
 
         valueAsObjectVerifier.accept(jsonValueEncoder.asObject(valueAdapter, context));
 
diff --git a/viewers/restfulobjects/rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/IsisModuleRestfulObjectsRendering.java b/viewers/restfulobjects/rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/IsisModuleRestfulObjectsRendering.java
index 70d64a8384..c6e3996f13 100644
--- a/viewers/restfulobjects/rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/IsisModuleRestfulObjectsRendering.java
+++ b/viewers/restfulobjects/rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/IsisModuleRestfulObjectsRendering.java
@@ -23,7 +23,6 @@ import org.springframework.context.annotation.Import;
 
 import org.apache.isis.core.runtime.IsisModuleCoreRuntime;
 import org.apache.isis.viewer.restfulobjects.applib.IsisModuleViewerRestfulObjectsApplib;
-import org.apache.isis.viewer.restfulobjects.rendering.domainobjects.JsonValueEncoder;
 import org.apache.isis.viewer.restfulobjects.rendering.service.RepresentationService;
 import org.apache.isis.viewer.restfulobjects.rendering.service.acceptheader.AcceptHeaderServiceForRest;
 import org.apache.isis.viewer.restfulobjects.rendering.service.conneg.ContentNegotiationServiceForRestfulObjectsV1_0;
@@ -36,6 +35,7 @@ import org.apache.isis.viewer.restfulobjects.rendering.service.swagger.internal.
 import org.apache.isis.viewer.restfulobjects.rendering.service.swagger.internal.SwaggerSpecGenerator;
 import org.apache.isis.viewer.restfulobjects.rendering.service.swagger.internal.TaggerDefault;
 import org.apache.isis.viewer.restfulobjects.rendering.service.swagger.internal.ValuePropertyFactoryDefault;
+import org.apache.isis.viewer.restfulobjects.rendering.service.valuerender.JsonValueEncoderServiceDefault;
 
 /**
  * @since 1.x {@index}
@@ -59,7 +59,7 @@ import org.apache.isis.viewer.restfulobjects.rendering.service.swagger.internal.
         ContentNegotiationServiceOrgApacheIsisV2.class,
         ContentNegotiationServiceOrgApacheIsisV1.class, // to intercept client requests and respond with HTTP 501 (no longer supported)
         ContentNegotiationServiceXRoDomainType.class,
-        JsonValueEncoder.class,
+        JsonValueEncoderServiceDefault.class,
         RepresentationService.class,
         SwaggerServiceDefault.class,
         SwaggerServiceMenu.class,
diff --git a/viewers/restfulobjects/rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/ReprRendererAbstract.java b/viewers/restfulobjects/rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/ReprRendererAbstract.java
index eee1ed7968..8b881d4331 100644
--- a/viewers/restfulobjects/rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/ReprRendererAbstract.java
+++ b/viewers/restfulobjects/rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/ReprRendererAbstract.java
@@ -34,8 +34,8 @@ import org.apache.isis.viewer.restfulobjects.applib.JsonRepresentation;
 import org.apache.isis.viewer.restfulobjects.applib.Rel;
 import org.apache.isis.viewer.restfulobjects.applib.RepresentationType;
 import org.apache.isis.viewer.restfulobjects.rendering.domainobjects.DomainObjectReprRenderer;
-import org.apache.isis.viewer.restfulobjects.rendering.domainobjects.JsonValueEncoder;
 import org.apache.isis.viewer.restfulobjects.rendering.domaintypes.DomainTypeReprRenderer;
+import org.apache.isis.viewer.restfulobjects.rendering.service.valuerender.JsonValueEncoderService;
 
 import lombok.Getter;
 import lombok.val;
@@ -44,7 +44,7 @@ public abstract class ReprRendererAbstract<T>
 implements ReprRenderer<T> {
 
     @Getter protected final IResourceContext resourceContext;
-    @Getter protected final JsonValueEncoder jsonValueEncoder;
+    @Getter protected final JsonValueEncoderService jsonValueEncoder;
 
     private final LinkFollowSpecs linkFollower;
     private final RepresentationType representationType;
@@ -62,7 +62,7 @@ implements ReprRenderer<T> {
             final JsonRepresentation representation) {
         this.resourceContext = resourceContext;
         this.jsonValueEncoder = resourceContext.getMetaModelContext().getServiceRegistry()
-                .lookupServiceElseFail(JsonValueEncoder.class);
+                .lookupServiceElseFail(JsonValueEncoderService.class);
 
         this.linkFollower = asProvidedElseCreate(linkFollower);
         this.representationType = representationType;
diff --git a/viewers/restfulobjects/rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/domainobjects/DomainObjectReprRenderer.java b/viewers/restfulobjects/rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/domainobjects/DomainObjectReprRenderer.java
index 80886aa489..fef00dbb68 100644
--- a/viewers/restfulobjects/rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/domainobjects/DomainObjectReprRenderer.java
+++ b/viewers/restfulobjects/rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/domainobjects/DomainObjectReprRenderer.java
@@ -46,6 +46,8 @@ import org.apache.isis.viewer.restfulobjects.rendering.LinkBuilder;
 import org.apache.isis.viewer.restfulobjects.rendering.LinkFollowSpecs;
 import org.apache.isis.viewer.restfulobjects.rendering.ReprRendererAbstract;
 import org.apache.isis.viewer.restfulobjects.rendering.domaintypes.DomainTypeReprRenderer;
+import org.apache.isis.viewer.restfulobjects.rendering.service.valuerender.JsonValueConverter;
+import org.apache.isis.viewer.restfulobjects.rendering.service.valuerender.JsonValueEncoderService;
 
 import lombok.val;
 
@@ -455,7 +457,7 @@ extends ReprRendererAbstract<ManagedObject> {
     public static Object valueOrRef(
             final IResourceContext context,
             final ObjectFeature objectFeature,
-            final JsonValueEncoder jsonValueEncoder,
+            final JsonValueEncoderService jsonValueEncoder,
             final ManagedObject domainObject) {
 
         val spec = domainObject.getSpecification();
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 2d850dc881..0ffd00b8c3 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
@@ -36,6 +36,7 @@ import org.apache.isis.viewer.restfulobjects.rendering.IResourceContext;
 import org.apache.isis.viewer.restfulobjects.rendering.LinkBuilder;
 import org.apache.isis.viewer.restfulobjects.rendering.LinkFollowSpecs;
 import org.apache.isis.viewer.restfulobjects.rendering.domaintypes.PropertyDescriptionReprRenderer;
+import org.apache.isis.viewer.restfulobjects.rendering.service.valuerender.JsonValueConverter;
 
 import lombok.val;
 
diff --git a/viewers/restfulobjects/rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/domainobjects/ScalarValueReprRenderer.java b/viewers/restfulobjects/rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/domainobjects/ScalarValueReprRenderer.java
index 8fb24bacc6..9481f3d16c 100644
--- a/viewers/restfulobjects/rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/domainobjects/ScalarValueReprRenderer.java
+++ b/viewers/restfulobjects/rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/domainobjects/ScalarValueReprRenderer.java
@@ -30,6 +30,7 @@ import org.apache.isis.viewer.restfulobjects.rendering.IResourceContext;
 import org.apache.isis.viewer.restfulobjects.rendering.LinkFollowSpecs;
 import org.apache.isis.viewer.restfulobjects.rendering.ReprRendererAbstract;
 import org.apache.isis.viewer.restfulobjects.rendering.ReprRendererException;
+import org.apache.isis.viewer.restfulobjects.rendering.service.valuerender.JsonValueConverter;
 
 import lombok.Getter;
 import lombok.val;
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/service/valuerender/JsonValueConverter.java
similarity index 93%
rename from viewers/restfulobjects/rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/domainobjects/JsonValueConverter.java
rename to viewers/restfulobjects/rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/service/valuerender/JsonValueConverter.java
index e8f2a3d61b..20d5955652 100644
--- 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/service/valuerender/JsonValueConverter.java
@@ -16,7 +16,7 @@
  *  specific language governing permissions and limitations
  *  under the License.
  */
-package org.apache.isis.viewer.restfulobjects.rendering.domainobjects;
+package org.apache.isis.viewer.restfulobjects.rendering.service.valuerender;
 
 import java.util.OptionalInt;
 
@@ -33,7 +33,7 @@ import org.apache.isis.core.metamodel.spec.feature.HasObjectFeature;
 import org.apache.isis.core.metamodel.spec.feature.ObjectFeature;
 import org.apache.isis.core.metamodel.util.Facets;
 import org.apache.isis.viewer.restfulobjects.applib.JsonRepresentation;
-import org.apache.isis.viewer.restfulobjects.rendering.domainobjects.JsonValueConverters.DefaultFormat;
+import org.apache.isis.viewer.restfulobjects.rendering.service.valuerender._JsonValueConverters.DefaultFormat;
 
 import lombok.Getter;
 import lombok.NonNull;
@@ -113,19 +113,12 @@ public interface JsonValueConverter {
 
         @Getter private final Class<?> valueClass;
 
-
         public Abstract(final DefaultFormat format) {
             this.format = format.format;
             this.extendedFormat = format.extendedFormat;
             this.valueClass = format.valueClass;
         }
 
-//        public Abstract(final String format, final String extendedFormat, final Class<?> valueClass) {
-//            this.format = format;
-//            this.extendedFormat = extendedFormat;
-//            this.valueClass = valueClass;
-//        }
-
         @Override
         public Object appendValueAndFormat(
                 final ManagedObject objectAdapter,
diff --git a/viewers/restfulobjects/rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/service/valuerender/JsonValueEncoderService.java b/viewers/restfulobjects/rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/service/valuerender/JsonValueEncoderService.java
new file mode 100644
index 0000000000..8b887bfc11
--- /dev/null
+++ b/viewers/restfulobjects/rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/service/valuerender/JsonValueEncoderService.java
@@ -0,0 +1,57 @@
+/*
+ *  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.service.valuerender;
+
+import org.springframework.lang.Nullable;
+
+import org.apache.isis.core.metamodel.spec.ManagedObject;
+import org.apache.isis.core.metamodel.spec.ObjectSpecification;
+import org.apache.isis.viewer.restfulobjects.applib.JsonRepresentation;
+import org.apache.isis.viewer.restfulobjects.rendering.service.valuerender.JsonValueConverter.Context;
+
+import lombok.NonNull;
+
+/**
+ * Converts value representing {@link ManagedObject}s to their corresponding JSON representation.
+ */
+public interface JsonValueEncoderService {
+
+    public ManagedObject asAdapter(
+            final ObjectSpecification objectSpec,
+            final JsonRepresentation argValueRepr,
+            final JsonValueConverter.Context context);
+
+    public void appendValueAndFormat(
+            final ManagedObject valueAdapter,
+            final JsonRepresentation repr,
+            final Context context);
+
+    @Nullable
+    public Object asObject(final @NonNull ManagedObject adapter, final JsonValueConverter.Context context);
+
+    static void appendFormats(
+            final JsonRepresentation repr,
+            final @Nullable String format, final @Nullable String extendedFormat, final boolean suppressExtensions) {
+        repr.putFormat(format);
+        if(!suppressExtensions) {
+            repr.putExtendedFormat(extendedFormat);
+        }
+    }
+
+}
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/service/valuerender/JsonValueEncoderServiceDefault.java
similarity index 92%
rename from viewers/restfulobjects/rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/domainobjects/JsonValueEncoder.java
rename to viewers/restfulobjects/rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/service/valuerender/JsonValueEncoderServiceDefault.java
index f49c5ee5b3..5850edbe06 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/service/valuerender/JsonValueEncoderServiceDefault.java
@@ -16,7 +16,7 @@
  *  specific language governing permissions and limitations
  *  under the License.
  */
-package org.apache.isis.viewer.restfulobjects.rendering.domainobjects;
+package org.apache.isis.viewer.restfulobjects.rendering.service.valuerender;
 
 import java.util.Map;
 import java.util.Optional;
@@ -48,22 +48,18 @@ import org.apache.isis.core.metamodel.util.Facets;
 import org.apache.isis.schema.common.v2.ValueType;
 import org.apache.isis.viewer.restfulobjects.applib.IsisModuleViewerRestfulObjectsApplib;
 import org.apache.isis.viewer.restfulobjects.applib.JsonRepresentation;
-import org.apache.isis.viewer.restfulobjects.rendering.domainobjects.JsonValueConverter.Context;
+import org.apache.isis.viewer.restfulobjects.rendering.service.valuerender.JsonValueConverter.Context;
 
 import lombok.NonNull;
 import lombok.val;
 import lombok.extern.log4j.Log4j2;
 
-/**
- * Similar to Isis' value encoding, but with additional support for JSON
- * primitives.
- */
 @Service
-@Named(IsisModuleViewerRestfulObjectsApplib.NAMESPACE + ".JsonValueEncoder")
-@Priority(PriorityPrecedence.EARLY)
+@Named(IsisModuleViewerRestfulObjectsApplib.NAMESPACE + ".JsonValueEncoderDefault")
+@Priority(PriorityPrecedence.MIDPOINT)
 @Qualifier("Default")
 @Log4j2
-public class JsonValueEncoder {
+public class JsonValueEncoderServiceDefault implements JsonValueEncoderService {
 
     @Inject private SpecificationLoader specificationLoader;
 
@@ -71,10 +67,11 @@ public class JsonValueEncoder {
 
     @PostConstruct
     public void init() {
-        new JsonValueConverters().asList()
+        new _JsonValueConverters().asList()
             .forEach(converter->converterByClass.put(converter.getValueClass(), converter));
     }
 
+    @Override
     public ManagedObject asAdapter(
             final ObjectSpecification objectSpec,
             final JsonRepresentation argValueRepr,
@@ -124,6 +121,7 @@ public class JsonValueEncoder {
         throw new IllegalArgumentException("Could not parse value '" + argValueRepr.asString() + "' as a " + objectSpec.getFullIdentifier());
     }
 
+    @Override
     public void appendValueAndFormat(
             final ManagedObject valueAdapter,
             final JsonRepresentation repr,
@@ -200,6 +198,7 @@ public class JsonValueEncoder {
         return decompositionIfAny;
     }
 
+    @Override
     @Nullable
     public Object asObject(final @NonNull ManagedObject adapter, final JsonValueConverter.Context context) {
 
@@ -224,17 +223,11 @@ public class JsonValueEncoder {
         }
     }
 
-    // -- NESTED TYPE DECLARATIONS
-
-    public static class ExpectedStringRepresentingValueException extends IllegalArgumentException {
-        private static final long serialVersionUID = 1L;
-    }
-
     /**
      * JUnit support
      */
-    public static JsonValueEncoder forTesting(final SpecificationLoader specificationLoader) {
-        val jsonValueEncoder = new JsonValueEncoder();
+    public static JsonValueEncoderServiceDefault forTesting(final SpecificationLoader specificationLoader) {
+        val jsonValueEncoder = new JsonValueEncoderServiceDefault();
         jsonValueEncoder.specificationLoader = specificationLoader;
         jsonValueEncoder.init();
         return jsonValueEncoder;
diff --git a/viewers/restfulobjects/rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/domainobjects/JsonValueConverters.java b/viewers/restfulobjects/rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/service/valuerender/_JsonValueConverters.java
similarity index 99%
rename from viewers/restfulobjects/rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/domainobjects/JsonValueConverters.java
rename to viewers/restfulobjects/rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/service/valuerender/_JsonValueConverters.java
index fa6b7d59dd..efa466e1f4 100644
--- a/viewers/restfulobjects/rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/domainobjects/JsonValueConverters.java
+++ b/viewers/restfulobjects/rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/service/valuerender/_JsonValueConverters.java
@@ -16,7 +16,7 @@
  *  specific language governing permissions and limitations
  *  under the License.
  */
-package org.apache.isis.viewer.restfulobjects.rendering.domainobjects;
+package org.apache.isis.viewer.restfulobjects.rendering.service.valuerender;
 
 import java.math.BigDecimal;
 import java.math.BigInteger;
@@ -40,7 +40,7 @@ import lombok.val;
 /**
  * Has support for JSON primitives.
  */
-final class JsonValueConverters {
+final class _JsonValueConverters {
 
     @RequiredArgsConstructor
     public static enum DefaultFormat {
diff --git a/viewers/restfulobjects/rendering/src/test/java/org/apache/isis/viewer/restfulobjects/rendering/domainobjects/JsonValueEncoderTest_asAdapter.java b/viewers/restfulobjects/rendering/src/test/java/org/apache/isis/viewer/restfulobjects/rendering/domainobjects/JsonValueEncoderTest_asAdapter.java
index c2d8ed0ef1..787450a1d4 100644
--- a/viewers/restfulobjects/rendering/src/test/java/org/apache/isis/viewer/restfulobjects/rendering/domainobjects/JsonValueEncoderTest_asAdapter.java
+++ b/viewers/restfulobjects/rendering/src/test/java/org/apache/isis/viewer/restfulobjects/rendering/domainobjects/JsonValueEncoderTest_asAdapter.java
@@ -38,11 +38,6 @@ import org.junit.Before;
 import org.junit.Rule;
 import org.junit.Test;
 
-import static org.hamcrest.MatcherAssert.assertThat;
-import static org.hamcrest.Matchers.is;
-import static org.junit.Assert.assertNull;
-import static org.junit.Assert.assertSame;
-
 import org.apache.isis.applib.exceptions.recoverable.TextEntryParseException;
 import org.apache.isis.applib.id.LogicalType;
 import org.apache.isis.core.internaltestsupport.jmocking.JUnitRuleMockery2;
@@ -53,6 +48,13 @@ import org.apache.isis.core.metamodel.spec.ManagedObject;
 import org.apache.isis.core.metamodel.spec.ObjectSpecification;
 import org.apache.isis.core.metamodel.specloader.SpecificationLoader;
 import org.apache.isis.viewer.restfulobjects.applib.JsonRepresentation;
+import org.apache.isis.viewer.restfulobjects.rendering.service.valuerender.JsonValueEncoderService;
+import org.apache.isis.viewer.restfulobjects.rendering.service.valuerender.JsonValueEncoderServiceDefault;
+
+import static org.hamcrest.MatcherAssert.assertThat;
+import static org.hamcrest.Matchers.is;
+import static org.junit.Assert.assertNull;
+import static org.junit.Assert.assertSame;
 
 import lombok.val;
 
@@ -67,12 +69,12 @@ public class JsonValueEncoderTest_asAdapter {
     @Mock private SpecificationLoader specLoader;
 
     private JsonRepresentation representation;
-    private JsonValueEncoder jsonValueEncoder;
+    private JsonValueEncoderService jsonValueEncoder;
 
     @Before
     public void setUp() throws Exception {
 
-        jsonValueEncoder = JsonValueEncoder.forTesting(specLoader);
+        jsonValueEncoder = JsonValueEncoderServiceDefault.forTesting(specLoader);
 
         representation = new JsonRepresentation(TextNode.valueOf("aString"));
     }
diff --git a/viewers/restfulobjects/rendering/src/test/java/org/apache/isis/viewer/restfulobjects/rendering/domainobjects/JsonValueEncoderTest_asObject.java b/viewers/restfulobjects/rendering/src/test/java/org/apache/isis/viewer/restfulobjects/rendering/domainobjects/JsonValueEncoderTest_asObject.java
index 15cb403dce..e811a3dd1d 100644
--- a/viewers/restfulobjects/rendering/src/test/java/org/apache/isis/viewer/restfulobjects/rendering/domainobjects/JsonValueEncoderTest_asObject.java
+++ b/viewers/restfulobjects/rendering/src/test/java/org/apache/isis/viewer/restfulobjects/rendering/domainobjects/JsonValueEncoderTest_asObject.java
@@ -28,6 +28,8 @@ import org.apache.isis.core.internaltestsupport.jmocking.JUnitRuleMockery2;
 import org.apache.isis.core.metamodel.spec.ManagedObject;
 import org.apache.isis.core.metamodel.spec.ObjectSpecification;
 import org.apache.isis.core.metamodel.specloader.SpecificationLoader;
+import org.apache.isis.viewer.restfulobjects.rendering.service.valuerender.JsonValueEncoderService;
+import org.apache.isis.viewer.restfulobjects.rendering.service.valuerender.JsonValueEncoderServiceDefault;
 
 public class JsonValueEncoderTest_asObject {
 
@@ -38,7 +40,7 @@ public class JsonValueEncoderTest_asObject {
     @Mock private ManagedObject mockObjectAdapter;
     @Mock private SpecificationLoader specLoader;
 
-    private JsonValueEncoder jsonValueEncoder;
+    private JsonValueEncoderService jsonValueEncoder;
 
     @Before
     public void setUp() throws Exception {
@@ -50,7 +52,7 @@ public class JsonValueEncoderTest_asObject {
             }
         });
 
-        jsonValueEncoder = JsonValueEncoder.forTesting(specLoader);
+        jsonValueEncoder = JsonValueEncoderServiceDefault.forTesting(specLoader);
 
     }
 
diff --git a/viewers/restfulobjects/viewer/src/main/java/org/apache/isis/viewer/restfulobjects/viewer/resources/JsonParserHelper.java b/viewers/restfulobjects/viewer/src/main/java/org/apache/isis/viewer/restfulobjects/viewer/resources/JsonParserHelper.java
index b1e5b069ca..e0f0ab9681 100644
--- a/viewers/restfulobjects/viewer/src/main/java/org/apache/isis/viewer/restfulobjects/viewer/resources/JsonParserHelper.java
+++ b/viewers/restfulobjects/viewer/src/main/java/org/apache/isis/viewer/restfulobjects/viewer/resources/JsonParserHelper.java
@@ -28,7 +28,7 @@ import org.apache.isis.viewer.restfulobjects.applib.JsonRepresentation;
 import org.apache.isis.viewer.restfulobjects.applib.RestfulResponse;
 import org.apache.isis.viewer.restfulobjects.rendering.IResourceContext;
 import org.apache.isis.viewer.restfulobjects.rendering.RestfulObjectsApplicationException;
-import org.apache.isis.viewer.restfulobjects.rendering.domainobjects.JsonValueEncoder;
+import org.apache.isis.viewer.restfulobjects.rendering.service.valuerender.JsonValueEncoderService;
 import org.apache.isis.viewer.restfulobjects.rendering.util.Util;
 
 import lombok.val;
@@ -44,13 +44,13 @@ public class JsonParserHelper {
 
     private final IResourceContext resourceContext;
     private final ObjectSpecification objectSpec;
-    private final JsonValueEncoder jsonValueEncoder;
+    private final JsonValueEncoderService jsonValueEncoder;
 
     public JsonParserHelper(final IResourceContext resourceContext, final ObjectSpecification objectSpecification) {
         this.objectSpec = objectSpecification;
         this.resourceContext = resourceContext;
         this.jsonValueEncoder = resourceContext.getMetaModelContext().getServiceRegistry()
-                .lookupServiceElseFail(JsonValueEncoder.class);
+                .lookupServiceElseFail(JsonValueEncoderService.class);
     }