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 db4e22f2b6 ISIS-3119: implement minimum value-semantics for jdo id 
types
db4e22f2b6 is described below

commit db4e22f2b6d98df63f68c2b3a8f4bced6145bdf7
Author: Andi Huber <[email protected]>
AuthorDate: Thu Aug 11 14:21:42 2022 +0200

    ISIS-3119: implement minimum value-semantics for jdo id types
    
    - can always add Parser and Renderer late if required
---
 ...nIdStringifierWithTargetEntityClassSupport.java | 12 ----------
 .../valuetypes/JdoByteIdValueSemantics.java        | 27 ++++++++++++++++++++++
 .../valuetypes/JdoByteIdentityValueSemantics.java  | 26 +++++++++++++++++++++
 .../valuetypes/JdoCharIdValueSemantics.java        | 24 +++++++++++++++++++
 .../valuetypes/JdoCharIdentityValueSemantics.java  | 25 ++++++++++++++++++++
 .../JdoDatastoreIdImplValueSemantics.java          | 24 +++++++++++++++++++
 .../valuetypes/JdoDatastoreIdValueSemantics.java   | 25 ++++++++++++++++++++
 .../JdoDatastoreUniqueLongIdValueSemantics.java    | 19 +++++----------
 .../valuetypes/JdoIntIdValueSemantics.java         | 25 ++++++++++++++++++++
 .../valuetypes/JdoIntIdentityValueSemantics.java   | 25 ++++++++++++++++++++
 .../valuetypes/JdoLongIdValueSemantics.java        | 25 ++++++++++++++++++++
 .../valuetypes/JdoLongIdentityValueSemantics.java  | 25 ++++++++++++++++++++
 .../valuetypes/JdoObjectIdValueSemantics.java      | 25 ++++++++++++++++++++
 .../JdoObjectIdentityValueSemantics.java           | 25 ++++++++++++++++++++
 .../valuetypes/JdoShortIdValueSemantics.java       | 25 ++++++++++++++++++++
 .../valuetypes/JdoShortIdentityValueSemantics.java | 25 ++++++++++++++++++++
 .../valuetypes/JdoStringIdValueSemantics.java      | 24 +++++++++++++++++++
 .../JdoStringIdentityValueSemantics.java           | 24 +++++++++++++++++++
 .../oid/IdStringifierForByteIdentity_Test.java     |  9 +++++++-
 ...erForDatastoreId_DatastoreIdImpl_long_Test.java |  8 ++++++-
 ...atastoreId_DatastoreUniqueLongId_long_Test.java | 16 +++++++++----
 ...DatastoreId_DatastoreUniqueLongId_str_Test.java | 15 ++++++++----
 .../oid/IdStringifierForIntId_Test.java            | 11 +++++----
 .../oid/IdStringifierForIntIdentity_Test.java      |  8 ++++++-
 .../oid/IdStringifierForLongId_Test.java           | 11 +++++----
 .../oid/IdStringifierForLongIdentity_Test.java     |  8 ++++++-
 .../oid/IdStringifierForObjectIdentity_Test.java   |  6 +++++
 .../oid/IdStringifierForShortIdentity_Test.java    |  8 ++++++-
 .../oid/IdStringifierForStringIdentity_Test.java   |  6 +++++
 29 files changed, 488 insertions(+), 48 deletions(-)

diff --git 
a/api/applib/src/main/java/org/apache/isis/applib/value/semantics/ValueSemanticsBasedOnIdStringifierWithTargetEntityClassSupport.java
 
b/api/applib/src/main/java/org/apache/isis/applib/value/semantics/ValueSemanticsBasedOnIdStringifierWithTargetEntityClassSupport.java
index 7401064ede..ccd179b90d 100644
--- 
a/api/applib/src/main/java/org/apache/isis/applib/value/semantics/ValueSemanticsBasedOnIdStringifierWithTargetEntityClassSupport.java
+++ 
b/api/applib/src/main/java/org/apache/isis/applib/value/semantics/ValueSemanticsBasedOnIdStringifierWithTargetEntityClassSupport.java
@@ -58,16 +58,4 @@ implements
         return value.toString();
     }
 
-    // -- COMPOSER
-
-    @Override
-    public final ValueDecomposition decompose(final T value) {
-        return decomposeAsString(value, this::enstring, ()->null);
-    }
-
-    @Override
-    public final T compose(final ValueDecomposition decomposition) {
-        return composeFromString(decomposition, this::destring, ()->null);
-    }
-
 }
diff --git 
a/persistence/jdo/datanucleus/src/main/java/org/apache/isis/persistence/jdo/datanucleus/valuetypes/JdoByteIdValueSemantics.java
 
b/persistence/jdo/datanucleus/src/main/java/org/apache/isis/persistence/jdo/datanucleus/valuetypes/JdoByteIdValueSemantics.java
index cf7c11e0e0..919bb52955 100644
--- 
a/persistence/jdo/datanucleus/src/main/java/org/apache/isis/persistence/jdo/datanucleus/valuetypes/JdoByteIdValueSemantics.java
+++ 
b/persistence/jdo/datanucleus/src/main/java/org/apache/isis/persistence/jdo/datanucleus/valuetypes/JdoByteIdValueSemantics.java
@@ -24,9 +24,14 @@ import org.datanucleus.identity.ByteId;
 import org.springframework.stereotype.Component;
 
 import org.apache.isis.applib.annotation.PriorityPrecedence;
+import org.apache.isis.applib.util.schema.CommonDtoUtils;
+import org.apache.isis.applib.value.semantics.ValueDecomposition;
 import 
org.apache.isis.applib.value.semantics.ValueSemanticsBasedOnIdStringifierWithTargetEntityClassSupport;
+import org.apache.isis.commons.internal.factory._InstanceUtil;
+import org.apache.isis.schema.common.v2.ValueType;
 
 import lombok.NonNull;
+import lombok.val;
 
 @Component
 @Priority(PriorityPrecedence.LATE)
@@ -37,8 +42,30 @@ extends 
ValueSemanticsBasedOnIdStringifierWithTargetEntityClassSupport<ByteId> {
         super(ByteId.class);
     }
 
+    // -- COMPOSER
+
+    @Override
+    public ValueDecomposition decompose(final ByteId value) {
+        return CommonDtoUtils.typedTupleBuilder(value)
+                .addFundamentalType(ValueType.STRING, "targetClassName", 
ByteId::getTargetClassName)
+                .addFundamentalType(ValueType.STRING, "key", this::enstring)
+                .buildAsDecomposition();
+    }
+
+    @Override
+    public ByteId compose(final ValueDecomposition decomposition) {
+        val elementMap = 
CommonDtoUtils.typedTupleAsMap(decomposition.rightIfAny());
+        final String targetClassName = 
(String)elementMap.get("targetClassName");
+        final String key = (String)elementMap.get("key");
+        return destring(key, _InstanceUtil.loadClass(targetClassName));
+    }
+
+    // -- ID STRINGIFIER
+
     @Override
     public ByteId destring(final @NonNull String stringified, final @NonNull 
Class<?> targetEntityClass) {
         return new ByteId(targetEntityClass, stringified);
     }
+
+
 }
diff --git 
a/persistence/jdo/datanucleus/src/main/java/org/apache/isis/persistence/jdo/datanucleus/valuetypes/JdoByteIdentityValueSemantics.java
 
b/persistence/jdo/datanucleus/src/main/java/org/apache/isis/persistence/jdo/datanucleus/valuetypes/JdoByteIdentityValueSemantics.java
index fca3e71379..2b56eac52a 100644
--- 
a/persistence/jdo/datanucleus/src/main/java/org/apache/isis/persistence/jdo/datanucleus/valuetypes/JdoByteIdentityValueSemantics.java
+++ 
b/persistence/jdo/datanucleus/src/main/java/org/apache/isis/persistence/jdo/datanucleus/valuetypes/JdoByteIdentityValueSemantics.java
@@ -24,9 +24,14 @@ import javax.jdo.identity.ByteIdentity;
 import org.springframework.stereotype.Component;
 
 import org.apache.isis.applib.annotation.PriorityPrecedence;
+import org.apache.isis.applib.util.schema.CommonDtoUtils;
+import org.apache.isis.applib.value.semantics.ValueDecomposition;
 import 
org.apache.isis.applib.value.semantics.ValueSemanticsBasedOnIdStringifierWithTargetEntityClassSupport;
+import org.apache.isis.commons.internal.factory._InstanceUtil;
+import org.apache.isis.schema.common.v2.ValueType;
 
 import lombok.NonNull;
+import lombok.val;
 
 @Component
 @Priority(PriorityPrecedence.LATE)
@@ -37,8 +42,29 @@ extends 
ValueSemanticsBasedOnIdStringifierWithTargetEntityClassSupport<ByteIdent
         super(ByteIdentity.class);
     }
 
+    // -- COMPOSER
+
+    @Override
+    public ValueDecomposition decompose(final ByteIdentity value) {
+        return CommonDtoUtils.typedTupleBuilder(value)
+                .addFundamentalType(ValueType.STRING, "targetClassName", 
ByteIdentity::getTargetClassName)
+                .addFundamentalType(ValueType.STRING, "key", this::enstring)
+                .buildAsDecomposition();
+    }
+
+    @Override
+    public ByteIdentity compose(final ValueDecomposition decomposition) {
+        val elementMap = 
CommonDtoUtils.typedTupleAsMap(decomposition.rightIfAny());
+        final String targetClassName = 
(String)elementMap.get("targetClassName");
+        final String key = (String)elementMap.get("key");
+        return destring(key, _InstanceUtil.loadClass(targetClassName));
+    }
+
+    // -- ID STRINGIFIER
+
     @Override
     public ByteIdentity destring(final @NonNull String stringified, final 
@NonNull Class<?> targetEntityClass) {
         return new ByteIdentity(targetEntityClass, stringified);
     }
+
 }
diff --git 
a/persistence/jdo/datanucleus/src/main/java/org/apache/isis/persistence/jdo/datanucleus/valuetypes/JdoCharIdValueSemantics.java
 
b/persistence/jdo/datanucleus/src/main/java/org/apache/isis/persistence/jdo/datanucleus/valuetypes/JdoCharIdValueSemantics.java
index 8869d8e56e..0cb1bf68d1 100644
--- 
a/persistence/jdo/datanucleus/src/main/java/org/apache/isis/persistence/jdo/datanucleus/valuetypes/JdoCharIdValueSemantics.java
+++ 
b/persistence/jdo/datanucleus/src/main/java/org/apache/isis/persistence/jdo/datanucleus/valuetypes/JdoCharIdValueSemantics.java
@@ -26,7 +26,11 @@ import org.springframework.stereotype.Component;
 
 import org.apache.isis.applib.annotation.PriorityPrecedence;
 import org.apache.isis.applib.services.bookmark.IdStringifier;
+import org.apache.isis.applib.util.schema.CommonDtoUtils;
+import org.apache.isis.applib.value.semantics.ValueDecomposition;
 import 
org.apache.isis.applib.value.semantics.ValueSemanticsBasedOnIdStringifierWithTargetEntityClassSupport;
+import org.apache.isis.commons.internal.factory._InstanceUtil;
+import org.apache.isis.schema.common.v2.ValueType;
 
 import lombok.Builder;
 import lombok.NonNull;
@@ -52,6 +56,26 @@ extends 
ValueSemanticsBasedOnIdStringifierWithTargetEntityClassSupport<CharId> {
         this.idStringifierForCharacter = idStringifierForCharacter;
     }
 
+    // -- COMPOSER
+
+    @Override
+    public ValueDecomposition decompose(final CharId value) {
+        return CommonDtoUtils.typedTupleBuilder(value)
+                .addFundamentalType(ValueType.STRING, "targetClassName", 
CharId::getTargetClassName)
+                .addFundamentalType(ValueType.STRING, "key", this::enstring)
+                .buildAsDecomposition();
+    }
+
+    @Override
+    public CharId compose(final ValueDecomposition decomposition) {
+        val elementMap = 
CommonDtoUtils.typedTupleAsMap(decomposition.rightIfAny());
+        final String targetClassName = 
(String)elementMap.get("targetClassName");
+        final String key = (String)elementMap.get("key");
+        return destring(key, _InstanceUtil.loadClass(targetClassName));
+    }
+
+    // -- ID STRINGIFIER
+
     @Override
     public String enstring(final @NonNull CharId value) {
         return idStringifierForCharacter.enstring(value.getKey());
diff --git 
a/persistence/jdo/datanucleus/src/main/java/org/apache/isis/persistence/jdo/datanucleus/valuetypes/JdoCharIdentityValueSemantics.java
 
b/persistence/jdo/datanucleus/src/main/java/org/apache/isis/persistence/jdo/datanucleus/valuetypes/JdoCharIdentityValueSemantics.java
index 257a8f9a57..08b11e81a2 100644
--- 
a/persistence/jdo/datanucleus/src/main/java/org/apache/isis/persistence/jdo/datanucleus/valuetypes/JdoCharIdentityValueSemantics.java
+++ 
b/persistence/jdo/datanucleus/src/main/java/org/apache/isis/persistence/jdo/datanucleus/valuetypes/JdoCharIdentityValueSemantics.java
@@ -26,7 +26,11 @@ import org.springframework.stereotype.Component;
 
 import org.apache.isis.applib.annotation.PriorityPrecedence;
 import org.apache.isis.applib.services.bookmark.IdStringifier;
+import org.apache.isis.applib.util.schema.CommonDtoUtils;
+import org.apache.isis.applib.value.semantics.ValueDecomposition;
 import 
org.apache.isis.applib.value.semantics.ValueSemanticsBasedOnIdStringifierWithTargetEntityClassSupport;
+import org.apache.isis.commons.internal.factory._InstanceUtil;
+import org.apache.isis.schema.common.v2.ValueType;
 
 import lombok.Builder;
 import lombok.NonNull;
@@ -52,6 +56,26 @@ extends 
ValueSemanticsBasedOnIdStringifierWithTargetEntityClassSupport<CharIdent
         this.idStringifierForCharacter = idStringifierForCharacter;
     }
 
+    // -- COMPOSER
+
+    @Override
+    public ValueDecomposition decompose(final CharIdentity value) {
+        return CommonDtoUtils.typedTupleBuilder(value)
+                .addFundamentalType(ValueType.STRING, "targetClassName", 
CharIdentity::getTargetClassName)
+                .addFundamentalType(ValueType.STRING, "key", this::enstring)
+                .buildAsDecomposition();
+    }
+
+    @Override
+    public CharIdentity compose(final ValueDecomposition decomposition) {
+        val elementMap = 
CommonDtoUtils.typedTupleAsMap(decomposition.rightIfAny());
+        final String targetClassName = 
(String)elementMap.get("targetClassName");
+        final String key = (String)elementMap.get("key");
+        return destring(key, _InstanceUtil.loadClass(targetClassName));
+    }
+
+    // -- ID STRINGIFIER
+
     @Override
     public String enstring(final @NonNull CharIdentity value) {
         return idStringifierForCharacter.enstring(value.getKey());
@@ -64,4 +88,5 @@ extends 
ValueSemanticsBasedOnIdStringifierWithTargetEntityClassSupport<CharIdent
         val idValue = idStringifierForCharacter.destring(stringified);
         return new CharIdentity(targetEntityClass, idValue);
     }
+
 }
diff --git 
a/persistence/jdo/datanucleus/src/main/java/org/apache/isis/persistence/jdo/datanucleus/valuetypes/JdoDatastoreIdImplValueSemantics.java
 
b/persistence/jdo/datanucleus/src/main/java/org/apache/isis/persistence/jdo/datanucleus/valuetypes/JdoDatastoreIdImplValueSemantics.java
index b8994d3186..a4654d2993 100644
--- 
a/persistence/jdo/datanucleus/src/main/java/org/apache/isis/persistence/jdo/datanucleus/valuetypes/JdoDatastoreIdImplValueSemantics.java
+++ 
b/persistence/jdo/datanucleus/src/main/java/org/apache/isis/persistence/jdo/datanucleus/valuetypes/JdoDatastoreIdImplValueSemantics.java
@@ -24,7 +24,11 @@ import org.datanucleus.identity.DatastoreIdImpl;
 import org.springframework.stereotype.Component;
 
 import org.apache.isis.applib.annotation.PriorityPrecedence;
+import org.apache.isis.applib.util.schema.CommonDtoUtils;
+import org.apache.isis.applib.value.semantics.ValueDecomposition;
 import 
org.apache.isis.applib.value.semantics.ValueSemanticsBasedOnIdStringifierWithTargetEntityClassSupport;
+import org.apache.isis.commons.internal.factory._InstanceUtil;
+import org.apache.isis.schema.common.v2.ValueType;
 
 import lombok.NonNull;
 import lombok.SneakyThrows;
@@ -41,6 +45,26 @@ extends 
ValueSemanticsBasedOnIdStringifierWithTargetEntityClassSupport<Datastore
         super(DatastoreIdImpl.class);
     }
 
+    // -- COMPOSER
+
+    @Override
+    public ValueDecomposition decompose(final DatastoreIdImpl value) {
+        return CommonDtoUtils.typedTupleBuilder(value)
+                .addFundamentalType(ValueType.STRING, "targetClassName", 
DatastoreIdImpl::getTargetClassName)
+                .addFundamentalType(ValueType.STRING, "key", this::enstring)
+                .buildAsDecomposition();
+    }
+
+    @Override
+    public DatastoreIdImpl compose(final ValueDecomposition decomposition) {
+        val elementMap = 
CommonDtoUtils.typedTupleAsMap(decomposition.rightIfAny());
+        final String targetClassName = 
(String)elementMap.get("targetClassName");
+        final String key = (String)elementMap.get("key");
+        return destring(key, _InstanceUtil.loadClass(targetClassName));
+    }
+
+    // -- ID STRINGIFIER
+
     @Override
     public String enstring(final @NonNull DatastoreIdImpl value) {
         return value.getKeyAsObject().toString();
diff --git 
a/persistence/jdo/datanucleus/src/main/java/org/apache/isis/persistence/jdo/datanucleus/valuetypes/JdoDatastoreIdValueSemantics.java
 
b/persistence/jdo/datanucleus/src/main/java/org/apache/isis/persistence/jdo/datanucleus/valuetypes/JdoDatastoreIdValueSemantics.java
index 7f154a029d..2b9484b3c0 100644
--- 
a/persistence/jdo/datanucleus/src/main/java/org/apache/isis/persistence/jdo/datanucleus/valuetypes/JdoDatastoreIdValueSemantics.java
+++ 
b/persistence/jdo/datanucleus/src/main/java/org/apache/isis/persistence/jdo/datanucleus/valuetypes/JdoDatastoreIdValueSemantics.java
@@ -28,12 +28,17 @@ import org.springframework.stereotype.Component;
 
 import org.apache.isis.applib.annotation.PriorityPrecedence;
 import org.apache.isis.applib.services.bookmark.IdStringifier;
+import org.apache.isis.applib.util.schema.CommonDtoUtils;
+import org.apache.isis.applib.value.semantics.ValueDecomposition;
 import 
org.apache.isis.applib.value.semantics.ValueSemanticsBasedOnIdStringifierWithTargetEntityClassSupport;
 import org.apache.isis.commons.internal.base._Casts;
 import org.apache.isis.commons.internal.context._Context;
+import org.apache.isis.commons.internal.factory._InstanceUtil;
+import org.apache.isis.schema.common.v2.ValueType;
 
 import lombok.NonNull;
 import lombok.SneakyThrows;
+import lombok.val;
 
 @Component
 @Priority(PriorityPrecedence.LATE + 100) // after the implementations of 
DatastoreId; for a custom impl.
@@ -44,6 +49,26 @@ extends 
ValueSemanticsBasedOnIdStringifierWithTargetEntityClassSupport<Datastore
         super(DatastoreId.class);
     }
 
+    // -- COMPOSER
+
+    @Override
+    public ValueDecomposition decompose(final DatastoreId value) {
+        return CommonDtoUtils.typedTupleBuilder(value)
+                .addFundamentalType(ValueType.STRING, "targetClassName", 
DatastoreId::getTargetClassName)
+                .addFundamentalType(ValueType.STRING, "key", this::enstring)
+                .buildAsDecomposition();
+    }
+
+    @Override
+    public DatastoreId compose(final ValueDecomposition decomposition) {
+        val elementMap = 
CommonDtoUtils.typedTupleAsMap(decomposition.rightIfAny());
+        final String targetClassName = 
(String)elementMap.get("targetClassName");
+        final String key = (String)elementMap.get("key");
+        return destring(key, _InstanceUtil.loadClass(targetClassName));
+    }
+
+    // -- ID STRINGIFIER
+
     @Override
     public String enstring(final @NonNull DatastoreId value) {
         //
diff --git 
a/persistence/jdo/datanucleus/src/main/java/org/apache/isis/persistence/jdo/datanucleus/valuetypes/JdoDatastoreUniqueLongIdValueSemantics.java
 
b/persistence/jdo/datanucleus/src/main/java/org/apache/isis/persistence/jdo/datanucleus/valuetypes/JdoDatastoreUniqueLongIdValueSemantics.java
index 66b571c3b1..47f2bebe92 100644
--- 
a/persistence/jdo/datanucleus/src/main/java/org/apache/isis/persistence/jdo/datanucleus/valuetypes/JdoDatastoreUniqueLongIdValueSemantics.java
+++ 
b/persistence/jdo/datanucleus/src/main/java/org/apache/isis/persistence/jdo/datanucleus/valuetypes/JdoDatastoreUniqueLongIdValueSemantics.java
@@ -21,34 +21,27 @@ package 
org.apache.isis.persistence.jdo.datanucleus.valuetypes;
 import javax.annotation.Priority;
 
 import org.datanucleus.identity.DatastoreUniqueLongId;
-import org.springframework.lang.Nullable;
 import org.springframework.stereotype.Component;
 
 import org.apache.isis.applib.annotation.PriorityPrecedence;
-import 
org.apache.isis.applib.value.semantics.ValueSemanticsBasedOnIdStringifierWithTargetEntityClassSupport;
+import 
org.apache.isis.applib.value.semantics.ValueSemanticsBasedOnIdStringifier;
 
 import lombok.NonNull;
-import lombok.SneakyThrows;
 
+/**
+ * @implNote has no targetEntityClass support
+ */
 @Component
 @Priority(PriorityPrecedence.LATE)
 public class JdoDatastoreUniqueLongIdValueSemantics
-extends 
ValueSemanticsBasedOnIdStringifierWithTargetEntityClassSupport<DatastoreUniqueLongId>
 {
+extends ValueSemanticsBasedOnIdStringifier<DatastoreUniqueLongId> {
 
     public JdoDatastoreUniqueLongIdValueSemantics() {
         super(DatastoreUniqueLongId.class);
     }
 
     @Override
-    public String enstring(final @NonNull DatastoreUniqueLongId value) {
-        return value.toString();
-    }
-
-    @SneakyThrows
-    @Override
-    public DatastoreUniqueLongId destring(
-            final @NonNull String stringified,
-            final @Nullable Class<?> targetEntityClass) {
+    public DatastoreUniqueLongId destring(@NonNull final String stringified) {
         return new DatastoreUniqueLongId(stringified);
     }
 
diff --git 
a/persistence/jdo/datanucleus/src/main/java/org/apache/isis/persistence/jdo/datanucleus/valuetypes/JdoIntIdValueSemantics.java
 
b/persistence/jdo/datanucleus/src/main/java/org/apache/isis/persistence/jdo/datanucleus/valuetypes/JdoIntIdValueSemantics.java
index 1591d54010..2a43679336 100644
--- 
a/persistence/jdo/datanucleus/src/main/java/org/apache/isis/persistence/jdo/datanucleus/valuetypes/JdoIntIdValueSemantics.java
+++ 
b/persistence/jdo/datanucleus/src/main/java/org/apache/isis/persistence/jdo/datanucleus/valuetypes/JdoIntIdValueSemantics.java
@@ -24,9 +24,14 @@ import org.datanucleus.identity.IntId;
 import org.springframework.stereotype.Component;
 
 import org.apache.isis.applib.annotation.PriorityPrecedence;
+import org.apache.isis.applib.util.schema.CommonDtoUtils;
+import org.apache.isis.applib.value.semantics.ValueDecomposition;
 import 
org.apache.isis.applib.value.semantics.ValueSemanticsBasedOnIdStringifierWithTargetEntityClassSupport;
+import org.apache.isis.commons.internal.factory._InstanceUtil;
+import org.apache.isis.schema.common.v2.ValueType;
 
 import lombok.NonNull;
+import lombok.val;
 
 @Component
 @Priority(PriorityPrecedence.LATE)
@@ -37,6 +42,26 @@ extends 
ValueSemanticsBasedOnIdStringifierWithTargetEntityClassSupport<IntId> {
         super(IntId.class);
     }
 
+    // -- COMPOSER
+
+    @Override
+    public ValueDecomposition decompose(final IntId value) {
+        return CommonDtoUtils.typedTupleBuilder(value)
+                .addFundamentalType(ValueType.STRING, "targetClassName", 
IntId::getTargetClassName)
+                .addFundamentalType(ValueType.STRING, "key", this::enstring)
+                .buildAsDecomposition();
+    }
+
+    @Override
+    public IntId compose(final ValueDecomposition decomposition) {
+        val elementMap = 
CommonDtoUtils.typedTupleAsMap(decomposition.rightIfAny());
+        final String targetClassName = 
(String)elementMap.get("targetClassName");
+        final String key = (String)elementMap.get("key");
+        return destring(key, _InstanceUtil.loadClass(targetClassName));
+    }
+
+    // -- ID STRINGIFIER
+
     @Override
     public IntId destring(final @NonNull String stringified, final @NonNull 
Class<?> targetEntityClass) {
         return new IntId(targetEntityClass, stringified);
diff --git 
a/persistence/jdo/datanucleus/src/main/java/org/apache/isis/persistence/jdo/datanucleus/valuetypes/JdoIntIdentityValueSemantics.java
 
b/persistence/jdo/datanucleus/src/main/java/org/apache/isis/persistence/jdo/datanucleus/valuetypes/JdoIntIdentityValueSemantics.java
index ce12f28ae8..2a3605f03c 100644
--- 
a/persistence/jdo/datanucleus/src/main/java/org/apache/isis/persistence/jdo/datanucleus/valuetypes/JdoIntIdentityValueSemantics.java
+++ 
b/persistence/jdo/datanucleus/src/main/java/org/apache/isis/persistence/jdo/datanucleus/valuetypes/JdoIntIdentityValueSemantics.java
@@ -24,9 +24,14 @@ import javax.jdo.identity.IntIdentity;
 import org.springframework.stereotype.Component;
 
 import org.apache.isis.applib.annotation.PriorityPrecedence;
+import org.apache.isis.applib.util.schema.CommonDtoUtils;
+import org.apache.isis.applib.value.semantics.ValueDecomposition;
 import 
org.apache.isis.applib.value.semantics.ValueSemanticsBasedOnIdStringifierWithTargetEntityClassSupport;
+import org.apache.isis.commons.internal.factory._InstanceUtil;
+import org.apache.isis.schema.common.v2.ValueType;
 
 import lombok.NonNull;
+import lombok.val;
 
 @Component
 @Priority(PriorityPrecedence.LATE)
@@ -37,6 +42,26 @@ extends 
ValueSemanticsBasedOnIdStringifierWithTargetEntityClassSupport<IntIdenti
         super(IntIdentity.class);
     }
 
+    // -- COMPOSER
+
+    @Override
+    public ValueDecomposition decompose(final IntIdentity value) {
+        return CommonDtoUtils.typedTupleBuilder(value)
+                .addFundamentalType(ValueType.STRING, "targetClassName", 
IntIdentity::getTargetClassName)
+                .addFundamentalType(ValueType.STRING, "key", this::enstring)
+                .buildAsDecomposition();
+    }
+
+    @Override
+    public IntIdentity compose(final ValueDecomposition decomposition) {
+        val elementMap = 
CommonDtoUtils.typedTupleAsMap(decomposition.rightIfAny());
+        final String targetClassName = 
(String)elementMap.get("targetClassName");
+        final String key = (String)elementMap.get("key");
+        return destring(key, _InstanceUtil.loadClass(targetClassName));
+    }
+
+    // -- ID STRINGIFIER
+
     @Override
     public IntIdentity destring(final @NonNull String stringified, final 
@NonNull Class<?> targetEntityClass) {
         return new IntIdentity(targetEntityClass, stringified);
diff --git 
a/persistence/jdo/datanucleus/src/main/java/org/apache/isis/persistence/jdo/datanucleus/valuetypes/JdoLongIdValueSemantics.java
 
b/persistence/jdo/datanucleus/src/main/java/org/apache/isis/persistence/jdo/datanucleus/valuetypes/JdoLongIdValueSemantics.java
index 23efa2f5fc..af150efa6a 100644
--- 
a/persistence/jdo/datanucleus/src/main/java/org/apache/isis/persistence/jdo/datanucleus/valuetypes/JdoLongIdValueSemantics.java
+++ 
b/persistence/jdo/datanucleus/src/main/java/org/apache/isis/persistence/jdo/datanucleus/valuetypes/JdoLongIdValueSemantics.java
@@ -24,9 +24,14 @@ import org.datanucleus.identity.LongId;
 import org.springframework.stereotype.Component;
 
 import org.apache.isis.applib.annotation.PriorityPrecedence;
+import org.apache.isis.applib.util.schema.CommonDtoUtils;
+import org.apache.isis.applib.value.semantics.ValueDecomposition;
 import 
org.apache.isis.applib.value.semantics.ValueSemanticsBasedOnIdStringifierWithTargetEntityClassSupport;
+import org.apache.isis.commons.internal.factory._InstanceUtil;
+import org.apache.isis.schema.common.v2.ValueType;
 
 import lombok.NonNull;
+import lombok.val;
 
 @Component
 @Priority(PriorityPrecedence.LATE)
@@ -37,6 +42,26 @@ extends 
ValueSemanticsBasedOnIdStringifierWithTargetEntityClassSupport<LongId> {
         super(LongId.class);
     }
 
+    // -- COMPOSER
+
+    @Override
+    public ValueDecomposition decompose(final LongId value) {
+        return CommonDtoUtils.typedTupleBuilder(value)
+                .addFundamentalType(ValueType.STRING, "targetClassName", 
LongId::getTargetClassName)
+                .addFundamentalType(ValueType.STRING, "key", this::enstring)
+                .buildAsDecomposition();
+    }
+
+    @Override
+    public LongId compose(final ValueDecomposition decomposition) {
+        val elementMap = 
CommonDtoUtils.typedTupleAsMap(decomposition.rightIfAny());
+        final String targetClassName = 
(String)elementMap.get("targetClassName");
+        final String key = (String)elementMap.get("key");
+        return destring(key, _InstanceUtil.loadClass(targetClassName));
+    }
+
+    // -- ID STRINGIFIER
+
     @Override
     public LongId destring(final @NonNull String stringified, final @NonNull 
Class<?> targetEntityClass) {
         return new LongId(targetEntityClass, stringified);
diff --git 
a/persistence/jdo/datanucleus/src/main/java/org/apache/isis/persistence/jdo/datanucleus/valuetypes/JdoLongIdentityValueSemantics.java
 
b/persistence/jdo/datanucleus/src/main/java/org/apache/isis/persistence/jdo/datanucleus/valuetypes/JdoLongIdentityValueSemantics.java
index 74dc4cec98..00fc9646ff 100644
--- 
a/persistence/jdo/datanucleus/src/main/java/org/apache/isis/persistence/jdo/datanucleus/valuetypes/JdoLongIdentityValueSemantics.java
+++ 
b/persistence/jdo/datanucleus/src/main/java/org/apache/isis/persistence/jdo/datanucleus/valuetypes/JdoLongIdentityValueSemantics.java
@@ -24,9 +24,14 @@ import javax.jdo.identity.LongIdentity;
 import org.springframework.stereotype.Component;
 
 import org.apache.isis.applib.annotation.PriorityPrecedence;
+import org.apache.isis.applib.util.schema.CommonDtoUtils;
+import org.apache.isis.applib.value.semantics.ValueDecomposition;
 import 
org.apache.isis.applib.value.semantics.ValueSemanticsBasedOnIdStringifierWithTargetEntityClassSupport;
+import org.apache.isis.commons.internal.factory._InstanceUtil;
+import org.apache.isis.schema.common.v2.ValueType;
 
 import lombok.NonNull;
+import lombok.val;
 
 @Component
 @Priority(PriorityPrecedence.LATE)
@@ -37,6 +42,26 @@ extends 
ValueSemanticsBasedOnIdStringifierWithTargetEntityClassSupport<LongIdent
         super(LongIdentity.class);
     }
 
+    // -- COMPOSER
+
+    @Override
+    public ValueDecomposition decompose(final LongIdentity value) {
+        return CommonDtoUtils.typedTupleBuilder(value)
+                .addFundamentalType(ValueType.STRING, "targetClassName", 
LongIdentity::getTargetClassName)
+                .addFundamentalType(ValueType.STRING, "key", this::enstring)
+                .buildAsDecomposition();
+    }
+
+    @Override
+    public LongIdentity compose(final ValueDecomposition decomposition) {
+        val elementMap = 
CommonDtoUtils.typedTupleAsMap(decomposition.rightIfAny());
+        final String targetClassName = 
(String)elementMap.get("targetClassName");
+        final String key = (String)elementMap.get("key");
+        return destring(key, _InstanceUtil.loadClass(targetClassName));
+    }
+
+    // -- ID STRINGIFIER
+
     @Override
     public LongIdentity destring(final @NonNull String stringified, final 
@NonNull Class<?> targetEntityClass) {
         return new LongIdentity(targetEntityClass, stringified);
diff --git 
a/persistence/jdo/datanucleus/src/main/java/org/apache/isis/persistence/jdo/datanucleus/valuetypes/JdoObjectIdValueSemantics.java
 
b/persistence/jdo/datanucleus/src/main/java/org/apache/isis/persistence/jdo/datanucleus/valuetypes/JdoObjectIdValueSemantics.java
index 2a706818eb..8704363e6d 100644
--- 
a/persistence/jdo/datanucleus/src/main/java/org/apache/isis/persistence/jdo/datanucleus/valuetypes/JdoObjectIdValueSemantics.java
+++ 
b/persistence/jdo/datanucleus/src/main/java/org/apache/isis/persistence/jdo/datanucleus/valuetypes/JdoObjectIdValueSemantics.java
@@ -26,10 +26,15 @@ import org.datanucleus.identity.ObjectId;
 import org.springframework.stereotype.Component;
 
 import org.apache.isis.applib.annotation.PriorityPrecedence;
+import org.apache.isis.applib.util.schema.CommonDtoUtils;
+import org.apache.isis.applib.value.semantics.ValueDecomposition;
 import 
org.apache.isis.applib.value.semantics.ValueSemanticsBasedOnIdStringifierWithTargetEntityClassSupport;
+import org.apache.isis.commons.internal.factory._InstanceUtil;
+import org.apache.isis.schema.common.v2.ValueType;
 
 import lombok.Builder;
 import lombok.NonNull;
+import lombok.val;
 
 /**
  * Implementation for application-defined primary keys.
@@ -53,6 +58,26 @@ extends 
ValueSemanticsBasedOnIdStringifierWithTargetEntityClassSupport<ObjectId>
         super(ObjectId.class);
     }
 
+    // -- COMPOSER
+
+    @Override
+    public ValueDecomposition decompose(final ObjectId value) {
+        return CommonDtoUtils.typedTupleBuilder(value)
+                .addFundamentalType(ValueType.STRING, "targetClassName", 
ObjectId::getTargetClassName)
+                .addFundamentalType(ValueType.STRING, "key", this::enstring)
+                .buildAsDecomposition();
+    }
+
+    @Override
+    public ObjectId compose(final ValueDecomposition decomposition) {
+        val elementMap = 
CommonDtoUtils.typedTupleAsMap(decomposition.rightIfAny());
+        final String targetClassName = 
(String)elementMap.get("targetClassName");
+        final String key = (String)elementMap.get("key");
+        return destring(key, _InstanceUtil.loadClass(targetClassName));
+    }
+
+    // -- ID STRINGIFIER
+
     @Override
     public String enstring(final @NonNull ObjectId value) {
         Object keyAsObject = value.getKeyAsObject();
diff --git 
a/persistence/jdo/datanucleus/src/main/java/org/apache/isis/persistence/jdo/datanucleus/valuetypes/JdoObjectIdentityValueSemantics.java
 
b/persistence/jdo/datanucleus/src/main/java/org/apache/isis/persistence/jdo/datanucleus/valuetypes/JdoObjectIdentityValueSemantics.java
index 93f01efcc4..b7db0647f4 100644
--- 
a/persistence/jdo/datanucleus/src/main/java/org/apache/isis/persistence/jdo/datanucleus/valuetypes/JdoObjectIdentityValueSemantics.java
+++ 
b/persistence/jdo/datanucleus/src/main/java/org/apache/isis/persistence/jdo/datanucleus/valuetypes/JdoObjectIdentityValueSemantics.java
@@ -26,10 +26,15 @@ import javax.jdo.identity.ObjectIdentity;
 import org.springframework.stereotype.Component;
 
 import org.apache.isis.applib.annotation.PriorityPrecedence;
+import org.apache.isis.applib.util.schema.CommonDtoUtils;
+import org.apache.isis.applib.value.semantics.ValueDecomposition;
 import 
org.apache.isis.applib.value.semantics.ValueSemanticsBasedOnIdStringifierWithTargetEntityClassSupport;
+import org.apache.isis.commons.internal.factory._InstanceUtil;
+import org.apache.isis.schema.common.v2.ValueType;
 
 import lombok.Builder;
 import lombok.NonNull;
+import lombok.val;
 
 /**
  * Implementation for application-defined primary keys.
@@ -53,6 +58,26 @@ extends 
ValueSemanticsBasedOnIdStringifierWithTargetEntityClassSupport<ObjectIde
         super(ObjectIdentity.class);
     }
 
+    // -- COMPOSER
+
+    @Override
+    public ValueDecomposition decompose(final ObjectIdentity value) {
+        return CommonDtoUtils.typedTupleBuilder(value)
+                .addFundamentalType(ValueType.STRING, "targetClassName", 
ObjectIdentity::getTargetClassName)
+                .addFundamentalType(ValueType.STRING, "key", this::enstring)
+                .buildAsDecomposition();
+    }
+
+    @Override
+    public ObjectIdentity compose(final ValueDecomposition decomposition) {
+        val elementMap = 
CommonDtoUtils.typedTupleAsMap(decomposition.rightIfAny());
+        final String targetClassName = 
(String)elementMap.get("targetClassName");
+        final String key = (String)elementMap.get("key");
+        return destring(key, _InstanceUtil.loadClass(targetClassName));
+    }
+
+    // -- ID STRINGIFIER
+
     @Override
     public String enstring(final @NonNull ObjectIdentity value) {
         Object keyAsObject = value.getKeyAsObject();
diff --git 
a/persistence/jdo/datanucleus/src/main/java/org/apache/isis/persistence/jdo/datanucleus/valuetypes/JdoShortIdValueSemantics.java
 
b/persistence/jdo/datanucleus/src/main/java/org/apache/isis/persistence/jdo/datanucleus/valuetypes/JdoShortIdValueSemantics.java
index bee54b5430..5493173a51 100644
--- 
a/persistence/jdo/datanucleus/src/main/java/org/apache/isis/persistence/jdo/datanucleus/valuetypes/JdoShortIdValueSemantics.java
+++ 
b/persistence/jdo/datanucleus/src/main/java/org/apache/isis/persistence/jdo/datanucleus/valuetypes/JdoShortIdValueSemantics.java
@@ -24,9 +24,14 @@ import org.datanucleus.identity.ShortId;
 import org.springframework.stereotype.Component;
 
 import org.apache.isis.applib.annotation.PriorityPrecedence;
+import org.apache.isis.applib.util.schema.CommonDtoUtils;
+import org.apache.isis.applib.value.semantics.ValueDecomposition;
 import 
org.apache.isis.applib.value.semantics.ValueSemanticsBasedOnIdStringifierWithTargetEntityClassSupport;
+import org.apache.isis.commons.internal.factory._InstanceUtil;
+import org.apache.isis.schema.common.v2.ValueType;
 
 import lombok.NonNull;
+import lombok.val;
 
 @Component
 @Priority(PriorityPrecedence.LATE)
@@ -37,6 +42,26 @@ extends 
ValueSemanticsBasedOnIdStringifierWithTargetEntityClassSupport<ShortId>
         super(ShortId.class);
     }
 
+    // -- COMPOSER
+
+    @Override
+    public ValueDecomposition decompose(final ShortId value) {
+        return CommonDtoUtils.typedTupleBuilder(value)
+                .addFundamentalType(ValueType.STRING, "targetClassName", 
ShortId::getTargetClassName)
+                .addFundamentalType(ValueType.STRING, "key", this::enstring)
+                .buildAsDecomposition();
+    }
+
+    @Override
+    public ShortId compose(final ValueDecomposition decomposition) {
+        val elementMap = 
CommonDtoUtils.typedTupleAsMap(decomposition.rightIfAny());
+        final String targetClassName = 
(String)elementMap.get("targetClassName");
+        final String key = (String)elementMap.get("key");
+        return destring(key, _InstanceUtil.loadClass(targetClassName));
+    }
+
+    // -- ID STRINGIFIER
+
     @Override
     public ShortId destring(final @NonNull String stringified, final @NonNull 
Class<?> targetEntityClass) {
         return new ShortId(targetEntityClass, stringified);
diff --git 
a/persistence/jdo/datanucleus/src/main/java/org/apache/isis/persistence/jdo/datanucleus/valuetypes/JdoShortIdentityValueSemantics.java
 
b/persistence/jdo/datanucleus/src/main/java/org/apache/isis/persistence/jdo/datanucleus/valuetypes/JdoShortIdentityValueSemantics.java
index 0d432f515f..2273fb91f4 100644
--- 
a/persistence/jdo/datanucleus/src/main/java/org/apache/isis/persistence/jdo/datanucleus/valuetypes/JdoShortIdentityValueSemantics.java
+++ 
b/persistence/jdo/datanucleus/src/main/java/org/apache/isis/persistence/jdo/datanucleus/valuetypes/JdoShortIdentityValueSemantics.java
@@ -24,9 +24,14 @@ import javax.jdo.identity.ShortIdentity;
 import org.springframework.stereotype.Component;
 
 import org.apache.isis.applib.annotation.PriorityPrecedence;
+import org.apache.isis.applib.util.schema.CommonDtoUtils;
+import org.apache.isis.applib.value.semantics.ValueDecomposition;
 import 
org.apache.isis.applib.value.semantics.ValueSemanticsBasedOnIdStringifierWithTargetEntityClassSupport;
+import org.apache.isis.commons.internal.factory._InstanceUtil;
+import org.apache.isis.schema.common.v2.ValueType;
 
 import lombok.NonNull;
+import lombok.val;
 
 @Component
 @Priority(PriorityPrecedence.LATE)
@@ -37,6 +42,26 @@ extends 
ValueSemanticsBasedOnIdStringifierWithTargetEntityClassSupport<ShortIden
         super(ShortIdentity.class);
     }
 
+    // -- COMPOSER
+
+    @Override
+    public ValueDecomposition decompose(final ShortIdentity value) {
+        return CommonDtoUtils.typedTupleBuilder(value)
+                .addFundamentalType(ValueType.STRING, "targetClassName", 
ShortIdentity::getTargetClassName)
+                .addFundamentalType(ValueType.STRING, "key", this::enstring)
+                .buildAsDecomposition();
+    }
+
+    @Override
+    public ShortIdentity compose(final ValueDecomposition decomposition) {
+        val elementMap = 
CommonDtoUtils.typedTupleAsMap(decomposition.rightIfAny());
+        final String targetClassName = 
(String)elementMap.get("targetClassName");
+        final String key = (String)elementMap.get("key");
+        return destring(key, _InstanceUtil.loadClass(targetClassName));
+    }
+
+    // -- ID STRINGIFIER
+
     @Override
     public ShortIdentity destring(final @NonNull String stringified, final 
@NonNull Class<?> targetEntityClass) {
         return new ShortIdentity(targetEntityClass, stringified);
diff --git 
a/persistence/jdo/datanucleus/src/main/java/org/apache/isis/persistence/jdo/datanucleus/valuetypes/JdoStringIdValueSemantics.java
 
b/persistence/jdo/datanucleus/src/main/java/org/apache/isis/persistence/jdo/datanucleus/valuetypes/JdoStringIdValueSemantics.java
index bdc1bb6f7c..2549c587ec 100644
--- 
a/persistence/jdo/datanucleus/src/main/java/org/apache/isis/persistence/jdo/datanucleus/valuetypes/JdoStringIdValueSemantics.java
+++ 
b/persistence/jdo/datanucleus/src/main/java/org/apache/isis/persistence/jdo/datanucleus/valuetypes/JdoStringIdValueSemantics.java
@@ -26,7 +26,11 @@ import org.springframework.stereotype.Component;
 
 import org.apache.isis.applib.annotation.PriorityPrecedence;
 import org.apache.isis.applib.services.bookmark.IdStringifier;
+import org.apache.isis.applib.util.schema.CommonDtoUtils;
+import org.apache.isis.applib.value.semantics.ValueDecomposition;
 import 
org.apache.isis.applib.value.semantics.ValueSemanticsBasedOnIdStringifierWithTargetEntityClassSupport;
+import org.apache.isis.commons.internal.factory._InstanceUtil;
+import org.apache.isis.schema.common.v2.ValueType;
 
 import lombok.Builder;
 import lombok.NonNull;
@@ -52,6 +56,26 @@ extends 
ValueSemanticsBasedOnIdStringifierWithTargetEntityClassSupport<StringIde
         this.idStringifierForString = idStringifierForString;
     }
 
+    // -- COMPOSER
+
+    @Override
+    public ValueDecomposition decompose(final StringIdentity value) {
+        return CommonDtoUtils.typedTupleBuilder(value)
+                .addFundamentalType(ValueType.STRING, "targetClassName", 
StringIdentity::getTargetClassName)
+                .addFundamentalType(ValueType.STRING, "key", this::enstring)
+                .buildAsDecomposition();
+    }
+
+    @Override
+    public StringIdentity compose(final ValueDecomposition decomposition) {
+        val elementMap = 
CommonDtoUtils.typedTupleAsMap(decomposition.rightIfAny());
+        final String targetClassName = 
(String)elementMap.get("targetClassName");
+        final String key = (String)elementMap.get("key");
+        return destring(key, _InstanceUtil.loadClass(targetClassName));
+    }
+
+    // -- ID STRINGIFIER
+
     @Override
     public String enstring(final @NonNull StringIdentity value) {
         return idStringifierForString.enstring(value.getKey());
diff --git 
a/persistence/jdo/datanucleus/src/main/java/org/apache/isis/persistence/jdo/datanucleus/valuetypes/JdoStringIdentityValueSemantics.java
 
b/persistence/jdo/datanucleus/src/main/java/org/apache/isis/persistence/jdo/datanucleus/valuetypes/JdoStringIdentityValueSemantics.java
index 7a3b23de0f..96a6dbf8bd 100644
--- 
a/persistence/jdo/datanucleus/src/main/java/org/apache/isis/persistence/jdo/datanucleus/valuetypes/JdoStringIdentityValueSemantics.java
+++ 
b/persistence/jdo/datanucleus/src/main/java/org/apache/isis/persistence/jdo/datanucleus/valuetypes/JdoStringIdentityValueSemantics.java
@@ -26,7 +26,11 @@ import org.springframework.stereotype.Component;
 
 import org.apache.isis.applib.annotation.PriorityPrecedence;
 import org.apache.isis.applib.services.bookmark.IdStringifier;
+import org.apache.isis.applib.util.schema.CommonDtoUtils;
+import org.apache.isis.applib.value.semantics.ValueDecomposition;
 import 
org.apache.isis.applib.value.semantics.ValueSemanticsBasedOnIdStringifierWithTargetEntityClassSupport;
+import org.apache.isis.commons.internal.factory._InstanceUtil;
+import org.apache.isis.schema.common.v2.ValueType;
 
 import lombok.Builder;
 import lombok.NonNull;
@@ -52,6 +56,26 @@ extends 
ValueSemanticsBasedOnIdStringifierWithTargetEntityClassSupport<StringIde
         this.idStringifierForString = idStringifierForString;
     }
 
+    // -- COMPOSER
+
+    @Override
+    public ValueDecomposition decompose(final StringIdentity value) {
+        return CommonDtoUtils.typedTupleBuilder(value)
+                .addFundamentalType(ValueType.STRING, "targetClassName", 
StringIdentity::getTargetClassName)
+                .addFundamentalType(ValueType.STRING, "key", this::enstring)
+                .buildAsDecomposition();
+    }
+
+    @Override
+    public StringIdentity compose(final ValueDecomposition decomposition) {
+        val elementMap = 
CommonDtoUtils.typedTupleAsMap(decomposition.rightIfAny());
+        final String targetClassName = 
(String)elementMap.get("targetClassName");
+        final String key = (String)elementMap.get("key");
+        return destring(key, _InstanceUtil.loadClass(targetClassName));
+    }
+
+    // -- ID STRINGIFIER
+
     @Override
     public String enstring(final @NonNull StringIdentity value) {
         return idStringifierForString.enstring(value.getKey());
diff --git 
a/persistence/jdo/datanucleus/src/test/java/org/apache/isis/persistence/jdo/datanucleus/oid/IdStringifierForByteIdentity_Test.java
 
b/persistence/jdo/datanucleus/src/test/java/org/apache/isis/persistence/jdo/datanucleus/oid/IdStringifierForByteIdentity_Test.java
index 83a584bb27..307c7bdb1a 100644
--- 
a/persistence/jdo/datanucleus/src/test/java/org/apache/isis/persistence/jdo/datanucleus/oid/IdStringifierForByteIdentity_Test.java
+++ 
b/persistence/jdo/datanucleus/src/test/java/org/apache/isis/persistence/jdo/datanucleus/oid/IdStringifierForByteIdentity_Test.java
@@ -49,7 +49,7 @@ class IdStringifierForByteIdentity_Test {
 
     @ParameterizedTest
     @MethodSource()
-    void roundtrip(Byte value) {
+    void roundtrip(final Byte value) {
 
         val entityType = Customer.class;
 
@@ -60,6 +60,13 @@ class IdStringifierForByteIdentity_Test {
 
         Assertions.assertThat(parse.getKeyAsObject()).isEqualTo(value);
         Assertions.assertThat(parse.getTargetClass()).isEqualTo(entityType);
+
+        val decomposed = stringifier.decompose(new ByteIdentity(entityType, 
value));
+        val composed = stringifier.compose(decomposed);
+
+        Assertions.assertThat(composed.getKeyAsObject()).isEqualTo(value);
+        Assertions.assertThat(composed.getTargetClass()).isEqualTo(entityType);
+
     }
 
 }
diff --git 
a/persistence/jdo/datanucleus/src/test/java/org/apache/isis/persistence/jdo/datanucleus/oid/IdStringifierForDatastoreId_DatastoreIdImpl_long_Test.java
 
b/persistence/jdo/datanucleus/src/test/java/org/apache/isis/persistence/jdo/datanucleus/oid/IdStringifierForDatastoreId_DatastoreIdImpl_long_Test.java
index 4560813f0c..4e795cacad 100644
--- 
a/persistence/jdo/datanucleus/src/test/java/org/apache/isis/persistence/jdo/datanucleus/oid/IdStringifierForDatastoreId_DatastoreIdImpl_long_Test.java
+++ 
b/persistence/jdo/datanucleus/src/test/java/org/apache/isis/persistence/jdo/datanucleus/oid/IdStringifierForDatastoreId_DatastoreIdImpl_long_Test.java
@@ -48,7 +48,7 @@ class IdStringifierForDatastoreId_DatastoreIdImpl_long_Test {
 
     @ParameterizedTest
     @MethodSource()
-    void roundtrip(long value, String enstringed) {
+    void roundtrip(final long value, final String enstringed) {
 
         val entityType = Customer.class;
 
@@ -62,6 +62,12 @@ class IdStringifierForDatastoreId_DatastoreIdImpl_long_Test {
 
         Assertions.assertThat(parse.getKeyAsObject()).isEqualTo(value);
         
Assertions.assertThat(parse.getTargetClassName()).isEqualTo(entityType.getName());
+
+        val decomposed = stringifier.decompose(new 
DatastoreIdImpl(entityType.getName(), value));
+        val composed = stringifier.compose(decomposed);
+
+        Assertions.assertThat(composed.getKeyAsObject()).isEqualTo(value);
+        
Assertions.assertThat(composed.getTargetClassName()).isEqualTo(entityType.getName());
     }
 
 }
diff --git 
a/persistence/jdo/datanucleus/src/test/java/org/apache/isis/persistence/jdo/datanucleus/oid/IdStringifierForDatastoreId_DatastoreUniqueLongId_long_Test.java
 
b/persistence/jdo/datanucleus/src/test/java/org/apache/isis/persistence/jdo/datanucleus/oid/IdStringifierForDatastoreId_DatastoreUniqueLongId_long_Test.java
index 55e99fbe21..cc7be6c054 100644
--- 
a/persistence/jdo/datanucleus/src/test/java/org/apache/isis/persistence/jdo/datanucleus/oid/IdStringifierForDatastoreId_DatastoreUniqueLongId_long_Test.java
+++ 
b/persistence/jdo/datanucleus/src/test/java/org/apache/isis/persistence/jdo/datanucleus/oid/IdStringifierForDatastoreId_DatastoreUniqueLongId_long_Test.java
@@ -28,7 +28,6 @@ import org.junit.jupiter.params.ParameterizedTest;
 import org.junit.jupiter.params.provider.Arguments;
 import org.junit.jupiter.params.provider.MethodSource;
 
-import 
org.apache.isis.persistence.jdo.datanucleus.valuetypes.JdoDatastoreIdImplValueSemantics;
 import 
org.apache.isis.persistence.jdo.datanucleus.valuetypes.JdoDatastoreUniqueLongIdValueSemantics;
 
 import lombok.val;
@@ -45,22 +44,29 @@ class 
IdStringifierForDatastoreId_DatastoreUniqueLongId_long_Test {
         );
     }
 
-    static class Customer {}
+    //static class Customer {}
 
     @ParameterizedTest
     @MethodSource()
-    void roundtrip(long value) {
+    void roundtrip(final long value) {
 
-        val entityType = Customer.class;
+        //val entityType = Customer.class;
 
         val stringifier = new JdoDatastoreUniqueLongIdValueSemantics();
 
         val stringified = stringifier.enstring(new 
DatastoreUniqueLongId(value));
-        val parse = stringifier.destring(stringified, null); // no need to 
pass entityType
+        val parse = stringifier.destring(stringified); // no need to pass 
entityType
 
         Assertions.assertThat(parse.getKeyAsObject()).isEqualTo(value);
         // UnsupportedOperationException if attempt this.
         // 
Assertions.assertThat(parse.getTargetClassName()).isEqualTo(entityType.getName());
+
+        val decomposed = stringifier.decompose(new 
DatastoreUniqueLongId(value));
+        val composed = stringifier.compose(decomposed);
+
+        Assertions.assertThat(composed.getKeyAsObject()).isEqualTo(value);
+        
//Assertions.assertThat(composed.getTargetClassName()).isEqualTo(entityType.getName());
+
     }
 
 }
diff --git 
a/persistence/jdo/datanucleus/src/test/java/org/apache/isis/persistence/jdo/datanucleus/oid/IdStringifierForDatastoreId_DatastoreUniqueLongId_str_Test.java
 
b/persistence/jdo/datanucleus/src/test/java/org/apache/isis/persistence/jdo/datanucleus/oid/IdStringifierForDatastoreId_DatastoreUniqueLongId_str_Test.java
index a00597b760..7a9afb8c0f 100644
--- 
a/persistence/jdo/datanucleus/src/test/java/org/apache/isis/persistence/jdo/datanucleus/oid/IdStringifierForDatastoreId_DatastoreUniqueLongId_str_Test.java
+++ 
b/persistence/jdo/datanucleus/src/test/java/org/apache/isis/persistence/jdo/datanucleus/oid/IdStringifierForDatastoreId_DatastoreUniqueLongId_str_Test.java
@@ -28,7 +28,6 @@ import org.junit.jupiter.params.ParameterizedTest;
 import org.junit.jupiter.params.provider.Arguments;
 import org.junit.jupiter.params.provider.MethodSource;
 
-import 
org.apache.isis.persistence.jdo.datanucleus.valuetypes.JdoDatastoreIdImplValueSemantics;
 import 
org.apache.isis.persistence.jdo.datanucleus.valuetypes.JdoDatastoreUniqueLongIdValueSemantics;
 
 import lombok.val;
@@ -45,23 +44,29 @@ class 
IdStringifierForDatastoreId_DatastoreUniqueLongId_str_Test {
         );
     }
 
-    static class Customer {}
+    //static class Customer {}
 
     @ParameterizedTest
     @MethodSource()
-    void roundtrip(long value) {
+    void roundtrip(final long value) {
 
-        val entityType = Customer.class;
+        //val entityType = Customer.class;
 
         String strValue = "" + value;
         val stringifier = new JdoDatastoreUniqueLongIdValueSemantics();
 
         val stringified = stringifier.enstring(new 
DatastoreUniqueLongId(strValue));
-        val parse = stringifier.destring(stringified, null); // no need to 
pass entityType
+        val parse = stringifier.destring(stringified); // no need to pass 
entityType
 
         Assertions.assertThat(parse.getKeyAsObject()).isEqualTo(value);
         // UnsupportedOperationException if attempt this.
         // 
Assertions.assertThat(parse.getTargetClassName()).isEqualTo(entityType.getName());
+
+        val decomposed = stringifier.decompose(new 
DatastoreUniqueLongId(strValue));
+        val composed = stringifier.compose(decomposed);
+
+        Assertions.assertThat(composed.getKeyAsObject()).isEqualTo(value);
+        
//Assertions.assertThat(composed.getTargetClassName()).isEqualTo(entityType.getName());
     }
 
 }
diff --git 
a/persistence/jdo/datanucleus/src/test/java/org/apache/isis/persistence/jdo/datanucleus/oid/IdStringifierForIntId_Test.java
 
b/persistence/jdo/datanucleus/src/test/java/org/apache/isis/persistence/jdo/datanucleus/oid/IdStringifierForIntId_Test.java
index 8980a8e0e5..24f256c1f4 100644
--- 
a/persistence/jdo/datanucleus/src/test/java/org/apache/isis/persistence/jdo/datanucleus/oid/IdStringifierForIntId_Test.java
+++ 
b/persistence/jdo/datanucleus/src/test/java/org/apache/isis/persistence/jdo/datanucleus/oid/IdStringifierForIntId_Test.java
@@ -22,8 +22,6 @@ package org.apache.isis.persistence.jdo.datanucleus.oid;
 
 import java.util.stream.Stream;
 
-import javax.jdo.identity.IntIdentity;
-
 import org.assertj.core.api.Assertions;
 import org.datanucleus.identity.IntId;
 import org.junit.jupiter.params.ParameterizedTest;
@@ -31,7 +29,6 @@ import org.junit.jupiter.params.provider.Arguments;
 import org.junit.jupiter.params.provider.MethodSource;
 
 import 
org.apache.isis.persistence.jdo.datanucleus.valuetypes.JdoIntIdValueSemantics;
-import 
org.apache.isis.persistence.jdo.datanucleus.valuetypes.JdoIntIdentityValueSemantics;
 
 import lombok.val;
 
@@ -51,7 +48,7 @@ class IdStringifierForIntId_Test {
 
     @ParameterizedTest
     @MethodSource()
-    void roundtrip(Integer value) {
+    void roundtrip(final Integer value) {
 
         val entityType = Customer.class;
 
@@ -62,6 +59,12 @@ class IdStringifierForIntId_Test {
 
         Assertions.assertThat(parse.getKeyAsObject()).isEqualTo(value);
         
Assertions.assertThat(parse.getTargetClassName()).isEqualTo(entityType.getName());
+
+        val decomposed = stringifier.decompose(new IntId(entityType, value));
+        val composed = stringifier.compose(decomposed);
+
+        Assertions.assertThat(composed.getKeyAsObject()).isEqualTo(value);
+        
Assertions.assertThat(composed.getTargetClassName()).isEqualTo(entityType.getName());
     }
 
 }
diff --git 
a/persistence/jdo/datanucleus/src/test/java/org/apache/isis/persistence/jdo/datanucleus/oid/IdStringifierForIntIdentity_Test.java
 
b/persistence/jdo/datanucleus/src/test/java/org/apache/isis/persistence/jdo/datanucleus/oid/IdStringifierForIntIdentity_Test.java
index 51eeaac7d3..58e60096c4 100644
--- 
a/persistence/jdo/datanucleus/src/test/java/org/apache/isis/persistence/jdo/datanucleus/oid/IdStringifierForIntIdentity_Test.java
+++ 
b/persistence/jdo/datanucleus/src/test/java/org/apache/isis/persistence/jdo/datanucleus/oid/IdStringifierForIntIdentity_Test.java
@@ -49,7 +49,7 @@ class IdStringifierForIntIdentity_Test {
 
     @ParameterizedTest
     @MethodSource()
-    void roundtrip(Integer value) {
+    void roundtrip(final Integer value) {
 
         val entityType = Customer.class;
 
@@ -60,6 +60,12 @@ class IdStringifierForIntIdentity_Test {
 
         Assertions.assertThat(parse.getKeyAsObject()).isEqualTo(value);
         Assertions.assertThat(parse.getTargetClass()).isEqualTo(entityType);
+
+        val decomposed = stringifier.decompose(new IntIdentity(entityType, 
value));
+        val composed = stringifier.compose(decomposed);
+
+        Assertions.assertThat(composed.getKeyAsObject()).isEqualTo(value);
+        Assertions.assertThat(composed.getTargetClass()).isEqualTo(entityType);
     }
 
 }
diff --git 
a/persistence/jdo/datanucleus/src/test/java/org/apache/isis/persistence/jdo/datanucleus/oid/IdStringifierForLongId_Test.java
 
b/persistence/jdo/datanucleus/src/test/java/org/apache/isis/persistence/jdo/datanucleus/oid/IdStringifierForLongId_Test.java
index bef3968e01..e4ec1c7f91 100644
--- 
a/persistence/jdo/datanucleus/src/test/java/org/apache/isis/persistence/jdo/datanucleus/oid/IdStringifierForLongId_Test.java
+++ 
b/persistence/jdo/datanucleus/src/test/java/org/apache/isis/persistence/jdo/datanucleus/oid/IdStringifierForLongId_Test.java
@@ -22,8 +22,6 @@ package org.apache.isis.persistence.jdo.datanucleus.oid;
 
 import java.util.stream.Stream;
 
-import javax.jdo.identity.LongIdentity;
-
 import org.assertj.core.api.Assertions;
 import org.datanucleus.identity.LongId;
 import org.junit.jupiter.params.ParameterizedTest;
@@ -31,7 +29,6 @@ import org.junit.jupiter.params.provider.Arguments;
 import org.junit.jupiter.params.provider.MethodSource;
 
 import 
org.apache.isis.persistence.jdo.datanucleus.valuetypes.JdoLongIdValueSemantics;
-import 
org.apache.isis.persistence.jdo.datanucleus.valuetypes.JdoLongIdentityValueSemantics;
 
 import lombok.val;
 
@@ -51,7 +48,7 @@ class IdStringifierForLongId_Test {
 
     @ParameterizedTest
     @MethodSource()
-    void roundtrip(long value) {
+    void roundtrip(final long value) {
 
         val entityType = Customer.class;
 
@@ -62,6 +59,12 @@ class IdStringifierForLongId_Test {
 
         Assertions.assertThat(parse.getKeyAsObject()).isEqualTo(value);
         
Assertions.assertThat(parse.getTargetClassName()).isEqualTo(entityType.getName());
+
+        val decomposed = stringifier.decompose(new LongId(entityType, value));
+        val composed = stringifier.compose(decomposed);
+
+        Assertions.assertThat(composed.getKeyAsObject()).isEqualTo(value);
+        
Assertions.assertThat(composed.getTargetClassName()).isEqualTo(entityType.getName());
     }
 
 }
diff --git 
a/persistence/jdo/datanucleus/src/test/java/org/apache/isis/persistence/jdo/datanucleus/oid/IdStringifierForLongIdentity_Test.java
 
b/persistence/jdo/datanucleus/src/test/java/org/apache/isis/persistence/jdo/datanucleus/oid/IdStringifierForLongIdentity_Test.java
index 9ba0455f7b..169797554e 100644
--- 
a/persistence/jdo/datanucleus/src/test/java/org/apache/isis/persistence/jdo/datanucleus/oid/IdStringifierForLongIdentity_Test.java
+++ 
b/persistence/jdo/datanucleus/src/test/java/org/apache/isis/persistence/jdo/datanucleus/oid/IdStringifierForLongIdentity_Test.java
@@ -49,7 +49,7 @@ class IdStringifierForLongIdentity_Test {
 
     @ParameterizedTest
     @MethodSource()
-    void roundtrip(long value) {
+    void roundtrip(final long value) {
 
         val entityType = Customer.class;
 
@@ -60,6 +60,12 @@ class IdStringifierForLongIdentity_Test {
 
         Assertions.assertThat(parse.getKeyAsObject()).isEqualTo(value);
         Assertions.assertThat(parse.getTargetClass()).isEqualTo(entityType);
+
+        val decomposed = stringifier.decompose(new LongIdentity(entityType, 
value));
+        val composed = stringifier.compose(decomposed);
+
+        Assertions.assertThat(composed.getKeyAsObject()).isEqualTo(value);
+        Assertions.assertThat(composed.getTargetClass()).isEqualTo(entityType);
     }
 
 }
diff --git 
a/persistence/jdo/datanucleus/src/test/java/org/apache/isis/persistence/jdo/datanucleus/oid/IdStringifierForObjectIdentity_Test.java
 
b/persistence/jdo/datanucleus/src/test/java/org/apache/isis/persistence/jdo/datanucleus/oid/IdStringifierForObjectIdentity_Test.java
index 5072e3ab38..081eebd7a7 100644
--- 
a/persistence/jdo/datanucleus/src/test/java/org/apache/isis/persistence/jdo/datanucleus/oid/IdStringifierForObjectIdentity_Test.java
+++ 
b/persistence/jdo/datanucleus/src/test/java/org/apache/isis/persistence/jdo/datanucleus/oid/IdStringifierForObjectIdentity_Test.java
@@ -60,6 +60,12 @@ class IdStringifierForObjectIdentity_Test {
 
         Assertions.assertThat(parse.getKeyAsObject()).isEqualTo(value);
         Assertions.assertThat(parse.getTargetClass()).isEqualTo(entityType);
+
+        val decomposed = stringifier.decompose(new ObjectIdentity(entityType, 
value));
+        val composed = stringifier.compose(decomposed);
+
+        Assertions.assertThat(composed.getKeyAsObject()).isEqualTo(value);
+        Assertions.assertThat(composed.getTargetClass()).isEqualTo(entityType);
     }
 
 }
diff --git 
a/persistence/jdo/datanucleus/src/test/java/org/apache/isis/persistence/jdo/datanucleus/oid/IdStringifierForShortIdentity_Test.java
 
b/persistence/jdo/datanucleus/src/test/java/org/apache/isis/persistence/jdo/datanucleus/oid/IdStringifierForShortIdentity_Test.java
index e92dd8630b..5ee28be801 100644
--- 
a/persistence/jdo/datanucleus/src/test/java/org/apache/isis/persistence/jdo/datanucleus/oid/IdStringifierForShortIdentity_Test.java
+++ 
b/persistence/jdo/datanucleus/src/test/java/org/apache/isis/persistence/jdo/datanucleus/oid/IdStringifierForShortIdentity_Test.java
@@ -49,7 +49,7 @@ class IdStringifierForShortIdentity_Test {
 
     @ParameterizedTest
     @MethodSource()
-    void roundtrip(short value) {
+    void roundtrip(final short value) {
 
         val entityType = Customer.class;
 
@@ -60,6 +60,12 @@ class IdStringifierForShortIdentity_Test {
 
         Assertions.assertThat(parse.getKeyAsObject()).isEqualTo(value);
         Assertions.assertThat(parse.getTargetClass()).isEqualTo(entityType);
+
+        val decomposed = stringifier.decompose(new ShortIdentity(entityType, 
value));
+        val composed = stringifier.compose(decomposed);
+
+        Assertions.assertThat(composed.getKeyAsObject()).isEqualTo(value);
+        Assertions.assertThat(composed.getTargetClass()).isEqualTo(entityType);
     }
 
 }
diff --git 
a/persistence/jdo/datanucleus/src/test/java/org/apache/isis/persistence/jdo/datanucleus/oid/IdStringifierForStringIdentity_Test.java
 
b/persistence/jdo/datanucleus/src/test/java/org/apache/isis/persistence/jdo/datanucleus/oid/IdStringifierForStringIdentity_Test.java
index 9f9421d517..90ae55b4a6 100644
--- 
a/persistence/jdo/datanucleus/src/test/java/org/apache/isis/persistence/jdo/datanucleus/oid/IdStringifierForStringIdentity_Test.java
+++ 
b/persistence/jdo/datanucleus/src/test/java/org/apache/isis/persistence/jdo/datanucleus/oid/IdStringifierForStringIdentity_Test.java
@@ -67,6 +67,12 @@ class IdStringifierForStringIdentity_Test {
 
         Assertions.assertThat(parse.getKeyAsObject()).isEqualTo(value);
         Assertions.assertThat(parse.getTargetClass()).isEqualTo(entityType);
+
+        val decomposed = stringifier.decompose(new StringIdentity(entityType, 
value));
+        val composed = stringifier.compose(decomposed);
+
+        Assertions.assertThat(composed.getKeyAsObject()).isEqualTo(value);
+        Assertions.assertThat(composed.getTargetClass()).isEqualTo(entityType);
     }
 
 }

Reply via email to