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 65d83a500fdd49b9c794837b295427148a915a2d Author: Andi Huber <ahu...@apache.org> AuthorDate: Fri Apr 24 13:47:51 2020 +0200 ISIS-2340: share logic of ObjectAdapterAccessHelper/UpdateHelper (7) --- .../binding/interaction/ActionAccessChain.java | 53 +++++++++++++++++++++ .../binding/interaction/CollectionAccessChain.java | 54 ++++++++++++++++++++++ .../model/binding/interaction/ObjectBinding.java | 35 ++++++++------ .../resources/ObjectAdapterAccessHelper.java | 24 ++++------ 4 files changed, 137 insertions(+), 29 deletions(-) diff --git a/viewers/common/src/main/java/org/apache/isis/viewer/common/model/binding/interaction/ActionAccessChain.java b/viewers/common/src/main/java/org/apache/isis/viewer/common/model/binding/interaction/ActionAccessChain.java new file mode 100644 index 0000000..a082ead --- /dev/null +++ b/viewers/common/src/main/java/org/apache/isis/viewer/common/model/binding/interaction/ActionAccessChain.java @@ -0,0 +1,53 @@ +package org.apache.isis.viewer.common.model.binding.interaction; + +import java.util.function.Consumer; + +import org.apache.isis.core.commons.internal.base._Either; +import org.apache.isis.core.commons.internal.exceptions._Exceptions; +import org.apache.isis.core.metamodel.spec.feature.ObjectAction; + +import lombok.NonNull; +import lombok.RequiredArgsConstructor; + +@RequiredArgsConstructor(staticName = "of") +public class ActionAccessChain { + + @NonNull private _Either<ActionBinding, InteractionResponse> chain; + +// public ActionAccessChain modifyProperty( +// @NonNull final Function<OneToOneAssociation, ManagedObject> newProperyValueProvider) { +// +// chain = chain.leftRemap(propertyBinding->{ +// final InteractionResponse iResponse = propertyBinding.modifyProperty(newProperyValueProvider); +// if(iResponse.isFailure()) { +// _Either.right(iResponse); +// } +// return _Either.left(propertyBinding); +// }); +// +// return this; +// } + + public ActionAccessChain onFailure(Consumer<InteractionResponse> onFailure) { + chain.right().ifPresent(onFailure); + return this; + } + + public ActionBinding getBinding() { + return chain.left() + .orElseThrow(_Exceptions::noSuchElement); + } + + public ObjectAction getAction() { + return chain.left() + .map(ActionBinding::getAction) + .orElseThrow(_Exceptions::noSuchElement); + } + + public ActionAccessChain ifPresent(Consumer<ActionBinding> actionBindingConsumer) { + chain.left().ifPresent(actionBindingConsumer::accept); + return this; + } + + +} diff --git a/viewers/common/src/main/java/org/apache/isis/viewer/common/model/binding/interaction/CollectionAccessChain.java b/viewers/common/src/main/java/org/apache/isis/viewer/common/model/binding/interaction/CollectionAccessChain.java new file mode 100644 index 0000000..e00fff7 --- /dev/null +++ b/viewers/common/src/main/java/org/apache/isis/viewer/common/model/binding/interaction/CollectionAccessChain.java @@ -0,0 +1,54 @@ +package org.apache.isis.viewer.common.model.binding.interaction; + +import java.util.function.Consumer; + +import org.apache.isis.core.commons.internal.base._Either; +import org.apache.isis.core.commons.internal.exceptions._Exceptions; +import org.apache.isis.core.metamodel.spec.feature.OneToManyAssociation; + +import lombok.NonNull; +import lombok.RequiredArgsConstructor; + +@RequiredArgsConstructor(staticName = "of") +public class CollectionAccessChain { + + @NonNull private _Either<CollectionBinding, InteractionResponse> chain; + +// public CollectionAccessChain modifyProperty( +// @NonNull final Function<OneToManyAssociation, ManagedObject> newProperyValueProvider) { +// +// chain = chain.leftRemap(propertyBinding->{ +// final InteractionResponse iResponse = propertyBinding.modifyProperty(newProperyValueProvider); +// if(iResponse.isFailure()) { +// _Either.right(iResponse); +// } +// return _Either.left(propertyBinding); +// }); +// +// return this; +// } + + public CollectionAccessChain onFailure(Consumer<InteractionResponse> onFailure) { + chain.right().ifPresent(onFailure); + return this; + } + + public CollectionBinding getBinding() { + return chain.left() + .orElseThrow(_Exceptions::noSuchElement); + } + + public OneToManyAssociation getCollection() { + return chain.left() + .map(CollectionBinding::getCollection) + .orElseThrow(_Exceptions::noSuchElement); + } + + public CollectionAccessChain ifPresent(Consumer<CollectionBinding> collectionBindingConsumer) { + chain.left().ifPresent(collectionBindingConsumer::accept); + return this; + } + + + +} diff --git a/viewers/common/src/main/java/org/apache/isis/viewer/common/model/binding/interaction/ObjectBinding.java b/viewers/common/src/main/java/org/apache/isis/viewer/common/model/binding/interaction/ObjectBinding.java index d15f67d..64f2a81 100644 --- a/viewers/common/src/main/java/org/apache/isis/viewer/common/model/binding/interaction/ObjectBinding.java +++ b/viewers/common/src/main/java/org/apache/isis/viewer/common/model/binding/interaction/ObjectBinding.java @@ -129,16 +129,18 @@ public class ObjectBinding { /** * @param actionId * @param where - * @return either an editable or readonly ActionBinding, based on visibility and usability + * @return ActionAccessChain with either an editable or readonly ActionBinding, + * based on visibility and usability */ - public _Either<ActionBinding, InteractionResponse> getActionBinding(String actionId, Where where) { - return getActionThatIsVisible(actionId, where) + public ActionAccessChain getActionBinding(String actionId, Where where) { + val either = getActionThatIsVisible(actionId, where) .map( action-> checkUsability(action, where).isSuccess() ? ActionBindingUsable.of(managedObject, action) : ActionBindingReadonly.of(managedObject, action), UnaryOperator.identity()); + return ActionAccessChain.of(either); } /** @@ -146,14 +148,15 @@ public class ObjectBinding { * @param actionId * @param where * @param accessIntent - * @return either an editable or readonly PropertyBinding, based on visibility and accessIntent + * @return ActionAccessChain with either an editable or readonly PropertyBinding, + * based on visibility and accessIntent */ - public _Either<ActionBinding, InteractionResponse> getActionBinding( + public ActionAccessChain getActionBinding( final String actionId, final Where where, final AccessIntent accessIntent) { - return getActionThatIsVisibleForIntent(actionId, where, accessIntent) + val either = getActionThatIsVisibleForIntent(actionId, where, accessIntent) .map( action->{ switch(accessIntent) { @@ -166,7 +169,7 @@ public class ObjectBinding { } }, UnaryOperator.identity()); - + return ActionAccessChain.of(either); } /** @@ -218,16 +221,19 @@ public class ObjectBinding { /** * @param collectionId * @param where - * @return either an editable or readonly CollectionBinding, based on visibility and usability + * @return CollectionAccessChain with either an editable or readonly CollectionBinding, + * based on visibility and usability */ - public _Either<CollectionBinding, InteractionResponse> getCollectionBinding(String collectionId, Where where) { - return getCollectionThatIsVisible(collectionId, where) + public CollectionAccessChain getCollectionBinding(String collectionId, Where where) { + val either = getCollectionThatIsVisible(collectionId, where) .map( coll-> checkUsability(coll, where).isSuccess() ? CollectionBindingEditable.of(managedObject, coll) : CollectionBindingReadonly.of(managedObject, coll), UnaryOperator.identity()); + + return CollectionAccessChain.of(either); } /** @@ -235,14 +241,15 @@ public class ObjectBinding { * @param collectionId * @param where * @param accessIntent - * @return either an editable or readonly CollectionBinding, based on visibility and accessIntent + * @return CollectionAccessChain with either an editable or readonly CollectionBinding, + * based on visibility and accessIntent */ - public _Either<CollectionBinding, InteractionResponse> getCollectionBinding( + public CollectionAccessChain getCollectionBinding( final String collectionId, final Where where, final AccessIntent accessIntent) { - return getCollectionThatIsVisibleForIntent(collectionId, where, accessIntent) + val either = getCollectionThatIsVisibleForIntent(collectionId, where, accessIntent) .map( coll->{ switch(accessIntent) { @@ -255,6 +262,8 @@ public class ObjectBinding { } }, UnaryOperator.identity()); + + return CollectionAccessChain.of(either); } diff --git a/viewers/restfulobjects/viewer/src/main/java/org/apache/isis/viewer/restfulobjects/viewer/resources/ObjectAdapterAccessHelper.java b/viewers/restfulobjects/viewer/src/main/java/org/apache/isis/viewer/restfulobjects/viewer/resources/ObjectAdapterAccessHelper.java index 5d7625e..fee1000 100644 --- a/viewers/restfulobjects/viewer/src/main/java/org/apache/isis/viewer/restfulobjects/viewer/resources/ObjectAdapterAccessHelper.java +++ b/viewers/restfulobjects/viewer/src/main/java/org/apache/isis/viewer/restfulobjects/viewer/resources/ObjectAdapterAccessHelper.java @@ -28,7 +28,6 @@ import org.apache.isis.viewer.common.model.binding.interaction.ObjectBinding.Acc import org.apache.isis.viewer.restfulobjects.rendering.IResourceContext; import lombok.RequiredArgsConstructor; -import lombok.val; /** * Utility class that encapsulates the logic for checking access to the specified @@ -52,31 +51,24 @@ public class ObjectAdapterAccessHelper { final String propertyId, final AccessIntent intent) { return objectInteractor.getPropertyBinding(propertyId, where, intent) - .onFailure(InteractionFailureHandler::onFailure) - .getProperty(); + .onFailure(InteractionFailureHandler::onFailure) + .getProperty(); } public OneToManyAssociation getCollectionThatIsVisibleForIntent( final String collectionId, final AccessIntent intent) { - val collectionBindingOrFailure = objectInteractor.getCollectionBinding(collectionId, where, intent); - - collectionBindingOrFailure.right() - .ifPresent(InteractionFailureHandler::onFailure); - - return collectionBindingOrFailure.leftIfAny().getCollection(); + return objectInteractor.getCollectionBinding(collectionId, where, intent) + .onFailure(InteractionFailureHandler::onFailure) + .getCollection(); } public ObjectAction getObjectActionThatIsVisibleForIntent( final String actionId, final AccessIntent intent) { - val actionBindingOrFailure = objectInteractor.getActionBinding(actionId, where, intent); - - actionBindingOrFailure.right() - .ifPresent(InteractionFailureHandler::onFailure); - - return actionBindingOrFailure.leftIfAny().getAction(); - + return objectInteractor.getActionBinding(actionId, where, intent) + .onFailure(InteractionFailureHandler::onFailure) + .getAction(); }