You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@isis.apache.org by da...@apache.org on 2015/09/03 14:33:10 UTC

[79/87] [abbrv] isis git commit: ISIS-1044: adding interactionInitiatedBy as param to all interactions with metamodel members.

http://git-wip-us.apache.org/repos/asf/isis/blob/d120bf74/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/ObjectSpecification.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/ObjectSpecification.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/ObjectSpecification.java
index e5599f0..c79e957 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/ObjectSpecification.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/ObjectSpecification.java
@@ -30,7 +30,7 @@ import org.apache.isis.applib.profiles.Localization;
 import org.apache.isis.core.commons.authentication.AuthenticationSession;
 import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
 import org.apache.isis.core.metamodel.consent.Consent;
-import org.apache.isis.core.metamodel.consent.InteractionInvocationMethod;
+import org.apache.isis.core.metamodel.consent.InteractionInitiatedBy;
 import org.apache.isis.core.metamodel.consent.InteractionResult;
 import org.apache.isis.core.metamodel.deployment.DeploymentCategory;
 import org.apache.isis.core.metamodel.facets.collections.modify.CollectionFacet;
@@ -218,7 +218,7 @@ public interface ObjectSpecification extends Specification, ObjectActionContaine
      * Create an {@link InteractionContext} representing an attempt to read the
      * object's title.
      */
-    ObjectTitleContext createTitleInteractionContext(AuthenticationSession session, InteractionInvocationMethod invocationMethod, ObjectAdapter targetObjectAdapter);
+    ObjectTitleContext createTitleInteractionContext(AuthenticationSession session, InteractionInitiatedBy invocationMethod, ObjectAdapter targetObjectAdapter);
 
     // //////////////////////////////////////////////////////////////
     // ValidityContext, Validity
@@ -229,19 +229,19 @@ public interface ObjectSpecification extends Specification, ObjectActionContaine
      * object.
      * @param deploymentCategory TODO
      */
-    ObjectValidityContext createValidityInteractionContext(DeploymentCategory deploymentCategory, AuthenticationSession session, InteractionInvocationMethod invocationMethod, ObjectAdapter targetObjectAdapter);
+    ObjectValidityContext createValidityInteractionContext(DeploymentCategory deploymentCategory, AuthenticationSession session, InteractionInitiatedBy invocationMethod, ObjectAdapter targetObjectAdapter);
 
     /**
      * Determines whether the specified object is in a valid state (for example,
      * so can be persisted); represented as a {@link Consent}.
      */
-    Consent isValid(ObjectAdapter adapter);
+    Consent isValid(ObjectAdapter adapter, final InteractionInitiatedBy interactionInitiatedBy);
 
     /**
      * Determines whether the specified object is in a valid state (for example,
      * so can be persisted); represented as a {@link InteractionResult}.
      */
-    InteractionResult isValidResult(ObjectAdapter adapter);
+    InteractionResult isValidResult(ObjectAdapter adapter, final InteractionInitiatedBy interactionInitiatedBy);
 
     // //////////////////////////////////////////////////////////////
     // Facets

http://git-wip-us.apache.org/repos/asf/isis/blob/d120bf74/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/feature/CurrentHolder.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/feature/CurrentHolder.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/feature/CurrentHolder.java
index 3389610..826da6c 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/feature/CurrentHolder.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/feature/CurrentHolder.java
@@ -21,6 +21,7 @@ package org.apache.isis.core.metamodel.spec.feature;
 
 import org.apache.isis.core.commons.authentication.AuthenticationSession;
 import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
+import org.apache.isis.core.metamodel.consent.InteractionInitiatedBy;
 
 /**
  * Mix-in interface for {@link ObjectFeature}s that reference or otherwise
@@ -41,6 +42,6 @@ public interface CurrentHolder {
      * For example, if this is an {@link OneToOneAssociation}, then returns the
      * referenced object.
      */
-    ObjectAdapter get(final ObjectAdapter owner);
+    ObjectAdapter get(final ObjectAdapter owner, final InteractionInitiatedBy interactionInitiatedBy);
 
 }

http://git-wip-us.apache.org/repos/asf/isis/blob/d120bf74/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/feature/MutableCurrentHolder.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/feature/MutableCurrentHolder.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/feature/MutableCurrentHolder.java
index 0487c32..5469854 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/feature/MutableCurrentHolder.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/feature/MutableCurrentHolder.java
@@ -20,6 +20,7 @@
 package org.apache.isis.core.metamodel.spec.feature;
 
 import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
+import org.apache.isis.core.metamodel.consent.InteractionInitiatedBy;
 
 /**
  * Mix-in interface for {@link ObjectAction}s that reference or otherwise
@@ -41,11 +42,13 @@ public interface MutableCurrentHolder extends CurrentHolder {
      * <p>
      * For example, if this is a {@link OneToOneAssociation}, then updates the
      * object referenced .
-     * 
-     * @param owner
+     *  @param owner
      * @param newValue
-     *            - the new value, or <tt>null</tt>
+     * @param interactionInitiatedBy
      */
-    void set(final ObjectAdapter owner, final ObjectAdapter newValue);
+    void set(
+            final ObjectAdapter owner,
+            final ObjectAdapter newValue,
+            final InteractionInitiatedBy interactionInitiatedBy);
 
 }

http://git-wip-us.apache.org/repos/asf/isis/blob/d120bf74/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/feature/ObjectAction.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/feature/ObjectAction.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/feature/ObjectAction.java
index ea308cf..594c8c8 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/feature/ObjectAction.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/feature/ObjectAction.java
@@ -19,12 +19,15 @@ package org.apache.isis.core.metamodel.spec.feature;
 
 import java.util.List;
 
+import com.google.common.base.Functions;
+import com.google.common.base.Predicate;
+import com.google.common.base.Strings;
+import com.google.common.collect.Lists;
+
 import org.apache.isis.applib.Identifier;
 import org.apache.isis.applib.annotation.ActionLayout;
 import org.apache.isis.applib.annotation.ActionSemantics;
 import org.apache.isis.applib.annotation.Bulk;
-import org.apache.isis.core.metamodel.deployment.DeploymentCategory;
-import org.apache.isis.core.metamodel.facets.members.cssclassfa.CssClassFaPosition;
 import org.apache.isis.applib.annotation.Where;
 import org.apache.isis.applib.filter.Filter;
 import org.apache.isis.applib.value.Blob;
@@ -33,7 +36,8 @@ import org.apache.isis.core.commons.authentication.AuthenticationSession;
 import org.apache.isis.core.commons.lang.StringFunctions;
 import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
 import org.apache.isis.core.metamodel.consent.Consent;
-import org.apache.isis.core.metamodel.consent.InteractionInvocationMethod;
+import org.apache.isis.core.metamodel.consent.InteractionInitiatedBy;
+import org.apache.isis.core.metamodel.deployment.DeploymentCategory;
 import org.apache.isis.core.metamodel.facetapi.Facet;
 import org.apache.isis.core.metamodel.facetapi.FacetFilters;
 import org.apache.isis.core.metamodel.facets.actions.bulk.BulkFacet;
@@ -41,19 +45,13 @@ import org.apache.isis.core.metamodel.facets.actions.position.ActionPositionFace
 import org.apache.isis.core.metamodel.facets.all.named.NamedFacet;
 import org.apache.isis.core.metamodel.facets.members.cssclass.CssClassFacet;
 import org.apache.isis.core.metamodel.facets.members.cssclassfa.CssClassFaFacet;
+import org.apache.isis.core.metamodel.facets.members.cssclassfa.CssClassFaPosition;
 import org.apache.isis.core.metamodel.facets.members.order.MemberOrderFacet;
 import org.apache.isis.core.metamodel.facets.object.wizard.WizardFacet;
-import org.apache.isis.core.metamodel.interactions.AccessContext;
-import org.apache.isis.core.metamodel.interactions.ActionInvocationContext;
 import org.apache.isis.core.metamodel.interactions.ValidatingInteractionAdvisor;
 import org.apache.isis.core.metamodel.spec.ActionType;
 import org.apache.isis.core.metamodel.spec.ObjectSpecification;
 
-import com.google.common.base.Functions;
-import com.google.common.base.Predicate;
-import com.google.common.base.Strings;
-import com.google.common.collect.Lists;
-
 public interface ObjectAction extends ObjectMember {
 
     // //////////////////////////////////////////////////////
@@ -106,38 +104,29 @@ public interface ObjectAction extends ObjectMember {
             final ObjectAdapter target,
             final ObjectAdapter[] parameters,
             final AuthenticationSession authenticationSession,
-            final Where where) throws AuthorizationException;
+            final Where where, final InteractionInitiatedBy interactionInitiatedBy) throws AuthorizationException;
 
     /**
      * Invokes the action's method on the target object given the specified set
      * of parameters.
      */
-    ObjectAdapter execute(ObjectAdapter target, ObjectAdapter[] parameters);
+    ObjectAdapter execute(
+            ObjectAdapter target,
+            ObjectAdapter[] parameters,
+            final InteractionInitiatedBy interactionInitiatedBy);
 
     // //////////////////////////////////////////////////////////////////
     // valid
     // //////////////////////////////////////////////////////////////////
 
-/**
-     * Creates an {@link ActionInvocationContext interaction context}
-     * representing an attempt to invoke this action.
-     *
-     * <p>
-     * Typically it is easier to just call
-     * {@link #isProposedArgumentSetValid(ObjectAdapter, ObjectAdapter[])
-     *
-     * @link #isProposedArgumentSetValidResultSet(ObjectAdapter,
-     *       ObjectAdapter[])}; this is provided as API for symmetry with
-     *       interactions (such as {@link AccessContext} accesses) have no
-     *       corresponding vetoing methods.
-     */
-    public ActionInvocationContext createActionInvocationInteractionContext(AuthenticationSession session,
-            InteractionInvocationMethod invocationMethod, ObjectAdapter targetObject, ObjectAdapter[] proposedArguments);
 
     /**
      * Whether the provided argument set is valid, represented as a {@link Consent}.
      */
-    Consent isProposedArgumentSetValid(ObjectAdapter object, ObjectAdapter[] proposedArguments);
+    Consent isProposedArgumentSetValid(
+            ObjectAdapter object,
+            ObjectAdapter[] proposedArguments,
+            final InteractionInitiatedBy interactionInitiatedBy);
 
     // //////////////////////////////////////////////////////
     // Parameters (declarative)
@@ -197,7 +186,7 @@ public interface ObjectAction extends ObjectMember {
     ObjectAdapter[][] getChoices(
             ObjectAdapter target,
             final AuthenticationSession authenticationSession,
-            final DeploymentCategory deploymentCategory);
+            final DeploymentCategory deploymentCategory, final InteractionInitiatedBy interactionInitiatedBy);
 
     // //////////////////////////////////////////////////////
     // Utils
@@ -280,16 +269,21 @@ public interface ObjectAction extends ObjectMember {
         private Predicates() {
         }
 
-        public static Predicate<ObjectAction> dynamicallyVisible(final AuthenticationSession session,
-                final ObjectAdapter target, final Where where) {
+        // UNUSED?
+        public static Predicate<ObjectAction> dynamicallyVisible(
+                final ObjectAdapter target,
+                final InteractionInitiatedBy interactionInitiatedBy,
+                final Where where) {
             return org.apache.isis.applib.filter.Filters
-                    .asPredicate(Filters.dynamicallyVisible(session, target, where));
+                    .asPredicate(Filters.dynamicallyVisible(target, interactionInitiatedBy, where));
         }
 
+        // UNUSED?
         public static Predicate<ObjectAction> withId(final String actionId) {
             return org.apache.isis.applib.filter.Filters.asPredicate(Filters.withId(actionId));
         }
 
+        // UNUSED?
         public static Predicate<ObjectAction> withNoValidationRules() {
             return org.apache.isis.applib.filter.Filters.asPredicate(Filters.withNoValidationRules());
         }
@@ -302,10 +296,12 @@ public interface ObjectAction extends ObjectMember {
             return org.apache.isis.applib.filter.Filters.asPredicate(Filters.bulk());
         }
 
+        // UNUSED?
         public static Predicate<ObjectAction> notBulkOnly() {
             return org.apache.isis.applib.filter.Filters.asPredicate(Filters.notBulkOnly());
         }
 
+        // UNUSED?
         public static Predicate<ObjectAction> memberOrderOf(ObjectAssociation association) {
             return org.apache.isis.applib.filter.Filters.asPredicate(Filters.memberOrderOf(association));
         }
@@ -324,12 +320,14 @@ public interface ObjectAction extends ObjectMember {
          * @deprecated -use {@link com.google.common.base.Predicate equivalent}
          */
         @Deprecated
-        public static Filter<ObjectAction> dynamicallyVisible(final AuthenticationSession session,
-                final ObjectAdapter target, final Where where) {
+        public static Filter<ObjectAction> dynamicallyVisible(
+                final ObjectAdapter target,
+                final InteractionInitiatedBy interactionInitiatedBy,
+                final Where where) {
             return new Filter<ObjectAction>() {
                 @Override
                 public boolean accept(final ObjectAction objectAction) {
-                    final Consent visible = objectAction.isVisible(session, target, where);
+                    final Consent visible = objectAction.isVisible(target, interactionInitiatedBy, where);
                     return visible.isAllowed();
                 }
             };

http://git-wip-us.apache.org/repos/asf/isis/blob/d120bf74/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/feature/ObjectActionParameter.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/feature/ObjectActionParameter.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/feature/ObjectActionParameter.java
index 54a3b8c..6503304 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/feature/ObjectActionParameter.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/feature/ObjectActionParameter.java
@@ -25,7 +25,7 @@ import org.apache.isis.applib.filter.Filter;
 import org.apache.isis.applib.profiles.Localization;
 import org.apache.isis.core.commons.authentication.AuthenticationSession;
 import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
-import org.apache.isis.core.metamodel.consent.InteractionInvocationMethod;
+import org.apache.isis.core.metamodel.consent.InteractionInitiatedBy;
 import org.apache.isis.core.metamodel.deployment.DeploymentCategory;
 import org.apache.isis.core.metamodel.facets.all.named.NamedFacet;
 import org.apache.isis.core.metamodel.interactions.ActionArgumentContext;
@@ -40,7 +40,7 @@ public interface ObjectActionParameter extends ObjectFeature, CurrentHolder {
      * 
      * <p>
      * Either this or {@link #isCollection()} will be true.
-     * 
+     *
      * <p>
      * Design note: modelled after {@link ObjectAssociation#isNotCollection()}
      */
@@ -88,7 +88,12 @@ public interface ObjectActionParameter extends ObjectFeature, CurrentHolder {
     @Override
     String getName();
 
-    ActionArgumentContext createProposedArgumentInteractionContext(AuthenticationSession session, InteractionInvocationMethod invocationMethod, ObjectAdapter targetObject, ObjectAdapter[] args, int position);
+    // internal API
+    ActionArgumentContext createProposedArgumentInteractionContext(
+            final ObjectAdapter targetObject,
+            final ObjectAdapter[] args,
+            final int position,
+            final InteractionInitiatedBy interactionInitiatedBy);
 
 
     /**
@@ -104,8 +109,7 @@ public interface ObjectActionParameter extends ObjectFeature, CurrentHolder {
     ObjectAdapter[] getAutoComplete(
             final ObjectAdapter adapter,
             final String searchArg,
-            final AuthenticationSession authenticationSession,
-            final DeploymentCategory deploymentCategory);
+            final InteractionInitiatedBy interactionInitiatedBy);
 
     
     
@@ -123,8 +127,7 @@ public interface ObjectActionParameter extends ObjectFeature, CurrentHolder {
     ObjectAdapter[] getChoices(
             final ObjectAdapter adapter,
             final ObjectAdapter[] argumentsIfAvailable,
-            final AuthenticationSession authenticationSession,
-            final DeploymentCategory deploymentCategory);
+            final InteractionInitiatedBy interactionInitiatedBy);
 
 
     ObjectAdapter getDefault(ObjectAdapter adapter);
@@ -135,9 +138,13 @@ public interface ObjectActionParameter extends ObjectFeature, CurrentHolder {
      * 
      * @param adapter
      * @param proposedValue
+     * @param interactionInitiatedBy
      * @return
      */
-    String isValid(ObjectAdapter adapter, Object proposedValue, Localization localization);
+    String isValid(
+            ObjectAdapter adapter,
+            Object proposedValue,
+            final InteractionInitiatedBy interactionInitiatedBy, Localization localization);
  
 
     

http://git-wip-us.apache.org/repos/asf/isis/blob/d120bf74/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/feature/ObjectAssociation.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/feature/ObjectAssociation.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/feature/ObjectAssociation.java
index dd69917..7e76770 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/feature/ObjectAssociation.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/feature/ObjectAssociation.java
@@ -34,6 +34,7 @@ import org.apache.isis.applib.filter.Filter;
 import org.apache.isis.core.commons.authentication.AuthenticationSession;
 import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
 import org.apache.isis.core.metamodel.consent.Consent;
+import org.apache.isis.core.metamodel.consent.InteractionInitiatedBy;
 import org.apache.isis.core.metamodel.deployment.DeploymentCategory;
 import org.apache.isis.core.metamodel.facets.all.hide.HiddenFacet;
 import org.apache.isis.core.metamodel.facets.members.order.MemberOrderFacet;
@@ -53,7 +54,7 @@ public interface ObjectAssociation extends ObjectMember, CurrentHolder {
      * For example, if this is an {@link OneToOneAssociation}, then returns the
      * referenced object.
      */
-    ObjectAdapter get(final ObjectAdapter owner);
+    ObjectAdapter get(final ObjectAdapter owner, final InteractionInitiatedBy interactionInitiatedBy);
 
     /**
      * Get the name for the business key, if one has been specified.
@@ -80,9 +81,8 @@ public interface ObjectAssociation extends ObjectMember, CurrentHolder {
      * user can choose from.
      */
     public ObjectAdapter[] getChoices(
-            ObjectAdapter object,
-            final AuthenticationSession authenticationSession,
-            final DeploymentCategory deploymentCategory);
+            final ObjectAdapter object,
+            final InteractionInitiatedBy interactionInitiatedBy);
 
 
     /**
@@ -98,7 +98,7 @@ public interface ObjectAssociation extends ObjectMember, CurrentHolder {
             final ObjectAdapter object,
             final String searchArg,
             final AuthenticationSession authenticationSession,
-            final DeploymentCategory deploymentCategory);
+            final DeploymentCategory deploymentCategory, final InteractionInitiatedBy interactionInitiatedBy);
 
     int getAutoCompleteMinLength();
 
@@ -112,7 +112,7 @@ public interface ObjectAssociation extends ObjectMember, CurrentHolder {
      * Returns <code>true</code> if this field on the specified object is deemed
      * to be empty, or has no content.
      */
-    boolean isEmpty(ObjectAdapter target);
+    boolean isEmpty(ObjectAdapter target, final InteractionInitiatedBy interactionInitiatedBy);
 
     /**
      * Determines if this field must be complete before the object is in a valid
@@ -173,30 +173,35 @@ public interface ObjectAssociation extends ObjectMember, CurrentHolder {
         /**
          * Only fields that are for reference properties (ie 1:1 associations)
          */
+        // UNUSED ?
         public final static Predicate<ObjectAssociation> REFERENCE_PROPERTIES =
                 org.apache.isis.applib.filter.Filters.asPredicate(Filters.REFERENCE_PROPERTIES);
 
         /**
          * Only fields that are for properties (ie 1:1 associations)
          */
+        // UNUSED ?
         public final static Predicate<ObjectAssociation> WHERE_VISIBLE_IN_COLLECTION_TABLE =
                 org.apache.isis.applib.filter.Filters.asPredicate(Filters.WHERE_VISIBLE_IN_COLLECTION_TABLE);
 
         /**
          * Only fields that are for properties (ie 1:1 associations)
          */
+        // UNUSED ?
         public final static Predicate<ObjectAssociation> WHERE_VISIBLE_IN_STANDALONE_TABLE =
                 org.apache.isis.applib.filter.Filters.asPredicate(Filters.WHERE_VISIBLE_IN_STANDALONE_TABLE);
 
         /**
          * All fields (that is, excludes out nothing).
          */
+        // UNUSED ?
         public final static Predicate<ObjectAssociation> ALL =
                 org.apache.isis.applib.filter.Filters.asPredicate(Filters.ALL);
 
         /**
          * Only fields that are for collections (ie 1:m associations)
          */
+        // UNUSED ?
         public final static Predicate<ObjectAssociation> COLLECTIONS =
                 org.apache.isis.applib.filter.Filters.asPredicate(Filters.COLLECTIONS);
 
@@ -207,16 +212,28 @@ public interface ObjectAssociation extends ObjectMember, CurrentHolder {
         public static final Predicate<ObjectAssociation> VISIBLE_AT_LEAST_SOMETIMES =
                 org.apache.isis.applib.filter.Filters.asPredicate(Filters.VISIBLE_AT_LEAST_SOMETIMES);
 
+        // UNUSED ?
         public static final Predicate<ObjectAssociation> staticallyVisible(final Where context) {
             return org.apache.isis.applib.filter.Filters.asPredicate(Filters.staticallyVisible(context));
         }
 
-        public static final Predicate<ObjectAssociation> dynamicallyVisible(final AuthenticationSession session, final ObjectAdapter target, final Where where) {
-            return org.apache.isis.applib.filter.Filters.asPredicate(Filters.dynamicallyVisible(session, target, where));
+        // UNUSED ?
+        public static final Predicate<ObjectAssociation> dynamicallyVisible(
+                final ObjectAdapter target,
+                final InteractionInitiatedBy interactionInitiatedBy,
+                final Where where) {
+            return org.apache.isis.applib.filter.Filters.asPredicate(Filters.dynamicallyVisible(target,
+                    interactionInitiatedBy, where
+            ));
         }
 
-        public static final Predicate<ObjectAssociation> enabled(final AuthenticationSession session, final ObjectAdapter adapter, final Where where) {
-            return org.apache.isis.applib.filter.Filters.asPredicate(Filters.enabled(session, adapter, where));
+        public static final Predicate<ObjectAssociation> enabled(
+                final ObjectAdapter adapter,
+                final InteractionInitiatedBy interactionInitiatedBy,
+                final Where where) {
+            return org.apache.isis.applib.filter.Filters.asPredicate(Filters.enabled(adapter,
+                    interactionInitiatedBy, where
+            ));
         }
 
     }
@@ -347,11 +364,14 @@ public interface ObjectAssociation extends ObjectMember, CurrentHolder {
          * @deprecated -use {@link com.google.common.base.Predicate equivalent}
          */
         @Deprecated
-        public static Filter<ObjectAssociation> dynamicallyVisible(final AuthenticationSession session, final ObjectAdapter target, final Where where) {
+        public static Filter<ObjectAssociation> dynamicallyVisible(
+                final ObjectAdapter target,
+                final InteractionInitiatedBy interactionInitiatedBy,
+                final Where where) {
             return new Filter<ObjectAssociation>() {
                 @Override
                 public boolean accept(final ObjectAssociation objectAssociation) {
-                    final Consent visible = objectAssociation.isVisible(session, target, where);
+                    final Consent visible = objectAssociation.isVisible(target, interactionInitiatedBy, where);
                     return visible.isAllowed();
                 }
             };
@@ -361,11 +381,14 @@ public interface ObjectAssociation extends ObjectMember, CurrentHolder {
          * @deprecated -use {@link com.google.common.base.Predicate equivalent}
          */
         @Deprecated
-        public static Filter<ObjectAssociation> enabled(final AuthenticationSession session, final ObjectAdapter adapter, final Where where) {
+        public static Filter<ObjectAssociation> enabled(
+                final ObjectAdapter adapter,
+                final InteractionInitiatedBy interactionInitiatedBy,
+                final Where where) {
             return new Filter<ObjectAssociation>() {
                 @Override
                 public boolean accept(final ObjectAssociation objectAssociation) {
-                    final Consent usable = objectAssociation.isUsable(session, adapter, where);
+                    final Consent usable = objectAssociation.isUsable(adapter, interactionInitiatedBy, where);
                     return usable.isAllowed();
                 }
             };

http://git-wip-us.apache.org/repos/asf/isis/blob/d120bf74/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/feature/ObjectAssociationFilters.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/feature/ObjectAssociationFilters.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/feature/ObjectAssociationFilters.java
index 68500be..a0e0b5d 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/feature/ObjectAssociationFilters.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/feature/ObjectAssociationFilters.java
@@ -18,8 +18,8 @@ package org.apache.isis.core.metamodel.spec.feature;
 
 import org.apache.isis.applib.annotation.Where;
 import org.apache.isis.applib.filter.Filter;
-import org.apache.isis.core.commons.authentication.AuthenticationSession;
 import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
+import org.apache.isis.core.metamodel.consent.InteractionInitiatedBy;
 
 @Deprecated
 public class ObjectAssociationFilters {
@@ -28,66 +28,81 @@ public class ObjectAssociationFilters {
      * @deprecated - use {@link ObjectAssociation.Filters#PROPERTIES}
      */
     @Deprecated
+    // UNUSED?
     public final static Filter<ObjectAssociation> PROPERTIES = ObjectAssociation.Filters.PROPERTIES;
 
     /**
      * @deprecated - use {@link ObjectAssociation.Filters#REFERENCE_PROPERTIES}
      */
     @Deprecated
+    // UNUSED?
     public final static Filter<ObjectAssociation> REFERENCE_PROPERTIES = ObjectAssociation.Filters.REFERENCE_PROPERTIES;
 
     /**
      * @deprecated - use {@link ObjectAssociation.Filters#WHERE_VISIBLE_IN_COLLECTION_TABLE}
      */
     @Deprecated
+    // UNUSED?
     public final static Filter<ObjectAssociation> WHERE_VISIBLE_IN_COLLECTION_TABLE = ObjectAssociation.Filters.WHERE_VISIBLE_IN_COLLECTION_TABLE;
 
     /**
      * @deprecated - use {@link ObjectAssociation.Filters#WHERE_VISIBLE_IN_STANDALONE_TABLE}
      */
     @Deprecated
+    // UNUSED?
     public final static Filter<ObjectAssociation> WHERE_VISIBLE_IN_STANDALONE_TABLE = ObjectAssociation.Filters.WHERE_VISIBLE_IN_STANDALONE_TABLE;
 
     /**
-     * @deprecated - use {@link ObjectAssociation.Filters#ALL}
+     * @deprecated
      */
     @Deprecated
+    // UNUSED ?
     public final static Filter<ObjectAssociation> ALL = ObjectAssociation.Filters.ALL;
 
     /**
-     * @deprecated - use {@link ObjectAssociation.Filters#COLLECTIONS}
+     * @deprecated
      */
     @Deprecated
+    // UNUSED ?
     public final static Filter<ObjectAssociation> COLLECTIONS = ObjectAssociation.Filters.COLLECTIONS;
 
     /**
-     * @deprecated - use {@link ObjectAssociation.Filters#VISIBLE_AT_LEAST_SOMETIMES}
+     * @deprecated
      */
     @Deprecated
+    // UNUSED ?
     public static final Filter<ObjectAssociation> VISIBLE_AT_LEAST_SOMETIMES = ObjectAssociation.Filters.VISIBLE_AT_LEAST_SOMETIMES;
 
     /**
-     * @deprecated - use {@link ObjectAssociation.Filters#dynamicallyVisible(AuthenticationSession, ObjectAdapter, Where)}
+     * @deprecated
      */
     @Deprecated
+    // UNUSED ?
     public static final Filter<ObjectAssociation> staticallyVisible(final Where context) {
         return ObjectAssociation.Filters.staticallyVisible(context);
     }
     
     /**
-     * @deprecated - use {@link ObjectAssociation.Filters#dynamicallyVisible(AuthenticationSession, ObjectAdapter, Where)}
+     * @deprecated
      */
+    // UNUSED ?
     @Deprecated
-    public static Filter<ObjectAssociation> dynamicallyVisible(final AuthenticationSession session, final ObjectAdapter target, final Where where) {
-        return ObjectAssociation.Filters.dynamicallyVisible(session, target, where);
+    public static Filter<ObjectAssociation> dynamicallyVisible(
+            final ObjectAdapter target,
+            final InteractionInitiatedBy interactionInitiatedBy,
+            final Where where) {
+        return ObjectAssociation.Filters.dynamicallyVisible(target, interactionInitiatedBy, where);
     }
 
     /**
-     * @deprecated - use {@link ObjectAssociation.Filters#enabled(AuthenticationSession, ObjectAdapter, Where)}
+     * @deprecated
      */
     @Deprecated
-    public static Filter<ObjectAssociation> enabled(final AuthenticationSession session, final ObjectAdapter adapter, final Where where) {
-        return ObjectAssociation.Filters.enabled(session, adapter, where);
+    public static Filter<ObjectAssociation> enabled(
+            final ObjectAdapter adapter,
+            final InteractionInitiatedBy interactionInitiatedBy,
+            final Where where) {
+        return ObjectAssociation.Filters.enabled(adapter, interactionInitiatedBy, where);
     }
     
 }

http://git-wip-us.apache.org/repos/asf/isis/blob/d120bf74/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/feature/ObjectMember.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/feature/ObjectMember.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/feature/ObjectMember.java
index 71f74f7..277c734 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/feature/ObjectMember.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/feature/ObjectMember.java
@@ -21,15 +21,10 @@ package org.apache.isis.core.metamodel.spec.feature;
 
 import org.apache.isis.applib.annotation.When;
 import org.apache.isis.applib.annotation.Where;
-import org.apache.isis.core.commons.authentication.AuthenticationSession;
 import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
 import org.apache.isis.core.metamodel.consent.Consent;
-import org.apache.isis.core.metamodel.consent.InteractionInvocationMethod;
+import org.apache.isis.core.metamodel.consent.InteractionInitiatedBy;
 import org.apache.isis.core.metamodel.facets.all.hide.HiddenFacet;
-import org.apache.isis.core.metamodel.interactions.AccessContext;
-import org.apache.isis.core.metamodel.interactions.InteractionContext;
-import org.apache.isis.core.metamodel.interactions.UsabilityContext;
-import org.apache.isis.core.metamodel.interactions.VisibilityContext;
 
 /**
  * Provides reflective access to an action or a field on a domain object.
@@ -62,54 +57,35 @@ public interface ObjectMember extends ObjectFeature {
      */
     boolean isAlwaysHidden();
 
-    /**
-     * Create an {@link InteractionContext} to represent an attempt to view this
-     * member (that is, to check if it is visible or not).
-     * 
-     * <p>
-     * Typically it is easier to just call
-     * {@link #isVisible(AuthenticationSession, ObjectAdapter, Where)}; this is
-     * provided as API for symmetry with interactions (such as
-     * {@link AccessContext} accesses) have no corresponding vetoing methods.
-     */
-    VisibilityContext<?> createVisibleInteractionContext(AuthenticationSession session, InteractionInvocationMethod invocationMethod, ObjectAdapter targetObjectAdapter, Where where);
 
     /**
      * Determines if this member is visible, represented as a {@link Consent}.
      * @param target
      *            may be <tt>null</tt> if just checking for authorization.
-     * @param where 
-     *            the member is being rendered in the UI
+     * @param interactionInitiatedBy
+     * @param where
      */
-    Consent isVisible(AuthenticationSession session, ObjectAdapter target, Where where);
+    Consent isVisible(
+            final ObjectAdapter target,
+            final InteractionInitiatedBy interactionInitiatedBy,
+            final Where where);
 
     // /////////////////////////////////////////////////////////////
     // Disabled (or enabled)
     // /////////////////////////////////////////////////////////////
 
     /**
-     * Create an {@link InteractionContext} to represent an attempt to
-     * use this member (that is, to check if it is usable or not).
-     * 
-     * <p>
-     * Typically it is easier to just call
-     * {@link #isUsable(AuthenticationSession, ObjectAdapter, Where)}; this is
-     * provided as API for symmetry with interactions (such as
-     * {@link AccessContext} accesses) have no corresponding vetoing methods.
-     */
-    UsabilityContext<?> createUsableInteractionContext(AuthenticationSession session, InteractionInvocationMethod invocationMethod, ObjectAdapter target, Where where);
-
-    /**
      * Determines whether this member is usable, represented as a
      * {@link Consent}.
      * @param target
      *            may be <tt>null</tt> if just checking for authorization.
-     * @param where 
-     *            the member is being rendered in the UI
-     * 
-     * @see #isUsableResult(AuthenticationSession, ObjectAdapter)
+     * @param interactionInitiatedBy
+     * @param where
      */
-    Consent isUsable(AuthenticationSession session, ObjectAdapter target, Where where);
+    Consent isUsable(
+            final ObjectAdapter target,
+            final InteractionInitiatedBy interactionInitiatedBy,
+            final Where where);
 
     // /////////////////////////////////////////////////////////////
     // isAssociation, isAction

http://git-wip-us.apache.org/repos/asf/isis/blob/d120bf74/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/feature/OneToManyAssociation.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/feature/OneToManyAssociation.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/feature/OneToManyAssociation.java
index 0abc308..a4f5c81 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/feature/OneToManyAssociation.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/feature/OneToManyAssociation.java
@@ -22,7 +22,7 @@ package org.apache.isis.core.metamodel.spec.feature;
 import org.apache.isis.core.commons.authentication.AuthenticationSession;
 import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
 import org.apache.isis.core.metamodel.consent.Consent;
-import org.apache.isis.core.metamodel.consent.InteractionInvocationMethod;
+import org.apache.isis.core.metamodel.consent.InteractionInitiatedBy;
 import org.apache.isis.core.metamodel.interactions.AccessContext;
 import org.apache.isis.core.metamodel.interactions.InteractionContext;
 import org.apache.isis.core.metamodel.interactions.ValidityContext;
@@ -33,29 +33,21 @@ public interface OneToManyAssociation extends ObjectAssociation, OneToManyFeatur
     // add
     // /////////////////////////////////////////////////////////////
 
-    /**
-     * Creates an {@link InteractionContext} that represents validation of a
-     * candidate object to be added to the collection.
-     * 
-     * <p>
-     * Typically it is easier to just call
-     * {@link #isValidToAdd(ObjectAdapter, ObjectAdapter)}; this is
-     * provided as API for symmetry with interactions (such as
-     * {@link AccessContext} accesses) have no corresponding vetoing methods.
-     */
-    public ValidityContext<?> createValidateAddInteractionContext(AuthenticationSession session, InteractionInvocationMethod invocationMethod, ObjectAdapter owningObjectAdapter, ObjectAdapter proposedObjectToAdd);
 
     /**
      * Determines if the specified element can be added to the collection field,
      * represented as a {@link Consent}.
      *
      * <p>
-     * If allowed the {@link #addElement(ObjectAdapter, ObjectAdapter) add}
+     * If allowed the {@link #addElement(ObjectAdapter, ObjectAdapter, InteractionInitiatedBy) add}
      * method can be called with the same parameters.
      *
-     * @see #addElement(ObjectAdapter, ObjectAdapter)
+     * @see #addElement(ObjectAdapter, ObjectAdapter, InteractionInitiatedBy)
      */
-    Consent isValidToAdd(ObjectAdapter owningObjectAdapter, ObjectAdapter proposedObjectToAdd);
+    Consent isValidToAdd(
+            ObjectAdapter owningObjectAdapter,
+            ObjectAdapter proposedObjectToAdd,
+            final InteractionInitiatedBy interactionInitiatedBy);
 
     /**
      * Add the specified element to this collection field in the specified
@@ -67,35 +59,30 @@ public interface OneToManyAssociation extends ObjectAssociation, OneToManyFeatur
      *
      * @see #isValidToAdd(ObjectAdapter, ObjectAdapter)
      */
-    void addElement(ObjectAdapter owningObjectAdapter, ObjectAdapter objectToAdd);
+    void addElement(
+            ObjectAdapter owningObjectAdapter,
+            ObjectAdapter objectToAdd,
+            final InteractionInitiatedBy interactionInitiatedBy);
 
     // /////////////////////////////////////////////////////////////
     // remove
     // /////////////////////////////////////////////////////////////
 
-    /**
-     * Creates an {@link InteractionContext} that represents validation of a
-     * candidate object to be removed from the collection.
-     * 
-     * <p>
-     * Typically it is easier to just call
-     * {@link #isValidToAdd(ObjectAdapter, ObjectAdapter)}; this is
-     * provided as API for symmetry with interactions (such as
-     * {@link AccessContext} accesses) have no corresponding vetoing methods.
-     */
-    ValidityContext<?> createValidateRemoveInteractionContext(AuthenticationSession session, InteractionInvocationMethod invocationMethod, ObjectAdapter owningObjectAdapter, ObjectAdapter proposedObjectToRemove);
 
     /**
      * Determines if the specified element can be removed from the collection
      * field, represented as a {@link Consent}.
      * 
      * <p>
-     * If allowed the {@link #removeElement(ObjectAdapter, ObjectAdapter)
+     * If allowed the {@link #removeElement(ObjectAdapter, ObjectAdapter, InteractionInitiatedBy)
      * remove} method can be called with the same parameters.
      * 
-     * @see #removeElement(ObjectAdapter, ObjectAdapter)
+     * @see #removeElement(ObjectAdapter, ObjectAdapter, InteractionInitiatedBy)
      */
-    Consent isValidToRemove(ObjectAdapter owningObjectAdapter, ObjectAdapter proposedObjectToRemove);
+    Consent isValidToRemove(
+            ObjectAdapter owningObjectAdapter,
+            ObjectAdapter proposedObjectToRemove,
+            final InteractionInitiatedBy interactionInitiatedBy);
 
     /**
      * Remove the specified element from this collection field in the specified
@@ -107,7 +94,10 @@ public interface OneToManyAssociation extends ObjectAssociation, OneToManyFeatur
      *
      * @see #isValidToRemove(ObjectAdapter, ObjectAdapter)
      */
-    void removeElement(ObjectAdapter owningObjectAdapter, ObjectAdapter oObjectToRemove);
+    void removeElement(
+            ObjectAdapter owningObjectAdapter,
+            ObjectAdapter oObjectToRemove,
+            final InteractionInitiatedBy interactionInitiatedBy);
 
     // /////////////////////////////////////////////////////////////
     // clear

http://git-wip-us.apache.org/repos/asf/isis/blob/d120bf74/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/feature/OneToOneAssociation.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/feature/OneToOneAssociation.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/feature/OneToOneAssociation.java
index 0d8fcce..3e8e3ea 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/feature/OneToOneAssociation.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/feature/OneToOneAssociation.java
@@ -21,14 +21,9 @@ package org.apache.isis.core.metamodel.spec.feature;
 
 import com.google.common.base.Function;
 
-import org.apache.isis.core.commons.authentication.AuthenticationSession;
 import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
 import org.apache.isis.core.metamodel.consent.Consent;
-import org.apache.isis.core.metamodel.consent.InteractionInvocationMethod;
-import org.apache.isis.core.metamodel.interactions.AccessContext;
-import org.apache.isis.core.metamodel.interactions.InteractionContext;
-import org.apache.isis.core.metamodel.interactions.PropertyAccessContext;
-import org.apache.isis.core.metamodel.interactions.ValidityContext;
+import org.apache.isis.core.metamodel.consent.InteractionInitiatedBy;
 import org.apache.isis.core.metamodel.spec.ObjectSpecification;
 
 /**
@@ -46,30 +41,16 @@ public interface OneToOneAssociation extends ObjectAssociation, OneToOneFeature,
      */
     void initAssociation(ObjectAdapter inObject, ObjectAdapter associate);
 
-    /**
-     * Creates an {@link InteractionContext} that represents access to this
-     * property.
-     */
-    public PropertyAccessContext createAccessInteractionContext(AuthenticationSession session, InteractionInvocationMethod interactionMethod, ObjectAdapter targetObjectAdapter);
 
-    /**
-     * Creates an {@link InteractionContext} that represents validation of a
-     * proposed new value for the property.
-     * 
-     * <p>
-     * Typically it is easier to just call
-     * {@link #isAssociationValid(ObjectAdapter, ObjectAdapter)} or
-     * {@link #isAssociationValidResult(ObjectAdapter, ObjectAdapter)}; this is
-     * provided as API for symmetry with interactions (such as
-     * {@link AccessContext} accesses) have no corresponding vetoing methods.
-     */
-    public ValidityContext<?> createValidateInteractionContext(AuthenticationSession session, InteractionInvocationMethod interactionMethod, ObjectAdapter targetObjectAdapter, ObjectAdapter proposedValue);
 
     /**
      * Determines if the specified reference is valid for setting this field in
      * the specified object, represented as a {@link Consent}.
      */
-    Consent isAssociationValid(ObjectAdapter inObject, ObjectAdapter associate);
+    public Consent isAssociationValid(
+            final ObjectAdapter targetAdapter,
+            final ObjectAdapter proposedAdapter,
+            final InteractionInitiatedBy interactionInitiatedBy);
 
     /**
      * Set up the association represented by this field in the specified object
@@ -79,21 +60,24 @@ public interface OneToOneAssociation extends ObjectAssociation, OneToOneFeature,
      * object to this logical state the <code>initAssociation</code> method
      * should be used on each of the objects.
      * 
-     * @deprecated - see {@link #set(ObjectAdapter, ObjectAdapter)}
+     * @deprecated - see {@link MutableCurrentHolder#set(ObjectAdapter, ObjectAdapter, InteractionInitiatedBy)}
      * @see #initAssociation(ObjectAdapter, ObjectAdapter)
      */
     @Deprecated
-    void setAssociation(ObjectAdapter inObject, ObjectAdapter associate);
+    void setAssociation(
+            ObjectAdapter inObject,
+            ObjectAdapter associate,
+            final InteractionInitiatedBy interactionInitiatedBy);
 
     /**
      * Clear this reference field (make it <code>null</code>) in the specified
      * object, and remove any association back-link.
      * 
-     * @see #setAssociation(ObjectAdapter, ObjectAdapter)
-     * @deprecated - see {@link #set(ObjectAdapter, ObjectAdapter)}
+     * @see #setAssociation(ObjectAdapter, ObjectAdapter, InteractionInitiatedBy)
+     * @deprecated - see {@link MutableCurrentHolder#set(ObjectAdapter, ObjectAdapter, InteractionInitiatedBy)}
      */
     @Deprecated
-    void clearAssociation(ObjectAdapter inObject);
+    void clearAssociation(ObjectAdapter inObject, final InteractionInitiatedBy interactionInitiatedBy);
 
     
     // //////////////////////////////////////////////////////

http://git-wip-us.apache.org/repos/asf/isis/blob/d120bf74/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectActionContributee.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectActionContributee.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectActionContributee.java
index cdeb1a1..fc2c9cc 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectActionContributee.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectActionContributee.java
@@ -34,7 +34,7 @@ import org.apache.isis.core.commons.authentication.AuthenticationSession;
 import org.apache.isis.core.commons.lang.ObjectExtensions;
 import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
 import org.apache.isis.core.metamodel.consent.Consent;
-import org.apache.isis.core.metamodel.consent.InteractionInvocationMethod;
+import org.apache.isis.core.metamodel.consent.InteractionInitiatedBy;
 import org.apache.isis.core.metamodel.deployment.DeploymentCategory;
 import org.apache.isis.core.metamodel.facetapi.Facet;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
@@ -160,15 +160,22 @@ public class ObjectActionContributee extends ObjectActionImpl implements Contrib
 
     
     @Override
-    public Consent isVisible(final AuthenticationSession session, final ObjectAdapter contributee, Where where) {
-        final VisibilityContext<?> ic = serviceAction.createVisibleInteractionContext(session, InteractionInvocationMethod.BY_USER, serviceAdapter, where);
+    public Consent isVisible(
+            final ObjectAdapter contributee,
+            final InteractionInitiatedBy interactionInitiatedBy,
+            Where where) {
+        final VisibilityContext<?> ic = serviceAction.createVisibleInteractionContext(serviceAdapter,
+                interactionInitiatedBy, where);
         ic.putContributee(this.contributeeParam, contributee);
         return InteractionUtils.isVisibleResult(this, ic).createConsent();
     }
 
     @Override
-    public Consent isUsable(final AuthenticationSession session, final ObjectAdapter contributee, Where where) {
-        final UsabilityContext<?> ic = serviceAction.createUsableInteractionContext(session, InteractionInvocationMethod.BY_USER, serviceAdapter, where);
+    public Consent isUsable(
+            final ObjectAdapter contributee,
+            final InteractionInitiatedBy interactionInitiatedBy, final Where where) {
+        final UsabilityContext<?> ic = serviceAction.createUsableInteractionContext(serviceAdapter,
+                interactionInitiatedBy, where);
         ic.putContributee(this.contributeeParam, contributee);
         return InteractionUtils.isUsableResult(this, ic).createConsent();
     }
@@ -183,19 +190,25 @@ public class ObjectActionContributee extends ObjectActionImpl implements Contrib
     public ObjectAdapter[][] getChoices(
             final ObjectAdapter target,
             final AuthenticationSession authenticationSession,
-            final DeploymentCategory deploymentCategory) {
+            final DeploymentCategory deploymentCategory, final InteractionInitiatedBy interactionInitiatedBy) {
         final ObjectAdapter[][] serviceChoices = serviceAction.getChoices(serviceAdapter, authenticationSession,
-                deploymentCategory);
+                deploymentCategory, interactionInitiatedBy);
         return removeElementFromArray(serviceChoices, contributeeParam, new ObjectAdapter[][]{});
     }
         
-    public Consent isProposedArgumentSetValid(final ObjectAdapter contributee, final ObjectAdapter[] proposedArguments) {
+    public Consent isProposedArgumentSetValid(
+            final ObjectAdapter contributee,
+            final ObjectAdapter[] proposedArguments,
+            final InteractionInitiatedBy interactionInitiatedBy) {
         ObjectAdapter[] serviceArguments = argsPlusContributee(contributee, proposedArguments);
-        return serviceAction.isProposedArgumentSetValid(serviceAdapter, serviceArguments);
+        return serviceAction.isProposedArgumentSetValid(serviceAdapter, serviceArguments, interactionInitiatedBy);
     }
 
     @Override
-    public ObjectAdapter execute(final ObjectAdapter contributee, final ObjectAdapter[] arguments) {
+    public ObjectAdapter execute(
+            final ObjectAdapter contributee,
+            final ObjectAdapter[] arguments,
+            final InteractionInitiatedBy interactionInitiatedBy) {
         
         // this code also exists in ActionInvocationFacetViaMethod
         // we need to repeat it here because the target adapter should be the contributee, not the contributing service.
@@ -240,7 +253,8 @@ public class ObjectActionContributee extends ObjectActionImpl implements Contrib
             }
         }
         
-        return serviceAction.execute(serviceAdapter, argsPlusContributee(contributee, arguments));
+        return serviceAction.execute(serviceAdapter, argsPlusContributee(contributee, arguments),
+                interactionInitiatedBy);
     }
 
     private ObjectAdapter[] argsPlusContributee(final ObjectAdapter contributee, final ObjectAdapter[] arguments) {

http://git-wip-us.apache.org/repos/asf/isis/blob/d120bf74/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectActionImpl.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectActionImpl.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectActionImpl.java
index 61a5f23..8cc209f 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectActionImpl.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectActionImpl.java
@@ -36,7 +36,7 @@ import org.apache.isis.core.commons.debug.DebugString;
 import org.apache.isis.core.commons.exceptions.UnknownTypeException;
 import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
 import org.apache.isis.core.metamodel.consent.Consent;
-import org.apache.isis.core.metamodel.consent.InteractionInvocationMethod;
+import org.apache.isis.core.metamodel.consent.InteractionInitiatedBy;
 import org.apache.isis.core.metamodel.consent.InteractionResultSet;
 import org.apache.isis.core.metamodel.deployment.DeploymentCategory;
 import org.apache.isis.core.metamodel.facetapi.Facet;
@@ -281,8 +281,11 @@ public class ObjectActionImpl extends ObjectMemberAbstract implements ObjectActi
     // /////////////////////////////////////////////////////////////
 
     @Override
-    public VisibilityContext<?> createVisibleInteractionContext(final AuthenticationSession session, final InteractionInvocationMethod invocationMethod, final ObjectAdapter targetObjectAdapter, Where where) {
-        return new ActionVisibilityContext(getDeploymentCategory(), session, invocationMethod, targetObjectAdapter, getIdentifier(), where);
+    public VisibilityContext<?> createVisibleInteractionContext(
+            final ObjectAdapter targetObjectAdapter, final InteractionInitiatedBy interactionInitiatedBy,
+            Where where) {
+        final AuthenticationSession session = getAuthenticationSession();
+        return new ActionVisibilityContext(getDeploymentCategory(), session, interactionInitiatedBy, targetObjectAdapter, getIdentifier(), where);
     }
 
     // /////////////////////////////////////////////////////////////
@@ -290,45 +293,55 @@ public class ObjectActionImpl extends ObjectMemberAbstract implements ObjectActi
     // /////////////////////////////////////////////////////////////
 
     @Override
-    public UsabilityContext<?> createUsableInteractionContext(final AuthenticationSession session, final InteractionInvocationMethod invocationMethod, final ObjectAdapter targetObjectAdapter, Where where) {
-        return new ActionUsabilityContext(getDeploymentCategory(), session, invocationMethod, targetObjectAdapter, getIdentifier(), where);
+    public UsabilityContext<?> createUsableInteractionContext(
+            final ObjectAdapter targetObjectAdapter, final InteractionInitiatedBy interactionInitiatedBy,
+            Where where) {
+        final AuthenticationSession session = getAuthenticationSession();
+        return new ActionUsabilityContext(getDeploymentCategory(), session, interactionInitiatedBy, targetObjectAdapter, getIdentifier(), where);
     }
 
     // //////////////////////////////////////////////////////////////////
     // validate
     // //////////////////////////////////////////////////////////////////
 
-    /**
-     * TODO: currently this method is hard-coded to assume all interactions are
-     * initiated {@link InteractionInvocationMethod#BY_USER by user}.
-     */
     @Override
-    public Consent isProposedArgumentSetValid(final ObjectAdapter target, final ObjectAdapter[] proposedArguments) {
-        return isProposedArgumentSetValidResultSet(target, proposedArguments).createConsent();
+    public Consent isProposedArgumentSetValid(
+            final ObjectAdapter target,
+            final ObjectAdapter[] proposedArguments,
+            final InteractionInitiatedBy interactionInitiatedBy) {
+        return isProposedArgumentSetValidResultSet(target, proposedArguments, interactionInitiatedBy).createConsent();
     }
 
-    private InteractionResultSet isProposedArgumentSetValidResultSet(final ObjectAdapter object, final ObjectAdapter[] proposedArguments) {
-        final InteractionInvocationMethod invocationMethod = InteractionInvocationMethod.BY_USER;
+    private InteractionResultSet isProposedArgumentSetValidResultSet(
+            final ObjectAdapter objectAdapter,
+            final ObjectAdapter[] proposedArguments,
+            final InteractionInitiatedBy interactionInitiatedBy) {
 
         final InteractionResultSet resultSet = new InteractionResultSet();
         final List<ObjectActionParameter> actionParameters = getParameters();
         if (proposedArguments != null) {
             for (int i = 0; i < proposedArguments.length; i++) {
-                final ValidityContext<?> ic = actionParameters.get(i).createProposedArgumentInteractionContext(getAuthenticationSession(), invocationMethod, object, proposedArguments, i);
+                final ValidityContext<?> ic =
+                        actionParameters.get(i).createProposedArgumentInteractionContext(
+                                objectAdapter, proposedArguments, i, interactionInitiatedBy
+                        );
                 InteractionUtils.isValidResultSet(getParameter(i), ic, resultSet);
             }
         }
         // only check the action's own validity if all the arguments are OK.
         if (resultSet.isAllowed()) {
-            final ValidityContext<?> ic = createActionInvocationInteractionContext(getAuthenticationSession(), invocationMethod, object, proposedArguments);
+            final ValidityContext<?> ic = createActionInvocationInteractionContext(
+                    objectAdapter, proposedArguments, interactionInitiatedBy);
             InteractionUtils.isValidResultSet(this, ic, resultSet);
         }
         return resultSet;
     }
 
-    @Override
-    public ActionInvocationContext createActionInvocationInteractionContext(final AuthenticationSession session, final InteractionInvocationMethod invocationMethod, final ObjectAdapter targetObject, final ObjectAdapter[] proposedArguments) {
-        return new ActionInvocationContext(getDeploymentCategory(), getAuthenticationSession(), invocationMethod, targetObject, getIdentifier(), proposedArguments);
+    private ActionInvocationContext createActionInvocationInteractionContext(
+            final ObjectAdapter targetObject,
+            final ObjectAdapter[] proposedArguments,
+            final InteractionInitiatedBy interactionInitiatedBy) {
+        return new ActionInvocationContext(getDeploymentCategory(), getAuthenticationSession(), interactionInitiatedBy, targetObject, getIdentifier(), proposedArguments);
     }
 
     // //////////////////////////////////////////////////////////////////
@@ -336,36 +349,44 @@ public class ObjectActionImpl extends ObjectMemberAbstract implements ObjectActi
     // //////////////////////////////////////////////////////////////////
 
     @Override
-    public ObjectAdapter executeWithRuleChecking(final ObjectAdapter target, final ObjectAdapter[] arguments, final AuthenticationSession authenticationSession, final Where where) {
+    public ObjectAdapter executeWithRuleChecking(
+            final ObjectAdapter target,
+            final ObjectAdapter[] arguments,
+            final AuthenticationSession authenticationSession,
+            final Where where, final InteractionInitiatedBy interactionInitiatedBy) {
 
         // see it?
-        final Consent visibility = isVisible(authenticationSession, target, where);
+        final Consent visibility = isVisible(target, interactionInitiatedBy, where);
         if (visibility.isVetoed()) {
             throw new AuthorizationException();
         }
 
         // use it?
-        final Consent usability = isUsable(authenticationSession, target, where);
+        final Consent usability = isUsable(target, interactionInitiatedBy, where);
         if(usability.isVetoed()) {
             throw new AuthorizationException();
         }
 
         // do it?
-        final Consent validity = isProposedArgumentSetValid(target, arguments);
+        final Consent validity = isProposedArgumentSetValid(target, arguments, interactionInitiatedBy);
         if(validity.isVetoed()) {
             throw new RecoverableException(validity.getReason());
         }
 
-        return execute(target, arguments);
+        return execute(target, arguments, interactionInitiatedBy);
     }
 
     @Override
-    public ObjectAdapter execute(final ObjectAdapter target, final ObjectAdapter[] arguments) {
+    public ObjectAdapter execute(
+            final ObjectAdapter target,
+            final ObjectAdapter[] arguments,
+            final InteractionInitiatedBy interactionInitiatedBy) {
         if(LOG.isDebugEnabled()) {
             LOG.debug("execute action " + target + "." + getId());
         }
         final ActionInvocationFacet facet = getFacet(ActionInvocationFacet.class);
-        return facet.invoke(this, target, arguments, getAuthenticationSession(), getDeploymentCategory());
+        return facet.invoke(this, target, arguments, getAuthenticationSession(), getDeploymentCategory(),
+                interactionInitiatedBy);
     }
 
     protected ActionInvocationFacet getActionInvocationFacet() {
@@ -436,9 +457,11 @@ public class ObjectActionImpl extends ObjectMemberAbstract implements ObjectActi
     @Override
     public ObjectAdapter[][] getChoices(
             final ObjectAdapter target,
-            final AuthenticationSession authenticationSession,
-            final DeploymentCategory deploymentCategory) {
+            final AuthenticationSession authenticationSessionUNUSED,
+            final DeploymentCategory deploymentCategory,
+            final InteractionInitiatedBy interactionInitiatedBy) {
 
+        final AuthenticationSession session = getAuthenticationSession();
         final int parameterCount = getParameterCount();
         Object[][] parameterChoicesPojos;
 
@@ -447,7 +470,8 @@ public class ObjectActionImpl extends ObjectMemberAbstract implements ObjectActi
 
         if (!facet.isNoop()) {
             // using the old choicesXxx() approach
-            parameterChoicesPojos = facet.getChoices(target, authenticationSession, deploymentCategory);
+            parameterChoicesPojos = facet.getChoices(target, session, deploymentCategory,
+                    interactionInitiatedBy);
 
             // if no options, or not the right number of pojos, then default
             if (parameterChoicesPojos == null) {
@@ -465,8 +489,8 @@ public class ObjectActionImpl extends ObjectMemberAbstract implements ObjectActi
             for (int i = 0; i < parameterCount; i++) {
                 final ActionParameterChoicesFacet paramFacet = parameters.get(i).getFacet(ActionParameterChoicesFacet.class);
                 if (paramFacet != null && !paramFacet.isNoop()) {
-                    parameterChoicesPojos[i] = paramFacet.getChoices(target, null, authenticationSession,
-                            deploymentCategory);
+                    parameterChoicesPojos[i] = paramFacet.getChoices(target, null, session,
+                            deploymentCategory, interactionInitiatedBy);
                 } else {
                     parameterChoicesPojos[i] = new Object[0];
                 }

http://git-wip-us.apache.org/repos/asf/isis/blob/d120bf74/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectActionParameterAbstract.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectActionParameterAbstract.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectActionParameterAbstract.java
index 4adc3aa..3f8e313 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectActionParameterAbstract.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectActionParameterAbstract.java
@@ -38,7 +38,7 @@ import org.apache.isis.core.metamodel.adapter.QuerySubmitter;
 import org.apache.isis.core.metamodel.adapter.mgr.AdapterManager;
 import org.apache.isis.core.metamodel.consent.Allow;
 import org.apache.isis.core.metamodel.consent.Consent;
-import org.apache.isis.core.metamodel.consent.InteractionInvocationMethod;
+import org.apache.isis.core.metamodel.consent.InteractionInitiatedBy;
 import org.apache.isis.core.metamodel.consent.InteractionResultSet;
 import org.apache.isis.core.metamodel.deployment.DeploymentCategory;
 import org.apache.isis.core.metamodel.facetapi.Facet;
@@ -259,16 +259,20 @@ public abstract class ObjectActionParameterAbstract implements ObjectActionParam
 
     @Override
     public ObjectAdapter[] getAutoComplete(
-            ObjectAdapter adapter,
-            String searchArg,
-            final AuthenticationSession authenticationSession,
-            final DeploymentCategory deploymentCategory) {
+            final ObjectAdapter adapter,
+            final String searchArg,
+            final InteractionInitiatedBy interactionInitiatedBy) {
+
+        final AuthenticationSession authenticationSession = getAuthenticationSession();
+        final DeploymentCategory deploymentCategory = getDeploymentCategory();
+
         final List<ObjectAdapter> adapters = Lists.newArrayList();
         final ActionParameterAutoCompleteFacet facet = getFacet(ActionParameterAutoCompleteFacet.class);
 
         if (facet != null) {
 
-            final Object[] choices = facet.autoComplete(adapter, searchArg, authenticationSession, deploymentCategory);
+            final Object[] choices = facet.autoComplete(adapter, searchArg, authenticationSession, deploymentCategory,
+                    interactionInitiatedBy);
             checkChoicesOrAutoCompleteType(getSpecificationLoader(), choices, getSpecification());
             for (final Object choice : choices) {
                 adapters.add(getAdapterMap().adapterFor(choice));
@@ -303,25 +307,27 @@ public abstract class ObjectActionParameterAbstract implements ObjectActionParam
     public ObjectAdapter[] getChoices(
             final ObjectAdapter adapter,
             final ObjectAdapter[] argumentsIfAvailable,
-            final AuthenticationSession authenticationSession,
-            final DeploymentCategory deploymentCategory) {
+            final InteractionInitiatedBy interactionInitiatedBy) {
         final List<ObjectAdapter> argListIfAvailable = ListExtensions.mutableCopy(argumentsIfAvailable);
         
         final ObjectAdapter target = targetForDefaultOrChoices(adapter, argListIfAvailable);
         final List<ObjectAdapter> args = argsForDefaultOrChoices(adapter, argListIfAvailable);
         
-        return findChoices(target, args, authenticationSession, deploymentCategory);
+        return findChoices(target, args, interactionInitiatedBy);
     }
 
     private ObjectAdapter[] findChoices(
             final ObjectAdapter target,
             final List<ObjectAdapter> args,
-            final AuthenticationSession authenticationSession, final DeploymentCategory deploymentCategory) {
+            final InteractionInitiatedBy interactionInitiatedBy) {
+        final AuthenticationSession session = getAuthenticationSession();
+        final DeploymentCategory deploymentCategory = getDeploymentCategory();
         final List<ObjectAdapter> adapters = Lists.newArrayList();
         final ActionParameterChoicesFacet facet = getFacet(ActionParameterChoicesFacet.class);
 
         if (facet != null) {
-            final Object[] choices = facet.getChoices(target, args, authenticationSession, deploymentCategory);
+            final Object[] choices = facet.getChoices(target, args, session, deploymentCategory,
+                    interactionInitiatedBy);
             checkChoicesOrAutoCompleteType(getSpecificationLoader(), choices, getSpecification());
             for (final Object choice : choices) {
                 ObjectAdapter adapter = choice != null? getAdapterMap().adapterFor(choice) : null;
@@ -369,21 +375,27 @@ public abstract class ObjectActionParameterAbstract implements ObjectActionParam
     /**
      * Hook method; {@link ObjectActionParameterContributee contributed action parameter}s override.
      */
-    protected ObjectAdapter targetForDefaultOrChoices(ObjectAdapter adapter, final List<ObjectAdapter> argumentsIfAvailable) {
+    protected ObjectAdapter targetForDefaultOrChoices(
+            final ObjectAdapter adapter,
+            final List<ObjectAdapter> argumentsIfAvailable) {
         return adapter;
     }
 
     /**
      * Hook method; {@link ObjectActionParameterContributee contributed action parameter}s override.
      */
-    protected List<ObjectAdapter> argsForDefaultOrChoices(final ObjectAdapter adapter, final List<ObjectAdapter> argumentsIfAvailable) {
+    protected List<ObjectAdapter> argsForDefaultOrChoices(
+            final ObjectAdapter adapter,
+            final List<ObjectAdapter> argumentsIfAvailable) {
         return argumentsIfAvailable;
     }
 
     
     // helpers
-
-    static void checkChoicesOrAutoCompleteType(final SpecificationLoader specificationLookup, final Object[] objects, final ObjectSpecification paramSpec) {
+    static void checkChoicesOrAutoCompleteType(
+            final SpecificationLoader specificationLookup,
+            final Object[] objects,
+            final ObjectSpecification paramSpec) {
         for (final Object object : objects) {
 
             if(object == null) {
@@ -425,12 +437,20 @@ public abstract class ObjectActionParameterAbstract implements ObjectActionParam
     // /////////////////////////////////////////////////////////////
 
     @Override
-    public ActionArgumentContext createProposedArgumentInteractionContext(final AuthenticationSession session, final InteractionInvocationMethod invocationMethod, final ObjectAdapter targetObject, final ObjectAdapter[] proposedArguments, final int position) {
-        return new ActionArgumentContext(getDeploymentCategory(), getAuthenticationSession(), invocationMethod, targetObject, getIdentifier(), proposedArguments, position);
+    public ActionArgumentContext createProposedArgumentInteractionContext(
+            final ObjectAdapter targetObject,
+            final ObjectAdapter[] proposedArguments,
+            final int position,
+            final InteractionInitiatedBy interactionInitiatedBy) {
+        return new ActionArgumentContext(getDeploymentCategory(), getAuthenticationSession(), interactionInitiatedBy, targetObject, getIdentifier(), proposedArguments, position);
     }
 
     @Override
-    public String isValid(final ObjectAdapter adapter, final Object proposedValue, final Localization localization) {
+    public String isValid(
+            final ObjectAdapter adapter,
+            final Object proposedValue,
+            final InteractionInitiatedBy interactionInitiatedBy,
+            final Localization localization) {
         
         ObjectAdapter proposedValueAdapter = null;
         ObjectSpecification proposedValueSpec;
@@ -438,7 +458,9 @@ public abstract class ObjectActionParameterAbstract implements ObjectActionParam
             proposedValueAdapter = getAdapterMap().adapterFor(proposedValue);
             proposedValueSpec = proposedValueAdapter.getSpecification();
             if(!proposedValueSpec.isOfType(proposedValueSpec)) {
-                proposedValueAdapter = doCoerceProposedValue(adapter, proposedValue, localization);
+                proposedValueAdapter = doCoerceProposedValue(adapter, proposedValue, interactionInitiatedBy,
+                        localization
+                );
             }
             
             // check has been coerced into correct type; otherwise give up
@@ -450,9 +472,11 @@ public abstract class ObjectActionParameterAbstract implements ObjectActionParam
                 return null;
             }
         }
-        
 
-        final ValidityContext<?> ic = createProposedArgumentInteractionContext(getAuthenticationSession(), InteractionInvocationMethod.BY_USER, adapter, arguments(proposedValueAdapter), getNumber());
+        final ObjectAdapter[] argumentAdapters = arguments(proposedValueAdapter);
+        final ValidityContext<?> ic = createProposedArgumentInteractionContext(
+                adapter, argumentAdapters, getNumber(), interactionInitiatedBy
+        );
 
         final InteractionResultSet buf = new InteractionResultSet();
         InteractionUtils.isValidResultSet(this, ic, buf);
@@ -466,7 +490,11 @@ public abstract class ObjectActionParameterAbstract implements ObjectActionParam
     /**
      * Optional hook for parsing.
      */
-    protected ObjectAdapter doCoerceProposedValue(ObjectAdapter adapter, Object proposedValue, final Localization localization) {
+    protected ObjectAdapter doCoerceProposedValue(
+            final ObjectAdapter adapter,
+            final Object proposedValue,
+            final InteractionInitiatedBy interactionInitiatedBy,
+            final Localization localization) {
         return null;
     }
 

http://git-wip-us.apache.org/repos/asf/isis/blob/d120bf74/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectActionParameterParseable.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectActionParameterParseable.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectActionParameterParseable.java
index 626b362..e58fcbb 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectActionParameterParseable.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectActionParameterParseable.java
@@ -22,6 +22,7 @@ package org.apache.isis.core.metamodel.specloader.specimpl;
 import org.apache.isis.applib.profiles.Localization;
 import org.apache.isis.core.metamodel.adapter.MutableProposedHolder;
 import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
+import org.apache.isis.core.metamodel.consent.InteractionInitiatedBy;
 import org.apache.isis.core.metamodel.facetapi.FeatureType;
 import org.apache.isis.core.metamodel.facets.TypedHolder;
 import org.apache.isis.core.metamodel.facets.objectvalue.maxlen.MaxLengthFacet;
@@ -63,7 +64,11 @@ public class ObjectActionParameterParseable extends ObjectActionParameterAbstrac
         return facet.value();
     }
     
-    protected ObjectAdapter doCoerceProposedValue(ObjectAdapter adapter, Object proposedValue, final Localization localization) {
+    protected ObjectAdapter doCoerceProposedValue(
+            final ObjectAdapter adapter,
+            final Object proposedValue,
+            final InteractionInitiatedBy interactionInitiatedBy,
+            final Localization localization) {
         // try to parse
         if (!(proposedValue instanceof String)) {
             return null;
@@ -73,7 +78,9 @@ public class ObjectActionParameterParseable extends ObjectActionParameterAbstrac
         final ObjectSpecification parameterSpecification = getSpecification();
         final ParseableFacet p = parameterSpecification.getFacet(ParseableFacet.class);
         try {
-            final ObjectAdapter parsedAdapter = p.parseTextEntry(null, proposedString, localization);
+            final ObjectAdapter parsedAdapter = p.parseTextEntry(null, proposedString, interactionInitiatedBy,
+                    localization
+            );
             return parsedAdapter;
         } catch(Exception ex) {
             return null;
@@ -101,7 +108,7 @@ public class ObjectActionParameterParseable extends ObjectActionParameterAbstrac
      * {@link ObjectAdapter}.
      */
     @Override
-    public ObjectAdapter get(final ObjectAdapter owner) {
+    public ObjectAdapter get(final ObjectAdapter owner, final InteractionInitiatedBy interactionInitiatedBy) {
         final MutableProposedHolder proposedHolder = getProposedHolder(owner);
         final Object proposed = proposedHolder.getProposed();
         return getAdapterMap().adapterFor(proposed);

http://git-wip-us.apache.org/repos/asf/isis/blob/d120bf74/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectActionParameterParseableContributee.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectActionParameterParseableContributee.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectActionParameterParseableContributee.java
index ccd2f51..5e282f2 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectActionParameterParseableContributee.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectActionParameterParseableContributee.java
@@ -21,6 +21,7 @@ import java.util.List;
 import org.apache.isis.core.commons.authentication.AuthenticationSession;
 import org.apache.isis.core.commons.lang.ListExtensions;
 import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
+import org.apache.isis.core.metamodel.consent.InteractionInitiatedBy;
 import org.apache.isis.core.metamodel.deployment.DeploymentCategory;
 import org.apache.isis.core.metamodel.spec.feature.ObjectActionParameter;
 
@@ -62,10 +63,11 @@ public class ObjectActionParameterParseableContributee extends ObjectActionParam
     public ObjectAdapter[] getAutoComplete(
             final ObjectAdapter adapter,
             final String searchArg,
-            final AuthenticationSession authenticationSession,
-            final DeploymentCategory deploymentCategory) {
-        return serviceActionParameter.getAutoComplete(serviceAdapter, searchArg, authenticationSession,
-                deploymentCategory);
+            final InteractionInitiatedBy interactionInitiatedBy) {
+        final AuthenticationSession authenticationSession = getAuthenticationSession();
+        final DeploymentCategory deploymentCategory = serviceAction.getDeploymentCategory();
+        return serviceActionParameter.getAutoComplete(serviceAdapter, searchArg,
+                interactionInitiatedBy);
     }
 
     protected ObjectAdapter targetForDefaultOrChoices(ObjectAdapter adapter, final List<ObjectAdapter> argumentsIfAvailable) {

http://git-wip-us.apache.org/repos/asf/isis/blob/d120bf74/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectAssociationAbstract.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectAssociationAbstract.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectAssociationAbstract.java
index 41b6d6a..03a81e9 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectAssociationAbstract.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectAssociationAbstract.java
@@ -21,6 +21,7 @@ package org.apache.isis.core.metamodel.specloader.specimpl;
 
 import org.apache.isis.core.commons.exceptions.NotYetImplementedException;
 import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
+import org.apache.isis.core.metamodel.consent.InteractionInitiatedBy;
 import org.apache.isis.core.metamodel.facetapi.FeatureType;
 import org.apache.isis.core.metamodel.facets.FacetedMethod;
 import org.apache.isis.core.metamodel.facets.objectvalue.mandatory.MandatoryFacet;
@@ -44,7 +45,9 @@ public abstract class ObjectAssociationAbstract extends ObjectMemberAbstract imp
     }
 
     @Override
-    public abstract ObjectAdapter get(final ObjectAdapter fromObject);
+    public abstract ObjectAdapter get(
+            final ObjectAdapter fromObject,
+            final InteractionInitiatedBy interactionInitiatedBy);
 
     /**
      * Return the specification of the object (or objects) that this field
@@ -74,7 +77,7 @@ public abstract class ObjectAssociationAbstract extends ObjectMemberAbstract imp
     }
 
     @Override
-    public abstract boolean isEmpty(final ObjectAdapter adapter);
+    public abstract boolean isEmpty(final ObjectAdapter adapter, final InteractionInitiatedBy interactionInitiatedBy);
 
     @Override
     public boolean isOneToOneAssociation() {

http://git-wip-us.apache.org/repos/asf/isis/blob/d120bf74/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectMemberAbstract.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectMemberAbstract.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectMemberAbstract.java
index 1322d5d..d7d53d3 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectMemberAbstract.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectMemberAbstract.java
@@ -32,7 +32,7 @@ import org.apache.isis.core.metamodel.adapter.QuerySubmitter;
 import org.apache.isis.core.metamodel.adapter.ServicesProvider;
 import org.apache.isis.core.metamodel.adapter.mgr.AdapterManager;
 import org.apache.isis.core.metamodel.consent.Consent;
-import org.apache.isis.core.metamodel.consent.InteractionInvocationMethod;
+import org.apache.isis.core.metamodel.consent.InteractionInitiatedBy;
 import org.apache.isis.core.metamodel.consent.InteractionResult;
 import org.apache.isis.core.metamodel.deployment.DeploymentCategory;
 import org.apache.isis.core.metamodel.facetapi.Facet;
@@ -209,6 +209,23 @@ public abstract class ObjectMemberAbstract implements ObjectMember {
     // Hidden (or visible)
     // /////////////////////////////////////////////////////////////
 
+    /**
+     * Create an {@link InteractionContext} to represent an attempt to view this
+     * member (that is, to check if it is visible or not).
+     *
+     * <p>
+     * Typically it is easier to just call
+     * {@link ObjectMember#isVisible(ObjectAdapter, InteractionInitiatedBy, Where)}; this is
+     * provided as API for symmetry with interactions (such as
+     * {@link AccessContext} accesses) have no corresponding vetoing methods.
+     */
+     protected abstract VisibilityContext<?> createVisibleInteractionContext(
+             final ObjectAdapter targetObjectAdapter,
+             final InteractionInitiatedBy interactionInitiatedBy,
+             final Where where);
+
+
+
     @Override
     public boolean isAlwaysHidden() {
         final HiddenFacet facet = getFacet(HiddenFacet.class);
@@ -223,18 +240,20 @@ public abstract class ObjectMemberAbstract implements ObjectMember {
     /**
      * Loops over all {@link HidingInteractionAdvisor} {@link Facet}s and
      * returns <tt>true</tt> only if none hide the member.
-     * 
-     * <p>
-     * TODO: currently this method is hard-coded to assume all interactions are
-     * initiated {@link InteractionInvocationMethod#BY_USER by user}.
      */
     @Override
-    public Consent isVisible(final AuthenticationSession session, final ObjectAdapter target, Where where) {
-        return isVisibleResult(session, target, where).createConsent();
-    }
-
-    private InteractionResult isVisibleResult(final AuthenticationSession session, final ObjectAdapter target, Where where) {
-        final VisibilityContext<?> ic = createVisibleInteractionContext(session, InteractionInvocationMethod.BY_USER, target, where);
+    public Consent isVisible(
+            final ObjectAdapter target,
+            final InteractionInitiatedBy interactionInitiatedBy,
+            final Where where) {
+        return isVisibleResult(target, interactionInitiatedBy, where).createConsent();
+    }
+
+    private InteractionResult isVisibleResult(
+            final ObjectAdapter target,
+            final InteractionInitiatedBy interactionInitiatedBy,
+            final Where where) {
+        final VisibilityContext<?> ic = createVisibleInteractionContext(target, interactionInitiatedBy, where);
         return InteractionUtils.isVisibleResult(this, ic);
     }
 
@@ -243,20 +262,37 @@ public abstract class ObjectMemberAbstract implements ObjectMember {
     // /////////////////////////////////////////////////////////////
 
     /**
+     * Create an {@link InteractionContext} to represent an attempt to
+     * use this member (that is, to check if it is usable or not).
+     *
+     * <p>
+     * Typically it is easier to just call
+     * {@link ObjectMember#isUsable(ObjectAdapter, InteractionInitiatedBy, Where)}; this is
+     * provided as API for symmetry with interactions (such as
+     * {@link AccessContext} accesses) have no corresponding vetoing methods.
+     */
+    protected abstract UsabilityContext<?> createUsableInteractionContext(
+            final ObjectAdapter target,
+            final InteractionInitiatedBy interactionInitiatedBy,
+            final Where where);
+
+    /**
      * Loops over all {@link DisablingInteractionAdvisor} {@link Facet}s and
      * returns <tt>true</tt> only if none disables the member.
-     * 
-     * <p>
-     * TODO: currently this method is hard-coded to assume all interactions are
-     * initiated {@link InteractionInvocationMethod#BY_USER by user}.
      */
     @Override
-    public Consent isUsable(final AuthenticationSession session, final ObjectAdapter target, Where where) {
-        return isUsableResult(session, target, where).createConsent();
-    }
-
-    private InteractionResult isUsableResult(final AuthenticationSession session, final ObjectAdapter target, Where where) {
-        final UsabilityContext<?> ic = createUsableInteractionContext(session, InteractionInvocationMethod.BY_USER, target, where);
+    public Consent isUsable(
+            final ObjectAdapter target,
+            final InteractionInitiatedBy interactionInitiatedBy,
+            final Where where) {
+        return isUsableResult(target, interactionInitiatedBy, where).createConsent();
+    }
+
+    private InteractionResult isUsableResult(
+            final ObjectAdapter target,
+            final InteractionInitiatedBy interactionInitiatedBy,
+            final Where where) {
+        final UsabilityContext<?> ic = createUsableInteractionContext(target, interactionInitiatedBy, where);
         return InteractionUtils.isUsableResult(this, ic);
     }