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 2016/05/01 10:17:06 UTC

[29/35] isis git commit: ISIS-1343: extend ActionI invocation to take the targetAdapter, mixedInAdapter (can be null) and arg array.

ISIS-1343: extend ActionI invocation to take the targetAdapter, mixedInAdapter (can be null) and arg array.

In addition, always pass in the ObjectAction (rather than merely IdentifiedHolder = FacetedMethod) to the DomainEventHelper#postEventForAction(...); this ensures that the domain event's param names and param types are correctly populated in all cases.

Update the HideMixinsForHomePage subscriber to use the new API.


Project: http://git-wip-us.apache.org/repos/asf/isis/repo
Commit: http://git-wip-us.apache.org/repos/asf/isis/commit/0689936c
Tree: http://git-wip-us.apache.org/repos/asf/isis/tree/0689936c
Diff: http://git-wip-us.apache.org/repos/asf/isis/diff/0689936c

Branch: refs/heads/ISIS-1291
Commit: 0689936cd0d9accf032ca3cf4a96139fba4b4128
Parents: 0b3826d
Author: Dan Haywood <da...@haywood-associates.co.uk>
Authored: Tue Mar 22 23:06:49 2016 +0000
Committer: Dan Haywood <da...@haywood-associates.co.uk>
Committed: Sun May 1 07:12:36 2016 +0100

----------------------------------------------------------------------
 .../services/eventbus/ActionDomainEvent.java    | 18 +++++++
 .../metamodel/facets/DomainEventHelper.java     | 11 +++-
 .../ActionDomainEventFacetAbstract.java         | 22 ++++++--
 .../invocation/ActionInvocationFacet.java       |  1 +
 ...onInvocationFacetForDomainEventAbstract.java |  7 +--
 .../autocomplete/AutoCompleteFacetAbstract.java |  2 +-
 .../interactions/ActionArgumentContext.java     | 11 +++-
 .../interactions/ActionInteractionContext.java  | 31 ++++++++++++
 .../interactions/ActionInvocationContext.java   | 11 +++-
 .../interactions/ActionUsabilityContext.java    | 12 ++++-
 .../interactions/ActionVisibilityContext.java   | 12 ++++-
 .../interactions/InteractionContext.java        | 12 +++++
 .../metamodel/spec/feature/ObjectAction.java    |  7 ++-
 .../specimpl/ObjectActionContributee.java       |  3 +-
 .../specimpl/ObjectActionDefault.java           | 53 ++++++++++++--------
 .../specimpl/ObjectActionMixedIn.java           | 43 +++++++++++-----
 .../specimpl/ObjectActionParameterAbstract.java |  3 +-
 .../OneToManyAssociationContributee.java        |  2 +-
 .../specimpl/OneToManyAssociationMixedIn.java   |  6 +--
 .../OneToOneActionParameterMixedIn.java         | 14 ++++++
 .../OneToOneAssociationContributee.java         |  2 +-
 .../specimpl/OneToOneAssociationMixedIn.java    |  6 +--
 .../background/BackgroundCommandExecution.java  |  9 +++-
 .../HomePageProviderServiceDefault.java         |  6 ++-
 .../ActionInvocationFacetWrapTransaction.java   |  3 +-
 .../server/resources/DomainResourceHelper.java  | 11 ++--
 .../viewer/wicket/model/models/ActionModel.java |  4 +-
 .../collection/bulk/BulkActionsLinkFactory.java |  6 ++-
 .../handlers/DomainObjectInvocationHandler.java |  9 ++--
 .../app/services/homepage/HomePageService.java  | 11 ++++
 30 files changed, 275 insertions(+), 73 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/isis/blob/0689936c/core/applib/src/main/java/org/apache/isis/applib/services/eventbus/ActionDomainEvent.java
----------------------------------------------------------------------
diff --git a/core/applib/src/main/java/org/apache/isis/applib/services/eventbus/ActionDomainEvent.java b/core/applib/src/main/java/org/apache/isis/applib/services/eventbus/ActionDomainEvent.java
index d2d0f1c..57102423 100644
--- a/core/applib/src/main/java/org/apache/isis/applib/services/eventbus/ActionDomainEvent.java
+++ b/core/applib/src/main/java/org/apache/isis/applib/services/eventbus/ActionDomainEvent.java
@@ -192,6 +192,24 @@ public abstract class ActionDomainEvent<S> extends AbstractInteractionEvent<S> {
     }
     //endregion
 
+
+    // region > mixedIn
+    private Object mixedIn;
+
+    /**
+     * Populated only for mixins; holds the underlying domain object that the mixin contributes to.
+     */
+    public Object getMixedIn() {
+        return mixedIn;
+    }
+    /**
+     * Not API - set by the framework.
+     */
+    public void setMixedIn(final Object mixedIn) {
+        this.mixedIn = mixedIn;
+    }
+    // endregion
+
     //region > arguments
     private List<Object> arguments;
     /**

http://git-wip-us.apache.org/repos/asf/isis/blob/0689936c/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/DomainEventHelper.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/DomainEventHelper.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/DomainEventHelper.java
index c5729f7..07d03e9 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/DomainEventHelper.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/DomainEventHelper.java
@@ -61,8 +61,10 @@ public class DomainEventHelper {
             final AbstractDomainEvent.Phase phase,
             final Class eventType,
             final ActionDomainEvent<?> existingEvent,
+            final ObjectAction objectAction,
             final IdentifiedHolder identified,
             final ObjectAdapter targetAdapter,
+            final ObjectAdapter mixedInAdapter,
             final ObjectAdapter[] argumentAdapters,
             final Command command,
             final ObjectAdapter resultAdapter) {
@@ -70,6 +72,7 @@ public class DomainEventHelper {
         if(!hasEventBusService()) {
             return null;
         }
+
         try {
             final ActionDomainEvent<?> event;
 
@@ -83,9 +86,13 @@ public class DomainEventHelper {
                 final Identifier identifier = identified.getIdentifier();
                 event = newActionDomainEvent(eventType, identifier, source, arguments);
 
-                if(identified instanceof ObjectAction) {
+                // copy over if have
+                if(mixedInAdapter != null ) {
+                    event.setMixedIn(mixedInAdapter.getObject());
+                }
+
+                if(objectAction != null) {
                     // should always be the case...
-                    final ObjectAction objectAction = (ObjectAction) identified;
                     event.setActionSemantics(objectAction.getSemantics());
 
                     final List<ObjectActionParameter> parameters = objectAction.getParameters();

http://git-wip-us.apache.org/repos/asf/isis/blob/0689936c/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/action/invocation/ActionDomainEventFacetAbstract.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/action/invocation/ActionDomainEventFacetAbstract.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/action/invocation/ActionDomainEventFacetAbstract.java
index 2c5e6f2..19694b9 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/action/invocation/ActionDomainEventFacetAbstract.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/action/invocation/ActionDomainEventFacetAbstract.java
@@ -20,6 +20,7 @@
 package org.apache.isis.core.metamodel.facets.actions.action.invocation;
 
 import java.util.Map;
+
 import org.apache.isis.applib.events.InteractionEvent;
 import org.apache.isis.applib.events.UsabilityEvent;
 import org.apache.isis.applib.events.ValidityEvent;
@@ -34,6 +35,7 @@ import org.apache.isis.core.metamodel.facetapi.FacetHolder;
 import org.apache.isis.core.metamodel.facetapi.IdentifiedHolder;
 import org.apache.isis.core.metamodel.facets.DomainEventHelper;
 import org.apache.isis.core.metamodel.facets.SingleClassValueFacetAbstract;
+import org.apache.isis.core.metamodel.interactions.ActionInteractionContext;
 import org.apache.isis.core.metamodel.interactions.ActionInvocationContext;
 import org.apache.isis.core.metamodel.interactions.InteractionContext;
 import org.apache.isis.core.metamodel.interactions.UsabilityContext;
@@ -41,6 +43,7 @@ import org.apache.isis.core.metamodel.interactions.ValidityContext;
 import org.apache.isis.core.metamodel.interactions.VisibilityContext;
 import org.apache.isis.core.metamodel.runtimecontext.ServicesInjector;
 import org.apache.isis.core.metamodel.spec.SpecificationLoader;
+import org.apache.isis.core.metamodel.spec.feature.ObjectAction;
 
 public abstract class ActionDomainEventFacetAbstract
         extends SingleClassValueFacetAbstract implements ActionDomainEventFacet {
@@ -75,12 +78,12 @@ public abstract class ActionDomainEventFacetAbstract
             return null;
         }
 
-        final ObjectAdapter[] argumentAdapters = argumentAdaptersFrom(ic);
         final ActionDomainEvent<?> event =
                 domainEventHelper.postEventForAction(
                         AbstractDomainEvent.Phase.HIDE,
                         eventType(), null,
-                        getIdentified(), ic.getTarget(), argumentAdapters,
+                        actionFrom(ic), getIdentified(),
+                        ic.getTarget(), ic.getMixedIn(), argumentAdaptersFrom(ic),
                         null,
                         null);
         if (event != null && event.isHidden()) {
@@ -95,12 +98,12 @@ public abstract class ActionDomainEventFacetAbstract
             return null;
         }
 
-        final ObjectAdapter[] argumentAdapters = argumentAdaptersFrom(ic);
         final ActionDomainEvent<?> event =
                 domainEventHelper.postEventForAction(
                         AbstractDomainEvent.Phase.DISABLE,
                         eventType(), null,
-                        getIdentified(), ic.getTarget(), argumentAdapters,
+                        actionFrom(ic), getIdentified(),
+                        ic.getTarget(), ic.getMixedIn(), argumentAdaptersFrom(ic),
                         null,
                         null);
         if (event != null && event.isDisabled()) {
@@ -114,6 +117,14 @@ public abstract class ActionDomainEventFacetAbstract
         return null;
     }
 
+    private static ObjectAction actionFrom(final InteractionContext<?> ic) {
+        if(!(ic instanceof ActionInteractionContext)) {
+            throw new IllegalStateException(
+                    "Expecting ic to be of type ActionInteractionContext, instead was: " + ic);
+        }
+        return ((ActionInteractionContext) ic).getObjectAction();
+    }
+
     private static ObjectAdapter[] argumentAdaptersFrom(final InteractionContext<? extends InteractionEvent> ic) {
         final Map<Integer, ObjectAdapter> contributeeAsMap = ic.getContributeeAsMap();
         return contributeeAsMap.isEmpty() ? null : new ObjectAdapter[]{contributeeAsMap.get(0)};
@@ -130,7 +141,8 @@ public abstract class ActionDomainEventFacetAbstract
                 domainEventHelper.postEventForAction(
                         AbstractDomainEvent.Phase.VALIDATE,
                         eventType(), null,
-                        getIdentified(), ic.getTarget(), aic.getArgs(),
+                        actionFrom(ic), getIdentified(),
+                        ic.getTarget(), ic.getMixedIn(), aic.getArgs(),
                         null,
                         null);
         if (event != null && event.isInvalid()) {

http://git-wip-us.apache.org/repos/asf/isis/blob/0689936c/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/action/invocation/ActionInvocationFacet.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/action/invocation/ActionInvocationFacet.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/action/invocation/ActionInvocationFacet.java
index 6e1393d..3cde54a 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/action/invocation/ActionInvocationFacet.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/action/invocation/ActionInvocationFacet.java
@@ -44,6 +44,7 @@ public interface ActionInvocationFacet extends Facet {
     ObjectAdapter invoke(
             ObjectAction owningAction,
             ObjectAdapter targetAdapter,
+            ObjectAdapter mixedInAdapter,  // null for regular or contributed (not mixin) actions
             ObjectAdapter[] argumentAdapters,
             final InteractionInitiatedBy interactionInitiatedBy);
 

http://git-wip-us.apache.org/repos/asf/isis/blob/0689936c/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/action/invocation/ActionInvocationFacetForDomainEventAbstract.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/action/invocation/ActionInvocationFacetForDomainEventAbstract.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/action/invocation/ActionInvocationFacetForDomainEventAbstract.java
index 14bd6aa..da5e4c0 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/action/invocation/ActionInvocationFacetForDomainEventAbstract.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/action/invocation/ActionInvocationFacetForDomainEventAbstract.java
@@ -150,7 +150,7 @@ public abstract class ActionInvocationFacetForDomainEventAbstract
 
     /**
      * Introduced to disambiguate the meaning of <tt>null</tt> as a return value of
-     * {@link ActionInvocationFacet#invoke(ObjectAction, ObjectAdapter, ObjectAdapter[], InteractionInitiatedBy)}
+     * {@link ActionInvocationFacet#invoke(ObjectAction, ObjectAdapter, ObjectAdapter, ObjectAdapter[], InteractionInitiatedBy)}
      */
     public static class InvocationResult {
 
@@ -190,6 +190,7 @@ public abstract class ActionInvocationFacetForDomainEventAbstract
     public ObjectAdapter invoke(
             final ObjectAction owningAction,
             final ObjectAdapter targetAdapter,
+            final ObjectAdapter mixedInAdapter,
             final ObjectAdapter[] arguments,
             final InteractionInitiatedBy interactionInitiatedBy) {
 
@@ -201,7 +202,7 @@ public abstract class ActionInvocationFacetForDomainEventAbstract
                 domainEventHelper.postEventForAction(
                         AbstractDomainEvent.Phase.EXECUTING,
                         eventType, null,
-                        owningAction, targetAdapter, arguments,
+                        owningAction, owningAction, targetAdapter, mixedInAdapter, arguments,
                         command,
                         null);
 
@@ -216,7 +217,7 @@ public abstract class ActionInvocationFacetForDomainEventAbstract
             domainEventHelper.postEventForAction(
                     AbstractDomainEvent.Phase.EXECUTED,
                     eventType, verify(event),
-                    owningAction, targetAdapter, arguments,
+                    owningAction, owningAction, targetAdapter, mixedInAdapter, arguments,
                     command,
                     invocationResultAdapter);
         }

http://git-wip-us.apache.org/repos/asf/isis/blob/0689936c/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/autocomplete/AutoCompleteFacetAbstract.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/autocomplete/AutoCompleteFacetAbstract.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/autocomplete/AutoCompleteFacetAbstract.java
index 64716a3..e443a40 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/autocomplete/AutoCompleteFacetAbstract.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/autocomplete/AutoCompleteFacetAbstract.java
@@ -104,7 +104,7 @@ public abstract class AutoCompleteFacetAbstract extends FacetAbstract implements
         
         final ObjectAdapter repositoryAdapter = adapterManager.getAdapterFor(repository);
         final ObjectAdapter searchAdapter = adapterManager.adapterFor(search);
-        final ObjectAdapter resultAdapter = repositoryAction.execute(repositoryAdapter, new ObjectAdapter[] { searchAdapter},
+        final ObjectAdapter resultAdapter = repositoryAction.execute(repositoryAdapter, null, new ObjectAdapter[] { searchAdapter},
                 interactionInitiatedBy);
         // check a collection was returned
         if(CollectionFacet.Utils.getCollectionFacetFromSpec(resultAdapter) == null) {

http://git-wip-us.apache.org/repos/asf/isis/blob/0689936c/core/metamodel/src/main/java/org/apache/isis/core/metamodel/interactions/ActionArgumentContext.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/interactions/ActionArgumentContext.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/interactions/ActionArgumentContext.java
index fda8abc..cabd801 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/interactions/ActionArgumentContext.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/interactions/ActionArgumentContext.java
@@ -24,6 +24,7 @@ import org.apache.isis.applib.events.ActionArgumentEvent;
 import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
 import org.apache.isis.core.metamodel.consent.InteractionContextType;
 import org.apache.isis.core.metamodel.consent.InteractionInitiatedBy;
+import org.apache.isis.core.metamodel.spec.feature.ObjectAction;
 
 import static org.apache.isis.core.metamodel.adapter.ObjectAdapter.Util.unwrap;
 
@@ -31,25 +32,33 @@ import static org.apache.isis.core.metamodel.adapter.ObjectAdapter.Util.unwrap;
  * See {@link InteractionContext} for overview; analogous to
  * {@link ActionArgumentEvent}.
  */
-public class ActionArgumentContext extends ValidityContext<ActionArgumentEvent> implements ProposedHolder {
+public class ActionArgumentContext extends ValidityContext<ActionArgumentEvent> implements ProposedHolder, ActionInteractionContext {
 
+    private final ObjectAction objectAction;
     private final ObjectAdapter[] args;
     private final int position;
     private final ObjectAdapter proposed;
 
     public ActionArgumentContext(
             final ObjectAdapter targetAdapter,
+            final ObjectAction objectAction,
             final Identifier id,
             final ObjectAdapter[] args,
             final int position,
             final InteractionInitiatedBy interactionInitiatedBy) {
         super(InteractionContextType.ACTION_PROPOSED_ARGUMENT, targetAdapter, id, interactionInitiatedBy);
+        this.objectAction = objectAction;
 
         this.args = args;
         this.position = position;
         this.proposed = args[position];
     }
 
+    @Override
+    public ObjectAction getObjectAction() {
+        return objectAction;
+    }
+
     public ObjectAdapter[] getArgs() {
         return args;
     }

http://git-wip-us.apache.org/repos/asf/isis/blob/0689936c/core/metamodel/src/main/java/org/apache/isis/core/metamodel/interactions/ActionInteractionContext.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/interactions/ActionInteractionContext.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/interactions/ActionInteractionContext.java
new file mode 100644
index 0000000..70a1101
--- /dev/null
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/interactions/ActionInteractionContext.java
@@ -0,0 +1,31 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ */
+
+package org.apache.isis.core.metamodel.interactions;
+
+import org.apache.isis.core.metamodel.spec.feature.ObjectAction;
+
+/**
+ * See {@link InteractionContext} relating to {@link ObjectAction}s.
+ */
+public interface ActionInteractionContext {
+
+    ObjectAction getObjectAction();
+
+}

http://git-wip-us.apache.org/repos/asf/isis/blob/0689936c/core/metamodel/src/main/java/org/apache/isis/core/metamodel/interactions/ActionInvocationContext.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/interactions/ActionInvocationContext.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/interactions/ActionInvocationContext.java
index afe4f8e..ae741ea 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/interactions/ActionInvocationContext.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/interactions/ActionInvocationContext.java
@@ -24,6 +24,7 @@ import org.apache.isis.applib.events.ActionInvocationEvent;
 import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
 import org.apache.isis.core.metamodel.consent.InteractionContextType;
 import org.apache.isis.core.metamodel.consent.InteractionInitiatedBy;
+import org.apache.isis.core.metamodel.spec.feature.ObjectAction;
 
 import static org.apache.isis.core.metamodel.adapter.ObjectAdapter.Util.unwrap;
 
@@ -31,19 +32,27 @@ import static org.apache.isis.core.metamodel.adapter.ObjectAdapter.Util.unwrap;
  * See {@link InteractionContext} for overview; analogous to
  * {@link ActionInvocationEvent}.
  */
-public class ActionInvocationContext extends ValidityContext<ActionInvocationEvent> {
+public class ActionInvocationContext extends ValidityContext<ActionInvocationEvent> implements ActionInteractionContext {
 
+    private final ObjectAction objectAction;
     private final ObjectAdapter[] args;
 
     public ActionInvocationContext(
             final ObjectAdapter targetAdapter,
+            final ObjectAction objectAction,
             final Identifier id,
             final ObjectAdapter[] args,
             final InteractionInitiatedBy interactionInitiatedBy) {
         super(InteractionContextType.ACTION_INVOKE, targetAdapter, id, interactionInitiatedBy);
+        this.objectAction = objectAction;
         this.args = args;
     }
 
+    @Override
+    public ObjectAction getObjectAction() {
+        return objectAction;
+    }
+
     public ObjectAdapter[] getArgs() {
         return args;
     }

http://git-wip-us.apache.org/repos/asf/isis/blob/0689936c/core/metamodel/src/main/java/org/apache/isis/core/metamodel/interactions/ActionUsabilityContext.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/interactions/ActionUsabilityContext.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/interactions/ActionUsabilityContext.java
index 73aeefd..144d3f7 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/interactions/ActionUsabilityContext.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/interactions/ActionUsabilityContext.java
@@ -25,6 +25,7 @@ import org.apache.isis.applib.events.ActionUsabilityEvent;
 import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
 import org.apache.isis.core.metamodel.consent.InteractionContextType;
 import org.apache.isis.core.metamodel.consent.InteractionInitiatedBy;
+import org.apache.isis.core.metamodel.spec.feature.ObjectAction;
 
 import static org.apache.isis.core.metamodel.adapter.ObjectAdapter.Util.unwrap;
 
@@ -32,14 +33,23 @@ import static org.apache.isis.core.metamodel.adapter.ObjectAdapter.Util.unwrap;
  * See {@link InteractionContext} for overview; analogous to
  * {@link ActionUsabilityEvent}.
  */
-public class ActionUsabilityContext extends UsabilityContext<ActionUsabilityEvent> {
+public class ActionUsabilityContext extends UsabilityContext<ActionUsabilityEvent> implements ActionInteractionContext {
+
+    private final ObjectAction objectAction;
 
     public ActionUsabilityContext(
             final ObjectAdapter targetAdapter,
+            final ObjectAction objectAction,
             final Identifier id,
             final InteractionInitiatedBy interactionInitiatedBy,
             final Where where) {
         super(InteractionContextType.ACTION_USABLE, targetAdapter, id, interactionInitiatedBy, where);
+        this.objectAction = objectAction;
+    }
+
+    @Override
+    public ObjectAction getObjectAction() {
+        return objectAction;
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/isis/blob/0689936c/core/metamodel/src/main/java/org/apache/isis/core/metamodel/interactions/ActionVisibilityContext.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/interactions/ActionVisibilityContext.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/interactions/ActionVisibilityContext.java
index 85b8fdc..9c9b774 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/interactions/ActionVisibilityContext.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/interactions/ActionVisibilityContext.java
@@ -25,6 +25,7 @@ import org.apache.isis.applib.events.ActionVisibilityEvent;
 import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
 import org.apache.isis.core.metamodel.consent.InteractionContextType;
 import org.apache.isis.core.metamodel.consent.InteractionInitiatedBy;
+import org.apache.isis.core.metamodel.spec.feature.ObjectAction;
 
 import static org.apache.isis.core.metamodel.adapter.ObjectAdapter.Util.unwrap;
 
@@ -32,14 +33,23 @@ import static org.apache.isis.core.metamodel.adapter.ObjectAdapter.Util.unwrap;
  * See {@link InteractionContext} for overview; analogous to
  * {@link ActionVisibilityEvent}.
  */
-public class ActionVisibilityContext extends VisibilityContext<ActionVisibilityEvent> {
+public class ActionVisibilityContext extends VisibilityContext<ActionVisibilityEvent> implements ActionInteractionContext  {
+
+    private final ObjectAction objectAction;
 
     public ActionVisibilityContext(
             final ObjectAdapter targetAdapter,
+            final ObjectAction objectAction,
             final Identifier identifier,
             final InteractionInitiatedBy interactionInitiatedBy,
             final Where where) {
         super(InteractionContextType.ACTION_VISIBLE, targetAdapter, identifier, interactionInitiatedBy, where);
+        this.objectAction = objectAction;
+    }
+
+    @Override
+    public ObjectAction getObjectAction() {
+        return objectAction;
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/isis/blob/0689936c/core/metamodel/src/main/java/org/apache/isis/core/metamodel/interactions/InteractionContext.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/interactions/InteractionContext.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/interactions/InteractionContext.java
index 81a21b5..0e7cf0d 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/interactions/InteractionContext.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/interactions/InteractionContext.java
@@ -67,6 +67,8 @@ public abstract class InteractionContext<T extends InteractionEvent> {
     private int contributeeParam = -1; // no contributee
     private ObjectAdapter contributee = null;
 
+    private ObjectAdapter mixedInAdapter = null; // for mixin members only, obviously
+
     public InteractionContext(
             final InteractionContextType interactionType,
             final InteractionInitiatedBy invocationMethod,
@@ -146,6 +148,16 @@ public abstract class InteractionContext<T extends InteractionEvent> {
 
     // //////////////////////////////////////
 
+    public void setMixedIn(final ObjectAdapter mixedInAdapter) {
+        this.mixedInAdapter = mixedInAdapter;
+    }
+
+    public ObjectAdapter getMixedIn() {
+        return mixedInAdapter;
+    }
+
+    // //////////////////////////////////////
+
     
     
     /**

http://git-wip-us.apache.org/repos/asf/isis/blob/0689936c/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 659c5dc..a532d28 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
@@ -17,7 +17,6 @@
 
 package org.apache.isis.core.metamodel.spec.feature;
 
-import java.lang.reflect.Method;
 import java.util.List;
 
 import com.google.common.base.Predicate;
@@ -97,9 +96,12 @@ public interface ObjectAction extends ObjectMember {
     /**
      * Invokes the action's method on the target object given the specified set
      * of parameters, checking the visibility, usability and validity first.
+     *
+     * @param mixedInAdapter - will be null for regular actions, and for mixin actions.  When a mixin action invokes its underlying mixedIn action, then will be populated (so that the ActionDomainEvent can correctly provide the underlying mixin)
      */
     ObjectAdapter executeWithRuleChecking(
             final ObjectAdapter target,
+            final ObjectAdapter mixedInAdapter,
             final ObjectAdapter[] parameters,
             final InteractionInitiatedBy interactionInitiatedBy,
             final Where where) throws AuthorizationException;
@@ -107,9 +109,12 @@ public interface ObjectAction extends ObjectMember {
     /**
      * Invokes the action's method on the target object given the specified set
      * of parameters.
+     *
+     * @param mixedInAdapter - will be null for regular actions, and for mixin actions.  When a mixin action invokes its underlying mixedIn action, then will be populated (so that the ActionDomainEvent can correctly provide the underlying mixin)
      */
     ObjectAdapter execute(
             ObjectAdapter target,
+            ObjectAdapter mixedInAdapter,
             ObjectAdapter[] parameters,
             final InteractionInitiatedBy interactionInitiatedBy);
 

http://git-wip-us.apache.org/repos/asf/isis/blob/0689936c/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 4d9d782..e1a52e6 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
@@ -196,6 +196,7 @@ public class ObjectActionContributee extends ObjectActionDefault implements Cont
     @Override
     public ObjectAdapter execute(
             final ObjectAdapter contributee,
+            final ObjectAdapter mixedInAdapter,
             final ObjectAdapter[] arguments,
             final InteractionInitiatedBy interactionInitiatedBy) {
         
@@ -242,7 +243,7 @@ public class ObjectActionContributee extends ObjectActionDefault implements Cont
             }
         }
         
-        return serviceAction.execute(getServiceAdapter(), argsPlusContributee(contributee, arguments),
+        return serviceAction.execute(getServiceAdapter(), mixedInAdapter, argsPlusContributee(contributee, arguments),
                 interactionInitiatedBy);
     }
 

http://git-wip-us.apache.org/repos/asf/isis/blob/0689936c/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectActionDefault.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectActionDefault.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectActionDefault.java
index 7060cf1..09a061f 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectActionDefault.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectActionDefault.java
@@ -249,7 +249,7 @@ public class ObjectActionDefault extends ObjectMemberAbstract implements ObjectA
         return selectedParameters;
     }
 
-    private ObjectActionParameter getParameter(final int position) {
+    ObjectActionParameter getParameter(final int position) {
         final List<ObjectActionParameter> parameters = getParameters();
         if (position >= parameters.size()) {
             throw new IllegalArgumentException("getParameter(int): only " + parameters.size() + " parameters, position=" + position);
@@ -265,14 +265,14 @@ public class ObjectActionDefault extends ObjectMemberAbstract implements ObjectA
     public VisibilityContext<?> createVisibleInteractionContext(
             final ObjectAdapter targetObjectAdapter, final InteractionInitiatedBy interactionInitiatedBy,
             Where where) {
-        return new ActionVisibilityContext(targetObjectAdapter, getIdentifier(), interactionInitiatedBy, where);
+        return new ActionVisibilityContext(targetObjectAdapter, this, getIdentifier(), interactionInitiatedBy, where);
     }
 
     @Override
     public UsabilityContext<?> createUsableInteractionContext(
             final ObjectAdapter targetObjectAdapter, final InteractionInitiatedBy interactionInitiatedBy,
             Where where) {
-        return new ActionUsabilityContext(targetObjectAdapter, getIdentifier(), interactionInitiatedBy, where);
+        return new ActionUsabilityContext(targetObjectAdapter, this, getIdentifier(), interactionInitiatedBy, where);
     }
     //endregion
 
@@ -280,18 +280,26 @@ public class ObjectActionDefault extends ObjectMemberAbstract implements ObjectA
 
     @Override
     public Consent isProposedArgumentSetValid(
-            final ObjectAdapter target,
+            final ObjectAdapter targetObject,
             final ObjectAdapter[] proposedArguments,
             final InteractionInitiatedBy interactionInitiatedBy) {
-        return isProposedArgumentSetValidResultSet(target, proposedArguments, interactionInitiatedBy).createConsent();
+
+        final InteractionResultSet resultSet = new InteractionResultSet();
+
+        validateArgumentsIndividually(targetObject, proposedArguments, interactionInitiatedBy, resultSet);
+        if (resultSet.isAllowed()) {
+            // only check the action's own validity if all the arguments are OK.
+            validateArgumentSet(targetObject, proposedArguments, interactionInitiatedBy, resultSet);
+        }
+
+        return resultSet.createConsent();
     }
 
-    private InteractionResultSet isProposedArgumentSetValidResultSet(
+    protected void validateArgumentsIndividually(
             final ObjectAdapter objectAdapter,
             final ObjectAdapter[] proposedArguments,
-            final InteractionInitiatedBy interactionInitiatedBy) {
-
-        final InteractionResultSet resultSet = new InteractionResultSet();
+            final InteractionInitiatedBy interactionInitiatedBy,
+            final InteractionResultSet resultSet) {
         final List<ObjectActionParameter> actionParameters = getParameters();
         if (proposedArguments != null) {
             for (int i = 0; i < proposedArguments.length; i++) {
@@ -302,20 +310,23 @@ public class ObjectActionDefault extends ObjectMemberAbstract implements ObjectA
                 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(
-                    objectAdapter, proposedArguments, interactionInitiatedBy);
-            InteractionUtils.isValidResultSet(this, ic, resultSet);
-        }
-        return resultSet;
     }
 
-    private ActionInvocationContext createActionInvocationInteractionContext(
+    protected void validateArgumentSet(
+            final ObjectAdapter objectAdapter,
+            final ObjectAdapter[] proposedArguments,
+            final InteractionInitiatedBy interactionInitiatedBy,
+            final InteractionResultSet resultSet) {
+        final ValidityContext<?> ic = createActionInvocationInteractionContext(
+                objectAdapter, proposedArguments, interactionInitiatedBy);
+        InteractionUtils.isValidResultSet(this, ic, resultSet);
+    }
+
+    ActionInvocationContext createActionInvocationInteractionContext(
             final ObjectAdapter targetObject,
             final ObjectAdapter[] proposedArguments,
             final InteractionInitiatedBy interactionInitiatedBy) {
-        return new ActionInvocationContext(targetObject, getIdentifier(), proposedArguments,
+        return new ActionInvocationContext(targetObject, this, getIdentifier(), proposedArguments,
                 interactionInitiatedBy);
     }
 
@@ -326,6 +337,7 @@ public class ObjectActionDefault extends ObjectMemberAbstract implements ObjectA
     @Override
     public ObjectAdapter executeWithRuleChecking(
             final ObjectAdapter target,
+            final ObjectAdapter mixedInAdapter,
             final ObjectAdapter[] arguments,
             final InteractionInitiatedBy interactionInitiatedBy,
             final Where where) {
@@ -348,19 +360,20 @@ public class ObjectActionDefault extends ObjectMemberAbstract implements ObjectA
             throw new RecoverableException(validity.getReason());
         }
 
-        return execute(target, arguments, interactionInitiatedBy);
+        return execute(target, mixedInAdapter, arguments, interactionInitiatedBy);
     }
 
     @Override
     public ObjectAdapter execute(
             final ObjectAdapter target,
+            final ObjectAdapter mixedInAdapter,
             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,
+        return facet.invoke(this, target, mixedInAdapter, arguments,
                 interactionInitiatedBy);
     }
 

http://git-wip-us.apache.org/repos/asf/isis/blob/0689936c/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectActionMixedIn.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectActionMixedIn.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectActionMixedIn.java
index 483d140..40468f1 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectActionMixedIn.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectActionMixedIn.java
@@ -36,6 +36,7 @@ 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.InteractionInitiatedBy;
+import org.apache.isis.core.metamodel.consent.InteractionResultSet;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
 import org.apache.isis.core.metamodel.facetapi.FacetHolderImpl;
 import org.apache.isis.core.metamodel.facetapi.FacetUtil;
@@ -44,6 +45,7 @@ import org.apache.isis.core.metamodel.facets.actions.bulk.BulkFacet;
 import org.apache.isis.core.metamodel.facets.all.named.NamedFacetInferred;
 import org.apache.isis.core.metamodel.interactions.InteractionUtils;
 import org.apache.isis.core.metamodel.interactions.UsabilityContext;
+import org.apache.isis.core.metamodel.interactions.ValidityContext;
 import org.apache.isis.core.metamodel.interactions.VisibilityContext;
 import org.apache.isis.core.metamodel.spec.ObjectSpecification;
 import org.apache.isis.core.metamodel.spec.feature.ObjectActionParameter;
@@ -59,7 +61,7 @@ public class ObjectActionMixedIn extends ObjectActionDefault implements MixedInM
     /**
      * The {@link ObjectActionDefault} for the action being mixed in (ie on the {@link #mixinType}.
      */
-    private final ObjectActionDefault mixinAction;
+    final ObjectActionDefault mixinAction;
 
     /**
      * The domain object type being mixed in to (being supplemented).
@@ -152,7 +154,7 @@ public class ObjectActionMixedIn extends ObjectActionDefault implements MixedInM
         final VisibilityContext<?> ic =
                 mixinAction.createVisibleInteractionContext(
                         mixinAdapterFor(mixinType, mixedInAdapter), interactionInitiatedBy, where);
-        ic.putContributee(0, mixedInAdapter);
+        ic.setMixedIn(mixedInAdapter);
         return InteractionUtils.isVisibleResult(this, ic).createConsent();
     }
 
@@ -163,10 +165,11 @@ public class ObjectActionMixedIn extends ObjectActionDefault implements MixedInM
         final UsabilityContext<?> ic =
                 mixinAction.createUsableInteractionContext(
                         mixinAdapterFor(mixinType, mixedInAdapter), interactionInitiatedBy, where);
-        ic.putContributee(0, mixedInAdapter);
+        ic.setMixedIn(mixedInAdapter);
         return InteractionUtils.isUsableResult(this, ic).createConsent();
     }
 
+
     @Override
     public ObjectAdapter[] getDefaults(final ObjectAdapter mixedInAdapter) {
         return mixinAction.getDefaults(mixinAdapterFor(mixinType, mixedInAdapter));
@@ -179,16 +182,28 @@ public class ObjectActionMixedIn extends ObjectActionDefault implements MixedInM
         return mixinAction.getChoices(mixinAdapterFor(mixinType, mixedInAdapter), interactionInitiatedBy);
     }
 
-    public Consent isProposedArgumentSetValid(
+    @Override
+    protected void validateArgumentSet(
             final ObjectAdapter mixedInAdapter,
             final ObjectAdapter[] proposedArguments,
-            final InteractionInitiatedBy interactionInitiatedBy) {
-        return mixinAction.isProposedArgumentSetValid(mixinAdapterFor(mixinType, mixedInAdapter), proposedArguments, interactionInitiatedBy);
+            final InteractionInitiatedBy interactionInitiatedBy,
+            final InteractionResultSet resultSet) {
+
+        final ObjectAdapter targetObject = mixinAdapterFor(mixinType, mixedInAdapter);
+
+        final ValidityContext<?> ic =  mixinAction.createActionInvocationInteractionContext(
+                targetObject, proposedArguments, interactionInitiatedBy);
+        ic.setMixedIn(mixedInAdapter);
+
+        InteractionUtils.isValidResultSet(this, ic, resultSet);
     }
 
+
+
     @Override
     public ObjectAdapter execute(
-            final ObjectAdapter mixedInAdapter,
+            final ObjectAdapter target,         // will be the mixedInAdapter
+            final ObjectAdapter mixedInAdapter, // will be passed in as null
             final ObjectAdapter[] arguments,
             final InteractionInitiatedBy interactionInitiatedBy) {
 
@@ -204,7 +219,7 @@ public class ObjectActionMixedIn extends ObjectActionDefault implements MixedInM
                     actionInvocationContext.getInvokedOn() == null) {
 
                 actionInvocationContext.setInvokedOn(InvokedOn.OBJECT);
-                actionInvocationContext.setDomainObjects(Collections.singletonList(mixedInAdapter.getObject()));
+                actionInvocationContext.setDomainObjects(Collections.singletonList(target.getObject()));
             }
 
             final Bulk.InteractionContext bulkInteractionContext = getServicesInjector().lookupService(Bulk.InteractionContext.class);
@@ -212,7 +227,7 @@ public class ObjectActionMixedIn extends ObjectActionDefault implements MixedInM
                     bulkInteractionContext.getInvokedAs() == null) {
 
                 bulkInteractionContext.setInvokedAs(Bulk.InteractionContext.InvokedAs.REGULAR);
-                actionInvocationContext.setDomainObjects(Collections.singletonList(mixedInAdapter.getObject()));
+                actionInvocationContext.setDomainObjects(Collections.singletonList(target.getObject()));
             }
         }
 
@@ -225,16 +240,20 @@ public class ObjectActionMixedIn extends ObjectActionDefault implements MixedInM
                 // already set up by a edit form
                 // don't overwrite
             } else {
-                command.setTargetClass(CommandUtil.targetClassNameFor(mixedInAdapter));
+                command.setTargetClass(CommandUtil.targetClassNameFor(target));
                 command.setTargetAction(CommandUtil.targetActionNameFor(this));
                 command.setArguments(CommandUtil.argDescriptionFor(this, arguments));
 
-                final Bookmark targetBookmark = CommandUtil.bookmarkFor(mixedInAdapter);
+                final Bookmark targetBookmark = CommandUtil.bookmarkFor(target);
                 command.setTarget(targetBookmark);
             }
         }
 
-        return mixinAction.execute(mixinAdapterFor(mixinType, mixedInAdapter), arguments, interactionInitiatedBy);
+        final ObjectAdapter targetAdapter = mixinAdapterFor(mixinType, target);
+        final ObjectAdapter actualMixedInAdapter = target;
+        return mixinAction.execute(
+                targetAdapter, actualMixedInAdapter, arguments,
+                interactionInitiatedBy);
     }
 
 

http://git-wip-us.apache.org/repos/asf/isis/blob/0689936c/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 70f5d2d..c309352 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
@@ -452,9 +452,8 @@ public abstract class ObjectActionParameterAbstract implements ObjectActionParam
             final ObjectAdapter[] proposedArguments,
             final int position,
             final InteractionInitiatedBy interactionInitiatedBy) {
-        //final ObjectAdapter targetAdapter = targetForDefaultOrChoicesOrValidate(objectAdapter);
         return new ActionArgumentContext(
-                objectAdapter, getIdentifier(), proposedArguments, position, interactionInitiatedBy);
+                objectAdapter, parentAction, getIdentifier(), proposedArguments, position, interactionInitiatedBy);
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/isis/blob/0689936c/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/OneToManyAssociationContributee.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/OneToManyAssociationContributee.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/OneToManyAssociationContributee.java
index 98ed793..8c6d1bf 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/OneToManyAssociationContributee.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/OneToManyAssociationContributee.java
@@ -121,7 +121,7 @@ public class OneToManyAssociationContributee extends OneToManyAssociationDefault
 
     @Override
     public ObjectAdapter get(final ObjectAdapter ownerAdapter, final InteractionInitiatedBy interactionInitiatedBy) {
-        return serviceAction.execute(getServiceAdapter(), new ObjectAdapter[]{ownerAdapter}, interactionInitiatedBy);
+        return serviceAction.execute(getServiceAdapter(), null, new ObjectAdapter[]{ownerAdapter}, interactionInitiatedBy);
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/isis/blob/0689936c/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/OneToManyAssociationMixedIn.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/OneToManyAssociationMixedIn.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/OneToManyAssociationMixedIn.java
index 703ede7..0a49d5f 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/OneToManyAssociationMixedIn.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/OneToManyAssociationMixedIn.java
@@ -145,7 +145,7 @@ public class OneToManyAssociationMixedIn extends OneToManyAssociationDefault imp
     @Override
     public ObjectAdapter get(final ObjectAdapter mixedInAdapter, final InteractionInitiatedBy interactionInitiatedBy) {
         final ObjectAdapter mixinAdapter = mixinAdapterFor(mixinType, mixedInAdapter);
-        return mixinAction.execute(mixinAdapter, new ObjectAdapter[0], interactionInitiatedBy);
+        return mixinAction.execute(mixinAdapter, mixedInAdapter, new ObjectAdapter[0], interactionInitiatedBy);
     }
 
     @Override
@@ -171,7 +171,7 @@ public class OneToManyAssociationMixedIn extends OneToManyAssociationDefault imp
         final VisibilityContext<?> ic =
                 mixinAction.createVisibleInteractionContext(
                         mixinAdapterFor(mixinType, mixedInAdapter), interactionInitiatedBy, where);
-        ic.putContributee(0, mixedInAdapter);
+        ic.setMixedIn(mixedInAdapter);
         return InteractionUtils.isVisibleResult(this, ic).createConsent();
     }
 
@@ -183,7 +183,7 @@ public class OneToManyAssociationMixedIn extends OneToManyAssociationDefault imp
         final UsabilityContext<?> ic =
                 mixinAction.createUsableInteractionContext(
                         mixinAdapterFor(mixinType, mixedInAdapter), interactionInitiatedBy, where);
-        ic.putContributee(0, mixedInAdapter);
+        ic.setMixedIn(mixedInAdapter);
         return InteractionUtils.isUsableResult(this, ic).createConsent();
     }
 

http://git-wip-us.apache.org/repos/asf/isis/blob/0689936c/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/OneToOneActionParameterMixedIn.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/OneToOneActionParameterMixedIn.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/OneToOneActionParameterMixedIn.java
index 96221ea..39aea08 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/OneToOneActionParameterMixedIn.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/OneToOneActionParameterMixedIn.java
@@ -18,6 +18,7 @@ package org.apache.isis.core.metamodel.specloader.specimpl;
 
 import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
 import org.apache.isis.core.metamodel.consent.InteractionInitiatedBy;
+import org.apache.isis.core.metamodel.interactions.ActionArgumentContext;
 import org.apache.isis.core.metamodel.spec.feature.ObjectActionParameter;
 
 public class OneToOneActionParameterMixedIn extends OneToOneActionParameterDefault implements ObjectActionParameterMixedIn {
@@ -51,6 +52,19 @@ public class OneToOneActionParameterMixedIn extends OneToOneActionParameterDefau
         return mixedInAction.mixinAdapterFor(mixedInAdapter);
     }
 
+    @Override
+    public ActionArgumentContext createProposedArgumentInteractionContext(
+            final ObjectAdapter mixedInAdapter,
+            final ObjectAdapter[] proposedArguments,
+            final int position,
+            final InteractionInitiatedBy interactionInitiatedBy) {
 
+        final ObjectAdapter targetObject = mixinAdapterFor(mixedInAdapter);
+
+        final ActionArgumentContext actionArgumentContext = new ActionArgumentContext(
+                targetObject, mixedInAction.mixinAction, getIdentifier(), proposedArguments, position, interactionInitiatedBy);
+        actionArgumentContext.setMixedIn(mixedInAdapter);
+        return actionArgumentContext;
+    }
 
 }

http://git-wip-us.apache.org/repos/asf/isis/blob/0689936c/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/OneToOneAssociationContributee.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/OneToOneAssociationContributee.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/OneToOneAssociationContributee.java
index 61b0984..1bfa110 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/OneToOneAssociationContributee.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/OneToOneAssociationContributee.java
@@ -102,7 +102,7 @@ public class OneToOneAssociationContributee extends OneToOneAssociationDefault i
 
     @Override
     public ObjectAdapter get(final ObjectAdapter ownerAdapter, final InteractionInitiatedBy interactionInitiatedBy) {
-        return serviceAction.execute(getServiceAdapter(), new ObjectAdapter[]{ownerAdapter}, interactionInitiatedBy);
+        return serviceAction.execute(getServiceAdapter(), null, new ObjectAdapter[]{ownerAdapter}, interactionInitiatedBy);
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/isis/blob/0689936c/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/OneToOneAssociationMixedIn.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/OneToOneAssociationMixedIn.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/OneToOneAssociationMixedIn.java
index f7c2f93..9f83174 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/OneToOneAssociationMixedIn.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/OneToOneAssociationMixedIn.java
@@ -128,7 +128,7 @@ public class OneToOneAssociationMixedIn extends OneToOneAssociationDefault imple
             final InteractionInitiatedBy interactionInitiatedBy) {
 
         final ObjectAdapter mixinAdapter = mixinAdapterFor(mixinType, mixedInAdapter);
-        return mixinAction.execute(mixinAdapter, new ObjectAdapter[0], interactionInitiatedBy);
+        return mixinAction.execute(mixinAdapter, mixedInAdapter, new ObjectAdapter[0], interactionInitiatedBy);
     }
 
     @Override
@@ -154,7 +154,7 @@ public class OneToOneAssociationMixedIn extends OneToOneAssociationDefault imple
         final VisibilityContext<?> ic =
                 mixinAction.createVisibleInteractionContext(
                         mixinAdapterFor(mixinType, mixedInAdapter), interactionInitiatedBy, where);
-        ic.putContributee(0, mixedInAdapter);
+        ic.setMixedIn(mixedInAdapter);
         return InteractionUtils.isVisibleResult(this, ic).createConsent();
     }
 
@@ -165,7 +165,7 @@ public class OneToOneAssociationMixedIn extends OneToOneAssociationDefault imple
         final UsabilityContext<?> ic =
                 mixinAction.createUsableInteractionContext(
                         mixinAdapterFor(mixinType, mixedInAdapter), interactionInitiatedBy, where);
-        ic.putContributee(0, mixedInAdapter);
+        ic.setMixedIn(mixedInAdapter);
         return InteractionUtils.isUsableResult(this, ic).createConsent();
     }
 

http://git-wip-us.apache.org/repos/asf/isis/blob/0689936c/core/runtime/src/main/java/org/apache/isis/core/runtime/services/background/BackgroundCommandExecution.java
----------------------------------------------------------------------
diff --git a/core/runtime/src/main/java/org/apache/isis/core/runtime/services/background/BackgroundCommandExecution.java b/core/runtime/src/main/java/org/apache/isis/core/runtime/services/background/BackgroundCommandExecution.java
index 09f1b2a..8cf11dd 100644
--- a/core/runtime/src/main/java/org/apache/isis/core/runtime/services/background/BackgroundCommandExecution.java
+++ b/core/runtime/src/main/java/org/apache/isis/core/runtime/services/background/BackgroundCommandExecution.java
@@ -112,8 +112,15 @@ public abstract class BackgroundCommandExecution extends AbstractIsisSessionTemp
                     }
 
                     final ObjectAdapter[] argAdapters = argAdaptersFor(aim);
+
+                    // TODO: background commands won't work for mixin actions...
+                    // ... we obtain the target from the bookmark service (above), which will
+                    // simply fail for a mixin.  Instead we would need to serialize out the mixedInAdapter
+                    // and also capture the mixinType within the aim memento.
+                    final ObjectAdapter mixedInAdapter = null;
+
                     final ObjectAdapter resultAdapter = objectAction.execute(
-                            targetAdapter, argAdapters, InteractionInitiatedBy.FRAMEWORK);
+                            targetAdapter, mixedInAdapter, argAdapters, InteractionInitiatedBy.FRAMEWORK);
                     if(resultAdapter != null) {
                         Bookmark resultBookmark = CommandUtil.bookmarkFor(resultAdapter);
                         command.setResult(resultBookmark);

http://git-wip-us.apache.org/repos/asf/isis/blob/0689936c/core/runtime/src/main/java/org/apache/isis/core/runtime/services/homepage/HomePageProviderServiceDefault.java
----------------------------------------------------------------------
diff --git a/core/runtime/src/main/java/org/apache/isis/core/runtime/services/homepage/HomePageProviderServiceDefault.java b/core/runtime/src/main/java/org/apache/isis/core/runtime/services/homepage/HomePageProviderServiceDefault.java
index 5a4d9d5..f712a5b 100644
--- a/core/runtime/src/main/java/org/apache/isis/core/runtime/services/homepage/HomePageProviderServiceDefault.java
+++ b/core/runtime/src/main/java/org/apache/isis/core/runtime/services/homepage/HomePageProviderServiceDefault.java
@@ -87,10 +87,14 @@ public class HomePageProviderServiceDefault implements HomePageProviderService {
             return  null;
         }
 
+        final ObjectAdapter mixedInAdapter = null;
+        final ObjectAdapter[] parameters = {};
+
         final ObjectAdapter objectAdapter = objectAction.executeWithRuleChecking(
-                serviceAdapter, new ObjectAdapter[] {},
+                serviceAdapter, mixedInAdapter, parameters,
                 InteractionInitiatedBy.USER,
                 WHERE_FOR_ACTION_INVOCATION);
+
         return objectAdapter != null ? objectAdapter.getObject(): null;
     }
 

http://git-wip-us.apache.org/repos/asf/isis/blob/0689936c/core/runtime/src/main/java/org/apache/isis/core/runtime/transaction/facets/ActionInvocationFacetWrapTransaction.java
----------------------------------------------------------------------
diff --git a/core/runtime/src/main/java/org/apache/isis/core/runtime/transaction/facets/ActionInvocationFacetWrapTransaction.java b/core/runtime/src/main/java/org/apache/isis/core/runtime/transaction/facets/ActionInvocationFacetWrapTransaction.java
index b17b269..f099b72 100644
--- a/core/runtime/src/main/java/org/apache/isis/core/runtime/transaction/facets/ActionInvocationFacetWrapTransaction.java
+++ b/core/runtime/src/main/java/org/apache/isis/core/runtime/transaction/facets/ActionInvocationFacetWrapTransaction.java
@@ -54,12 +54,13 @@ public class ActionInvocationFacetWrapTransaction extends ActionInvocationFacetA
     public ObjectAdapter invoke(
             final ObjectAction owningAction,
             final ObjectAdapter targetAdapter,
+            final ObjectAdapter mixedInAdapter,
             final ObjectAdapter[] argumentAdapters,
             final InteractionInitiatedBy interactionInitiatedBy) {
         final ObjectAdapter result = getTransactionManager().executeWithinTransaction(new TransactionalClosureWithReturn<ObjectAdapter>() {
             @Override
             public ObjectAdapter execute() {
-                return underlyingFacet.invoke(owningAction, targetAdapter, argumentAdapters,
+                return underlyingFacet.invoke(owningAction, targetAdapter, mixedInAdapter, argumentAdapters,
                         interactionInitiatedBy);
             }
         });

http://git-wip-us.apache.org/repos/asf/isis/blob/0689936c/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 69ee367..8e42cbf 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
@@ -371,8 +371,11 @@ public class DomainResourceHelper {
         final List<ObjectAdapter> argAdapters = argHelper.parseAndValidateArguments(arguments);
 
         // invoke
-        final ObjectAdapter[] argArray2 = argAdapters.toArray(new ObjectAdapter[0]);
-        final ObjectAdapter returnedAdapter = action.execute(objectAdapter, argArray2, InteractionInitiatedBy.USER);
+        final ObjectAdapter mixedInAdapter = null; // action will automatically fill in if a mixin
+        final ObjectAdapter[] argAdapterArr = argAdapters.toArray(new ObjectAdapter[argAdapters.size()]);
+        final ObjectAdapter returnedAdapter = action.execute(
+                objectAdapter,  mixedInAdapter, argAdapterArr,
+                InteractionInitiatedBy.USER);
 
         final ObjectAndActionInvocation objectAndActionInvocation =
                 new ObjectAndActionInvocation(objectAdapter, action, arguments, returnedAdapter, selfLink);
@@ -387,10 +390,6 @@ public class DomainResourceHelper {
     // dependencies (from context)
     // //////////////////////////////////////
 
-    private PersistenceSession getPersistenceSession() {
-        return resourceContext.getPersistenceSession();
-    }
-
     private ServicesInjector getServicesInjector() {
         return resourceContext.getServicesInjector();
     }

http://git-wip-us.apache.org/repos/asf/isis/blob/0689936c/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 a74cb2c..b569d86 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
@@ -463,9 +463,11 @@ public class ActionModel extends BookmarkableModel<ObjectAdapter> {
         final ObjectAdapter[] arguments = getArgumentsAsArray();
         final ObjectAction action = getActionMemento().getAction();
 
+        // if this action is a mixin, then it will fill in the details automatically.
+        final ObjectAdapter mixedInAdapter = null;
         final ObjectAdapter resultAdapter =
                 action.executeWithRuleChecking(
-                        targetAdapter, arguments,
+                        targetAdapter, mixedInAdapter, arguments,
                         InteractionInitiatedBy.USER,
                         WHERE_FOR_ACTION_INVOCATION);
 

http://git-wip-us.apache.org/repos/asf/isis/blob/0689936c/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 7004c56..08134fc 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
@@ -125,7 +125,11 @@ public final class BulkActionsLinkFactory implements ActionLinkFactory {
                             bulkInteractionContext.setIndex(i++);
                         }
 
-                        lastReturnedAdapter = objectAction.executeWithRuleChecking(adapter, new ObjectAdapter[]{},
+                        final ObjectAdapter mixedInAdapter = null;
+                        final ObjectAdapter[] arguments = {};
+
+                        lastReturnedAdapter = objectAction.executeWithRuleChecking(
+                                adapter, mixedInAdapter, arguments,
                                 InteractionInitiatedBy.USER, ActionModel.WHERE_FOR_ACTION_INVOCATION
                         );
                     }

http://git-wip-us.apache.org/repos/asf/isis/blob/0689936c/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 7cb0659..b7db730 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
@@ -625,8 +625,11 @@ public class DomainObjectInvocationHandler<T> extends DelegatingInvocationHandle
 
         if (getExecutionMode().shouldExecute()) {
             final InteractionInitiatedBy interactionInitiatedBy = getInteractionInitiatedBy();
-            final ObjectAdapter actionReturnNO =
-                    objectAction.execute(targetAdapter, argAdapters, interactionInitiatedBy);
+            final ObjectAdapter mixedInAdapter = null; // mixin action will automatically fill in.
+            final ObjectAdapter returnedAdapter =
+                    objectAction.execute(
+                            targetAdapter, mixedInAdapter, argAdapters,
+                            interactionInitiatedBy);
 
             final IsisTransaction transaction = IsisContext.getTransactionManager().getTransaction();
 
@@ -635,7 +638,7 @@ public class DomainObjectInvocationHandler<T> extends DelegatingInvocationHandle
 
             transaction.publishActionIfRequired(currentUser, timestamp);
 
-            return ObjectAdapter.Util.unwrap(actionReturnNO);
+            return ObjectAdapter.Util.unwrap(returnedAdapter);
         }
 
         return null;

http://git-wip-us.apache.org/repos/asf/isis/blob/0689936c/example/archetype/simpleapp/src/main/resources/archetype-resources/app/src/main/java/domainapp/app/services/homepage/HomePageService.java
----------------------------------------------------------------------
diff --git a/example/archetype/simpleapp/src/main/resources/archetype-resources/app/src/main/java/domainapp/app/services/homepage/HomePageService.java b/example/archetype/simpleapp/src/main/resources/archetype-resources/app/src/main/java/domainapp/app/services/homepage/HomePageService.java
index 744ac0b..8efe0fd 100644
--- a/example/archetype/simpleapp/src/main/resources/archetype-resources/app/src/main/java/domainapp/app/services/homepage/HomePageService.java
+++ b/example/archetype/simpleapp/src/main/resources/archetype-resources/app/src/main/java/domainapp/app/services/homepage/HomePageService.java
@@ -22,11 +22,22 @@
 package domainapp.app.services.homepage;
 
 import org.apache.isis.applib.annotation.Action;
+import com.google.common.eventbus.Subscribe;
+
+import org.apache.isis.applib.AbstractSubscriber;
 import org.apache.isis.applib.annotation.DomainService;
 import org.apache.isis.applib.annotation.HomePage;
 import org.apache.isis.applib.annotation.NatureOfService;
 import org.apache.isis.applib.annotation.SemanticsOf;
 import org.apache.isis.applib.services.registry.ServiceRegistry;
+=======
+import org.apache.isis.applib.services.eventbus.AbstractDomainEvent;
+import org.apache.isis.applib.services.eventbus.ActionDomainEvent;
+import org.apache.isis.applib.services.layout.Object_downloadLayoutXml;
+import org.apache.isis.applib.services.layout.Object_rebuildMetamodel;
+
+import domainapp.app.services.homepage.HomePageViewModel;
+>>>>>>> ISIS-1343: extend ActionI invocation to take the targetAdapter, mixedInAdapter (can be null) and arg array.:example/archetype/simpleapp/src/main/resources/archetype-resources/app/src/main/java/domainapp/app/services/prototyping/HideMixinsForHomePage.java
 
 @DomainService(
         nature = NatureOfService.VIEW_CONTRIBUTIONS_ONLY // trick to suppress the actions from the top-level menu