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 2014/12/31 08:12:23 UTC

[1/2] isis git commit: ISIS-970: refactoring the Bulk.InteractionContext and BulkInteractionContext services: no longer does former inherit from latter...

Repository: isis
Updated Branches:
  refs/heads/ISIS-970 b6bd26b18 -> 4eed0900f


ISIS-970: refactoring the Bulk.InteractionContext and BulkInteractionContext services: no longer does former inherit from latter...

... instead these are two separate services, with BulkInteractionContext renamed to ActionInvocationContext.

Refactored ToDoItem to use ActionInvocationContext rather than Bulk.InteractionContext


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

Branch: refs/heads/ISIS-970
Commit: e11eaef27ebabb560be4680a3ff039637743a794
Parents: b6bd26b
Author: Dan Haywood <da...@haywood-associates.co.uk>
Authored: Tue Dec 30 23:58:00 2014 +0000
Committer: Dan Haywood <da...@haywood-associates.co.uk>
Committed: Tue Dec 30 23:58:00 2014 +0000

----------------------------------------------------------------------
 .../collection/bulk/BulkActionsLinkFactory.java |  19 +-
 .../annotation/ActionInvocationContext.java     | 176 +++++++++++++++
 .../org/apache/isis/applib/annotation/Bulk.java | 133 ++++++++++-
 .../annotation/BulkInteractionContext.java      | 218 -------------------
 ...onInvocationFacetForInteractionAbstract.java |  27 ++-
 .../specimpl/ObjectActionContributee.java       |  29 ++-
 .../system/transaction/IsisTransaction.java     |   7 +-
 .../transaction/IsisTransactionManager.java     |   6 +-
 .../system/transaction/IsisTransactionTest.java |   8 +-
 .../dom/src/main/java/dom/todo/ToDoItem.java    |  19 +-
 .../src/test/java/dom/todo/ToDoItemTest.java    |   4 +-
 .../integration/glue/todoitem/ToDoItemGlue.java |   8 +-
 12 files changed, 379 insertions(+), 275 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/isis/blob/e11eaef2/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collection/bulk/BulkActionsLinkFactory.java
----------------------------------------------------------------------
diff --git a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collection/bulk/BulkActionsLinkFactory.java b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collection/bulk/BulkActionsLinkFactory.java
index bceec46..a46de73 100644
--- a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collection/bulk/BulkActionsLinkFactory.java
+++ b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collection/bulk/BulkActionsLinkFactory.java
@@ -26,8 +26,9 @@ import org.apache.wicket.Session;
 import org.apache.wicket.markup.html.link.AbstractLink;
 import org.apache.wicket.markup.html.link.Link;
 import org.apache.isis.applib.RecoverableException;
+import org.apache.isis.applib.annotation.ActionInvocationContext;
 import org.apache.isis.applib.annotation.ActionLayout;
-import org.apache.isis.applib.annotation.BulkInteractionContext;
+import org.apache.isis.applib.annotation.Bulk;
 import org.apache.isis.applib.annotation.InvokedOn;
 import org.apache.isis.applib.services.command.Command;
 import org.apache.isis.applib.services.command.Command.Executor;
@@ -91,14 +92,20 @@ public final class BulkActionsLinkFactory implements ActionLinkFactory {
                             Iterables.transform(toggleMementosList, ObjectAdapterMemento.Functions.fromMemento(concurrencyChecking));
                     
                     final List<Object> domainObjects = Lists.newArrayList(Iterables.transform(toggledAdapters, ObjectAdapter.Functions.getObject()));
-                    
-                    
-                    final BulkInteractionContext bulkInteractionContext = BulkInteractionContext.current.get();
+
+
+                    final ActionInvocationContext actionInvocationContext = getServicesInjector().lookupService(ActionInvocationContext.class);
+                    if (actionInvocationContext != null) {
+                        actionInvocationContext.setInvokedOn(InvokedOn.COLLECTION);
+                        actionInvocationContext.setDomainObjects(domainObjects);
+                    }
+
+                    final Bulk.InteractionContext bulkInteractionContext = getServicesInjector().lookupService(Bulk.InteractionContext.class);
                     if (bulkInteractionContext != null) {
-                        bulkInteractionContext.setActionInvokedOn(InvokedOn.COLLECTION);
+                        bulkInteractionContext.setInvokedAs(Bulk.InteractionContext.InvokedAs.BULK);
                         bulkInteractionContext.setDomainObjects(domainObjects);
                     }
-                    
+
                     final CommandContext commandContext = getServicesInjector().lookupService(CommandContext.class);
                     final Command command;
                     if (commandContext != null) {

http://git-wip-us.apache.org/repos/asf/isis/blob/e11eaef2/core/applib/src/main/java/org/apache/isis/applib/annotation/ActionInvocationContext.java
----------------------------------------------------------------------
diff --git a/core/applib/src/main/java/org/apache/isis/applib/annotation/ActionInvocationContext.java b/core/applib/src/main/java/org/apache/isis/applib/annotation/ActionInvocationContext.java
new file mode 100644
index 0000000..93aad9a
--- /dev/null
+++ b/core/applib/src/main/java/org/apache/isis/applib/annotation/ActionInvocationContext.java
@@ -0,0 +1,176 @@
+/*
+ *  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.applib.annotation;
+
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.List;
+
+/**
+ * This service (API and implementation) provides access to context information about a bulk action invocation.
+ *
+ * <p>
+ * This implementation has no UI and there is only one implementation (this class) in applib, so it is annotated
+ * with {@link DomainService}.  This means that it is automatically registered
+ * and available for use; no further configuration is required.
+ * </p>
+ *
+ * <p>
+ *     Note that this not annotated as <tt>@DomainService</tt> an <tt>@RequestScoped</tt> only because of the
+ *     legacy {@link org.apache.isis.applib.annotation.Bulk.InteractionContext} subclass (which *is* registered as
+ *     the service).
+ * </p>
+ */
+public abstract class ActionInvocationContext {
+
+    /**
+     * Intended only to support unit testing.
+     */
+    public static ActionInvocationContext onObject(final Object domainObject) {
+        return new ActionInvocationContext(InvokedOn.OBJECT, Collections.singletonList(domainObject)){};
+    }
+
+    /**
+     * Intended only to support unit testing.
+     */
+    public static ActionInvocationContext onCollection(final Object... domainObjects) {
+        return onCollection(Arrays.asList(domainObjects));
+    }
+
+    /**
+     * Intended only to support unit testing.
+     */
+    public static ActionInvocationContext onCollection(final List<Object> domainObjects) {
+        return new ActionInvocationContext(InvokedOn.COLLECTION, domainObjects){};
+    }
+
+    // //////////////////////////////////////
+
+
+    private InvokedOn invokedOn;
+    private List<Object> domainObjects;
+
+    private int index;
+
+    // //////////////////////////////////////
+
+    public ActionInvocationContext() {
+    }
+
+    /**
+     * @deprecated - now a {@link javax.enterprise.context.RequestScoped} service
+     */
+    @Deprecated
+    public ActionInvocationContext(final InvokedOn invokedOn, final Object... domainObjects) {
+        this(invokedOn, Arrays.asList(domainObjects));
+    }
+
+    /**
+     * @deprecated - now a {@link javax.enterprise.context.RequestScoped} service
+     */
+    @Deprecated
+    public ActionInvocationContext(final InvokedOn invokedOn, final List<Object> domainObjects) {
+        this.invokedOn = invokedOn;
+        this.domainObjects = domainObjects;
+    }
+
+    // //////////////////////////////////////
+
+    /**
+     * <b>NOT API</b>: intended to be called only by the framework.
+     */
+    @Programmatic
+    public void setInvokedOn(final InvokedOn invokedOn) {
+        this.invokedOn = invokedOn;
+    }
+
+    /**
+     * <b>NOT API</b>: intended to be called only by the framework.
+     */
+    @Programmatic
+    public void setDomainObjects(final List<Object> domainObjects) {
+        this.domainObjects = domainObjects;
+    }
+
+    /**
+     * <b>NOT API</b>: intended to be called only by the framework.
+     */
+    @Programmatic
+    public void setIndex(final int index) {
+        this.index = index;
+    }
+
+    // //////////////////////////////////////
+
+
+    /**
+     * Whether this particular {@link ActionInvocationContext} was applied as a {@link InvokedOn#COLLECTION bulk} action
+     * (against each domain object in a list of domain objects) or as a {@link InvokedOn#OBJECT regular}
+     * action (against a single domain object).
+     */
+    @Programmatic
+    public InvokedOn getInvokedOn() {
+        return invokedOn;
+    }
+
+
+    /**
+     * The list of domain objects which are being acted upon.
+     */
+    @Programmatic
+    public List<Object> getDomainObjects() {
+        return domainObjects;
+    }
+
+    /**
+     * The number of {@link #domainObjects domain objects} being acted upon.
+     */
+    @Programmatic
+    public int getSize() {
+        return domainObjects.size();
+    }
+
+    /**
+     * The 0-based index to the object being acted upon.
+     *
+     * <p>
+     * Will be a value in range [0, {@link #getSize() size}).
+     */
+    @Programmatic
+    public int getIndex() {
+        return index;
+    }
+
+    /**
+     * Whether this object being acted upon is the first such.
+     */
+    @Programmatic
+    public boolean isFirst() {
+        return this.index == 0;
+    }
+
+    /**
+     * Whether this object being acted upon is the last such.
+     */
+    @Programmatic
+    public boolean isLast() {
+        return this.index == (getSize()-1);
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/isis/blob/e11eaef2/core/applib/src/main/java/org/apache/isis/applib/annotation/Bulk.java
----------------------------------------------------------------------
diff --git a/core/applib/src/main/java/org/apache/isis/applib/annotation/Bulk.java b/core/applib/src/main/java/org/apache/isis/applib/annotation/Bulk.java
index cefd1f1..1146576 100644
--- a/core/applib/src/main/java/org/apache/isis/applib/annotation/Bulk.java
+++ b/core/applib/src/main/java/org/apache/isis/applib/annotation/Bulk.java
@@ -61,13 +61,25 @@ public @interface Bulk {
     // //////////////////////////////////////
 
     /**
-     * @deprecated - see {@link BulkInteractionContext}.
+     * @deprecated - see {@link ActionInvocationContext}.
      */
     @Deprecated
     @DomainService
     @RequestScoped
-    public static class InteractionContext extends BulkInteractionContext {
+    public static class InteractionContext {
 
+        /**
+         * Intended only to be set only by the framework.
+         *
+         * <p>
+         * Will be populated while a bulk action is being invoked.
+         *
+         * @deprecated - now a {@link javax.enterprise.context.RequestScoped} service; simply inject an instance of {@link org.apache.isis.applib.annotation.Bulk.InteractionContext}.
+         */
+        @Deprecated
+        public static final ThreadLocal<Bulk.InteractionContext> current = new ThreadLocal<>();
+
+        // //////////////////////////////////////
 
         /**
          * @deprecated - use {@link InvokedOn} instead.
@@ -86,13 +98,11 @@ public @interface Bulk {
             REGULAR;
             public boolean isRegular() { return this == REGULAR; }
             public boolean isBulk() { return this == BULK; }
-
-
         }
 
 
         /**
-         * @deprecated - now a {@link RequestScoped} service
+         * @deprecated - now a {@link javax.enterprise.context.RequestScoped} service
          */
         @Deprecated
         public static void with(final Runnable runnable, final Object... domainObjects) {
@@ -100,6 +110,15 @@ public @interface Bulk {
         }
 
         /**
+         * @deprecated - now a {@link javax.enterprise.context.RequestScoped} service
+         */
+        @Deprecated
+        public static void with(final Runnable runnable, final InvokedOn invokedOn, final Object... domainObjects) {
+            throw new RuntimeException("No longer supported - instead inject Bulk.InteractionContext as service");
+        }
+
+
+        /**
          * @deprecated - now a {@link RequestScoped} service
          */
         @Deprecated
@@ -109,8 +128,9 @@ public @interface Bulk {
 
         // //////////////////////////////////////
 
+
         /**
-         * @deprecated - see {@link BulkInteractionContext#regularAction(Object)}.
+         * @deprecated - see {@link ActionInvocationContext#onObject(Object)}.
          */
         @Deprecated
         public static InteractionContext regularAction(Object domainObject) {
@@ -118,7 +138,7 @@ public @interface Bulk {
         }
 
         /**
-         * @deprecated - see {@link BulkInteractionContext#bulkAction(Object...)}.
+         * @deprecated - see {@link ActionInvocationContext#onCollection(Object...)}.
          */
         @Deprecated
         public static InteractionContext bulkAction(Object... domainObjects) {
@@ -126,7 +146,7 @@ public @interface Bulk {
         }
 
         /**
-         * @deprecated - see {@link BulkInteractionContext#bulkAction(java.util.List)}.
+         * @deprecated - see {@link ActionInvocationContext#onCollection(java.util.List)}.
          */
         @Deprecated
         public static InteractionContext bulkAction(List<Object> domainObjects) {
@@ -136,8 +156,13 @@ public @interface Bulk {
 
         // //////////////////////////////////////
 
+        private InvokedAs invokedAs;
+        private List<Object> domainObjects;
+
+        private int index;
+
         /**
-         * @deprecated - see {@link org.apache.isis.applib.annotation.BulkInteractionContext()}.
+         * @deprecated - see {@link ActionInvocationContext ()}.
          */
         @Deprecated
         public InteractionContext() {
@@ -149,8 +174,96 @@ public @interface Bulk {
          */
         @Deprecated
         public InteractionContext(final InvokedAs invokedAs, final List<Object> domainObjects) {
-            super(InvokedOn.from(invokedAs), domainObjects);
+            this.invokedAs = invokedAs;
+            this.domainObjects = domainObjects;
+        }
+
+
+        // //////////////////////////////////////
+
+        /**
+         * <b>NOT API</b>: intended to be called only by the framework.
+         */
+        @Programmatic
+        public void setInvokedAs(InvokedAs invokedAs) {
+            this.invokedAs = invokedAs;
+        }
+
+        /**
+         * <b>NOT API</b>: intended to be called only by the framework.
+         */
+        @Programmatic
+        public void setDomainObjects(List<Object> domainObjects) {
+            this.domainObjects = domainObjects;
+        }
+
+        /**
+         * <b>NOT API</b>: intended to be called only by the framework.
+         */
+        @Programmatic
+        public void setIndex(int index) {
+            this.index = index;
+        }
+
+        // //////////////////////////////////////
+
+
+        /**
+         * Whether this particular {@link org.apache.isis.applib.annotation.Bulk.InteractionContext} was applied as a {@link InvokedOn#COLLECTION bulk} action
+         * (against each domain object in a list of domain objects) or as a {@link InvokedOn#OBJECT regular}
+         * action (against a single domain object).
+         */
+        @Deprecated
+        @Programmatic
+        public Bulk.InteractionContext.InvokedAs getInvokedAs() {
+            return invokedAs;
+        }
+
+        /**
+         * The list of domain objects which are being acted upon.
+         */
+        @Programmatic
+        public List<Object> getDomainObjects() {
+            return domainObjects;
+        }
+
+        /**
+         * The number of {@link #domainObjects domain objects} being acted upon.
+         */
+        @Programmatic
+        public int getSize() {
+            return domainObjects.size();
+        }
+
+        /**
+         * The 0-based index to the object being acted upon.
+         *
+         * <p>
+         * Will be a value in range [0, {@link #getSize() size}).
+         */
+        @Programmatic
+        public int getIndex() {
+            return index;
+        }
+
+        /**
+         * Whether this object being acted upon is the first such.
+         */
+        @Programmatic
+        public boolean isFirst() {
+            return this.index == 0;
+        }
+
+        /**
+         * Whether this object being acted upon is the last such.
+         */
+        @Programmatic
+        public boolean isLast() {
+            return this.index == (getSize()-1);
         }
+
+
+
     }
 
 }

http://git-wip-us.apache.org/repos/asf/isis/blob/e11eaef2/core/applib/src/main/java/org/apache/isis/applib/annotation/BulkInteractionContext.java
----------------------------------------------------------------------
diff --git a/core/applib/src/main/java/org/apache/isis/applib/annotation/BulkInteractionContext.java b/core/applib/src/main/java/org/apache/isis/applib/annotation/BulkInteractionContext.java
deleted file mode 100644
index be0a555..0000000
--- a/core/applib/src/main/java/org/apache/isis/applib/annotation/BulkInteractionContext.java
+++ /dev/null
@@ -1,218 +0,0 @@
-/*
- *  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.applib.annotation;
-
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.List;
-
-/**
- * This service (API and implementation) provides access to context information about a bulk action invocation.
- *
- * <p>
- * This implementation has no UI and there is only one implementation (this class) in applib, so it is annotated
- * with {@link DomainService}.  This means that it is automatically registered
- * and available for use; no further configuration is required.
- * </p>
- *
- * <p>
- *     Note that this not annotated as <tt>@DomainService</tt> an <tt>@RequestScoped</tt> only because of the
- *     legacy {@link org.apache.isis.applib.annotation.Bulk.InteractionContext} subclass (which *is* registered as
- *     the service).
- * </p>
- */
-public abstract class BulkInteractionContext {
-
-    /**
-     * Intended only to be set only by the framework.
-     *
-     * <p>
-     * Will be populated while a bulk action is being invoked.
-     *
-     * @deprecated - now a {@link javax.enterprise.context.RequestScoped} service
-     */
-    @Deprecated
-    public static final ThreadLocal<BulkInteractionContext> current = new ThreadLocal<>();
-
-    /**
-     * @deprecated - now a {@link javax.enterprise.context.RequestScoped} service
-     */
-    @Deprecated
-    public static void with(final Runnable runnable, final Object... domainObjects) {
-        throw new RuntimeException("No longer supported - instead inject Bulk.InteractionContext as service");
-    }
-
-    /**
-     * @deprecated - now a {@link javax.enterprise.context.RequestScoped} service
-     */
-    @Deprecated
-    public static void with(final Runnable runnable, final InvokedOn invokedOn, final Object... domainObjects) {
-        throw new RuntimeException("No longer supported - instead inject Bulk.InteractionContext as service");
-    }
-
-    // //////////////////////////////////////
-
-    private InvokedOn actionInvokedOn;
-    private List<Object> domainObjects;
-
-    private int index;
-
-    // //////////////////////////////////////
-
-
-    public BulkInteractionContext() {
-    }
-
-    /**
-     * @deprecated - now a {@link javax.enterprise.context.RequestScoped} service
-     */
-    @Deprecated
-    public BulkInteractionContext(final InvokedOn actionInvokedOn, final Object... domainObjects) {
-        this(actionInvokedOn, Arrays.asList(domainObjects));
-    }
-
-    /**
-     * @deprecated - now a {@link javax.enterprise.context.RequestScoped} service
-     */
-    @Deprecated
-    public BulkInteractionContext(final InvokedOn actionInvokedOn, final List<Object> domainObjects) {
-        this.actionInvokedOn = actionInvokedOn;
-        this.domainObjects = domainObjects;
-    }
-
-    // //////////////////////////////////////
-
-    /**
-     * Intended only to support unit testing.
-     */
-    public static BulkInteractionContext regularAction(Object domainObject) {
-        return new BulkInteractionContext(InvokedOn.OBJECT, Collections.singletonList(domainObject)){};
-    }
-
-    /**
-     * Intended only to support unit testing.
-     */
-    public static BulkInteractionContext bulkAction(Object... domainObjects) {
-        return bulkAction(Arrays.asList(domainObjects));
-    }
-
-    /**
-     * Intended only to support unit testing.
-     */
-    public static BulkInteractionContext bulkAction(List<Object> domainObjects) {
-        return new BulkInteractionContext(InvokedOn.COLLECTION, domainObjects){};
-    }
-
-
-    // //////////////////////////////////////
-
-    /**
-     * <b>NOT API</b>: intended to be called only by the framework.
-     */
-    @Programmatic
-    public void setActionInvokedOn(InvokedOn actionInvokedOn) {
-        this.actionInvokedOn = actionInvokedOn;
-    }
-
-    /**
-     * <b>NOT API</b>: intended to be called only by the framework.
-     */
-    @Programmatic
-    public void setDomainObjects(List<Object> domainObjects) {
-        this.domainObjects = domainObjects;
-    }
-
-    /**
-     * <b>NOT API</b>: intended to be called only by the framework.
-     */
-    @Programmatic
-    public void setIndex(int index) {
-        this.index = index;
-    }
-
-    // //////////////////////////////////////
-
-
-    /**
-     * Whether this particular {@link org.apache.isis.applib.annotation.BulkInteractionContext} was applied as a {@link InvokedOn#COLLECTION bulk} action
-     * (against each domain object in a list of domain objects) or as a {@link InvokedOn#OBJECT regular}
-     * action (against a single domain object).
-     */
-    @Programmatic
-    public InvokedOn getInvokedOn() {
-        return actionInvokedOn;
-    }
-
-    /**
-     * Whether this particular {@link org.apache.isis.applib.annotation.Bulk.InteractionContext} was applied as a {@link InvokedOn#COLLECTION bulk} action
-     * (against each domain object in a list of domain objects) or as a {@link InvokedOn#OBJECT regular}
-     * action (against a single domain object).
-     *
-     * @deprecated - use {@link #getInvokedOn()} instead.
-     */
-    @Deprecated
-    @Programmatic
-    public Bulk.InteractionContext.InvokedAs getInvokedAs() {
-        return InvokedOn.from(actionInvokedOn);
-    }
-
-    /**
-     * The list of domain objects which are being acted upon.
-     */
-    @Programmatic
-    public List<Object> getDomainObjects() {
-        return domainObjects;
-    }
-
-    /**
-     * The number of {@link #domainObjects domain objects} being acted upon.
-     */
-    @Programmatic
-    public int getSize() {
-        return domainObjects.size();
-    }
-
-    /**
-     * The 0-based index to the object being acted upon.
-     *
-     * <p>
-     * Will be a value in range [0, {@link #getSize() size}).
-     */
-    @Programmatic
-    public int getIndex() {
-        return index;
-    }
-
-    /**
-     * Whether this object being acted upon is the first such.
-     */
-    @Programmatic
-    public boolean isFirst() {
-        return this.index == 0;
-    }
-
-    /**
-     * Whether this object being acted upon is the last such.
-     */
-    @Programmatic
-    public boolean isLast() {
-        return this.index == (getSize()-1);
-    }
-
-}

http://git-wip-us.apache.org/repos/asf/isis/blob/e11eaef2/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/interaction/ActionInvocationFacetForInteractionAbstract.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/interaction/ActionInvocationFacetForInteractionAbstract.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/interaction/ActionInvocationFacetForInteractionAbstract.java
index ad36b39..aca042f 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/interaction/ActionInvocationFacetForInteractionAbstract.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/interaction/ActionInvocationFacetForInteractionAbstract.java
@@ -28,7 +28,8 @@ import org.slf4j.LoggerFactory;
 import org.apache.isis.applib.NonRecoverableException;
 import org.apache.isis.applib.RecoverableException;
 import org.apache.isis.applib.ViewModel;
-import org.apache.isis.applib.annotation.BulkInteractionContext;
+import org.apache.isis.applib.annotation.ActionInvocationContext;
+import org.apache.isis.applib.annotation.Bulk;
 import org.apache.isis.applib.annotation.InvokedOn;
 import org.apache.isis.applib.clock.Clock;
 import org.apache.isis.applib.services.background.ActionInvocationMemento;
@@ -224,7 +225,6 @@ public abstract class ActionInvocationFacetForInteractionAbstract
             final ObjectAdapter targetAdapter,
             final ObjectAdapter[] arguments) {
 
-        final BulkInteractionContext bulkInteractionContext = getServicesInjector().lookupService(BulkInteractionContext.class);
 
         try {
             final Object[] executionParameters = new Object[arguments.length];
@@ -235,12 +235,25 @@ public abstract class ActionInvocationFacetForInteractionAbstract
             final Object targetPojo = unwrap(targetAdapter);
 
             final BulkFacet bulkFacet = getFacetHolder().getFacet(BulkFacet.class);
-            if (bulkFacet != null &&
-                    bulkInteractionContext != null &&
-                    bulkInteractionContext.getInvokedAs() == null) {
+            if (bulkFacet != null) {
+                final ActionInvocationContext actionInvocationContext = getServicesInjector().lookupService(ActionInvocationContext.class);
+                if (actionInvocationContext != null &&
+                    actionInvocationContext.getInvokedOn() == null) {
+
+                    actionInvocationContext.setInvokedOn(InvokedOn.OBJECT);
+                    actionInvocationContext.setDomainObjects(Collections.singletonList(targetPojo));
+                }
+
+                final Bulk.InteractionContext bulkInteractionContext = getServicesInjector().lookupService(Bulk.InteractionContext.class);
+
+                if (bulkInteractionContext != null &&
+                        bulkInteractionContext.getInvokedAs() == null) {
+
+                    bulkInteractionContext.setInvokedAs(Bulk.InteractionContext.InvokedAs.REGULAR);
+                    actionInvocationContext.setDomainObjects(Collections.singletonList(targetPojo));
+                }
+
 
-                bulkInteractionContext.setActionInvokedOn(InvokedOn.OBJECT);
-                bulkInteractionContext.setDomainObjects(Collections.singletonList(targetPojo));
             }
 
             if(command != null && command.getExecutor() == Command.Executor.USER && owningAction != null) {

http://git-wip-us.apache.org/repos/asf/isis/blob/e11eaef2/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 46d9a18..9ea6f9c 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
@@ -21,7 +21,8 @@ import java.util.Collections;
 import java.util.List;
 import com.google.common.collect.Lists;
 import org.apache.isis.applib.Identifier;
-import org.apache.isis.applib.annotation.BulkInteractionContext;
+import org.apache.isis.applib.annotation.ActionInvocationContext;
+import org.apache.isis.applib.annotation.Bulk;
 import org.apache.isis.applib.annotation.InvokedOn;
 import org.apache.isis.applib.annotation.Where;
 import org.apache.isis.applib.filter.Filter;
@@ -182,15 +183,27 @@ public class ObjectActionContributee extends ObjectActionImpl implements Contrib
         
         // this code also exists in ActionInvocationFacetViaMethod
         // we need to repeat it here because the target adapter should be the contributee, not the contributing service.
-        final BulkInteractionContext bulkInteractionContext = getServicesProvider().lookupService(BulkInteractionContext.class);
 
         final BulkFacet bulkFacet = getFacet(BulkFacet.class);
-        if (bulkFacet != null && 
-            bulkInteractionContext != null &&
-            bulkInteractionContext.getInvokedAs() == null) {
-            
-            bulkInteractionContext.setActionInvokedOn(InvokedOn.OBJECT);
-            bulkInteractionContext.setDomainObjects(Collections.singletonList(contributee.getObject()));
+        if (bulkFacet != null) {
+
+            final ActionInvocationContext actionInvocationContext = getServicesProvider().lookupService(ActionInvocationContext.class);
+            if (actionInvocationContext != null &&
+                    actionInvocationContext.getInvokedOn() == null) {
+
+                actionInvocationContext.setInvokedOn(InvokedOn.OBJECT);
+                actionInvocationContext.setDomainObjects(Collections.singletonList(contributee.getObject()));
+            }
+
+            final Bulk.InteractionContext bulkInteractionContext = getServicesProvider().lookupService(Bulk.InteractionContext.class);
+            if (bulkInteractionContext != null &&
+                    bulkInteractionContext.getInvokedAs() == null) {
+
+                bulkInteractionContext.setInvokedAs(Bulk.InteractionContext.InvokedAs.REGULAR);
+                actionInvocationContext.setDomainObjects(Collections.singletonList(contributee.getObject()));
+            }
+
+
         }
 
         final CommandContext commandContext = getServicesProvider().lookupService(CommandContext.class);

http://git-wip-us.apache.org/repos/asf/isis/blob/e11eaef2/core/runtime/src/main/java/org/apache/isis/core/runtime/system/transaction/IsisTransaction.java
----------------------------------------------------------------------
diff --git a/core/runtime/src/main/java/org/apache/isis/core/runtime/system/transaction/IsisTransaction.java b/core/runtime/src/main/java/org/apache/isis/core/runtime/system/transaction/IsisTransaction.java
index cd72d5f..8bfdbc6 100644
--- a/core/runtime/src/main/java/org/apache/isis/core/runtime/system/transaction/IsisTransaction.java
+++ b/core/runtime/src/main/java/org/apache/isis/core/runtime/system/transaction/IsisTransaction.java
@@ -38,7 +38,8 @@ import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.apache.isis.applib.Identifier;
 import org.apache.isis.applib.RecoverableException;
-import org.apache.isis.applib.annotation.BulkInteractionContext;
+import org.apache.isis.applib.annotation.Bulk;
+import org.apache.isis.applib.annotation.ActionInvocationContext;
 import org.apache.isis.applib.annotation.PublishedAction;
 import org.apache.isis.applib.annotation.PublishedObject;
 import org.apache.isis.applib.annotation.PublishedObject.ChangeKind;
@@ -883,9 +884,9 @@ public class IsisTransaction implements TransactionScopedComponent {
     }
 
     private void closeOtherApplibServicesIfConfigured() {
-        BulkInteractionContext bic = getServiceOrNull(BulkInteractionContext.class);
+        ActionInvocationContext bic = getServiceOrNull(ActionInvocationContext.class);
         if(bic != null) {
-            BulkInteractionContext.current.set(null);
+            Bulk.InteractionContext.current.set(null);
         }
     }
 

http://git-wip-us.apache.org/repos/asf/isis/blob/e11eaef2/core/runtime/src/main/java/org/apache/isis/core/runtime/system/transaction/IsisTransactionManager.java
----------------------------------------------------------------------
diff --git a/core/runtime/src/main/java/org/apache/isis/core/runtime/system/transaction/IsisTransactionManager.java b/core/runtime/src/main/java/org/apache/isis/core/runtime/system/transaction/IsisTransactionManager.java
index 54c6eb0..bdb56e8 100644
--- a/core/runtime/src/main/java/org/apache/isis/core/runtime/system/transaction/IsisTransactionManager.java
+++ b/core/runtime/src/main/java/org/apache/isis/core/runtime/system/transaction/IsisTransactionManager.java
@@ -23,7 +23,7 @@ import java.util.List;
 import java.util.UUID;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
-import org.apache.isis.applib.annotation.BulkInteractionContext;
+import org.apache.isis.applib.annotation.Bulk;
 import org.apache.isis.applib.clock.Clock;
 import org.apache.isis.applib.services.command.Command;
 import org.apache.isis.applib.services.command.CommandContext;
@@ -287,9 +287,9 @@ public class IsisTransactionManager implements SessionScopedComponent {
     
     private void initOtherApplibServicesIfConfigured() {
         
-        final BulkInteractionContext bic = getServiceOrNull(BulkInteractionContext.class);
+        final Bulk.InteractionContext bic = getServiceOrNull(Bulk.InteractionContext.class);
         if(bic != null) {
-            BulkInteractionContext.current.set(bic);
+            Bulk.InteractionContext.current.set(bic);
         }
     }
 

http://git-wip-us.apache.org/repos/asf/isis/blob/e11eaef2/core/runtime/src/test/java/org/apache/isis/core/runtime/system/transaction/IsisTransactionTest.java
----------------------------------------------------------------------
diff --git a/core/runtime/src/test/java/org/apache/isis/core/runtime/system/transaction/IsisTransactionTest.java b/core/runtime/src/test/java/org/apache/isis/core/runtime/system/transaction/IsisTransactionTest.java
index e2c9e23..9a1e023 100644
--- a/core/runtime/src/test/java/org/apache/isis/core/runtime/system/transaction/IsisTransactionTest.java
+++ b/core/runtime/src/test/java/org/apache/isis/core/runtime/system/transaction/IsisTransactionTest.java
@@ -25,7 +25,7 @@ import org.jmock.auto.Mock;
 import org.junit.Before;
 import org.junit.Rule;
 import org.junit.Test;
-import org.apache.isis.applib.annotation.BulkInteractionContext;
+import org.apache.isis.applib.annotation.ActionInvocationContext;
 import org.apache.isis.applib.annotation.PublishedAction;
 import org.apache.isis.applib.annotation.PublishedObject;
 import org.apache.isis.applib.services.audit.AuditingService3;
@@ -92,7 +92,7 @@ public class IsisTransactionTest {
     @Mock
     private PublishedAction.PayloadFactory mockPublishedActionPayloadFactory;
     @Mock
-    private BulkInteractionContext mockBulkInteractionContext;
+    private ActionInvocationContext mockActionInvocationContext;
     @Mock
     private EventBusServiceDefault mockEventBusServiceDefault;
 
@@ -207,8 +207,8 @@ public class IsisTransactionTest {
             allowing(mockServicesInjector).lookupService(PublishedAction.PayloadFactory.class);
             will(returnValue(mockPublishedActionPayloadFactory));
             
-            allowing(mockServicesInjector).lookupService(BulkInteractionContext.class);
-            will(returnValue(mockBulkInteractionContext));
+            allowing(mockServicesInjector).lookupService(ActionInvocationContext.class);
+            will(returnValue(mockActionInvocationContext));
             
             allowing(mockServicesInjector).lookupService(EventBusServiceDefault.class);
             will(returnValue(mockEventBusServiceDefault));

http://git-wip-us.apache.org/repos/asf/isis/blob/e11eaef2/example/application/todoapp/dom/src/main/java/dom/todo/ToDoItem.java
----------------------------------------------------------------------
diff --git a/example/application/todoapp/dom/src/main/java/dom/todo/ToDoItem.java b/example/application/todoapp/dom/src/main/java/dom/todo/ToDoItem.java
index f0e4ea9..10bb1a0 100644
--- a/example/application/todoapp/dom/src/main/java/dom/todo/ToDoItem.java
+++ b/example/application/todoapp/dom/src/main/java/dom/todo/ToDoItem.java
@@ -39,9 +39,8 @@ import org.apache.isis.applib.Identifier;
 import org.apache.isis.applib.NonRecoverableException;
 import org.apache.isis.applib.RecoverableException;
 import org.apache.isis.applib.annotation.Action;
-import org.apache.isis.applib.annotation.ActionLayout;
+import org.apache.isis.applib.annotation.ActionInvocationContext;
 import org.apache.isis.applib.annotation.BookmarkPolicy;
-import org.apache.isis.applib.annotation.Bulk;
 import org.apache.isis.applib.annotation.Collection;
 import org.apache.isis.applib.annotation.CollectionLayout;
 import org.apache.isis.applib.annotation.DomainObject;
@@ -341,17 +340,17 @@ public class ToDoItem implements Categorized, Comparable<ToDoItem> {
         // remainder of method just demonstrates the use of the Bulk.InteractionContext service 
         //
         @SuppressWarnings("unused")
-        final List<Object> allObjects = bulkInteractionContext.getDomainObjects();
+        final List<Object> allObjects = actionInvocationContext.getDomainObjects();
         
         LOG.debug("completed: "
-                + bulkInteractionContext.getIndex() +
-                " [" + bulkInteractionContext.getSize() + "]"
-                + (bulkInteractionContext.isFirst() ? " (first)" : "")
-                + (bulkInteractionContext.isLast() ? " (last)" : ""));
+                + actionInvocationContext.getIndex() +
+                " [" + actionInvocationContext.getSize() + "]"
+                + (actionInvocationContext.isFirst() ? " (first)" : "")
+                + (actionInvocationContext.isLast() ? " (last)" : ""));
 
         // if invoked as a regular action, return this object;
         // otherwise (if invoked as bulk), return null (so go back to the list)
-        return bulkInteractionContext.getInvokedOn() == InvokedOn.OBJECT? this: null;
+        return actionInvocationContext.getInvokedOn() == InvokedOn.OBJECT? this: null;
     }
     // disable action dependent on state of object
     public String disableCompleted() {
@@ -366,7 +365,7 @@ public class ToDoItem implements Categorized, Comparable<ToDoItem> {
 
         // if invoked as a regular action, return this object;
         // otherwise (if invoked as bulk), return null (so go back to the list)
-        return bulkInteractionContext.getInvokedOn() == InvokedOn.COLLECTION ? this: null;
+        return actionInvocationContext.getInvokedOn() == InvokedOn.COLLECTION ? this: null;
     }
     // disable action dependent on state of object
     public String disableNotYetCompleted() {
@@ -958,7 +957,7 @@ public class ToDoItem implements Categorized, Comparable<ToDoItem> {
      * public only so can be injected from integ tests
      */
     @javax.inject.Inject
-    public Bulk.InteractionContext bulkInteractionContext;
+    public ActionInvocationContext actionInvocationContext;
 
     /**
      * public only so can be injected from integ tests

http://git-wip-us.apache.org/repos/asf/isis/blob/e11eaef2/example/application/todoapp/dom/src/test/java/dom/todo/ToDoItemTest.java
----------------------------------------------------------------------
diff --git a/example/application/todoapp/dom/src/test/java/dom/todo/ToDoItemTest.java b/example/application/todoapp/dom/src/test/java/dom/todo/ToDoItemTest.java
index a9c102c..9504b89 100644
--- a/example/application/todoapp/dom/src/test/java/dom/todo/ToDoItemTest.java
+++ b/example/application/todoapp/dom/src/test/java/dom/todo/ToDoItemTest.java
@@ -22,7 +22,7 @@ import org.junit.Before;
 import org.junit.Rule;
 import org.junit.Test;
 import org.apache.isis.applib.DomainObjectContainer;
-import org.apache.isis.applib.annotation.Bulk;
+import org.apache.isis.applib.annotation.ActionInvocationContext;
 import org.apache.isis.applib.security.RoleMemento;
 import org.apache.isis.applib.security.UserMemento;
 import org.apache.isis.applib.services.eventbus.EventBusService;
@@ -48,7 +48,7 @@ public abstract class ToDoItemTest {
     public void setUp() throws Exception {
         toDoItem = new ToDoItem();
 
-        toDoItem.bulkInteractionContext = Bulk.InteractionContext.regularAction(toDoItem);
+        toDoItem.actionInvocationContext = ActionInvocationContext.onObject(toDoItem);
         toDoItem.eventBusService = eventBusService;
 
         context.ignoring(eventBusService);

http://git-wip-us.apache.org/repos/asf/isis/blob/e11eaef2/example/application/todoapp/integtests/src/test/java/integration/glue/todoitem/ToDoItemGlue.java
----------------------------------------------------------------------
diff --git a/example/application/todoapp/integtests/src/test/java/integration/glue/todoitem/ToDoItemGlue.java b/example/application/todoapp/integtests/src/test/java/integration/glue/todoitem/ToDoItemGlue.java
index 0782e38..594b993 100644
--- a/example/application/todoapp/integtests/src/test/java/integration/glue/todoitem/ToDoItemGlue.java
+++ b/example/application/todoapp/integtests/src/test/java/integration/glue/todoitem/ToDoItemGlue.java
@@ -29,7 +29,7 @@ import com.google.common.collect.Iterables;
 import com.google.common.collect.Lists;
 import org.jmock.Expectations;
 import org.junit.Assert;
-import org.apache.isis.applib.annotation.Bulk;
+import org.apache.isis.applib.annotation.ActionInvocationContext;
 import org.apache.isis.applib.services.eventbus.EventBusService;
 import org.apache.isis.core.specsupport.scenarios.InMemoryDB;
 import org.apache.isis.core.specsupport.specs.CukeGlueAbstract;
@@ -72,15 +72,15 @@ public class ToDoItemGlue extends CukeGlueAbstract {
     public void mark_it_as_complete() throws Throwable {
         final ToDoItem toDoItem = getVar(null, "toDoItem", ToDoItem.class);
         if(supportsMocks()) {
-            final Bulk.InteractionContext bulkInteractionContext = service(Bulk.InteractionContext.class);
+            final ActionInvocationContext actionInvocationContext = service(ActionInvocationContext.class);
             final EventBusService eventBusService = service(EventBusService.class);
             checking(new Expectations() {
                 {
-                    allowing(bulkInteractionContext);
+                    allowing(actionInvocationContext);
                     allowing(eventBusService);
                 }
             });
-            toDoItem.bulkInteractionContext = bulkInteractionContext;
+            toDoItem.actionInvocationContext = actionInvocationContext;
             toDoItem.eventBusService = eventBusService;
         }
         wrap(toDoItem).completed();


[2/2] isis git commit: ISIS-970: moving the new ActionInvocationContext from applib.annotatoin to applib.services.actinvoc

Posted by da...@apache.org.
ISIS-970: moving the new ActionInvocationContext from applib.annotatoin to applib.services.actinvoc


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

Branch: refs/heads/ISIS-970
Commit: 4eed0900f0ce8d74ae746f50f59f66d4e53f970e
Parents: e11eaef
Author: Dan Haywood <da...@haywood-associates.co.uk>
Authored: Wed Dec 31 00:02:08 2014 +0000
Committer: Dan Haywood <da...@haywood-associates.co.uk>
Committed: Wed Dec 31 00:02:08 2014 +0000

----------------------------------------------------------------------
 .../collection/bulk/BulkActionsLinkFactory.java |   2 +-
 .../annotation/ActionInvocationContext.java     | 176 -------------------
 .../org/apache/isis/applib/annotation/Bulk.java |  10 +-
 .../actinvoc/ActionInvocationContext.java       | 174 ++++++++++++++++++
 ...onInvocationFacetForInteractionAbstract.java |   2 +-
 .../specimpl/ObjectActionContributee.java       |   2 +-
 .../system/transaction/IsisTransaction.java     |   2 +-
 .../system/transaction/IsisTransactionTest.java |   2 +-
 .../dom/src/main/java/dom/todo/ToDoItem.java    |   2 +-
 .../src/test/java/dom/todo/ToDoItemTest.java    |   2 +-
 .../integration/glue/todoitem/ToDoItemGlue.java |   2 +-
 11 files changed, 187 insertions(+), 189 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/isis/blob/4eed0900/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collection/bulk/BulkActionsLinkFactory.java
----------------------------------------------------------------------
diff --git a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collection/bulk/BulkActionsLinkFactory.java b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collection/bulk/BulkActionsLinkFactory.java
index a46de73..d8a17fc 100644
--- a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collection/bulk/BulkActionsLinkFactory.java
+++ b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collection/bulk/BulkActionsLinkFactory.java
@@ -26,7 +26,7 @@ import org.apache.wicket.Session;
 import org.apache.wicket.markup.html.link.AbstractLink;
 import org.apache.wicket.markup.html.link.Link;
 import org.apache.isis.applib.RecoverableException;
-import org.apache.isis.applib.annotation.ActionInvocationContext;
+import org.apache.isis.applib.services.actinvoc.ActionInvocationContext;
 import org.apache.isis.applib.annotation.ActionLayout;
 import org.apache.isis.applib.annotation.Bulk;
 import org.apache.isis.applib.annotation.InvokedOn;

http://git-wip-us.apache.org/repos/asf/isis/blob/4eed0900/core/applib/src/main/java/org/apache/isis/applib/annotation/ActionInvocationContext.java
----------------------------------------------------------------------
diff --git a/core/applib/src/main/java/org/apache/isis/applib/annotation/ActionInvocationContext.java b/core/applib/src/main/java/org/apache/isis/applib/annotation/ActionInvocationContext.java
deleted file mode 100644
index 93aad9a..0000000
--- a/core/applib/src/main/java/org/apache/isis/applib/annotation/ActionInvocationContext.java
+++ /dev/null
@@ -1,176 +0,0 @@
-/*
- *  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.applib.annotation;
-
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.List;
-
-/**
- * This service (API and implementation) provides access to context information about a bulk action invocation.
- *
- * <p>
- * This implementation has no UI and there is only one implementation (this class) in applib, so it is annotated
- * with {@link DomainService}.  This means that it is automatically registered
- * and available for use; no further configuration is required.
- * </p>
- *
- * <p>
- *     Note that this not annotated as <tt>@DomainService</tt> an <tt>@RequestScoped</tt> only because of the
- *     legacy {@link org.apache.isis.applib.annotation.Bulk.InteractionContext} subclass (which *is* registered as
- *     the service).
- * </p>
- */
-public abstract class ActionInvocationContext {
-
-    /**
-     * Intended only to support unit testing.
-     */
-    public static ActionInvocationContext onObject(final Object domainObject) {
-        return new ActionInvocationContext(InvokedOn.OBJECT, Collections.singletonList(domainObject)){};
-    }
-
-    /**
-     * Intended only to support unit testing.
-     */
-    public static ActionInvocationContext onCollection(final Object... domainObjects) {
-        return onCollection(Arrays.asList(domainObjects));
-    }
-
-    /**
-     * Intended only to support unit testing.
-     */
-    public static ActionInvocationContext onCollection(final List<Object> domainObjects) {
-        return new ActionInvocationContext(InvokedOn.COLLECTION, domainObjects){};
-    }
-
-    // //////////////////////////////////////
-
-
-    private InvokedOn invokedOn;
-    private List<Object> domainObjects;
-
-    private int index;
-
-    // //////////////////////////////////////
-
-    public ActionInvocationContext() {
-    }
-
-    /**
-     * @deprecated - now a {@link javax.enterprise.context.RequestScoped} service
-     */
-    @Deprecated
-    public ActionInvocationContext(final InvokedOn invokedOn, final Object... domainObjects) {
-        this(invokedOn, Arrays.asList(domainObjects));
-    }
-
-    /**
-     * @deprecated - now a {@link javax.enterprise.context.RequestScoped} service
-     */
-    @Deprecated
-    public ActionInvocationContext(final InvokedOn invokedOn, final List<Object> domainObjects) {
-        this.invokedOn = invokedOn;
-        this.domainObjects = domainObjects;
-    }
-
-    // //////////////////////////////////////
-
-    /**
-     * <b>NOT API</b>: intended to be called only by the framework.
-     */
-    @Programmatic
-    public void setInvokedOn(final InvokedOn invokedOn) {
-        this.invokedOn = invokedOn;
-    }
-
-    /**
-     * <b>NOT API</b>: intended to be called only by the framework.
-     */
-    @Programmatic
-    public void setDomainObjects(final List<Object> domainObjects) {
-        this.domainObjects = domainObjects;
-    }
-
-    /**
-     * <b>NOT API</b>: intended to be called only by the framework.
-     */
-    @Programmatic
-    public void setIndex(final int index) {
-        this.index = index;
-    }
-
-    // //////////////////////////////////////
-
-
-    /**
-     * Whether this particular {@link ActionInvocationContext} was applied as a {@link InvokedOn#COLLECTION bulk} action
-     * (against each domain object in a list of domain objects) or as a {@link InvokedOn#OBJECT regular}
-     * action (against a single domain object).
-     */
-    @Programmatic
-    public InvokedOn getInvokedOn() {
-        return invokedOn;
-    }
-
-
-    /**
-     * The list of domain objects which are being acted upon.
-     */
-    @Programmatic
-    public List<Object> getDomainObjects() {
-        return domainObjects;
-    }
-
-    /**
-     * The number of {@link #domainObjects domain objects} being acted upon.
-     */
-    @Programmatic
-    public int getSize() {
-        return domainObjects.size();
-    }
-
-    /**
-     * The 0-based index to the object being acted upon.
-     *
-     * <p>
-     * Will be a value in range [0, {@link #getSize() size}).
-     */
-    @Programmatic
-    public int getIndex() {
-        return index;
-    }
-
-    /**
-     * Whether this object being acted upon is the first such.
-     */
-    @Programmatic
-    public boolean isFirst() {
-        return this.index == 0;
-    }
-
-    /**
-     * Whether this object being acted upon is the last such.
-     */
-    @Programmatic
-    public boolean isLast() {
-        return this.index == (getSize()-1);
-    }
-
-}

http://git-wip-us.apache.org/repos/asf/isis/blob/4eed0900/core/applib/src/main/java/org/apache/isis/applib/annotation/Bulk.java
----------------------------------------------------------------------
diff --git a/core/applib/src/main/java/org/apache/isis/applib/annotation/Bulk.java b/core/applib/src/main/java/org/apache/isis/applib/annotation/Bulk.java
index 1146576..592dd43 100644
--- a/core/applib/src/main/java/org/apache/isis/applib/annotation/Bulk.java
+++ b/core/applib/src/main/java/org/apache/isis/applib/annotation/Bulk.java
@@ -61,7 +61,7 @@ public @interface Bulk {
     // //////////////////////////////////////
 
     /**
-     * @deprecated - see {@link ActionInvocationContext}.
+     * @deprecated - see {@link org.apache.isis.applib.services.actinvoc.ActionInvocationContext}.
      */
     @Deprecated
     @DomainService
@@ -130,7 +130,7 @@ public @interface Bulk {
 
 
         /**
-         * @deprecated - see {@link ActionInvocationContext#onObject(Object)}.
+         * @deprecated - see {@link org.apache.isis.applib.services.actinvoc.ActionInvocationContext#onObject(Object)}.
          */
         @Deprecated
         public static InteractionContext regularAction(Object domainObject) {
@@ -138,7 +138,7 @@ public @interface Bulk {
         }
 
         /**
-         * @deprecated - see {@link ActionInvocationContext#onCollection(Object...)}.
+         * @deprecated - see {@link org.apache.isis.applib.services.actinvoc.ActionInvocationContext#onCollection(Object...)}.
          */
         @Deprecated
         public static InteractionContext bulkAction(Object... domainObjects) {
@@ -146,7 +146,7 @@ public @interface Bulk {
         }
 
         /**
-         * @deprecated - see {@link ActionInvocationContext#onCollection(java.util.List)}.
+         * @deprecated - see {@link org.apache.isis.applib.services.actinvoc.ActionInvocationContext#onCollection(java.util.List)}.
          */
         @Deprecated
         public static InteractionContext bulkAction(List<Object> domainObjects) {
@@ -162,7 +162,7 @@ public @interface Bulk {
         private int index;
 
         /**
-         * @deprecated - see {@link ActionInvocationContext ()}.
+         * @deprecated - see {@link org.apache.isis.applib.services.actinvoc.ActionInvocationContext ()}.
          */
         @Deprecated
         public InteractionContext() {

http://git-wip-us.apache.org/repos/asf/isis/blob/4eed0900/core/applib/src/main/java/org/apache/isis/applib/services/actinvoc/ActionInvocationContext.java
----------------------------------------------------------------------
diff --git a/core/applib/src/main/java/org/apache/isis/applib/services/actinvoc/ActionInvocationContext.java b/core/applib/src/main/java/org/apache/isis/applib/services/actinvoc/ActionInvocationContext.java
new file mode 100644
index 0000000..9982649
--- /dev/null
+++ b/core/applib/src/main/java/org/apache/isis/applib/services/actinvoc/ActionInvocationContext.java
@@ -0,0 +1,174 @@
+/*
+ *  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.applib.services.actinvoc;
+
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.List;
+import org.apache.isis.applib.annotation.DomainService;
+import org.apache.isis.applib.annotation.InvokedOn;
+import org.apache.isis.applib.annotation.Programmatic;
+
+/**
+ * This service (API and implementation) provides access to context information about a bulk action invocation.
+ *
+ * <p>
+ * This implementation has no UI and there is only one implementation (this class) in applib, so it is annotated
+ * with {@link org.apache.isis.applib.annotation.DomainService}.  This means that it is automatically registered
+ * and available for use; no further configuration is required.
+ * </p>
+ */
+@DomainService
+public class ActionInvocationContext {
+
+    /**
+     * Intended only to support unit testing.
+     */
+    public static ActionInvocationContext onObject(final Object domainObject) {
+        return new ActionInvocationContext(InvokedOn.OBJECT, Collections.singletonList(domainObject)){};
+    }
+
+    /**
+     * Intended only to support unit testing.
+     */
+    public static ActionInvocationContext onCollection(final Object... domainObjects) {
+        return onCollection(Arrays.asList(domainObjects));
+    }
+
+    /**
+     * Intended only to support unit testing.
+     */
+    public static ActionInvocationContext onCollection(final List<Object> domainObjects) {
+        return new ActionInvocationContext(InvokedOn.COLLECTION, domainObjects){};
+    }
+
+    // //////////////////////////////////////
+
+
+    private InvokedOn invokedOn;
+    private List<Object> domainObjects;
+
+    private int index;
+
+    // //////////////////////////////////////
+
+    public ActionInvocationContext() {
+    }
+
+    /**
+     * @deprecated - now a {@link javax.enterprise.context.RequestScoped} service
+     */
+    @Deprecated
+    public ActionInvocationContext(final InvokedOn invokedOn, final Object... domainObjects) {
+        this(invokedOn, Arrays.asList(domainObjects));
+    }
+
+    /**
+     * @deprecated - now a {@link javax.enterprise.context.RequestScoped} service
+     */
+    @Deprecated
+    public ActionInvocationContext(final InvokedOn invokedOn, final List<Object> domainObjects) {
+        this.invokedOn = invokedOn;
+        this.domainObjects = domainObjects;
+    }
+
+    // //////////////////////////////////////
+
+    /**
+     * <b>NOT API</b>: intended to be called only by the framework.
+     */
+    @Programmatic
+    public void setInvokedOn(final InvokedOn invokedOn) {
+        this.invokedOn = invokedOn;
+    }
+
+    /**
+     * <b>NOT API</b>: intended to be called only by the framework.
+     */
+    @Programmatic
+    public void setDomainObjects(final List<Object> domainObjects) {
+        this.domainObjects = domainObjects;
+    }
+
+    /**
+     * <b>NOT API</b>: intended to be called only by the framework.
+     */
+    @Programmatic
+    public void setIndex(final int index) {
+        this.index = index;
+    }
+
+    // //////////////////////////////////////
+
+
+    /**
+     * Whether this particular {@link ActionInvocationContext} was applied as a {@link InvokedOn#COLLECTION bulk} action
+     * (against each domain object in a list of domain objects) or as a {@link InvokedOn#OBJECT regular}
+     * action (against a single domain object).
+     */
+    @Programmatic
+    public InvokedOn getInvokedOn() {
+        return invokedOn;
+    }
+
+
+    /**
+     * The list of domain objects which are being acted upon.
+     */
+    @Programmatic
+    public List<Object> getDomainObjects() {
+        return domainObjects;
+    }
+
+    /**
+     * The number of {@link #domainObjects domain objects} being acted upon.
+     */
+    @Programmatic
+    public int getSize() {
+        return domainObjects.size();
+    }
+
+    /**
+     * The 0-based index to the object being acted upon.
+     *
+     * <p>
+     * Will be a value in range [0, {@link #getSize() size}).
+     */
+    @Programmatic
+    public int getIndex() {
+        return index;
+    }
+
+    /**
+     * Whether this object being acted upon is the first such.
+     */
+    @Programmatic
+    public boolean isFirst() {
+        return this.index == 0;
+    }
+
+    /**
+     * Whether this object being acted upon is the last such.
+     */
+    @Programmatic
+    public boolean isLast() {
+        return this.index == (getSize()-1);
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/isis/blob/4eed0900/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/interaction/ActionInvocationFacetForInteractionAbstract.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/interaction/ActionInvocationFacetForInteractionAbstract.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/interaction/ActionInvocationFacetForInteractionAbstract.java
index aca042f..e1b14b5 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/interaction/ActionInvocationFacetForInteractionAbstract.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/interaction/ActionInvocationFacetForInteractionAbstract.java
@@ -28,7 +28,7 @@ import org.slf4j.LoggerFactory;
 import org.apache.isis.applib.NonRecoverableException;
 import org.apache.isis.applib.RecoverableException;
 import org.apache.isis.applib.ViewModel;
-import org.apache.isis.applib.annotation.ActionInvocationContext;
+import org.apache.isis.applib.services.actinvoc.ActionInvocationContext;
 import org.apache.isis.applib.annotation.Bulk;
 import org.apache.isis.applib.annotation.InvokedOn;
 import org.apache.isis.applib.clock.Clock;

http://git-wip-us.apache.org/repos/asf/isis/blob/4eed0900/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 9ea6f9c..a721656 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
@@ -21,7 +21,7 @@ import java.util.Collections;
 import java.util.List;
 import com.google.common.collect.Lists;
 import org.apache.isis.applib.Identifier;
-import org.apache.isis.applib.annotation.ActionInvocationContext;
+import org.apache.isis.applib.services.actinvoc.ActionInvocationContext;
 import org.apache.isis.applib.annotation.Bulk;
 import org.apache.isis.applib.annotation.InvokedOn;
 import org.apache.isis.applib.annotation.Where;

http://git-wip-us.apache.org/repos/asf/isis/blob/4eed0900/core/runtime/src/main/java/org/apache/isis/core/runtime/system/transaction/IsisTransaction.java
----------------------------------------------------------------------
diff --git a/core/runtime/src/main/java/org/apache/isis/core/runtime/system/transaction/IsisTransaction.java b/core/runtime/src/main/java/org/apache/isis/core/runtime/system/transaction/IsisTransaction.java
index 8bfdbc6..0a4ed35 100644
--- a/core/runtime/src/main/java/org/apache/isis/core/runtime/system/transaction/IsisTransaction.java
+++ b/core/runtime/src/main/java/org/apache/isis/core/runtime/system/transaction/IsisTransaction.java
@@ -39,7 +39,7 @@ import org.slf4j.LoggerFactory;
 import org.apache.isis.applib.Identifier;
 import org.apache.isis.applib.RecoverableException;
 import org.apache.isis.applib.annotation.Bulk;
-import org.apache.isis.applib.annotation.ActionInvocationContext;
+import org.apache.isis.applib.services.actinvoc.ActionInvocationContext;
 import org.apache.isis.applib.annotation.PublishedAction;
 import org.apache.isis.applib.annotation.PublishedObject;
 import org.apache.isis.applib.annotation.PublishedObject.ChangeKind;

http://git-wip-us.apache.org/repos/asf/isis/blob/4eed0900/core/runtime/src/test/java/org/apache/isis/core/runtime/system/transaction/IsisTransactionTest.java
----------------------------------------------------------------------
diff --git a/core/runtime/src/test/java/org/apache/isis/core/runtime/system/transaction/IsisTransactionTest.java b/core/runtime/src/test/java/org/apache/isis/core/runtime/system/transaction/IsisTransactionTest.java
index 9a1e023..2db3b05 100644
--- a/core/runtime/src/test/java/org/apache/isis/core/runtime/system/transaction/IsisTransactionTest.java
+++ b/core/runtime/src/test/java/org/apache/isis/core/runtime/system/transaction/IsisTransactionTest.java
@@ -25,7 +25,7 @@ import org.jmock.auto.Mock;
 import org.junit.Before;
 import org.junit.Rule;
 import org.junit.Test;
-import org.apache.isis.applib.annotation.ActionInvocationContext;
+import org.apache.isis.applib.services.actinvoc.ActionInvocationContext;
 import org.apache.isis.applib.annotation.PublishedAction;
 import org.apache.isis.applib.annotation.PublishedObject;
 import org.apache.isis.applib.services.audit.AuditingService3;

http://git-wip-us.apache.org/repos/asf/isis/blob/4eed0900/example/application/todoapp/dom/src/main/java/dom/todo/ToDoItem.java
----------------------------------------------------------------------
diff --git a/example/application/todoapp/dom/src/main/java/dom/todo/ToDoItem.java b/example/application/todoapp/dom/src/main/java/dom/todo/ToDoItem.java
index 10bb1a0..31ce78a 100644
--- a/example/application/todoapp/dom/src/main/java/dom/todo/ToDoItem.java
+++ b/example/application/todoapp/dom/src/main/java/dom/todo/ToDoItem.java
@@ -39,7 +39,7 @@ import org.apache.isis.applib.Identifier;
 import org.apache.isis.applib.NonRecoverableException;
 import org.apache.isis.applib.RecoverableException;
 import org.apache.isis.applib.annotation.Action;
-import org.apache.isis.applib.annotation.ActionInvocationContext;
+import org.apache.isis.applib.services.actinvoc.ActionInvocationContext;
 import org.apache.isis.applib.annotation.BookmarkPolicy;
 import org.apache.isis.applib.annotation.Collection;
 import org.apache.isis.applib.annotation.CollectionLayout;

http://git-wip-us.apache.org/repos/asf/isis/blob/4eed0900/example/application/todoapp/dom/src/test/java/dom/todo/ToDoItemTest.java
----------------------------------------------------------------------
diff --git a/example/application/todoapp/dom/src/test/java/dom/todo/ToDoItemTest.java b/example/application/todoapp/dom/src/test/java/dom/todo/ToDoItemTest.java
index 9504b89..b1f5168 100644
--- a/example/application/todoapp/dom/src/test/java/dom/todo/ToDoItemTest.java
+++ b/example/application/todoapp/dom/src/test/java/dom/todo/ToDoItemTest.java
@@ -22,7 +22,7 @@ import org.junit.Before;
 import org.junit.Rule;
 import org.junit.Test;
 import org.apache.isis.applib.DomainObjectContainer;
-import org.apache.isis.applib.annotation.ActionInvocationContext;
+import org.apache.isis.applib.services.actinvoc.ActionInvocationContext;
 import org.apache.isis.applib.security.RoleMemento;
 import org.apache.isis.applib.security.UserMemento;
 import org.apache.isis.applib.services.eventbus.EventBusService;

http://git-wip-us.apache.org/repos/asf/isis/blob/4eed0900/example/application/todoapp/integtests/src/test/java/integration/glue/todoitem/ToDoItemGlue.java
----------------------------------------------------------------------
diff --git a/example/application/todoapp/integtests/src/test/java/integration/glue/todoitem/ToDoItemGlue.java b/example/application/todoapp/integtests/src/test/java/integration/glue/todoitem/ToDoItemGlue.java
index 594b993..c859340 100644
--- a/example/application/todoapp/integtests/src/test/java/integration/glue/todoitem/ToDoItemGlue.java
+++ b/example/application/todoapp/integtests/src/test/java/integration/glue/todoitem/ToDoItemGlue.java
@@ -29,7 +29,7 @@ import com.google.common.collect.Iterables;
 import com.google.common.collect.Lists;
 import org.jmock.Expectations;
 import org.junit.Assert;
-import org.apache.isis.applib.annotation.ActionInvocationContext;
+import org.apache.isis.applib.services.actinvoc.ActionInvocationContext;
 import org.apache.isis.applib.services.eventbus.EventBusService;
 import org.apache.isis.core.specsupport.scenarios.InMemoryDB;
 import org.apache.isis.core.specsupport.specs.CukeGlueAbstract;