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 be42626a97 ISIS-3199: refactor built-in ObjectBulkLoader Handlers into static list be42626a97 is described below commit be42626a9747784b21dca8de54750c21588f3048 Author: Andi Huber <ahu...@apache.org> AuthorDate: Mon Sep 5 17:04:00 2022 +0200 ISIS-3199: refactor built-in ObjectBulkLoader Handlers into static list --- .../choices/ChoicesFacetFromBoundedAbstract.java | 2 +- .../metamodel/objectmanager/ObjectBulkLoader.java | 121 ++++++++++++++++++++ .../metamodel/objectmanager/ObjectManager.java | 3 +- .../objectmanager/ObjectManagerDefault.java | 1 - .../objectmanager/query/ObjectBulkLoader.java | 68 ----------- .../query/ObjectBulkLoader_builtinHandlers.java | 125 --------------------- .../repository/RepositoryServiceDefault.java | 2 +- 7 files changed, 125 insertions(+), 197 deletions(-) diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/choices/ChoicesFacetFromBoundedAbstract.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/choices/ChoicesFacetFromBoundedAbstract.java index d9af48b5f3..33ec39a2b0 100644 --- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/choices/ChoicesFacetFromBoundedAbstract.java +++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/choices/ChoicesFacetFromBoundedAbstract.java @@ -32,7 +32,7 @@ import org.apache.isis.core.metamodel.interactions.ValidatingInteractionAdvisor; import org.apache.isis.core.metamodel.interactions.ValidityContext; import org.apache.isis.core.metamodel.object.ManagedObject; import org.apache.isis.core.metamodel.object.MmVisibilityUtil; -import org.apache.isis.core.metamodel.objectmanager.query.ObjectBulkLoader; +import org.apache.isis.core.metamodel.objectmanager.ObjectBulkLoader; import org.apache.isis.core.metamodel.spec.ObjectSpecification; import lombok.SneakyThrows; diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/objectmanager/ObjectBulkLoader.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/objectmanager/ObjectBulkLoader.java new file mode 100644 index 0000000000..74d3f913ef --- /dev/null +++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/objectmanager/ObjectBulkLoader.java @@ -0,0 +1,121 @@ +/* + * 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 org.apache.isis.applib.query.Query; +import org.apache.isis.commons.collections.Can; +import org.apache.isis.commons.handler.ChainOfResponsibility; +import org.apache.isis.commons.internal.exceptions._Exceptions; +import org.apache.isis.core.metamodel.context.MetaModelContext; +import org.apache.isis.core.metamodel.object.ManagedObject; +import org.apache.isis.core.metamodel.spec.ObjectSpecification; + +import lombok.Value; +import lombok.val; + +/** + * @since 2.0 + */ +public interface ObjectBulkLoader { + + Can<ManagedObject> loadObject(Request objectQuery); + + // -- REQUEST (VALUE) TYPE + + @Value(staticConstructor = "of") + public static class Request { + ObjectSpecification objectSpecification; + Query<?> query; + } + + // -- HANDLER + + static interface Handler + extends + ChainOfResponsibility.Handler<ObjectBulkLoader.Request, Can<ManagedObject>> { + } + + // -- FACTORY + + public static ObjectBulkLoader createDefault(final MetaModelContext mmc) { + return request -> + ChainOfResponsibility.named( + "ObjectBulkLoader", + handlers) + .handle(request); + } + + // -- HANDLERS + + static final List<Handler> handlers = List.of(BuiltinHandlers.values()); + + enum BuiltinHandlers implements Handler { + GuardAgainstNull { + @Override + public boolean isHandling(final ObjectBulkLoader.Request objectQuery) { + if(objectQuery==null) { + return true; + } + val spec = objectQuery.getObjectSpecification(); + if(spec == null) { + // eg "NONEXISTENT:123" + return true; + } + // we don't guard against the identifier being null, because, this is ok + // for services and values + return false; + } + @Override + public Can<ManagedObject> handle(final ObjectBulkLoader.Request objectQuery) { + return Can.empty(); + } + }, + BulkLoadEntity { + @Override + public boolean isHandling(final ObjectBulkLoader.Request objectQuery) { + val spec = objectQuery.getObjectSpecification(); + return spec.isEntity(); + } + @Override + public Can<ManagedObject> handle(final ObjectBulkLoader.Request objectQuery) { + val spec = objectQuery.getObjectSpecification(); + val entityFacet = spec.entityFacetElseFail(); + val entities = entityFacet.fetchByQuery(objectQuery.getQuery()); + return entities; + } + }, + LoadOther { + @Override + public boolean isHandling(final ObjectBulkLoader.Request objectQuery) { + return true; // the last handler in the chain + } + + @Override + public Can<ManagedObject> handle(final ObjectBulkLoader.Request objectQuery) { + // unknown object load request + throw _Exceptions.illegalArgument( + "unknown bulk object load request, loader: %s loading ObjectSpecification %s", + this.getClass().getName(), objectQuery.getObjectSpecification()); + } + } + } + +} 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 b682900b55..d0ef9e9764 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.HasMetaModelContext; import org.apache.isis.core.metamodel.object.ManagedObject; import org.apache.isis.core.metamodel.object.ProtoObject; import org.apache.isis.core.metamodel.objectmanager.memento.ObjectMemento; -import org.apache.isis.core.metamodel.objectmanager.query.ObjectBulkLoader; import org.apache.isis.core.metamodel.objectmanager.serialize.ObjectSerializer; import org.apache.isis.core.metamodel.spec.ObjectSpecification; @@ -69,7 +68,9 @@ public interface ObjectManager extends HasMetaModelContext { _Exceptions.unrecoverable("failed to create memento for %s", object.getSpecification())); } + //FIXME why not use loadObject(bookmark) instead ManagedObject demementify(final ObjectMemento memento); + //FIXME why not use loadObject(bookmark) instead default ManagedObject demementify(final ObjectSpecification spec, final ObjectMemento memento) { return demementify(memento); } 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 9680b90de7..118c857364 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 @@ -37,7 +37,6 @@ import org.apache.isis.core.metamodel.objectmanager.memento.ObjectMemento; import org.apache.isis.core.metamodel.objectmanager.memento.ObjectMementoCollection; import org.apache.isis.core.metamodel.objectmanager.memento.ObjectMementoForEmpty; import org.apache.isis.core.metamodel.objectmanager.memento.ObjectMementoForScalar; -import org.apache.isis.core.metamodel.objectmanager.query.ObjectBulkLoader; import org.apache.isis.core.metamodel.objectmanager.serialize.ObjectSerializer; import lombok.Getter; diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/objectmanager/query/ObjectBulkLoader.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/objectmanager/query/ObjectBulkLoader.java deleted file mode 100644 index 805dbf7ae9..0000000000 --- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/objectmanager/query/ObjectBulkLoader.java +++ /dev/null @@ -1,68 +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.query; - -import org.apache.isis.applib.query.Query; -import org.apache.isis.commons.collections.Can; -import org.apache.isis.commons.handler.ChainOfResponsibility; -import org.apache.isis.commons.internal.collections._Lists; -import org.apache.isis.core.metamodel.context.HasMetaModelContext; -import org.apache.isis.core.metamodel.context.MetaModelContext; -import org.apache.isis.core.metamodel.object.ManagedObject; -import org.apache.isis.core.metamodel.spec.ObjectSpecification; - -import lombok.Value; - -/** - * @since 2.0 - */ -public interface ObjectBulkLoader { - - Can<ManagedObject> loadObject(Request objectQuery); - - // -- REQUEST (VALUE) TYPE - - @Value(staticConstructor = "of") - public static class Request { - ObjectSpecification objectSpecification; - Query<?> query; - } - - // -- HANDLER - - static interface Handler - extends - HasMetaModelContext, - ChainOfResponsibility.Handler<ObjectBulkLoader.Request, Can<ManagedObject>> { - } - - // -- FACTORY - - public static ObjectBulkLoader createDefault(final MetaModelContext mmc) { - return request -> - ChainOfResponsibility.named( - "ObjectBulkLoader", - _Lists.of( - new ObjectBulkLoader_builtinHandlers.GuardAgainstNull(mmc), - new ObjectBulkLoader_builtinHandlers.BulkLoadEntity(mmc), - new ObjectBulkLoader_builtinHandlers.LoadOther(mmc))) - .handle(request); - } - -} diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/objectmanager/query/ObjectBulkLoader_builtinHandlers.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/objectmanager/query/ObjectBulkLoader_builtinHandlers.java deleted file mode 100644 index e632428813..0000000000 --- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/objectmanager/query/ObjectBulkLoader_builtinHandlers.java +++ /dev/null @@ -1,125 +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.query; - -import org.apache.isis.commons.collections.Can; -import org.apache.isis.commons.internal.exceptions._Exceptions; -import org.apache.isis.core.metamodel.context.MetaModelContext; -import org.apache.isis.core.metamodel.object.ManagedObject; - -import lombok.NonNull; -import lombok.Value; -import lombok.val; - -/** - * - * @since 2.0 - * - */ -final class ObjectBulkLoader_builtinHandlers { - - // -- NULL GUARD - - @Value - public static class GuardAgainstNull implements ObjectBulkLoader.Handler { - - private final @NonNull MetaModelContext metaModelContext; - - @Override - public boolean isHandling(final ObjectBulkLoader.Request objectQuery) { - - if(objectQuery==null) { - return true; - } - - val spec = objectQuery.getObjectSpecification(); - if(spec == null) { - // eg "NONEXISTENT:123" - return true; - } - - // we don't guard against the identifier being null, because, this is ok - // for services and values - return false; - } - - @Override - public Can<ManagedObject> handle(final ObjectBulkLoader.Request objectQuery) { - return Can.empty(); - } - - } - - // -- ENTITIES - - @Value - public static class BulkLoadEntity implements ObjectBulkLoader.Handler { - - private final @NonNull MetaModelContext metaModelContext; - - @Override - public boolean isHandling(final ObjectBulkLoader.Request objectQuery) { - - val spec = objectQuery.getObjectSpecification(); - return spec.isEntity(); - } - - @Override - public Can<ManagedObject> handle(final ObjectBulkLoader.Request objectQuery) { - - val spec = objectQuery.getObjectSpecification(); - val entityFacet = spec.entityFacetElseFail(); - - val entities = entityFacet.fetchByQuery(objectQuery.getQuery()); - val serviceInjector = metaModelContext.getServiceInjector(); - - //TODO injection should have already be done by DataNucleus - //especially since we fixed https://issues.apache.org/jira/browse/ISIS-2845 - entities.map(ManagedObject::getPojo).forEach(serviceInjector::injectServicesInto); - return entities; - } - - } - - // -- UNKNOWN LOAD REQUEST - - @Value - public static class LoadOther implements ObjectBulkLoader.Handler { - - private final @NonNull MetaModelContext metaModelContext; - - @Override - public boolean isHandling(final ObjectBulkLoader.Request objectQuery) { - return true; // the last handler in the chain - } - - @Override - public Can<ManagedObject> handle(final ObjectBulkLoader.Request objectQuery) { - - // unknown object load request - - throw _Exceptions.illegalArgument( - "unknown bulk object load request, loader: %s loading ObjectSpecification %s", - this.getClass().getName(), objectQuery.getObjectSpecification()); - - } - - } - -} diff --git a/core/runtimeservices/src/main/java/org/apache/isis/core/runtimeservices/repository/RepositoryServiceDefault.java b/core/runtimeservices/src/main/java/org/apache/isis/core/runtimeservices/repository/RepositoryServiceDefault.java index 9ad3df3915..319104ad75 100644 --- a/core/runtimeservices/src/main/java/org/apache/isis/core/runtimeservices/repository/RepositoryServiceDefault.java +++ b/core/runtimeservices/src/main/java/org/apache/isis/core/runtimeservices/repository/RepositoryServiceDefault.java @@ -52,7 +52,7 @@ import org.apache.isis.core.metamodel.context.MetaModelContext; import org.apache.isis.core.metamodel.object.ManagedObjects; import org.apache.isis.core.metamodel.object.MmEntityUtil; import org.apache.isis.core.metamodel.object.MmUnwrapUtil; -import org.apache.isis.core.metamodel.objectmanager.query.ObjectBulkLoader; +import org.apache.isis.core.metamodel.objectmanager.ObjectBulkLoader; import org.apache.isis.core.metamodel.spec.ObjectSpecification; import org.apache.isis.core.runtimeservices.IsisModuleCoreRuntimeServices;