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/26 13:05:41 UTC

[isis] branch master updated: ISIS-2877: remove java.sql.Timestamp from Apache Isis Schema

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 a978b7f  ISIS-2877: remove java.sql.Timestamp from Apache Isis Schema
a978b7f is described below

commit a978b7f158c20d8a9fbf06ec56209215635a6697
Author: Andi Huber <ah...@apache.org>
AuthorDate: Fri Nov 26 13:59:50 2021 +0100

    ISIS-2877: remove java.sql.Timestamp from Apache Isis Schema
    
    - also provide a ValueSemanticsResolver to the various DTO utilities
---
 .../isis/applib/util/schema/CommonDtoUtils.java    | 66 ++++++++++++----------
 .../apache/isis/applib/util/schema/DtoContext.java | 25 ++++----
 .../applib/util/schema/InteractionDtoUtils.java    | 13 +++--
 .../value/semantics/ValueSemanticsResolver.java    | 17 ++++--
 .../applib/util/schema/CommonDtoUtils_Test.java    | 15 +++--
 .../schema/CommonDtoUtils_setValueOn_Test.java     | 11 ++--
 .../apache/isis/applib/util/schema/Roundtrip.java  | 14 ++++-
 .../org/apache/isis/schema/common/common-2.0.xsd   | 35 +++++-------
 .../core/metamodel/IsisModuleCoreMetamodel.java    |  4 +-
 .../_testing/MetaModelContext_forTesting.java      | 20 +++----
 ...ionOrAnyMatchingValueSemanticsFacetFactory.java |  8 +--
 .../specloader/SpecificationLoaderDefault.java     | 18 +++---
 .../legacy/JavaSqlTimeStampValueSemantics.java     |  2 +-
 ...ult.java => ValueSemanticsResolverDefault.java} |  8 +--
 .../command/CommandDtoFactoryDefault.java          | 14 ++---
 .../runtimeservices/command/DtoContextDefault.java | 29 ++++++++++
 .../interaction/InteractionDtoFactoryDefault.java  |  9 +--
 .../isis/testdomain/value/ValueSemanticsTest.java  |  8 +--
 .../ui/components/scalars/ConverterTester.java     | 16 +++---
 19 files changed, 189 insertions(+), 143 deletions(-)

diff --git a/api/applib/src/main/java/org/apache/isis/applib/util/schema/CommonDtoUtils.java b/api/applib/src/main/java/org/apache/isis/applib/util/schema/CommonDtoUtils.java
index 47d947f..a4bd003 100644
--- a/api/applib/src/main/java/org/apache/isis/applib/util/schema/CommonDtoUtils.java
+++ b/api/applib/src/main/java/org/apache/isis/applib/util/schema/CommonDtoUtils.java
@@ -36,10 +36,8 @@ import java.util.function.Function;
 
 import org.springframework.lang.Nullable;
 
-import org.apache.isis.applib.jaxb.JavaSqlXMLGregorianCalendarMarshalling;
 import org.apache.isis.applib.jaxb.JavaTimeXMLGregorianCalendarMarshalling;
 import org.apache.isis.applib.services.bookmark.Bookmark;
-import org.apache.isis.applib.services.bookmark.BookmarkService;
 import org.apache.isis.applib.value.Blob;
 import org.apache.isis.applib.value.Clob;
 import org.apache.isis.commons.internal.base._Casts;
@@ -56,6 +54,7 @@ import org.apache.isis.schema.common.v2.ClobDto;
 import org.apache.isis.schema.common.v2.CollectionDto;
 import org.apache.isis.schema.common.v2.EnumDto;
 import org.apache.isis.schema.common.v2.OidDto;
+import org.apache.isis.schema.common.v2.TypedTupleDto;
 import org.apache.isis.schema.common.v2.ValueDto;
 import org.apache.isis.schema.common.v2.ValueType;
 import org.apache.isis.schema.common.v2.ValueWithTypeDto;
@@ -78,6 +77,7 @@ public final class CommonDtoUtils {
     // -- asValueType
     public static final Map<Class<?>, ValueType> valueTypeByClass =
             _Maps.unmodifiableEntries(
+                    entry(Void.class, ValueType.VOID),
                     entry(String.class, ValueType.STRING),
                     entry(byte.class, ValueType.BYTE),
                     entry(Byte.class, ValueType.BYTE),
@@ -106,7 +106,6 @@ public final class CommonDtoUtils {
                     entry(OffsetTime.class, ValueType.OFFSET_TIME),
                     entry(ZonedDateTime.class, ValueType.ZONED_DATE_TIME),
 
-                    entry(java.sql.Timestamp.class, ValueType.JAVA_SQL_TIMESTAMP),
                     entry(Blob.class, ValueType.BLOB),
                     entry(Clob.class, ValueType.CLOB)
                     );
@@ -135,25 +134,25 @@ public final class CommonDtoUtils {
     public static ValueDto newValueDto(
             final ValueType valueType,
             final Object value,
-            final BookmarkService bookmarkService) {
+            final @NonNull DtoContext dtoContext) {
 
         if(value == null) {
             return null;
         }
 
         final ValueDto valueDto = new ValueDto();
-        return setValueOn(valueDto, valueType, value, bookmarkService);
+        return setValueOn(valueDto, valueType, value, dtoContext);
     }
 
     public static <T extends ValueWithTypeDto> T setValueOn(
             final T valueWithTypeDto,
             final ValueType valueType,
             final Object value,
-            final BookmarkService bookmarkService) {
+            final @NonNull DtoContext dtoContext) {
 
         valueWithTypeDto.setType(valueType);
 
-        setValueOn((ValueDto)valueWithTypeDto, valueType, value, bookmarkService);
+        setValueOn((ValueDto)valueWithTypeDto, valueType, value, dtoContext);
         valueWithTypeDto.setNull(value == null);
 
         return valueWithTypeDto;
@@ -163,11 +162,11 @@ public final class CommonDtoUtils {
             final T valueWithTypeDto,
             final ValueType elementValueType,
             final Object value,
-            final BookmarkService bookmarkService) {
+            final @NonNull DtoContext dtoContext) {
 
         valueWithTypeDto.setType(ValueType.COLLECTION);
 
-        val collectionDto = asCollectionDto(value, elementValueType, bookmarkService);
+        val collectionDto = asCollectionDto(value, elementValueType, dtoContext);
         valueWithTypeDto.setCollection(collectionDto);
         valueWithTypeDto.setNull(value == null);
 
@@ -178,14 +177,20 @@ public final class CommonDtoUtils {
             final T valueDto,
             final ValueType valueType,
             final Object pojo,
-            final BookmarkService bookmarkService) {
+            final @NonNull DtoContext dtoContext) {
 
         switch (valueType) {
         case COLLECTION: {
-            final CollectionDto collectionDto = asCollectionDto(pojo, ValueType.VOID, bookmarkService);
+            final CollectionDto collectionDto = asCollectionDto(
+                    pojo, ValueType.VOID, dtoContext);
             valueDto.setCollection(collectionDto);
             return valueDto;
         }
+        case COMPOSITE: {
+            final TypedTupleDto typedTupleDto = asTypedTupleDto(pojo, dtoContext);
+            valueDto.setComposite(typedTupleDto);
+            return valueDto;
+        }
         case STRING: {
             final String argValue = (String) pojo;
             valueDto.setString(argValue);
@@ -271,11 +276,6 @@ public final class CommonDtoUtils {
             valueDto.setZonedDateTime(JavaTimeXMLGregorianCalendarMarshalling.toXMLGregorianCalendar2(argValue));
             return valueDto;
         }
-        case JAVA_SQL_TIMESTAMP: {
-            final java.sql.Timestamp argValue = (java.sql.Timestamp) pojo;
-            valueDto.setTimestamp(JavaSqlXMLGregorianCalendarMarshalling.toXMLGregorianCalendar(argValue));
-            return valueDto;
-        }
         case ENUM: {
             final Enum<?> argValue = (Enum<?>) pojo;
             if(argValue == null) {
@@ -290,8 +290,8 @@ public final class CommonDtoUtils {
         case REFERENCE: {
             final Bookmark bookmark = pojo instanceof Bookmark
                     ? (Bookmark) pojo
-                    : bookmarkService!=null
-                            ? bookmarkService.bookmarkFor(pojo).orElse(null)
+                    : dtoContext.getBookmarkService()!=null
+                            ? dtoContext.getBookmarkService().bookmarkFor(pojo).orElse(null)
                             : null;
 
             if (bookmark != null) {
@@ -333,7 +333,7 @@ public final class CommonDtoUtils {
     private static CollectionDto asCollectionDto(
             final @Nullable Object iterableOrArray,
             final @NonNull  ValueType commonElementValueType,
-            final @Nullable BookmarkService bookmarkService) {
+            final @NonNull DtoContext dtoContext) {
 
         val collectionDto = new CollectionDto();
         collectionDto.setType(commonElementValueType);
@@ -346,10 +346,10 @@ public final class CommonDtoUtils {
         .forEach(element->{
             val valueDto = new ValueDto();
             if(element==null) {
-                setValueOn(valueDto, ValueType.VOID, element, bookmarkService);
+                setValueOn(valueDto, ValueType.VOID, element, dtoContext);
             } else {
                 val elementValueType = asValueType(element.getClass());
-                setValueOn(valueDto, elementValueType, element, bookmarkService);
+                setValueOn(valueDto, elementValueType, element, dtoContext);
 
                 if(needsCommonElementValueTypeAutodetect) {
                     commonElementValueTypeRef.update(acc->reduce(acc, elementValueType));
@@ -366,6 +366,14 @@ public final class CommonDtoUtils {
         return collectionDto;
     }
 
+    private static TypedTupleDto asTypedTupleDto(
+            final @Nullable Object composite,
+            final @NonNull DtoContext dtoContext) {
+        val typedTupleDto = new TypedTupleDto();
+        //TODO implement
+        return typedTupleDto;
+    }
+
     // -- getValue (from valueDto)
 
     private static ValueType reduce(final ValueType acc, final ValueType next) {
@@ -425,8 +433,8 @@ public final class CommonDtoUtils {
             return JavaTimeXMLGregorianCalendarMarshalling.toOffsetTime(valueDto.getOffsetTime());
         case ZONED_DATE_TIME:
             return JavaTimeXMLGregorianCalendarMarshalling.toZonedDateTime(valueDto.getZonedDateTime());
-        case JAVA_SQL_TIMESTAMP:
-            return JavaSqlXMLGregorianCalendarMarshalling.toTimestamp(valueDto.getTimestamp());
+//        case JAVA_SQL_TIMESTAMP:
+//            return JavaSqlXMLGregorianCalendarMarshalling.toTimestamp(valueDto.getTimestamp());
         case ENUM:
             final EnumDto enumDto = valueDto.getEnum();
             final String enumType = enumDto.getEnumType();
@@ -489,12 +497,12 @@ public final class CommonDtoUtils {
     public static ValueWithTypeDto newValueWithTypeDto(
             final Class<?> type,
             final Object val,
-            final BookmarkService bookmarkService) {
+            final @NonNull DtoContext dtoContext) {
 
         final ValueWithTypeDto valueWithTypeDto = new ValueWithTypeDto();
 
         final ValueType valueType = asValueType(type);
-        setValueOn(valueWithTypeDto, valueType, val, bookmarkService);
+        setValueOn(valueWithTypeDto, valueType, val, dtoContext);
 
         return valueWithTypeDto;
     }
@@ -521,7 +529,7 @@ public final class CommonDtoUtils {
             final String parameterName,
             final Class<?> parameterType,
             final Object arg,
-            final BookmarkService bookmarkService) {
+            final @NonNull DtoContext dtoContext) {
 
         val paramDto = new ParamDto();
         paramDto.setName(parameterName);
@@ -535,7 +543,7 @@ public final class CommonDtoUtils {
 
         paramDto.setType(valueType);
 
-        CommonDtoUtils.setValueOn(paramDto, valueType, arg, bookmarkService);
+        CommonDtoUtils.setValueOn(paramDto, valueType, arg, dtoContext);
 
         return paramDto;
     }
@@ -544,14 +552,14 @@ public final class CommonDtoUtils {
             final String parameterName,
             final Class<?> parameterElementType,
             final Object arg,
-            final BookmarkService bookmarkService) {
+            final @NonNull DtoContext dtoContext) {
 
         val paramDto = new ParamDto();
         paramDto.setName(parameterName);
         paramDto.setType(ValueType.COLLECTION);
 
         val elementValueType = CommonDtoUtils.asValueType(parameterElementType);
-        CommonDtoUtils.setValueOnNonScalar(paramDto, elementValueType, arg, bookmarkService);
+        CommonDtoUtils.setValueOnNonScalar(paramDto, elementValueType, arg, dtoContext);
 
         return paramDto;
     }
diff --git a/core/config/src/main/java/org/apache/isis/core/config/valuetypes/ValueSemanticsRegistry.java b/api/applib/src/main/java/org/apache/isis/applib/util/schema/DtoContext.java
similarity index 61%
rename from core/config/src/main/java/org/apache/isis/core/config/valuetypes/ValueSemanticsRegistry.java
rename to api/applib/src/main/java/org/apache/isis/applib/util/schema/DtoContext.java
index 653fde5..816a465 100644
--- a/core/config/src/main/java/org/apache/isis/core/config/valuetypes/ValueSemanticsRegistry.java
+++ b/api/applib/src/main/java/org/apache/isis/applib/util/schema/DtoContext.java
@@ -16,21 +16,20 @@
  *  specific language governing permissions and limitations
  *  under the License.
  */
-package org.apache.isis.core.config.valuetypes;
+package org.apache.isis.applib.util.schema;
 
-import java.util.stream.Stream;
+import org.apache.isis.applib.services.bookmark.BookmarkService;
+import org.apache.isis.applib.value.semantics.ValueSemanticsResolver;
 
-import org.apache.isis.applib.value.semantics.ValueSemanticsProvider;
-import org.apache.isis.commons.collections.Can;
-
-public interface ValueSemanticsRegistry {
-
-    boolean hasValueSemantics(Class<?> valueType);
-
-    <T> Stream<ValueSemanticsProvider<T>> streamValueSemantics(Class<T> valueType);
-
-    <T> Can<ValueSemanticsProvider<T>> selectValueSemantics(Class<T> valueType);
+/**
+ * Provides the runtime context for converting <i>Schema</i> DTOs
+ * between their XML and their Java type representation.
+ *
+ * @since 2.x {@index}
+ */
+public interface DtoContext {
 
-    Stream<Class<?>> streamClassesWithValueSemantics();
+    BookmarkService getBookmarkService();
+    ValueSemanticsResolver getValueSemanticsResolver();
 
 }
diff --git a/api/applib/src/main/java/org/apache/isis/applib/util/schema/InteractionDtoUtils.java b/api/applib/src/main/java/org/apache/isis/applib/util/schema/InteractionDtoUtils.java
index e7b683d..c2d2cdd 100644
--- a/api/applib/src/main/java/org/apache/isis/applib/util/schema/InteractionDtoUtils.java
+++ b/api/applib/src/main/java/org/apache/isis/applib/util/schema/InteractionDtoUtils.java
@@ -35,7 +35,6 @@ import javax.xml.bind.Marshaller;
 import javax.xml.bind.Unmarshaller;
 
 import org.apache.isis.applib.services.bookmark.Bookmark;
-import org.apache.isis.applib.services.bookmark.BookmarkService;
 import org.apache.isis.applib.services.iactn.Execution;
 import org.apache.isis.applib.services.iactn.Interaction;
 import org.apache.isis.applib.util.JaxbUtil;
@@ -54,6 +53,8 @@ import org.apache.isis.schema.ixn.v2.InteractionDto;
 import org.apache.isis.schema.ixn.v2.MemberExecutionDto;
 import org.apache.isis.schema.ixn.v2.PropertyEditDto;
 
+import lombok.NonNull;
+
 /**
  * @since 1.x {@index}
  */
@@ -344,10 +345,10 @@ public final class InteractionDtoUtils {
             final String parameterName,
             final Class<?> parameterType,
             final Object arg,
-            final BookmarkService bookmarkService) {
+            final @NonNull DtoContext dtoContext) {
 
         final List<ParamDto> params = parameterListFor(interactionDto);
-        ParamDto paramDto = CommonDtoUtils.newParamDto(parameterName, parameterType, arg, bookmarkService);
+        ParamDto paramDto = CommonDtoUtils.newParamDto(parameterName, parameterType, arg, dtoContext);
         params.add(paramDto);
     }
 
@@ -358,16 +359,16 @@ public final class InteractionDtoUtils {
      *
      * @param returnType - to determine the value type (if any)
      * @param result - either a value type (possibly boxed primitive), or a reference type
-     * @param bookmarkService - used if not a value type
+     * @param dtoContext - used if not a fundamental value type
      */
     public static void addReturn(
             final ActionInvocationDto invocationDto,
             final Class<?> returnType,
             final Object result,
-            final BookmarkService bookmarkService) {
+            final @NonNull DtoContext dtoContext) {
 
         final ValueWithTypeDto returned = CommonDtoUtils
-                .newValueWithTypeDto(returnType, result, bookmarkService);
+                .newValueWithTypeDto(returnType, result, dtoContext);
         invocationDto.setReturned(returned);
     }
 
diff --git a/api/applib/src/main/java/org/apache/isis/applib/value/semantics/ValueSemanticsResolver.java b/api/applib/src/main/java/org/apache/isis/applib/value/semantics/ValueSemanticsResolver.java
index 1356cf2..1386b9a 100644
--- a/api/applib/src/main/java/org/apache/isis/applib/value/semantics/ValueSemanticsResolver.java
+++ b/api/applib/src/main/java/org/apache/isis/applib/value/semantics/ValueSemanticsResolver.java
@@ -18,12 +18,21 @@
  */
 package org.apache.isis.applib.value.semantics;
 
-import java.io.Serializable;
+import java.util.stream.Stream;
 
-//FIXME[ISIS-2877] implement (will be required by the various XxxDtoUtils)
-@FunctionalInterface
+import org.apache.isis.commons.collections.Can;
+
+/**
+ * @since 2.0 {@index}
+ */
 public interface ValueSemanticsResolver {
 
-    public <T extends Serializable> ValueSemanticsProvider<T> resolveValueSemantics(Class<T> valueType);
+    boolean hasValueSemantics(Class<?> valueType);
+
+    <T> Stream<ValueSemanticsProvider<T>> streamValueSemantics(Class<T> valueType);
+
+    <T> Can<ValueSemanticsProvider<T>> selectValueSemantics(Class<T> valueType);
+
+    Stream<Class<?>> streamClassesWithValueSemantics();
 
 }
diff --git a/api/applib/src/test/java/org/apache/isis/applib/util/schema/CommonDtoUtils_Test.java b/api/applib/src/test/java/org/apache/isis/applib/util/schema/CommonDtoUtils_Test.java
index 8fbb154..d6f9643 100644
--- a/api/applib/src/test/java/org/apache/isis/applib/util/schema/CommonDtoUtils_Test.java
+++ b/api/applib/src/test/java/org/apache/isis/applib/util/schema/CommonDtoUtils_Test.java
@@ -29,7 +29,6 @@ import static org.hamcrest.CoreMatchers.notNullValue;
 import static org.hamcrest.CoreMatchers.nullValue;
 import static org.hamcrest.MatcherAssert.assertThat;
 
-import org.apache.isis.applib.services.bookmark.BookmarkService;
 import org.apache.isis.schema.cmd.v2.MapDto;
 import org.apache.isis.schema.common.v2.ValueDto;
 import org.apache.isis.schema.common.v2.ValueType;
@@ -40,7 +39,7 @@ public class CommonDtoUtils_Test {
     public JUnitRuleMockery context = new JUnitRuleMockery();
 
     @Mock
-    private BookmarkService mockBookmarkService;
+    private DtoContext mockDtoContext;
 
     @Test
     public void enums() {
@@ -65,7 +64,7 @@ public class CommonDtoUtils_Test {
         assertThat(valueType, is(ValueType.ENUM));
 
         // and when
-        final ValueDto valueDto = CommonDtoUtils.newValueDto(valueType, enumVal, mockBookmarkService);
+        final ValueDto valueDto = CommonDtoUtils.newValueDto(valueType, enumVal, mockDtoContext);
 
         // then
         Object value = CommonDtoUtils.getValue(valueDto, valueType);
@@ -76,8 +75,8 @@ public class CommonDtoUtils_Test {
 
     @Test
     public void getMapValue() {
-        Assert.assertThat(CommonDtoUtils.getMapValue(null, "someKey"), is(nullValue()));
-        Assert.assertThat(CommonDtoUtils.getMapValue(new MapDto(), "someKey"), is(nullValue()));
+        assertThat(CommonDtoUtils.getMapValue(null, "someKey"), is(nullValue()));
+        assertThat(CommonDtoUtils.getMapValue(new MapDto(), "someKey"), is(nullValue()));
 
         // given
         final MapDto mapDto = new MapDto();
@@ -86,8 +85,8 @@ public class CommonDtoUtils_Test {
         e.setValue("someValue");
         mapDto.getEntry().add(e);
 
-        Assert.assertThat(CommonDtoUtils.getMapValue(mapDto, "someKey"), is("someValue"));
-        Assert.assertThat(CommonDtoUtils.getMapValue(mapDto, "someThingElse"), is(nullValue()));
+        assertThat(CommonDtoUtils.getMapValue(mapDto, "someKey"), is("someValue"));
+        assertThat(CommonDtoUtils.getMapValue(mapDto, "someThingElse"), is(nullValue()));
     }
 
     @Test
@@ -100,7 +99,7 @@ public class CommonDtoUtils_Test {
         final MapDto mapDto = new MapDto();
         CommonDtoUtils.putMapKeyValue(mapDto, "someKey", "someValue");
 
-        Assert.assertThat(CommonDtoUtils.getMapValue(mapDto, "someKey"), is("someValue"));
+        assertThat(CommonDtoUtils.getMapValue(mapDto, "someKey"), is("someValue"));
     }
 
 }
\ No newline at end of file
diff --git a/api/applib/src/test/java/org/apache/isis/applib/util/schema/CommonDtoUtils_setValueOn_Test.java b/api/applib/src/test/java/org/apache/isis/applib/util/schema/CommonDtoUtils_setValueOn_Test.java
index d4968ff..30e5ae5 100644
--- a/api/applib/src/test/java/org/apache/isis/applib/util/schema/CommonDtoUtils_setValueOn_Test.java
+++ b/api/applib/src/test/java/org/apache/isis/applib/util/schema/CommonDtoUtils_setValueOn_Test.java
@@ -29,7 +29,6 @@ import static org.hamcrest.CoreMatchers.is;
 import static org.hamcrest.CoreMatchers.notNullValue;
 import static org.hamcrest.CoreMatchers.nullValue;
 
-import org.apache.isis.applib.services.bookmark.BookmarkService;
 import org.apache.isis.applib.value.Blob;
 import org.apache.isis.applib.value.Clob;
 import org.apache.isis.schema.common.v2.BlobDto;
@@ -43,7 +42,7 @@ public class CommonDtoUtils_setValueOn_Test {
     public JUnitRuleMockery context = new JUnitRuleMockery();
 
     @Mock
-    private BookmarkService mockBookmarkService;
+    private DtoContext mockDtoContext;
 
     ValueDto valueDto;
     @Before
@@ -53,7 +52,7 @@ public class CommonDtoUtils_setValueOn_Test {
 
     @Test
     public void when_blob_is_null() {
-        CommonDtoUtils.setValueOn(valueDto, ValueType.BLOB, null, mockBookmarkService);
+        CommonDtoUtils.setValueOn(valueDto, ValueType.BLOB, null, mockDtoContext);
         final BlobDto blobDto = valueDto.getBlob();
         Assert.assertThat(blobDto, is(nullValue()));
     }
@@ -61,7 +60,7 @@ public class CommonDtoUtils_setValueOn_Test {
     @Test
     public void when_blob_is_not_null() {
         final Blob val = new Blob("image.png", "image/png", new byte[]{1,2,3,4,5});
-        CommonDtoUtils.setValueOn(valueDto, ValueType.BLOB, val, mockBookmarkService);
+        CommonDtoUtils.setValueOn(valueDto, ValueType.BLOB, val, mockDtoContext);
         final BlobDto blobDto = valueDto.getBlob();
         Assert.assertThat(blobDto, is(notNullValue()));
         Assert.assertThat(blobDto.getBytes(), is(val.getBytes()));
@@ -71,7 +70,7 @@ public class CommonDtoUtils_setValueOn_Test {
 
     @Test
     public void when_clob_is_null() {
-        CommonDtoUtils.setValueOn(valueDto, ValueType.CLOB, null, mockBookmarkService);
+        CommonDtoUtils.setValueOn(valueDto, ValueType.CLOB, null, mockDtoContext);
         final ClobDto clobDto = valueDto.getClob();
         Assert.assertThat(clobDto, is(nullValue()));
     }
@@ -79,7 +78,7 @@ public class CommonDtoUtils_setValueOn_Test {
     @Test
     public void when_clob_is_not_null() {
         final Clob val = new Clob("image.png", "image/png", new char[]{1,2,3,4,5});
-        CommonDtoUtils.setValueOn(valueDto, ValueType.CLOB, val, mockBookmarkService);
+        CommonDtoUtils.setValueOn(valueDto, ValueType.CLOB, val, mockDtoContext);
         final ClobDto clobDto = valueDto.getClob();
         Assert.assertThat(clobDto, is(notNullValue()));
         Assert.assertThat(clobDto.getChars(), is(val.getChars()));
diff --git a/api/applib/src/test/java/org/apache/isis/applib/util/schema/Roundtrip.java b/api/applib/src/test/java/org/apache/isis/applib/util/schema/Roundtrip.java
index 2177f0b..77ff2fb 100644
--- a/api/applib/src/test/java/org/apache/isis/applib/util/schema/Roundtrip.java
+++ b/api/applib/src/test/java/org/apache/isis/applib/util/schema/Roundtrip.java
@@ -42,6 +42,8 @@ import static org.hamcrest.MatcherAssert.assertThat;
 import static org.hamcrest.Matchers.is;
 
 import org.apache.isis.applib.services.bookmark.Bookmark;
+import org.apache.isis.applib.services.bookmark.BookmarkService;
+import org.apache.isis.applib.value.semantics.ValueSemanticsResolver;
 import org.apache.isis.commons.collections.Can;
 import org.apache.isis.commons.internal.base._NullSafe;
 import org.apache.isis.commons.internal.collections._Lists;
@@ -87,10 +89,18 @@ public class Roundtrip {
     }
 
     private static void addArg(final InteractionDto interactionDto, final Object sampleValue) {
+
+        val dtoContext = new DtoContext() {
+            @Override public BookmarkService getBookmarkService() {
+                return null; }
+            @Override public ValueSemanticsResolver getValueSemanticsResolver() {
+                return null; }
+        };
+
         val type = sampleValue.getClass();
         val name = type.getSimpleName();
-        InteractionDtoUtils.addParamArg(interactionDto, "a"+name, type, sampleValue, null);
-        InteractionDtoUtils.addParamArg(interactionDto, "null"+name, type, type.cast(null), null);
+        InteractionDtoUtils.addParamArg(interactionDto, "a"+name, type, sampleValue, dtoContext);
+        InteractionDtoUtils.addParamArg(interactionDto, "null"+name, type, type.cast(null), dtoContext);
     }
 
     private static void testArg(
diff --git a/api/schema/src/main/resources/org/apache/isis/schema/common/common-2.0.xsd b/api/schema/src/main/resources/org/apache/isis/schema/common/common-2.0.xsd
index d602c2d..1d81840 100644
--- a/api/schema/src/main/resources/org/apache/isis/schema/common/common-2.0.xsd
+++ b/api/schema/src/main/resources/org/apache/isis/schema/common/common-2.0.xsd
@@ -25,9 +25,7 @@
            xmlns:jaxb="http://java.sun.com/xml/ns/jaxb"
            xmlns:xjc="http://java.sun.com/xml/ns/jaxb/xjc"
            jaxb:extensionBindingPrefixes="xjc"
-           jaxb:version="1.0"
-           
-           >
+           jaxb:version="1.0">
            
 	<xs:annotation>
 	   <xs:appinfo>
@@ -50,22 +48,21 @@
             <xs:element name="char" type="xs:string"/>
             <xs:element name="bigInteger" type="xs:integer"/>
             <xs:element name="bigDecimal" type="xs:decimal"/>
-            <!-- java.time -->
+
+            <!-- temporal types -->
             <xs:element name="localDate" type="xs:date"/>
             <xs:element name="localDateTime" type="xs:dateTime"/>
             <xs:element name="localTime" type="xs:time"/>
             <xs:element name="offsetTime" type="xs:time"/>
             <xs:element name="offsetDateTime" type="xs:dateTime"/>
             <xs:element name="zonedDateTime" type="xs:dateTime"/>
-            <!--  -->
-            <xs:element name="timestamp" type="xs:dateTime"/>
-            <xs:element name="enum" type="enumDto"/>
+            
+            <!-- complex types -->
            <xs:element name="enum" type="enumDto"/>
             <xs:element name="reference" type="oidDto"/>
             <xs:element name="collection" type="collectionDto"/>
+            <xs:element name="composite" type="typedTupleDto"/>
             <xs:element name="blob" type="blobDto"/>
             <xs:element name="clob" type="clobDto"/>
-            
-            <xs:element name="composite" type="typedTupleDto"/>
         </xs:choice>
     </xs:complexType>
 
@@ -139,9 +136,14 @@
         </xs:sequence>
     </xs:complexType>
 
-
     <xs:simpleType name="valueType">
         <xs:restriction base="xs:string">
+        	<xs:enumeration value="void">
+                <xs:annotation>
+                    <xs:documentation>Not valid to be used as the parameter type of an action; can be used as its return type.
+                    </xs:documentation>
+                </xs:annotation>
+            </xs:enumeration>
             <xs:enumeration value="string"/>
             <xs:enumeration value="byte"/>
             <xs:enumeration value="short"/>
@@ -153,27 +155,20 @@
             <xs:enumeration value="char"/>
             <xs:enumeration value="bigInteger"/>
             <xs:enumeration value="bigDecimal"/>
-            <xs:enumeration value="javaSqlTimestamp"/>
-            <!-- java.time -->
+            <!-- temporal types -->
             <xs:enumeration value="localDateTime"/>
             <xs:enumeration value="localDate"/>
             <xs:enumeration value="localTime"/>
             <xs:enumeration value="offsetDateTime"/>
             <xs:enumeration value="offsetTime"/>
             <xs:enumeration value="zonedDateTime"/>
-            <!--  -->
+            <!-- complex types -->
             <xs:enumeration value="enum"/>
             <xs:enumeration value="reference"/>
             <xs:enumeration value="collection"/>
+            <xs:enumeration value="composite"/>
             <xs:enumeration value="blob"/>
             <xs:enumeration value="clob"/>
-            <xs:enumeration value="void">
-                <xs:annotation>
-                    <xs:documentation>Not valid to be used as the parameter type of an action; can be used as its return type.
-                    </xs:documentation>
-                </xs:annotation>
-            </xs:enumeration>
-            <xs:enumeration value="composite"/>
         </xs:restriction>
     </xs:simpleType>
 
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/IsisModuleCoreMetamodel.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/IsisModuleCoreMetamodel.java
index a56f16e..13d60e2 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/IsisModuleCoreMetamodel.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/IsisModuleCoreMetamodel.java
@@ -83,7 +83,7 @@ import org.apache.isis.core.metamodel.valuesemantics.temporal.legacy.JavaSqlDate
 import org.apache.isis.core.metamodel.valuesemantics.temporal.legacy.JavaSqlTimeStampValueSemantics;
 import org.apache.isis.core.metamodel.valuesemantics.temporal.legacy.JavaSqlTimeValueSemantics;
 import org.apache.isis.core.metamodel.valuesemantics.temporal.legacy.JavaUtilDateValueSemantics;
-import org.apache.isis.core.metamodel.valuetypes.ValueSemanticsRegistryDefault;
+import org.apache.isis.core.metamodel.valuetypes.ValueSemanticsResolverDefault;
 import org.apache.isis.core.security.IsisModuleCoreSecurity;
 
 @Configuration
@@ -103,7 +103,7 @@ import org.apache.isis.core.security.IsisModuleCoreSecurity;
         ClassSubstitutorForCollections.class,
         ClassSubstitutorForDomainObjects.class,
         ClassSubstitutorRegistry.class,
-        ValueSemanticsRegistryDefault.class,
+        ValueSemanticsResolverDefault.class,
 
         // Value Semantics (built-in defaults)
         BooleanValueSemantics.class,
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/_testing/MetaModelContext_forTesting.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/_testing/MetaModelContext_forTesting.java
index 7fdcb36..6f81556 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/_testing/MetaModelContext_forTesting.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/_testing/MetaModelContext_forTesting.java
@@ -28,6 +28,8 @@ import java.util.function.Function;
 import java.util.stream.Collectors;
 import java.util.stream.Stream;
 
+import static java.util.Objects.requireNonNull;
+
 import org.springframework.core.env.AbstractEnvironment;
 
 import org.apache.isis.applib.services.factory.FactoryService;
@@ -48,6 +50,7 @@ import org.apache.isis.applib.services.wrapper.WrapperFactory;
 import org.apache.isis.applib.services.xactn.TransactionService;
 import org.apache.isis.applib.services.xactn.TransactionState;
 import org.apache.isis.applib.value.semantics.ValueSemanticsProvider;
+import org.apache.isis.applib.value.semantics.ValueSemanticsResolver;
 import org.apache.isis.commons.collections.Can;
 import org.apache.isis.commons.internal.base._Lazy;
 import org.apache.isis.commons.internal.base._NullSafe;
@@ -62,7 +65,6 @@ import org.apache.isis.core.config.beans.IsisBeanTypeClassifier;
 import org.apache.isis.core.config.beans.IsisBeanTypeRegistry;
 import org.apache.isis.core.config.beans.IsisBeanTypeRegistryDefault;
 import org.apache.isis.core.config.environment.IsisSystemEnvironment;
-import org.apache.isis.core.config.valuetypes.ValueSemanticsRegistry;
 import org.apache.isis.core.metamodel.context.MetaModelContext;
 import org.apache.isis.core.metamodel.execution.MemberExecutorService;
 import org.apache.isis.core.metamodel.facets.object.icon.ObjectIconService;
@@ -87,12 +89,10 @@ import org.apache.isis.core.metamodel.specloader.SpecificationLoaderDefault;
 import org.apache.isis.core.metamodel.valuesemantics.BigDecimalValueSemantics;
 import org.apache.isis.core.metamodel.valuesemantics.URLValueSemantics;
 import org.apache.isis.core.metamodel.valuesemantics.UUIDValueSemantics;
-import org.apache.isis.core.metamodel.valuetypes.ValueSemanticsRegistryDefault;
+import org.apache.isis.core.metamodel.valuetypes.ValueSemanticsResolverDefault;
 import org.apache.isis.core.security.authentication.manager.AuthenticationManager;
 import org.apache.isis.core.security.authorization.manager.AuthorizationManager;
 
-import static java.util.Objects.requireNonNull;
-
 import lombok.Builder;
 import lombok.Getter;
 import lombok.NonNull;
@@ -218,7 +218,7 @@ implements MetaModelContext {
                 repositoryService,
                 transactionService,
                 transactionState,
-                getValueSemanticsRegistry(),
+                getValueSemanticsResolver(),
                 new ObjectMementoService_forTesting(),
                 new BigDecimalValueSemantics(),
                 new URLValueSemantics(),
@@ -296,12 +296,12 @@ implements MetaModelContext {
         return translationService;
     }
 
-    private ValueSemanticsRegistry valueSemanticsRegistry;
-    private ValueSemanticsRegistry getValueSemanticsRegistry(){
-        if(valueSemanticsRegistry==null) {
-            valueSemanticsRegistry = new ValueSemanticsRegistryDefault(valueSemantics, getTranslationService());
+    private ValueSemanticsResolver valueSemanticsResolver;
+    private ValueSemanticsResolver getValueSemanticsResolver(){
+        if(valueSemanticsResolver==null) {
+            valueSemanticsResolver = new ValueSemanticsResolverDefault(valueSemantics, getTranslationService());
         }
-        return valueSemanticsRegistry;
+        return valueSemanticsResolver;
     }
 
     private final IsisBeanFactoryPostProcessorForSpring isisBeanFactoryPostProcessorForSpring =
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/value/annotcfg/ValueFacetForValueAnnotationOrAnyMatchingValueSemanticsFacetFactory.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/value/annotcfg/ValueFacetForValueAnnotationOrAnyMatchingValueSemanticsFacetFactory.java
index 0b79bed..0a58659 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/value/annotcfg/ValueFacetForValueAnnotationOrAnyMatchingValueSemanticsFacetFactory.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/value/annotcfg/ValueFacetForValueAnnotationOrAnyMatchingValueSemanticsFacetFactory.java
@@ -23,9 +23,9 @@ import org.apache.isis.applib.value.semantics.DefaultsProvider;
 import org.apache.isis.applib.value.semantics.EncoderDecoder;
 import org.apache.isis.applib.value.semantics.Parser;
 import org.apache.isis.applib.value.semantics.ValueSemanticsProvider;
+import org.apache.isis.applib.value.semantics.ValueSemanticsResolver;
 import org.apache.isis.commons.collections.Can;
 import org.apache.isis.commons.internal.base._Casts;
-import org.apache.isis.core.config.valuetypes.ValueSemanticsRegistry;
 import org.apache.isis.core.metamodel.context.MetaModelContext;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
 import org.apache.isis.core.metamodel.facetapi.FeatureType;
@@ -93,7 +93,7 @@ extends FacetFactoryAbstract {
                 .create(valueIfAny, cls, facetHolder));
 
         final Can<ValueSemanticsProvider> valueSemantics = _Casts.uncheckedCast(
-                getValueSemanticsRegistry().selectValueSemantics(cls));
+                getValueSemanticsResolver().selectValueSemantics(cls));
 
         if(!valueSemantics.isEmpty()) {
             addAllFacetsForValueSemantics(valueSemantics, facetHolder);
@@ -166,7 +166,7 @@ extends FacetFactoryAbstract {
     // -- DEPENDENCIES
 
     @Getter(lazy = true, value = AccessLevel.PRIVATE)
-    private final ValueSemanticsRegistry valueSemanticsRegistry =
-        getServiceRegistry().lookupServiceElseFail(ValueSemanticsRegistry.class);
+    private final ValueSemanticsResolver valueSemanticsResolver =
+        getServiceRegistry().lookupServiceElseFail(ValueSemanticsResolver.class);
 
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/SpecificationLoaderDefault.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/SpecificationLoaderDefault.java
index 3d91977..c16b75c 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/SpecificationLoaderDefault.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/SpecificationLoaderDefault.java
@@ -45,6 +45,7 @@ import org.apache.isis.applib.services.appfeat.ApplicationFeatureSort;
 import org.apache.isis.applib.services.menu.MenuBarsService;
 import org.apache.isis.applib.services.metamodel.BeanSort;
 import org.apache.isis.applib.services.registry.ServiceRegistry;
+import org.apache.isis.applib.value.semantics.ValueSemanticsResolver;
 import org.apache.isis.commons.collections.Can;
 import org.apache.isis.commons.internal.assertions._Assert;
 import org.apache.isis.commons.internal.base._Blackhole;
@@ -59,7 +60,6 @@ import org.apache.isis.core.config.beans.IsisBeanTypeClassifier;
 import org.apache.isis.core.config.beans.IsisBeanTypeRegistry;
 import org.apache.isis.core.config.environment.IsisSystemEnvironment;
 import org.apache.isis.core.config.metamodel.specloader.IntrospectionMode;
-import org.apache.isis.core.config.valuetypes.ValueSemanticsRegistry;
 import org.apache.isis.core.metamodel.commons.ClassUtil;
 import org.apache.isis.core.metamodel.context.MetaModelContext;
 import org.apache.isis.core.metamodel.facetapi.Facet;
@@ -79,7 +79,7 @@ import org.apache.isis.core.metamodel.specloader.specimpl.dflt.ObjectSpecificati
 import org.apache.isis.core.metamodel.specloader.validator.MetaModelValidatorAbstract;
 import org.apache.isis.core.metamodel.specloader.validator.ValidationFailure;
 import org.apache.isis.core.metamodel.specloader.validator.ValidationFailures;
-import org.apache.isis.core.metamodel.valuetypes.ValueSemanticsRegistryDefault;
+import org.apache.isis.core.metamodel.valuetypes.ValueSemanticsResolverDefault;
 
 import lombok.Getter;
 import lombok.NonNull;
@@ -115,7 +115,7 @@ public class SpecificationLoaderDefault implements SpecificationLoader {
     private final IsisBeanTypeClassifier isisBeanTypeClassifier;
     private final IsisBeanTypeRegistry isisBeanTypeRegistry;
     private final ClassSubstitutorRegistry classSubstitutorRegistry;
-    private final Provider<ValueSemanticsRegistry> valueSemanticsRegistry;
+    private final Provider<ValueSemanticsResolver> valueSemanticsResolver;
 
     private final ProgrammingModel programmingModel;
     private final PostProcessor postProcessor;
@@ -142,7 +142,7 @@ public class SpecificationLoaderDefault implements SpecificationLoader {
             final ServiceRegistry serviceRegistry,
             final IsisBeanTypeClassifier isisBeanTypeClassifier,
             final IsisBeanTypeRegistry isisBeanTypeRegistry,
-            final Provider<ValueSemanticsRegistry> valueTypeRegistry,
+            final Provider<ValueSemanticsResolver> valueTypeRegistry,
             final ClassSubstitutorRegistry classSubstitutorRegistry) {
         this(
                 programmingModelService.getProgrammingModel(),
@@ -162,7 +162,7 @@ public class SpecificationLoaderDefault implements SpecificationLoader {
             final ServiceRegistry serviceRegistry,
             final IsisBeanTypeClassifier isisBeanTypeClassifier,
             final IsisBeanTypeRegistry isisBeanTypeRegistry,
-            final Provider<ValueSemanticsRegistry> valueSemanticsRegistry,
+            final Provider<ValueSemanticsResolver> valueSemanticsRegistry,
             final ClassSubstitutorRegistry classSubstitutorRegistry) {
         this.programmingModel = programmingModel;
         this.postProcessor = new PostProcessor(programmingModel);
@@ -171,7 +171,7 @@ public class SpecificationLoaderDefault implements SpecificationLoader {
         this.serviceRegistry = serviceRegistry;
         this.isisBeanTypeClassifier = isisBeanTypeClassifier;
         this.isisBeanTypeRegistry = isisBeanTypeRegistry;
-        this.valueSemanticsRegistry = valueSemanticsRegistry;
+        this.valueSemanticsResolver = valueSemanticsRegistry;
         this.classSubstitutorRegistry = classSubstitutorRegistry;
     }
 
@@ -187,7 +187,7 @@ public class SpecificationLoaderDefault implements SpecificationLoader {
         val instance = new SpecificationLoaderDefault(
                 programmingModel, isisConfiguration, isisSystemEnvironment,
                 serviceRegistry, isisBeanTypeClassifier, isisBeanTypeRegistry,
-                ()->new ValueSemanticsRegistryDefault(List.of(), null),
+                ()->new ValueSemanticsResolverDefault(List.of(), null),
                 new ClassSubstitutorRegistry(List.of(
                         //new ClassSubstitutorForDomainObjects(),
                         new ClassSubstitutorForCollections(),
@@ -240,7 +240,7 @@ public class SpecificationLoaderDefault implements SpecificationLoader {
         Stream
             .concat(
                 isisBeanTypeRegistry.getDiscoveredValueTypes().stream(),
-                valueSemanticsRegistry.get().streamClassesWithValueSemantics())
+                valueSemanticsResolver.get().streamClassesWithValueSemantics())
             .forEach(valueType -> {
                 val valueSpec = loadSpecification(valueType, IntrospectionState.NOT_INTROSPECTED);
                 if(valueSpec!=null) {
@@ -389,7 +389,7 @@ public class SpecificationLoaderDefault implements SpecificationLoader {
                     .lookupIntrospectableType(type)
                     .map(IsisBeanMetaData::getBeanSort)
                     .orElseGet(()->
-                        valueSemanticsRegistry.get().hasValueSemantics(type)
+                        valueSemanticsResolver.get().hasValueSemantics(type)
                         ? BeanSort.VALUE
                         : isisBeanTypeClassifier.classify(type)
                                 .getBeanSort()
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/valuesemantics/temporal/legacy/JavaSqlTimeStampValueSemantics.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/valuesemantics/temporal/legacy/JavaSqlTimeStampValueSemantics.java
index 959a823..fb448be 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/valuesemantics/temporal/legacy/JavaSqlTimeStampValueSemantics.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/valuesemantics/temporal/legacy/JavaSqlTimeStampValueSemantics.java
@@ -45,7 +45,7 @@ extends TemporalSemanticsAdapter<Timestamp, LocalDateTime> {
 
     @Override
     public ValueType getSchemaValueType() {
-        return ValueType.JAVA_SQL_TIMESTAMP;
+        return ValueType.LOCAL_DATE_TIME;
     }
 
     @Override
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/valuetypes/ValueSemanticsRegistryDefault.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/valuetypes/ValueSemanticsResolverDefault.java
similarity index 95%
rename from core/metamodel/src/main/java/org/apache/isis/core/metamodel/valuetypes/ValueSemanticsRegistryDefault.java
rename to core/metamodel/src/main/java/org/apache/isis/core/metamodel/valuetypes/ValueSemanticsResolverDefault.java
index dcad314..e05c857 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/valuetypes/ValueSemanticsRegistryDefault.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/valuetypes/ValueSemanticsResolverDefault.java
@@ -32,21 +32,21 @@ import org.apache.isis.applib.annotation.Introspection.IntrospectionPolicy;
 import org.apache.isis.applib.annotation.PriorityPrecedence;
 import org.apache.isis.applib.services.i18n.TranslationService;
 import org.apache.isis.applib.value.semantics.ValueSemanticsProvider;
+import org.apache.isis.applib.value.semantics.ValueSemanticsResolver;
 import org.apache.isis.commons.collections.Can;
 import org.apache.isis.commons.internal.base._Casts;
 import org.apache.isis.commons.internal.base._NullSafe;
 import org.apache.isis.commons.internal.collections._Maps;
-import org.apache.isis.core.config.valuetypes.ValueSemanticsRegistry;
 import org.apache.isis.core.metamodel.valuesemantics.EnumValueSemanticsAbstract;
 
 import lombok.RequiredArgsConstructor;
 
 @Service
-@Named("isis.metamodel.ValueSemanticsRegistryDefault")
+@Named("isis.metamodel.ValueSemanticsResolverDefault")
 @javax.annotation.Priority(PriorityPrecedence.MIDPOINT)
 @RequiredArgsConstructor(onConstructor_ = {@Inject})
-public class ValueSemanticsRegistryDefault
-implements ValueSemanticsRegistry {
+public class ValueSemanticsResolverDefault
+implements ValueSemanticsResolver {
 
     // managed by Spring
     private final List<ValueSemanticsProvider<?>> valueSemanticsProviders;
diff --git a/core/runtimeservices/src/main/java/org/apache/isis/core/runtimeservices/command/CommandDtoFactoryDefault.java b/core/runtimeservices/src/main/java/org/apache/isis/core/runtimeservices/command/CommandDtoFactoryDefault.java
index 142ba6d..0c8f396 100644
--- a/core/runtimeservices/src/main/java/org/apache/isis/core/runtimeservices/command/CommandDtoFactoryDefault.java
+++ b/core/runtimeservices/src/main/java/org/apache/isis/core/runtimeservices/command/CommandDtoFactoryDefault.java
@@ -29,11 +29,11 @@ import org.springframework.stereotype.Service;
 
 import org.apache.isis.applib.annotation.PriorityPrecedence;
 import org.apache.isis.applib.services.bookmark.Bookmark;
-import org.apache.isis.applib.services.bookmark.BookmarkService;
 import org.apache.isis.applib.services.clock.ClockService;
 import org.apache.isis.applib.services.user.UserService;
 import org.apache.isis.applib.util.schema.CommandDtoUtils;
 import org.apache.isis.applib.util.schema.CommonDtoUtils;
+import org.apache.isis.applib.util.schema.DtoContext;
 import org.apache.isis.commons.collections.Can;
 import org.apache.isis.commons.internal.exceptions._Exceptions;
 import org.apache.isis.core.metamodel.facetapi.FeatureType;
@@ -66,9 +66,9 @@ import lombok.val;
 @Qualifier("Default")
 public class CommandDtoFactoryDefault implements CommandDtoFactory {
 
-    @Inject BookmarkService bookmarkService;
-    @Inject ClockService clockService;
-    @Inject UserService userService;
+    @Inject private DtoContext dtoContext;
+    @Inject private ClockService clockService;
+    @Inject private UserService userService;
 
     @Override
     public CommandDto asCommandDto(
@@ -132,13 +132,13 @@ public class CommandDtoFactoryDefault implements CommandDtoFactory {
                                 .orElseThrow(_Exceptions::unexpectedCodeReach),
                             paramTypeOrElementType,
                             arg,
-                            bookmarkService)
+                            dtoContext)
                     : CommonDtoUtils.newParamDto(
                             actionParameter.getStaticFriendlyName()
                                 .orElseThrow(_Exceptions::unexpectedCodeReach),
                             paramTypeOrElementType,
                             arg,
-                            bookmarkService);
+                            dtoContext);
 
             CommandDtoUtils.parametersFor(actionDto)
                 .getParameter()
@@ -159,7 +159,7 @@ public class CommandDtoFactoryDefault implements CommandDtoFactory {
         val valueType = valueSpec.getCorrespondingClass();
 
         val newValue = CommonDtoUtils.newValueWithTypeDto(
-                valueType, UnwrapUtil.single(valueAdapter), bookmarkService);
+                valueType, UnwrapUtil.single(valueAdapter), dtoContext);
         propertyDto.setNewValue(newValue);
     }
 
diff --git a/core/runtimeservices/src/main/java/org/apache/isis/core/runtimeservices/command/DtoContextDefault.java b/core/runtimeservices/src/main/java/org/apache/isis/core/runtimeservices/command/DtoContextDefault.java
new file mode 100644
index 0000000..af3dbdb
--- /dev/null
+++ b/core/runtimeservices/src/main/java/org/apache/isis/core/runtimeservices/command/DtoContextDefault.java
@@ -0,0 +1,29 @@
+package org.apache.isis.core.runtimeservices.command;
+
+import javax.annotation.Priority;
+import javax.inject.Inject;
+import javax.inject.Named;
+
+import org.springframework.beans.factory.annotation.Qualifier;
+import org.springframework.stereotype.Component;
+
+import org.apache.isis.applib.annotation.PriorityPrecedence;
+import org.apache.isis.applib.services.bookmark.BookmarkService;
+import org.apache.isis.applib.util.schema.DtoContext;
+import org.apache.isis.applib.value.semantics.ValueSemanticsResolver;
+
+import lombok.Getter;
+import lombok.RequiredArgsConstructor;
+
+@Component
+@Named("isis.runtimeservices.DtoContextDefault")
+@Priority(PriorityPrecedence.MIDPOINT)
+@Qualifier("Default")
+@Getter(onMethod_ = {@Override})
+@RequiredArgsConstructor
+public class DtoContextDefault implements DtoContext {
+
+    @Inject private BookmarkService bookmarkService;
+    @Inject private ValueSemanticsResolver valueSemanticsResolver;
+
+}
diff --git a/core/runtimeservices/src/main/java/org/apache/isis/core/runtimeservices/interaction/InteractionDtoFactoryDefault.java b/core/runtimeservices/src/main/java/org/apache/isis/core/runtimeservices/interaction/InteractionDtoFactoryDefault.java
index 0753692..9fd5bd2 100644
--- a/core/runtimeservices/src/main/java/org/apache/isis/core/runtimeservices/interaction/InteractionDtoFactoryDefault.java
+++ b/core/runtimeservices/src/main/java/org/apache/isis/core/runtimeservices/interaction/InteractionDtoFactoryDefault.java
@@ -29,11 +29,11 @@ import org.springframework.stereotype.Service;
 
 import org.apache.isis.applib.annotation.PriorityPrecedence;
 import org.apache.isis.applib.services.bookmark.Bookmark;
-import org.apache.isis.applib.services.bookmark.BookmarkService;
 import org.apache.isis.applib.services.iactn.Interaction;
 import org.apache.isis.applib.services.iactn.InteractionProvider;
 import org.apache.isis.applib.services.user.UserService;
 import org.apache.isis.applib.util.schema.CommandDtoUtils;
+import org.apache.isis.applib.util.schema.DtoContext;
 import org.apache.isis.applib.util.schema.InteractionDtoUtils;
 import org.apache.isis.commons.collections.Can;
 import org.apache.isis.commons.internal.assertions._Assert;
@@ -68,7 +68,7 @@ import lombok.val;
 public class InteractionDtoFactoryDefault implements InteractionDtoFactory {
 
     @Inject private CommandDtoFactory commandDtoServiceInternal;
-    @Inject private BookmarkService bookmarkService;
+    @Inject private DtoContext dtoContext;
     @Inject private javax.inject.Provider<InteractionProvider> interactionProviderProvider;
     @Inject private UserService userService;
 
@@ -114,7 +114,7 @@ public class InteractionDtoFactoryDefault implements InteractionDtoFactory {
         final Class<?> returnType = returnSpec.getCorrespondingClass();
 
         InteractionDtoUtils.addReturn(
-                actionInvocationDto, returnType, resultPojo, bookmarkService);
+                actionInvocationDto, returnType, resultPojo, dtoContext);
 
         return actionInvocationDto;
     }
@@ -147,7 +147,4 @@ public class InteractionDtoFactoryDefault implements InteractionDtoFactory {
                 );
     }
 
-
-
-
 }
diff --git a/regressiontests/stable-value/src/test/java/org/apache/isis/testdomain/value/ValueSemanticsTest.java b/regressiontests/stable-value/src/test/java/org/apache/isis/testdomain/value/ValueSemanticsTest.java
index c3b7663..5b2e80d 100644
--- a/regressiontests/stable-value/src/test/java/org/apache/isis/testdomain/value/ValueSemanticsTest.java
+++ b/regressiontests/stable-value/src/test/java/org/apache/isis/testdomain/value/ValueSemanticsTest.java
@@ -46,9 +46,9 @@ import org.apache.isis.applib.services.iactnlayer.InteractionService;
 import org.apache.isis.applib.services.inject.ServiceInjector;
 import org.apache.isis.applib.util.schema.CommonDtoUtils;
 import org.apache.isis.applib.value.Password;
+import org.apache.isis.applib.value.semantics.ValueSemanticsResolver;
 import org.apache.isis.commons.internal.collections._Sets;
 import org.apache.isis.core.config.presets.IsisPresets;
-import org.apache.isis.core.config.valuetypes.ValueSemanticsRegistry;
 import org.apache.isis.core.metamodel.consent.InteractionInitiatedBy;
 import org.apache.isis.core.metamodel.interactions.managed.ActionInteraction;
 import org.apache.isis.core.metamodel.spec.ManagedObject;
@@ -188,14 +188,14 @@ class ValueSemanticsTest {
     @Test @Disabled
     void fullTypeCoverage() {
 
-        valueSemanticsRegistry.streamClassesWithValueSemantics()
+        valueSemanticsResolver.streamClassesWithValueSemantics()
         .forEach(valueType->System.err.printf("%s%n", valueType.getName()));
 
         final Set<Class<?>> valueTypesCovered = valueTypeExampleProvider.streamExamples()
         .map(ValueTypeExample::getValueType)
         .collect(Collectors.toSet());
 
-        final Set<Class<?>> valueTypesKnown = valueSemanticsRegistry.streamClassesWithValueSemantics()
+        final Set<Class<?>> valueTypesKnown = valueSemanticsResolver.streamClassesWithValueSemantics()
         .collect(Collectors.toSet());
 
         val valueTypesNotCovered = _Sets.minus(valueTypesKnown, valueTypesCovered);
@@ -219,7 +219,7 @@ class ValueSemanticsTest {
     @Inject SpecificationLoader specLoader;
     @Inject InteractionService interactionService;
     @Inject ServiceInjector serviceInjector;
-    @Inject ValueSemanticsRegistry valueSemanticsRegistry;
+    @Inject ValueSemanticsResolver valueSemanticsResolver;
 
     Stream<Arguments> provideValueTypeExamples() {
         return valueTypeExampleProvider.streamScenarios()
diff --git a/viewers/wicket/ui/src/test/java/org/apache/isis/viewer/wicket/ui/components/scalars/ConverterTester.java b/viewers/wicket/ui/src/test/java/org/apache/isis/viewer/wicket/ui/components/scalars/ConverterTester.java
index 840b319..79304d2 100644
--- a/viewers/wicket/ui/src/test/java/org/apache/isis/viewer/wicket/ui/components/scalars/ConverterTester.java
+++ b/viewers/wicket/ui/src/test/java/org/apache/isis/viewer/wicket/ui/components/scalars/ConverterTester.java
@@ -26,26 +26,26 @@ import java.util.Objects;
 import org.apache.wicket.util.convert.ConversionException;
 import org.assertj.core.util.Arrays;
 
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertNotNull;
+import static org.junit.jupiter.api.Assertions.assertNull;
+import static org.junit.jupiter.api.Assertions.assertThrows;
+import static org.junit.jupiter.api.Assertions.assertTrue;
+
 import org.apache.isis.applib.clock.VirtualClock;
 import org.apache.isis.applib.services.clock.ClockService;
 import org.apache.isis.applib.services.iactnlayer.InteractionContext;
 import org.apache.isis.applib.services.iactnlayer.InteractionService;
 import org.apache.isis.applib.value.semantics.ValueSemanticsAbstract;
+import org.apache.isis.applib.value.semantics.ValueSemanticsResolver;
 import org.apache.isis.commons.functional.ThrowingRunnable;
 import org.apache.isis.commons.internal.base._Strings;
-import org.apache.isis.core.config.valuetypes.ValueSemanticsRegistry;
 import org.apache.isis.core.metamodel._testing.MetaModelContext_forTesting;
 import org.apache.isis.core.metamodel.commons.ScalarRepresentation;
 import org.apache.isis.core.metamodel.context.MetaModelContext;
 import org.apache.isis.core.security._testing.InteractionService_forTesting;
 import org.apache.isis.viewer.wicket.model.converter.ConverterBasedOnValueSemantics;
 
-import static org.junit.jupiter.api.Assertions.assertEquals;
-import static org.junit.jupiter.api.Assertions.assertNotNull;
-import static org.junit.jupiter.api.Assertions.assertNull;
-import static org.junit.jupiter.api.Assertions.assertThrows;
-import static org.junit.jupiter.api.Assertions.assertTrue;
-
 import lombok.AllArgsConstructor;
 import lombok.NonNull;
 import lombok.val;
@@ -89,7 +89,7 @@ public class ConverterTester<T extends Serializable> {
         mmc.getServiceInjector().injectServicesInto(valueSemantics);
 
         // pre-requisites for testing
-        val reg = mmc.getServiceRegistry().lookupServiceElseFail(ValueSemanticsRegistry.class);
+        val reg = mmc.getServiceRegistry().lookupServiceElseFail(ValueSemanticsResolver.class);
         assertNotNull(reg.selectValueSemantics(valueType));
         assertTrue(reg.selectValueSemantics(valueType).isNotEmpty());
         assertNotNull(mmc.getServiceRegistry().lookupServiceElseFail(InteractionService.class));