You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@isis.apache.org by da...@apache.org on 2015/01/22 13:40:31 UTC

[2/6] isis git commit: ISIS-970: unit testing of @Action annotation

http://git-wip-us.apache.org/repos/asf/isis/blob/18d470c3/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/InteractionHelper_newCollectionInteractionEvent_forAdd.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/InteractionHelper_newCollectionInteractionEvent_forAdd.java b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/InteractionHelper_newCollectionInteractionEvent_forAdd.java
deleted file mode 100644
index 002c91a..0000000
--- a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/InteractionHelper_newCollectionInteractionEvent_forAdd.java
+++ /dev/null
@@ -1,85 +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;
-
-import java.util.Set;
-import org.junit.Test;
-import org.apache.isis.applib.Identifier;
-import org.apache.isis.applib.services.eventbus.AbstractDomainEvent;
-import org.apache.isis.applib.services.eventbus.CollectionAddedToEvent;
-import org.apache.isis.applib.services.eventbus.CollectionDomainEvent;
-
-import static org.hamcrest.CoreMatchers.is;
-import static org.junit.Assert.assertThat;
-
-public class InteractionHelper_newCollectionInteractionEvent_forAdd {
-
-    public static class SomeDomainObject {
-        public Set<SomeReferencedObject> getReferences() { return null; }
-    }
-    public static class SomeReferencedObject {}
-    
-    public static class SomeDomainObjectCollectionEvent extends CollectionDomainEvent<SomeDomainObject, SomeReferencedObject> {
-        private static final long serialVersionUID = 1L;
-        public SomeDomainObjectCollectionEvent(SomeDomainObject source, Identifier identifier, Of of, SomeReferencedObject value) {
-            super(source, identifier, of, value);
-        }
-    }
-    
-    @Test
-    public void defaultEventType() throws Exception {
-        final SomeDomainObject sdo = new SomeDomainObject();
-        final SomeReferencedObject other = new SomeReferencedObject();
-        final Identifier identifier = Identifier.propertyOrCollectionIdentifier(SomeDomainObject.class, "references");
-
-        final CollectionDomainEvent<Object, Object> ev = new InteractionHelper(null).newCollectionDomainEvent(
-                CollectionDomainEvent.Default.class, null, identifier, sdo, CollectionDomainEvent.Of.ADD_TO, other);
-        assertThat(ev.getSource(), is((Object)sdo));
-        assertThat(ev.getIdentifier(), is(identifier));
-        assertThat(ev.getOf(), is(CollectionDomainEvent.Of.ADD_TO));
-        assertThat(ev.getValue(), is((Object)other));
-    }
-
-    @Test
-    public void collectionAddedToDefaultEventType() throws Exception {
-        final SomeDomainObject sdo = new SomeDomainObject();
-        final SomeReferencedObject other = new SomeReferencedObject();
-        final Identifier identifier = Identifier.propertyOrCollectionIdentifier(SomeDomainObject.class, "references");
-
-        final CollectionDomainEvent<Object, Object> ev = new InteractionHelper(null).newCollectionDomainEvent(
-                CollectionAddedToEvent.Default.class, AbstractDomainEvent.Phase.EXECUTED, identifier, sdo, CollectionDomainEvent.Of.ADD_TO, other);
-        assertThat(ev.getSource(), is((Object)sdo));
-        assertThat(ev.getIdentifier(), is(identifier));
-        assertThat(ev.getOf(), is(CollectionDomainEvent.Of.ADD_TO));
-        assertThat(ev.getValue(), is((Object)other));
-    }
-
-    @Test
-    public void customEventType() throws Exception {
-        final SomeDomainObject sdo = new SomeDomainObject();
-        final SomeReferencedObject other = new SomeReferencedObject();
-        final Identifier identifier = Identifier.propertyOrCollectionIdentifier(SomeDomainObject.class, "references");
-        
-        final CollectionDomainEvent<SomeDomainObject, SomeReferencedObject> ev = new InteractionHelper(null).newCollectionDomainEvent(
-                SomeDomainObjectCollectionEvent.class, AbstractDomainEvent.Phase.EXECUTED, identifier, sdo, CollectionDomainEvent.Of.ADD_TO, other);
-        assertThat(ev.getSource(), is(sdo));
-        assertThat(ev.getIdentifier(), is(identifier));
-        assertThat(ev.getOf(), is(CollectionDomainEvent.Of.ADD_TO));
-        assertThat(ev.getValue(), is(other));
-    }
-    
-}

http://git-wip-us.apache.org/repos/asf/isis/blob/18d470c3/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/InteractionHelper_newCollectionInteractionEvent_forRemove.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/InteractionHelper_newCollectionInteractionEvent_forRemove.java b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/InteractionHelper_newCollectionInteractionEvent_forRemove.java
deleted file mode 100644
index 16a7c8b..0000000
--- a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/InteractionHelper_newCollectionInteractionEvent_forRemove.java
+++ /dev/null
@@ -1,85 +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;
-
-import java.util.Set;
-import org.junit.Test;
-import org.apache.isis.applib.Identifier;
-import org.apache.isis.applib.services.eventbus.AbstractDomainEvent;
-import org.apache.isis.applib.services.eventbus.CollectionDomainEvent;
-import org.apache.isis.applib.services.eventbus.CollectionRemovedFromEvent;
-
-import static org.hamcrest.CoreMatchers.is;
-import static org.junit.Assert.assertThat;
-
-public class InteractionHelper_newCollectionInteractionEvent_forRemove {
-
-    public static class SomeDomainObject {
-        public Set<SomeReferencedObject> getReferences() { return null; }
-    }
-    public static class SomeReferencedObject {}
-    
-    public static class SomeDomainObjectCollectionRemovedFromEvent extends CollectionDomainEvent<SomeDomainObject, SomeReferencedObject> {
-        private static final long serialVersionUID = 1L;
-        public SomeDomainObjectCollectionRemovedFromEvent(SomeDomainObject source, Identifier identifier, Of of, SomeReferencedObject value) {
-            super(source, identifier, of, value);
-        }
-    }
-    
-    @Test
-    public void defaultEventType() throws Exception {
-        SomeDomainObject sdo = new SomeDomainObject();
-        SomeReferencedObject other = new SomeReferencedObject();
-        Identifier identifier = Identifier.propertyOrCollectionIdentifier(SomeDomainObject.class, "references");
-
-        final CollectionDomainEvent<Object, Object> ev = new InteractionHelper(null).newCollectionDomainEvent(
-                CollectionRemovedFromEvent.Default.class, AbstractDomainEvent.Phase.EXECUTED, identifier, sdo, CollectionDomainEvent.Of.REMOVE_FROM, other);
-        assertThat(ev.getSource(), is((Object)sdo));
-        assertThat(ev.getIdentifier(), is(identifier));
-        assertThat(ev.getOf(), is(CollectionDomainEvent.Of.REMOVE_FROM));
-        assertThat(ev.getValue(), is((Object)other));
-    }
-
-    @Test
-    public void collectionRemovedFromDefaultEventType() throws Exception {
-        SomeDomainObject sdo = new SomeDomainObject();
-        SomeReferencedObject other = new SomeReferencedObject();
-        Identifier identifier = Identifier.propertyOrCollectionIdentifier(SomeDomainObject.class, "references");
-
-        final CollectionDomainEvent<Object, Object> ev = new InteractionHelper(null).newCollectionDomainEvent(
-                CollectionRemovedFromEvent.Default.class, AbstractDomainEvent.Phase.EXECUTED, identifier, sdo, CollectionDomainEvent.Of.REMOVE_FROM, other);
-        assertThat(ev.getSource(), is((Object)sdo));
-        assertThat(ev.getIdentifier(), is(identifier));
-        assertThat(ev.getOf(), is(CollectionDomainEvent.Of.REMOVE_FROM));
-        assertThat(ev.getValue(), is((Object)other));
-    }
-
-    @Test
-    public void customEventType() throws Exception {
-        SomeDomainObject sdo = new SomeDomainObject();
-        SomeReferencedObject other = new SomeReferencedObject();
-        Identifier identifier = Identifier.propertyOrCollectionIdentifier(SomeDomainObject.class, "references");
-
-        final CollectionDomainEvent<SomeDomainObject, SomeReferencedObject> ev = new InteractionHelper(null).newCollectionDomainEvent(
-                SomeDomainObjectCollectionRemovedFromEvent.class, AbstractDomainEvent.Phase.EXECUTED, identifier, sdo, CollectionDomainEvent.Of.REMOVE_FROM, other);
-        assertThat(ev.getSource(), is(sdo));
-        assertThat(ev.getIdentifier(), is(identifier));
-        assertThat(ev.getOf(), is(CollectionDomainEvent.Of.REMOVE_FROM));
-        assertThat(ev.getValue(), is(other));
-    }
-    
-}

http://git-wip-us.apache.org/repos/asf/isis/blob/18d470c3/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/InteractionHelper_newPropertyInteractionEvent_forClear.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/InteractionHelper_newPropertyInteractionEvent_forClear.java b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/InteractionHelper_newPropertyInteractionEvent_forClear.java
deleted file mode 100644
index a087c4f..0000000
--- a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/InteractionHelper_newPropertyInteractionEvent_forClear.java
+++ /dev/null
@@ -1,72 +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;
-
-import org.joda.time.LocalDate;
-import org.junit.Test;
-import org.apache.isis.applib.Identifier;
-import org.apache.isis.applib.services.eventbus.PropertyDomainEvent;
-
-import static org.hamcrest.CoreMatchers.is;
-import static org.hamcrest.CoreMatchers.nullValue;
-import static org.junit.Assert.assertThat;
-
-public class InteractionHelper_newPropertyInteractionEvent_forClear {
-
-    public static class SomeDomainObject {}
-    
-    public static class SomeDatePropertyChangedEvent extends PropertyDomainEvent<SomeDomainObject, LocalDate> {
-        private static final long serialVersionUID = 1L;
-        public SomeDatePropertyChangedEvent(SomeDomainObject source, Identifier identifier, LocalDate oldValue, LocalDate newValue) {
-            super(source, identifier, oldValue, newValue);
-        }
-    }
-
-    @Test
-    public void defaultEventType() throws Exception {
-        
-        SomeDomainObject sdo = new SomeDomainObject();
-        Identifier identifier = Identifier.propertyOrCollectionIdentifier(SomeDomainObject.class, "someDateProperty");
-        LocalDate oldValue = new LocalDate(2013,4,1);
-        LocalDate newValue = null;
-        
-        final PropertyDomainEvent<Object, Object> ev =
-                new InteractionHelper(null).newPropertyDomainEvent(PropertyDomainEvent.Default.class, identifier, sdo, oldValue, newValue);
-        assertThat(ev.getSource(), is((Object)sdo));
-        assertThat(ev.getIdentifier(), is(identifier));
-        assertThat(ev.getOldValue(), is((Object)oldValue));
-        assertThat(ev.getNewValue(), is((Object)newValue));
-    }
-
-
-    @Test
-    public void customEventType() throws Exception {
-
-        SomeDomainObject sdo = new SomeDomainObject();
-        Identifier identifier = Identifier.propertyOrCollectionIdentifier(SomeDomainObject.class, "someDateProperty");
-        LocalDate oldValue = new LocalDate(2013,4,1);
-        LocalDate newValue = null;
-        
-        final PropertyDomainEvent<SomeDomainObject, LocalDate> ev =
-                new InteractionHelper(null).newPropertyDomainEvent(SomeDatePropertyChangedEvent.class, identifier, sdo, oldValue, newValue);
-        assertThat(ev.getSource(), is(sdo));
-        assertThat(ev.getIdentifier(), is(identifier));
-        assertThat(ev.getOldValue(), is(oldValue));
-        assertThat(ev.getNewValue(), is(nullValue()));
-    }
-    
-}

http://git-wip-us.apache.org/repos/asf/isis/blob/18d470c3/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/InteractionHelper_newPropertyInteractionEvent_forModify.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/InteractionHelper_newPropertyInteractionEvent_forModify.java b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/InteractionHelper_newPropertyInteractionEvent_forModify.java
deleted file mode 100644
index 8defaf1..0000000
--- a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/InteractionHelper_newPropertyInteractionEvent_forModify.java
+++ /dev/null
@@ -1,71 +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;
-
-import org.joda.time.LocalDate;
-import org.junit.Test;
-import org.apache.isis.applib.Identifier;
-import org.apache.isis.applib.services.eventbus.PropertyDomainEvent;
-
-import static org.hamcrest.CoreMatchers.is;
-import static org.junit.Assert.assertThat;
-
-public class InteractionHelper_newPropertyInteractionEvent_forModify {
-
-    public static class SomeDomainObject {}
-    
-    public static class SomeDatePropertyChangedEvent extends PropertyDomainEvent<SomeDomainObject, LocalDate> {
-        private static final long serialVersionUID = 1L;
-        public SomeDatePropertyChangedEvent(SomeDomainObject source, Identifier identifier, LocalDate oldValue, LocalDate newValue) {
-            super(source, identifier, oldValue, newValue);
-        }
-    }
-
-    @Test
-    public void defaultEventType() throws Exception {
-        
-        SomeDomainObject sdo = new SomeDomainObject();
-        Identifier identifier = Identifier.propertyOrCollectionIdentifier(SomeDomainObject.class, "someDateProperty");
-        LocalDate oldValue = new LocalDate(2013,4,1);
-        LocalDate newValue = new LocalDate(2013,5,2);
-        
-        final PropertyDomainEvent<Object, Object> ev =
-                new InteractionHelper(null).newPropertyDomainEvent(PropertyDomainEvent.Default.class, identifier, sdo, oldValue, newValue);
-        assertThat(ev.getSource(), is((Object)sdo));
-        assertThat(ev.getIdentifier(), is(identifier));
-        assertThat(ev.getOldValue(), is((Object)oldValue));
-        assertThat(ev.getNewValue(), is((Object)newValue));
-    }
-
-
-    @Test
-    public void customEventType() throws Exception {
-
-        SomeDomainObject sdo = new SomeDomainObject();
-        Identifier identifier = Identifier.propertyOrCollectionIdentifier(SomeDomainObject.class, "someDateProperty");
-        LocalDate oldValue = new LocalDate(2013,4,1);
-        LocalDate newValue = new LocalDate(2013,5,2);
-        
-        final PropertyDomainEvent<SomeDomainObject, LocalDate> ev =
-                new InteractionHelper(null).newPropertyDomainEvent(SomeDatePropertyChangedEvent.class, identifier, sdo, oldValue, newValue);
-        assertThat(ev.getSource(), is(sdo));
-        assertThat(ev.getIdentifier(), is(identifier));
-        assertThat(ev.getOldValue(), is(oldValue));
-        assertThat(ev.getNewValue(), is(newValue));
-    }
-    
-}

http://git-wip-us.apache.org/repos/asf/isis/blob/18d470c3/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/actions/ActionMethodsFacetFactoryTest.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/actions/ActionMethodsFacetFactoryTest.java b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/actions/ActionMethodsFacetFactoryTest.java
index 858d888..29c26e6 100644
--- a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/actions/ActionMethodsFacetFactoryTest.java
+++ b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/actions/ActionMethodsFacetFactoryTest.java
@@ -42,7 +42,6 @@ import org.apache.isis.core.metamodel.facets.actions.validate.method.ActionValid
 import org.apache.isis.core.metamodel.facets.actions.validate.method.ActionValidationFacetViaMethodFactory;
 import org.apache.isis.core.metamodel.facets.all.describedas.DescribedAsFacet;
 import org.apache.isis.core.metamodel.facets.all.describedas.DescribedAsFacetAbstract;
-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.all.named.NamedFacetAbstract;
 import org.apache.isis.core.metamodel.facets.members.describedas.staticmethod.DescribedAsFacetStaticMethodFactory;
@@ -52,10 +51,10 @@ import org.apache.isis.core.metamodel.facets.members.disabled.forsession.Disable
 import org.apache.isis.core.metamodel.facets.members.disabled.forsession.DisableForSessionFacetViaMethod;
 import org.apache.isis.core.metamodel.facets.members.disabled.forsession.DisableForSessionFacetViaMethodFactory;
 import org.apache.isis.core.metamodel.facets.members.disabled.staticmethod.DisabledFacetStaticMethodFacetFactory;
-import org.apache.isis.core.metamodel.facets.members.hidden.HiddenFacetAbstract;
 import org.apache.isis.core.metamodel.facets.members.hidden.forsession.HideForSessionFacet;
 import org.apache.isis.core.metamodel.facets.members.hidden.forsession.HideForSessionFacetViaMethod;
 import org.apache.isis.core.metamodel.facets.members.hidden.forsession.HideForSessionFacetViaMethodFactory;
+import org.apache.isis.core.metamodel.facets.members.hidden.staticmethod.HiddenFacetOnStaticMethod;
 import org.apache.isis.core.metamodel.facets.members.hidden.staticmethod.HiddenFacetStaticMethodFactory;
 import org.apache.isis.core.metamodel.facets.members.named.staticmethod.NamedFacetStaticMethodFactory;
 import org.apache.isis.core.metamodel.facets.param.autocomplete.ActionParameterAutoCompleteFacet;
@@ -441,11 +440,9 @@ public class ActionMethodsFacetFactoryTest extends AbstractFacetFactoryTest {
 
         facetFactory.process(new ProcessMethodContext(CustomerStatic.class, null, null, actionMethod, methodRemover, facetedMethod));
 
-        final Facet facet = facetedMethod.getFacet(HiddenFacet.class);
+        final HiddenFacetOnStaticMethod facet = facetedMethod.getFacet(HiddenFacetOnStaticMethod.class);
         assertNotNull(facet);
-        assertTrue(facet instanceof HiddenFacetAbstract);
-        final HiddenFacetAbstract hiddenFacetAbstract = (HiddenFacetAbstract) facet;
-        assertEquals(When.ALWAYS, hiddenFacetAbstract.when());
+        assertEquals(When.ALWAYS, facet.when());
 
         assertTrue(methodRemover.getRemovedMethodMethodCalls().contains(alwaysHideMethod));
     }
@@ -460,7 +457,7 @@ public class ActionMethodsFacetFactoryTest extends AbstractFacetFactoryTest {
 
         facetFactory.process(new ProcessMethodContext(CustomerStatic.class, null, null, actionMethod, methodRemover, facetedMethod));
 
-        assertNull(facetedMethod.getFacet(HiddenFacet.class));
+        assertNull(facetedMethod.getFacet(HiddenFacetOnStaticMethod.class));
 
         assertTrue(methodRemover.getRemovedMethodMethodCalls().contains(alwaysHideMethod));
     }

http://git-wip-us.apache.org/repos/asf/isis/blob/18d470c3/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/actions/action/ActionAnnotationFacetFactoryTest.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/actions/action/ActionAnnotationFacetFactoryTest.java b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/actions/action/ActionAnnotationFacetFactoryTest.java
index abe3955..499e9f2 100644
--- a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/actions/action/ActionAnnotationFacetFactoryTest.java
+++ b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/actions/action/ActionAnnotationFacetFactoryTest.java
@@ -20,6 +20,7 @@
 package org.apache.isis.core.metamodel.facets.actions.action;
 
 import java.lang.reflect.Method;
+import java.util.List;
 import java.util.UUID;
 import org.jmock.Expectations;
 import org.jmock.auto.Mock;
@@ -30,15 +31,32 @@ import org.junit.Test;
 import org.apache.isis.applib.Identifier;
 import org.apache.isis.applib.annotation.Action;
 import org.apache.isis.applib.annotation.ActionInteraction;
+import org.apache.isis.applib.annotation.ActionSemantics;
 import org.apache.isis.applib.annotation.ActionSemantics.Of;
+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.applib.annotation.Idempotent;
+import org.apache.isis.applib.annotation.InvokeOn;
 import org.apache.isis.applib.annotation.PostsActionInvokedEvent;
+import org.apache.isis.applib.annotation.PublishedAction;
+import org.apache.isis.applib.annotation.PublishingPayloadFactoryForAction;
+import org.apache.isis.applib.annotation.QueryOnly;
+import org.apache.isis.applib.annotation.SemanticsOf;
+import org.apache.isis.applib.annotation.Where;
 import org.apache.isis.applib.services.HasTransactionId;
 import org.apache.isis.applib.services.eventbus.ActionDomainEvent;
 import org.apache.isis.applib.services.eventbus.ActionInteractionEvent;
 import org.apache.isis.applib.services.eventbus.ActionInvokedEvent;
+import org.apache.isis.applib.services.publish.EventPayload;
 import org.apache.isis.core.metamodel.facetapi.Facet;
 import org.apache.isis.core.metamodel.facets.AbstractFacetFactoryJUnit4TestCase;
 import org.apache.isis.core.metamodel.facets.FacetFactory.ProcessMethodContext;
+import org.apache.isis.core.metamodel.facets.actions.action.command.CommandFacetForActionAnnotation;
+import org.apache.isis.core.metamodel.facets.actions.action.command.CommandFacetForActionAnnotationAsConfigured;
+import org.apache.isis.core.metamodel.facets.actions.action.command.CommandFacetForCommandAnnotation;
+import org.apache.isis.core.metamodel.facets.actions.action.command.CommandFacetFromConfiguration;
+import org.apache.isis.core.metamodel.facets.actions.action.hidden.HiddenFacetForActionAnnotation;
 import org.apache.isis.core.metamodel.facets.actions.action.invocation.ActionDomainEventFacet;
 import org.apache.isis.core.metamodel.facets.actions.action.invocation.ActionDomainEventFacetDefault;
 import org.apache.isis.core.metamodel.facets.actions.action.invocation.ActionDomainEventFacetForActionAnnotation;
@@ -48,12 +66,25 @@ import org.apache.isis.core.metamodel.facets.actions.action.invocation.ActionInv
 import org.apache.isis.core.metamodel.facets.actions.action.invocation.ActionInvocationFacetForDomainEventFromActionInteractionAnnotation;
 import org.apache.isis.core.metamodel.facets.actions.action.invocation.ActionInvocationFacetForDomainEventFromDefault;
 import org.apache.isis.core.metamodel.facets.actions.action.invocation.ActionInvocationFacetForPostsActionInvokedEventAnnotation;
+import org.apache.isis.core.metamodel.facets.actions.action.publishing.PublishedActionFacetForActionAnnotation;
+import org.apache.isis.core.metamodel.facets.actions.action.publishing.PublishedActionFacetForPublishedActionAnnotation;
+import org.apache.isis.core.metamodel.facets.actions.action.publishing.PublishedActionFacetFromConfiguration;
+import org.apache.isis.core.metamodel.facets.actions.bulk.BulkFacet;
 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.prototype.PrototypeFacet;
+import org.apache.isis.core.metamodel.facets.actions.publish.PublishedActionFacet;
+import org.apache.isis.core.metamodel.facets.actions.publish.PublishedActionFacetAbstract;
+import org.apache.isis.core.metamodel.facets.actions.semantics.ActionSemanticsFacet;
 import org.apache.isis.core.metamodel.facets.actions.semantics.ActionSemanticsFacetAbstract;
+import org.apache.isis.core.metamodel.facets.all.hide.HiddenFacet;
 import org.apache.isis.core.metamodel.spec.ObjectSpecification;
 
+import static org.hamcrest.CoreMatchers.instanceOf;
+import static org.hamcrest.CoreMatchers.is;
+import static org.hamcrest.CoreMatchers.nullValue;
 import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertNull;
+import static org.junit.Assert.assertThat;
 import static org.junit.Assert.assertTrue;
 
 public class ActionAnnotationFacetFactoryTest extends AbstractFacetFactoryJUnit4TestCase {
@@ -262,101 +293,1052 @@ public class ActionAnnotationFacetFactoryTest extends AbstractFacetFactoryJUnit4
         }
     }
 
+    public static class Hidden extends ActionAnnotationFacetFactoryTest {
+
+        @Test
+        public void withAnnotation() {
+
+            class Customer {
+                @Action(hidden = Where.REFERENCES_PARENT)
+                public void someAction() {
+                }
+            }
+
+            // given
+            final Class<?> cls = Customer.class;
+            actionMethod = findMethod(cls, "someAction");
+
+            // when
+            final ProcessMethodContext processMethodContext = new ProcessMethodContext(cls, null, null, actionMethod, mockMethodRemover, facetedMethod);
+            facetFactory.processHidden(processMethodContext);
+
+            // then
+            final HiddenFacet hiddenFacet = facetedMethod.getFacet(HiddenFacet.class);
+            Assert.assertNotNull(hiddenFacet);
+            assertThat(hiddenFacet.where(), is(Where.REFERENCES_PARENT));
+
+            final Facet hiddenFacetImpl = facetedMethod.getFacet(HiddenFacetForActionAnnotation.class);
+            Assert.assertNotNull(hiddenFacetImpl);
+            Assert.assertTrue(hiddenFacet == hiddenFacetImpl);
+        }
+
+    }
+
+    public static class RestrictTo extends ActionAnnotationFacetFactoryTest {
+
+        @Test
+        public void whenRestrictedToPrototyping() {
+
+            class Customer {
+                @Action(restrictTo = org.apache.isis.applib.annotation.RestrictTo.PROTOTYPING)
+                public void someAction() {
+                }
+            }
+
+            // given
+            final Class<?> cls = Customer.class;
+            actionMethod = findMethod(cls, "someAction");
+
+            // when
+            final ProcessMethodContext processMethodContext = new ProcessMethodContext(cls, null, null, actionMethod, mockMethodRemover, facetedMethod);
+            facetFactory.processRestrictTo(processMethodContext);
+
+            // then
+            final PrototypeFacet facet = facetedMethod.getFacet(PrototypeFacet.class);
+            Assert.assertNotNull(facet);
+        }
+
+        @Test
+        public void whenRestrictedToNoRestriction() {
+
+            class Customer {
+                @Action(restrictTo = org.apache.isis.applib.annotation.RestrictTo.NO_RESTRICTIONS)
+                public void someAction() {
+                }
+            }
+
+            // given
+            final Class<?> cls = Customer.class;
+            actionMethod = findMethod(cls, "someAction");
+
+            // when
+            final ProcessMethodContext processMethodContext = new ProcessMethodContext(cls, null, null, actionMethod, mockMethodRemover, facetedMethod);
+            facetFactory.processRestrictTo(processMethodContext);
+
+            // then
+            final PrototypeFacet facet = facetedMethod.getFacet(PrototypeFacet.class);
+            assertNull(facet);
+        }
+
+        @Test
+        public void whenNotPresent() {
+
+            class Customer {
+                public void someAction() {
+                }
+            }
+
+            // given
+            final Class<?> cls = Customer.class;
+            actionMethod = findMethod(cls, "someAction");
+
+            // when
+            final ProcessMethodContext processMethodContext = new ProcessMethodContext(cls, null, null, actionMethod, mockMethodRemover, facetedMethod);
+            facetFactory.processRestrictTo(processMethodContext);
+
+            // then
+            final PrototypeFacet facet = facetedMethod.getFacet(PrototypeFacet.class);
+            assertNull(facet);
+        }
+
+    }
+
+    public static class Semantics extends ActionAnnotationFacetFactoryTest {
+
+        @Test
+        public void whenDeprecatedQueryOnly() {
+
+            class Customer {
+                @QueryOnly
+                public void someAction() {
+                }
+            }
+
+            // given
+            final Class<?> cls = Customer.class;
+            actionMethod = findMethod(cls, "someAction");
+
+            // when
+            final ProcessMethodContext processMethodContext = new ProcessMethodContext(cls, null, null, actionMethod, mockMethodRemover, facetedMethod);
+            facetFactory.processSemantics(processMethodContext);
+
+            // then
+            final ActionSemanticsFacet facet = facetedMethod.getFacet(ActionSemanticsFacet.class);
+            Assert.assertNotNull(facet);
+            assertThat(facet.value(), is(Of.SAFE));
+        }
+
+        @Test
+        public void whenDeprecatedIdempotent() {
+
+            class Customer {
+                @Idempotent
+                public void someAction() {
+                }
+            }
+
+            // given
+            final Class<?> cls = Customer.class;
+            actionMethod = findMethod(cls, "someAction");
+
+            // when
+            final ProcessMethodContext processMethodContext = new ProcessMethodContext(cls, null, null, actionMethod, mockMethodRemover, facetedMethod);
+            facetFactory.processSemantics(processMethodContext);
+
+            // then
+            final ActionSemanticsFacet facet = facetedMethod.getFacet(ActionSemanticsFacet.class);
+            Assert.assertNotNull(facet);
+            assertThat(facet.value(), is(Of.IDEMPOTENT));
+        }
+
+        @Test
+        public void whenDeprecatedAnnotationSafe() {
+
+            class Customer {
+                @ActionSemantics(Of.SAFE)
+                public void someAction() {
+                }
+            }
+
+            // given
+            final Class<?> cls = Customer.class;
+            actionMethod = findMethod(cls, "someAction");
+
+            // when
+            final ProcessMethodContext processMethodContext = new ProcessMethodContext(cls, null, null, actionMethod, mockMethodRemover, facetedMethod);
+            facetFactory.processSemantics(processMethodContext);
+
+            // then
+            final ActionSemanticsFacet facet = facetedMethod.getFacet(ActionSemanticsFacet.class);
+            Assert.assertNotNull(facet);
+            assertThat(facet.value(), is(Of.SAFE));
+        }
+
+        @Test
+        public void whenSafe() {
+
+            class Customer {
+                @Action(semantics = SemanticsOf.SAFE)
+                public void someAction() {
+                }
+            }
+
+            // given
+            final Class<?> cls = Customer.class;
+            actionMethod = findMethod(cls, "someAction");
+
+            // when
+            final ProcessMethodContext processMethodContext = new ProcessMethodContext(cls, null, null, actionMethod, mockMethodRemover, facetedMethod);
+            facetFactory.processSemantics(processMethodContext);
+
+            // then
+            final ActionSemanticsFacet facet = facetedMethod.getFacet(ActionSemanticsFacet.class);
+            Assert.assertNotNull(facet);
+            assertThat(facet.value(), is(Of.SAFE));
+        }
+
+        @Test
+        public void whenNotSpecified() {
+
+            class Customer {
+                @Action()
+                public void someAction() {
+                }
+            }
+
+            // given
+            final Class<?> cls = Customer.class;
+            actionMethod = findMethod(cls, "someAction");
+
+            // when
+            final ProcessMethodContext processMethodContext = new ProcessMethodContext(cls, null, null, actionMethod, mockMethodRemover, facetedMethod);
+            facetFactory.processSemantics(processMethodContext);
+
+            // then
+            final ActionSemanticsFacet facet = facetedMethod.getFacet(ActionSemanticsFacet.class);
+            Assert.assertNotNull(facet);
+            assertThat(facet.value(), is(Of.NON_IDEMPOTENT));
+        }
+
+        @Test
+        public void whenNoAnnotation() {
+
+            class Customer {
+                public void someAction() {
+                }
+            }
+
+            // given
+            final Class<?> cls = Customer.class;
+            actionMethod = findMethod(cls, "someAction");
+
+            // when
+            final ProcessMethodContext processMethodContext = new ProcessMethodContext(cls, null, null, actionMethod, mockMethodRemover, facetedMethod);
+            facetFactory.processSemantics(processMethodContext);
+
+            // then
+            final ActionSemanticsFacet facet = facetedMethod.getFacet(ActionSemanticsFacet.class);
+            Assert.assertNotNull(facet);
+            assertThat(facet.value(), is(Of.NON_IDEMPOTENT));
+        }
+
+
+        @Test
+        public void whenDeprecatedActionSemanticsAndAction() {
+
+            class Customer {
+                @ActionSemantics(Of.SAFE)
+                @Action(semantics = SemanticsOf.IDEMPOTENT)
+                public void someAction() {
+                }
+            }
+
+            // given
+            final Class<?> cls = Customer.class;
+            actionMethod = findMethod(cls, "someAction");
+
+            // when
+            final ProcessMethodContext processMethodContext = new ProcessMethodContext(cls, null, null, actionMethod, mockMethodRemover, facetedMethod);
+            facetFactory.processSemantics(processMethodContext);
+
+            // then
+            final ActionSemanticsFacet facet = facetedMethod.getFacet(ActionSemanticsFacet.class);
+            Assert.assertNotNull(facet);
+            assertThat(facet.value(), is(Of.SAFE));
+        }
+
+        @Test
+        public void whenDeprecatedQueryOnlyAndDeprecatedActionSemantics() {
+
+            class Customer {
+                @QueryOnly
+                @ActionSemantics(Of.IDEMPOTENT)
+                public void someAction() {
+                }
+            }
+
+            // given
+            final Class<?> cls = Customer.class;
+            actionMethod = findMethod(cls, "someAction");
+
+            // when
+            final ProcessMethodContext processMethodContext = new ProcessMethodContext(cls, null, null, actionMethod, mockMethodRemover, facetedMethod);
+            facetFactory.processSemantics(processMethodContext);
+
+            // then
+            final ActionSemanticsFacet facet = facetedMethod.getFacet(ActionSemanticsFacet.class);
+            Assert.assertNotNull(facet);
+            assertThat(facet.value(), is(Of.SAFE));
+        }
+
+        @Test
+        public void whenDeprecatedIdempotentAndDeprecatedActionSemantics() {
+
+            class Customer {
+                @Idempotent
+                @ActionSemantics(Of.SAFE)
+                public void someAction() {
+                }
+            }
+
+            // given
+            final Class<?> cls = Customer.class;
+            actionMethod = findMethod(cls, "someAction");
+
+            // when
+            final ProcessMethodContext processMethodContext = new ProcessMethodContext(cls, null, null, actionMethod, mockMethodRemover, facetedMethod);
+            facetFactory.processSemantics(processMethodContext);
+
+            // then
+            final ActionSemanticsFacet facet = facetedMethod.getFacet(ActionSemanticsFacet.class);
+            Assert.assertNotNull(facet);
+            assertThat(facet.value(), is(Of.IDEMPOTENT));
+        }
+
+
+    }
+
+    public static class Bulk extends ActionAnnotationFacetFactoryTest {
+
+        @Test
+        public void whenDeprecatedBulkAnnotation() {
+
+            class Customer {
+                @org.apache.isis.applib.annotation.Bulk()
+                public void someAction() {
+                }
+            }
+
+            // given
+            final Class<?> cls = Customer.class;
+            actionMethod = findMethod(cls, "someAction");
+
+            // when
+            final ProcessMethodContext processMethodContext = new ProcessMethodContext(cls, null, null, actionMethod, mockMethodRemover, facetedMethod);
+            facetFactory.processInvokeOn(processMethodContext);
+
+            // then
+            final BulkFacet facet = facetedMethod.getFacet(BulkFacet.class);
+            Assert.assertNotNull(facet);
+            assertThat(facet.value(), is(org.apache.isis.applib.annotation.Bulk.AppliesTo.BULK_AND_REGULAR));
+
+        }
+
+        @Test
+        public void whenDeprecatedBulkAnnotationAppliesToBulkOnly() {
+
+            class Customer {
+                @org.apache.isis.applib.annotation.Bulk(org.apache.isis.applib.annotation.Bulk.AppliesTo.BULK_ONLY)
+                public void someAction() {
+                }
+            }
+
+            // given
+            final Class<?> cls = Customer.class;
+            actionMethod = findMethod(cls, "someAction");
+
+            // when
+            final ProcessMethodContext processMethodContext = new ProcessMethodContext(cls, null, null, actionMethod, mockMethodRemover, facetedMethod);
+            facetFactory.processInvokeOn(processMethodContext);
+
+            // then
+            final BulkFacet facet = facetedMethod.getFacet(BulkFacet.class);
+            Assert.assertNotNull(facet);
+            assertThat(facet.value(), is(org.apache.isis.applib.annotation.Bulk.AppliesTo.BULK_ONLY));
+        }
+
+        @Test
+        public void whenObjectOnly() {
+
+            class Customer {
+                @Action(invokeOn = InvokeOn.OBJECT_ONLY)
+                public void someAction() {
+                }
+            }
+
+            // given
+            final Class<?> cls = Customer.class;
+            actionMethod = findMethod(cls, "someAction");
+
+            // when
+            final ProcessMethodContext processMethodContext = new ProcessMethodContext(cls, null, null, actionMethod, mockMethodRemover, facetedMethod);
+            facetFactory.processInvokeOn(processMethodContext);
+
+            // then
+            final BulkFacet facet = facetedMethod.getFacet(BulkFacet.class);
+            assertNull(facet);
+
+        }
+
+        @Test
+        public void whenCollectionOnly() {
+
+            class Customer {
+                @Action(invokeOn = InvokeOn.COLLECTION_ONLY)
+                public void someAction() {
+                }
+            }
+
+            // given
+            final Class<?> cls = Customer.class;
+            actionMethod = findMethod(cls, "someAction");
+
+            // when
+            final ProcessMethodContext processMethodContext = new ProcessMethodContext(cls, null, null, actionMethod, mockMethodRemover, facetedMethod);
+            facetFactory.processInvokeOn(processMethodContext);
+
+            // then
+            final BulkFacet facet = facetedMethod.getFacet(BulkFacet.class);
+            Assert.assertNotNull(facet);
+            assertThat(facet.value(), is(org.apache.isis.applib.annotation.Bulk.AppliesTo.BULK_ONLY));
+
+        }
+
+        @Test
+        public void whenObjectAndCollection() {
+
+            class Customer {
+                @Action(invokeOn = InvokeOn.OBJECT_AND_COLLECTION)
+                public void someAction() {
+                }
+            }
+
+            // given
+            final Class<?> cls = Customer.class;
+            actionMethod = findMethod(cls, "someAction");
+
+            // when
+            final ProcessMethodContext processMethodContext = new ProcessMethodContext(cls, null, null, actionMethod, mockMethodRemover, facetedMethod);
+            facetFactory.processInvokeOn(processMethodContext);
+
+            // then
+            final BulkFacet facet = facetedMethod.getFacet(BulkFacet.class);
+            Assert.assertNotNull(facet);
+            assertThat(facet.value(), is(org.apache.isis.applib.annotation.Bulk.AppliesTo.BULK_AND_REGULAR));
+
+        }
+
+    }
+
     public static class Command extends ActionAnnotationFacetFactoryTest {
 
         @Test
-        public void ignoreHasTransactionId() {
-            final Of actionSemantics = Of.SAFE;
+        public void givenHasTransactionId_thenIgnored() {
+            // given
+            final Method actionMethod = findMethod(SomeTransactionalId.class, "someAction");
+
+            // when
+            facetFactory.processCommand(new ProcessMethodContext(SomeTransactionalId.class, null, null, actionMethod, mockMethodRemover, facetedMethod));
+
+            // then
+            final Facet facet = facetedMethod.getFacet(CommandFacet.class);
+            assertNull(facet);
+
+        }
+
+        @Test
+        public void givenDeprecatedAnnotation() {
+            // given
+            class Customer {
+                @org.apache.isis.applib.annotation.Command(
+                        executeIn = org.apache.isis.applib.annotation.Command.ExecuteIn.BACKGROUND,
+                        persistence = org.apache.isis.applib.annotation.Command.Persistence.IF_HINTED
+                )
+                public void someAction() {
+                }
+            }
+            final Method actionMethod = findMethod(Customer.class, "someAction");
+
+            // when
+            facetFactory.processCommand(new ProcessMethodContext(Customer.class, null, null, actionMethod, mockMethodRemover, facetedMethod));
+
+            // then
+            final Facet facet = facetedMethod.getFacet(CommandFacet.class);
+            assertNotNull(facet);
+            assertTrue(facet instanceof CommandFacetForCommandAnnotation);
+            final CommandFacetForCommandAnnotation facetImpl = (CommandFacetForCommandAnnotation) facet;
+
+            assertThat(facetImpl.persistence(), is(org.apache.isis.applib.annotation.Command.Persistence.IF_HINTED));
+
+            expectNoMethodsRemoved();
+        }
+
+        @Test
+        public void given_noAnnotation_and_configurationSetToIgnoreQueryOnly_andSafeSemantics_thenNone() {
+
+            // given
+            allowingCommandConfigurationToReturn("ignoreQueryOnly");
+            final Method actionMethod = findMethod(Customer.class, "someAction");
+
+            facetedMethod.addFacet(new ActionSemanticsFacetAbstract(Of.SAFE, facetedMethod) {});
+
+            // when
+            facetFactory.processCommand(new ProcessMethodContext(Customer.class, null, null, actionMethod, mockMethodRemover, facetedMethod));
+
+            // then
+            final Facet facet = facetedMethod.getFacet(CommandFacet.class);
+            assertNull(facet);
+        }
+
+        @Test
+        public void given_noAnnotation_and_configurationSetToIgnoreQueryOnly_andNonSafeSemantics_thenAdded() {
+
+            // given
+            allowingCommandConfigurationToReturn("ignoreQueryOnly");
+            final Method actionMethod = findMethod(Customer.class, "someAction");
+
+            facetedMethod.addFacet(new ActionSemanticsFacetAbstract(Of.IDEMPOTENT, facetedMethod) {});
+
+            // when
+            facetFactory.processCommand(new ProcessMethodContext(Customer.class, null, null, actionMethod, mockMethodRemover, facetedMethod));
+
+            // then
+            final Facet facet = facetedMethod.getFacet(CommandFacet.class);
+            assertNotNull(facet);
+            assert(facet instanceof  CommandFacetFromConfiguration);
+            final CommandFacetFromConfiguration facetImpl = (CommandFacetFromConfiguration) facet;
+            assertThat(facetImpl.persistence(), is(org.apache.isis.applib.annotation.Command.Persistence.PERSISTED));
+            assertThat(facetImpl.executeIn(), is(org.apache.isis.applib.annotation.Command.ExecuteIn.FOREGROUND));
+        }
+
+        @Test(expected=IllegalStateException.class)
+        public void given_noAnnotation_and_configurationSetToIgnoreQueryOnly_andNoSemantics_thenException() {
+
+            // given
+            allowingCommandConfigurationToReturn("ignoreQueryOnly");
+            final Method actionMethod = findMethod(Customer.class, "someAction");
+
+            // when
+            facetFactory.processCommand(new ProcessMethodContext(Customer.class, null, null, actionMethod, mockMethodRemover, facetedMethod));
+        }
+
+        @Test
+        public void given_noAnnotation_and_configurationSetToNone_thenNone() {
+
+            // given
+            allowingCommandConfigurationToReturn("none");
+            final Method actionMethod = findMethod(Customer.class, "someAction");
+
+            // when
+            facetFactory.processCommand(new ProcessMethodContext(Customer.class, null, null, actionMethod, mockMethodRemover, facetedMethod));
+
+            // then
+            final Facet facet = facetedMethod.getFacet(PublishedActionFacet.class);
+            assertNull(facet);
+        }
+
+        @Test
+        public void given_noAnnotation_and_configurationSetToAll_thenFacetAdded() {
+
+            // given
+            final Method actionMethod = findMethod(Customer.class, "someAction");
+
+            allowingCommandConfigurationToReturn("all");
+
+            // when
+            facetFactory.processCommand(new ProcessMethodContext(Customer.class, null, null, actionMethod, mockMethodRemover, facetedMethod));
+
+            // then
+            final Facet facet = facetedMethod.getFacet(CommandFacet.class);
+            assertNotNull(facet);
+            assert(facet instanceof CommandFacetFromConfiguration);
+        }
+
+        @Test
+        public void given_asConfigured_and_configurationSetToIgnoreQueryOnly_andSafeSemantics_thenNone() {
+
+            class Customer {
+                @Action(
+                        command = CommandReification.AS_CONFIGURED
+                )
+                public void someAction() {
+                }
+            }
+
+            allowingCommandConfigurationToReturn("ignoreQueryOnly");
+            final Method actionMethod = findMethod(Customer.class, "someAction");
+
+            facetedMethod.addFacet(new ActionSemanticsFacetAbstract(Of.SAFE, facetedMethod) {});
+
+            facetFactory.processCommand(new ProcessMethodContext(Customer.class, null, null, actionMethod, mockMethodRemover, facetedMethod));
+
+            final Facet facet = facetedMethod.getFacet(CommandFacet.class);
+            assertNull(facet);
+        }
+
+        @Test
+        public void given_asConfigured_and_configurationSetToIgnoreQueryOnly_andNonSafeSemantics_thenAdded() {
+
+            // given
+            class Customer {
+                @Action(
+                        command = CommandReification.AS_CONFIGURED,
+                        commandPersistence = CommandPersistence.IF_HINTED,
+                        commandExecuteIn = CommandExecuteIn.BACKGROUND
+                )
+                public void someAction() {
+                }
+            }
+
+            allowingCommandConfigurationToReturn("ignoreQueryOnly");
+            final Method actionMethod = findMethod(Customer.class, "someAction");
+
+            facetedMethod.addFacet(new ActionSemanticsFacetAbstract(Of.IDEMPOTENT, facetedMethod) {});
+
+            // when
+            facetFactory.processCommand(new ProcessMethodContext(Customer.class, null, null, actionMethod, mockMethodRemover, facetedMethod));
+
+            // then
+            final Facet facet = facetedMethod.getFacet(CommandFacet.class);
+            assertNotNull(facet);
+            final CommandFacetForActionAnnotationAsConfigured facetImpl = (CommandFacetForActionAnnotationAsConfigured) facet;
+            assertThat(facetImpl.persistence(), is(org.apache.isis.applib.annotation.Command.Persistence.IF_HINTED));
+            assertThat(facetImpl.executeIn(), is(org.apache.isis.applib.annotation.Command.ExecuteIn.BACKGROUND));
+        }
+
+        @Test(expected=IllegalStateException.class)
+        public void given_asConfigured_and_configurationSetToIgnoreQueryOnly_andNoSemantics_thenException() {
+
+            class Customer {
+                @Action(
+                        command = CommandReification.AS_CONFIGURED
+                )
+                public void someAction() {
+                }
+            }
+
+            allowingCommandConfigurationToReturn("ignoreQueryOnly");
+            final Method actionMethod = findMethod(Customer.class, "someAction");
+
+            facetFactory.processCommand(new ProcessMethodContext(Customer.class, null, null, actionMethod, mockMethodRemover, facetedMethod));
+        }
+
+        @Test
+        public void given_asConfigured_and_configurationSetToNone_thenNone() {
 
-            allowingConfigurationToReturn("all");
-            final Method actionMethod = findMethod(SomeTransactionalId.class, "someAction");
+            class Customer {
+                @Action(
+                        command = CommandReification.AS_CONFIGURED
+                )
+                public void someAction() {
+                }
+            }
 
-            facetedMethod.addFacet(new ActionSemanticsFacetAbstract(actionSemantics, facetedMethod) {});
-            facetFactory.processCommand(new ProcessMethodContext(SomeTransactionalId.class, null, null, actionMethod, mockMethodRemover, facetedMethod));
+            allowingCommandConfigurationToReturn("none");
+            final Method actionMethod = findMethod(Customer.class, "someAction");
+
+            facetFactory.processCommand(new ProcessMethodContext(Customer.class, null, null, actionMethod, mockMethodRemover, facetedMethod));
+
+            final Facet facet = facetedMethod.getFacet(CommandFacet.class);
+            assertNull(facet);
+        }
+
+        @Test
+        public void given_asConfigured_and_configurationSetToAll_thenFacetAdded() {
+
+            // given
+            class Customer {
+                @Action(
+                        command = CommandReification.AS_CONFIGURED,
+                        commandPersistence = CommandPersistence.IF_HINTED,
+                        commandExecuteIn = CommandExecuteIn.BACKGROUND
+                )
+                public void someAction() {
+                }
+            }
+            final Method actionMethod = findMethod(Customer.class, "someAction");
+
+            allowingCommandConfigurationToReturn("all");
 
+            // when
+            facetFactory.processCommand(new ProcessMethodContext(Customer.class, null, null, actionMethod, mockMethodRemover, facetedMethod));
+
+            // then
             final Facet facet = facetedMethod.getFacet(CommandFacet.class);
-            Assert.assertNull(facet);
+            assertNotNull(facet);
+            final CommandFacetForActionAnnotationAsConfigured facetImpl = (CommandFacetForActionAnnotationAsConfigured) facet;
+            assertThat(facetImpl.persistence(), is(org.apache.isis.applib.annotation.Command.Persistence.IF_HINTED));
+            assertThat(facetImpl.executeIn(), is(org.apache.isis.applib.annotation.Command.ExecuteIn.BACKGROUND));
+        }
 
-            expectNoMethodsRemoved();
+        @Test
+        public void given_enabled_irrespectiveOfConfiguration_thenFacetAdded() {
+
+            // given
+            class Customer {
+                @Action(
+                        command = CommandReification.ENABLED
+                )
+                public void someAction() {
+                }
+            }
+            final Method actionMethod = findMethod(Customer.class, "someAction");
+
+            // even though configuration is disabled
+            allowingCommandConfigurationToReturn("none");
+
+            // when
+            facetFactory.processCommand(new ProcessMethodContext(Customer.class, null, null, actionMethod, mockMethodRemover, facetedMethod));
+
+            // then
+            final Facet facet = facetedMethod.getFacet(CommandFacet.class);
+            assertNotNull(facet);
+            assertTrue(facet instanceof CommandFacetForActionAnnotation);
         }
 
         @Test
-        public void testAnnotationPickedUp() {
+        public void given_disabled_irrespectiveOfConfiguration_thenNone() {
+
+            // given
             class Customer {
-                @org.apache.isis.applib.annotation.Command
+                @Action(
+                        command = CommandReification.DISABLED
+                )
                 public void someAction() {
                 }
             }
             final Method actionMethod = findMethod(Customer.class, "someAction");
 
+            // even though configuration is disabled
+            allowingCommandConfigurationToReturn("none");
+
+            // when
             facetFactory.processCommand(new ProcessMethodContext(Customer.class, null, null, actionMethod, mockMethodRemover, facetedMethod));
 
+            // then
             final Facet facet = facetedMethod.getFacet(CommandFacet.class);
+            assertNull(facet);
+        }
+
+
+    }
+
+    public static class Publishing extends ActionAnnotationFacetFactoryTest {
+
+        public static class CustomerSomeActionPayloadFactory implements PublishedAction.PayloadFactory {
+            @Override
+            public EventPayload payloadFor(final Identifier actionIdentifier, final Object target, final List<Object> arguments, final Object result) {
+                return null;
+            }
+        }
+
+        public static class CustomerSomeActionPublishingPayloadFactory implements PublishingPayloadFactoryForAction {
+            @Override
+            public EventPayload payloadFor(final Identifier actionIdentifier, final Object target, final List<Object> arguments, final Object result) {
+                return null;
+            }
+        }
+
+        @Test
+        public void givenHasTransactionId_thenIgnored() {
+
+            final Method actionMethod = findMethod(SomeTransactionalId.class, "someAction");
+
+            facetFactory.processPublishing(new ProcessMethodContext(SomeTransactionalId.class, null, null, actionMethod, mockMethodRemover, facetedMethod));
+
+            final Facet facet = facetedMethod.getFacet(PublishedActionFacet.class);
+            assertNull(facet);
+
+            expectNoMethodsRemoved();
+        }
+
+        @Test
+        public void givenDeprecatedAnnotation() {
+
+            // given
+            class Customer {
+                @org.apache.isis.applib.annotation.PublishedAction(CustomerSomeActionPayloadFactory.class)
+                public void someAction() {
+                }
+            }
+            final Method actionMethod = findMethod(Customer.class, "someAction");
+
+            // when
+            facetFactory.processPublishing(new ProcessMethodContext(Customer.class, null, null, actionMethod, mockMethodRemover, facetedMethod));
+
+            // then
+            final Facet facet = facetedMethod.getFacet(PublishedActionFacet.class);
             assertNotNull(facet);
-            assertTrue(facet instanceof CommandFacetAbstract);
+            assertTrue(facet instanceof PublishedActionFacetForPublishedActionAnnotation);
+            final PublishedActionFacetForPublishedActionAnnotation facetImpl = (PublishedActionFacetForPublishedActionAnnotation) facet;
+            assertThat(facetImpl.value(), instanceOf(CustomerSomeActionPayloadFactory.class));
 
             expectNoMethodsRemoved();
         }
 
+        @Test
+        public void given_noAnnotation_and_configurationSetToIgnoreQueryOnly_andSafeSemantics_thenNone() {
+
+            // given
+            allowingPublishingConfigurationToReturn("ignoreQueryOnly");
+            final Method actionMethod = findMethod(Customer.class, "someAction");
+
+            facetedMethod.addFacet(new ActionSemanticsFacetAbstract(Of.SAFE, facetedMethod) {});
+
+            // when
+            facetFactory.processPublishing(new ProcessMethodContext(Customer.class, null, null, actionMethod, mockMethodRemover, facetedMethod));
+
+            // then
+            final Facet facet = facetedMethod.getFacet(PublishedActionFacet.class);
+            assertNull(facet);
+        }
+
+        @Test
+        public void given_noAnnotation_and_configurationSetToIgnoreQueryOnly_andNonSafeSemantics_thenAdded() {
+
+            // given
+            allowingPublishingConfigurationToReturn("ignoreQueryOnly");
+            final Method actionMethod = findMethod(Customer.class, "someAction");
+
+            facetedMethod.addFacet(new ActionSemanticsFacetAbstract(Of.IDEMPOTENT, facetedMethod) {});
+
+            // when
+            facetFactory.processPublishing(new ProcessMethodContext(Customer.class, null, null, actionMethod, mockMethodRemover, facetedMethod));
+
+            // then
+            final Facet facet = facetedMethod.getFacet(PublishedActionFacet.class);
+            assertNotNull(facet);
+            final PublishedActionFacetFromConfiguration facetImpl = (PublishedActionFacetFromConfiguration) facet;
+            final PublishedAction.PayloadFactory payloadFactory = facetImpl.value();
+            assertThat(payloadFactory, is(nullValue()));
+        }
+
         @Test(expected=IllegalStateException.class)
-        public void requiresActionSemantics() {
-            allowingConfigurationToReturn("safe");
+        public void given_noAnnotation_and_configurationSetToIgnoreQueryOnly_andNoSemantics_thenException() {
+
+            // given
+            allowingPublishingConfigurationToReturn("ignoreQueryOnly");
             final Method actionMethod = findMethod(Customer.class, "someAction");
 
-            facetFactory.processCommand(new ProcessMethodContext(Customer.class, null, null, actionMethod, mockMethodRemover, facetedMethod));
+            // when
+            facetFactory.processPublishing(new ProcessMethodContext(Customer.class, null, null, actionMethod, mockMethodRemover, facetedMethod));
+
         }
 
         @Test
-        public void all_with_safe() {
-            final Of actionSemantics = Of.SAFE;
+        public void given_noAnnotation_and_configurationSetToNone_thenNone() {
+
+            // given
+            allowingPublishingConfigurationToReturn("none");
+            final Method actionMethod = findMethod(Customer.class, "someAction");
 
-            allowingConfigurationToReturn("all");
+            // when
+            facetFactory.processPublishing(new ProcessMethodContext(Customer.class, null, null, actionMethod, mockMethodRemover, facetedMethod));
 
-            facetedMethod.addFacet(new ActionSemanticsFacetAbstract(actionSemantics, facetedMethod) {});
+            // then
+            final Facet facet = facetedMethod.getFacet(PublishedActionFacet.class);
+            assertNull(facet);
 
-            facetFactory.processCommand(new ProcessMethodContext(Customer.class, null, null, actionMethod, mockMethodRemover, facetedMethod));
+            expectNoMethodsRemoved();
 
-            final Facet facet = facetedMethod.getFacet(CommandFacet.class);
-            assertTrue(facet instanceof CommandFacetAbstract);
+        }
+
+        @Test
+        public void given_noAnnotation_and_configurationSetToAll_thenFacetAdded() {
+
+            // given
+            final Method actionMethod = findMethod(Customer.class, "someAction");
+
+            allowingPublishingConfigurationToReturn("all");
+
+            // when
+            facetFactory.processPublishing(new ProcessMethodContext(Customer.class, null, null, actionMethod, mockMethodRemover, facetedMethod));
+
+            // then
+            final Facet facet = facetedMethod.getFacet(PublishedActionFacet.class);
+            assertNotNull(facet);
+            assertTrue(facet instanceof PublishedActionFacetFromConfiguration);
+        }
+
+        @Test
+        public void given_asConfigured_and_configurationSetToIgnoreQueryOnly_andSafeSemantics_thenNone() {
+
+            class Customer {
+                @Action(publishing = org.apache.isis.applib.annotation.Publishing.AS_CONFIGURED)
+                public void someAction() {
+                }
+            }
+
+            allowingPublishingConfigurationToReturn("ignoreQueryOnly");
+            final Method actionMethod = findMethod(Customer.class, "someAction");
+
+            facetedMethod.addFacet(new ActionSemanticsFacetAbstract(Of.SAFE, facetedMethod) {});
+
+            facetFactory.processPublishing(new ProcessMethodContext(Customer.class, null, null, actionMethod, mockMethodRemover, facetedMethod));
+
+            final Facet facet = facetedMethod.getFacet(PublishedActionFacet.class);
+            assertNull(facet);
 
             expectNoMethodsRemoved();
         }
 
         @Test
-        public void ignoreQueryOnly_with_safe() {
-            final Of actionSemantics = Of.SAFE;
+        public void given_asConfigured_and_configurationSetToIgnoreQueryOnly_andNonSafeSemantics_thenAdded() {
+
+            // given
+            class Customer {
+                @Action(
+                        publishing = org.apache.isis.applib.annotation.Publishing.AS_CONFIGURED,
+                        publishingPayloadFactory = CustomerSomeActionPublishingPayloadFactory.class
+                )
+                public void someAction() {
+                }
+            }
 
-            allowingConfigurationToReturn("ignoreQueryOnly");
+            allowingPublishingConfigurationToReturn("ignoreQueryOnly");
+            final Method actionMethod = findMethod(Customer.class, "someAction");
 
-            facetedMethod.addFacet(new ActionSemanticsFacetAbstract(actionSemantics, facetedMethod) {});
-            facetFactory.processCommand(new ProcessMethodContext(Customer.class, null, null, actionMethod, mockMethodRemover, facetedMethod));
+            facetedMethod.addFacet(new ActionSemanticsFacetAbstract(Of.IDEMPOTENT, facetedMethod) {});
 
-            final Facet facet = facetedMethod.getFacet(CommandFacet.class);
-            Assert.assertNull(facet);
+            // when
+            facetFactory.processPublishing(new ProcessMethodContext(Customer.class, null, null, actionMethod, mockMethodRemover, facetedMethod));
+
+            // then
+            final Facet facet = facetedMethod.getFacet(PublishedActionFacet.class);
+            assertNotNull(facet);
+            final PublishedActionFacetForActionAnnotation facetImpl = (PublishedActionFacetForActionAnnotation) facet;
+            final PublishedAction.PayloadFactory payloadFactory = facetImpl.value();
+            assertThat(payloadFactory, instanceOf(PublishedActionFacetAbstract.LegacyAdapter.class));
+
+            final PublishedActionFacetAbstract.LegacyAdapter legacyAdapter = (PublishedActionFacetAbstract.LegacyAdapter) payloadFactory;
+            assertThat(legacyAdapter.getPayloadFactory(), instanceOf(CustomerSomeActionPublishingPayloadFactory.class));
+
+            expectNoMethodsRemoved();
+        }
+
+        @Test(expected=IllegalStateException.class)
+        public void given_asConfigured_and_configurationSetToIgnoreQueryOnly_andNoSemantics_thenException() {
+
+            class Customer {
+                @Action(publishing = org.apache.isis.applib.annotation.Publishing.AS_CONFIGURED)
+                public void someAction() {
+                }
+            }
+
+            allowingPublishingConfigurationToReturn("ignoreQueryOnly");
+            final Method actionMethod = findMethod(Customer.class, "someAction");
+
+            facetFactory.processPublishing(new ProcessMethodContext(Customer.class, null, null, actionMethod, mockMethodRemover, facetedMethod));
+        }
+
+        @Test
+        public void given_asConfigured_and_configurationSetToNone_thenNone() {
+
+            class Customer {
+                @Action(publishing = org.apache.isis.applib.annotation.Publishing.AS_CONFIGURED)
+                public void someAction() {
+                }
+            }
+
+            allowingPublishingConfigurationToReturn("none");
+            final Method actionMethod = findMethod(Customer.class, "someAction");
+
+            facetFactory.processPublishing(new ProcessMethodContext(Customer.class, null, null, actionMethod, mockMethodRemover, facetedMethod));
+
+            final Facet facet = facetedMethod.getFacet(PublishedActionFacet.class);
+            assertNull(facet);
 
             expectNoMethodsRemoved();
+
         }
 
         @Test
-        public void none_with_nonIdempotent() {
-            final Of actionSemantics = Of.NON_IDEMPOTENT;
+        public void given_asConfigured_and_configurationSetToAll_thenFacetAdded() {
+
+            // given
+            class Customer {
+                @Action(
+                        publishing = org.apache.isis.applib.annotation.Publishing.AS_CONFIGURED,
+                        publishingPayloadFactory = CustomerSomeActionPublishingPayloadFactory.class
+                )
+                public void someAction() {
+                }
+            }
+            final Method actionMethod = findMethod(Customer.class, "someAction");
 
-            allowingConfigurationToReturn("none");
+            allowingPublishingConfigurationToReturn("all");
 
-            facetedMethod.addFacet(new ActionSemanticsFacetAbstract(actionSemantics, facetedMethod) {});
-            facetFactory.processCommand(new ProcessMethodContext(Customer.class, null, null, actionMethod, mockMethodRemover, facetedMethod));
+            // when
+            facetFactory.processPublishing(new ProcessMethodContext(Customer.class, null, null, actionMethod, mockMethodRemover, facetedMethod));
 
-            final Facet facet = facetedMethod.getFacet(CommandFacet.class);
-            Assert.assertNull(facet);
+            // then
+            final Facet facet = facetedMethod.getFacet(PublishedActionFacet.class);
+            assertNotNull(facet);
+            assertTrue(facet instanceof PublishedActionFacetForActionAnnotation);
+
+            final PublishedActionFacetForActionAnnotation facetImpl = (PublishedActionFacetForActionAnnotation) facet;
+            final PublishedAction.PayloadFactory payloadFactory = facetImpl.value();
+            assertThat(payloadFactory, instanceOf(PublishedActionFacetAbstract.LegacyAdapter.class));
+
+            final PublishedActionFacetAbstract.LegacyAdapter legacyAdapter = (PublishedActionFacetAbstract.LegacyAdapter) payloadFactory;
+            assertThat(legacyAdapter.getPayloadFactory(), instanceOf(CustomerSomeActionPublishingPayloadFactory.class));
 
             expectNoMethodsRemoved();
         }
 
+        @Test
+        public void given_enabled_irrespectiveOfConfiguration_thenFacetAdded() {
+
+            // given
+            class Customer {
+                @Action(
+                        publishing = org.apache.isis.applib.annotation.Publishing.ENABLED
+                )
+                public void someAction() {
+                }
+            }
+            final Method actionMethod = findMethod(Customer.class, "someAction");
+
+            // even though configuration is disabled
+            allowingPublishingConfigurationToReturn("none");
+
+            // when
+            facetFactory.processPublishing(new ProcessMethodContext(Customer.class, null, null, actionMethod, mockMethodRemover, facetedMethod));
+
+            // then
+            final Facet facet = facetedMethod.getFacet(PublishedActionFacet.class);
+            assertNotNull(facet);
+            assertTrue(facet instanceof PublishedActionFacetForActionAnnotation);
+        }
+
+        @Test
+        public void given_disabled_irrespectiveOfConfiguration_thenNone() {
+
+            // given
+            class Customer {
+                @Action(
+                        publishing = org.apache.isis.applib.annotation.Publishing.DISABLED
+                )
+                public void someAction() {
+                }
+            }
+            final Method actionMethod = findMethod(Customer.class, "someAction");
+
+            // even though configuration is disabled
+            allowingPublishingConfigurationToReturn("none");
+
+            // when
+            facetFactory.processPublishing(new ProcessMethodContext(Customer.class, null, null, actionMethod, mockMethodRemover, facetedMethod));
+
+            // then
+            final Facet facet = facetedMethod.getFacet(PublishedActionFacet.class);
+            assertNull(facet);
+        }
 
     }
 
 
-    void allowingConfigurationToReturn(final String value) {
+    void allowingCommandConfigurationToReturn(final String value) {
         context.checking(new Expectations() {
             {
                 allowing(mockConfiguration).getString("isis.services.command.actions");
@@ -364,5 +1346,13 @@ public class ActionAnnotationFacetFactoryTest extends AbstractFacetFactoryJUnit4
             }
         });
     }
+    void allowingPublishingConfigurationToReturn(final String value) {
+        context.checking(new Expectations() {
+            {
+                allowing(mockConfiguration).getString("isis.services.publish.actions");
+                will(returnValue(value));
+            }
+        });
+    }
 
 }

http://git-wip-us.apache.org/repos/asf/isis/blob/18d470c3/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/actions/action/ActionAnnotationFacetFactoryTest_forActionSemantics.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/actions/action/ActionAnnotationFacetFactoryTest_forActionSemantics.java b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/actions/action/ActionAnnotationFacetFactoryTest_forActionSemantics.java
index 929425d..a4d10aa 100644
--- a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/actions/action/ActionAnnotationFacetFactoryTest_forActionSemantics.java
+++ b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/actions/action/ActionAnnotationFacetFactoryTest_forActionSemantics.java
@@ -26,7 +26,7 @@ import org.apache.isis.core.metamodel.facetapi.Facet;
 import org.apache.isis.core.metamodel.facets.AbstractFacetFactoryTest;
 import org.apache.isis.core.metamodel.facets.FacetFactory.ProcessMethodContext;
 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.facets.actions.action.semantics.ActionSemanticsFacetForActionSemanticsAnnotation;
 
 public class ActionAnnotationFacetFactoryTest_forActionSemantics extends AbstractFacetFactoryTest {
 
@@ -57,23 +57,7 @@ public class ActionAnnotationFacetFactoryTest_forActionSemantics extends Abstrac
 
         final Facet facet = facetedMethod.getFacet(ActionSemanticsFacet.class);
         assertNotNull(facet);
-        assertTrue(facet instanceof ActionSemanticsFacetAnnotation);
-
-        assertNoMethodsRemoved();
-    }
-
-    public void testNoAnnotationPickedUp() {
-        class Customer {
-            @SuppressWarnings("unused")
-            public void someAction() {
-            }
-        }
-        final Method actionMethod = findMethod(Customer.class, "someAction");
-
-        facetFactory.processSemantics(new ProcessMethodContext(Customer.class, null, null, actionMethod, methodRemover, facetedMethod));
-
-        final Facet facet = facetedMethod.getFacet(ActionSemanticsFacet.class);
-        assertNull(facet);
+        assertTrue(facet instanceof ActionSemanticsFacetForActionSemanticsAnnotation);
 
         assertNoMethodsRemoved();
     }

http://git-wip-us.apache.org/repos/asf/isis/blob/18d470c3/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/actions/action/ActionSemanticsFacetFallbackToNonIdempotentFactoryTest.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/actions/action/ActionSemanticsFacetFallbackToNonIdempotentFactoryTest.java b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/actions/action/ActionSemanticsFacetFallbackToNonIdempotentFactoryTest.java
new file mode 100644
index 0000000..9e43b48
--- /dev/null
+++ b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/actions/action/ActionSemanticsFacetFallbackToNonIdempotentFactoryTest.java
@@ -0,0 +1,63 @@
+/*
+ *  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.lang.reflect.Method;
+import org.apache.isis.core.metamodel.facetapi.Facet;
+import org.apache.isis.core.metamodel.facets.AbstractFacetFactoryTest;
+import org.apache.isis.core.metamodel.facets.FacetFactory.ProcessMethodContext;
+import org.apache.isis.core.metamodel.facets.actions.action.semantics.ActionSemanticsFacetFallbackToNonIdempotent;
+import org.apache.isis.core.metamodel.facets.actions.semantics.ActionSemanticsFacet;
+
+public class ActionSemanticsFacetFallbackToNonIdempotentFactoryTest extends AbstractFacetFactoryTest {
+
+    private ActionAnnotationFacetFactory facetFactory;
+
+    @Override
+    protected void setUp() throws Exception {
+        super.setUp();
+
+        facetFactory = new ActionAnnotationFacetFactory();
+    }
+
+    @Override
+    protected void tearDown() throws Exception {
+        facetFactory = null;
+        super.tearDown();
+    }
+
+    public void testNoAnnotationPickedUp() {
+        class Customer {
+            @SuppressWarnings("unused")
+            public void someAction() {
+            }
+        }
+        final Method actionMethod = findMethod(Customer.class, "someAction");
+
+        facetFactory.processSemantics(new ProcessMethodContext(Customer.class, null, null, actionMethod, methodRemover, facetedMethod));
+
+        final Facet facet = facetedMethod.getFacet(ActionSemanticsFacet.class);
+        assertNotNull(facet);
+        assertTrue(facet instanceof ActionSemanticsFacetFallbackToNonIdempotent);
+
+        assertNoMethodsRemoved();
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/isis/blob/18d470c3/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/actions/action/IdempotentFacetAnnotationFactoryTest.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/actions/action/IdempotentFacetAnnotationFactoryTest.java b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/actions/action/IdempotentFacetAnnotationFactoryTest.java
new file mode 100644
index 0000000..01a6ef3
--- /dev/null
+++ b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/actions/action/IdempotentFacetAnnotationFactoryTest.java
@@ -0,0 +1,64 @@
+/*
+ *  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.lang.reflect.Method;
+
+import org.apache.isis.applib.annotation.Idempotent;
+import org.apache.isis.core.metamodel.facetapi.Facet;
+import org.apache.isis.core.metamodel.facets.FacetFactory.ProcessMethodContext;
+import org.apache.isis.core.metamodel.facets.AbstractFacetFactoryTest;
+import org.apache.isis.core.metamodel.facets.actions.semantics.ActionSemanticsFacet;
+import org.apache.isis.core.metamodel.facets.actions.action.semantics.ActionSemanticsFacetFromIdempotentAnnotation;
+
+public class IdempotentFacetAnnotationFactoryTest extends AbstractFacetFactoryTest {
+
+    private ActionAnnotationFacetFactory facetFactory;
+
+    @Override
+    protected void setUp() throws Exception {
+        super.setUp();
+
+        facetFactory = new ActionAnnotationFacetFactory();
+    }
+
+    @Override
+    protected void tearDown() throws Exception {
+        facetFactory = null;
+        super.tearDown();
+    }
+
+    public void testQueryOnlyAnnotationPickedUp() {
+        class Customer {
+            @Idempotent
+            public void someAction() {
+            }
+        }
+        final Method actionMethod = findMethod(Customer.class, "someAction");
+
+        facetFactory.processSemantics(new ProcessMethodContext(Customer.class, null, null, actionMethod, methodRemover, facetedMethod));
+
+        final Facet facet = facetedMethod.getFacet(ActionSemanticsFacet.class);
+        assertNotNull(facet);
+        assertTrue(facet instanceof ActionSemanticsFacetFromIdempotentAnnotation);
+
+        assertNoMethodsRemoved();
+    }
+}

http://git-wip-us.apache.org/repos/asf/isis/blob/18d470c3/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/actions/action/QueryOnlyFacetAnnotationFactoryTest.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/actions/action/QueryOnlyFacetAnnotationFactoryTest.java b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/actions/action/QueryOnlyFacetAnnotationFactoryTest.java
new file mode 100644
index 0000000..41f7cee
--- /dev/null
+++ b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/actions/action/QueryOnlyFacetAnnotationFactoryTest.java
@@ -0,0 +1,65 @@
+/*
+ *  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.lang.reflect.Method;
+import org.apache.isis.applib.annotation.QueryOnly;
+import org.apache.isis.core.metamodel.facetapi.Facet;
+import org.apache.isis.core.metamodel.facets.AbstractFacetFactoryTest;
+import org.apache.isis.core.metamodel.facets.FacetFactory.ProcessMethodContext;
+import org.apache.isis.core.metamodel.facets.actions.action.semantics.ActionSemanticsFacetFromQueryOnlyAnnotation;
+import org.apache.isis.core.metamodel.facets.actions.semantics.ActionSemanticsFacet;
+
+public class QueryOnlyFacetAnnotationFactoryTest extends AbstractFacetFactoryTest {
+
+    private ActionAnnotationFacetFactory facetFactory;
+
+    @Override
+    protected void setUp() throws Exception {
+        super.setUp();
+
+        facetFactory = new ActionAnnotationFacetFactory();
+    }
+
+    @Override
+    protected void tearDown() throws Exception {
+        facetFactory = null;
+        super.tearDown();
+    }
+
+    public void testQueryOnlyAnnotationPickedUp() {
+        class Customer {
+            @QueryOnly
+            public void someAction() {
+            }
+        }
+        final Method actionMethod = findMethod(Customer.class, "someAction");
+
+        facetFactory.processSemantics(new ProcessMethodContext(Customer.class, null, null, actionMethod, methodRemover, facetedMethod));
+
+        final Facet facet = facetedMethod.getFacet(ActionSemanticsFacet.class);
+        assertNotNull(facet);
+        assertTrue(facet instanceof ActionSemanticsFacetFromQueryOnlyAnnotation);
+
+        assertNoMethodsRemoved();
+    }
+
+
+}

http://git-wip-us.apache.org/repos/asf/isis/blob/18d470c3/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/actions/prototype/PrototypeFacetAbstractTest.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/actions/prototype/PrototypeFacetAbstractTest.java b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/actions/prototype/PrototypeFacetAbstractTest.java
new file mode 100644
index 0000000..7f3fedd
--- /dev/null
+++ b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/actions/prototype/PrototypeFacetAbstractTest.java
@@ -0,0 +1,47 @@
+package org.apache.isis.core.metamodel.facets.actions.prototype;
+
+import org.jmock.Expectations;
+import org.jmock.auto.Mock;
+import org.junit.Rule;
+import org.junit.Test;
+import org.apache.isis.core.metamodel.deployment.DeploymentCategory;
+import org.apache.isis.core.metamodel.facetapi.FacetHolder;
+import org.apache.isis.core.metamodel.interactions.VisibilityContext;
+import org.apache.isis.core.unittestsupport.jmocking.JUnitRuleMockery2;
+
+import static org.junit.Assert.assertEquals;
+
+public class PrototypeFacetAbstractTest {
+
+    @Rule
+    public JUnitRuleMockery2 context = JUnitRuleMockery2.createFor(JUnitRuleMockery2.Mode.INTERFACES_AND_CLASSES);
+
+    @Mock
+    private VisibilityContext mockVisibilityContext;
+    @Mock
+    private FacetHolder mockFacetHolder;
+
+    @Test
+    public void allCombinations() throws Exception {
+        givenWhenThen(DeploymentCategory.EXPLORING, null);
+        givenWhenThen(DeploymentCategory.PROTOTYPING, null);
+        givenWhenThen(DeploymentCategory.PRODUCTION, "Prototyping action not visible in production mode");
+    }
+
+    protected void givenWhenThen(final DeploymentCategory deploymentCategory, final String expected) {
+        // given
+        final PrototypeFacetAbstract facet = new PrototypeFacetAbstract(mockFacetHolder){};
+
+        // expect
+        context.checking(new Expectations() {{
+            oneOf(mockVisibilityContext).getDeploymentCategory();
+            will(returnValue(deploymentCategory));
+        }});
+
+        // when
+        final String reason = facet.hides(mockVisibilityContext);
+
+        // then
+        assertEquals(expected, reason);
+    }
+}
\ No newline at end of file