You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@isis.apache.org by ah...@apache.org on 2022/08/09 06:56:23 UTC

[isis] branch master updated: ISIS-3115: hotfix for IdStringifierLookupService does not honor IdStringifier precedence

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 6697f3f205 ISIS-3115: hotfix for IdStringifierLookupService does not honor IdStringifier precedence
6697f3f205 is described below

commit 6697f3f205b1622dbf0de9d6c843c8e3de67618b
Author: Andi Huber <ah...@apache.org>
AuthorDate: Tue Aug 9 08:56:14 2022 +0200

    ISIS-3115: hotfix for IdStringifierLookupService does not honor
    IdStringifier precedence
---
 .../idstringifiers/IdStringifierForSerializable.java      |  9 ++-------
 .../bookmark/IdStringifierForSerializable_Test.java       |  9 ++++-----
 .../runtime/idstringifier/IdStringifierLookupService.java | 15 +++++++++++----
 3 files changed, 17 insertions(+), 16 deletions(-)

diff --git a/api/applib/src/main/java/org/apache/isis/applib/services/bookmark/idstringifiers/IdStringifierForSerializable.java b/api/applib/src/main/java/org/apache/isis/applib/services/bookmark/idstringifiers/IdStringifierForSerializable.java
index 03224ba2a2..889a5e2f2f 100644
--- a/api/applib/src/main/java/org/apache/isis/applib/services/bookmark/idstringifiers/IdStringifierForSerializable.java
+++ b/api/applib/src/main/java/org/apache/isis/applib/services/bookmark/idstringifiers/IdStringifierForSerializable.java
@@ -29,7 +29,6 @@ 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.services.urlencoding.UrlEncodingService;
-import org.apache.isis.commons.internal.base._Casts;
 import org.apache.isis.commons.internal.base._Strings;
 import org.apache.isis.commons.internal.resources._Serializables;
 
@@ -65,16 +64,12 @@ public class IdStringifierForSerializable extends IdStringifier.Abstract<Seriali
     public Serializable destring(
             final @NonNull String stringified,
             final @NonNull Class<?> targetEntityClass) {
-
-        final Class<? extends Serializable> requiredClass =
-                _Casts.uncheckedCast(targetEntityClass);
-
-        return destringAs(stringified, requiredClass);
+        return destringAs(stringified, Serializable.class);
     }
 
     // -- HELPER
 
-    public <T extends Serializable> T destringAs(
+    private <T extends Serializable> T destringAs(
             final @NonNull String stringified,
             final @NonNull Class<T> requiredClass) {
         return _Strings.isNotEmpty(stringified)
diff --git a/api/applib/src/test/java/org/apache/isis/applib/services/bookmark/IdStringifierForSerializable_Test.java b/api/applib/src/test/java/org/apache/isis/applib/services/bookmark/IdStringifierForSerializable_Test.java
index 9279df0f6c..a802b6fc5f 100644
--- a/api/applib/src/test/java/org/apache/isis/applib/services/bookmark/IdStringifierForSerializable_Test.java
+++ b/api/applib/src/test/java/org/apache/isis/applib/services/bookmark/IdStringifierForSerializable_Test.java
@@ -41,6 +41,9 @@ class IdStringifierForSerializable_Test {
 
     // -- SCENARIO
 
+    static class Customer {
+    }
+
     @Value
     static class CustomerPK implements Serializable{
         private static final long serialVersionUID = 1L;
@@ -66,14 +69,10 @@ class IdStringifierForSerializable_Test {
     @MethodSource()
     void roundtrip(final Serializable value) {
 
-        val idClass = value != null
-                ? value.getClass()
-                : void.class;
-
         val stringifier = new IdStringifierForSerializable(codec);
 
         String stringified = stringifier.enstring(value);
-        Serializable parse = stringifier.destring(stringified, idClass);
+        Serializable parse = stringifier.destring(stringified, Customer.class);
 
         assertThat(parse).isEqualTo(value);
     }
diff --git a/core/runtime/src/main/java/org/apache/isis/core/runtime/idstringifier/IdStringifierLookupService.java b/core/runtime/src/main/java/org/apache/isis/core/runtime/idstringifier/IdStringifierLookupService.java
index 21b36353ea..8fef47c3cf 100644
--- a/core/runtime/src/main/java/org/apache/isis/core/runtime/idstringifier/IdStringifierLookupService.java
+++ b/core/runtime/src/main/java/org/apache/isis/core/runtime/idstringifier/IdStringifierLookupService.java
@@ -34,10 +34,11 @@ import org.springframework.stereotype.Service;
 
 import org.apache.isis.applib.annotation.PriorityPrecedence;
 import org.apache.isis.applib.services.bookmark.IdStringifier;
+import org.apache.isis.applib.services.bookmark.idstringifiers.IdStringifierForSerializable;
+import org.apache.isis.commons.collections.Can;
 import org.apache.isis.commons.internal.base._Casts;
 import org.apache.isis.core.runtime.IsisModuleCoreRuntime;
 
-import lombok.RequiredArgsConstructor;
 import lombok.val;
 
 /**
@@ -54,13 +55,19 @@ import lombok.val;
 @Named(IsisModuleCoreRuntime.NAMESPACE + ".IdStringifierLookupService")
 @Priority(PriorityPrecedence.MIDPOINT)
 @Qualifier("Default")
-@RequiredArgsConstructor
 public class IdStringifierLookupService {
 
-    @Inject
-    private final List<IdStringifier<?>> idStringifiers;
+    private final Can<IdStringifier<?>> idStringifiers;
     private final Map<Class<?>, IdStringifier<?>> stringifierByClass = new ConcurrentHashMap<>();
 
+    @Inject
+    public IdStringifierLookupService(final List<IdStringifier<?>> idStringifiers, final IdStringifierForSerializable x) {
+        //FIXME[ISIS-3115] remove this hotfix
+        idStringifiers.removeIf(s->IdStringifierForSerializable.class.equals(s.getClass()));
+        idStringifiers.add(x); // put last
+        this.idStringifiers = Can.ofCollection(idStringifiers);
+    }
+
     public <T> IdStringifier<T> lookupElseFail(final Class<T> candidateValueClass) {
         val idStringifier = stringifierByClass.computeIfAbsent(candidateValueClass, aClass -> {
             for (val candidateStringifier : idStringifiers) {