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