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
commit f40ecae87c8f8bb6a48767b31e904376bb32fe36 Author: Andi Huber <ahu...@apache.org> AuthorDate: Mon Sep 5 05:13:48 2022 +0200 ISIS-3199: simplify ObjectBookmarker --- .../metamodel/object/_ManagedObjectViewmodel.java | 20 +-- .../metamodel/objectmanager/ObjectBookmarker.java | 89 +++++++++++++ .../metamodel/objectmanager/ObjectManager.java | 1 - .../objectmanager/ObjectManagerDefault.java | 1 - .../objectmanager/identify/ObjectBookmarker.java | 60 --------- .../identify/ObjectBookmarker_builtinHandlers.java | 141 --------------------- 6 files changed, 92 insertions(+), 220 deletions(-) diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/object/_ManagedObjectViewmodel.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/object/_ManagedObjectViewmodel.java index 555d6332db..e461326085 100644 --- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/object/_ManagedObjectViewmodel.java +++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/object/_ManagedObjectViewmodel.java @@ -30,7 +30,6 @@ import org.apache.isis.applib.services.bookmark.Bookmark; import org.apache.isis.commons.internal.assertions._Assert; import org.apache.isis.commons.internal.base._Lazy; import org.apache.isis.commons.internal.debug._XrayEvent; -import org.apache.isis.core.metamodel.context.MetaModelContext; import org.apache.isis.core.metamodel.spec.ObjectSpecification; import lombok.Getter; @@ -51,7 +50,7 @@ implements @Nullable private /*final*/ Object pojo; protected final _Lazy<Optional<Bookmark>> bookmarkLazy = - _Lazy.threadSafe(()->bookmark(this)); + _Lazy.threadSafe(()->createBookmark()); _ManagedObjectViewmodel( final ObjectSpecification spec, @@ -88,21 +87,8 @@ implements bookmarkLazy.set(Optional.ofNullable(replacer.apply(old))); } - // guards against non-identifiable objects; - // historically, we allowed non-identifiable to be handled by the objectManager, - // which as a fallback creates 'random' UUIDs - private Optional<Bookmark> bookmark(final @Nullable ManagedObject adapter) { - - if(ManagedObjects.isNullOrUnspecifiedOrEmpty(adapter) - || adapter.getSpecification().isValue() - || !ManagedObjects.isIdentifiable(adapter)) { - return Optional.empty(); - } - - return ManagedObjects.spec(adapter) - .map(ObjectSpecification::getMetaModelContext) - .map(MetaModelContext::getObjectManager) - .flatMap(objectManager->objectManager.bookmarkObject(adapter)); + private Optional<Bookmark> createBookmark() { + return Optional.ofNullable(getSpecification().viewmodelFacetElseFail().serializeToBookmark(this)); } // -- REFRESH OPTIMIZATION diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/objectmanager/ObjectBookmarker.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/objectmanager/ObjectBookmarker.java new file mode 100644 index 0000000000..f1c92af48e --- /dev/null +++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/objectmanager/ObjectBookmarker.java @@ -0,0 +1,89 @@ +/* + * 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.core.metamodel.objectmanager; + +import java.util.List; +import java.util.Optional; + +import org.apache.isis.applib.services.bookmark.Bookmark; +import org.apache.isis.applib.services.bookmark.Oid; +import org.apache.isis.commons.handler.ChainOfResponsibility; +import org.apache.isis.core.metamodel.object.Bookmarkable; +import org.apache.isis.core.metamodel.object.ManagedObject; + +/** + * @since 2.0 + */ +public interface ObjectBookmarker { + + Optional<Bookmark> bookmarkObject(ManagedObject managedObject); + + // -- HANDLER + + public interface Handler extends ChainOfResponsibility.Handler<ManagedObject, Optional<Bookmark>> {} + + // -- FACTORY + + public static ObjectBookmarker createDefault() { + return managedObject -> + ChainOfResponsibility.named( + "ObjectBookmarker", + handlers) + .handle(managedObject); + } + + // -- HANDLERS + + static final List<Handler> handlers = List.of(BuiltinHandlers.values()); + + enum BuiltinHandlers implements Handler { + GuardAgainstOid { + @Override public boolean isHandling(final ManagedObject managedObject) { + return managedObject.getPojo() instanceof Oid; + } + @Override + public Optional<Bookmark> handle(final ManagedObject managedObject) { + throw new IllegalArgumentException("Cannot create a Bookmark for pojo, " + + "when pojo is instance of Bookmark. You might want to ask " + + "ObjectAdapterByIdProvider for an ObjectAdapter instead."); + } + }, + BookmarkForBookmarkable { + @Override + public boolean isHandling(final ManagedObject managedObject) { + return managedObject instanceof Bookmarkable; + } + @Override + public Optional<Bookmark> handle(final ManagedObject managedObject) { + return managedObject.getBookmark(); + } + }, + BookmarkForOthers { + @Override + public boolean isHandling(final ManagedObject managedObject) { + return true; // try to handle anything + } + @Override + public Optional<Bookmark> handle(final ManagedObject managedObject) { + return Optional.empty(); + } + }; + } + +} diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/objectmanager/ObjectManager.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/objectmanager/ObjectManager.java index 9e35cd752c..5e66ca88d3 100644 --- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/objectmanager/ObjectManager.java +++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/objectmanager/ObjectManager.java @@ -32,7 +32,6 @@ import org.apache.isis.core.metamodel.context.MetaModelContext; import org.apache.isis.core.metamodel.object.ManagedObject; import org.apache.isis.core.metamodel.objectmanager.create.ObjectCreator; import org.apache.isis.core.metamodel.objectmanager.detach.ObjectDetacher; -import org.apache.isis.core.metamodel.objectmanager.identify.ObjectBookmarker; import org.apache.isis.core.metamodel.objectmanager.load.ObjectLoader; import org.apache.isis.core.metamodel.objectmanager.memento.ObjectMemorizer; import org.apache.isis.core.metamodel.objectmanager.query.ObjectBulkLoader; diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/objectmanager/ObjectManagerDefault.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/objectmanager/ObjectManagerDefault.java index eb8e58db25..29165f0e72 100644 --- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/objectmanager/ObjectManagerDefault.java +++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/objectmanager/ObjectManagerDefault.java @@ -31,7 +31,6 @@ import org.apache.isis.core.metamodel.IsisModuleCoreMetamodel; import org.apache.isis.core.metamodel.context.MetaModelContext; import org.apache.isis.core.metamodel.objectmanager.create.ObjectCreator; import org.apache.isis.core.metamodel.objectmanager.detach.ObjectDetacher; -import org.apache.isis.core.metamodel.objectmanager.identify.ObjectBookmarker; import org.apache.isis.core.metamodel.objectmanager.load.ObjectLoader; import org.apache.isis.core.metamodel.objectmanager.memento.ObjectMemorizer; import org.apache.isis.core.metamodel.objectmanager.query.ObjectBulkLoader; diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/objectmanager/identify/ObjectBookmarker.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/objectmanager/identify/ObjectBookmarker.java deleted file mode 100644 index 125ce1b609..0000000000 --- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/objectmanager/identify/ObjectBookmarker.java +++ /dev/null @@ -1,60 +0,0 @@ -/* - * 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.core.metamodel.objectmanager.identify; - -import java.util.List; -import java.util.Optional; - -import org.apache.isis.applib.services.bookmark.Bookmark; -import org.apache.isis.commons.handler.ChainOfResponsibility; -import org.apache.isis.commons.internal.collections._Lists; -import org.apache.isis.core.metamodel.object.ManagedObject; - -/** - * @since 2.0 - */ -public interface ObjectBookmarker { - - Optional<Bookmark> bookmarkObject(ManagedObject managedObject); - - // -- HANDLER - - public interface Handler extends ChainOfResponsibility.Handler<ManagedObject, Optional<Bookmark>> {} - - // -- FACTORY - - public static ObjectBookmarker createDefault() { - return managedObject -> - ChainOfResponsibility.named( - "ObjectBookmarker", - handlers) - .handle(managedObject); - } - - static final List<Handler> handlers = - _Lists.of( - new ObjectBookmarker_builtinHandlers.GuardAgainstOid(), - new ObjectBookmarker_builtinHandlers.BookmarkForNonScalar(), - new ObjectBookmarker_builtinHandlers.BookmarkForServices(), - new ObjectBookmarker_builtinHandlers.BookmarkForValues(), - new ObjectBookmarker_builtinHandlers.BookmarkForViewModels(), - new ObjectBookmarker_builtinHandlers.BookmarkForEntities(), - new ObjectBookmarker_builtinHandlers.BookmarkForOthers()); - -} diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/objectmanager/identify/ObjectBookmarker_builtinHandlers.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/objectmanager/identify/ObjectBookmarker_builtinHandlers.java deleted file mode 100644 index 491497826e..0000000000 --- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/objectmanager/identify/ObjectBookmarker_builtinHandlers.java +++ /dev/null @@ -1,141 +0,0 @@ -/* - * 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.core.metamodel.objectmanager.identify; - -import java.util.Optional; - -import org.apache.isis.applib.services.bookmark.Bookmark; -import org.apache.isis.applib.services.bookmark.Oid; -import org.apache.isis.commons.internal.assertions._Assert; -import org.apache.isis.core.metamodel.object.ManagedObject; -import org.apache.isis.core.metamodel.object.PackedManagedObject; -import org.apache.isis.core.metamodel.objectmanager.identify.ObjectBookmarker.Handler; - -import lombok.SneakyThrows; -import lombok.val; - -class ObjectBookmarker_builtinHandlers { - - static class GuardAgainstOid implements Handler { - - @Override - public boolean isHandling(final ManagedObject managedObject) { - return managedObject.getPojo() instanceof Oid; - } - - @Override - public Optional<Bookmark> handle(final ManagedObject managedObject) { - throw new IllegalArgumentException("Cannot create a Bookmark for pojo, " - + "when pojo is instance of Bookmark. You might want to ask " - + "ObjectAdapterByIdProvider for an ObjectAdapter instead."); - } - - } - - static class BookmarkForNonScalar implements Handler { - - @Override - public boolean isHandling(final ManagedObject managedObject) { - return managedObject instanceof PackedManagedObject; - } - - @Override - public Optional<Bookmark> handle(final ManagedObject managedObject) { - return Optional.empty(); - } - - } - - static class BookmarkForServices implements Handler { - - @Override - public boolean isHandling(final ManagedObject managedObject) { - return managedObject.getSpecialization().isService(); - } - - @Override - public Optional<Bookmark> handle(final ManagedObject managedObject) { - return managedObject.getBookmark(); - } - } - - static class BookmarkForEntities implements Handler { - - @Override - public boolean isHandling(final ManagedObject managedObject) { - return managedObject.getSpecialization().isEntity(); - } - - @Override - public Optional<Bookmark> handle(final ManagedObject managedObject) { - return managedObject.getBookmark(); // could be empty that is detached or transient - } - - } - - static class BookmarkForValues implements Handler { - - @Override - public boolean isHandling(final ManagedObject managedObject) { - return managedObject.getSpecialization().isValue(); - } - - @SneakyThrows - @Override - public Optional<Bookmark> handle(final ManagedObject managedObject) { - _Assert.assertTrue(managedObject.isBookmarkSupported(), ()->"is bookmarkable"); - return managedObject.getBookmark(); - } - - } - - static class BookmarkForViewModels implements Handler { - - @Override - public boolean isHandling(final ManagedObject managedObject) { - return managedObject.getSpecialization().isViewmodel(); - } - - @Override - public Optional<Bookmark> handle(final ManagedObject managedObject) { - - if(managedObject.isBookmarkMemoized()) { - return managedObject.getBookmark(); - } - - val spec = managedObject.getSpecification(); - return Optional.ofNullable(spec.viewmodelFacetElseFail().serializeToBookmark(managedObject)); - } - - } - - static class BookmarkForOthers implements Handler { - - @Override - public boolean isHandling(final ManagedObject managedObject) { - return true; // try to handle anything - } - - @Override - public Optional<Bookmark> handle(final ManagedObject managedObject) { - return Optional.empty(); - } - } - -}