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/30 14:57:28 UTC

[4/5] isis git commit: ISIS-970: completed the ActionAnnotationFacetFactory, with additional refactoring for DomainObjectFacetFactory

http://git-wip-us.apache.org/repos/asf/isis/blob/8f4ca51c/core/applib/src/main/java/org/apache/isis/applib/annotation/SemanticsOf.java
----------------------------------------------------------------------
diff --git a/core/applib/src/main/java/org/apache/isis/applib/annotation/SemanticsOf.java b/core/applib/src/main/java/org/apache/isis/applib/annotation/SemanticsOf.java
new file mode 100644
index 0000000..fe05ab2
--- /dev/null
+++ b/core/applib/src/main/java/org/apache/isis/applib/annotation/SemanticsOf.java
@@ -0,0 +1,85 @@
+/*
+ *  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 org.apache.isis.applib.util.Enums;
+
+public enum SemanticsOf {
+
+    /**
+     * Safe, with no side-effects.
+     *
+     * <p>
+     * In other words, a query-only action.  By definition, is also idempotent.
+     */
+    SAFE,
+    /**
+     * Post-conditions are always the same, irrespective as to how many times called.
+     *
+     * <p>
+     * An example might be <tt>placeOrder()</tt>, that is a no-op if the order has already been placed.
+     */
+    IDEMPOTENT,
+    /**
+     * Neither safe nor idempotent; every invocation is likely to change the state of the object.
+     *
+     * <p>
+     * An example is increasing the quantity of a line item in an Order by 1.
+     */
+    NON_IDEMPOTENT;
+
+    public String getFriendlyName() {
+        return Enums.getFriendlyNameOf(this);
+    }
+
+    public String getCamelCaseName() {
+        return Enums.enumToCamelCase(this);
+    }
+
+    /**
+     * {@link #SAFE} is idempotent in nature, as well as, obviously, {@link #IDEMPOTENT}.
+     */
+    public boolean isIdempotentInNature() {
+        return this == SAFE || this == IDEMPOTENT;
+    }
+
+    public boolean isSafe() {
+        return this == SAFE;
+    }
+
+    @Deprecated
+    public static ActionSemantics.Of from(final SemanticsOf semantics) {
+        if(semantics == null) return null;
+        if(semantics == SAFE) return ActionSemantics.Of.SAFE;
+        if(semantics == IDEMPOTENT) return ActionSemantics.Of.IDEMPOTENT;
+        if(semantics == NON_IDEMPOTENT) return ActionSemantics.Of.NON_IDEMPOTENT;
+        // shouldn't happen
+        throw new IllegalArgumentException("Unrecognized of: " + semantics);
+    }
+
+    @Deprecated
+    public static SemanticsOf from(final ActionSemantics.Of semantics) {
+        if(semantics == null) return null;
+        if(semantics == ActionSemantics.Of.SAFE) return SAFE;
+        if(semantics == ActionSemantics.Of.IDEMPOTENT) return IDEMPOTENT;
+        if(semantics == ActionSemantics.Of.NON_IDEMPOTENT) return NON_IDEMPOTENT;
+        // shouldn't happen
+        throw new IllegalArgumentException("Unrecognized semantics: " + semantics);
+    }
+}

http://git-wip-us.apache.org/repos/asf/isis/blob/8f4ca51c/core/applib/src/main/java/org/apache/isis/applib/annotation/TypeOf.java
----------------------------------------------------------------------
diff --git a/core/applib/src/main/java/org/apache/isis/applib/annotation/TypeOf.java b/core/applib/src/main/java/org/apache/isis/applib/annotation/TypeOf.java
index 03bb357..ba30a60 100644
--- a/core/applib/src/main/java/org/apache/isis/applib/annotation/TypeOf.java
+++ b/core/applib/src/main/java/org/apache/isis/applib/annotation/TypeOf.java
@@ -26,7 +26,7 @@ import java.lang.annotation.RetentionPolicy;
 import java.lang.annotation.Target;
 
 /**
- * @deprecated - use {@link Collection#typeOf()} instead.
+ * @deprecated - use {@link Collection#typeOf()} or {@link Action#typeOf()} instead.
  */
 @Deprecated
 @Inherited
@@ -35,7 +35,7 @@ import java.lang.annotation.Target;
 public @interface TypeOf {
 
     /**
-     * @deprecated - use {@link Collection#typeOf()} instead.
+     * @deprecated - use {@link Collection#typeOf()} or {@link Action#typeOf()} instead.
      */
     @Deprecated
     Class<?> value();

http://git-wip-us.apache.org/repos/asf/isis/blob/8f4ca51c/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/action/ActionAnnotationFacetFactory.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/action/ActionAnnotationFacetFactory.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/action/ActionAnnotationFacetFactory.java
index 210c137..baca5e7 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/action/ActionAnnotationFacetFactory.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/action/ActionAnnotationFacetFactory.java
@@ -21,19 +21,33 @@ package org.apache.isis.core.metamodel.facets.actions.action;
 
 import java.lang.reflect.Method;
 import org.apache.isis.applib.annotation.Action;
-import org.apache.isis.applib.annotation.Collection;
+import org.apache.isis.applib.annotation.ActionSemantics;
+import org.apache.isis.applib.annotation.Bulk;
+import org.apache.isis.applib.annotation.Command;
+import org.apache.isis.applib.annotation.PublishedAction;
+import org.apache.isis.applib.services.HasTransactionId;
+import org.apache.isis.core.commons.config.IsisConfiguration;
+import org.apache.isis.core.commons.config.IsisConfigurationAware;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
 import org.apache.isis.core.metamodel.facetapi.FacetUtil;
 import org.apache.isis.core.metamodel.facetapi.FeatureType;
 import org.apache.isis.core.metamodel.facets.Annotations;
 import org.apache.isis.core.metamodel.facets.FacetFactoryAbstract;
-import org.apache.isis.core.metamodel.facets.collections.collection.HiddenFacetForCollectionAnnotation;
+import org.apache.isis.core.metamodel.facets.actions.bulk.BulkFacet;
+import org.apache.isis.core.metamodel.facets.actions.bulk.annotation.BulkFacetAnnotation;
+import org.apache.isis.core.metamodel.facets.actions.command.CommandFacet;
+import org.apache.isis.core.metamodel.facets.actions.command.annotation.CommandFacetAnnotation;
+import org.apache.isis.core.metamodel.facets.actions.publish.PublishedActionFacet;
+import org.apache.isis.core.metamodel.facets.actions.publish.annotation.PublishedActionFacetAnnotation;
+import org.apache.isis.core.metamodel.facets.actions.semantics.ActionSemanticsFacet;
+import org.apache.isis.core.metamodel.facets.actions.semantics.annotations.actionsemantics.ActionSemanticsFacetAnnotation;
 import org.apache.isis.core.metamodel.runtimecontext.ServicesInjector;
 import org.apache.isis.core.metamodel.runtimecontext.ServicesInjectorAware;
 
-public class ActionAnnotationFacetFactory extends FacetFactoryAbstract implements ServicesInjectorAware {
+public class ActionAnnotationFacetFactory extends FacetFactoryAbstract implements ServicesInjectorAware, IsisConfigurationAware {
 
     private ServicesInjector servicesInjector;
+    private IsisConfiguration configuration;
 
     public ActionAnnotationFacetFactory() {
         super(FeatureType.ACTIONS_ONLY);
@@ -42,14 +56,15 @@ public class ActionAnnotationFacetFactory extends FacetFactoryAbstract implement
     @Override
     public void process(final ProcessMethodContext processMethodContext) {
 
-        final Method method = processMethodContext.getMethod();
-        final Action action = Annotations.getAnnotation(method, Action.class);
-        if (action == null) {
-            return;
-        }
-
         processInteraction(processMethodContext);
         processHidden(processMethodContext);
+
+        processSemantics(processMethodContext);
+        processInvokeOn(processMethodContext);
+        processCommand(processMethodContext);
+        processPublishing(processMethodContext);
+
+        processTypeOf(processMethodContext);
     }
 
     private void processInteraction(final ProcessMethodContext processMethodContext) {
@@ -68,9 +83,124 @@ public class ActionAnnotationFacetFactory extends FacetFactoryAbstract implement
                 HiddenFacetForActionAnnotation.create(action, holder));
     }
 
+    private void processSemantics(final ProcessMethodContext processMethodContext) {
+        final Method method = processMethodContext.getMethod();
+        final Action action = Annotations.getAnnotation(method, Action.class);
+        final FacetHolder holder = processMethodContext.getFacetHolder();
+
+        ActionSemanticsFacet facet;
+
+        //
+        // check for the deprecated @ActionSemantics first, because the
+        // @Action(semantics=...) has a default of NON_IDEMPOTENT that would otherwise be used
+        //
+        final ActionSemantics actionSemantics = Annotations.getAnnotation(method, ActionSemantics.class);
+        facet = ActionSemanticsFacetAnnotation.create(actionSemantics, holder);
+
+        // else check for @Action(semantics=...)
+        if(facet == null) {
+            facet = ActionSemanticsFacetForActionAnnotation.create(action, holder);
+        }
+        FacetUtil.addFacet(facet);
+    }
+
+    private void processInvokeOn(final ProcessMethodContext processMethodContext) {
+        final Method method = processMethodContext.getMethod();
+        final Action action = Annotations.getAnnotation(method, Action.class);
+        final FacetHolder holder = processMethodContext.getFacetHolder();
+
+        BulkFacet bulkFacet;
+
+        // check for the deprecated @Bulk annotation first
+        final Bulk annotation = Annotations.getAnnotation(method, Bulk.class);
+        bulkFacet = BulkFacetAnnotation.create(annotation, holder);
+
+        // else check for @Action(invokeOn=...)
+        if(bulkFacet == null) {
+            bulkFacet = BulkFacetForActionAnnotation.create(action, holder);
+        }
+
+        FacetUtil.addFacet(bulkFacet);
+    }
+
+    private void processCommand(
+            final ProcessMethodContext processMethodContext) {
+
+        final Method method = processMethodContext.getMethod();
+        final Action action = Annotations.getAnnotation(method, Action.class);
+        final FacetHolder holder = processMethodContext.getFacetHolder();
+
+        //
+        // this rule inspired by a similar rule for auditing and publishing, see DomainObjectAnnotationFacetFactory
+        //
+        if(HasTransactionId.class.isAssignableFrom(processMethodContext.getCls())) {
+            // do not install on any implementation of HasTransactionId
+            // (ie commands, audit entries, published events).
+            return;
+        }
+
+        CommandFacet commandFacet;
+
+        // check for deprecated @Command annotation first
+        final Command annotation = Annotations.getAnnotation(processMethodContext.getMethod(), Command.class);
+        commandFacet = CommandFacetAnnotation.create(annotation, processMethodContext.getFacetHolder());
+
+        // else check for @Action(command=...)
+        if(commandFacet == null) {
+            commandFacet = CommandFacetForActionAnnotation.create(action, configuration, holder);
+        }
+
+        FacetUtil.addFacet(commandFacet);
+    }
+
+    private void processPublishing(
+            final ProcessMethodContext processMethodContext) {
+
+        final Method method = processMethodContext.getMethod();
+        final Action action = Annotations.getAnnotation(method, Action.class);
+        final FacetHolder holder = processMethodContext.getFacetHolder();
+
+        //
+        // this rule inspired by a similar rule for auditing and publishing, see DomainObjectAnnotationFacetFactory
+        // and for commands, see above
+        //
+        if(HasTransactionId.class.isAssignableFrom(processMethodContext.getCls())) {
+            // do not install on any implementation of HasTransactionId
+            // (ie commands, audit entries, published events).
+            return;
+        }
+
+
+        PublishedActionFacet publishedActionFacet;
+
+        // check for deprecated @PublishedAction annotation first
+        final PublishedAction annotation = Annotations.getAnnotation(processMethodContext.getMethod(), PublishedAction.class);
+        publishedActionFacet = PublishedActionFacetAnnotation.create(annotation, holder);
+
+        // else check for @Action(publishing=...)
+        if(publishedActionFacet == null) {
+            publishedActionFacet = PublishedActionFacetForActionAnnotation.create(action, configuration, holder);
+        }
+
+        FacetUtil.addFacet(publishedActionFacet);
+    }
+
+
+    private void processTypeOf(final ProcessMethodContext processMethodContext) {
+
+        // typeOf is handled by TypeOfFacetOnActionAnnotationFactory, because the
+        // deprecated annotations etc that must also be supported.
+
+    }
+
 
     @Override
     public void setServicesInjector(final ServicesInjector servicesInjector) {
         this.servicesInjector = servicesInjector;
     }
+
+    @Override
+    public void setConfiguration(final IsisConfiguration configuration) {
+        this.configuration = configuration;
+    }
 }

http://git-wip-us.apache.org/repos/asf/isis/blob/8f4ca51c/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/action/ActionSemanticsFacetForActionAnnotation.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/action/ActionSemanticsFacetForActionAnnotation.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/action/ActionSemanticsFacetForActionAnnotation.java
new file mode 100644
index 0000000..cf59ea2
--- /dev/null
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/action/ActionSemanticsFacetForActionAnnotation.java
@@ -0,0 +1,54 @@
+/*
+ *  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.facets.actions.action;
+
+import org.apache.isis.applib.annotation.Action;
+import org.apache.isis.applib.annotation.ActionSemantics.Of;
+import org.apache.isis.applib.annotation.SemanticsOf;
+import org.apache.isis.core.metamodel.facetapi.FacetHolder;
+import org.apache.isis.core.metamodel.facets.actions.semantics.ActionSemanticsFacet;
+import org.apache.isis.core.metamodel.facets.actions.semantics.ActionSemanticsFacetAbstract;
+
+public class ActionSemanticsFacetForActionAnnotation extends ActionSemanticsFacetAbstract {
+
+    public static ActionSemanticsFacet create(
+            final Action action,
+            final FacetHolder holder) {
+
+        if(action == null) {
+            return null;
+        }
+
+        final SemanticsOf semantics = action.semantics();
+        if(action.semantics() == null) {
+            // don't think this can happen, therefore will return a facet with the default, ie NON_IDEMPOTENT
+            return null;
+        }
+
+        return new ActionSemanticsFacetForActionAnnotation(
+                SemanticsOf.from(semantics), holder);
+    }
+
+    private ActionSemanticsFacetForActionAnnotation(Of of, final FacetHolder holder) {
+        super(of, holder);
+    }
+
+
+}

http://git-wip-us.apache.org/repos/asf/isis/blob/8f4ca51c/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/action/BulkFacetForActionAnnotation.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/action/BulkFacetForActionAnnotation.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/action/BulkFacetForActionAnnotation.java
new file mode 100644
index 0000000..efd5fd0
--- /dev/null
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/action/BulkFacetForActionAnnotation.java
@@ -0,0 +1,59 @@
+/*
+ *  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.facets.actions.action;
+
+import org.apache.isis.applib.annotation.Action;
+import org.apache.isis.applib.annotation.Bulk;
+import org.apache.isis.applib.annotation.InvokeOn;
+import org.apache.isis.core.metamodel.facetapi.FacetHolder;
+import org.apache.isis.core.metamodel.facets.actions.bulk.BulkFacet;
+import org.apache.isis.core.metamodel.facets.actions.bulk.BulkFacetAbstract;
+
+public class BulkFacetForActionAnnotation extends BulkFacetAbstract {
+
+    static BulkFacet create(final Action action, final FacetHolder holder) {
+
+        if(action == null) {
+            return null;
+        }
+
+        final InvokeOn invokeOn = action.invokeOn();
+        if(invokeOn == null) {
+            return null;
+        }
+
+        switch (invokeOn) {
+            case OBJECT_ONLY:
+                return null;
+            case OBJECT_AND_COLLECTION:
+                return new BulkFacetForActionAnnotation(InvokeOn.from(invokeOn), holder);
+            case COLLECTION_ONLY:
+                return new BulkFacetForActionAnnotation(InvokeOn.from(invokeOn), holder);
+        }
+        return null;
+    }
+
+    private BulkFacetForActionAnnotation(
+            final Bulk.AppliesTo appliesTo,
+            final FacetHolder holder) {
+        super(appliesTo, holder);
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/isis/blob/8f4ca51c/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/action/CommandFacetForActionAnnotation.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/action/CommandFacetForActionAnnotation.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/action/CommandFacetForActionAnnotation.java
new file mode 100644
index 0000000..9d481d0
--- /dev/null
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/action/CommandFacetForActionAnnotation.java
@@ -0,0 +1,98 @@
+/*
+ *  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.facets.actions.action;
+
+import org.apache.isis.applib.annotation.Action;
+import org.apache.isis.applib.annotation.ActionSemantics;
+import org.apache.isis.applib.annotation.Command.ExecuteIn;
+import org.apache.isis.applib.annotation.Command.Persistence;
+import org.apache.isis.applib.annotation.CommandExecuteIn;
+import org.apache.isis.applib.annotation.CommandPersistence;
+import org.apache.isis.applib.annotation.CommandReification;
+import org.apache.isis.core.commons.config.IsisConfiguration;
+import org.apache.isis.core.metamodel.facetapi.FacetHolder;
+import org.apache.isis.core.metamodel.facets.actions.command.CommandFacet;
+import org.apache.isis.core.metamodel.facets.actions.command.CommandFacetAbstract;
+import org.apache.isis.core.metamodel.facets.actions.command.configuration.ActionConfiguration;
+import org.apache.isis.core.metamodel.facets.actions.semantics.ActionSemanticsFacet;
+
+public class CommandFacetForActionAnnotation extends CommandFacetAbstract {
+
+    static CommandFacet create(
+            final Action action,
+            final IsisConfiguration configuration,
+            final FacetHolder holder) {
+
+        if (action == null) {
+            return null;
+        }
+
+        final CommandReification command = action.command();
+        if(command == null) {
+            return null;
+        }
+
+        final CommandPersistence commandPersistence = action.commandPersistence();
+        final Persistence persistence = CommandPersistence.from(commandPersistence);
+
+        final CommandExecuteIn commandExecuteIn = action.commandExecuteIn();
+        final ExecuteIn executeIn = CommandExecuteIn.from(commandExecuteIn);
+
+        switch (command) {
+            case AS_CONFIGURED:
+                final ActionSemanticsFacet actionSemanticsFacet = holder.getFacet(ActionSemanticsFacet.class);
+                if(actionSemanticsFacet == null) {
+                    throw new IllegalStateException("Require ActionSemanticsFacet in order to process");
+                }
+                if(holder.containsDoOpFacet(CommandFacet.class)) {
+                    // do not replace
+                    return null;
+                }
+                final ActionConfiguration setting = ActionConfiguration.parse(configuration);
+                switch (setting) {
+                    case NONE:
+                        return null;
+                    case IGNORE_SAFE:
+                        if(actionSemanticsFacet.value() == ActionSemantics.Of.SAFE) {
+                            return  null;
+                        }
+                        // else fall through
+                    default:
+                        return new CommandFacetForActionAnnotation(persistence, executeIn, Enablement.ENABLED, holder);
+                }
+            case DISABLED:
+                return null;
+            case ENABLED:
+                return new CommandFacetForActionAnnotation(persistence, executeIn, Enablement.ENABLED, holder);
+        }
+
+        return null;
+    }
+
+
+    private CommandFacetForActionAnnotation(
+            final Persistence persistence,
+            final ExecuteIn executeIn,
+            final Enablement enablement,
+            final FacetHolder holder) {
+        super(persistence, executeIn, enablement, holder);
+    }
+
+
+}

http://git-wip-us.apache.org/repos/asf/isis/blob/8f4ca51c/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/action/HiddenFacetForActionAnnotation.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/action/HiddenFacetForActionAnnotation.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/action/HiddenFacetForActionAnnotation.java
index a0575ef..a616578 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/action/HiddenFacetForActionAnnotation.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/action/HiddenFacetForActionAnnotation.java
@@ -29,9 +29,19 @@ import org.apache.isis.core.metamodel.facets.members.hidden.HiddenFacetAbstract;
 
 public class HiddenFacetForActionAnnotation extends HiddenFacetAbstract {
 
-    public static HiddenFacet create(final Action action, final FacetHolder holder) {
+    public static HiddenFacet create(
+            final Action action,
+            final FacetHolder holder) {
+
+        if (action == null) {
+            return null;
+        }
+
         final Where where = action.hidden();
-        return where != null && where != Where.NOT_SPECIFIED ? new HiddenFacetForActionAnnotation(where, holder) : null;
+        if (where != null && where != Where.NOT_SPECIFIED) {
+            return new HiddenFacetForActionAnnotation(where, holder);
+        }
+        return null;
     }
 
     private HiddenFacetForActionAnnotation(final Where where, final FacetHolder holder) {

http://git-wip-us.apache.org/repos/asf/isis/blob/8f4ca51c/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/action/PublishActionsConfiguration.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/action/PublishActionsConfiguration.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/action/PublishActionsConfiguration.java
new file mode 100644
index 0000000..c789d3f
--- /dev/null
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/action/PublishActionsConfiguration.java
@@ -0,0 +1,42 @@
+/*
+ *  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.facets.actions.action;
+
+import org.apache.isis.core.commons.config.IsisConfiguration;
+
+public enum PublishActionsConfiguration {
+    ALL,
+    NONE;
+
+    private static final String PUBLISH_ACTIONS_KEY = "isis.services.publish.actions";
+
+    public static PublishActionsConfiguration parse(IsisConfiguration configuration) {
+        final String configuredValue = configuration.getString(PUBLISH_ACTIONS_KEY);
+        return PublishActionsConfiguration.parse(configuredValue);
+    }
+
+    private static PublishActionsConfiguration parse(final String value) {
+        if ("all".equalsIgnoreCase(value)) {
+            return ALL;
+        } else {
+            return NONE;
+        }
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/isis/blob/8f4ca51c/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/action/PublishedActionFacetForActionAnnotation.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/action/PublishedActionFacetForActionAnnotation.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/action/PublishedActionFacetForActionAnnotation.java
new file mode 100644
index 0000000..a276637
--- /dev/null
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/action/PublishedActionFacetForActionAnnotation.java
@@ -0,0 +1,110 @@
+/*
+ *  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.facets.actions.action;
+
+import java.util.List;
+import org.apache.isis.applib.Identifier;
+import org.apache.isis.applib.annotation.Action;
+import org.apache.isis.applib.annotation.PublishedAction;
+import org.apache.isis.applib.annotation.Publishing;
+import org.apache.isis.applib.annotation.PublishingPayloadFactoryForAction;
+import org.apache.isis.applib.services.publish.EventPayload;
+import org.apache.isis.core.commons.config.IsisConfiguration;
+import org.apache.isis.core.metamodel.facetapi.FacetHolder;
+import org.apache.isis.core.metamodel.facets.actions.publish.PublishedActionFacet;
+import org.apache.isis.core.metamodel.facets.actions.publish.PublishedActionFacetAbstract;
+
+public class PublishedActionFacetForActionAnnotation extends PublishedActionFacetAbstract {
+
+    public static PublishedActionFacet create(
+            final Action action,
+            final IsisConfiguration configuration,
+            final FacetHolder holder) {
+
+        if (action == null) {
+            return null;
+        }
+        final Publishing publishing = action.publishing();
+
+        switch (publishing) {
+            case AS_CONFIGURED:
+
+                final PublishActionsConfiguration setting = PublishActionsConfiguration.parse(configuration);
+                switch (setting) {
+                    case NONE:
+                        return null;
+                    default:
+                        return new PublishedActionFacetForActionAnnotation(
+                                newPayloadFactory(action), holder);
+                }
+            case DISABLED:
+                return null;
+            case ENABLED:
+                return new PublishedActionFacetForActionAnnotation(
+                        newPayloadFactory(action), holder);
+        }
+        return null;
+    }
+
+    private static PublishingPayloadFactoryForAction newPayloadFactory(final Action action) {
+        final Class<? extends PublishingPayloadFactoryForAction> payloadFactoryClass = action.publishingPayloadFactory();
+        if(payloadFactoryClass == null) {
+            return null;
+        }
+
+        try {
+            return payloadFactoryClass.newInstance();
+        } catch (final InstantiationException e) {
+            return null;
+        } catch (final IllegalAccessException e) {
+            return null;
+        }
+    }
+
+    public PublishedActionFacetForActionAnnotation(
+            final PublishingPayloadFactoryForAction publishingPayloadFactory,
+            final FacetHolder holder) {
+        super(legacyPayloadFactoryFor(publishingPayloadFactory), holder);
+    }
+
+    private static PublishedAction.PayloadFactory legacyPayloadFactoryFor(PublishingPayloadFactoryForAction publishingPayloadFactory) {
+        if(publishingPayloadFactory instanceof PublishingPayloadFactoryForAction.Adapter) {
+            final PublishingPayloadFactoryForAction.Adapter adapter = (PublishingPayloadFactoryForAction.Adapter) publishingPayloadFactory;
+            return adapter.getPayloadFactory();
+        }
+        return new LegacyAdapter(publishingPayloadFactory);
+    }
+
+    private static class LegacyAdapter implements PublishedAction.PayloadFactory {
+
+        private final PublishingPayloadFactoryForAction payloadFactory;
+
+        LegacyAdapter(final PublishingPayloadFactoryForAction payloadFactory) {
+            this.payloadFactory = payloadFactory;
+        }
+
+        @Override
+        public EventPayload payloadFor(final Identifier actionIdentifier, final Object target, final List<Object> arguments, final Object result) {
+            return payloadFactory.payloadFor(actionIdentifier, target, arguments, result);
+        }
+    }
+
+
+}

http://git-wip-us.apache.org/repos/asf/isis/blob/8f4ca51c/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/bulk/annotation/BulkFacetAnnotation.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/bulk/annotation/BulkFacetAnnotation.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/bulk/annotation/BulkFacetAnnotation.java
index 313025a..62b3821 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/bulk/annotation/BulkFacetAnnotation.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/bulk/annotation/BulkFacetAnnotation.java
@@ -21,12 +21,25 @@ package org.apache.isis.core.metamodel.facets.actions.bulk.annotation;
 
 import org.apache.isis.applib.annotation.Bulk;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
+import org.apache.isis.core.metamodel.facets.actions.bulk.BulkFacet;
 import org.apache.isis.core.metamodel.facets.actions.bulk.BulkFacetAbstract;
 
 public class BulkFacetAnnotation extends BulkFacetAbstract {
 
-    public BulkFacetAnnotation(Bulk.AppliesTo value, final FacetHolder holder) {
+    public static BulkFacet create(
+            final Bulk annotation,
+            final FacetHolder holder) {
+
+        if (annotation == null) {
+            return null;
+        }
+
+        return new BulkFacetAnnotation(annotation.value(), holder);
+    }
+
+    private BulkFacetAnnotation(Bulk.AppliesTo value, final FacetHolder holder) {
         super(value, holder);
     }
 
+
 }

http://git-wip-us.apache.org/repos/asf/isis/blob/8f4ca51c/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/bulk/annotation/BulkFacetAnnotationFactory.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/bulk/annotation/BulkFacetAnnotationFactory.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/bulk/annotation/BulkFacetAnnotationFactory.java
index 856590e..7080475 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/bulk/annotation/BulkFacetAnnotationFactory.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/bulk/annotation/BulkFacetAnnotationFactory.java
@@ -19,15 +19,8 @@
 
 package org.apache.isis.core.metamodel.facets.actions.bulk.annotation;
 
-import java.lang.reflect.Method;
-
-import org.apache.isis.applib.annotation.Bulk;
-import org.apache.isis.core.metamodel.facetapi.FacetHolder;
-import org.apache.isis.core.metamodel.facetapi.FacetUtil;
 import org.apache.isis.core.metamodel.facetapi.FeatureType;
-import org.apache.isis.core.metamodel.facets.Annotations;
 import org.apache.isis.core.metamodel.facets.FacetFactoryAbstract;
-import org.apache.isis.core.metamodel.facets.actions.bulk.BulkFacet;
 
 public class BulkFacetAnnotationFactory extends FacetFactoryAbstract {
 
@@ -37,13 +30,10 @@ public class BulkFacetAnnotationFactory extends FacetFactoryAbstract {
 
     @Override
     public void process(final ProcessMethodContext processMethodContext) {
-        Method method = processMethodContext.getMethod();
-        final Bulk annotation = Annotations.getAnnotation(method, Bulk.class);
-        FacetUtil.addFacet(create(annotation, processMethodContext.getFacetHolder()));
-    }
 
-    private BulkFacet create(final Bulk annotation, final FacetHolder holder) {
-        return annotation == null ? null : new BulkFacetAnnotation(annotation.value(), holder);
+        //
+        // moved to ActionAnnotationFacetFactory
+        //
     }
 
 }

http://git-wip-us.apache.org/repos/asf/isis/blob/8f4ca51c/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/command/annotation/CommandFacetAnnotation.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/command/annotation/CommandFacetAnnotation.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/command/annotation/CommandFacetAnnotation.java
index 4d59ccf..186236d 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/command/annotation/CommandFacetAnnotation.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/command/annotation/CommandFacetAnnotation.java
@@ -19,17 +19,25 @@
 
 package org.apache.isis.core.metamodel.facets.actions.command.annotation;
 
+import org.apache.isis.applib.annotation.Command;
 import org.apache.isis.applib.annotation.Command.ExecuteIn;
 import org.apache.isis.applib.annotation.Command.Persistence;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
+import org.apache.isis.core.metamodel.facets.actions.command.CommandFacet;
 import org.apache.isis.core.metamodel.facets.actions.command.CommandFacetAbstract;
 
 public class CommandFacetAnnotation extends CommandFacetAbstract {
 
-    public CommandFacetAnnotation(
-            final Persistence persistence, 
+    public static CommandFacet create(final Command annotation, final FacetHolder holder) {
+        return annotation == null
+                ? null
+                : new CommandFacetAnnotation(annotation.persistence(), annotation.executeIn(), Enablement.isDisabled(annotation.disabled()), holder);
+    }
+
+    private CommandFacetAnnotation(
+            final Persistence persistence,
             final ExecuteIn executeIn,
-            final Enablement enablement, 
+            final Enablement enablement,
             final FacetHolder holder) {
         super(persistence, executeIn, enablement, holder);
     }

http://git-wip-us.apache.org/repos/asf/isis/blob/8f4ca51c/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/command/annotation/CommandFacetAnnotationFactory.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/command/annotation/CommandFacetAnnotationFactory.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/command/annotation/CommandFacetAnnotationFactory.java
index 8f5283e..0cdb31b 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/command/annotation/CommandFacetAnnotationFactory.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/command/annotation/CommandFacetAnnotationFactory.java
@@ -19,14 +19,8 @@
 
 package org.apache.isis.core.metamodel.facets.actions.command.annotation;
 
-import org.apache.isis.applib.annotation.Command;
-import org.apache.isis.core.metamodel.facetapi.FacetHolder;
-import org.apache.isis.core.metamodel.facetapi.FacetUtil;
 import org.apache.isis.core.metamodel.facetapi.FeatureType;
-import org.apache.isis.core.metamodel.facets.Annotations;
 import org.apache.isis.core.metamodel.facets.FacetFactoryAbstract;
-import org.apache.isis.core.metamodel.facets.actions.command.CommandFacet;
-import org.apache.isis.core.metamodel.facets.actions.command.CommandFacetAbstract.Enablement;
 
 public class CommandFacetAnnotationFactory extends FacetFactoryAbstract {
 
@@ -36,14 +30,10 @@ public class CommandFacetAnnotationFactory extends FacetFactoryAbstract {
 
     @Override
     public void process(final ProcessMethodContext processMethodContext) {
-        final Command annotation = Annotations.getAnnotation(processMethodContext.getMethod(), Command.class);
-        FacetUtil.addFacet(create(annotation, processMethodContext.getFacetHolder()));
-    }
 
-    private CommandFacet create(final Command annotation, final FacetHolder holder) {
-        return annotation == null 
-                ? null 
-                : new CommandFacetAnnotation(annotation.persistence(), annotation.executeIn(), Enablement.isDisabled(annotation.disabled()), holder);
+        //
+        // moved to ActionAnnotationFacetFactory
+        //
     }
 
 }

http://git-wip-us.apache.org/repos/asf/isis/blob/8f4ca51c/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/command/configuration/ActionConfiguration.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/command/configuration/ActionConfiguration.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/command/configuration/ActionConfiguration.java
new file mode 100644
index 0000000..82a26bf
--- /dev/null
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/command/configuration/ActionConfiguration.java
@@ -0,0 +1,43 @@
+/*
+ *  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.facets.actions.command.configuration;
+
+import org.apache.isis.core.commons.config.IsisConfiguration;
+
+public enum ActionConfiguration {
+    ALL,
+    IGNORE_SAFE,
+    NONE;
+
+    private static final String  COMMAND_ACTIONS_KEY = "isis.services.command.actions";
+
+    public static ActionConfiguration parse(final IsisConfiguration configuration) {
+        return parse(configuration.getString(COMMAND_ACTIONS_KEY));
+    }
+
+    private static ActionConfiguration parse(final String value) {
+        if ("ignoreQueryOnly".equalsIgnoreCase(value) || "ignoreSafe".equalsIgnoreCase(value)) {
+            return IGNORE_SAFE;
+        } else if ("all".equals(value)) {
+            return ALL;
+        } else {
+            return NONE;
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/isis/blob/8f4ca51c/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/command/configuration/CommandFacetFromConfiguration.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/command/configuration/CommandFacetFromConfiguration.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/command/configuration/CommandFacetFromConfiguration.java
index 2f40dc9..b3a91d3 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/command/configuration/CommandFacetFromConfiguration.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/command/configuration/CommandFacetFromConfiguration.java
@@ -22,11 +22,16 @@ package org.apache.isis.core.metamodel.facets.actions.command.configuration;
 import org.apache.isis.applib.annotation.Command.ExecuteIn;
 import org.apache.isis.applib.annotation.Command.Persistence;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
+import org.apache.isis.core.metamodel.facets.actions.command.CommandFacet;
 import org.apache.isis.core.metamodel.facets.actions.command.CommandFacetAbstract;
 
 public class CommandFacetFromConfiguration extends CommandFacetAbstract {
 
-    public CommandFacetFromConfiguration(
+    public static CommandFacet create(final FacetHolder holder) {
+        return new CommandFacetFromConfiguration(Persistence.PERSISTED, ExecuteIn.FOREGROUND, holder);
+    }
+
+    private CommandFacetFromConfiguration(
             final Persistence persistence, 
             final ExecuteIn executeIn,
             final FacetHolder holder) {

http://git-wip-us.apache.org/repos/asf/isis/blob/8f4ca51c/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/command/configuration/CommandFacetFromConfigurationFactory.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/command/configuration/CommandFacetFromConfigurationFactory.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/command/configuration/CommandFacetFromConfigurationFactory.java
index 1c979cf..966510e 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/command/configuration/CommandFacetFromConfigurationFactory.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/command/configuration/CommandFacetFromConfigurationFactory.java
@@ -25,7 +25,6 @@ import org.apache.isis.applib.annotation.Command;
 import org.apache.isis.applib.services.HasTransactionId;
 import org.apache.isis.core.commons.config.IsisConfiguration;
 import org.apache.isis.core.commons.config.IsisConfigurationAware;
-import org.apache.isis.core.metamodel.facetapi.FacetHolder;
 import org.apache.isis.core.metamodel.facetapi.FacetUtil;
 import org.apache.isis.core.metamodel.facetapi.FeatureType;
 import org.apache.isis.core.metamodel.facets.Annotations;
@@ -40,23 +39,6 @@ import org.apache.isis.core.metamodel.facets.actions.semantics.ActionSemanticsFa
  */
 public class CommandFacetFromConfigurationFactory extends FacetFactoryAbstract implements IsisConfigurationAware  {
 
-    private static final String  COMMAND_ACTIONS_KEY = "isis.services.command.actions";
-
-    private static enum ActionCategorization {
-        ALL,
-        IGNORE_SAFE,
-        NONE;
-        public static ActionCategorization parse(final String value) {
-            if ("ignoreQueryOnly".equalsIgnoreCase(value) || "ignoreSafe".equalsIgnoreCase(value)) {
-                return IGNORE_SAFE;
-            } else if ("all".equals(value)) {
-                return ALL;
-            } else {
-                return NONE;
-            }
-        }
-    }
-    
     private IsisConfiguration configuration;
 
     public CommandFacetFromConfigurationFactory() {
@@ -83,19 +65,15 @@ public class CommandFacetFromConfigurationFactory extends FacetFactoryAbstract i
             // (ie commands, audit entries, published events).
             return; 
         }
-        final ActionCategorization categorization = ActionCategorization.parse(configuration.getString(COMMAND_ACTIONS_KEY));
-        if(categorization == ActionCategorization.NONE) {
+        final ActionConfiguration setting = ActionConfiguration.parse(configuration);
+        if(setting == ActionConfiguration.NONE) {
             return;
         }
-        if(actionSemanticsFacet.value() == Of.SAFE && categorization == ActionCategorization.IGNORE_SAFE) {
+        if(actionSemanticsFacet.value() == Of.SAFE && setting == ActionConfiguration.IGNORE_SAFE) {
             return;
         }
         final Command annotation = Annotations.getAnnotation(method, Command.class);
-        FacetUtil.addFacet(create(annotation, facetHolder));
-    }
-
-    private CommandFacet create(final Command annotation, final FacetHolder holder) {
-        return new CommandFacetFromConfiguration(Command.Persistence.PERSISTED, Command.ExecuteIn.FOREGROUND, holder);
+        FacetUtil.addFacet(CommandFacetFromConfiguration.create(facetHolder));
     }
 
     // //////////////////////////////////////

http://git-wip-us.apache.org/repos/asf/isis/blob/8f4ca51c/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 7c362c6..ad36b39 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
@@ -29,6 +29,7 @@ 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.InvokedOn;
 import org.apache.isis.applib.clock.Clock;
 import org.apache.isis.applib.services.background.ActionInvocationMemento;
 import org.apache.isis.applib.services.background.BackgroundService;
@@ -238,7 +239,7 @@ public abstract class ActionInvocationFacetForInteractionAbstract
                     bulkInteractionContext != null &&
                     bulkInteractionContext.getInvokedAs() == null) {
 
-                bulkInteractionContext.setActionInvokedAs(BulkInteractionContext.InvokedAs.REGULAR);
+                bulkInteractionContext.setActionInvokedOn(InvokedOn.OBJECT);
                 bulkInteractionContext.setDomainObjects(Collections.singletonList(targetPojo));
             }
 

http://git-wip-us.apache.org/repos/asf/isis/blob/8f4ca51c/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/layout/ActionLayoutFacetFactory.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/layout/ActionLayoutFacetFactory.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/layout/ActionLayoutFacetFactory.java
new file mode 100644
index 0000000..d9132c9
--- /dev/null
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/layout/ActionLayoutFacetFactory.java
@@ -0,0 +1,168 @@
+/*
+ *  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.facets.actions.layout;
+
+
+import java.util.Properties;
+import org.apache.isis.applib.annotation.ActionLayout;
+import org.apache.isis.core.metamodel.facetapi.FacetHolder;
+import org.apache.isis.core.metamodel.facetapi.FacetUtil;
+import org.apache.isis.core.metamodel.facetapi.FeatureType;
+import org.apache.isis.core.metamodel.facets.Annotations;
+import org.apache.isis.core.metamodel.facets.ContributeeMemberFacetFactory;
+import org.apache.isis.core.metamodel.facets.FacetFactoryAbstract;
+import org.apache.isis.core.metamodel.facets.actions.position.ActionPositionFacet;
+import org.apache.isis.core.metamodel.facets.actions.position.ActionPositionFacetFallback;
+import org.apache.isis.core.metamodel.facets.actions.prototype.PrototypeFacet;
+import org.apache.isis.core.metamodel.facets.all.describedas.DescribedAsFacet;
+import org.apache.isis.core.metamodel.facets.all.hide.HiddenFacet;
+import org.apache.isis.core.metamodel.facets.all.named.NamedFacet;
+import org.apache.isis.core.metamodel.facets.members.cssclass.CssClassFacet;
+import org.apache.isis.core.metamodel.facets.members.cssclassfa.CssClassFaFacet;
+
+
+public class ActionLayoutFacetFactory extends FacetFactoryAbstract implements ContributeeMemberFacetFactory {
+
+    public ActionLayoutFacetFactory() {
+        super(FeatureType.ACTIONS_ONLY);
+    }
+
+    @Override
+    public void process(final ProcessMethodContext processMethodContext) {
+
+        final FacetHolder holder = processMethodContext.getFacetHolder();
+
+        Properties properties = processMethodContext.metadataProperties("actionLayout");
+        if(properties == null) {
+            // alternate key
+            properties = processMethodContext.metadataProperties("layout");
+        }
+        final ActionLayout actionLayout = Annotations.getAnnotation(processMethodContext.getMethod(), ActionLayout.class);
+
+
+        // cssClass
+        CssClassFacet cssClassFacet = CssClassFacetOnActionFromLayoutProperties.create(properties, holder);
+        if(cssClassFacet == null) {
+            cssClassFacet = CssClassFacetForActionLayoutAnnotation.create(actionLayout, holder);
+        }
+        FacetUtil.addFacet(cssClassFacet);
+
+
+        // cssClassFa
+        CssClassFaFacet cssClassFaFacet = CssClassFaFacetOnActionFromLayoutProperties.create(properties, holder);
+        if(cssClassFaFacet == null) {
+            cssClassFaFacet = CssClassFaFacetForActionLayoutAnnotation.create(actionLayout, holder);
+        }
+        FacetUtil.addFacet(cssClassFaFacet);
+
+
+        // describedAs
+        DescribedAsFacet describedAsFacet = DescribedAsFacetOnActionFromLayoutProperties.create(properties, holder);
+        if(describedAsFacet == null) {
+            describedAsFacet = DescribedAsFacetForActionLayoutAnnotation.create(actionLayout, holder);
+        }
+        FacetUtil.addFacet(describedAsFacet);
+
+
+        // hidden
+        HiddenFacet hiddenFacet = HiddenFacetOnActionFromLayoutProperties.create(properties, holder);
+        if(hiddenFacet == null) {
+            hiddenFacet = HiddenFacetForActionLayoutAnnotation.create(actionLayout, holder);
+        }
+        FacetUtil.addFacet(hiddenFacet);
+
+
+        // named
+        NamedFacet namedFacet = NamedFacetOnActionFromLayoutProperties.create(properties, holder);
+        if(namedFacet == null) {
+            namedFacet = NamedFacetForActionLayoutAnnotation.create(actionLayout, holder);
+        }
+        FacetUtil.addFacet(namedFacet);
+
+
+        // position
+        ActionPositionFacet actionPositionFacet = ActionPositionFacetOnActionFromLayoutProperties.create(properties, holder);
+        if(actionPositionFacet == null) {
+            actionPositionFacet = ActionPositionFacetForActionLayoutAnnotation.create(actionLayout, holder);
+        }
+        if(actionPositionFacet == null) {
+            actionPositionFacet = new ActionPositionFacetFallback(holder);
+        }
+        FacetUtil.addFacet(actionPositionFacet);
+
+
+        // prototype
+        PrototypeFacet prototypeFacet = PrototypeFacetOnActionFromLayoutProperties.create(properties, holder);
+        if(prototypeFacet == null) {
+            prototypeFacet = PrototypeFacetForActionLayoutAnnotation.create(actionLayout, holder);
+        }
+        FacetUtil.addFacet(prototypeFacet);
+    }
+
+    @Override
+    public void process(ProcessContributeeMemberContext processMemberContext) {
+        final FacetHolder holder = processMemberContext.getFacetHolder();
+
+        Properties properties = processMemberContext.metadataProperties("actionLayout");
+        if (properties == null) {
+            // alternate key
+            properties = processMemberContext.metadataProperties("layout");
+        }
+
+
+        // cssClass
+        CssClassFacet cssClassFacet = CssClassFacetOnActionFromLayoutProperties.create(properties, holder);
+        FacetUtil.addFacet(cssClassFacet);
+
+
+        // cssClassFa
+        CssClassFaFacet cssClassFaFacet = CssClassFaFacetOnActionFromLayoutProperties.create(properties, holder);
+        FacetUtil.addFacet(cssClassFaFacet);
+
+
+        // describedAs
+        DescribedAsFacet describedAsFacet = DescribedAsFacetOnActionFromLayoutProperties.create(properties, holder);
+        FacetUtil.addFacet(describedAsFacet);
+
+
+        // hidden
+        HiddenFacet hiddenFacet = HiddenFacetOnActionFromLayoutProperties.create(properties, holder);
+        FacetUtil.addFacet(hiddenFacet);
+
+
+        // named
+        NamedFacet namedFacet = NamedFacetOnActionFromLayoutProperties.create(properties, holder);
+        FacetUtil.addFacet(namedFacet);
+
+
+        // position
+        ActionPositionFacet actionPositionFacet = ActionPositionFacetOnActionFromLayoutProperties.create(properties, holder);
+        if(actionPositionFacet == null) {
+            actionPositionFacet = new ActionPositionFacetFallback(holder);
+        }
+        FacetUtil.addFacet(actionPositionFacet);
+
+
+        // prototype
+        PrototypeFacet prototypeFacet = PrototypeFacetOnActionFromLayoutProperties.create(properties, holder);
+        FacetUtil.addFacet(prototypeFacet);
+
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/isis/blob/8f4ca51c/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/layout/ActionLayoutFactory.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/layout/ActionLayoutFactory.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/layout/ActionLayoutFactory.java
deleted file mode 100644
index 725d3c4..0000000
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/layout/ActionLayoutFactory.java
+++ /dev/null
@@ -1,168 +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.core.metamodel.facets.actions.layout;
-
-
-import java.util.Properties;
-import org.apache.isis.applib.annotation.ActionLayout;
-import org.apache.isis.core.metamodel.facetapi.FacetHolder;
-import org.apache.isis.core.metamodel.facetapi.FacetUtil;
-import org.apache.isis.core.metamodel.facetapi.FeatureType;
-import org.apache.isis.core.metamodel.facets.Annotations;
-import org.apache.isis.core.metamodel.facets.ContributeeMemberFacetFactory;
-import org.apache.isis.core.metamodel.facets.FacetFactoryAbstract;
-import org.apache.isis.core.metamodel.facets.actions.position.ActionPositionFacet;
-import org.apache.isis.core.metamodel.facets.actions.position.ActionPositionFacetFallback;
-import org.apache.isis.core.metamodel.facets.actions.prototype.PrototypeFacet;
-import org.apache.isis.core.metamodel.facets.all.describedas.DescribedAsFacet;
-import org.apache.isis.core.metamodel.facets.all.hide.HiddenFacet;
-import org.apache.isis.core.metamodel.facets.all.named.NamedFacet;
-import org.apache.isis.core.metamodel.facets.members.cssclass.CssClassFacet;
-import org.apache.isis.core.metamodel.facets.members.cssclassfa.CssClassFaFacet;
-
-
-public class ActionLayoutFactory extends FacetFactoryAbstract implements ContributeeMemberFacetFactory {
-
-    public ActionLayoutFactory() {
-        super(FeatureType.ACTIONS_ONLY);
-    }
-
-    @Override
-    public void process(final ProcessMethodContext processMethodContext) {
-
-        final FacetHolder holder = processMethodContext.getFacetHolder();
-
-        Properties properties = processMethodContext.metadataProperties("actionLayout");
-        if(properties == null) {
-            // alternate key
-            properties = processMethodContext.metadataProperties("layout");
-        }
-        final ActionLayout actionLayout = Annotations.getAnnotation(processMethodContext.getMethod(), ActionLayout.class);
-
-
-        // cssClass
-        CssClassFacet cssClassFacet = CssClassFacetOnActionFromLayoutProperties.create(properties, holder);
-        if(cssClassFacet == null) {
-            cssClassFacet = CssClassFacetForActionLayoutAnnotation.create(actionLayout, holder);
-        }
-        FacetUtil.addFacet(cssClassFacet);
-
-
-        // cssClassFa
-        CssClassFaFacet cssClassFaFacet = CssClassFaFacetOnActionFromLayoutProperties.create(properties, holder);
-        if(cssClassFaFacet == null) {
-            cssClassFaFacet = CssClassFaFacetForActionLayoutAnnotation.create(actionLayout, holder);
-        }
-        FacetUtil.addFacet(cssClassFaFacet);
-
-
-        // describedAs
-        DescribedAsFacet describedAsFacet = DescribedAsFacetOnActionFromLayoutProperties.create(properties, holder);
-        if(describedAsFacet == null) {
-            describedAsFacet = DescribedAsFacetForActionLayoutAnnotation.create(actionLayout, holder);
-        }
-        FacetUtil.addFacet(describedAsFacet);
-
-
-        // hidden
-        HiddenFacet hiddenFacet = HiddenFacetOnActionFromLayoutProperties.create(properties, holder);
-        if(hiddenFacet == null) {
-            hiddenFacet = HiddenFacetForActionLayoutAnnotation.create(actionLayout, holder);
-        }
-        FacetUtil.addFacet(hiddenFacet);
-
-
-        // named
-        NamedFacet namedFacet = NamedFacetOnActionFromLayoutProperties.create(properties, holder);
-        if(namedFacet == null) {
-            namedFacet = NamedFacetForActionLayoutAnnotation.create(actionLayout, holder);
-        }
-        FacetUtil.addFacet(namedFacet);
-
-
-        // position
-        ActionPositionFacet actionPositionFacet = ActionPositionFacetOnActionFromLayoutProperties.create(properties, holder);
-        if(actionPositionFacet == null) {
-            actionPositionFacet = ActionPositionFacetForActionLayoutAnnotation.create(actionLayout, holder);
-        }
-        if(actionPositionFacet == null) {
-            actionPositionFacet = new ActionPositionFacetFallback(holder);
-        }
-        FacetUtil.addFacet(actionPositionFacet);
-
-
-        // prototype
-        PrototypeFacet prototypeFacet = PrototypeFacetOnActionFromLayoutProperties.create(properties, holder);
-        if(prototypeFacet == null) {
-            prototypeFacet = PrototypeFacetForActionLayoutAnnotation.create(actionLayout, holder);
-        }
-        FacetUtil.addFacet(prototypeFacet);
-    }
-
-    @Override
-    public void process(ProcessContributeeMemberContext processMemberContext) {
-        final FacetHolder holder = processMemberContext.getFacetHolder();
-
-        Properties properties = processMemberContext.metadataProperties("actionLayout");
-        if (properties == null) {
-            // alternate key
-            properties = processMemberContext.metadataProperties("layout");
-        }
-
-
-        // cssClass
-        CssClassFacet cssClassFacet = CssClassFacetOnActionFromLayoutProperties.create(properties, holder);
-        FacetUtil.addFacet(cssClassFacet);
-
-
-        // cssClassFa
-        CssClassFaFacet cssClassFaFacet = CssClassFaFacetOnActionFromLayoutProperties.create(properties, holder);
-        FacetUtil.addFacet(cssClassFaFacet);
-
-
-        // describedAs
-        DescribedAsFacet describedAsFacet = DescribedAsFacetOnActionFromLayoutProperties.create(properties, holder);
-        FacetUtil.addFacet(describedAsFacet);
-
-
-        // hidden
-        HiddenFacet hiddenFacet = HiddenFacetOnActionFromLayoutProperties.create(properties, holder);
-        FacetUtil.addFacet(hiddenFacet);
-
-
-        // named
-        NamedFacet namedFacet = NamedFacetOnActionFromLayoutProperties.create(properties, holder);
-        FacetUtil.addFacet(namedFacet);
-
-
-        // position
-        ActionPositionFacet actionPositionFacet = ActionPositionFacetOnActionFromLayoutProperties.create(properties, holder);
-        if(actionPositionFacet == null) {
-            actionPositionFacet = new ActionPositionFacetFallback(holder);
-        }
-        FacetUtil.addFacet(actionPositionFacet);
-
-
-        // prototype
-        PrototypeFacet prototypeFacet = PrototypeFacetOnActionFromLayoutProperties.create(properties, holder);
-        FacetUtil.addFacet(prototypeFacet);
-
-    }
-
-}

http://git-wip-us.apache.org/repos/asf/isis/blob/8f4ca51c/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/publish/annotation/PublishedActionFacetAnnotation.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/publish/annotation/PublishedActionFacetAnnotation.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/publish/annotation/PublishedActionFacetAnnotation.java
index 1c3098a..4da2697 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/publish/annotation/PublishedActionFacetAnnotation.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/publish/annotation/PublishedActionFacetAnnotation.java
@@ -21,12 +21,43 @@ package org.apache.isis.core.metamodel.facets.actions.publish.annotation;
 
 import org.apache.isis.applib.annotation.PublishedAction;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
+import org.apache.isis.core.metamodel.facets.actions.publish.PublishedActionFacet;
 import org.apache.isis.core.metamodel.facets.actions.publish.PublishedActionFacetAbstract;
 
 public class PublishedActionFacetAnnotation extends PublishedActionFacetAbstract {
 
-    public PublishedActionFacetAnnotation(PublishedAction.PayloadFactory eventCanonicalizer, final FacetHolder holder) {
-        super(eventCanonicalizer, holder);
+    public static PublishedActionFacet create(
+            final PublishedAction publishedAction,
+            final FacetHolder holder) {
+
+        if (publishedAction == null) {
+            return null;
+        }
+
+        return new PublishedActionFacetAnnotation(newPayloadFactory(publishedAction), holder);
+    }
+
+
+    public PublishedActionFacetAnnotation(
+            final PublishedAction.PayloadFactory payloadFactory,
+            final FacetHolder holder) {
+        super(payloadFactory, holder);
     }
 
+    private static PublishedAction.PayloadFactory newPayloadFactory(final PublishedAction publishedAction) {
+        final Class<? extends PublishedAction.PayloadFactory> payloadFactoryClass = publishedAction.value();
+        if(payloadFactoryClass == null) {
+            return null;
+        }
+
+        try {
+            return payloadFactoryClass.newInstance();
+        } catch (final InstantiationException e) {
+            return null;
+        } catch (final IllegalAccessException e) {
+            return null;
+        }
+    }
+
+
 }

http://git-wip-us.apache.org/repos/asf/isis/blob/8f4ca51c/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/publish/annotation/PublishedActionFacetAnnotationFactory.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/publish/annotation/PublishedActionFacetAnnotationFactory.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/publish/annotation/PublishedActionFacetAnnotationFactory.java
index b558cb3..a0df302 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/publish/annotation/PublishedActionFacetAnnotationFactory.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/publish/annotation/PublishedActionFacetAnnotationFactory.java
@@ -19,13 +19,8 @@
 
 package org.apache.isis.core.metamodel.facets.actions.publish.annotation;
 
-import org.apache.isis.applib.annotation.PublishedAction;
-import org.apache.isis.core.metamodel.facetapi.FacetHolder;
-import org.apache.isis.core.metamodel.facetapi.FacetUtil;
 import org.apache.isis.core.metamodel.facetapi.FeatureType;
-import org.apache.isis.core.metamodel.facets.Annotations;
 import org.apache.isis.core.metamodel.facets.FacetFactoryAbstract;
-import org.apache.isis.core.metamodel.facets.actions.publish.PublishedActionFacet;
 
 public class PublishedActionFacetAnnotationFactory extends FacetFactoryAbstract {
 
@@ -35,26 +30,13 @@ public class PublishedActionFacetAnnotationFactory extends FacetFactoryAbstract
 
     @Override
     public void process(final ProcessMethodContext processMethodContext) {
-        final PublishedAction annotation = Annotations.getAnnotation(processMethodContext.getMethod(), PublishedAction.class);
-        FacetUtil.addFacet(create(annotation, processMethodContext.getFacetHolder()));
-    }
 
-    private PublishedActionFacet create(final PublishedAction annotation, final FacetHolder holder) {
-        return annotation == null ? null : new PublishedActionFacetAnnotation(newPayloadFactory(annotation.value()), holder);
-    }
+        //
+        // moved to ActionAnnotationFacetFactory
+        //
 
-    private static PublishedAction.PayloadFactory newPayloadFactory(final Class<? extends PublishedAction.PayloadFactory> value) {
-        if(value == null) {
-            return null;
-        }
-        try {
-            return (PublishedAction.PayloadFactory) value.newInstance();
-        } catch (final InstantiationException e) {
-            return null;
-        } catch (final IllegalAccessException e) {
-            return null;
-        }
     }
 
 
+
 }

http://git-wip-us.apache.org/repos/asf/isis/blob/8f4ca51c/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/semantics/annotations/actionsemantics/ActionSemanticsFacetAnnotation.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/semantics/annotations/actionsemantics/ActionSemanticsFacetAnnotation.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/semantics/annotations/actionsemantics/ActionSemanticsFacetAnnotation.java
index d6c2636..7815848 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/semantics/annotations/actionsemantics/ActionSemanticsFacetAnnotation.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/semantics/annotations/actionsemantics/ActionSemanticsFacetAnnotation.java
@@ -19,14 +19,28 @@
 
 package org.apache.isis.core.metamodel.facets.actions.semantics.annotations.actionsemantics;
 
+import org.apache.isis.applib.annotation.ActionSemantics;
 import org.apache.isis.applib.annotation.ActionSemantics.Of;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
+import org.apache.isis.core.metamodel.facets.actions.semantics.ActionSemanticsFacet;
 import org.apache.isis.core.metamodel.facets.actions.semantics.ActionSemanticsFacetAbstract;
 
 public class ActionSemanticsFacetAnnotation extends ActionSemanticsFacetAbstract {
 
+    public static ActionSemanticsFacet create(
+            final ActionSemantics actionSemantics,
+            final FacetHolder holder) {
+
+        if (actionSemantics == null) {
+            return null;
+        }
+
+        return new ActionSemanticsFacetAnnotation(actionSemantics.value(), holder);
+    }
+
     public ActionSemanticsFacetAnnotation(Of of, final FacetHolder holder) {
         super(of, holder);
     }
 
+
 }

http://git-wip-us.apache.org/repos/asf/isis/blob/8f4ca51c/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/semantics/annotations/actionsemantics/ActionSemanticsFacetAnnotationFactory.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/semantics/annotations/actionsemantics/ActionSemanticsFacetAnnotationFactory.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/semantics/annotations/actionsemantics/ActionSemanticsFacetAnnotationFactory.java
index 3e0b3ea..7a95b9b 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/semantics/annotations/actionsemantics/ActionSemanticsFacetAnnotationFactory.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/semantics/annotations/actionsemantics/ActionSemanticsFacetAnnotationFactory.java
@@ -19,13 +19,8 @@
 
 package org.apache.isis.core.metamodel.facets.actions.semantics.annotations.actionsemantics;
 
-import org.apache.isis.applib.annotation.ActionSemantics;
-import org.apache.isis.core.metamodel.facetapi.FacetHolder;
-import org.apache.isis.core.metamodel.facetapi.FacetUtil;
 import org.apache.isis.core.metamodel.facetapi.FeatureType;
-import org.apache.isis.core.metamodel.facets.Annotations;
 import org.apache.isis.core.metamodel.facets.FacetFactoryAbstract;
-import org.apache.isis.core.metamodel.facets.actions.semantics.ActionSemanticsFacet;
 
 public class ActionSemanticsFacetAnnotationFactory extends FacetFactoryAbstract {
 
@@ -35,12 +30,11 @@ public class ActionSemanticsFacetAnnotationFactory extends FacetFactoryAbstract
 
     @Override
     public void process(final ProcessMethodContext processMethodContext) {
-        final ActionSemantics annotation = Annotations.getAnnotation(processMethodContext.getMethod(), ActionSemantics.class);
-        FacetUtil.addFacet(create(annotation, processMethodContext.getFacetHolder()));
-    }
 
-    private ActionSemanticsFacet create(final ActionSemantics annotation, final FacetHolder holder) {
-        return annotation == null ? null : new ActionSemanticsFacetAnnotation(annotation.value(), holder);
+        //
+        // now handled by ActionAnnotationFacetFactory
+        // because of the interdependency between action semantics and command reification.
+        //
     }
 
 }

http://git-wip-us.apache.org/repos/asf/isis/blob/8f4ca51c/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/semantics/fallback/ActionSemanticsFacetFallbackToNonIdempotentFactory.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/semantics/fallback/ActionSemanticsFacetFallbackToNonIdempotentFactory.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/semantics/fallback/ActionSemanticsFacetFallbackToNonIdempotentFactory.java
index 64674a5..dcd54fa 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/semantics/fallback/ActionSemanticsFacetFallbackToNonIdempotentFactory.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/semantics/fallback/ActionSemanticsFacetFallbackToNonIdempotentFactory.java
@@ -35,6 +35,11 @@ public class ActionSemanticsFacetFallbackToNonIdempotentFactory extends FacetFac
     public void process(final ProcessMethodContext processMethodContext) {
         final FacetedMethod facetHolder = processMethodContext.getFacetHolder();
         if(facetHolder.containsDoOpFacet(ActionSemanticsFacet.class)) {
+
+            // expect this always to be the case, because ActionSemanticsFacetAnnotationFactory will always install
+            // an action semantics facet, either for @ActionSemantics or for @Action(semantics=...)
+
+            // therefore, this facet factory is a no-op and can (probably, I reckon) be deleted
             return;
         }
         FacetUtil.addFacet(new ActionSemanticsFacetFallbackToNonIdempotent(facetHolder));

http://git-wip-us.apache.org/repos/asf/isis/blob/8f4ca51c/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/typeof/annotation/TypeOfFacetOnActionAnnotationFactory.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/typeof/annotation/TypeOfFacetOnActionAnnotationFactory.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/typeof/annotation/TypeOfFacetOnActionAnnotationFactory.java
index 24636c1..19907d0 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/typeof/annotation/TypeOfFacetOnActionAnnotationFactory.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/typeof/annotation/TypeOfFacetOnActionAnnotationFactory.java
@@ -24,7 +24,7 @@ import java.lang.reflect.Method;
 import java.lang.reflect.ParameterizedType;
 import java.lang.reflect.Type;
 import java.lang.reflect.TypeVariable;
-import org.apache.isis.applib.annotation.Collection;
+import org.apache.isis.applib.annotation.Action;
 import org.apache.isis.applib.annotation.TypeOf;
 import org.apache.isis.core.metamodel.facetapi.FacetUtil;
 import org.apache.isis.core.metamodel.facetapi.FeatureType;
@@ -58,10 +58,13 @@ public class TypeOfFacetOnActionAnnotationFactory extends FacetFactoryAbstract {
             return;
         }
 
-        final Collection collection = Annotations.getAnnotation(method, Collection.class);
-        if (collection != null && collection.typeOf() != null) {
-            FacetUtil.addFacet(new TypeOfFacetForActionAnnotation(collection.typeOf(), getSpecificationLoader(), processMethodContext.getFacetHolder()));
-            return;
+        final Action action = Annotations.getAnnotation(method, Action.class);
+        if (action != null) {
+            final Class<?> typeOf = action.typeOf();
+            if(typeOf != null && typeOf != Object.class) {
+                FacetUtil.addFacet(new TypeOfFacetForActionAnnotation(typeOf, getSpecificationLoader(), processMethodContext.getFacetHolder()));
+                return;
+            }
         }
 
         final TypeOf annotation = Annotations.getAnnotation(method, TypeOf.class);

http://git-wip-us.apache.org/repos/asf/isis/blob/8f4ca51c/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/collection/CollectionAnnotationFacetFactory.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/collection/CollectionAnnotationFacetFactory.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/collection/CollectionAnnotationFacetFactory.java
index b97374a..6fc2577 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/collection/CollectionAnnotationFacetFactory.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/collection/CollectionAnnotationFacetFactory.java
@@ -40,12 +40,6 @@ public class CollectionAnnotationFacetFactory extends FacetFactoryAbstract imple
     @Override
     public void process(final ProcessMethodContext processMethodContext) {
 
-        final Method method = processMethodContext.getMethod();
-        final Collection collection = Annotations.getAnnotation(method, Collection.class);
-        if (collection == null) {
-            return;
-        }
-
         processInteraction(processMethodContext);
         processHidden(processMethodContext);
         processEditing(processMethodContext);
@@ -79,7 +73,7 @@ public class CollectionAnnotationFacetFactory extends FacetFactoryAbstract imple
 
     private void processTypeOf(final ProcessMethodContext processMethodContext) {
 
-        // typeOf is handled by TypeOfFacetOnActionAnnotationFactory, because the
+        // typeOf is handled by TypeOfFacetOnCollectionAnnotationFactory, because the
         // deprecated annotations etc that must also be supported.
     }
 

http://git-wip-us.apache.org/repos/asf/isis/blob/8f4ca51c/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/collection/DisabledFacetForCollectionAnnotation.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/collection/DisabledFacetForCollectionAnnotation.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/collection/DisabledFacetForCollectionAnnotation.java
index ed881f4..1424607 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/collection/DisabledFacetForCollectionAnnotation.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/collection/DisabledFacetForCollectionAnnotation.java
@@ -20,7 +20,7 @@
 package org.apache.isis.core.metamodel.facets.collections.collection;
 
 import org.apache.isis.applib.annotation.Collection;
-import org.apache.isis.applib.annotation.EditPolicy;
+import org.apache.isis.applib.annotation.Editing;
 import org.apache.isis.applib.annotation.When;
 import org.apache.isis.applib.annotation.Where;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
@@ -29,11 +29,18 @@ import org.apache.isis.core.metamodel.facets.members.disabled.DisabledFacetAbstr
 
 public class DisabledFacetForCollectionAnnotation extends DisabledFacetAbstractImpl {
 
-    public static DisabledFacet create(final Collection collection, final FacetHolder holder) {
-        final EditPolicy editPolicy = collection.editing();
+    public static DisabledFacet create(
+            final Collection collection,
+            final FacetHolder holder) {
+
+        if (collection == null) {
+            return null;
+        }
+
+        final Editing editing = collection.editing();
         final String disabledReason = collection.editingDisabledReason();
 
-        switch (editPolicy) {
+        switch (editing) {
             case AS_CONFIGURED:
 
                 // nothing needs to be done here; the DomainObjectFactory (processing @DomainObject annotation)

http://git-wip-us.apache.org/repos/asf/isis/blob/8f4ca51c/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/collection/HiddenFacetForCollectionAnnotation.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/collection/HiddenFacetForCollectionAnnotation.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/collection/HiddenFacetForCollectionAnnotation.java
index 9de9f87..aee5058 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/collection/HiddenFacetForCollectionAnnotation.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/collection/HiddenFacetForCollectionAnnotation.java
@@ -29,9 +29,20 @@ import org.apache.isis.core.metamodel.facets.members.hidden.HiddenFacetAbstract;
 
 public class HiddenFacetForCollectionAnnotation extends HiddenFacetAbstract {
 
-    public static HiddenFacet create(final Collection collection, final FacetHolder holder) {
+    public static HiddenFacet create(
+            final Collection collection,
+            final FacetHolder holder) {
+
+        if (collection == null) {
+            return null;
+        }
+
         final Where where = collection.hidden();
-        return where != null && where != Where.NOT_SPECIFIED ? new HiddenFacetForCollectionAnnotation(where, holder) : null;
+        if (where != null && where != Where.NOT_SPECIFIED) {
+            return new HiddenFacetForCollectionAnnotation(where, holder);
+        }
+
+        return null;
     }
 
     private HiddenFacetForCollectionAnnotation(final Where where, final FacetHolder holder) {