You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@isis.apache.org by ah...@apache.org on 2020/04/26 05:48:05 UTC

[isis] branch master updated: ISIS-2340: share logic of ObjectAdapterAccessHelper/UpdateHelper (9)

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 189f4ca  ISIS-2340: share logic of ObjectAdapterAccessHelper/UpdateHelper (9)
189f4ca is described below

commit 189f4ca683dcdeef825413fbd1d1f686f93a891a
Author: Andi Huber <ah...@apache.org>
AuthorDate: Sun Apr 26 07:47:49 2020 +0200

    ISIS-2340: share logic of ObjectAdapterAccessHelper/UpdateHelper (9)
---
 ...ollectionHandle.java => ActionInteraction.java} | 23 +++++++--
 ...ctionHandle.java => CollectionInteraction.java} | 21 +++++++-
 .../spec/interaction/InteractionVeto.java          | 14 +++++-
 .../metamodel/spec/interaction/ManagedAction.java  | 16 ------
 .../spec/interaction/ManagedCollection.java        | 15 ------
 .../metamodel/spec/interaction/ManagedMember.java  |  8 ---
 .../spec/interaction/ManagedProperty.java          | 15 ------
 .../{MemberHandle.java => MemberInteraction.java}  | 25 +++++++++-
 ...ropertyHandle.java => PropertyInteraction.java} | 20 ++++++--
 .../ui/components/object/ObjectFormView.java       | 11 ++--
 .../resources/DomainObjectResourceServerside.java  | 12 ++---
 .../viewer/resources/DomainResourceHelper.java     |  2 +-
 .../resources/ObjectAdapterAccessHelper.java       | 58 +++++++---------------
 13 files changed, 122 insertions(+), 118 deletions(-)

diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/interaction/CollectionHandle.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/interaction/ActionInteraction.java
similarity index 63%
rename from core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/interaction/CollectionHandle.java
rename to core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/interaction/ActionInteraction.java
index c08f041..4567ae2 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/interaction/CollectionHandle.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/interaction/ActionInteraction.java
@@ -19,15 +19,33 @@
 package org.apache.isis.core.metamodel.spec.interaction;
 
 import org.apache.isis.core.commons.internal.base._Either;
+import org.apache.isis.core.metamodel.spec.ManagedObject;
+import org.apache.isis.core.metamodel.spec.interaction.ManagedMember.MemberType;
 
 import lombok.NonNull;
+import lombok.val;
 
-public final class CollectionHandle extends MemberHandle<ManagedCollection, CollectionHandle> {
+public final class ActionInteraction extends MemberInteraction<ManagedAction, ActionInteraction> {
 
-    CollectionHandle(@NonNull _Either<ManagedCollection, InteractionVeto> chain) {
+    public static final ActionInteraction start(
+            @NonNull final ManagedObject owner,
+            @NonNull final String memberId) {
+    
+        val managedAction = ManagedAction.lookupAction(owner, memberId);
+        
+        final _Either<ManagedAction, InteractionVeto> chain = managedAction.isPresent()
+                ? _Either.left(managedAction.get())
+                : _Either.right(InteractionVeto.notFound(MemberType.ACTION, memberId));
+                
+        return new ActionInteraction(chain);
+    }
+    
+    ActionInteraction(@NonNull _Either<ManagedAction, InteractionVeto> chain) {
         super(chain);
     }
 
+
+
 //    public PropertyHandle modifyProperty(
 //            @NonNull final Function<ManagedProperty, ManagedObject> newProperyValueProvider) {
 //
@@ -42,4 +60,3 @@ public final class CollectionHandle extends MemberHandle<ManagedCollection, Coll
 
     
 }
-
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/interaction/ActionHandle.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/interaction/CollectionInteraction.java
similarity index 61%
rename from core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/interaction/ActionHandle.java
rename to core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/interaction/CollectionInteraction.java
index 7f71884..8b84f98 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/interaction/ActionHandle.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/interaction/CollectionInteraction.java
@@ -19,12 +19,28 @@
 package org.apache.isis.core.metamodel.spec.interaction;
 
 import org.apache.isis.core.commons.internal.base._Either;
+import org.apache.isis.core.metamodel.spec.ManagedObject;
+import org.apache.isis.core.metamodel.spec.interaction.ManagedMember.MemberType;
 
 import lombok.NonNull;
+import lombok.val;
 
-public final class ActionHandle extends MemberHandle<ManagedAction, ActionHandle> {
+public final class CollectionInteraction extends MemberInteraction<ManagedCollection, CollectionInteraction> {
 
-    ActionHandle(@NonNull _Either<ManagedAction, InteractionVeto> chain) {
+    public static final CollectionInteraction start(
+            @NonNull final ManagedObject owner,
+            @NonNull final String memberId) {
+    
+        val managedCollection = ManagedCollection.lookupCollection(owner, memberId);
+        
+        final _Either<ManagedCollection, InteractionVeto> chain = managedCollection.isPresent()
+                ? _Either.left(managedCollection.get())
+                : _Either.right(InteractionVeto.notFound(MemberType.COLLECTION, memberId));
+                
+        return new CollectionInteraction(chain);
+    }
+    
+    CollectionInteraction(@NonNull _Either<ManagedCollection, InteractionVeto> chain) {
         super(chain);
     }
 
@@ -42,3 +58,4 @@ public final class ActionHandle extends MemberHandle<ManagedAction, ActionHandle
 
     
 }
+
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/interaction/InteractionVeto.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/interaction/InteractionVeto.java
index 61e4e88..17475f8 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/interaction/InteractionVeto.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/interaction/InteractionVeto.java
@@ -20,12 +20,17 @@ package org.apache.isis.core.metamodel.spec.interaction;
 
 import java.io.Serializable;
 
+import javax.annotation.Nullable;
+
 import org.apache.isis.core.metamodel.consent.Consent;
+import org.apache.isis.core.metamodel.consent.Veto;
+import org.apache.isis.core.metamodel.spec.interaction.ManagedMember.MemberType;
 
 import lombok.AccessLevel;
 import lombok.Getter;
 import lombok.NonNull;
 import lombok.RequiredArgsConstructor;
+import lombok.val;
 
 @Getter
 @RequiredArgsConstructor(staticName = "of", access = AccessLevel.PRIVATE)
@@ -43,8 +48,13 @@ public class InteractionVeto implements Serializable {
     @NonNull private final VetoType vetoType;
     @NonNull private final Consent vetoConsent;
     
-    public static InteractionVeto notFound(@NonNull Consent vetoConsent) {
-        return of(VetoType.NOT_FOUND, vetoConsent);
+    public static InteractionVeto notFound(
+            @NonNull MemberType memberType, 
+            @Nullable String memberId) {
+        val reason = String.format("%s '%s' either does not exist, is disabled or is not visible", 
+                "" + memberId, 
+                memberType.name().toLowerCase());
+        return of(VetoType.NOT_FOUND, new Veto(reason));
     }
     
     public static InteractionVeto hidden(@NonNull Consent vetoConsent) {
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/interaction/ManagedAction.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/interaction/ManagedAction.java
index 2e88681..f978a5f 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/interaction/ManagedAction.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/interaction/ManagedAction.java
@@ -20,14 +20,11 @@ package org.apache.isis.core.metamodel.spec.interaction;
 
 import java.util.Optional;
 
-import org.apache.isis.core.commons.internal.base._Either;
-import org.apache.isis.core.metamodel.consent.Veto;
 import org.apache.isis.core.metamodel.spec.ManagedObject;
 import org.apache.isis.core.metamodel.spec.feature.ObjectAction;
 
 import lombok.Getter;
 import lombok.NonNull;
-import lombok.val;
 
 public final class ManagedAction extends ManagedMember {
 
@@ -41,19 +38,6 @@ public final class ManagedAction extends ManagedMember {
         .map(objectAction -> new ManagedAction(owner, objectAction));
     }
     
-    public static final ActionHandle getActionHandle(
-            @NonNull final ManagedObject owner,
-            @NonNull final String memberId) {
-    
-        val managedAction = ManagedAction.lookupAction(owner, memberId);
-        
-        final _Either<ManagedAction, InteractionVeto> chain = managedAction.isPresent()
-                ? _Either.left(managedAction.get())
-                : _Either.right(InteractionVeto.notFound(new Veto(notFound(MemberType.ACTION, memberId))));
-                
-        return new ActionHandle(chain);
-    }
-
     // -- IMPLEMENTATION
     
     @Getter private final ObjectAction action;
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/interaction/ManagedCollection.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/interaction/ManagedCollection.java
index e51b322..c2bbf6f 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/interaction/ManagedCollection.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/interaction/ManagedCollection.java
@@ -20,8 +20,6 @@ package org.apache.isis.core.metamodel.spec.interaction;
 
 import java.util.Optional;
 
-import org.apache.isis.core.commons.internal.base._Either;
-import org.apache.isis.core.metamodel.consent.Veto;
 import org.apache.isis.core.metamodel.spec.ManagedObject;
 import org.apache.isis.core.metamodel.spec.feature.OneToManyAssociation;
 
@@ -41,19 +39,6 @@ public final class ManagedCollection extends ManagedMember {
         .map(objectAction -> new ManagedCollection(owner, objectAction));
     }
     
-    public static final CollectionHandle getCollectionHandle(
-            @NonNull final ManagedObject owner,
-            @NonNull final String memberId) {
-    
-        val managedCollection = ManagedCollection.lookupCollection(owner, memberId);
-        
-        final _Either<ManagedCollection, InteractionVeto> chain = managedCollection.isPresent()
-                ? _Either.left(managedCollection.get())
-                : _Either.right(InteractionVeto.notFound(new Veto(notFound(MemberType.COLLECTION, memberId))));
-                
-        return new CollectionHandle(chain);
-    }
-    
     // -- IMPLEMENTATION
     
     @Getter private final OneToManyAssociation collection;
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/interaction/ManagedMember.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/interaction/ManagedMember.java
index f9dc991..e9b77ce 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/interaction/ManagedMember.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/interaction/ManagedMember.java
@@ -119,12 +119,4 @@ public abstract class ManagedMember {
         return memberType.lookup(owner, memberId);
     }
     
-    protected static <T extends ObjectMember> String notFound(
-            MemberType memberType, 
-            String memberId) {
-        return String.format("%s '%s' either does not exist, is disabled or is not visible", 
-                        memberId, 
-                        memberType.name().toLowerCase());
-    }
-    
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/interaction/ManagedProperty.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/interaction/ManagedProperty.java
index 6471f4b..20c188a 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/interaction/ManagedProperty.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/interaction/ManagedProperty.java
@@ -22,9 +22,7 @@ import java.util.Optional;
 
 import javax.annotation.Nullable;
 
-import org.apache.isis.core.commons.internal.base._Either;
 import org.apache.isis.core.metamodel.consent.InteractionInitiatedBy;
-import org.apache.isis.core.metamodel.consent.Veto;
 import org.apache.isis.core.metamodel.spec.ManagedObject;
 import org.apache.isis.core.metamodel.spec.feature.OneToOneAssociation;
 
@@ -44,19 +42,6 @@ public final class ManagedProperty extends ManagedMember {
         .map(objectAction -> new ManagedProperty(owner, objectAction));
     }
     
-    public static final PropertyHandle getPropertyHandle(
-            @NonNull final ManagedObject owner,
-            @NonNull final String memberId) {
-    
-        val managedProperty = ManagedProperty.lookupProperty(owner, memberId);
-        
-        final _Either<ManagedProperty, InteractionVeto> chain = managedProperty.isPresent()
-                ? _Either.left(managedProperty.get())
-                : _Either.right(InteractionVeto.notFound(new Veto(notFound(MemberType.PROPERTY, memberId))));
-                
-        return new PropertyHandle(chain);
-    }
-    
     // -- IMPLEMENTATION
     
     @Getter private final OneToOneAssociation property;
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/interaction/MemberHandle.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/interaction/MemberInteraction.java
similarity index 78%
rename from core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/interaction/MemberHandle.java
rename to core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/interaction/MemberInteraction.java
index c3d6594..242a614 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/interaction/MemberHandle.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/interaction/MemberInteraction.java
@@ -29,11 +29,19 @@ import org.apache.isis.core.commons.internal.base._Either;
 import lombok.NonNull;
 import lombok.val;
 
-public abstract class MemberHandle<T extends ManagedMember, H extends MemberHandle<T, ?>> {
+public abstract class MemberInteraction<T extends ManagedMember, H extends MemberInteraction<T, ?>> {
 
+    public static enum AccessIntent {
+        ACCESS, MUTATE;
+
+        public boolean isMutate() {
+            return this == MUTATE;
+        }
+    }
+    
     @NonNull protected _Either<T, InteractionVeto> chain;
 
-    protected MemberHandle(@NonNull _Either<T, InteractionVeto> chain) {
+    protected MemberInteraction(@NonNull _Either<T, InteractionVeto> chain) {
         this.chain = chain;
     }
     
@@ -57,6 +65,19 @@ public abstract class MemberHandle<T extends ManagedMember, H extends MemberHand
         return _Casts.uncheckedCast(this);
     }
     
+    /**
+     * Only check usability if intent is {@code MUTATE}. 
+     * @param where
+     * @param intent
+     * @return self
+     */
+    public H checkUsability(@NonNull final Where where, @NonNull final AccessIntent intent) {
+        if(intent.isMutate()) {
+            return checkUsability(where);
+        }
+        return _Casts.uncheckedCast(this);
+    }
+    
     @Deprecated
     public H peekOnFailure(Consumer<InteractionVeto> onFailure) {
         chain.right().ifPresent(onFailure);
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/interaction/PropertyHandle.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/interaction/PropertyInteraction.java
similarity index 63%
rename from core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/interaction/PropertyHandle.java
rename to core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/interaction/PropertyInteraction.java
index c77e1e1..c9d2548 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/interaction/PropertyHandle.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/interaction/PropertyInteraction.java
@@ -22,17 +22,31 @@ import java.util.function.Function;
 
 import org.apache.isis.core.commons.internal.base._Either;
 import org.apache.isis.core.metamodel.spec.ManagedObject;
+import org.apache.isis.core.metamodel.spec.interaction.ManagedMember.MemberType;
 
 import lombok.NonNull;
 import lombok.val;
 
-public final class PropertyHandle extends MemberHandle<ManagedProperty, PropertyHandle> {
+public final class PropertyInteraction extends MemberInteraction<ManagedProperty, PropertyInteraction> {
 
-    PropertyHandle(@NonNull _Either<ManagedProperty, InteractionVeto> chain) {
+    public static final PropertyInteraction start(
+            @NonNull final ManagedObject owner,
+            @NonNull final String memberId) {
+    
+        val managedProperty = ManagedProperty.lookupProperty(owner, memberId);
+        
+        final _Either<ManagedProperty, InteractionVeto> chain = managedProperty.isPresent()
+                ? _Either.left(managedProperty.get())
+                : _Either.right(InteractionVeto.notFound(MemberType.PROPERTY, memberId));
+                
+        return new PropertyInteraction(chain);
+    }
+    
+    PropertyInteraction(@NonNull _Either<ManagedProperty, InteractionVeto> chain) {
         super(chain);
     }
 
-    public PropertyHandle modifyProperty(
+    public PropertyInteraction modifyProperty(
             @NonNull final Function<ManagedProperty, ManagedObject> newProperyValueProvider) {
 
         chain = chain.leftRemap(property->{
diff --git a/incubator/viewers/vaadin/ui/src/main/java/org/apache/isis/incubator/viewer/vaadin/ui/components/object/ObjectFormView.java b/incubator/viewers/vaadin/ui/src/main/java/org/apache/isis/incubator/viewer/vaadin/ui/components/object/ObjectFormView.java
index 3e6b8d0..660cdce 100644
--- a/incubator/viewers/vaadin/ui/src/main/java/org/apache/isis/incubator/viewer/vaadin/ui/components/object/ObjectFormView.java
+++ b/incubator/viewers/vaadin/ui/src/main/java/org/apache/isis/incubator/viewer/vaadin/ui/components/object/ObjectFormView.java
@@ -47,9 +47,10 @@ import org.apache.isis.applib.layout.grid.bootstrap3.BS3Row;
 import org.apache.isis.applib.layout.grid.bootstrap3.BS3Tab;
 import org.apache.isis.applib.layout.grid.bootstrap3.BS3TabGroup;
 import org.apache.isis.core.metamodel.spec.ManagedObject;
-import org.apache.isis.core.metamodel.spec.interaction.ManagedAction;
+import org.apache.isis.core.metamodel.spec.interaction.ActionInteraction;
+import org.apache.isis.core.metamodel.spec.interaction.CollectionInteraction;
 import org.apache.isis.core.metamodel.spec.interaction.ManagedCollection;
-import org.apache.isis.core.metamodel.spec.interaction.ManagedProperty;
+import org.apache.isis.core.metamodel.spec.interaction.PropertyInteraction;
 import org.apache.isis.incubator.viewer.vaadin.ui.components.UiComponentFactoryVaa;
 import org.apache.isis.incubator.viewer.vaadin.ui.components.collection.TableView;
 import org.apache.isis.viewer.common.model.binding.UiComponentFactory;
@@ -173,7 +174,7 @@ public class ObjectFormView extends VerticalLayout {
             protected void onAction(HasComponents container, ActionLayoutData actionData) {
                 
                 val owner = objectInteractor.getManagedObject();
-                ManagedAction.getActionHandle(owner, actionData.getId())
+                ActionInteraction.start(owner, actionData.getId())
                 .checkVisibility(Where.OBJECT_FORMS)
                 .get()
                 .ifPresent(managedAction -> {
@@ -191,7 +192,7 @@ public class ObjectFormView extends VerticalLayout {
                 
                 val owner = objectInteractor.getManagedObject();
                 
-                ManagedProperty.getPropertyHandle(owner, propertyData.getId())
+                PropertyInteraction.start(owner, propertyData.getId())
                 .checkVisibility(Where.OBJECT_FORMS)
                 .get()
                 .ifPresent(managedProperty -> {
@@ -206,7 +207,7 @@ public class ObjectFormView extends VerticalLayout {
                 
                 val owner = objectInteractor.getManagedObject();
                 
-                ManagedCollection.getCollectionHandle(owner, collectionData.getId())
+                CollectionInteraction.start(owner, collectionData.getId())
                 .checkVisibility(Where.OBJECT_FORMS)
                 .get()
                 .ifPresent(managedCollection -> {
diff --git a/viewers/restfulobjects/viewer/src/main/java/org/apache/isis/viewer/restfulobjects/viewer/resources/DomainObjectResourceServerside.java b/viewers/restfulobjects/viewer/src/main/java/org/apache/isis/viewer/restfulobjects/viewer/resources/DomainObjectResourceServerside.java
index eaa94c3..c92ec0a 100644
--- a/viewers/restfulobjects/viewer/src/main/java/org/apache/isis/viewer/restfulobjects/viewer/resources/DomainObjectResourceServerside.java
+++ b/viewers/restfulobjects/viewer/src/main/java/org/apache/isis/viewer/restfulobjects/viewer/resources/DomainObjectResourceServerside.java
@@ -59,7 +59,8 @@ import org.apache.isis.core.metamodel.spec.ManagedObject;
 import org.apache.isis.core.metamodel.spec.ObjectSpecId;
 import org.apache.isis.core.metamodel.spec.ObjectSpecification;
 import org.apache.isis.core.metamodel.spec.feature.OneToManyAssociation;
-import org.apache.isis.core.metamodel.spec.interaction.ManagedProperty;
+import org.apache.isis.core.metamodel.spec.interaction.MemberInteraction.AccessIntent;
+import org.apache.isis.core.metamodel.spec.interaction.PropertyInteraction;
 import org.apache.isis.core.runtime.iactn.IsisInteractionTracker;
 import org.apache.isis.viewer.restfulobjects.applib.JsonRepresentation;
 import org.apache.isis.viewer.restfulobjects.applib.Rel;
@@ -74,7 +75,6 @@ import org.apache.isis.viewer.restfulobjects.rendering.domainobjects.MemberReprM
 import org.apache.isis.viewer.restfulobjects.rendering.service.RepresentationService;
 import org.apache.isis.viewer.restfulobjects.rendering.util.Util;
 import org.apache.isis.viewer.restfulobjects.viewer.context.ResourceContext;
-import org.apache.isis.viewer.restfulobjects.viewer.resources.ObjectAdapterAccessHelper.AccessIntent;
 
 import lombok.val;
 import lombok.extern.log4j.Log4j2;
@@ -452,9 +452,9 @@ public class DomainObjectResourceServerside extends ResourceAbstract implements
 
         val objectAdapter = getObjectAdapterElseThrowNotFound(domainType, instanceId);
         
-        ManagedProperty.getPropertyHandle(objectAdapter, propertyId)
+        PropertyInteraction.start(objectAdapter, propertyId)
         .checkVisibility(resourceContext.getWhere())
-        .checkUsability(resourceContext.getWhere()) // only when ObjectBinding.AccessIntent.MUTATE
+        .checkUsability(resourceContext.getWhere(), AccessIntent.MUTATE)
         .modifyProperty(property->{
             val proposedNewValue = new JsonParserHelper(resourceContext, property.getSpecification())
                     .parseAsMapWithSingleValue(Util.asStringUtf8(body));
@@ -487,9 +487,9 @@ public class DomainObjectResourceServerside extends ResourceAbstract implements
         
         val objectAdapter = getObjectAdapterElseThrowNotFound(domainType, instanceId);
         
-        ManagedProperty.getPropertyHandle(objectAdapter, propertyId)
+        PropertyInteraction.start(objectAdapter, propertyId)
         .checkVisibility(resourceContext.getWhere())
-        .checkUsability(resourceContext.getWhere()) // only when ObjectBinding.AccessIntent.MUTATE
+        .checkUsability(resourceContext.getWhere(), AccessIntent.MUTATE)
         .modifyProperty(property->null)
         .getOrElseThrow(InteractionFailureHandler::onFailure);
 
diff --git a/viewers/restfulobjects/viewer/src/main/java/org/apache/isis/viewer/restfulobjects/viewer/resources/DomainResourceHelper.java b/viewers/restfulobjects/viewer/src/main/java/org/apache/isis/viewer/restfulobjects/viewer/resources/DomainResourceHelper.java
index 9315f65..9c00672 100644
--- a/viewers/restfulobjects/viewer/src/main/java/org/apache/isis/viewer/restfulobjects/viewer/resources/DomainResourceHelper.java
+++ b/viewers/restfulobjects/viewer/src/main/java/org/apache/isis/viewer/restfulobjects/viewer/resources/DomainResourceHelper.java
@@ -27,6 +27,7 @@ import org.apache.isis.core.metamodel.spec.ManagedObject;
 import org.apache.isis.core.metamodel.spec.feature.ObjectAction;
 import org.apache.isis.core.metamodel.spec.feature.OneToManyAssociation;
 import org.apache.isis.core.metamodel.spec.feature.OneToOneAssociation;
+import org.apache.isis.core.metamodel.spec.interaction.MemberInteraction.AccessIntent;
 import org.apache.isis.viewer.restfulobjects.applib.JsonRepresentation;
 import org.apache.isis.viewer.restfulobjects.applib.RestfulResponse;
 import org.apache.isis.viewer.restfulobjects.rendering.IResourceContext;
@@ -42,7 +43,6 @@ import org.apache.isis.viewer.restfulobjects.rendering.domainobjects.ObjectAndCo
 import org.apache.isis.viewer.restfulobjects.rendering.domainobjects.ObjectAndProperty2;
 import org.apache.isis.viewer.restfulobjects.rendering.service.RepresentationService;
 import org.apache.isis.viewer.restfulobjects.viewer.context.ResourceContext;
-import org.apache.isis.viewer.restfulobjects.viewer.resources.ObjectAdapterAccessHelper.AccessIntent;
 
 import lombok.val;
 
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 0bdf621..118fead 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
@@ -23,13 +23,13 @@ import org.apache.isis.core.metamodel.spec.ManagedObject;
 import org.apache.isis.core.metamodel.spec.feature.ObjectAction;
 import org.apache.isis.core.metamodel.spec.feature.OneToManyAssociation;
 import org.apache.isis.core.metamodel.spec.feature.OneToOneAssociation;
-import org.apache.isis.core.metamodel.spec.interaction.ManagedAction;
-import org.apache.isis.core.metamodel.spec.interaction.ManagedCollection;
-import org.apache.isis.core.metamodel.spec.interaction.ManagedProperty;
+import org.apache.isis.core.metamodel.spec.interaction.ActionInteraction;
+import org.apache.isis.core.metamodel.spec.interaction.CollectionInteraction;
+import org.apache.isis.core.metamodel.spec.interaction.MemberInteraction.AccessIntent;
+import org.apache.isis.core.metamodel.spec.interaction.PropertyInteraction;
 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
@@ -38,14 +38,6 @@ import lombok.val;
 @RequiredArgsConstructor
 public class ObjectAdapterAccessHelper {
     
-    public static enum AccessIntent {
-        ACCESS, MUTATE;
-
-        public boolean isMutate() {
-            return this == MUTATE;
-        }
-    }
-
     public static ObjectAdapterAccessHelper of(
             final IResourceContext resourceContext,
             final ManagedObject managedObject) {
@@ -60,15 +52,10 @@ public class ObjectAdapterAccessHelper {
     public ObjectAction getObjectActionThatIsVisibleForIntent(
             final String actionId, final AccessIntent intent) {
         
-        val actionHandle = ManagedAction
-                .getActionHandle(managedObject, actionId)
-                .checkVisibility(where);
-        
-        if(intent.isMutate()) {
-            actionHandle.checkUsability(where);
-        }
-        
-        return actionHandle
+        return ActionInteraction
+                .start(managedObject, actionId)
+                .checkVisibility(where)
+                .checkUsability(where, intent)
                 .getOrElseThrow(InteractionFailureHandler::onFailure)
                 .getAction();
     }
@@ -76,15 +63,10 @@ public class ObjectAdapterAccessHelper {
     public OneToOneAssociation getPropertyThatIsVisibleForIntent(
             final String propertyId, final AccessIntent intent) {
         
-        val propertyHandle = ManagedProperty
-                .getPropertyHandle(managedObject, propertyId)
-                .checkVisibility(where);
-        
-        if(intent.isMutate()) {
-            propertyHandle.checkUsability(where);
-        }
-        
-        return propertyHandle
+        return PropertyInteraction
+                .start(managedObject, propertyId)
+                .checkVisibility(where)
+                .checkUsability(where, intent)
                 .getOrElseThrow(InteractionFailureHandler::onFailure)
                 .getProperty();
         
@@ -92,18 +74,14 @@ public class ObjectAdapterAccessHelper {
 
     public OneToManyAssociation getCollectionThatIsVisibleForIntent(
             final String collectionId, final AccessIntent intent) {
-        
-        val collectionHandle = ManagedCollection
-                .getCollectionHandle(managedObject, collectionId)
-                .checkVisibility(where);
-        
-        if(intent.isMutate()) {
-            collectionHandle.checkUsability(where);
-        }
-        
-        return collectionHandle
+
+        return CollectionInteraction
+                .start(managedObject, collectionId)
+                .checkVisibility(where)
+                .checkUsability(where, intent)
                 .getOrElseThrow(InteractionFailureHandler::onFailure)
                 .getCollection();
+
     }