You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@isis.apache.org by ah...@apache.org on 2021/04/16 11:46:20 UTC

[isis] branch master updated: ISIS-2569: prepare unification of Bookmark and Oid

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 e098dc2  ISIS-2569: prepare unification of Bookmark and Oid
e098dc2 is described below

commit e098dc2dad965c49c8435b15b4c10dbdaf6ac385
Author: Andi Huber <ah...@apache.org>
AuthorDate: Fri Apr 16 13:46:05 2021 +0200

    ISIS-2569: prepare unification of Bookmark and Oid
---
 .../applib/jaxb/PersistentEntitiesAdapter.java     |   2 +-
 .../isis/applib/jaxb/PersistentEntityAdapter.java  |   2 +-
 .../isis/applib/services/bookmark/Bookmark.java    | 148 ++++++++++++++-------
 .../apache/isis/applib/services/bookmark/Oid.java  |  54 ++++++++
 .../isis/applib/services/command/Command.java      |   2 +-
 ...eractionDtoUtilsTest_deriveLogicalMemberId.java |   3 +-
 .../apache/isis/applib/util/schema/Roundtrip.java  |   4 +-
 .../isis/core/metamodel/adapter/oid/Oid.java       |   2 +-
 .../bookmarks/BookmarkServiceDefault.java          |   4 +-
 .../command/CommandExecutorServiceDefault.java     |   2 +-
 .../wrapper/WrapperFactoryDefault.java             |   2 +-
 .../runtimeservices/urlencoding/MementosTest.java  |   4 +-
 .../extensions/commandlog/impl/jdo/CommandJdo.java |   2 +-
 .../commandlog/impl/jdo/CommandJdoRepository.java  |   2 +-
 .../pdfjs/applib/spi/PdfJsViewerAdvisor.java       |   2 +-
 .../schema/v2/IsisOidDtoConverter.java             |   2 +-
 .../services/HintStoreUsingWicketSession.java      |  11 +-
 17 files changed, 178 insertions(+), 70 deletions(-)

diff --git a/api/applib/src/main/java/org/apache/isis/applib/jaxb/PersistentEntitiesAdapter.java b/api/applib/src/main/java/org/apache/isis/applib/jaxb/PersistentEntitiesAdapter.java
index 2e5d72a..571eb21 100644
--- a/api/applib/src/main/java/org/apache/isis/applib/jaxb/PersistentEntitiesAdapter.java
+++ b/api/applib/src/main/java/org/apache/isis/applib/jaxb/PersistentEntitiesAdapter.java
@@ -45,7 +45,7 @@ public class PersistentEntitiesAdapter extends XmlAdapter<OidsDto, List<Object>>
 
         List<Object> domainObjects = new ArrayList<>();
         for (val oidDto : oidsDto.getOid()) {
-            val bookmark = Bookmark.fromOidDto(oidDto);
+            val bookmark = Bookmark.forOidDto(oidDto);
             bookmarkService.lookup(bookmark)
             .ifPresent(domainObjects::add);
         }
diff --git a/api/applib/src/main/java/org/apache/isis/applib/jaxb/PersistentEntityAdapter.java b/api/applib/src/main/java/org/apache/isis/applib/jaxb/PersistentEntityAdapter.java
index f3ddf55..6745a11 100644
--- a/api/applib/src/main/java/org/apache/isis/applib/jaxb/PersistentEntityAdapter.java
+++ b/api/applib/src/main/java/org/apache/isis/applib/jaxb/PersistentEntityAdapter.java
@@ -35,7 +35,7 @@ public class PersistentEntityAdapter extends XmlAdapter<OidDto, Object> {
     @Override
     public Object unmarshal(final OidDto oidDto) throws Exception {
 
-        val bookmark = Bookmark.fromOidDto(oidDto);
+        val bookmark = Bookmark.forOidDto(oidDto);
         return bookmarkService.lookup(bookmark).orElse(null);
     }
 
diff --git a/api/applib/src/main/java/org/apache/isis/applib/services/bookmark/Bookmark.java b/api/applib/src/main/java/org/apache/isis/applib/services/bookmark/Bookmark.java
index 8af8f16..5e881b6 100644
--- a/api/applib/src/main/java/org/apache/isis/applib/services/bookmark/Bookmark.java
+++ b/api/applib/src/main/java/org/apache/isis/applib/services/bookmark/Bookmark.java
@@ -18,51 +18,84 @@
  */
 package org.apache.isis.applib.services.bookmark;
 
-import java.io.Serializable;
+import java.util.Objects;
 import java.util.Optional;
 import java.util.StringTokenizer;
 
 import javax.annotation.Nullable;
 
-import org.apache.isis.applib.annotation.Value;
+import org.apache.isis.applib.id.LogicalType;
+import org.apache.isis.commons.internal.base._Strings;
 import org.apache.isis.schema.common.v2.OidDto;
 
 import lombok.AccessLevel;
+import lombok.Getter;
 import lombok.NonNull;
 import lombok.RequiredArgsConstructor;
 import lombok.val;
 
 /**
- * String representation of any persistable or re-createable object managed by the framework.
- *
- * <p>
- * Analogous to the <tt>RootOid</tt>.
+ * String representation of any persistable or re-creatable object managed by the framework.
  * 
  * @since 1.x revised for 2.0 {@index}
  */
-@Value 
-@lombok.Value @RequiredArgsConstructor(access = AccessLevel.PRIVATE)
-public class Bookmark implements Serializable {
+@org.apache.isis.applib.annotation.Value
+@RequiredArgsConstructor(access = AccessLevel.PRIVATE)
+public final class Bookmark implements Oid {
 
     private static final long serialVersionUID = 3L;
 
-    protected static final String SEPARATOR = ":";
-
-    /**
-     * Corresponds directly to the object's logical-type-name (aka. object-type).
-     * @see RootOid
-     */
-    @NonNull  private final String logicalTypeName;
-    @NonNull  private final String identifier;
-
-    @Nullable private final String hintId;
-
-    public static Bookmark of(String logicalTypeName, String identifier) {
-        return new Bookmark(logicalTypeName, identifier, /*hintId*/ null);
+    @Getter(onMethod_ = {@Override}) private final String logicalTypeName;
+    @Getter(onMethod_ = {@Override}) private final String identifier;
+    @Getter private final @Nullable String hintId;
+    private final int hashCode;
+    
+    // -- FACTORIES
+
+    public static Bookmark forLogicalTypeNameAndIdentifier(
+            final @NonNull String logicalTypeName,
+            final @NonNull String identifier) {
+        return new Bookmark(
+                logicalTypeName, 
+                identifier, 
+                /*hintId*/null);
+    }
+    
+    public static Bookmark forLogicalTypeAndIdentifier(
+            final @NonNull LogicalType logicalType, 
+            final @NonNull String identifier) {
+        return Bookmark.forLogicalTypeNameAndIdentifier(
+                logicalType.getLogicalTypeName(), 
+                identifier);
+    }
+    
+    public static Bookmark forOidDto(final @NonNull OidDto oidDto) {
+        return Bookmark.forLogicalTypeNameAndIdentifier(
+                oidDto.getType(), 
+                oidDto.getId());
     }
 
+    public Bookmark withHintId(final @Nullable String hintId) {
+        return new Bookmark(this.getLogicalTypeName(), this.getIdentifier(), hintId); 
+    }
+    
+    // -- CONSTRUCTOR
+    
+    private Bookmark(
+            final String logicalTypeName, 
+            final String identifier,
+            final String hintId) {
+
+        this.logicalTypeName = logicalTypeName;
+        this.identifier = identifier;
+        this.hintId = hintId;
+        this.hashCode = Objects.hash(logicalTypeName, identifier);
+    }
+    
+    // -- PARSE
+    
     /**
-     * Round-trip with {@link #toString()} representation.
+     * Round-trip with {@link #stringify()} representation.
      */
     public static Optional<Bookmark> parse(@Nullable String str) {
 
@@ -72,15 +105,19 @@ public class Bookmark implements Serializable {
         val tokenizer = new StringTokenizer(str, SEPARATOR);
         int tokenCount = tokenizer.countTokens();
         if(tokenCount==2) {
-            return Optional.of(Bookmark.of(tokenizer.nextToken(), tokenizer.nextToken()));
+            return Optional.of(Bookmark.forLogicalTypeNameAndIdentifier(
+                    tokenizer.nextToken(), 
+                    tokenizer.nextToken()));
         }
         if(tokenCount>2) {
-            return Optional.of(Bookmark.of(tokenizer.nextToken(), tokenizer.nextToken("").substring(1)));
+            return Optional.of(Bookmark.forLogicalTypeNameAndIdentifier(
+                    tokenizer.nextToken(), 
+                    tokenizer.nextToken("").substring(1)));
         }
         return Optional.empty();
-
-        // ...
     }
+    
+    // -- TO DTO
 
     public OidDto toOidDto() {
         val oidDto = new OidDto();
@@ -89,37 +126,58 @@ public class Bookmark implements Serializable {
         return oidDto;
     }
 
-    public static Bookmark fromOidDto(final @NonNull OidDto oidDto) {
-        return Bookmark.of(oidDto.getType(), oidDto.getId());
+    // -- STRINGIFY
+    
+    @Override
+    public String stringify() {
+        return stringify(identifier);
     }
     
-    /**
-     * The canonical form of the {@link Bookmark}, that is 
-     * {@link #getLogicalTypeName() logical-type-name}{@value #SEPARATOR}{@link #getIdentifier() identifier}.
-     * <p>
-     * This is parseable by the {@link #parse(String)}.
-     */
+    // -- OBJECT CONTRACT // not considering any hintId
+    
     @Override
-    public String toString() {
-        return toStringUsingIdentifier(identifier);
+    public boolean equals(final Object other) {
+        if (other == null) {
+            return false;
+        }
+        if (other == this) {
+            return true;
+        }
+        if (getClass() != other.getClass()) {
+            return false;
+        }
+        return equals((Bookmark) other);
     }
 
-    public Bookmark withHintId(@NonNull String hintId) {
-        return new Bookmark(this.getLogicalTypeName(), this.getIdentifier(), hintId); 
+    public boolean equals(final Bookmark other) {
+        return Objects.equals(logicalTypeName, other.getLogicalTypeName()) 
+                && Objects.equals(identifier, other.getIdentifier());
     }
 
-    public String toStringUsingIdentifier(String id) {
-        return logicalTypeName + SEPARATOR + id;
+    @Override
+    public int hashCode() {
+        return hashCode;
     }
     
-    // -- ALIAS
+    @Override
+    public String toString() {
+        return stringify();
+    }
     
     /**
-     * Alias for {@link #getLogicalTypeName()}.
+     * Analogous to {@link #stringify()}, but replaces the {@code identifier} string with 
+     * the {@code hintId} if present and not empty. 
      */
-    public String getObjectType() {
-        return getLogicalTypeName();
+    public String stringifyHonoringHintIfAny() {
+        return _Strings.isNotEmpty(hintId)
+                ? stringify(hintId)
+                : stringify(identifier);
     }
+
+    // -- HELPER
     
+    private String stringify(String id) {
+        return logicalTypeName + SEPARATOR + id;
+    }
 
 }
diff --git a/api/applib/src/main/java/org/apache/isis/applib/services/bookmark/Oid.java b/api/applib/src/main/java/org/apache/isis/applib/services/bookmark/Oid.java
new file mode 100644
index 0000000..96d619f
--- /dev/null
+++ b/api/applib/src/main/java/org/apache/isis/applib/services/bookmark/Oid.java
@@ -0,0 +1,54 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ */
+package org.apache.isis.applib.services.bookmark;
+
+import java.io.Serializable;
+
+/**
+ * @since 1.x revised for 2.0 {@index}
+ */
+public interface Oid extends Serializable {
+    
+    static final String SEPARATOR = ":";
+
+    /**
+     * Logical-type-name of the domain object this Oid is representing.
+     * (aka. object-type)
+     */
+    String getLogicalTypeName();
+
+    /**
+     * Stringified version of the ID of the domain object instance this Oid is representing. 
+     */
+    String getIdentifier();
+    
+    /**
+     * Alias for {@link #getLogicalTypeName()}.
+     */
+    default String getObjectType() {
+        return getLogicalTypeName();
+    }
+
+    /**
+     * The canonical form of the {@link Bookmark}, that is 
+     * {@link #getLogicalTypeName() logical-type-name}{@value #SEPARATOR}{@link #getIdentifier() identifier}.
+     */
+    String stringify();
+    
+}
diff --git a/api/applib/src/main/java/org/apache/isis/applib/services/command/Command.java b/api/applib/src/main/java/org/apache/isis/applib/services/command/Command.java
index aa6b048..31c44ce 100644
--- a/api/applib/src/main/java/org/apache/isis/applib/services/command/Command.java
+++ b/api/applib/src/main/java/org/apache/isis/applib/services/command/Command.java
@@ -144,7 +144,7 @@ public class Command implements HasInteractionId, HasUsername, HasCommandDto {
     @ToString.Include(name = "target")
     public Bookmark getTarget() {
         return commandDto != null
-                ? Bookmark.fromOidDto(commandDto.getTargets().getOid().get(0))
+                ? Bookmark.forOidDto(commandDto.getTargets().getOid().get(0))
                 : null;
     }
 
diff --git a/api/applib/src/test/java/org/apache/isis/applib/util/schema/InteractionDtoUtilsTest_deriveLogicalMemberId.java b/api/applib/src/test/java/org/apache/isis/applib/util/schema/InteractionDtoUtilsTest_deriveLogicalMemberId.java
index 3dd0771..195a144 100644
--- a/api/applib/src/test/java/org/apache/isis/applib/util/schema/InteractionDtoUtilsTest_deriveLogicalMemberId.java
+++ b/api/applib/src/test/java/org/apache/isis/applib/util/schema/InteractionDtoUtilsTest_deriveLogicalMemberId.java
@@ -28,7 +28,8 @@ public class InteractionDtoUtilsTest_deriveLogicalMemberId {
 
     @Test
     public void happy_case() throws Exception {
-        String s = InteractionDtoUtils.deriveLogicalMemberId(Bookmark.of("customer.Order", "1234"),
+        String s = InteractionDtoUtils.deriveLogicalMemberId(
+                Bookmark.forLogicalTypeNameAndIdentifier("customer.Order", "1234"),
                 "com.mycompany.customer.Order#placeOrder");
         assertThat(s, is(equalTo("customer.Order#placeOrder")));
     }
diff --git a/api/applib/src/test/java/org/apache/isis/applib/util/schema/Roundtrip.java b/api/applib/src/test/java/org/apache/isis/applib/util/schema/Roundtrip.java
index e66e1c3..a48f920 100644
--- a/api/applib/src/test/java/org/apache/isis/applib/util/schema/Roundtrip.java
+++ b/api/applib/src/test/java/org/apache/isis/applib/util/schema/Roundtrip.java
@@ -150,7 +150,7 @@ public class Roundtrip {
 
     private static class SampleValues {
 
-        final Bookmark bookmark = Bookmark.of("ORD", "12345");
+        final Bookmark bookmark = Bookmark.forLogicalTypeNameAndIdentifier("ORD", "12345");
         final OidDto reference = new OidDto();
         {
             reference.setId("12345");
@@ -211,7 +211,7 @@ public class Roundtrip {
         final InteractionDto interactionDto = newInteractionDtoWithActionInvocation(
                 UUID.randomUUID().toString(),
                 1,
-                Bookmark.of("CUS", "12345"), "John Customer", "com.mycompany.Customer#placeOrder", Arrays.<ParamDto>asList(),
+                Bookmark.forLogicalTypeNameAndIdentifier("CUS", "12345"), "John Customer", "com.mycompany.Customer#placeOrder", Arrays.<ParamDto>asList(),
                 "freddyUser"
                 );
 
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/adapter/oid/Oid.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/adapter/oid/Oid.java
index b4f9cb7..07d71d1 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/adapter/oid/Oid.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/adapter/oid/Oid.java
@@ -120,7 +120,7 @@ public interface Oid extends Serializable {
     // -- CONVERSION
     
     public default Bookmark asBookmark() {
-        return Bookmark.of(getLogicalTypeName(), getIdentifier());
+        return Bookmark.forLogicalTypeNameAndIdentifier(getLogicalTypeName(), getIdentifier());
     }
     
 
diff --git a/core/runtimeservices/src/main/java/org/apache/isis/core/runtimeservices/bookmarks/BookmarkServiceDefault.java b/core/runtimeservices/src/main/java/org/apache/isis/core/runtimeservices/bookmarks/BookmarkServiceDefault.java
index d1cf544..d156185 100644
--- a/core/runtimeservices/src/main/java/org/apache/isis/core/runtimeservices/bookmarks/BookmarkServiceDefault.java
+++ b/core/runtimeservices/src/main/java/org/apache/isis/core/runtimeservices/bookmarks/BookmarkServiceDefault.java
@@ -130,8 +130,8 @@ public class BookmarkServiceDefault implements BookmarkService, SerializingAdapt
             return Optional.empty();
         }
         return specificationLoader.specForType(cls) 
-                .map(ObjectSpecification::getLogicalTypeName)
-                .map(logicalTypeName->Bookmark.of(logicalTypeName, identifier));
+                .map(ObjectSpecification::getLogicalType)
+                .map(logicalType->Bookmark.forLogicalTypeAndIdentifier(logicalType, identifier));
     }
 
     // -- SERIALIZING ADAPTER IMPLEMENTATION
diff --git a/core/runtimeservices/src/main/java/org/apache/isis/core/runtimeservices/command/CommandExecutorServiceDefault.java b/core/runtimeservices/src/main/java/org/apache/isis/core/runtimeservices/command/CommandExecutorServiceDefault.java
index 8c81c65..91a79e2 100644
--- a/core/runtimeservices/src/main/java/org/apache/isis/core/runtimeservices/command/CommandExecutorServiceDefault.java
+++ b/core/runtimeservices/src/main/java/org/apache/isis/core/runtimeservices/command/CommandExecutorServiceDefault.java
@@ -233,7 +233,7 @@ public class CommandExecutorServiceDefault implements CommandExecutorService {
 
             for (OidDto targetOidDto : targetOidDtos) {
 
-                final Bookmark bookmark = Bookmark.fromOidDto(targetOidDto);
+                final Bookmark bookmark = Bookmark.forOidDto(targetOidDto);
                 final Object targetObject = bookmarkService.lookup(bookmark).orElse(null);
 
                 val targetAdapter = adapterFor(targetObject);
diff --git a/core/runtimeservices/src/main/java/org/apache/isis/core/runtimeservices/wrapper/WrapperFactoryDefault.java b/core/runtimeservices/src/main/java/org/apache/isis/core/runtimeservices/wrapper/WrapperFactoryDefault.java
index 55a8ef0..4b063a8 100644
--- a/core/runtimeservices/src/main/java/org/apache/isis/core/runtimeservices/wrapper/WrapperFactoryDefault.java
+++ b/core/runtimeservices/src/main/java/org/apache/isis/core/runtimeservices/wrapper/WrapperFactoryDefault.java
@@ -386,7 +386,7 @@ public class WrapperFactoryDefault implements WrapperFactory {
         val oidDto = commandDto.getTargets().getOid().get(0);
 
         asyncControl.setMethod(method);
-        asyncControl.setBookmark(Bookmark.fromOidDto(oidDto));
+        asyncControl.setBookmark(Bookmark.forOidDto(oidDto));
 
         val executorService = asyncControl.getExecutorService();
         val future = executorService.submit(
diff --git a/core/runtimeservices/src/test/java/org/apache/isis/core/runtimeservices/urlencoding/MementosTest.java b/core/runtimeservices/src/test/java/org/apache/isis/core/runtimeservices/urlencoding/MementosTest.java
index 46f3c51..56f723a 100644
--- a/core/runtimeservices/src/test/java/org/apache/isis/core/runtimeservices/urlencoding/MementosTest.java
+++ b/core/runtimeservices/src/test/java/org/apache/isis/core/runtimeservices/urlencoding/MementosTest.java
@@ -98,7 +98,7 @@ class MementosTest {
         memento.put("someLocalDate", LocalDate.of(2013,9,3));
         memento.put("someJavaUtilDate", new Date(300_000_000));
 
-        memento.put("someBookmark", Bookmark.of("CUS", "12345"));
+        memento.put("someBookmark", Bookmark.forLogicalTypeNameAndIdentifier("CUS", "12345"));
         memento.put("someNullValue", null);
 
         memento.put("someEnum", DOW.Wed);
@@ -121,7 +121,7 @@ class MementosTest {
         assertThat(memento2.get("someBigDecimal", BigDecimal.class), is(new BigDecimal("123456789012345678901234567890.123456789")));
         assertThat(memento2.get("someLocalDate", LocalDate.class), is(LocalDate.of(2013,9,3)));
         assertThat(memento2.get("someJavaUtilDate", Date.class), is(new Date(300_000_000)));
-        assertThat(memento2.get("someBookmark", Bookmark.class), is(Bookmark.of("CUS", "12345")));
+        assertThat(memento2.get("someBookmark", Bookmark.class), is(Bookmark.forLogicalTypeNameAndIdentifier("CUS", "12345")));
 
         // a nullValue can be grabbed as any type, will always succeed
         assertThat(memento2.get("someNullValue", Integer.class), is(nullValue()));
diff --git a/extensions/core/command-log/impl/src/main/java/org/apache/isis/extensions/commandlog/impl/jdo/CommandJdo.java b/extensions/core/command-log/impl/src/main/java/org/apache/isis/extensions/commandlog/impl/jdo/CommandJdo.java
index 9d4d23d..af99de4 100644
--- a/extensions/core/command-log/impl/src/main/java/org/apache/isis/extensions/commandlog/impl/jdo/CommandJdo.java
+++ b/extensions/core/command-log/impl/src/main/java/org/apache/isis/extensions/commandlog/impl/jdo/CommandJdo.java
@@ -308,7 +308,7 @@ public class CommandJdo
         setTimestamp(JavaSqlXMLGregorianCalendarMarshalling.toTimestamp(commandDto.getTimestamp()));
 
         setCommandDto(commandDto);
-        setTarget(Bookmark.fromOidDto(commandDto.getTargets().getOid().get(targetIndex)));
+        setTarget(Bookmark.forOidDto(commandDto.getTargets().getOid().get(targetIndex)));
         setLogicalMemberIdentifier(commandDto.getMember().getLogicalMemberIdentifier());
 
         // the hierarchy of commands calling other commands is only available on the primary system, and is
diff --git a/extensions/core/command-log/impl/src/main/java/org/apache/isis/extensions/commandlog/impl/jdo/CommandJdoRepository.java b/extensions/core/command-log/impl/src/main/java/org/apache/isis/extensions/commandlog/impl/jdo/CommandJdoRepository.java
index 3e331b3..b3e906e 100644
--- a/extensions/core/command-log/impl/src/main/java/org/apache/isis/extensions/commandlog/impl/jdo/CommandJdoRepository.java
+++ b/extensions/core/command-log/impl/src/main/java/org/apache/isis/extensions/commandlog/impl/jdo/CommandJdoRepository.java
@@ -340,7 +340,7 @@ public class CommandJdoRepository {
         commandJdo.setReplayState(ReplayState.PENDING);
 
         final OidDto firstTarget = dto.getTargets().getOid().get(0);
-        commandJdo.setTarget(Bookmark.fromOidDto(firstTarget));
+        commandJdo.setTarget(Bookmark.forOidDto(firstTarget));
         commandJdo.setCommandDto(dto);
         commandJdo.setLogicalMemberIdentifier(dto.getMember().getLogicalMemberIdentifier());
 
diff --git a/extensions/vw/pdfjs/applib/src/main/java/org/apache/isis/extensions/viewer/wicket/pdfjs/applib/spi/PdfJsViewerAdvisor.java b/extensions/vw/pdfjs/applib/src/main/java/org/apache/isis/extensions/viewer/wicket/pdfjs/applib/spi/PdfJsViewerAdvisor.java
index 67765e3..103ff3f 100644
--- a/extensions/vw/pdfjs/applib/src/main/java/org/apache/isis/extensions/viewer/wicket/pdfjs/applib/spi/PdfJsViewerAdvisor.java
+++ b/extensions/vw/pdfjs/applib/src/main/java/org/apache/isis/extensions/viewer/wicket/pdfjs/applib/spi/PdfJsViewerAdvisor.java
@@ -84,7 +84,7 @@ public interface PdfJsViewerAdvisor {
 
         @Programmatic
         public Bookmark asBookmark() {
-            return Bookmark.of(typeKey.objectType, identifier);
+            return Bookmark.forLogicalTypeNameAndIdentifier(typeKey.objectType, identifier);
         }
 
         @Override
diff --git a/persistence/jdo/datanucleus/src/main/java/org/apache/isis/persistence/jdo/datanucleus/typeconverters/schema/v2/IsisOidDtoConverter.java b/persistence/jdo/datanucleus/src/main/java/org/apache/isis/persistence/jdo/datanucleus/typeconverters/schema/v2/IsisOidDtoConverter.java
index 6a33529..16131ba 100644
--- a/persistence/jdo/datanucleus/src/main/java/org/apache/isis/persistence/jdo/datanucleus/typeconverters/schema/v2/IsisOidDtoConverter.java
+++ b/persistence/jdo/datanucleus/src/main/java/org/apache/isis/persistence/jdo/datanucleus/typeconverters/schema/v2/IsisOidDtoConverter.java
@@ -33,7 +33,7 @@ public class IsisOidDtoConverter implements TypeConverter<OidDto, String>{
     @Override
     public String toDatastoreType(final OidDto memberValue) {
         return memberValue != null
-                ? Bookmark.fromOidDto(memberValue).toString()
+                ? Bookmark.forOidDto(memberValue).toString()
                 : null;
     }
 
diff --git a/viewers/wicket/viewer/src/main/java/org/apache/isis/viewer/wicket/viewer/services/HintStoreUsingWicketSession.java b/viewers/wicket/viewer/src/main/java/org/apache/isis/viewer/wicket/viewer/services/HintStoreUsingWicketSession.java
index 743273b..52e51d0 100644
--- a/viewers/wicket/viewer/src/main/java/org/apache/isis/viewer/wicket/viewer/services/HintStoreUsingWicketSession.java
+++ b/viewers/wicket/viewer/src/main/java/org/apache/isis/viewer/wicket/viewer/services/HintStoreUsingWicketSession.java
@@ -20,7 +20,6 @@ package org.apache.isis.viewer.wicket.viewer.services;
 
 import java.util.LinkedHashMap;
 import java.util.Map;
-import java.util.Optional;
 import java.util.Set;
 
 import javax.inject.Named;
@@ -33,9 +32,9 @@ import org.springframework.stereotype.Service;
 import org.apache.isis.applib.annotation.OrderPrecedence;
 import org.apache.isis.applib.services.bookmark.Bookmark;
 import org.apache.isis.applib.services.hint.HintStore;
+import org.apache.isis.commons.internal.base._Casts;
 import org.apache.isis.commons.internal.collections._Maps;
 
-import lombok.val;
 import lombok.extern.log4j.Log4j2;
 
 @Service
@@ -95,7 +94,7 @@ public class HintStoreUsingWicketSession implements HintStore {
     protected Map<String, String> hintsFor(final Bookmark bookmark) {
         final String sessionAttribute = sessionAttributeFor(bookmark);
         LinkedHashMap<String, String> hints =
-                (LinkedHashMap<String, String>) Session.get().getAttribute(sessionAttribute);
+                _Casts.uncheckedCast(Session.get().getAttribute(sessionAttribute));
         if(hints == null) {
             hints = _Maps.newLinkedHashMap();
             Session.get().setAttribute(sessionAttribute, hints);
@@ -104,11 +103,7 @@ public class HintStoreUsingWicketSession implements HintStore {
     }
 
     protected String sessionAttributeFor(final Bookmark bookmark) {
-        
-        val id = Optional.ofNullable(bookmark.getHintId())
-                    .orElse(bookmark.getIdentifier());
-        
-        return "hint-" + bookmark.toStringUsingIdentifier(id);
+        return "hint-" + bookmark.stringifyHonoringHintIfAny();
     }
 
 }