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,
