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

danhaywood pushed a commit to branch CAUSEWAY-3670
in repository https://gitbox.apache.org/repos/asf/causeway.git

commit d379d28a6f6420c8a5d556d382ddaf1da38345eb
Author: danhaywood <[email protected]>
AuthorDate: Mon Jan 15 13:26:26 2024 +0000

    CAUSEWAY-3670: extends BookmarkService and MetaModelService
    
    to handle aliases
---
 .../applib/services/bookmark/BookmarkService.java  | 10 ++++++++
 .../services/metamodel/MetaModelService.java       | 27 ++++++++++++++++++++++
 .../metamodel/MetaModelServiceDefault.java         | 26 +++++++++++++++++++++
 .../bookmarks/BookmarkServiceDefault.java          | 24 +++++++++++++++++++
 4 files changed, 87 insertions(+)

diff --git 
a/api/applib/src/main/java/org/apache/causeway/applib/services/bookmark/BookmarkService.java
 
b/api/applib/src/main/java/org/apache/causeway/applib/services/bookmark/BookmarkService.java
index a325ba06a9..756cd787a7 100644
--- 
a/api/applib/src/main/java/org/apache/causeway/applib/services/bookmark/BookmarkService.java
+++ 
b/api/applib/src/main/java/org/apache/causeway/applib/services/bookmark/BookmarkService.java
@@ -18,8 +18,12 @@
  */
 package org.apache.causeway.applib.services.bookmark;
 
+import java.util.List;
 import java.util.Optional;
 
+import org.apache.causeway.applib.annotation.DomainObject;
+import org.apache.causeway.applib.annotation.DomainService;
+
 import org.springframework.lang.Nullable;
 
 import lombok.NonNull;
@@ -46,6 +50,12 @@ public interface BookmarkService {
      */
     Optional<Bookmark> bookmarkFor(@Nullable Object domainObject);
 
+    /**
+     * Returns all possible {@link Bookmark}s for the provided domain object, 
taking into account any aliases
+     * defined as per {@link DomainObject#aliased()} or {@link 
DomainService#aliased()}.
+     */
+    List<Bookmark> bookmarksFor(@Nullable Object domainObject);
+
     /**
      * Optionally returns a {@link Bookmark} created from the constituent 
parts,
      * based on whether can create a bookmark from these.
diff --git 
a/api/applib/src/main/java/org/apache/causeway/applib/services/metamodel/MetaModelService.java
 
b/api/applib/src/main/java/org/apache/causeway/applib/services/metamodel/MetaModelService.java
index 0e03d28756..01e1f56cfd 100644
--- 
a/api/applib/src/main/java/org/apache/causeway/applib/services/metamodel/MetaModelService.java
+++ 
b/api/applib/src/main/java/org/apache/causeway/applib/services/metamodel/MetaModelService.java
@@ -23,6 +23,8 @@ import java.util.function.BiPredicate;
 
 import javax.inject.Named;
 
+import org.apache.causeway.commons.collections.Can;
+
 import org.springframework.lang.Nullable;
 
 import org.apache.causeway.applib.annotation.Action;
@@ -57,6 +59,31 @@ public interface MetaModelService {
      */
     Optional<LogicalType> lookupLogicalTypeByName(final String 
logicalTypeName);
 
+    /**
+     * Assuming that the {@link LogicalType} passed in actually represents a 
domain type, then
+     * returns it along with any aliases defined as per
+     * {@link DomainService#aliased()} or {@link DomainObject#aliased()}.
+     *
+     * <p>
+     *     If there is no such domain type, then an empty {@link Can} will be 
returned.
+     * </p>
+     *
+     * @param logicalType
+     * @return
+     */
+    Can<LogicalType> logicalTypeAndAliasesFor(final LogicalType logicalType);
+
+    /**
+     * Returns the {@link LogicalType} of a domain class' object type, 
corresponding to {@link Named#value()},
+     * along with any aliases defined as per
+     * {@link DomainService#aliased()} or {@link DomainObject#aliased()}.
+     *
+     * <p>
+     *     If there is no such domain type, then an empty {@link Can} will be 
returned.
+     * </p>
+     */
+    Can<LogicalType> logicalTypeAndAliasesFor(final String logicalTypeName);
+
     /**
      * Provides a lookup by class of a domain class' object type,corresponding 
to
      * {@link Named#value()} or {@link DomainService#aliased()} or
diff --git 
a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/services/metamodel/MetaModelServiceDefault.java
 
b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/services/metamodel/MetaModelServiceDefault.java
index a377c21b82..9fe3881af6 100644
--- 
a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/services/metamodel/MetaModelServiceDefault.java
+++ 
b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/services/metamodel/MetaModelServiceDefault.java
@@ -18,15 +18,23 @@
  */
 package org.apache.causeway.core.metamodel.services.metamodel;
 
+import java.util.ArrayList;
 import java.util.Collections;
 import java.util.List;
 import java.util.Optional;
+import java.util.Set;
+import java.util.TreeSet;
 import java.util.function.BiPredicate;
 import java.util.stream.Collectors;
 
 import javax.annotation.Priority;
 import javax.inject.Inject;
 import javax.inject.Named;
+import javax.validation.constraints.Null;
+
+import org.apache.causeway.commons.collections.Can;
+
+import org.apache.causeway.core.config.CausewayConfiguration;
 
 import org.springframework.beans.factory.annotation.Qualifier;
 import org.springframework.lang.Nullable;
@@ -78,6 +86,24 @@ public class MetaModelServiceDefault implements 
MetaModelService {
                 .map(ObjectSpecification::getLogicalType);
     }
 
+    @Override
+    public Can<LogicalType> logicalTypeAndAliasesFor(final LogicalType 
logicalType) {
+        Set<LogicalType> logicalTypes = new TreeSet<>();
+        specificationLoader.specForLogicalType(logicalType)
+                .ifPresent(objectSpecification -> {
+                    logicalTypes.add(logicalType);
+                    
objectSpecification.getAliases().stream().forEach(logicalTypes::add);
+                });
+        return Can.ofCollection(logicalTypes);
+    }
+
+    @Override
+    public Can<LogicalType> logicalTypeAndAliasesFor(final @Nullable String 
logicalTypeName) {
+        return lookupLogicalTypeByName(logicalTypeName)
+                .map(this::logicalTypeAndAliasesFor)
+                .orElse(Can.empty());
+    }
+
     @Override
     public Optional<LogicalType> lookupLogicalTypeByClass(final @Nullable 
Class<?> domainType) {
         return specificationLoader.specForType(domainType)
diff --git 
a/core/runtimeservices/src/main/java/org/apache/causeway/core/runtimeservices/bookmarks/BookmarkServiceDefault.java
 
b/core/runtimeservices/src/main/java/org/apache/causeway/core/runtimeservices/bookmarks/BookmarkServiceDefault.java
index 8b5667e749..f5766b64b5 100644
--- 
a/core/runtimeservices/src/main/java/org/apache/causeway/core/runtimeservices/bookmarks/BookmarkServiceDefault.java
+++ 
b/core/runtimeservices/src/main/java/org/apache/causeway/core/runtimeservices/bookmarks/BookmarkServiceDefault.java
@@ -18,12 +18,20 @@
  */
 package org.apache.causeway.core.runtimeservices.bookmarks;
 
+import java.util.Collections;
+import java.util.List;
 import java.util.Optional;
+import java.util.stream.Collectors;
 
 import javax.annotation.Priority;
 import javax.inject.Inject;
 import javax.inject.Named;
 
+import org.apache.causeway.applib.id.LogicalType;
+import org.apache.causeway.applib.services.metamodel.MetaModelService;
+
+import org.apache.causeway.commons.collections.Can;
+
 import org.springframework.beans.factory.annotation.Qualifier;
 import org.springframework.lang.Nullable;
 import org.springframework.stereotype.Service;
@@ -58,6 +66,7 @@ public class BookmarkServiceDefault implements 
BookmarkService {
     @Inject private WrapperFactory wrapperFactory;
     @Inject private ObjectManager objectManager;
     @Inject private MetaModelContext mmc;
+    @Inject private MetaModelService metaModelService;
 
     @Override
     public Optional<Object> lookup(final @Nullable BookmarkHolder 
bookmarkHolder) {
@@ -70,6 +79,20 @@ public class BookmarkServiceDefault implements 
BookmarkService {
                 : Optional.empty();
     }
 
+    @Override
+    public List<Bookmark> bookmarksFor(Object domainObject) {
+        return bookmarkFor(domainObject)
+                .map(bookmark -> {
+                    Can<LogicalType> logicalTypes = 
metaModelService.logicalTypeAndAliasesFor(bookmark.getLogicalTypeName());
+                    String id = bookmark.getIdentifier();
+                    return logicalTypes.stream()
+                            .map(x -> Bookmark.forLogicalTypeAndIdentifier(x, 
id))
+                            .collect(Collectors.toList());
+                })
+                .orElse(Collections.emptyList());
+
+    }
+
     // why would we ever store Service Beans as Bookmarks?
     // - ANSWER: because it might be used by the CommandService to replay a 
command or exec in the background.
     @Override
@@ -92,6 +115,7 @@ public class BookmarkServiceDefault implements 
BookmarkService {
                 .flatMap(ManagedObject::getBookmark);
     }
 
+
     @Override
     public Optional<Bookmark> bookmarkFor(
             final @Nullable Class<?> cls,

Reply via email to