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/08/28 19:16:04 UTC

[04/12] isis git commit: ISIS-1044: introducing interaction contexts - analogous to those visibility/usability/validity checking, for accessing properties, collections, invoking actions; also action prompt (for choices and autoComplete).

http://git-wip-us.apache.org/repos/asf/isis/blob/4ac11bbc/core/viewer-restfulobjects-rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/domainobjects/ObjectPropertyReprRenderer.java
----------------------------------------------------------------------
diff --git a/core/viewer-restfulobjects-rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/domainobjects/ObjectPropertyReprRenderer.java b/core/viewer-restfulobjects-rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/domainobjects/ObjectPropertyReprRenderer.java
index c003978..6a86ffc 100644
--- a/core/viewer-restfulobjects-rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/domainobjects/ObjectPropertyReprRenderer.java
+++ b/core/viewer-restfulobjects-rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/domainobjects/ObjectPropertyReprRenderer.java
@@ -26,6 +26,7 @@ import org.apache.isis.applib.annotation.Render.Type;
 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.InteractionInvocationMethod;
 import org.apache.isis.core.metamodel.deployment.DeploymentCategory;
 import org.apache.isis.core.metamodel.facetapi.Facet;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
@@ -34,6 +35,7 @@ import org.apache.isis.core.metamodel.facets.object.title.TitleFacet;
 import org.apache.isis.core.metamodel.facets.object.value.ValueFacet;
 import org.apache.isis.core.metamodel.facets.value.bigdecimal.BigDecimalValueFacet;
 import org.apache.isis.core.metamodel.facets.value.biginteger.BigIntegerValueFacet;
+import org.apache.isis.core.metamodel.interactions.PropertyAccessingContext;
 import org.apache.isis.core.metamodel.spec.ObjectSpecification;
 import org.apache.isis.core.metamodel.spec.feature.OneToOneAssociation;
 import org.apache.isis.core.runtime.system.DeploymentType;
@@ -47,6 +49,8 @@ import org.apache.isis.viewer.restfulobjects.rendering.domaintypes.PropertyDescr
 
 public class ObjectPropertyReprRenderer extends AbstractObjectMemberReprRenderer<ObjectPropertyReprRenderer, OneToOneAssociation> {
 
+    private final PropertyAccessingContext propertyAccessingContext;
+
     public ObjectPropertyReprRenderer(
             final RendererContext resourceContext) {
         this(resourceContext, null, null, JsonRepresentation.newMap());
@@ -58,6 +62,9 @@ public class ObjectPropertyReprRenderer extends AbstractObjectMemberReprRenderer
             final String propertyId,
             final JsonRepresentation representation) {
         super(resourceContext, linkFollower, propertyId, RepresentationType.OBJECT_PROPERTY, representation, Where.OBJECT_FORMS);
+
+        propertyAccessingContext = objectMember.createAccessingInteractionContext(getRendererContext().getAuthenticationSession(),
+                InteractionInvocationMethod.BY_USER, objectAdapter);
     }
 
     @Override
@@ -81,7 +88,7 @@ public class ObjectPropertyReprRenderer extends AbstractObjectMemberReprRenderer
     // ///////////////////////////////////////////////////
 
     private Object addValue() {
-        final ObjectAdapter valueAdapter = objectMember.get(objectAdapter);
+        final ObjectAdapter valueAdapter = objectMember.get(objectAdapter, propertyAccessingContext);
         
         // use the runtime type if we have a value, else the compile time type of the member otherwise
         final ObjectSpecification spec = valueAdapter != null? valueAdapter.getSpecification(): objectMember.getSpecification();
@@ -205,7 +212,8 @@ public class ObjectPropertyReprRenderer extends AbstractObjectMemberReprRenderer
         final DeploymentType deploymentType = determineDeploymentTypeFrom(rendererContext);
         final DeploymentCategory deploymentCategory = deploymentType.getDeploymentCategory();
         final ObjectAdapter[] choiceAdapters =
-                objectMember.getChoices(objectAdapter, authenticationSession, deploymentCategory);
+                objectMember.getChoices(propertyAccessingContext, objectAdapter, authenticationSession, deploymentCategory
+                );
         if (choiceAdapters == null || choiceAdapters.length == 0) {
             return null;
         }

http://git-wip-us.apache.org/repos/asf/isis/blob/4ac11bbc/core/viewer-restfulobjects-server/src/main/java/org/apache/isis/viewer/restfulobjects/server/resources/DomainObjectResourceServerside.java
----------------------------------------------------------------------
diff --git a/core/viewer-restfulobjects-server/src/main/java/org/apache/isis/viewer/restfulobjects/server/resources/DomainObjectResourceServerside.java b/core/viewer-restfulobjects-server/src/main/java/org/apache/isis/viewer/restfulobjects/server/resources/DomainObjectResourceServerside.java
index 3c7b039..1e11643 100644
--- a/core/viewer-restfulobjects-server/src/main/java/org/apache/isis/viewer/restfulobjects/server/resources/DomainObjectResourceServerside.java
+++ b/core/viewer-restfulobjects-server/src/main/java/org/apache/isis/viewer/restfulobjects/server/resources/DomainObjectResourceServerside.java
@@ -34,6 +34,9 @@ import org.apache.isis.applib.annotation.Where;
 import org.apache.isis.core.commons.url.UrlEncodingUtils;
 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.CollectionAccessingContext;
+import org.apache.isis.core.metamodel.interactions.PropertyAccessingContext;
 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;
@@ -222,7 +225,10 @@ public class DomainObjectResourceServerside extends ResourceAbstract implements
             throw RestfulObjectsApplicationException.createWithMessage(HttpStatusCode.UNAUTHORIZED, consent.getReason());
         }
 
-        property.set(objectAdapter, argAdapter);
+        final PropertyAccessingContext propertyAccessingContext = property
+                .createAccessingInteractionContext(getAuthenticationSession(), InteractionInvocationMethod.BY_USER,
+                        objectAdapter);
+        property.set(propertyAccessingContext, objectAdapter, argAdapter);
 
         return helper.propertyDetails(
                 propertyId,
@@ -253,7 +259,10 @@ public class DomainObjectResourceServerside extends ResourceAbstract implements
             throw RestfulObjectsApplicationException.createWithMessage(HttpStatusCode.UNAUTHORIZED, consent.getReason());
         }
 
-        property.set(objectAdapter, null);
+        final PropertyAccessingContext propertyAccessingContext = property
+                .createAccessingInteractionContext(getAuthenticationSession(), InteractionInvocationMethod.BY_USER,
+                        objectAdapter);
+        property.set(propertyAccessingContext, objectAdapter, null);
 
         return helper.propertyDetails(
                 propertyId,
@@ -318,7 +327,10 @@ public class DomainObjectResourceServerside extends ResourceAbstract implements
             throw RestfulObjectsApplicationException.createWithMessage(HttpStatusCode.UNAUTHORIZED, consent.getReason());
         }
 
-        collection.addElement(objectAdapter, argAdapter);
+        final CollectionAccessingContext collectionAccessingContext = collection
+                .createAccessingInteractionContext(getAuthenticationSession(), InteractionInvocationMethod.BY_USER,
+                        objectAdapter);
+        collection.addElement(collectionAccessingContext, objectAdapter, argAdapter);
 
         return helper.collectionDetails(collectionId, MemberReprMode.WRITE);
     }
@@ -354,7 +366,11 @@ public class DomainObjectResourceServerside extends ResourceAbstract implements
             throw RestfulObjectsApplicationException.createWithMessage(HttpStatusCode.UNAUTHORIZED, consent.getReason());
         }
 
-        collection.addElement(objectAdapter, argAdapter);
+        final CollectionAccessingContext collectionAccessingContext = collection
+                .createAccessingInteractionContext(getAuthenticationSession(), InteractionInvocationMethod.BY_USER,
+                        objectAdapter);
+
+        collection.addElement(collectionAccessingContext, objectAdapter, argAdapter);
 
         return helper.collectionDetails(collectionId, MemberReprMode.WRITE);
     }
@@ -385,7 +401,10 @@ public class DomainObjectResourceServerside extends ResourceAbstract implements
             throw RestfulObjectsApplicationException.createWithMessage(HttpStatusCode.UNAUTHORIZED, consent.getReason());
         }
 
-        collection.removeElement(objectAdapter, argAdapter);
+        final CollectionAccessingContext collectionAccessingContext = collection
+                .createAccessingInteractionContext(getAuthenticationSession(), InteractionInvocationMethod.BY_USER,
+                        objectAdapter);
+        collection.removeElement(collectionAccessingContext, objectAdapter, argAdapter);
 
         return helper.collectionDetails(collectionId, MemberReprMode.WRITE);
     }

http://git-wip-us.apache.org/repos/asf/isis/blob/4ac11bbc/core/viewer-restfulobjects-server/src/main/java/org/apache/isis/viewer/restfulobjects/server/resources/DomainResourceHelper.java
----------------------------------------------------------------------
diff --git a/core/viewer-restfulobjects-server/src/main/java/org/apache/isis/viewer/restfulobjects/server/resources/DomainResourceHelper.java b/core/viewer-restfulobjects-server/src/main/java/org/apache/isis/viewer/restfulobjects/server/resources/DomainResourceHelper.java
index 8d4fe5b..091509c 100644
--- a/core/viewer-restfulobjects-server/src/main/java/org/apache/isis/viewer/restfulobjects/server/resources/DomainResourceHelper.java
+++ b/core/viewer-restfulobjects-server/src/main/java/org/apache/isis/viewer/restfulobjects/server/resources/DomainResourceHelper.java
@@ -28,6 +28,8 @@ import org.apache.isis.core.commons.authentication.AuthenticationSession;
 import org.apache.isis.core.commons.config.IsisConfiguration;
 import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
 import org.apache.isis.core.metamodel.adapter.mgr.AdapterManager;
+import org.apache.isis.core.metamodel.consent.InteractionInvocationMethod;
+import org.apache.isis.core.metamodel.interactions.ActionExecutingContext;
 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;
@@ -324,7 +326,10 @@ public class DomainResourceHelper {
 
         // invoke
         final ObjectAdapter[] argArray2 = argAdapters.toArray(new ObjectAdapter[0]);
-        final ObjectAdapter returnedAdapter = action.execute(objectAdapter, argArray2);
+        final ActionExecutingContext actionExecutingContext =
+                action.createExecutingInteractionContext(rendererContext.getAuthenticationSession(),
+                    InteractionInvocationMethod.BY_USER, objectAdapter, argArray2);
+        final ObjectAdapter returnedAdapter = action.execute(actionExecutingContext, objectAdapter, argArray2);
 
         final ObjectAndActionInvocation objectAndActionInvocation =
                 new ObjectAndActionInvocation(this.objectAdapter, action, arguments, returnedAdapter);

http://git-wip-us.apache.org/repos/asf/isis/blob/4ac11bbc/core/viewer-restfulobjects-server/src/main/java/org/apache/isis/viewer/restfulobjects/server/resources/ObjectAdapterUpdateHelper.java
----------------------------------------------------------------------
diff --git a/core/viewer-restfulobjects-server/src/main/java/org/apache/isis/viewer/restfulobjects/server/resources/ObjectAdapterUpdateHelper.java b/core/viewer-restfulobjects-server/src/main/java/org/apache/isis/viewer/restfulobjects/server/resources/ObjectAdapterUpdateHelper.java
index 4b41b3c..7f6ddb4 100644
--- a/core/viewer-restfulobjects-server/src/main/java/org/apache/isis/viewer/restfulobjects/server/resources/ObjectAdapterUpdateHelper.java
+++ b/core/viewer-restfulobjects-server/src/main/java/org/apache/isis/viewer/restfulobjects/server/resources/ObjectAdapterUpdateHelper.java
@@ -19,6 +19,8 @@ package org.apache.isis.viewer.restfulobjects.server.resources;
 import java.util.List;
 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.PropertyAccessingContext;
 import org.apache.isis.core.metamodel.spec.ObjectSpecification;
 import org.apache.isis.core.metamodel.spec.feature.Contributed;
 import org.apache.isis.core.metamodel.spec.feature.ObjectAssociation;
@@ -130,7 +132,10 @@ public class ObjectAdapterUpdateHelper {
                 final Consent validity = property.isAssociationValid(objectAdapter, valueAdapter);
                 if (validity.isAllowed()) {
                     try {
-                        property.set(objectAdapter, valueAdapter);
+                        final PropertyAccessingContext propertyAccessingContext = property
+                                .createAccessingInteractionContext(resourceContext.getAuthenticationSession(),
+                                        InteractionInvocationMethod.BY_USER, objectAdapter);
+                        property.set(propertyAccessingContext, objectAdapter, valueAdapter);
                     } catch (final IllegalArgumentException ex) {
                         propertyRepr.mapPut("invalidReason", ex.getMessage());
                         allOk = false;

http://git-wip-us.apache.org/repos/asf/isis/blob/4ac11bbc/core/viewer-wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/models/ActionModel.java
----------------------------------------------------------------------
diff --git a/core/viewer-wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/models/ActionModel.java b/core/viewer-wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/models/ActionModel.java
index 8dfff3d..d216225 100644
--- a/core/viewer-wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/models/ActionModel.java
+++ b/core/viewer-wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/models/ActionModel.java
@@ -59,8 +59,10 @@ import org.apache.isis.core.metamodel.adapter.oid.OidMarshaller;
 import org.apache.isis.core.metamodel.adapter.oid.RootOid;
 import org.apache.isis.core.metamodel.adapter.oid.RootOidDefault;
 import org.apache.isis.core.metamodel.consent.Consent;
+import org.apache.isis.core.metamodel.consent.InteractionInvocationMethod;
 import org.apache.isis.core.metamodel.facets.object.bookmarkpolicy.BookmarkPolicyFacet;
 import org.apache.isis.core.metamodel.facets.object.encodeable.EncodableFacet;
+import org.apache.isis.core.metamodel.interactions.ActionExecutingContext;
 import org.apache.isis.core.metamodel.interactions.InteractionUtils;
 import org.apache.isis.core.metamodel.spec.ActionType;
 import org.apache.isis.core.metamodel.spec.ObjectSpecId;
@@ -466,12 +468,16 @@ public class ActionModel extends BookmarkableModel<ObjectAdapter> {
         final ObjectAction action = getActionMemento().getAction();
 
         final AuthenticationSession session = getAuthenticationSession();
+
+        final ActionExecutingContext actionExecutingContext = action
+                .createExecutingInteractionContext(session, InteractionInvocationMethod.BY_USER, targetAdapter,
+                        arguments);
         final ObjectAdapter resultAdapter =
                 InteractionUtils.withFiltering(new Callable<ObjectAdapter>() {
                     @Override public ObjectAdapter call() throws Exception {
                         return action
                                 .executeWithRuleChecking(
-                                        targetAdapter, arguments, session,
+                                        actionExecutingContext, targetAdapter, arguments, session,
                                         WHERE_FOR_ACTION_INVOCATION);
                     }
                 });

http://git-wip-us.apache.org/repos/asf/isis/blob/4ac11bbc/core/viewer-wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/models/BookmarkTreeNode.java
----------------------------------------------------------------------
diff --git a/core/viewer-wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/models/BookmarkTreeNode.java b/core/viewer-wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/models/BookmarkTreeNode.java
index d695a4c..19d9d26 100644
--- a/core/viewer-wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/models/BookmarkTreeNode.java
+++ b/core/viewer-wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/models/BookmarkTreeNode.java
@@ -26,12 +26,17 @@ import com.google.common.base.Objects;
 import com.google.common.collect.Lists;
 
 import org.apache.wicket.request.mapper.parameter.PageParameters;
+
+import org.apache.isis.core.commons.authentication.AuthenticationSession;
 import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
 import org.apache.isis.core.metamodel.adapter.oid.Oid;
 import org.apache.isis.core.metamodel.adapter.oid.OidMarshaller;
 import org.apache.isis.core.metamodel.adapter.oid.RootOid;
+import org.apache.isis.core.metamodel.consent.InteractionInvocationMethod;
+import org.apache.isis.core.metamodel.interactions.PropertyAccessingContext;
 import org.apache.isis.core.metamodel.spec.feature.Contributed;
 import org.apache.isis.core.metamodel.spec.feature.ObjectAssociation;
+import org.apache.isis.core.metamodel.spec.feature.OneToOneAssociation;
 import org.apache.isis.core.runtime.system.context.IsisContext;
 import org.apache.isis.viewer.wicket.model.mementos.PageParameterNames;
 
@@ -156,7 +161,7 @@ public class BookmarkTreeNode implements Serializable {
             }
             
             if(!inGraph) {
-                inGraph = addToGraphIfParented(candidateEntityModel);
+                inGraph = addToGraphIfParented(candidateEntityModel, candidateEntityModel.getAuthenticationSession());
             }
         }
         return inGraph;
@@ -192,7 +197,9 @@ public class BookmarkTreeNode implements Serializable {
 		return true;
 	}
 
-    private boolean addToGraphIfParented(BookmarkableModel<?> candidateBookmarkableModel) {
+    private boolean addToGraphIfParented(
+            final BookmarkableModel<?> candidateBookmarkableModel,
+            final AuthenticationSession authenticationSession) {
         
         boolean whetherAdded = false;
         // TODO: this ought to be move into a responsibility of BookmarkableModel, perhaps, rather than downcasting
@@ -201,7 +208,14 @@ public class BookmarkTreeNode implements Serializable {
             final ObjectAdapter candidateAdapter = entityModel.getObject();
             final List<ObjectAssociation> properties = candidateAdapter.getSpecification().getAssociations(Contributed.EXCLUDED, ObjectAssociation.Filters.REFERENCE_PROPERTIES);
             for (ObjectAssociation objectAssoc : properties) {
-                final ObjectAdapter possibleParentAdapter = objectAssoc.get(candidateAdapter);
+
+                OneToOneAssociation property = (OneToOneAssociation) objectAssoc;
+                final PropertyAccessingContext propertyAccessingContext = property
+                        .createAccessingInteractionContext(authenticationSession, InteractionInvocationMethod.BY_USER,
+                                candidateAdapter);
+
+                final ObjectAdapter possibleParentAdapter = objectAssoc.get(candidateAdapter,
+                        propertyAccessingContext);
                 if(possibleParentAdapter == null) {
                     continue;
                 } 

http://git-wip-us.apache.org/repos/asf/isis/blob/4ac11bbc/core/viewer-wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/models/EntityCollectionModel.java
----------------------------------------------------------------------
diff --git a/core/viewer-wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/models/EntityCollectionModel.java b/core/viewer-wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/models/EntityCollectionModel.java
index 27d783d..bbc8923 100644
--- a/core/viewer-wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/models/EntityCollectionModel.java
+++ b/core/viewer-wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/models/EntityCollectionModel.java
@@ -35,9 +35,11 @@ import org.apache.isis.core.commons.lang.IterableExtensions;
 import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
 import org.apache.isis.core.metamodel.adapter.mgr.AdapterManager;
 import org.apache.isis.core.metamodel.adapter.mgr.AdapterManager.ConcurrencyChecking;
+import org.apache.isis.core.metamodel.consent.InteractionInvocationMethod;
 import org.apache.isis.core.metamodel.facets.collections.sortedby.SortedByFacet;
 import org.apache.isis.core.metamodel.facets.object.paged.PagedFacet;
 import org.apache.isis.core.metamodel.facets.object.plural.PluralFacet;
+import org.apache.isis.core.metamodel.interactions.CollectionAccessingContext;
 import org.apache.isis.core.metamodel.interactions.InteractionUtils;
 import org.apache.isis.core.metamodel.services.ServicesInjectorSpi;
 import org.apache.isis.core.metamodel.spec.ObjectSpecification;
@@ -105,13 +107,16 @@ public class EntityCollectionModel extends ModelAbstract<List<ObjectAdapter>> im
             List<ObjectAdapter> load(final EntityCollectionModel entityCollectionModel) {
                 final ObjectAdapter adapter = entityCollectionModel.parentObjectAdapterMemento.getObjectAdapter(ConcurrencyChecking.NO_CHECK);
                 final OneToManyAssociation collection = entityCollectionModel.collectionMemento.getCollection();
+                final CollectionAccessingContext collectionAccessingContext = collection
+                        .createAccessingInteractionContext(entityCollectionModel.getAuthenticationSession(),
+                                InteractionInvocationMethod.BY_USER, adapter);
                 final ObjectAdapter collectionAsAdapter =
                         InteractionUtils.withFiltering(
                                 new Callable<ObjectAdapter>() {
                                     @Override
                                     public ObjectAdapter call() throws Exception {
-                                        return collection.get(adapter);
-                                   }
+                                        return collection.get(adapter, collectionAccessingContext);
+                                    }
                                 });
 
                 final List<Object> objectList = asIterable(collectionAsAdapter);

http://git-wip-us.apache.org/repos/asf/isis/blob/4ac11bbc/core/viewer-wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/models/EntityModel.java
----------------------------------------------------------------------
diff --git a/core/viewer-wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/models/EntityModel.java b/core/viewer-wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/models/EntityModel.java
index a2c0f47..69e7436 100644
--- a/core/viewer-wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/models/EntityModel.java
+++ b/core/viewer-wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/models/EntityModel.java
@@ -35,10 +35,12 @@ import org.apache.isis.core.metamodel.adapter.oid.OidMarshaller;
 import org.apache.isis.core.metamodel.adapter.oid.RootOid;
 import org.apache.isis.core.metamodel.adapter.version.ConcurrencyException;
 import org.apache.isis.core.metamodel.consent.Consent;
+import org.apache.isis.core.metamodel.consent.InteractionInvocationMethod;
 import org.apache.isis.core.metamodel.facets.members.disabled.DisabledFacet;
 import org.apache.isis.core.metamodel.facets.object.bookmarkpolicy.BookmarkPolicyFacet;
 import org.apache.isis.core.metamodel.facets.object.viewmodel.ViewModelFacet;
 import org.apache.isis.core.metamodel.interactions.InteractionUtils;
+import org.apache.isis.core.metamodel.interactions.PropertyAccessingContext;
 import org.apache.isis.core.metamodel.spec.ObjectSpecId;
 import org.apache.isis.core.metamodel.spec.ObjectSpecification;
 import org.apache.isis.core.metamodel.spec.ObjectSpecifications.MemberGroupLayoutHint;
@@ -383,7 +385,11 @@ public class EntityModel extends BookmarkableModel<ObjectAdapter> {
             final ObjectAdapter associatedAdapter =
                     InteractionUtils.withFiltering(new Callable<ObjectAdapter>() {
                         @Override public ObjectAdapter call() throws Exception {
-                            return  pm.getProperty().get(adapter);
+                            final OneToOneAssociation property = pm.getProperty();
+                            final PropertyAccessingContext propertyAccessingContext = property
+                                    .createAccessingInteractionContext(getAuthenticationSession(),
+                                            InteractionInvocationMethod.BY_USER, adapter);
+                            return property.get(adapter, propertyAccessingContext);
                         }
                     });
             scalarModel.setObject(associatedAdapter);
@@ -529,7 +535,10 @@ public class EntityModel extends BookmarkableModel<ObjectAdapter> {
             }
 
             final ObjectAdapter associate = scalarModel.getObject();
-            property.set(adapter, associate);
+            final PropertyAccessingContext propertyAccessingContext = property
+                    .createAccessingInteractionContext(getAuthenticationSession(), InteractionInvocationMethod.BY_USER,
+                            adapter);
+            property.set(propertyAccessingContext, adapter, associate);
         }
 
         final ViewModelFacet recreatableObjectFacet = adapter.getSpecification().getFacet(ViewModelFacet.class);

http://git-wip-us.apache.org/repos/asf/isis/blob/4ac11bbc/core/viewer-wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/models/ScalarModel.java
----------------------------------------------------------------------
diff --git a/core/viewer-wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/models/ScalarModel.java b/core/viewer-wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/models/ScalarModel.java
index f785260..a4a4466 100644
--- a/core/viewer-wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/models/ScalarModel.java
+++ b/core/viewer-wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/models/ScalarModel.java
@@ -37,6 +37,7 @@ import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
 import org.apache.isis.core.metamodel.adapter.mgr.AdapterManager.ConcurrencyChecking;
 import org.apache.isis.core.metamodel.adapter.version.ConcurrencyException;
 import org.apache.isis.core.metamodel.consent.Consent;
+import org.apache.isis.core.metamodel.consent.InteractionInvocationMethod;
 import org.apache.isis.core.metamodel.deployment.DeploymentCategory;
 import org.apache.isis.core.metamodel.facetapi.Facet;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
@@ -45,7 +46,10 @@ import org.apache.isis.core.metamodel.facets.objectvalue.mandatory.MandatoryFace
 import org.apache.isis.core.metamodel.facets.objectvalue.typicallen.TypicalLengthFacet;
 import org.apache.isis.core.metamodel.facets.value.bigdecimal.BigDecimalValueFacet;
 import org.apache.isis.core.metamodel.facets.value.string.StringValueSemanticsProvider;
+import org.apache.isis.core.metamodel.interactions.AccessContext;
+import org.apache.isis.core.metamodel.interactions.ActionPromptContext;
 import org.apache.isis.core.metamodel.interactions.InteractionUtils;
+import org.apache.isis.core.metamodel.interactions.PropertyAccessingContext;
 import org.apache.isis.core.metamodel.spec.ObjectSpecId;
 import org.apache.isis.core.metamodel.spec.ObjectSpecification;
 import org.apache.isis.core.metamodel.spec.feature.ObjectActionParameter;
@@ -109,7 +113,10 @@ public class ScalarModel extends EntityModel implements LinksProvider {
             }
 
             @Override
-            public String parseAndValidate(final ScalarModel scalarModel, final String proposedPojoAsStr) {
+            public String parseAndValidate(
+                    final AccessContext<?> accessContext,
+                    final ScalarModel scalarModel,
+                    final String proposedPojoAsStr) {
                 final OneToOneAssociation property = scalarModel.getPropertyMemento().getProperty();
                 ParseableFacet parseableFacet = property.getFacet(ParseableFacet.class);
                 if (parseableFacet == null) {
@@ -117,7 +124,9 @@ public class ScalarModel extends EntityModel implements LinksProvider {
                 }
                 try {
                     final ObjectAdapter parentAdapter = scalarModel.parentObjectAdapterMemento.getObjectAdapter(ConcurrencyChecking.CHECK);
-                    final ObjectAdapter currentValue = property.get(parentAdapter);
+                    final PropertyAccessingContext propertyAccessingContext = (PropertyAccessingContext) accessContext;
+                    final ObjectAdapter currentValue = property.get(parentAdapter,
+                            propertyAccessingContext);
                     final Localization localization = IsisContext.getLocalization();
                     final ObjectAdapter proposedAdapter = parseableFacet.parseTextEntry(currentValue, proposedPojoAsStr, localization);
                     final Consent valid = property.isAssociationValid(parentAdapter, proposedAdapter);
@@ -170,14 +179,19 @@ public class ScalarModel extends EntityModel implements LinksProvider {
                     final DeploymentCategory deploymentCategory) {
                 final PropertyMemento propertyMemento = scalarModel.getPropertyMemento();
                 final OneToOneAssociation property = propertyMemento.getProperty();
+                final ObjectAdapter parentAdapter = scalarModel.parentObjectAdapterMemento
+                        .getObjectAdapter(ConcurrencyChecking.NO_CHECK);
+
+                final PropertyAccessingContext propertyAccessingContext = property
+                        .createAccessingInteractionContext(authenticationSession, InteractionInvocationMethod.BY_USER,
+                                parentAdapter);
+
                 final ObjectAdapter[] choices =
                         InteractionUtils.withFiltering(new Callable<ObjectAdapter[]>() {
                             @Override
                             public ObjectAdapter[] call() throws Exception {
-                                ObjectAdapter parentAdapter = scalarModel.parentObjectAdapterMemento
-                                        .getObjectAdapter(ConcurrencyChecking.NO_CHECK);
                                 return property.getChoices(
-                                        parentAdapter,
+                                        propertyAccessingContext, parentAdapter,
                                         authenticationSession, deploymentCategory);
                             }
                         });
@@ -202,12 +216,17 @@ public class ScalarModel extends EntityModel implements LinksProvider {
                 final OneToOneAssociation property = propertyMemento.getProperty();
                 final ObjectAdapter parentAdapter =
                         scalarModel.parentObjectAdapterMemento.getObjectAdapter(ConcurrencyChecking.NO_CHECK);
+
+                final PropertyAccessingContext propertyAccessingContext = property
+                        .createAccessingInteractionContext(authenticationSession, InteractionInvocationMethod.BY_USER,
+                                parentAdapter);
+
                 final ObjectAdapter[] choices =
                         InteractionUtils.withFiltering(new Callable<ObjectAdapter[]>() {
                             @Override
                             public ObjectAdapter[] call() throws Exception {
                                 return property.getAutoComplete(
-                                        parentAdapter, searchArg,
+                                        propertyAccessingContext, parentAdapter, searchArg,
                                         authenticationSession, deploymentCategory);
                             }
                         });
@@ -273,11 +292,15 @@ public class ScalarModel extends EntityModel implements LinksProvider {
                 final OneToOneAssociation property = scalarModel.propertyMemento.getProperty();
                 final ObjectAdapter parentAdapter =
                         scalarModel.parentObjectAdapterMemento.getObjectAdapter(ConcurrencyChecking.CHECK);
+
+                final PropertyAccessingContext propertyAccessingContext = property
+                        .createAccessingInteractionContext(scalarModel.getAuthenticationSession(),
+                                InteractionInvocationMethod.BY_USER, parentAdapter);
                 final ObjectAdapter associatedAdapter =
                         InteractionUtils.withFiltering(new Callable<ObjectAdapter>() {
                             @Override
                             public ObjectAdapter call() throws Exception {
-                                return property.get(parentAdapter);
+                                return property.get(parentAdapter, propertyAccessingContext);
                             }
                         });
                 scalarModel.setObject(associatedAdapter);
@@ -319,7 +342,10 @@ public class ScalarModel extends EntityModel implements LinksProvider {
             }
 
             @Override
-            public String parseAndValidate(final ScalarModel scalarModel, final String proposedPojoAsStr) {
+            public String parseAndValidate(
+                    final AccessContext<?> accessContext,
+                    final ScalarModel scalarModel,
+                    final String proposedPojoAsStr) {
                 final ObjectActionParameter parameter = scalarModel.getParameterMemento().getActionParameter();
                 try {
                     final ObjectAdapter parentAdapter = scalarModel.parentObjectAdapterMemento.getObjectAdapter(ConcurrencyChecking.CHECK);
@@ -372,12 +398,17 @@ public class ScalarModel extends EntityModel implements LinksProvider {
                 final ObjectActionParameter actionParameter = parameterMemento.getActionParameter();
                 final ObjectAdapter parentAdapter =
                         scalarModel.parentObjectAdapterMemento.getObjectAdapter(ConcurrencyChecking.CHECK);
+
+                final ActionPromptContext actionPromptContext = actionParameter.getAction()
+                        .createPromptInteractionContext(authenticationSession, InteractionInvocationMethod.BY_USER,
+                                parentAdapter);
+
                 final ObjectAdapter[] choices =
                     InteractionUtils.withFiltering(new Callable<ObjectAdapter[]>() {
                         @Override
                         public ObjectAdapter[] call() throws Exception {
                             return actionParameter.getChoices(
-                                    parentAdapter, argumentsIfAvailable,
+                                    actionPromptContext, parentAdapter, argumentsIfAvailable,
                                     authenticationSession, deploymentCategory);
                         }
                     });
@@ -401,11 +432,16 @@ public class ScalarModel extends EntityModel implements LinksProvider {
 
                 final ObjectAdapter parentAdapter =
                         scalarModel.parentObjectAdapterMemento.getObjectAdapter(ConcurrencyChecking.NO_CHECK);
+
+                final ActionPromptContext actionPromptContext = actionParameter.getAction()
+                        .createPromptInteractionContext(authenticationSession, InteractionInvocationMethod.BY_USER,
+                                parentAdapter);
+
                 final ObjectAdapter[] choices =
                     InteractionUtils.withFiltering(new Callable<ObjectAdapter[]>() {
                         @Override public ObjectAdapter[] call() throws Exception {
                             return actionParameter.getAutoComplete(
-                                    parentAdapter, searchArg,
+                                    actionPromptContext, parentAdapter, searchArg,
                                     authenticationSession, deploymentCategory);
                         }
                     });
@@ -488,7 +524,10 @@ public class ScalarModel extends EntityModel implements LinksProvider {
 
         public abstract String disable(ScalarModel scalarModel, Where where);
 
-        public abstract String parseAndValidate(ScalarModel scalarModel, String proposedPojoAsStr);
+        public abstract String parseAndValidate(
+                final AccessContext<?> accessContext,
+                ScalarModel scalarModel,
+                String proposedPojoAsStr);
 
         public abstract String validate(ScalarModel scalarModel, ObjectAdapter proposedAdapter);
 
@@ -513,9 +552,10 @@ public class ScalarModel extends EntityModel implements LinksProvider {
 
         public abstract boolean hasAutoComplete(ScalarModel scalarModel);
         public abstract List<ObjectAdapter> getAutoComplete(
-                ScalarModel scalarModel,
-                String searchArg,
-                final AuthenticationSession authenticationSession, final DeploymentCategory deploymentCategory);
+                final ScalarModel scalarModel,
+                final String searchArg,
+                final AuthenticationSession authenticationSession,
+                final DeploymentCategory deploymentCategory);
 
         public abstract int getAutoCompleteOrChoicesMinLength(ScalarModel scalarModel);
         
@@ -591,12 +631,16 @@ public class ScalarModel extends EntityModel implements LinksProvider {
 
     private void getAndStore(final ObjectAdapterMemento parentAdapterMemento) {
         final OneToOneAssociation property = propertyMemento.getProperty();
+
         final ObjectAdapter parentAdapter = parentAdapterMemento.getObjectAdapter(ConcurrencyChecking.CHECK);
+        final PropertyAccessingContext propertyAccessingContext = property
+                .createAccessingInteractionContext(getAuthenticationSession(), InteractionInvocationMethod.BY_USER,
+                        parentAdapter);
         final ObjectAdapter associatedAdapter =
                 InteractionUtils.withFiltering(new Callable<ObjectAdapter>() {
                     @Override
                     public ObjectAdapter call() throws Exception {
-                        return property.get(parentAdapter);
+                        return property.get(parentAdapter, propertyAccessingContext);
                     }
                 });
         setObject(associatedAdapter);

http://git-wip-us.apache.org/repos/asf/isis/blob/4ac11bbc/core/viewer-wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collection/bulk/BulkActionsLinkFactory.java
----------------------------------------------------------------------
diff --git a/core/viewer-wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collection/bulk/BulkActionsLinkFactory.java b/core/viewer-wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collection/bulk/BulkActionsLinkFactory.java
index 2a5f504..9210a30 100644
--- a/core/viewer-wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collection/bulk/BulkActionsLinkFactory.java
+++ b/core/viewer-wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collection/bulk/BulkActionsLinkFactory.java
@@ -29,6 +29,7 @@ import org.apache.isis.applib.RecoverableException;
 import org.apache.isis.applib.services.actinvoc.ActionInvocationContext;
 import org.apache.isis.applib.annotation.ActionLayout;
 import org.apache.isis.applib.annotation.Bulk;
+import org.apache.isis.core.metamodel.consent.InteractionInvocationMethod;
 import org.apache.isis.core.metamodel.facets.members.cssclassfa.CssClassFaPosition;
 import org.apache.isis.applib.annotation.InvokedOn;
 import org.apache.isis.applib.services.command.Command;
@@ -40,6 +41,7 @@ import org.apache.isis.core.commons.authentication.MessageBroker;
 import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
 import org.apache.isis.core.metamodel.adapter.mgr.AdapterManager.ConcurrencyChecking;
 import org.apache.isis.core.metamodel.adapter.version.ConcurrencyException;
+import org.apache.isis.core.metamodel.interactions.ActionExecutingContext;
 import org.apache.isis.core.metamodel.runtimecontext.ServicesInjector;
 import org.apache.isis.core.metamodel.spec.feature.ObjectAction;
 import org.apache.isis.core.runtime.system.context.IsisContext;
@@ -127,7 +129,10 @@ public final class BulkActionsLinkFactory implements ActionLinkFactory {
                             bulkInteractionContext.setIndex(i++);
                         }
 
-                        lastReturnedAdapter = objectAction.executeWithRuleChecking(adapter, new ObjectAdapter[]{}, getAuthenticationSession(), ActionModel.WHERE_FOR_ACTION_INVOCATION);
+                        final ActionExecutingContext actionExecutingContext = objectAction
+                                .createExecutingInteractionContext(getAuthenticationSession(),
+                                        InteractionInvocationMethod.BY_USER, adapter, new ObjectAdapter[] {});
+                        lastReturnedAdapter = objectAction.executeWithRuleChecking(actionExecutingContext, adapter, new ObjectAdapter[]{}, getAuthenticationSession(), ActionModel.WHERE_FOR_ACTION_INVOCATION);
                     }
 
 

http://git-wip-us.apache.org/repos/asf/isis/blob/4ac11bbc/core/viewer-wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collectioncontents/ajaxtable/CollectionContentsSortableDataProvider.java
----------------------------------------------------------------------
diff --git a/core/viewer-wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collectioncontents/ajaxtable/CollectionContentsSortableDataProvider.java b/core/viewer-wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collectioncontents/ajaxtable/CollectionContentsSortableDataProvider.java
index 8b9641c..b44ae21 100644
--- a/core/viewer-wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collectioncontents/ajaxtable/CollectionContentsSortableDataProvider.java
+++ b/core/viewer-wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collectioncontents/ajaxtable/CollectionContentsSortableDataProvider.java
@@ -21,20 +21,25 @@ package org.apache.isis.viewer.wicket.ui.components.collectioncontents.ajaxtable
 
 import java.util.Iterator;
 import java.util.List;
+
 import com.google.common.base.Predicate;
 import com.google.common.collect.Iterables;
 import com.google.common.collect.Lists;
 import com.google.common.collect.Ordering;
+
 import org.apache.wicket.extensions.ajax.markup.html.repeater.data.table.AjaxFallbackDefaultDataTable;
 import org.apache.wicket.extensions.markup.html.repeater.util.SortParam;
 import org.apache.wicket.extensions.markup.html.repeater.util.SortableDataProvider;
 import org.apache.wicket.model.IModel;
+
 import org.apache.isis.applib.annotation.Where;
 import org.apache.isis.core.commons.authentication.AuthenticationSession;
+import org.apache.isis.core.commons.config.IsisConfiguration;
 import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
 import org.apache.isis.core.metamodel.consent.InteractionInvocationMethod;
 import org.apache.isis.core.metamodel.consent.InteractionResult;
 import org.apache.isis.core.metamodel.deployment.DeploymentCategory;
+import org.apache.isis.core.metamodel.interactions.AssociationAccessingContext;
 import org.apache.isis.core.metamodel.interactions.InteractionUtils;
 import org.apache.isis.core.metamodel.interactions.ObjectVisibilityContext;
 import org.apache.isis.core.metamodel.interactions.VisibilityContext;
@@ -145,7 +150,7 @@ public class CollectionContentsSortableDataProvider extends SortableDataProvider
 
     private VisibilityContext<?> createVisibleInteractionContext(final ObjectAdapter objectAdapter) {
         return new ObjectVisibilityContext(
-                getDeploymentCategory(),
+                getConfiguration(), getDeploymentCategory(),
                 getAuthenticationSession(),
                 InteractionInvocationMethod.BY_USER,
                 objectAdapter,
@@ -153,13 +158,20 @@ public class CollectionContentsSortableDataProvider extends SortableDataProvider
                 Where.ALL_TABLES);
     }
 
-    private static Ordering<ObjectAdapter> orderingBy(final ObjectAssociation sortProperty, final boolean ascending) {
+    private Ordering<ObjectAdapter> orderingBy(final ObjectAssociation sortProperty, final boolean ascending) {
         final Ordering<ObjectAdapter> ordering = new Ordering<ObjectAdapter>(){
     
             @Override
-            public int compare(final ObjectAdapter p, final ObjectAdapter q) {
-                final ObjectAdapter pSort = sortProperty.get(p);
-                final ObjectAdapter qSort = sortProperty.get(q);
+            public int compare(final ObjectAdapter pAdapter, final ObjectAdapter qAdapter) {
+                final AssociationAccessingContext pAccessingContext = (AssociationAccessingContext) sortProperty
+                        .createAccessingInteractionContext(getAuthenticationSession(),
+                                InteractionInvocationMethod.BY_USER, pAdapter);
+                final ObjectAdapter pSort = sortProperty.get(pAdapter, pAccessingContext);
+
+                final AssociationAccessingContext qAccessingContext = (AssociationAccessingContext) sortProperty
+                        .createAccessingInteractionContext(getAuthenticationSession(),
+                                InteractionInvocationMethod.BY_USER, qAdapter);
+                final ObjectAdapter qSort = sortProperty.get(qAdapter, qAccessingContext);
                 Ordering<ObjectAdapter> naturalOrdering = 
                         ascending 
                             ? ORDERING_BY_NATURAL.nullsFirst() 
@@ -198,5 +210,9 @@ public class CollectionContentsSortableDataProvider extends SortableDataProvider
         return IsisContext.getDeploymentType().getDeploymentCategory();
     }
 
+    protected IsisConfiguration getConfiguration() {
+        return IsisContext.getConfiguration();
+    }
+
 
 }
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/isis/blob/4ac11bbc/core/viewer-wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collectioncontents/summary/CollectionContentsAsSummary.java
----------------------------------------------------------------------
diff --git a/core/viewer-wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collectioncontents/summary/CollectionContentsAsSummary.java b/core/viewer-wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collectioncontents/summary/CollectionContentsAsSummary.java
index 49be8db..cbf5509 100644
--- a/core/viewer-wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collectioncontents/summary/CollectionContentsAsSummary.java
+++ b/core/viewer-wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collectioncontents/summary/CollectionContentsAsSummary.java
@@ -19,28 +19,34 @@
 
 package org.apache.isis.viewer.wicket.ui.components.collectioncontents.summary;
 
-import de.agilecoders.wicket.core.markup.html.bootstrap.common.NotificationPanel;
-
 import java.math.BigDecimal;
 import java.math.RoundingMode;
 import java.util.Collections;
 import java.util.List;
+
 import com.google.common.collect.Iterables;
 import com.google.common.collect.Lists;
+
 import org.apache.wicket.markup.html.basic.Label;
 import org.apache.wicket.markup.html.form.TextField;
 import org.apache.wicket.markup.html.list.AbstractItem;
 import org.apache.wicket.markup.repeater.RepeatingView;
 import org.apache.wicket.model.Model;
+
 import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
+import org.apache.isis.core.metamodel.consent.InteractionInvocationMethod;
+import org.apache.isis.core.metamodel.interactions.AssociationAccessingContext;
 import org.apache.isis.core.metamodel.spec.ObjectAdapterUtils;
 import org.apache.isis.core.metamodel.spec.ObjectSpecification;
 import org.apache.isis.core.metamodel.spec.feature.Contributed;
 import org.apache.isis.core.metamodel.spec.feature.ObjectAssociation;
+import org.apache.isis.core.runtime.system.context.IsisContext;
 import org.apache.isis.viewer.wicket.model.models.EntityCollectionModel;
 import org.apache.isis.viewer.wicket.ui.components.collection.count.CollectionCountProvider;
 import org.apache.isis.viewer.wicket.ui.panels.PanelAbstract;
 
+import de.agilecoders.wicket.core.markup.html.bootstrap.common.NotificationPanel;
+
 /**
  * {@link PanelAbstract Panel} that represents a {@link EntityCollectionModel
  * collection of entity}s rendered using as a table of summary values with a
@@ -122,7 +128,10 @@ public class CollectionContentsAsSummary extends PanelAbstract<EntityCollectionM
             int nonNullCount = 0;
             for (ObjectAdapter objectAdapter : adapters) {
                 titles.add(objectAdapter.titleString(null));
-                final ObjectAdapter valueAdapter = numberAssociation.get(objectAdapter);
+                final AssociationAccessingContext associationAccessingContext = (AssociationAccessingContext) numberAssociation
+                        .createAccessingInteractionContext(IsisContext.getAuthenticationSession(),
+                                InteractionInvocationMethod.BY_USER, objectAdapter);
+                final ObjectAdapter valueAdapter = numberAssociation.get(objectAdapter, associationAccessingContext);
                 if (valueAdapter == null) {
                     values.add(null);
                     continue;

http://git-wip-us.apache.org/repos/asf/isis/blob/4ac11bbc/core/viewer-wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/reference/ReferencePanel.java
----------------------------------------------------------------------
diff --git a/core/viewer-wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/reference/ReferencePanel.java b/core/viewer-wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/reference/ReferencePanel.java
index 8a394a9..24c12e7 100644
--- a/core/viewer-wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/reference/ReferencePanel.java
+++ b/core/viewer-wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/reference/ReferencePanel.java
@@ -357,7 +357,8 @@ public class ReferencePanel extends ScalarPanelAbstract {
     private List<ObjectAdapterMemento> obtainChoiceMementos(final ObjectAdapter[] argsIfAvailable) {
         final List<ObjectAdapter> choices = Lists.newArrayList();
         if(getModel().hasChoices()) {
-            choices.addAll(getModel().getChoices(argsIfAvailable, getAuthenticationSession(), getDeploymentCategory()));
+            choices.addAll(
+                    getModel().getChoices(argsIfAvailable, getAuthenticationSession(), getDeploymentCategory()));
         }
         // take a copy otherwise is only lazily evaluated
         return Lists.newArrayList(Lists.transform(choices, ObjectAdapterMemento.Functions.fromAdapter()));

http://git-wip-us.apache.org/repos/asf/isis/blob/4ac11bbc/core/viewer-wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/pages/entity/EntityPage.java
----------------------------------------------------------------------
diff --git a/core/viewer-wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/pages/entity/EntityPage.java b/core/viewer-wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/pages/entity/EntityPage.java
index 69dc4b6..3e31652 100644
--- a/core/viewer-wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/pages/entity/EntityPage.java
+++ b/core/viewer-wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/pages/entity/EntityPage.java
@@ -200,7 +200,7 @@ public class EntityPage extends PageAbstract {
 
     private VisibilityContext<?> createVisibleInteractionContext(final ObjectAdapter objectAdapter) {
         return new ObjectVisibilityContext(
-                getDeploymentCategory(),
+                getConfiguration(), getDeploymentCategory(),
                 getAuthenticationSession(),
                 InteractionInvocationMethod.BY_USER,
                 objectAdapter,

http://git-wip-us.apache.org/repos/asf/isis/blob/4ac11bbc/core/wrapper/src/main/java/org/apache/isis/core/wrapper/handlers/DomainObjectInvocationHandler.java
----------------------------------------------------------------------
diff --git a/core/wrapper/src/main/java/org/apache/isis/core/wrapper/handlers/DomainObjectInvocationHandler.java b/core/wrapper/src/main/java/org/apache/isis/core/wrapper/handlers/DomainObjectInvocationHandler.java
index 08e119f..7685190 100644
--- a/core/wrapper/src/main/java/org/apache/isis/core/wrapper/handlers/DomainObjectInvocationHandler.java
+++ b/core/wrapper/src/main/java/org/apache/isis/core/wrapper/handlers/DomainObjectInvocationHandler.java
@@ -37,9 +37,11 @@ import org.datanucleus.enhancement.Persistable;
 
 import org.apache.isis.applib.annotation.Where;
 import org.apache.isis.applib.events.CollectionAccessEvent;
+import org.apache.isis.applib.events.CollectionAccessingEvent;
 import org.apache.isis.applib.events.InteractionEvent;
 import org.apache.isis.applib.events.ObjectTitleEvent;
 import org.apache.isis.applib.events.PropertyAccessEvent;
+import org.apache.isis.applib.events.PropertyAccessingEvent;
 import org.apache.isis.applib.events.UsabilityEvent;
 import org.apache.isis.applib.events.ValidityEvent;
 import org.apache.isis.applib.events.VisibilityEvent;
@@ -61,8 +63,11 @@ import org.apache.isis.core.metamodel.consent.InteractionInvocationMethod;
 import org.apache.isis.core.metamodel.consent.InteractionResult;
 import org.apache.isis.core.metamodel.facets.ImperativeFacet;
 import org.apache.isis.core.metamodel.facets.ImperativeFacet.Intent;
+import org.apache.isis.core.metamodel.interactions.ActionExecutingContext;
+import org.apache.isis.core.metamodel.interactions.CollectionAccessingContext;
 import org.apache.isis.core.metamodel.interactions.InteractionUtils;
 import org.apache.isis.core.metamodel.interactions.ObjectTitleContext;
+import org.apache.isis.core.metamodel.interactions.PropertyAccessingContext;
 import org.apache.isis.core.metamodel.spec.ObjectSpecification;
 import org.apache.isis.core.metamodel.spec.SpecificationLoader;
 import org.apache.isis.core.metamodel.spec.feature.Contributed;
@@ -226,14 +231,18 @@ public class DomainObjectInvocationHandler<T> extends DelegatingInvocationHandle
                 throw new UnsupportedOperationException(String.format("Cannot invoke supporting method for '%s'; use only property accessor/mutator", memberName));
             }
 
-            final OneToOneAssociation otoa = (OneToOneAssociation) objectMember;
-            
+            final OneToOneAssociation property = (OneToOneAssociation) objectMember;
+            final PropertyAccessingContext propertyAccessingContext = property
+                    .createAccessingInteractionContext(getAuthenticationSession(),
+                            InteractionInvocationMethod.BY_USER,
+                            targetAdapter);
+
             if (intent == Intent.ACCESSOR) {
-                return handleGetterMethodOnProperty(targetAdapter, args, otoa);
+                return handleGetterMethodOnProperty(targetAdapter, args, property, propertyAccessingContext);
             }
             
             if (intent == Intent.MODIFY_PROPERTY || intent == Intent.INITIALIZATION) {
-                return handleSetterMethodOnProperty(targetAdapter, args, otoa);
+                return handleSetterMethodOnProperty(targetAdapter, args, property, propertyAccessingContext);
             }
         }
         if (objectMember.isOneToManyAssociation()) {
@@ -242,15 +251,19 @@ public class DomainObjectInvocationHandler<T> extends DelegatingInvocationHandle
                 throw new UnsupportedOperationException(String.format("Cannot invoke supporting method '%s'; use only collection accessor/mutator", memberName));
             }
 
-            final OneToManyAssociation otma = (OneToManyAssociation) objectMember;
+            final OneToManyAssociation collection = (OneToManyAssociation) objectMember;
+            final CollectionAccessingContext collectionAccessingContext = collection
+                    .createAccessingInteractionContext(getAuthenticationSession(),
+                            InteractionInvocationMethod.BY_USER, targetAdapter);
             if (intent == Intent.ACCESSOR) {
-                return handleGetterMethodOnCollection(targetAdapter, args, otma, method, memberName);
+                return handleGetterMethodOnCollection(targetAdapter, args, collection, method, memberName,
+                        collectionAccessingContext);
             }
             if (intent == Intent.MODIFY_COLLECTION_ADD) {
-                return handleCollectionAddToMethod(targetAdapter, args, otma);
+                return handleCollectionAddToMethod(targetAdapter, args, collection, collectionAccessingContext);
             }
             if (intent == Intent.MODIFY_COLLECTION_REMOVE) {
-                return handleCollectionRemoveFromMethod(targetAdapter, args, otma);
+                return handleCollectionRemoveFromMethod(targetAdapter, args, collection, collectionAccessingContext);
             }
         }
 
@@ -370,32 +383,37 @@ public class DomainObjectInvocationHandler<T> extends DelegatingInvocationHandle
     private Object handleGetterMethodOnProperty(
             final ObjectAdapter targetAdapter,
             final Object[] args,
-            final OneToOneAssociation otoa) {
+            final OneToOneAssociation property,
+            final PropertyAccessingContext propertyAccessingContext) {
 
         if (args.length != 0) {
             throw new IllegalArgumentException("Invoking a 'get' should have no arguments");
         }
 
         if(getExecutionMode().shouldEnforceRules()) {
-            checkVisibility(targetAdapter, otoa);
+            checkVisibility(targetAdapter, property);
         }
 
         resolveIfRequired(targetAdapter);
 
+        final PropertyAccessingEvent accessingEvent = new PropertyAccessingEvent(getDelegate(), property.getIdentifier());
+        notifyListeners(accessingEvent);
+
         final ObjectAdapter currentReferencedAdapter =
                 executionMode.shouldEnforceRules()
                         ? InteractionUtils.withFiltering(new Callable<ObjectAdapter>() {
-                                @Override
-                                public ObjectAdapter call() throws Exception {
-                                    return otoa.get(targetAdapter);
-                                }
-                            })
-                        : otoa.get(targetAdapter);
+                    @Override
+                    public ObjectAdapter call() throws Exception {
+                        return property.get(targetAdapter, propertyAccessingContext);
+                    }
+                })
+                        : property.get(targetAdapter, propertyAccessingContext);
 
         final Object currentReferencedObj = ObjectAdapter.Util.unwrap(currentReferencedAdapter);
 
-        final PropertyAccessEvent ev = new PropertyAccessEvent(getDelegate(), otoa.getIdentifier(), currentReferencedObj);
-        notifyListeners(ev);
+        final PropertyAccessEvent accessedEvent = new PropertyAccessEvent(getDelegate(), property.getIdentifier(), currentReferencedObj);
+        notifyListeners(accessedEvent);
+
         return currentReferencedObj;
     }
 
@@ -406,7 +424,7 @@ public class DomainObjectInvocationHandler<T> extends DelegatingInvocationHandle
 
     private Object handleSetterMethodOnProperty(
             final ObjectAdapter targetAdapter, final Object[] args,
-            final OneToOneAssociation otoa) {
+            final OneToOneAssociation property, final PropertyAccessingContext propertyAccessingContext) {
         if (args.length != 1) {
             throw new IllegalArgumentException("Invoking a setter should only have a single argument");
         }
@@ -414,8 +432,8 @@ public class DomainObjectInvocationHandler<T> extends DelegatingInvocationHandle
         final Object argumentObj = underlying(args[0]);
 
         if(getExecutionMode().shouldEnforceRules()) {
-            checkVisibility(targetAdapter, otoa);
-            checkUsability(targetAdapter, otoa);
+            checkVisibility(targetAdapter, property);
+            checkUsability(targetAdapter, property);
         }
 
         final ObjectAdapter argumentAdapter = argumentObj != null ? adapterFor(argumentObj) : null;
@@ -424,12 +442,12 @@ public class DomainObjectInvocationHandler<T> extends DelegatingInvocationHandle
 
 
         if(getExecutionMode().shouldEnforceRules()) {
-            final InteractionResult interactionResult = otoa.isAssociationValid(targetAdapter, argumentAdapter).getInteractionResult();
+            final InteractionResult interactionResult = property.isAssociationValid(targetAdapter, argumentAdapter).getInteractionResult();
             notifyListenersAndVetoIfRequired(interactionResult);
         }
 
         if (getExecutionMode().shouldExecute()) {
-            otoa.set(targetAdapter, argumentAdapter);
+            property.set(propertyAccessingContext, targetAdapter, argumentAdapter);
         }
 
         objectChangedIfRequired(targetAdapter);
@@ -447,7 +465,8 @@ public class DomainObjectInvocationHandler<T> extends DelegatingInvocationHandle
             final Object[] args,
             final OneToManyAssociation otma,
             final Method method,
-            final String memberName) {
+            final String memberName,
+            final CollectionAccessingContext collectionAccessingContext) {
 
         if (args.length != 0) {
             throw new IllegalArgumentException("Invoking a 'get' should have no arguments");
@@ -458,30 +477,33 @@ public class DomainObjectInvocationHandler<T> extends DelegatingInvocationHandle
         }
 
         resolveIfRequired(targetAdapter);
+        final CollectionAccessingEvent accessingEvent = collectionAccessingContext.createInteractionEvent();
+        notifyListeners(accessingEvent);
+
 
         final ObjectAdapter currentReferencedAdapter =
                 executionMode.shouldEnforceRules()
                         ? InteractionUtils.withFiltering(new Callable<ObjectAdapter>() {
-                                @Override
-                                public ObjectAdapter call() throws Exception {
-                                    return otma.get(targetAdapter);
-                                }
-                            })
-                        : otma.get(targetAdapter);
+                    @Override
+                    public ObjectAdapter call() throws Exception {
+                        return otma.get(targetAdapter, collectionAccessingContext);
+                    }
+                })
+                        : otma.get(targetAdapter, collectionAccessingContext);
 
         final Object currentReferencedObj = ObjectAdapter.Util.unwrap(currentReferencedAdapter);
 
-        final CollectionAccessEvent ev = new CollectionAccessEvent(getDelegate(), otma.getIdentifier());
+        final CollectionAccessEvent accessedEvent = new CollectionAccessEvent(getDelegate(), otma.getIdentifier());
 
         if (currentReferencedObj instanceof Collection) {
             final Collection<?> collectionViewObject = lookupWrappingObject(method, memberName,
                     (Collection<?>) currentReferencedObj, otma);
-            notifyListeners(ev);
+            notifyListeners(accessedEvent);
             return collectionViewObject;
         } else if (currentReferencedObj instanceof Map) {
             final Map<?, ?> mapViewObject = lookupWrappingObject(memberName, (Map<?, ?>) currentReferencedObj,
                     otma);
-            notifyListeners(ev);
+            notifyListeners(accessedEvent);
             return mapViewObject;
         }
         throw new IllegalArgumentException(String.format("Collection type '%s' not supported by framework", currentReferencedObj.getClass().getName()));
@@ -513,7 +535,7 @@ public class DomainObjectInvocationHandler<T> extends DelegatingInvocationHandle
     private Object handleCollectionAddToMethod(
             final ObjectAdapter targetAdapter,
             final Object[] args,
-            final OneToManyAssociation otma) {
+            final OneToManyAssociation otma, final CollectionAccessingContext collectionAccessingContext) {
 
         if (args.length != 1) {
             throw new IllegalArgumentException("Invoking a addTo should only have a single argument");
@@ -538,7 +560,7 @@ public class DomainObjectInvocationHandler<T> extends DelegatingInvocationHandle
         }
 
         if (getExecutionMode().shouldExecute()) {
-            otma.addElement(targetAdapter, argumentNO);
+            otma.addElement(collectionAccessingContext, targetAdapter, argumentNO);
         }
 
         objectChangedIfRequired(targetAdapter);
@@ -554,7 +576,7 @@ public class DomainObjectInvocationHandler<T> extends DelegatingInvocationHandle
     private Object handleCollectionRemoveFromMethod(
             final ObjectAdapter targetAdapter,
             final Object[] args,
-            final OneToManyAssociation otma) {
+            final OneToManyAssociation otma, final CollectionAccessingContext collectionAccessingContext) {
         if (args.length != 1) {
             throw new IllegalArgumentException("Invoking a removeFrom should only have a single argument");
         }
@@ -579,7 +601,7 @@ public class DomainObjectInvocationHandler<T> extends DelegatingInvocationHandle
         }
 
         if (getExecutionMode().shouldExecute()) {
-            otma.removeElement(targetAdapter, argumentAdapter);
+            otma.removeElement(collectionAccessingContext, targetAdapter, argumentAdapter);
         }
 
         objectChangedIfRequired(targetAdapter);
@@ -638,17 +660,20 @@ public class DomainObjectInvocationHandler<T> extends DelegatingInvocationHandle
         }
 
         if (getExecutionMode().shouldExecute()) {
-            final ObjectAdapter actionReturnNO =
+
+            final ActionExecutingContext actionExecutingContext = objectAction.createExecutingInteractionContext(getAuthenticationSession(), InteractionInvocationMethod.BY_USER, targetAdapter, argAdapters);
+
+            final ObjectAdapter actionResultAdapter =
                     executionMode.shouldEnforceRules()
                             ? InteractionUtils.withFiltering(new Callable<ObjectAdapter>() {
-                                    @Override
-                                    public ObjectAdapter call() throws Exception {
-                                        return objectAction.execute(targetAdapter, argAdapters);
-                                    }
-                                })
-                            : objectAction.execute(targetAdapter, argAdapters);;
-
-            return ObjectAdapter.Util.unwrap(actionReturnNO);
+                                @Override
+                                public ObjectAdapter call() throws Exception {
+                                    return objectAction.execute(actionExecutingContext, targetAdapter, argAdapters);
+                                }
+                            })
+                            : objectAction.execute(actionExecutingContext, targetAdapter, argAdapters);;
+
+            return ObjectAdapter.Util.unwrap(actionResultAdapter);
         }
 
         objectChangedIfRequired(targetAdapter);

http://git-wip-us.apache.org/repos/asf/isis/blob/4ac11bbc/core/wrapper/src/test/java/org/apache/isis/progmodel/wrapper/WrapperFactoryAbstractTest_wrappedObject.java
----------------------------------------------------------------------
diff --git a/core/wrapper/src/test/java/org/apache/isis/progmodel/wrapper/WrapperFactoryAbstractTest_wrappedObject.java b/core/wrapper/src/test/java/org/apache/isis/progmodel/wrapper/WrapperFactoryAbstractTest_wrappedObject.java
index 6a4c2ec..efc0921 100644
--- a/core/wrapper/src/test/java/org/apache/isis/progmodel/wrapper/WrapperFactoryAbstractTest_wrappedObject.java
+++ b/core/wrapper/src/test/java/org/apache/isis/progmodel/wrapper/WrapperFactoryAbstractTest_wrappedObject.java
@@ -115,8 +115,9 @@ public abstract class WrapperFactoryAbstractTest_wrappedObject {
     @Before
     public void setUp() {
 
-        objectMemberContext = new ObjectMemberContext(DeploymentCategory.PRODUCTION, mockAuthenticationSessionProvider,
-                mockSpecificationLoader, mockAdapterManager, mockQuerySubmitter, mockServicesProvider);
+        objectMemberContext = new ObjectMemberContext(mockConfiguration, DeploymentCategory.PRODUCTION, mockAuthenticationSessionProvider,
+                mockSpecificationLoader, mockAdapterManager, mockQuerySubmitter, mockServicesProvider
+        );
         
         employeeRepository = new EmployeeRepositoryImpl();
 

http://git-wip-us.apache.org/repos/asf/isis/blob/4ac11bbc/core/wrapper/src/test/java/org/apache/isis/progmodel/wrapper/WrapperFactoryAbstractTest_wrappedObject_transient.java
----------------------------------------------------------------------
diff --git a/core/wrapper/src/test/java/org/apache/isis/progmodel/wrapper/WrapperFactoryAbstractTest_wrappedObject_transient.java b/core/wrapper/src/test/java/org/apache/isis/progmodel/wrapper/WrapperFactoryAbstractTest_wrappedObject_transient.java
index 3953877..ce05a28 100644
--- a/core/wrapper/src/test/java/org/apache/isis/progmodel/wrapper/WrapperFactoryAbstractTest_wrappedObject_transient.java
+++ b/core/wrapper/src/test/java/org/apache/isis/progmodel/wrapper/WrapperFactoryAbstractTest_wrappedObject_transient.java
@@ -23,12 +23,14 @@ import java.lang.reflect.Method;
 import java.util.Arrays;
 import java.util.Collections;
 import java.util.List;
+
 import org.jmock.Expectations;
 import org.jmock.auto.Mock;
 import org.junit.Before;
 import org.junit.Ignore;
 import org.junit.Rule;
 import org.junit.Test;
+
 import org.apache.isis.applib.Identifier;
 import org.apache.isis.applib.annotation.Where;
 import org.apache.isis.applib.events.PropertyModifyEvent;
@@ -50,6 +52,7 @@ import org.apache.isis.core.metamodel.facets.members.disabled.DisabledFacet;
 import org.apache.isis.core.metamodel.facets.members.disabled.DisabledFacetAbstractAlwaysEverywhere;
 import org.apache.isis.core.metamodel.facets.properties.accessor.PropertyAccessorFacetViaAccessor;
 import org.apache.isis.core.metamodel.facets.properties.update.modify.PropertySetterFacetViaSetterMethod;
+import org.apache.isis.core.metamodel.interactions.PropertyAccessingContext;
 import org.apache.isis.core.metamodel.spec.SpecificationLoader;
 import org.apache.isis.core.metamodel.spec.feature.OneToOneAssociation;
 import org.apache.isis.core.metamodel.specloader.specimpl.dflt.ObjectSpecificationDefault;
@@ -226,13 +229,15 @@ public abstract class WrapperFactoryAbstractTest_wrappedObject_transient {
             }
         });
 
+        final PropertyAccessingContext propertyAccessingContext = null; // TODO
+
         facets = Arrays.asList((Facet)new PropertySetterFacetViaSetterMethod(setPasswordMethod, mockPasswordMember));
         context.checking(new Expectations() {
             {
                 allowing(mockPasswordMember).getFacets(with(any(Filter.class)));
                 will(returnValue(facets));
 
-                oneOf(mockPasswordMember).set(mockEmployeeAdapter, mockPasswordAdapter);
+                oneOf(mockPasswordMember).set(propertyAccessingContext, mockEmployeeAdapter, mockPasswordAdapter);
             }
         });
 
@@ -241,6 +246,7 @@ public abstract class WrapperFactoryAbstractTest_wrappedObject_transient {
 
 
         // and given
+
         facets = Arrays.asList((Facet)new PropertyAccessorFacetViaAccessor(getPasswordMethod, mockPasswordMember,
                 mockAdapterManager, mockSpecificationLoader, mockConfiguration));
         context.checking(new Expectations() {
@@ -248,7 +254,7 @@ public abstract class WrapperFactoryAbstractTest_wrappedObject_transient {
                 allowing(mockPasswordMember).getFacets(with(any(Filter.class)));
                 will(returnValue(facets));
                 
-                oneOf(mockPasswordMember).get(mockEmployeeAdapter);
+                oneOf(mockPasswordMember).get(mockEmployeeAdapter, propertyAccessingContext);
                 will(returnValue(mockPasswordAdapter));
             }
         });