You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@isis.apache.org by da...@apache.org on 2022/07/31 12:08:42 UTC

[isis] 01/01: ISIS-3002: don't (in general) use prefix for IdStringifiers

This is an automated email from the ASF dual-hosted git repository.

danhaywood pushed a commit to branch ISIS-3002
in repository https://gitbox.apache.org/repos/asf/isis.git

commit f8bbe676bffdf37d947846400e38b7297e193a58
Author: Dan Haywood <da...@haywood-associates.co.uk>
AuthorDate: Sun Jul 31 13:07:41 2022 +0100

    ISIS-3002: don't (in general) use prefix for IdStringifiers
    
    only uuid does, in order to support ObjectId
---
 .../applib/services/bookmark/IdStringifier.java    | 23 +++++++++++++
 .../idstringifiers/IdStringifierForBigDecimal.java |  6 ++--
 .../idstringifiers/IdStringifierForBigInteger.java |  6 ++--
 .../idstringifiers/IdStringifierForByte.java       |  6 ++--
 .../idstringifiers/IdStringifierForInteger.java    |  6 ++--
 .../idstringifiers/IdStringifierForLong.java       |  6 ++--
 .../idstringifiers/IdStringifierForShort.java      |  6 ++--
 examples/demo/domain/pom.xml                       |  6 ----
 examples/demo/pom.xml                              | 40 +++++++++++++---------
 .../commandlog/jpa/dom/CommandLogEntryPK.java      |  8 ++---
 .../sessionlog/jpa/dom/SessionLogEntryPK.java      |  8 ++---
 extensions/sse/pom.xml                             | 38 +++++++++++++++-----
 .../facets/entity/IdStringifierForByteId.java      |  6 ++--
 .../entity/IdStringifierForByteIdentity.java       |  6 ++--
 .../facets/entity/IdStringifierForIntId.java       |  6 ++--
 .../facets/entity/IdStringifierForIntIdentity.java |  6 ++--
 .../facets/entity/IdStringifierForLongId.java      |  6 ++--
 .../entity/IdStringifierForLongIdentity.java       |  6 ++--
 .../facets/entity/IdStringifierForShortId.java     |  6 ++--
 .../entity/IdStringifierForShortIdentity.java      |  6 ++--
 .../bootstrap/css/bootstrap-overrides-all-v2.css   | 21 ++++++++----
 21 files changed, 141 insertions(+), 87 deletions(-)

diff --git a/api/applib/src/main/java/org/apache/isis/applib/services/bookmark/IdStringifier.java b/api/applib/src/main/java/org/apache/isis/applib/services/bookmark/IdStringifier.java
index 50074aac9b..c787333d20 100644
--- a/api/applib/src/main/java/org/apache/isis/applib/services/bookmark/IdStringifier.java
+++ b/api/applib/src/main/java/org/apache/isis/applib/services/bookmark/IdStringifier.java
@@ -20,6 +20,8 @@
 
 package org.apache.isis.applib.services.bookmark;
 
+import java.util.UUID;
+
 import org.springframework.lang.Nullable;
 
 import lombok.NonNull;
@@ -114,8 +116,29 @@ public interface IdStringifier<T> {
                     || primitiveValueClassIfAny != null
                     && primitiveValueClassIfAny.isAssignableFrom(candidateValueClass);
         }
+
+        /**
+         * Overridable default implementation.
+         * @param value
+         * @return
+         */
+        @Override
+        public String enstring(@NonNull T value) {
+            return value.toString();
+        }
+
     }
 
+    /**
+     * Provided for backward compatibility with some v1 Ids that used a prefix to determine their actual type.
+     *
+     * <p>
+     * (In v2 we provide this so in the constructor, so there's no need to encode the type in the stringified form
+     * of the value).
+     * </p>
+     *
+     * @param <T>
+     */
     abstract class AbstractWithPrefix<T> extends Abstract<T> {
 
         private final String prefix;
diff --git a/api/applib/src/main/java/org/apache/isis/applib/services/bookmark/idstringifiers/IdStringifierForBigDecimal.java b/api/applib/src/main/java/org/apache/isis/applib/services/bookmark/idstringifiers/IdStringifierForBigDecimal.java
index f84308c325..4034e6e033 100644
--- a/api/applib/src/main/java/org/apache/isis/applib/services/bookmark/idstringifiers/IdStringifierForBigDecimal.java
+++ b/api/applib/src/main/java/org/apache/isis/applib/services/bookmark/idstringifiers/IdStringifierForBigDecimal.java
@@ -32,14 +32,14 @@ import lombok.NonNull;
 
 @Component
 @Priority(PriorityPrecedence.LATE)
-public class IdStringifierForBigDecimal extends IdStringifier.AbstractWithPrefix<BigDecimal> {
+public class IdStringifierForBigDecimal extends IdStringifier.Abstract<BigDecimal> {
 
     public IdStringifierForBigDecimal() {
-        super(BigDecimal.class, "D");
+        super(BigDecimal.class);
     }
 
     @Override
-    protected BigDecimal doDestring(final @NonNull String stringified, @NonNull Class<?> targetEntityClass) {
+    public BigDecimal destring(final @NonNull String stringified, @NonNull Class<?> targetEntityClass) {
         return new BigDecimal(stringified);
     }
 }
diff --git a/api/applib/src/main/java/org/apache/isis/applib/services/bookmark/idstringifiers/IdStringifierForBigInteger.java b/api/applib/src/main/java/org/apache/isis/applib/services/bookmark/idstringifiers/IdStringifierForBigInteger.java
index 47529bf523..a26f51535d 100644
--- a/api/applib/src/main/java/org/apache/isis/applib/services/bookmark/idstringifiers/IdStringifierForBigInteger.java
+++ b/api/applib/src/main/java/org/apache/isis/applib/services/bookmark/idstringifiers/IdStringifierForBigInteger.java
@@ -32,14 +32,14 @@ import lombok.NonNull;
 
 @Component
 @Priority(PriorityPrecedence.LATE)
-public class IdStringifierForBigInteger extends IdStringifier.AbstractWithPrefix<BigInteger> {
+public class IdStringifierForBigInteger extends IdStringifier.Abstract<BigInteger> {
 
     public IdStringifierForBigInteger() {
-        super(BigInteger.class, "I");
+        super(BigInteger.class);
     }
 
     @Override
-    protected BigInteger doDestring(final @NonNull String stringified, @NonNull Class<?> targetEntityClass) {
+    public BigInteger destring(final @NonNull String stringified, @NonNull Class<?> targetEntityClass) {
         return new BigInteger(stringified);
     }
 }
diff --git a/api/applib/src/main/java/org/apache/isis/applib/services/bookmark/idstringifiers/IdStringifierForByte.java b/api/applib/src/main/java/org/apache/isis/applib/services/bookmark/idstringifiers/IdStringifierForByte.java
index f1b903852c..af75dd86b3 100644
--- a/api/applib/src/main/java/org/apache/isis/applib/services/bookmark/idstringifiers/IdStringifierForByte.java
+++ b/api/applib/src/main/java/org/apache/isis/applib/services/bookmark/idstringifiers/IdStringifierForByte.java
@@ -30,14 +30,14 @@ import lombok.NonNull;
 
 @Component
 @Priority(PriorityPrecedence.LATE)
-public class IdStringifierForByte extends IdStringifier.AbstractWithPrefix<Byte> {
+public class IdStringifierForByte extends IdStringifier.Abstract<Byte> {
 
     public IdStringifierForByte() {
-        super(Byte.class, "b", byte.class);
+        super(Byte.class, byte.class);
     }
 
     @Override
-    protected Byte doDestring(final @NonNull String stringified, @NonNull Class<?> targetEntityClass) {
+    public Byte destring(final @NonNull String stringified, @NonNull Class<?> targetEntityClass) {
         return Byte.parseByte(stringified);
     }
 }
diff --git a/api/applib/src/main/java/org/apache/isis/applib/services/bookmark/idstringifiers/IdStringifierForInteger.java b/api/applib/src/main/java/org/apache/isis/applib/services/bookmark/idstringifiers/IdStringifierForInteger.java
index 0f17364d13..8a82a6dcdf 100644
--- a/api/applib/src/main/java/org/apache/isis/applib/services/bookmark/idstringifiers/IdStringifierForInteger.java
+++ b/api/applib/src/main/java/org/apache/isis/applib/services/bookmark/idstringifiers/IdStringifierForInteger.java
@@ -30,14 +30,14 @@ import lombok.NonNull;
 
 @Component
 @Priority(PriorityPrecedence.LATE)
-public class IdStringifierForInteger extends IdStringifier.AbstractWithPrefix<Integer> {
+public class IdStringifierForInteger extends IdStringifier.Abstract<Integer> {
 
     public IdStringifierForInteger() {
-        super(Integer.class, "i", int.class);
+        super(Integer.class, int.class);
     }
 
     @Override
-    protected Integer doDestring(final @NonNull String stringified, @NonNull Class<?> targetEntityClass) {
+    public Integer destring(final @NonNull String stringified, @NonNull Class<?> targetEntityClass) {
         return Integer.parseInt(stringified);
     }
 }
diff --git a/api/applib/src/main/java/org/apache/isis/applib/services/bookmark/idstringifiers/IdStringifierForLong.java b/api/applib/src/main/java/org/apache/isis/applib/services/bookmark/idstringifiers/IdStringifierForLong.java
index 717ef92448..b4a8700179 100644
--- a/api/applib/src/main/java/org/apache/isis/applib/services/bookmark/idstringifiers/IdStringifierForLong.java
+++ b/api/applib/src/main/java/org/apache/isis/applib/services/bookmark/idstringifiers/IdStringifierForLong.java
@@ -30,14 +30,14 @@ import lombok.NonNull;
 
 @Component
 @Priority(PriorityPrecedence.LATE)
-public class IdStringifierForLong extends IdStringifier.AbstractWithPrefix<Long> {
+public class IdStringifierForLong extends IdStringifier.Abstract<Long> {
 
     public IdStringifierForLong() {
-        super(Long.class, "l", long.class);
+        super(Long.class, long.class);
     }
 
     @Override
-    protected Long doDestring(final @NonNull String stringified, @NonNull Class<?> targetEntityClass) {
+    public Long destring(final @NonNull String stringified, @NonNull Class<?> targetEntityClass) {
         return Long.parseLong(stringified);
     }
 }
diff --git a/api/applib/src/main/java/org/apache/isis/applib/services/bookmark/idstringifiers/IdStringifierForShort.java b/api/applib/src/main/java/org/apache/isis/applib/services/bookmark/idstringifiers/IdStringifierForShort.java
index 25f50ed112..0674da6c93 100644
--- a/api/applib/src/main/java/org/apache/isis/applib/services/bookmark/idstringifiers/IdStringifierForShort.java
+++ b/api/applib/src/main/java/org/apache/isis/applib/services/bookmark/idstringifiers/IdStringifierForShort.java
@@ -30,14 +30,14 @@ import lombok.NonNull;
 
 @Component
 @Priority(PriorityPrecedence.LATE)
-public class IdStringifierForShort extends IdStringifier.AbstractWithPrefix<Short> {
+public class IdStringifierForShort extends IdStringifier.Abstract<Short> {
 
     public IdStringifierForShort() {
-        super(Short.class, "s", short.class);
+        super(Short.class, short.class);
     }
 
     @Override
-    protected Short doDestring(final @NonNull String stringified, @NonNull Class<?> targetEntityClass) {
+    public Short destring(final @NonNull String stringified, @NonNull Class<?> targetEntityClass) {
         return Short.parseShort(stringified);
     }
 }
diff --git a/examples/demo/domain/pom.xml b/examples/demo/domain/pom.xml
index 6639a4fb01..1efa11e03c 100644
--- a/examples/demo/domain/pom.xml
+++ b/examples/demo/domain/pom.xml
@@ -147,12 +147,6 @@
 			<artifactId>h2</artifactId>
 		</dependency>
 
-		<dependency>
-			<groupId>org.projectlombok</groupId>
-			<artifactId>lombok</artifactId>
-			<scope>provided</scope>
-		</dependency>
-
         <dependency>
             <groupId>org.apache.isis.valuetypes</groupId>
             <artifactId>isis-valuetypes-markdown-applib</artifactId>
diff --git a/examples/demo/pom.xml b/examples/demo/pom.xml
index 3adea23db4..8eb7cdd4bc 100644
--- a/examples/demo/pom.xml
+++ b/examples/demo/pom.xml
@@ -186,41 +186,49 @@
 		</dependency>
 	</dependencies>
 
+	<modules>
+		<module>domain</module>
+		<module>web</module>
+		<module>wicket/common</module>
+		<module>wicket/jdo</module>
+		<module>wicket/jpa</module>
+	</modules>
+
 	<profiles>
 		<profile>
-			<id>module-all</id>
+			<id>demo-jpa-and-graphql</id>
 			<activation>
 				<property>
-					<name>module-all</name>
+					<name>demo-jpa-and-graphql</name>
 				</property>
 			</activation>
 			<modules>
-				<module>domain</module>
-				<module>javafx</module>
-				<module>web</module>
-				<module>wicket/common</module>
-				<module>wicket/jdo</module>
-				<module>wicket/jpa</module>
 				<module>wicket/jpa-and-graphql</module>
+			</modules>
+		</profile>
+		<profile>
+			<id>demo-vaadin</id>
+			<activation>
+				<property>
+					<name>demo-vaadin</name>
+				</property>
+			</activation>
+			<modules>
 				<module>vaadin</module>
 			</modules>
 		</profile>
-
 		<profile>
-			<id>module-all-except-incubator</id>
+			<id>demo-javafx</id>
 			<activation>
 				<property>
-					<name>module-all-except-incubator</name>
+					<name>demo-javafx</name>
 				</property>
 			</activation>
 			<modules>
-				<module>domain</module>
-				<module>web</module>
-				<module>wicket/common</module>
-				<module>wicket/jdo</module>
-				<module>wicket/jpa</module>
+				<module>javafx</module>
 			</modules>
 		</profile>
+
 	</profiles>
 
 </project>
diff --git a/extensions/core/commandlog/persistence-jpa/src/main/java/org/apache/isis/extensions/commandlog/jpa/dom/CommandLogEntryPK.java b/extensions/core/commandlog/persistence-jpa/src/main/java/org/apache/isis/extensions/commandlog/jpa/dom/CommandLogEntryPK.java
index 94a9e7d920..2b979e88bd 100644
--- a/extensions/core/commandlog/persistence-jpa/src/main/java/org/apache/isis/extensions/commandlog/jpa/dom/CommandLogEntryPK.java
+++ b/extensions/core/commandlog/persistence-jpa/src/main/java/org/apache/isis/extensions/commandlog/jpa/dom/CommandLogEntryPK.java
@@ -60,19 +60,19 @@ public class CommandLogEntryPK implements Serializable {
 
 
     @Component
-    public static class Stringifier extends IdStringifier.AbstractWithPrefix<CommandLogEntryPK> {
+    public static class Stringifier extends IdStringifier.Abstract<CommandLogEntryPK> {
 
         public Stringifier() {
-            super(CommandLogEntryPK.class, "u");
+            super(CommandLogEntryPK.class);
         }
 
         @Override
-        public String doEnstring(CommandLogEntryPK value) {
+        public String enstring(CommandLogEntryPK value) {
             return value.getInteractionId().toString();
         }
 
         @Override
-        protected CommandLogEntryPK doDestring(@NonNull String stringified, @NonNull Class<?> targetEntityClass) {
+        public CommandLogEntryPK destring(@NonNull String stringified, @NonNull Class<?> targetEntityClass) {
             return new CommandLogEntryPK(UUID.fromString(stringified));
         }
     }
diff --git a/extensions/security/sessionlog/persistence-jpa/src/main/java/org/apache/isis/extensions/sessionlog/jpa/dom/SessionLogEntryPK.java b/extensions/security/sessionlog/persistence-jpa/src/main/java/org/apache/isis/extensions/sessionlog/jpa/dom/SessionLogEntryPK.java
index 73dbe5d170..7512d6b86e 100644
--- a/extensions/security/sessionlog/persistence-jpa/src/main/java/org/apache/isis/extensions/sessionlog/jpa/dom/SessionLogEntryPK.java
+++ b/extensions/security/sessionlog/persistence-jpa/src/main/java/org/apache/isis/extensions/sessionlog/jpa/dom/SessionLogEntryPK.java
@@ -60,19 +60,19 @@ public class SessionLogEntryPK implements Serializable {
 
 
     @Component
-    public static class Stringifier extends IdStringifier.AbstractWithPrefix<SessionLogEntryPK> {
+    public static class Stringifier extends IdStringifier.Abstract<SessionLogEntryPK> {
 
         public Stringifier() {
-            super(SessionLogEntryPK.class, "u");
+            super(SessionLogEntryPK.class);
         }
 
         @Override
-        public String doEnstring(SessionLogEntryPK value) {
+        public String enstring(SessionLogEntryPK value) {
             return value.getSessionGuid().toString();
         }
 
         @Override
-        protected SessionLogEntryPK doDestring(@NonNull String stringified, @NonNull Class<?> targetEntityClass) {
+        public SessionLogEntryPK destring(@NonNull String stringified, @NonNull Class<?> targetEntityClass) {
             return new SessionLogEntryPK(UUID.fromString(stringified));
         }
     }
diff --git a/extensions/sse/pom.xml b/extensions/sse/pom.xml
index 7daf56c8df..80fd835f7e 100644
--- a/extensions/sse/pom.xml
+++ b/extensions/sse/pom.xml
@@ -1,13 +1,13 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<!-- Licensed to the Apache Software Foundation (ASF) under one or more contributor 
-	license agreements. See the NOTICE file distributed with this work for additional 
-	information regarding copyright ownership. The ASF licenses this file to 
-	you under the Apache License, Version 2.0 (the "License"); you may not use 
-	this file except in compliance with the License. You may obtain a copy of 
-	the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required 
-	by applicable law or agreed to in writing, software distributed under the 
-	License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS 
-	OF ANY KIND, either express or implied. See the License for the specific 
+<!-- Licensed to the Apache Software Foundation (ASF) under one or more contributor
+	license agreements. See the NOTICE file distributed with this work for additional
+	information regarding copyright ownership. The ASF licenses this file to
+	you under the Apache License, Version 2.0 (the "License"); you may not use
+	this file except in compliance with the License. You may obtain a copy of
+	the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required
+	by applicable law or agreed to in writing, software distributed under the
+	License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS
+	OF ANY KIND, either express or implied. See the License for the specific
 	language governing permissions and limitations under the License. -->
 <project xmlns="http://maven.apache.org/POM/4.0.0"
 	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
@@ -26,6 +26,26 @@
 
 	<packaging>pom</packaging>
 
+	<dependencyManagement>
+		<dependencies>
+			<dependency>
+				<groupId>org.apache.isis.extensions</groupId>
+				<artifactId>isis-extensions-sse-applib</artifactId>
+				<version>2.0.0-SNAPSHOT</version>
+			</dependency>
+			<dependency>
+				<groupId>org.apache.isis.extensions</groupId>
+				<artifactId>isis-extensions-sse-metamodel</artifactId>
+				<version>2.0.0-SNAPSHOT</version>
+			</dependency>
+			<dependency>
+				<groupId>org.apache.isis.extensions</groupId>
+				<artifactId>isis-extensions-sse-wicket</artifactId>
+				<version>2.0.0-SNAPSHOT</version>
+			</dependency>
+		</dependencies>
+	</dependencyManagement>
+
 	<modules>
 		<module>applib</module>
 		<module>metamodel</module>
diff --git a/persistence/jdo/datanucleus/src/main/java/org/apache/isis/persistence/jdo/datanucleus/metamodel/facets/entity/IdStringifierForByteId.java b/persistence/jdo/datanucleus/src/main/java/org/apache/isis/persistence/jdo/datanucleus/metamodel/facets/entity/IdStringifierForByteId.java
index eb36346bf3..0443d90324 100644
--- a/persistence/jdo/datanucleus/src/main/java/org/apache/isis/persistence/jdo/datanucleus/metamodel/facets/entity/IdStringifierForByteId.java
+++ b/persistence/jdo/datanucleus/src/main/java/org/apache/isis/persistence/jdo/datanucleus/metamodel/facets/entity/IdStringifierForByteId.java
@@ -30,14 +30,14 @@ import lombok.NonNull;
 
 @Component
 @Priority(PriorityPrecedence.LATE)
-public class IdStringifierForByteId extends IdStringifier.AbstractWithPrefix<ByteId> {
+public class IdStringifierForByteId extends IdStringifier.Abstract<ByteId> {
 
     public IdStringifierForByteId() {
-        super(ByteId.class, "b");
+        super(ByteId.class);
     }
 
     @Override
-    protected ByteId doDestring(final @NonNull String stringified, final @NonNull Class<?> targetEntityClass) {
+    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/metamodel/facets/entity/IdStringifierForByteIdentity.java b/persistence/jdo/datanucleus/src/main/java/org/apache/isis/persistence/jdo/datanucleus/metamodel/facets/entity/IdStringifierForByteIdentity.java
index bf8cab9c3a..219ccce367 100644
--- a/persistence/jdo/datanucleus/src/main/java/org/apache/isis/persistence/jdo/datanucleus/metamodel/facets/entity/IdStringifierForByteIdentity.java
+++ b/persistence/jdo/datanucleus/src/main/java/org/apache/isis/persistence/jdo/datanucleus/metamodel/facets/entity/IdStringifierForByteIdentity.java
@@ -30,14 +30,14 @@ import lombok.NonNull;
 
 @Component
 @Priority(PriorityPrecedence.LATE)
-public class IdStringifierForByteIdentity extends IdStringifier.AbstractWithPrefix<ByteIdentity> {
+public class IdStringifierForByteIdentity extends IdStringifier.Abstract<ByteIdentity> {
 
     public IdStringifierForByteIdentity() {
-        super(ByteIdentity.class, "b");
+        super(ByteIdentity.class);
     }
 
     @Override
-    protected ByteIdentity doDestring(final @NonNull String stringified, final @NonNull Class<?> targetEntityClass) {
+    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/metamodel/facets/entity/IdStringifierForIntId.java b/persistence/jdo/datanucleus/src/main/java/org/apache/isis/persistence/jdo/datanucleus/metamodel/facets/entity/IdStringifierForIntId.java
index d891690f0a..13285c40f6 100644
--- a/persistence/jdo/datanucleus/src/main/java/org/apache/isis/persistence/jdo/datanucleus/metamodel/facets/entity/IdStringifierForIntId.java
+++ b/persistence/jdo/datanucleus/src/main/java/org/apache/isis/persistence/jdo/datanucleus/metamodel/facets/entity/IdStringifierForIntId.java
@@ -31,14 +31,14 @@ import lombok.NonNull;
 
 @Component
 @Priority(PriorityPrecedence.LATE)
-public class IdStringifierForIntId extends IdStringifier.AbstractWithPrefix<IntId> {
+public class IdStringifierForIntId extends IdStringifier.Abstract<IntId> {
 
     public IdStringifierForIntId() {
-        super(IntId.class, "i");
+        super(IntId.class);
     }
 
     @Override
-    protected IntId doDestring(final @NonNull String stringified, final @NonNull Class<?> targetEntityClass) {
+    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/metamodel/facets/entity/IdStringifierForIntIdentity.java b/persistence/jdo/datanucleus/src/main/java/org/apache/isis/persistence/jdo/datanucleus/metamodel/facets/entity/IdStringifierForIntIdentity.java
index bbf89516ed..5a849f4d12 100644
--- a/persistence/jdo/datanucleus/src/main/java/org/apache/isis/persistence/jdo/datanucleus/metamodel/facets/entity/IdStringifierForIntIdentity.java
+++ b/persistence/jdo/datanucleus/src/main/java/org/apache/isis/persistence/jdo/datanucleus/metamodel/facets/entity/IdStringifierForIntIdentity.java
@@ -30,14 +30,14 @@ import lombok.NonNull;
 
 @Component
 @Priority(PriorityPrecedence.LATE)
-public class IdStringifierForIntIdentity extends IdStringifier.AbstractWithPrefix<IntIdentity> {
+public class IdStringifierForIntIdentity extends IdStringifier.Abstract<IntIdentity> {
 
     public IdStringifierForIntIdentity() {
-        super(IntIdentity.class, "i");
+        super(IntIdentity.class);
     }
 
     @Override
-    protected IntIdentity doDestring(final @NonNull String stringified, final @NonNull Class<?> targetEntityClass) {
+    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/metamodel/facets/entity/IdStringifierForLongId.java b/persistence/jdo/datanucleus/src/main/java/org/apache/isis/persistence/jdo/datanucleus/metamodel/facets/entity/IdStringifierForLongId.java
index c4ac428c0b..e58dcb237c 100644
--- a/persistence/jdo/datanucleus/src/main/java/org/apache/isis/persistence/jdo/datanucleus/metamodel/facets/entity/IdStringifierForLongId.java
+++ b/persistence/jdo/datanucleus/src/main/java/org/apache/isis/persistence/jdo/datanucleus/metamodel/facets/entity/IdStringifierForLongId.java
@@ -31,14 +31,14 @@ import lombok.NonNull;
 
 @Component
 @Priority(PriorityPrecedence.LATE)
-public class IdStringifierForLongId extends IdStringifier.AbstractWithPrefix<LongId> {
+public class IdStringifierForLongId extends IdStringifier.Abstract<LongId> {
 
     public IdStringifierForLongId() {
-        super(LongId.class, "l");
+        super(LongId.class);
     }
 
     @Override
-    protected LongId doDestring(final @NonNull String stringified, final @NonNull Class<?> targetEntityClass) {
+    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/metamodel/facets/entity/IdStringifierForLongIdentity.java b/persistence/jdo/datanucleus/src/main/java/org/apache/isis/persistence/jdo/datanucleus/metamodel/facets/entity/IdStringifierForLongIdentity.java
index 4c059c723b..c288e61829 100644
--- a/persistence/jdo/datanucleus/src/main/java/org/apache/isis/persistence/jdo/datanucleus/metamodel/facets/entity/IdStringifierForLongIdentity.java
+++ b/persistence/jdo/datanucleus/src/main/java/org/apache/isis/persistence/jdo/datanucleus/metamodel/facets/entity/IdStringifierForLongIdentity.java
@@ -30,14 +30,14 @@ import lombok.NonNull;
 
 @Component
 @Priority(PriorityPrecedence.LATE)
-public class IdStringifierForLongIdentity extends IdStringifier.AbstractWithPrefix<LongIdentity> {
+public class IdStringifierForLongIdentity extends IdStringifier.Abstract<LongIdentity> {
 
     public IdStringifierForLongIdentity() {
-        super(LongIdentity.class, "l");
+        super(LongIdentity.class);
     }
 
     @Override
-    protected LongIdentity doDestring(final @NonNull String stringified, final @NonNull Class<?> targetEntityClass) {
+    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/metamodel/facets/entity/IdStringifierForShortId.java b/persistence/jdo/datanucleus/src/main/java/org/apache/isis/persistence/jdo/datanucleus/metamodel/facets/entity/IdStringifierForShortId.java
index 1a588375e0..f84d5cf027 100644
--- a/persistence/jdo/datanucleus/src/main/java/org/apache/isis/persistence/jdo/datanucleus/metamodel/facets/entity/IdStringifierForShortId.java
+++ b/persistence/jdo/datanucleus/src/main/java/org/apache/isis/persistence/jdo/datanucleus/metamodel/facets/entity/IdStringifierForShortId.java
@@ -31,14 +31,14 @@ import lombok.NonNull;
 
 @Component
 @Priority(PriorityPrecedence.LATE)
-public class IdStringifierForShortId extends IdStringifier.AbstractWithPrefix<ShortId> {
+public class IdStringifierForShortId extends IdStringifier.Abstract<ShortId> {
 
     public IdStringifierForShortId() {
-        super(ShortId.class, "t");
+        super(ShortId.class);
     }
 
     @Override
-    protected ShortId doDestring(final @NonNull String stringified, final @NonNull Class<?> targetEntityClass) {
+    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/metamodel/facets/entity/IdStringifierForShortIdentity.java b/persistence/jdo/datanucleus/src/main/java/org/apache/isis/persistence/jdo/datanucleus/metamodel/facets/entity/IdStringifierForShortIdentity.java
index 3f55a8e9f1..01929e2e57 100644
--- a/persistence/jdo/datanucleus/src/main/java/org/apache/isis/persistence/jdo/datanucleus/metamodel/facets/entity/IdStringifierForShortIdentity.java
+++ b/persistence/jdo/datanucleus/src/main/java/org/apache/isis/persistence/jdo/datanucleus/metamodel/facets/entity/IdStringifierForShortIdentity.java
@@ -30,14 +30,14 @@ import lombok.NonNull;
 
 @Component
 @Priority(PriorityPrecedence.LATE)
-public class IdStringifierForShortIdentity extends IdStringifier.AbstractWithPrefix<ShortIdentity> {
+public class IdStringifierForShortIdentity extends IdStringifier.Abstract<ShortIdentity> {
 
     public IdStringifierForShortIdentity() {
-        super(ShortIdentity.class, "s");
+        super(ShortIdentity.class);
     }
 
     @Override
-    protected ShortIdentity doDestring(final @NonNull String stringified, final @NonNull Class<?> targetEntityClass) {
+    public ShortIdentity destring(final @NonNull String stringified, final @NonNull Class<?> targetEntityClass) {
         return new ShortIdentity(targetEntityClass, stringified);
     }
 }
diff --git a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/pages/common/bootstrap/css/bootstrap-overrides-all-v2.css b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/pages/common/bootstrap/css/bootstrap-overrides-all-v2.css
index 224238d960..de3fb3caa0 100644
--- a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/pages/common/bootstrap/css/bootstrap-overrides-all-v2.css
+++ b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/pages/common/bootstrap/css/bootstrap-overrides-all-v2.css
@@ -37,8 +37,16 @@ body {
     margin-bottom: 0px;
 }
 
+.navbar.primary ul.dropdown-menu,
+.navbar-nav.secondary ul.dropdown-menu,
+.navbar-nav.tertiary ul.dropdown-menu {
+    max-height: 600px;
+    overflow-y: auto;
+    overflow-x: hidden;
+}
+
 /* emulate .dropdown-menu-right for secondary and tertiary dropdown menus */
-.navbar-nav.secondary .dropdown-menu, 
+.navbar-nav.secondary .dropdown-menu,
 .navbar-nav.tertiary .dropdown-menu {
 	right: 0;
 	left: auto;
@@ -106,7 +114,7 @@ td .badge,
 	color: var(--link-color);
 }
 .nav-link:focus, .nav-link:hover,
-a:focus, a:hover, 
+a:focus, a:hover,
 .btn-link:focus, .btn-link:hover {
     color: var(--link-color-hover);
 }
@@ -836,6 +844,7 @@ div.referencePanel.scalarNameAndValueComponentType {
 
 .scalarValueWrapper ul.additionalLinkList {
     padding-bottom: 5px;
+    margin-left: -6.4px;
 }
 
 .scalarValueWrapper ul.additionalLinkListInline li.additionalLinkItem {
@@ -971,10 +980,10 @@ footer .footer-image {
     margin-bottom: 4px;
 }
 
-/* fit button-group inside surrounding value input box 
+/* fit button-group inside surrounding value input box
    obsolete when changing button size more generally
 .scalarValueInput .btn-group-sm > .btn {
-	padding: .20rem .5rem;  
+	padding: .20rem .5rem;
 }
 */
 
@@ -1247,8 +1256,8 @@ ul.navbar-wrap {
 }
 
 span.wkt-component-with-tooltip,
-label.wkt-component-with-tooltip, 
-.wkt-component-with-tooltip label, 
+label.wkt-component-with-tooltip,
+.wkt-component-with-tooltip label,
 strong.wkt-component-with-tooltip  {
 	text-decoration-line: underline;
 	text-decoration-style: dotted;