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/21 01:03:25 UTC

[03/12] isis git commit: ISIS-970: consolidating processing into DomainObjectAnnotationFacetFactory, ActionAnnotationFF, PropertyAnnotationFF, CollectionAnnotationFF

http://git-wip-us.apache.org/repos/asf/isis/blob/74e1f371/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/actions/action/ActionAnnotationFacetFactoryTest_actionInvocation.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/actions/action/ActionAnnotationFacetFactoryTest_actionInvocation.java b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/actions/action/ActionAnnotationFacetFactoryTest_actionInvocation.java
new file mode 100644
index 0000000..e7d4abe
--- /dev/null
+++ b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/actions/action/ActionAnnotationFacetFactoryTest_actionInvocation.java
@@ -0,0 +1,220 @@
+/*
+ *  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.FacetedMethod;
+import org.apache.isis.core.metamodel.facets.actions.action.invocation.ActionInvocationFacet;
+import org.apache.isis.core.metamodel.facets.actions.action.invocation.ActionInvocationFacetForDomainEventAbstract;
+import org.apache.isis.core.metamodel.facets.members.disabled.method.DisableForContextFacet;
+import org.apache.isis.core.metamodel.facets.members.disabled.method.DisableForContextFacetViaMethod;
+import org.apache.isis.core.metamodel.facets.members.disabled.method.DisableForContextFacetViaMethodFactory;
+import org.apache.isis.core.metamodel.facets.param.choices.ActionParameterChoicesFacet;
+import org.apache.isis.core.metamodel.facets.param.choices.methodnum.ActionParameterChoicesFacetViaMethod;
+import org.apache.isis.core.metamodel.facets.param.choices.methodnum.ActionParameterChoicesFacetViaMethodFactory;
+import org.apache.isis.core.metamodel.spec.ObjectSpecification;
+import org.apache.isis.core.metamodel.testspec.ObjectSpecificationStub;
+
+public class ActionAnnotationFacetFactoryTest_actionInvocation extends AbstractFacetFactoryTest {
+
+    private final ObjectSpecification voidSpec = new ObjectSpecificationStub("VOID");
+    private final ObjectSpecification stringSpec = new ObjectSpecificationStub("java.lang.String");
+    private final ObjectSpecification customerSpec = new ObjectSpecificationStub("Customer");
+    private ActionAnnotationFacetFactory facetFactory;
+
+    public void setUp() throws Exception {
+        super.setUp();
+        facetFactory = new ActionAnnotationFacetFactory();
+        facetFactory.setSpecificationLookup(programmableReflector);
+    }
+
+    public void testActionInvocationFacetIsInstalledAndMethodRemoved() {
+        programmableReflector.setLoadSpecificationStringReturn(voidSpec);
+
+        class Customer {
+            @SuppressWarnings("unused")
+            public void someAction() {
+            }
+        }
+        final Method actionMethod = findMethod(Customer.class, "someAction");
+
+        facetFactory.processInvocation(new ProcessMethodContext(Customer.class, null, null, actionMethod, methodRemover, facetedMethod));
+
+        final Facet facet = facetedMethod.getFacet(ActionInvocationFacet.class);
+        assertNotNull(facet);
+        assertTrue(facet instanceof ActionInvocationFacetForDomainEventAbstract);
+        final ActionInvocationFacetForDomainEventAbstract actionInvocationFacetViaMethod = (ActionInvocationFacetForDomainEventAbstract) facet;
+        assertEquals(actionMethod, actionInvocationFacetViaMethod.getMethods().get(0));
+
+        assertTrue(methodRemover.getRemovedMethodMethodCalls().contains(actionMethod));
+    }
+
+    public void testActionReturnTypeWhenVoid() {
+        programmableReflector.setLoadSpecificationStringReturn(voidSpec);
+
+        class Customer {
+            @SuppressWarnings("unused")
+            public void someAction() {
+            }
+        }
+        final Method actionMethod = findMethod(Customer.class, "someAction");
+
+        facetFactory.processInvocation(new ProcessMethodContext(Customer.class, null, null, actionMethod, methodRemover, facetedMethod));
+
+        final Facet facet = facetedMethod.getFacet(ActionInvocationFacet.class);
+        final ActionInvocationFacetForDomainEventAbstract actionInvocationFacetViaMethod = (ActionInvocationFacetForDomainEventAbstract) facet;
+        assertEquals(voidSpec, actionInvocationFacetViaMethod.getReturnType());
+    }
+
+    public void testActionReturnTypeWhenNotVoid() {
+        programmableReflector.setLoadSpecificationStringReturn(stringSpec);
+
+        class Customer {
+            @SuppressWarnings("unused")
+            public String someAction() {
+                return null;
+            }
+        }
+        final Method actionMethod = findMethod(Customer.class, "someAction");
+
+        facetFactory.processInvocation(new ProcessMethodContext(Customer.class, null, null, actionMethod, methodRemover, facetedMethod));
+
+        final Facet facet = facetedMethod.getFacet(ActionInvocationFacet.class);
+        final ActionInvocationFacetForDomainEventAbstract actionInvocationFacetViaMethod = (ActionInvocationFacetForDomainEventAbstract) facet;
+        assertEquals(stringSpec, actionInvocationFacetViaMethod.getReturnType());
+    }
+
+    public void testActionOnType() {
+        programmableReflector.setLoadSpecificationStringReturn(customerSpec);
+
+        class Customer {
+            @SuppressWarnings("unused")
+            public String someAction() {
+                return null;
+            }
+        }
+        final Method actionMethod = findMethod(Customer.class, "someAction");
+
+        facetFactory.processInvocation(new ProcessMethodContext(Customer.class, null, null, actionMethod, methodRemover, facetedMethod));
+
+        final Facet facet = facetedMethod.getFacet(ActionInvocationFacet.class);
+        final ActionInvocationFacetForDomainEventAbstract actionInvocationFacetViaMethod = (ActionInvocationFacetForDomainEventAbstract) facet;
+        assertEquals(customerSpec, actionInvocationFacetViaMethod.getOnType());
+    }
+
+    public void testActionsPickedUpFromSuperclass() {
+        programmableReflector.setLoadSpecificationStringReturn(voidSpec);
+
+        class Customer {
+            @SuppressWarnings("unused")
+            public void someAction(final int x, final long y) {
+            }
+        }
+
+        class CustomerEx extends Customer {
+        }
+
+        final Method actionMethod = findMethod(CustomerEx.class, "someAction", new Class[] { int.class, long.class });
+
+        final FacetedMethod facetHolderWithParms = FacetedMethod.createForAction(CustomerEx.class, actionMethod);
+
+        facetFactory.processInvocation(new ProcessMethodContext(CustomerEx.class, null, null, actionMethod, methodRemover, facetHolderWithParms));
+
+        final Facet facet0 = facetHolderWithParms.getFacet(ActionInvocationFacet.class);
+        assertNotNull(facet0);
+    }
+
+    public void testActionsPickedUpFromSuperclassButHelpersFromSubClass() {
+        programmableReflector.setLoadSpecificationStringReturn(voidSpec);
+
+        final ActionParameterChoicesFacetViaMethodFactory facetFactoryForChoices = new ActionParameterChoicesFacetViaMethodFactory();
+        facetFactoryForChoices.setSpecificationLookup(programmableReflector);
+        programmableReflector.setLoadSpecificationStringReturn(voidSpec);
+
+        final DisableForContextFacetViaMethodFactory facetFactoryForDisable = new DisableForContextFacetViaMethodFactory();
+        facetFactoryForDisable.setSpecificationLookup(programmableReflector);
+        programmableReflector.setLoadSpecificationStringReturn(voidSpec);
+
+        class Customer {
+            @SuppressWarnings("unused")
+            public void someAction(final int x, final long y) {
+            }
+
+            @SuppressWarnings("unused")
+            public int[] choices0SomeAction() {
+                return new int[0];
+            }
+        }
+
+        class CustomerEx extends Customer {
+            @Override
+            public int[] choices0SomeAction() {
+                return new int[0];
+            }
+
+            @SuppressWarnings("unused")
+            public long[] choices1SomeAction() {
+                return new long[0];
+            }
+
+            @SuppressWarnings("unused")
+            public String disableSomeAction(final int x, final long y) {
+                return null;
+            }
+        }
+
+        final Method actionMethod = findMethod(CustomerEx.class, "someAction", new Class[] { int.class, long.class });
+        final Method choices0Method = findMethod(CustomerEx.class, "choices0SomeAction", new Class[] {});
+        final Method choices1Method = findMethod(CustomerEx.class, "choices1SomeAction", new Class[] {});
+        final Method disableMethod = findMethod(CustomerEx.class, "disableSomeAction", new Class[] { int.class, long.class });
+
+        final FacetedMethod facetHolderWithParms = FacetedMethod.createForAction(CustomerEx.class, actionMethod);
+
+        final ProcessMethodContext processMethodContext = new ProcessMethodContext(CustomerEx.class, null, null, actionMethod, methodRemover, facetHolderWithParms);
+        facetFactory.processInvocation(processMethodContext);
+
+        facetFactoryForChoices.process(processMethodContext);
+        facetFactoryForDisable.process(processMethodContext);
+
+        final Facet facet0 = facetHolderWithParms.getFacet(ActionInvocationFacet.class);
+        assertNotNull(facet0);
+
+        final Facet facet1 = facetHolderWithParms.getParameters().get(0).getFacet(ActionParameterChoicesFacet.class);
+        assertNotNull(facet1);
+        assertTrue(facet1 instanceof ActionParameterChoicesFacetViaMethod);
+        final ActionParameterChoicesFacetViaMethod actionChoicesFacetViaMethod0 = (ActionParameterChoicesFacetViaMethod) facet1;
+        assertEquals(choices0Method, actionChoicesFacetViaMethod0.getMethods().get(0));
+
+        final Facet facet2 = facetHolderWithParms.getParameters().get(1).getFacet(ActionParameterChoicesFacet.class);
+        assertNotNull(facet2);
+        assertTrue(facet2 instanceof ActionParameterChoicesFacetViaMethod);
+        final ActionParameterChoicesFacetViaMethod actionChoicesFacetViaMethod1 = (ActionParameterChoicesFacetViaMethod) facet2;
+        assertEquals(choices1Method, actionChoicesFacetViaMethod1.getMethods().get(0));
+
+        final Facet facet3 = facetHolderWithParms.getFacet(DisableForContextFacet.class);
+        assertNotNull(facet3);
+        assertTrue(facet3 instanceof DisableForContextFacetViaMethod);
+        final DisableForContextFacetViaMethod disableFacetViaMethod = (DisableForContextFacetViaMethod) facet3;
+        assertEquals(disableMethod, disableFacetViaMethod.getMethods().get(0));
+    }
+}

http://git-wip-us.apache.org/repos/asf/isis/blob/74e1f371/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 721f80b..929425d 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
@@ -53,7 +53,7 @@ public class ActionAnnotationFacetFactoryTest_forActionSemantics extends Abstrac
         }
         final Method actionMethod = findMethod(Customer.class, "someAction");
 
-        facetFactory.process(new ProcessMethodContext(Customer.class, null, null, actionMethod, methodRemover, facetedMethod));
+        facetFactory.processSemantics(new ProcessMethodContext(Customer.class, null, null, actionMethod, methodRemover, facetedMethod));
 
         final Facet facet = facetedMethod.getFacet(ActionSemanticsFacet.class);
         assertNotNull(facet);
@@ -70,7 +70,7 @@ public class ActionAnnotationFacetFactoryTest_forActionSemantics extends Abstrac
         }
         final Method actionMethod = findMethod(Customer.class, "someAction");
 
-        facetFactory.process(new ProcessMethodContext(Customer.class, null, null, actionMethod, methodRemover, facetedMethod));
+        facetFactory.processSemantics(new ProcessMethodContext(Customer.class, null, null, actionMethod, methodRemover, facetedMethod));
 
         final Facet facet = facetedMethod.getFacet(ActionSemanticsFacet.class);
         assertNull(facet);

http://git-wip-us.apache.org/repos/asf/isis/blob/74e1f371/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/actions/action/ActionAnnotationFacetFactoryTest_forCommand.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/actions/action/ActionAnnotationFacetFactoryTest_forCommand.java b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/actions/action/ActionAnnotationFacetFactoryTest_forCommand.java
deleted file mode 100644
index ce0bf47..0000000
--- a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/actions/action/ActionAnnotationFacetFactoryTest_forCommand.java
+++ /dev/null
@@ -1,64 +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.action;
-
-import java.lang.reflect.Method;
-import org.apache.isis.applib.annotation.Command;
-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.command.CommandFacet;
-import org.apache.isis.core.metamodel.facets.actions.command.CommandFacetAbstract;
-
-public class ActionAnnotationFacetFactoryTest_forCommand 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 testAnnotationPickedUp() {
-        class Customer {
-            @Command
-            public void someAction() {
-            }
-        }
-        final Method actionMethod = findMethod(Customer.class, "someAction");
-
-        facetFactory.process(new ProcessMethodContext(Customer.class, null, null, actionMethod, methodRemover, facetedMethod));
-
-        final Facet facet = facetedMethod.getFacet(CommandFacet.class);
-        assertNotNull(facet);
-        assertTrue(facet instanceof CommandFacetAbstract);
-
-        assertNoMethodsRemoved();
-    }
-
-}

http://git-wip-us.apache.org/repos/asf/isis/blob/74e1f371/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/actions/action/CommandFromConfigurationFacetFactoryTest.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/actions/action/CommandFromConfigurationFacetFactoryTest.java b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/actions/action/CommandFromConfigurationFacetFactoryTest.java
deleted file mode 100644
index 094e069..0000000
--- a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/actions/action/CommandFromConfigurationFacetFactoryTest.java
+++ /dev/null
@@ -1,154 +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.action;
-
-import java.lang.reflect.Method;
-import java.util.UUID;
-import org.jmock.Expectations;
-import org.junit.After;
-import org.junit.Assert;
-import org.junit.Before;
-import org.junit.Test;
-import org.apache.isis.applib.annotation.ActionSemantics.Of;
-import org.apache.isis.applib.services.HasTransactionId;
-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.command.CommandFacet;
-import org.apache.isis.core.metamodel.facets.actions.command.CommandFacetAbstract;
-import org.apache.isis.core.metamodel.facets.actions.semantics.ActionSemanticsFacetAbstract;
-
-public class CommandFromConfigurationFacetFactoryTest extends AbstractFacetFactoryJUnit4TestCase {
-
-    private ActionAnnotationFacetFactory facetFactory;
-    private Method customerActionMethod;
-
-    @Before
-    public void setUp() throws Exception {
-        facetFactory = new ActionAnnotationFacetFactory();
-        facetFactory.setConfiguration(mockConfiguration);
-
-        customerActionMethod = findMethod(Customer.class, "someAction");
-    }
-
-    @After
-    public void tearDown() throws Exception {
-        facetFactory = null;
-    }
-
-    class Customer {
-        public void someAction() {
-        }
-    }
-
-    class SomeTransactionalId implements HasTransactionId {
-        public void someAction() {
-        }
-
-        @Override
-        public UUID getTransactionId() {
-            return null;
-        }
-
-        @Override
-        public void setTransactionId(UUID transactionId) {
-        }
-    }
-
-    @Test(expected=IllegalStateException.class)
-    public void requiresActionSemantics() {
-        allowingConfigurationToReturn("safe");
-        final Method actionMethod = findMethod(Customer.class, "someAction");
-
-        facetFactory.process(new ProcessMethodContext(Customer.class, null, null, actionMethod, mockMethodRemover, facetedMethod));
-    }
-
-    @Test
-    public void ignoreHasTransactionId() {
-        final Of actionSemantics = Of.SAFE;
-
-        allowingConfigurationToReturn("all");
-        final Method actionMethod = findMethod(SomeTransactionalId.class, "someAction");
-
-        facetedMethod.addFacet(new ActionSemanticsFacetAbstract(actionSemantics, facetedMethod) {});
-        facetFactory.process(new ProcessMethodContext(SomeTransactionalId.class, null, null, actionMethod, mockMethodRemover, facetedMethod));
-
-        final Facet facet = facetedMethod.getFacet(CommandFacet.class);
-        Assert.assertNull(facet);
-
-        expectNoMethodsRemoved();
-    }
-
-
-    @Test
-    public void all_with_safe() {
-        final Of actionSemantics = Of.SAFE;
-        
-        allowingConfigurationToReturn("all");
-
-        facetedMethod.addFacet(new ActionSemanticsFacetAbstract(actionSemantics, facetedMethod) {});
-        facetFactory.process(new ProcessMethodContext(Customer.class, null, null, customerActionMethod, mockMethodRemover, facetedMethod));
-
-        final Facet facet = facetedMethod.getFacet(CommandFacet.class);
-        Assert.assertTrue(facet instanceof CommandFacetAbstract);
-
-        expectNoMethodsRemoved();
-    }
-
-    @Test
-    public void ignoreQueryOnly_with_safe() {
-        final Of actionSemantics = Of.SAFE;
-        
-        allowingConfigurationToReturn("ignoreQueryOnly");
-
-        facetedMethod.addFacet(new ActionSemanticsFacetAbstract(actionSemantics, facetedMethod) {});
-        facetFactory.process(new ProcessMethodContext(Customer.class, null, null, customerActionMethod, mockMethodRemover, facetedMethod));
-
-        final Facet facet = facetedMethod.getFacet(CommandFacet.class);
-        Assert.assertNull(facet);
-
-        expectNoMethodsRemoved();
-    }
-
-    @Test
-    public void none_with_nonIdempotent() {
-        final Of actionSemantics = Of.NON_IDEMPOTENT;
-        
-        allowingConfigurationToReturn("none");
-
-        facetedMethod.addFacet(new ActionSemanticsFacetAbstract(actionSemantics, facetedMethod) {});
-        facetFactory.process(new ProcessMethodContext(Customer.class, null, null, customerActionMethod, mockMethodRemover, facetedMethod));
-
-        final Facet facet = facetedMethod.getFacet(CommandFacet.class);
-        Assert.assertNull(facet);
-
-        expectNoMethodsRemoved();
-    }
-
-    private void allowingConfigurationToReturn(final String value) {
-        context.checking(new Expectations() {
-            {
-                allowing(mockConfiguration).getString("isis.services.command.actions");
-                will(returnValue(value));
-            }
-        });
-    }
-
-}

http://git-wip-us.apache.org/repos/asf/isis/blob/74e1f371/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/collections/CollectionFieldMethodsFacetFactoryTest.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/collections/CollectionFieldMethodsFacetFactoryTest.java b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/collections/CollectionFieldMethodsFacetFactoryTest.java
index 740b5a4..c437312 100644
--- a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/collections/CollectionFieldMethodsFacetFactoryTest.java
+++ b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/collections/CollectionFieldMethodsFacetFactoryTest.java
@@ -66,7 +66,7 @@ public class CollectionFieldMethodsFacetFactoryTest extends AbstractFacetFactory
 
     public void testPropertyAccessorFacetIsInstalledForJavaUtilCollectionAndMethodRemoved() {
         final CollectionAccessorFacetViaAccessorFactory facetFactory = new CollectionAccessorFacetViaAccessorFactory();
-        facetFactory.setSpecificationLookup(reflector);
+        facetFactory.setSpecificationLookup(programmableReflector);
 
         class Customer {
             @SuppressWarnings({ "rawtypes", "unused" })
@@ -89,7 +89,7 @@ public class CollectionFieldMethodsFacetFactoryTest extends AbstractFacetFactory
 
     public void testPropertyAccessorFacetIsInstalledForJavaUtilListAndMethodRemoved() {
         final CollectionAccessorFacetViaAccessorFactory facetFactory = new CollectionAccessorFacetViaAccessorFactory();
-        facetFactory.setSpecificationLookup(reflector);
+        facetFactory.setSpecificationLookup(programmableReflector);
 
         class Customer {
             @SuppressWarnings({ "rawtypes", "unused" })
@@ -112,7 +112,7 @@ public class CollectionFieldMethodsFacetFactoryTest extends AbstractFacetFactory
 
     public void testPropertyAccessorFacetIsInstalledForJavaUtilSetAndMethodRemoved() {
         final CollectionAccessorFacetViaAccessorFactory facetFactory = new CollectionAccessorFacetViaAccessorFactory();
-        facetFactory.setSpecificationLookup(reflector);
+        facetFactory.setSpecificationLookup(programmableReflector);
 
         class Customer {
             @SuppressWarnings({ "rawtypes", "unused" })
@@ -135,7 +135,7 @@ public class CollectionFieldMethodsFacetFactoryTest extends AbstractFacetFactory
 
     public void testPropertyAccessorFacetIsInstalledForObjectArrayAndMethodRemoved() {
         final CollectionAccessorFacetViaAccessorFactory facetFactory = new CollectionAccessorFacetViaAccessorFactory();
-        facetFactory.setSpecificationLookup(reflector);
+        facetFactory.setSpecificationLookup(programmableReflector);
 
         class Customer {
             @SuppressWarnings("unused")
@@ -158,7 +158,7 @@ public class CollectionFieldMethodsFacetFactoryTest extends AbstractFacetFactory
 
     public void testPropertyAccessorFacetIsInstalledForOrderArrayAndMethodRemoved() {
         final CollectionAccessorFacetViaAccessorFactory facetFactory = new CollectionAccessorFacetViaAccessorFactory();
-        facetFactory.setSpecificationLookup(reflector);
+        facetFactory.setSpecificationLookup(programmableReflector);
 
         @SuppressWarnings("hiding")
         class Order {
@@ -184,7 +184,7 @@ public class CollectionFieldMethodsFacetFactoryTest extends AbstractFacetFactory
 
     public void testAddToFacetIsInstalledViaAccessorIfNoExplicitAddToMethodExists() {
         final CollectionAddToRemoveFromAndValidateFacetFactory facetFactory = new CollectionAddToRemoveFromAndValidateFacetFactory();
-        facetFactory.setSpecificationLookup(reflector);
+        facetFactory.setSpecificationLookup(programmableReflector);
 
         @SuppressWarnings("hiding")
         class Order {
@@ -208,7 +208,7 @@ public class CollectionFieldMethodsFacetFactoryTest extends AbstractFacetFactory
 
     public void testCannotInferTypeOfFacetIfNoExplicitAddToOrRemoveFromMethods() {
         final CollectionAddToRemoveFromAndValidateFacetFactory facetFactory = new CollectionAddToRemoveFromAndValidateFacetFactory();
-        facetFactory.setSpecificationLookup(reflector);
+        facetFactory.setSpecificationLookup(programmableReflector);
 
         @SuppressWarnings("hiding")
         class Order {
@@ -228,7 +228,7 @@ public class CollectionFieldMethodsFacetFactoryTest extends AbstractFacetFactory
 
     public void testRemoveFromFacetIsInstalledViaAccessorIfNoExplicitRemoveFromMethodExists() {
         final CollectionAddToRemoveFromAndValidateFacetFactory facetFactory = new CollectionAddToRemoveFromAndValidateFacetFactory();
-        facetFactory.setSpecificationLookup(reflector);
+        facetFactory.setSpecificationLookup(programmableReflector);
 
         @SuppressWarnings("hiding")
         class Order {
@@ -252,7 +252,7 @@ public class CollectionFieldMethodsFacetFactoryTest extends AbstractFacetFactory
 
     public void testAddToFacetIsInstalledAndMethodRemoved() {
         final CollectionAddToRemoveFromAndValidateFacetFactory facetFactory = new CollectionAddToRemoveFromAndValidateFacetFactory();
-        facetFactory.setSpecificationLookup(reflector);
+        facetFactory.setSpecificationLookup(programmableReflector);
 
         @SuppressWarnings("hiding")
         class Order {
@@ -283,7 +283,7 @@ public class CollectionFieldMethodsFacetFactoryTest extends AbstractFacetFactory
 
     public void testCanInferTypeOfFacetFromExplicitAddToMethod() {
         final CollectionAddToRemoveFromAndValidateFacetFactory facetFactory = new CollectionAddToRemoveFromAndValidateFacetFactory();
-        facetFactory.setSpecificationLookup(reflector);
+        facetFactory.setSpecificationLookup(programmableReflector);
 
         @SuppressWarnings("hiding")
         class Order {
@@ -311,7 +311,7 @@ public class CollectionFieldMethodsFacetFactoryTest extends AbstractFacetFactory
 
     public void testRemoveFromFacetIsInstalledAndMethodRemoved() {
         final CollectionAddToRemoveFromAndValidateFacetFactory facetFactory = new CollectionAddToRemoveFromAndValidateFacetFactory();
-        facetFactory.setSpecificationLookup(reflector);
+        facetFactory.setSpecificationLookup(programmableReflector);
 
         @SuppressWarnings("hiding")
         class Order {
@@ -342,7 +342,7 @@ public class CollectionFieldMethodsFacetFactoryTest extends AbstractFacetFactory
 
     public void testCanInferTypeOfFacetFromExplicitRemoveFromMethod() {
         final CollectionAddToRemoveFromAndValidateFacetFactory facetFactory = new CollectionAddToRemoveFromAndValidateFacetFactory();
-        facetFactory.setSpecificationLookup(reflector);
+        facetFactory.setSpecificationLookup(programmableReflector);
 
         @SuppressWarnings("hiding")
         class Order {
@@ -370,7 +370,7 @@ public class CollectionFieldMethodsFacetFactoryTest extends AbstractFacetFactory
 
     public void testClearFacetIsInstalledAndMethodRemoved() {
         final CollectionClearFacetFactory facetFactory = new CollectionClearFacetFactory();
-        facetFactory.setSpecificationLookup(reflector);
+        facetFactory.setSpecificationLookup(programmableReflector);
 
         @SuppressWarnings({ "hiding", "unused" })
         class Order {
@@ -401,7 +401,7 @@ public class CollectionFieldMethodsFacetFactoryTest extends AbstractFacetFactory
 
     public void testClearFacetIsInstalledViaAccessorIfNoExplicitClearMethod() {
         final CollectionClearFacetFactory facetFactory = new CollectionClearFacetFactory();
-        facetFactory.setSpecificationLookup(reflector);
+        facetFactory.setSpecificationLookup(programmableReflector);
 
         @SuppressWarnings({ "hiding", "unused" })
         class Order {
@@ -425,7 +425,7 @@ public class CollectionFieldMethodsFacetFactoryTest extends AbstractFacetFactory
 
     public void testValidateAddToFacetIsInstalledAndMethodRemoved() {
         final CollectionAddToRemoveFromAndValidateFacetFactory facetFactory = new CollectionAddToRemoveFromAndValidateFacetFactory();
-        facetFactory.setSpecificationLookup(reflector);
+        facetFactory.setSpecificationLookup(programmableReflector);
 
         @SuppressWarnings("hiding")
         class Order {
@@ -461,7 +461,7 @@ public class CollectionFieldMethodsFacetFactoryTest extends AbstractFacetFactory
 
     public void testValidateRemoveFromFacetIsInstalledAndMethodRemoved() {
         final CollectionAddToRemoveFromAndValidateFacetFactory facetFactory = new CollectionAddToRemoveFromAndValidateFacetFactory();
-        facetFactory.setSpecificationLookup(reflector);
+        facetFactory.setSpecificationLookup(programmableReflector);
 
         @SuppressWarnings("hiding")
         class Order {
@@ -497,7 +497,7 @@ public class CollectionFieldMethodsFacetFactoryTest extends AbstractFacetFactory
 
     public void testMethodFoundInSuperclass() {
         final CollectionAccessorFacetViaAccessorFactory facetFactory = new CollectionAccessorFacetViaAccessorFactory();
-        facetFactory.setSpecificationLookup(reflector);
+        facetFactory.setSpecificationLookup(programmableReflector);
 
         @SuppressWarnings("hiding")
         class Order {
@@ -525,9 +525,9 @@ public class CollectionFieldMethodsFacetFactoryTest extends AbstractFacetFactory
 
     public void testMethodFoundInSuperclassButHelpeMethodsFoundInSubclasses() {
         final CollectionAccessorFacetViaAccessorFactory facetFactoryForAccessor = new CollectionAccessorFacetViaAccessorFactory();
-        facetFactoryForAccessor.setSpecificationLookup(reflector);
+        facetFactoryForAccessor.setSpecificationLookup(programmableReflector);
         final CollectionAddToRemoveFromAndValidateFacetFactory facetFactoryForHelpers = new CollectionAddToRemoveFromAndValidateFacetFactory();
-        facetFactoryForHelpers.setSpecificationLookup(reflector);
+        facetFactoryForHelpers.setSpecificationLookup(programmableReflector);
 
         @SuppressWarnings("hiding")
         class Order {
@@ -620,7 +620,7 @@ public class CollectionFieldMethodsFacetFactoryTest extends AbstractFacetFactory
 
     public void testInstallsNamedFacetUsingNameMethodAndRemovesMethod() {
         final NamedFacetStaticMethodFactory facetFactory = new NamedFacetStaticMethodFactory();
-        facetFactory.setSpecificationLookup(reflector);
+        facetFactory.setSpecificationLookup(programmableReflector);
 
         final Method collectionAccessorMethod = findMethod(CustomerStatic.class, "getOrders");
         final Method nameMethod = findMethod(CustomerStatic.class, "nameOrders");
@@ -638,7 +638,7 @@ public class CollectionFieldMethodsFacetFactoryTest extends AbstractFacetFactory
 
     public void testInstallsDescribedAsFacetUsingDescriptionAndRemovesMethod() {
         final DescribedAsFacetStaticMethodFactory facetFactory = new DescribedAsFacetStaticMethodFactory();
-        facetFactory.setSpecificationLookup(reflector);
+        facetFactory.setSpecificationLookup(programmableReflector);
 
         final Method collectionAccessorMethod = findMethod(CustomerStatic.class, "getOrders");
         final Method descriptionMethod = findMethod(CustomerStatic.class, "descriptionOrders");
@@ -656,7 +656,7 @@ public class CollectionFieldMethodsFacetFactoryTest extends AbstractFacetFactory
 
     public void testInstallsHiddenFacetUsingAlwaysHideAndRemovesMethod() {
         final HiddenFacetStaticMethodFactory facetFactory = new HiddenFacetStaticMethodFactory();
-        facetFactory.setSpecificationLookup(reflector);
+        facetFactory.setSpecificationLookup(programmableReflector);
 
         final Method collectionAccessorMethod = findMethod(CustomerStatic.class, "getOrders");
         final Method alwaysHideMethod = findMethod(CustomerStatic.class, "alwaysHideOrders");
@@ -674,7 +674,7 @@ public class CollectionFieldMethodsFacetFactoryTest extends AbstractFacetFactory
 
     public void testInstallsHiddenFacetUsingAlwaysHideWhenNotAndRemovesMethod() {
         final HiddenFacetStaticMethodFactory facetFactory = new HiddenFacetStaticMethodFactory();
-        facetFactory.setSpecificationLookup(reflector);
+        facetFactory.setSpecificationLookup(programmableReflector);
 
         final Method collectionAccessorMethod = findMethod(CustomerStatic.class, "getOtherOrders");
         final Method alwaysHideMethod = findMethod(CustomerStatic.class, "alwaysHideOtherOrders");
@@ -688,7 +688,7 @@ public class CollectionFieldMethodsFacetFactoryTest extends AbstractFacetFactory
 
     public void testInstallsDisabledFacetUsingProtectAndRemovesMethod() {
         final DisabledFacetStaticMethodFacetFactory facetFactory = new DisabledFacetStaticMethodFacetFactory();
-        facetFactory.setSpecificationLookup(reflector);
+        facetFactory.setSpecificationLookup(programmableReflector);
 
         final Method collectionAccessorMethod = findMethod(CustomerStatic.class, "getOrders");
         final Method protectMethod = findMethod(CustomerStatic.class, "protectOrders");
@@ -706,7 +706,7 @@ public class CollectionFieldMethodsFacetFactoryTest extends AbstractFacetFactory
 
     public void testDoesNotInstallDisabledFacetUsingProtectWhenNotAndRemovesMethod() {
         final DisabledFacetStaticMethodFacetFactory facetFactory = new DisabledFacetStaticMethodFacetFactory();
-        facetFactory.setSpecificationLookup(reflector);
+        facetFactory.setSpecificationLookup(programmableReflector);
 
         final Method collectionAccessorMethod = findMethod(CustomerStatic.class, "getOtherOrders");
         final Method protectMethod = findMethod(CustomerStatic.class, "protectOtherOrders");
@@ -720,7 +720,7 @@ public class CollectionFieldMethodsFacetFactoryTest extends AbstractFacetFactory
 
     public void testInstallsHiddenForSessionFacetAndRemovesMethod() {
         final HideForSessionFacetViaMethodFactory facetFactory = new HideForSessionFacetViaMethodFactory();
-        facetFactory.setSpecificationLookup(reflector);
+        facetFactory.setSpecificationLookup(programmableReflector);
 
         final Method collectionAccessorMethod = findMethod(CustomerStatic.class, "getOrders");
         final Method hideMethod = findMethod(CustomerStatic.class, "hideOrders", new Class[] { UserMemento.class });
@@ -738,7 +738,7 @@ public class CollectionFieldMethodsFacetFactoryTest extends AbstractFacetFactory
 
     public void testInstallsDisabledForSessionFacetAndRemovesMethod() {
         final DisableForSessionFacetViaMethodFactory facetFactory = new DisableForSessionFacetViaMethodFactory();
-        facetFactory.setSpecificationLookup(reflector);
+        facetFactory.setSpecificationLookup(programmableReflector);
 
         final Method collectionAccessorMethod = findMethod(CustomerStatic.class, "getOrders");
         final Method disableMethod = findMethod(CustomerStatic.class, "disableOrders", new Class[] { UserMemento.class });

http://git-wip-us.apache.org/repos/asf/isis/blob/74e1f371/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/collections/collection/TypeOfAnnotationFacetFactoryTest.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/collections/collection/TypeOfAnnotationFacetFactoryTest.java b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/collections/collection/TypeOfAnnotationFacetFactoryTest.java
new file mode 100644
index 0000000..63338ea
--- /dev/null
+++ b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/collections/collection/TypeOfAnnotationFacetFactoryTest.java
@@ -0,0 +1,297 @@
+/*
+ *  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.collections.collection;
+
+import java.lang.reflect.Method;
+import java.util.Collection;
+import java.util.List;
+import java.util.Set;
+import org.apache.isis.applib.annotation.TypeOf;
+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.actcoll.typeof.TypeOfFacet;
+import org.apache.isis.core.metamodel.facets.actcoll.typeof.TypeOfFacetInferredFromArray;
+import org.apache.isis.core.metamodel.facets.actcoll.typeof.TypeOfFacetInferredFromGenerics;
+import org.apache.isis.core.metamodel.facets.collections.collection.typeof.TypeOfFacetOnCollectionFromTypeOfAnnotation;
+
+public class TypeOfAnnotationFacetFactoryTest extends AbstractFacetFactoryTest {
+
+    private CollectionAnnotationFacetFactory facetFactory;
+
+    @Override
+    protected void setUp() throws Exception {
+        super.setUp();
+        facetFactory = new CollectionAnnotationFacetFactory();
+    }
+
+    @Override
+    protected void tearDown() throws Exception {
+        facetFactory = null;
+        super.tearDown();
+    }
+
+    public void testTypeOfFacetInferredForActionWithJavaUtilCollectionReturnType() {
+        class Order {
+        }
+        class Customer {
+            // rawtypes are intention for this test
+            @SuppressWarnings({ "unused", "rawtypes" }) 
+            @TypeOf(Order.class)
+            public Collection someAction() {
+                return null;
+            }
+        }
+        final Method actionMethod = findMethod(Customer.class, "someAction");
+
+        facetFactory.process(new ProcessMethodContext(Customer.class, null, null, actionMethod, methodRemover, facetedMethod));
+
+        final Facet facet = facetedMethod.getFacet(TypeOfFacet.class);
+        assertNotNull(facet);
+        assertTrue(facet instanceof TypeOfFacetOnCollectionFromTypeOfAnnotation);
+        final TypeOfFacetOnCollectionFromTypeOfAnnotation typeOfFacetOnCollectionAnnotation = (TypeOfFacetOnCollectionFromTypeOfAnnotation) facet;
+        assertEquals(Order.class, typeOfFacetOnCollectionAnnotation.value());
+
+        assertNoMethodsRemoved();
+    }
+
+    public void testTypeOfFacetInferredForCollectionWithJavaUtilCollectionReturnType() {
+        class Order {
+        }
+        class Customer {
+            // rawtypes are intention for this test
+            @SuppressWarnings({ "unused", "rawtypes" })
+            @TypeOf(Order.class)
+            public Collection getOrders() {
+                return null;
+            }
+        }
+        final Method accessorMethod = findMethod(Customer.class, "getOrders");
+
+        facetFactory.process(new ProcessMethodContext(Customer.class, null, null, accessorMethod, methodRemover, facetedMethod));
+
+        final Facet facet = facetedMethod.getFacet(TypeOfFacet.class);
+        assertNotNull(facet);
+        assertTrue(facet instanceof TypeOfFacetOnCollectionFromTypeOfAnnotation);
+        final TypeOfFacetOnCollectionFromTypeOfAnnotation typeOfFacetOnCollectionAnnotation = (TypeOfFacetOnCollectionFromTypeOfAnnotation) facet;
+        assertEquals(Order.class, typeOfFacetOnCollectionAnnotation.value());
+
+        assertNoMethodsRemoved();
+    }
+
+    public void testTypeOfFacetInferredForActionWithGenericCollectionReturnType() {
+        class Order {
+        }
+        class Customer {
+            @SuppressWarnings("unused")
+            public Collection<Order> someAction() {
+                return null;
+            }
+        }
+        final Method actionMethod = findMethod(Customer.class, "someAction");
+
+        facetFactory.process(new ProcessMethodContext(Customer.class, null, null, actionMethod, methodRemover, facetedMethod));
+
+        final Facet facet = facetedMethod.getFacet(TypeOfFacet.class);
+        assertNotNull(facet);
+        assertTrue(facet instanceof TypeOfFacetInferredFromGenerics);
+        final TypeOfFacetInferredFromGenerics typeOfFacetInferredFromGenerics = (TypeOfFacetInferredFromGenerics) facet;
+        assertEquals(Order.class, typeOfFacetInferredFromGenerics.value());
+
+    }
+
+    public void testTypeOfFacetInferredForCollectionWithGenericCollectionReturnType() {
+        class Order {
+        }
+        class Customer {
+            @SuppressWarnings("unused")
+            public Collection<Order> getOrders() {
+                return null;
+            }
+        }
+        final Method collectionAccessorMethod = findMethod(Customer.class, "getOrders");
+
+        facetFactory.process(new ProcessMethodContext(Customer.class, null, null, collectionAccessorMethod, methodRemover, facetedMethod));
+
+        final Facet facet = facetedMethod.getFacet(TypeOfFacet.class);
+        assertNotNull(facet);
+        assertTrue(facet instanceof TypeOfFacetInferredFromGenerics);
+        final TypeOfFacetInferredFromGenerics typeOfFacetInferredFromGenerics = (TypeOfFacetInferredFromGenerics) facet;
+        assertEquals(Order.class, typeOfFacetInferredFromGenerics.value());
+
+    }
+
+    public void testTypeOfFacetInferredForActionWithJavaUtilListReturnType() {
+        class Order {
+        }
+        class Customer {
+            // rawTypes is intentional here
+            @SuppressWarnings({ "unused", "rawtypes" })
+            @TypeOf(Order.class)
+            public List someAction() {
+                return null;
+            }
+        }
+        final Method actionMethod = findMethod(Customer.class, "someAction");
+
+        facetFactory.process(new ProcessMethodContext(Customer.class, null, null, actionMethod, methodRemover, facetedMethod));
+
+        final Facet facet = facetedMethod.getFacet(TypeOfFacet.class);
+        assertNotNull(facet);
+        assertTrue(facet instanceof TypeOfFacetOnCollectionFromTypeOfAnnotation);
+        final TypeOfFacetOnCollectionFromTypeOfAnnotation typeOfFacetOnCollectionAnnotation = (TypeOfFacetOnCollectionFromTypeOfAnnotation) facet;
+        assertEquals(Order.class, typeOfFacetOnCollectionAnnotation.value());
+
+        assertNoMethodsRemoved();
+    }
+
+    public void testTypeOfFacetInferredForCollectionWithJavaUtilListReturnType() {
+        class Order {
+        }
+        class Customer {
+            // rawTypes is intentional here
+            @SuppressWarnings({ "unused", "rawtypes" })
+            @TypeOf(Order.class)
+            public List getOrders() {
+                return null;
+            }
+        }
+        final Method accessorMethod = findMethod(Customer.class, "getOrders");
+
+        facetFactory.process(new ProcessMethodContext(Customer.class, null, null, accessorMethod, methodRemover, facetedMethod));
+
+        final Facet facet = facetedMethod.getFacet(TypeOfFacet.class);
+        assertNotNull(facet);
+        assertTrue(facet instanceof TypeOfFacetOnCollectionFromTypeOfAnnotation);
+        final TypeOfFacetOnCollectionFromTypeOfAnnotation typeOfFacetOnCollectionAnnotation = (TypeOfFacetOnCollectionFromTypeOfAnnotation) facet;
+        assertEquals(Order.class, typeOfFacetOnCollectionAnnotation.value());
+
+        assertNoMethodsRemoved();
+    }
+
+    public void testTypeOfFacetInferredForActionWithJavaUtilSetReturnType() {
+        class Order {
+        }
+        class Customer {
+            @SuppressWarnings("unused")
+            @TypeOf(Order.class)
+            public Set someAction() {
+                return null;
+            }
+        }
+        final Method actionMethod = findMethod(Customer.class, "someAction");
+
+        facetFactory.process(new ProcessMethodContext(Customer.class, null, null, actionMethod, methodRemover, facetedMethod));
+
+        final Facet facet = facetedMethod.getFacet(TypeOfFacet.class);
+        assertNotNull(facet);
+        assertTrue(facet instanceof TypeOfFacetOnCollectionFromTypeOfAnnotation);
+        final TypeOfFacetOnCollectionFromTypeOfAnnotation typeOfFacetOnCollectionAnnotation = (TypeOfFacetOnCollectionFromTypeOfAnnotation) facet;
+        assertEquals(Order.class, typeOfFacetOnCollectionAnnotation.value());
+
+        assertNoMethodsRemoved();
+    }
+
+    public void testTypeOfFacetInferredForCollectionWithJavaUtilSetReturnType() {
+        class Order {
+        }
+        class Customer {
+            @SuppressWarnings("unused")
+            @TypeOf(Order.class)
+            public Set getOrders() {
+                return null;
+            }
+        }
+        final Method accessorMethod = findMethod(Customer.class, "getOrders");
+
+        facetFactory.process(new ProcessMethodContext(Customer.class, null, null, accessorMethod, methodRemover, facetedMethod));
+
+        final Facet facet = facetedMethod.getFacet(TypeOfFacet.class);
+        assertNotNull(facet);
+        assertTrue(facet instanceof TypeOfFacetOnCollectionFromTypeOfAnnotation);
+        final TypeOfFacetOnCollectionFromTypeOfAnnotation typeOfFacetOnCollectionAnnotation = (TypeOfFacetOnCollectionFromTypeOfAnnotation) facet;
+        assertEquals(Order.class, typeOfFacetOnCollectionAnnotation.value());
+
+        assertNoMethodsRemoved();
+    }
+
+    public void testTypeOfFacetInferredForActionWithArrayReturnType() {
+        class Order {
+        }
+        class Customer {
+            @SuppressWarnings("unused")
+            public Order[] someAction() {
+                return null;
+            }
+        }
+        final Method actionMethod = findMethod(Customer.class, "someAction");
+
+        facetFactory.process(new ProcessMethodContext(Customer.class, null, null, actionMethod, methodRemover, facetedMethod));
+
+        final Facet facet = facetedMethod.getFacet(TypeOfFacet.class);
+        assertNotNull(facet);
+        assertTrue(facet instanceof TypeOfFacetInferredFromArray);
+        final TypeOfFacetInferredFromArray typeOfFacetInferredFromArray = (TypeOfFacetInferredFromArray) facet;
+        assertEquals(Order.class, typeOfFacetInferredFromArray.value());
+
+        assertNoMethodsRemoved();
+    }
+
+    public void testTypeOfFacetIsInferredForCollectionFromOrderArray() {
+        class Order {
+        }
+        class Customer {
+            @SuppressWarnings("unused")
+            public Order[] getOrders() {
+                return null;
+            }
+        }
+        final Method collectionAccessorMethod = findMethod(Customer.class, "getOrders");
+
+        facetFactory.process(new ProcessMethodContext(Customer.class, null, null, collectionAccessorMethod, methodRemover, facetedMethod));
+
+        final Facet facet = facetedMethod.getFacet(TypeOfFacet.class);
+        assertNotNull(facet);
+        assertTrue(facet instanceof TypeOfFacetInferredFromArray);
+        final TypeOfFacetInferredFromArray typeOfFacetInferredFromArray = (TypeOfFacetInferredFromArray) facet;
+        assertEquals(Order.class, typeOfFacetInferredFromArray.value());
+
+    }
+
+    public void testTypeOfAnnotationIgnoredForActionIfReturnTypeIsntACollectionType() {
+        class Order {
+        }
+        class Customer {
+            @SuppressWarnings("unused")
+            @TypeOf(Order.class)
+            public Customer someAction() {
+                return null;
+            }
+        }
+        final Method actionMethod = findMethod(Customer.class, "someAction");
+
+        facetFactory.process(new ProcessMethodContext(Customer.class, null, null, actionMethod, methodRemover, facetedMethod));
+
+        assertNull(facetedMethod.getFacet(TypeOfFacet.class));
+
+        assertNoMethodsRemoved();
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/isis/blob/74e1f371/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/collections/typeof/TypeOfAnnotationFacetFactoryTest.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/collections/typeof/TypeOfAnnotationFacetFactoryTest.java b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/collections/typeof/TypeOfAnnotationFacetFactoryTest.java
deleted file mode 100644
index de6701e..0000000
--- a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/collections/typeof/TypeOfAnnotationFacetFactoryTest.java
+++ /dev/null
@@ -1,298 +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.collections.typeof;
-
-import java.lang.reflect.Method;
-import java.util.Collection;
-import java.util.List;
-import java.util.Set;
-import org.apache.isis.applib.annotation.TypeOf;
-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.actcoll.typeof.TypeOfFacet;
-import org.apache.isis.core.metamodel.facets.actcoll.typeof.TypeOfFacetInferredFromArray;
-import org.apache.isis.core.metamodel.facets.actcoll.typeof.TypeOfFacetInferredFromGenerics;
-import org.apache.isis.core.metamodel.facets.collections.typeof.annotation.TypeOfFacetOnCollectionAnnotation;
-import org.apache.isis.core.metamodel.facets.collections.typeof.annotation.TypeOfFacetOnCollectionAnnotationFactory;
-
-public class TypeOfAnnotationFacetFactoryTest extends AbstractFacetFactoryTest {
-
-    private TypeOfFacetOnCollectionAnnotationFactory facetFactory;
-
-    @Override
-    protected void setUp() throws Exception {
-        super.setUp();
-        facetFactory = new TypeOfFacetOnCollectionAnnotationFactory();
-    }
-
-    @Override
-    protected void tearDown() throws Exception {
-        facetFactory = null;
-        super.tearDown();
-    }
-
-    public void testTypeOfFacetInferredForActionWithJavaUtilCollectionReturnType() {
-        class Order {
-        }
-        class Customer {
-            // rawtypes are intention for this test
-            @SuppressWarnings({ "unused", "rawtypes" }) 
-            @TypeOf(Order.class)
-            public Collection someAction() {
-                return null;
-            }
-        }
-        final Method actionMethod = findMethod(Customer.class, "someAction");
-
-        facetFactory.process(new ProcessMethodContext(Customer.class, null, null, actionMethod, methodRemover, facetedMethod));
-
-        final Facet facet = facetedMethod.getFacet(TypeOfFacet.class);
-        assertNotNull(facet);
-        assertTrue(facet instanceof TypeOfFacetOnCollectionAnnotation);
-        final TypeOfFacetOnCollectionAnnotation typeOfFacetOnCollectionAnnotation = (TypeOfFacetOnCollectionAnnotation) facet;
-        assertEquals(Order.class, typeOfFacetOnCollectionAnnotation.value());
-
-        assertNoMethodsRemoved();
-    }
-
-    public void testTypeOfFacetInferredForCollectionWithJavaUtilCollectionReturnType() {
-        class Order {
-        }
-        class Customer {
-            // rawtypes are intention for this test
-            @SuppressWarnings({ "unused", "rawtypes" })
-            @TypeOf(Order.class)
-            public Collection getOrders() {
-                return null;
-            }
-        }
-        final Method accessorMethod = findMethod(Customer.class, "getOrders");
-
-        facetFactory.process(new ProcessMethodContext(Customer.class, null, null, accessorMethod, methodRemover, facetedMethod));
-
-        final Facet facet = facetedMethod.getFacet(TypeOfFacet.class);
-        assertNotNull(facet);
-        assertTrue(facet instanceof TypeOfFacetOnCollectionAnnotation);
-        final TypeOfFacetOnCollectionAnnotation typeOfFacetOnCollectionAnnotation = (TypeOfFacetOnCollectionAnnotation) facet;
-        assertEquals(Order.class, typeOfFacetOnCollectionAnnotation.value());
-
-        assertNoMethodsRemoved();
-    }
-
-    public void testTypeOfFacetInferredForActionWithGenericCollectionReturnType() {
-        class Order {
-        }
-        class Customer {
-            @SuppressWarnings("unused")
-            public Collection<Order> someAction() {
-                return null;
-            }
-        }
-        final Method actionMethod = findMethod(Customer.class, "someAction");
-
-        facetFactory.process(new ProcessMethodContext(Customer.class, null, null, actionMethod, methodRemover, facetedMethod));
-
-        final Facet facet = facetedMethod.getFacet(TypeOfFacet.class);
-        assertNotNull(facet);
-        assertTrue(facet instanceof TypeOfFacetInferredFromGenerics);
-        final TypeOfFacetInferredFromGenerics typeOfFacetInferredFromGenerics = (TypeOfFacetInferredFromGenerics) facet;
-        assertEquals(Order.class, typeOfFacetInferredFromGenerics.value());
-
-    }
-
-    public void testTypeOfFacetInferredForCollectionWithGenericCollectionReturnType() {
-        class Order {
-        }
-        class Customer {
-            @SuppressWarnings("unused")
-            public Collection<Order> getOrders() {
-                return null;
-            }
-        }
-        final Method collectionAccessorMethod = findMethod(Customer.class, "getOrders");
-
-        facetFactory.process(new ProcessMethodContext(Customer.class, null, null, collectionAccessorMethod, methodRemover, facetedMethod));
-
-        final Facet facet = facetedMethod.getFacet(TypeOfFacet.class);
-        assertNotNull(facet);
-        assertTrue(facet instanceof TypeOfFacetInferredFromGenerics);
-        final TypeOfFacetInferredFromGenerics typeOfFacetInferredFromGenerics = (TypeOfFacetInferredFromGenerics) facet;
-        assertEquals(Order.class, typeOfFacetInferredFromGenerics.value());
-
-    }
-
-    public void testTypeOfFacetInferredForActionWithJavaUtilListReturnType() {
-        class Order {
-        }
-        class Customer {
-            // rawTypes is intentional here
-            @SuppressWarnings({ "unused", "rawtypes" })
-            @TypeOf(Order.class)
-            public List someAction() {
-                return null;
-            }
-        }
-        final Method actionMethod = findMethod(Customer.class, "someAction");
-
-        facetFactory.process(new ProcessMethodContext(Customer.class, null, null, actionMethod, methodRemover, facetedMethod));
-
-        final Facet facet = facetedMethod.getFacet(TypeOfFacet.class);
-        assertNotNull(facet);
-        assertTrue(facet instanceof TypeOfFacetOnCollectionAnnotation);
-        final TypeOfFacetOnCollectionAnnotation typeOfFacetOnCollectionAnnotation = (TypeOfFacetOnCollectionAnnotation) facet;
-        assertEquals(Order.class, typeOfFacetOnCollectionAnnotation.value());
-
-        assertNoMethodsRemoved();
-    }
-
-    public void testTypeOfFacetInferredForCollectionWithJavaUtilListReturnType() {
-        class Order {
-        }
-        class Customer {
-            // rawTypes is intentional here
-            @SuppressWarnings({ "unused", "rawtypes" })
-            @TypeOf(Order.class)
-            public List getOrders() {
-                return null;
-            }
-        }
-        final Method accessorMethod = findMethod(Customer.class, "getOrders");
-
-        facetFactory.process(new ProcessMethodContext(Customer.class, null, null, accessorMethod, methodRemover, facetedMethod));
-
-        final Facet facet = facetedMethod.getFacet(TypeOfFacet.class);
-        assertNotNull(facet);
-        assertTrue(facet instanceof TypeOfFacetOnCollectionAnnotation);
-        final TypeOfFacetOnCollectionAnnotation typeOfFacetOnCollectionAnnotation = (TypeOfFacetOnCollectionAnnotation) facet;
-        assertEquals(Order.class, typeOfFacetOnCollectionAnnotation.value());
-
-        assertNoMethodsRemoved();
-    }
-
-    public void testTypeOfFacetInferredForActionWithJavaUtilSetReturnType() {
-        class Order {
-        }
-        class Customer {
-            @SuppressWarnings("unused")
-            @TypeOf(Order.class)
-            public Set someAction() {
-                return null;
-            }
-        }
-        final Method actionMethod = findMethod(Customer.class, "someAction");
-
-        facetFactory.process(new ProcessMethodContext(Customer.class, null, null, actionMethod, methodRemover, facetedMethod));
-
-        final Facet facet = facetedMethod.getFacet(TypeOfFacet.class);
-        assertNotNull(facet);
-        assertTrue(facet instanceof TypeOfFacetOnCollectionAnnotation);
-        final TypeOfFacetOnCollectionAnnotation typeOfFacetOnCollectionAnnotation = (TypeOfFacetOnCollectionAnnotation) facet;
-        assertEquals(Order.class, typeOfFacetOnCollectionAnnotation.value());
-
-        assertNoMethodsRemoved();
-    }
-
-    public void testTypeOfFacetInferredForCollectionWithJavaUtilSetReturnType() {
-        class Order {
-        }
-        class Customer {
-            @SuppressWarnings("unused")
-            @TypeOf(Order.class)
-            public Set getOrders() {
-                return null;
-            }
-        }
-        final Method accessorMethod = findMethod(Customer.class, "getOrders");
-
-        facetFactory.process(new ProcessMethodContext(Customer.class, null, null, accessorMethod, methodRemover, facetedMethod));
-
-        final Facet facet = facetedMethod.getFacet(TypeOfFacet.class);
-        assertNotNull(facet);
-        assertTrue(facet instanceof TypeOfFacetOnCollectionAnnotation);
-        final TypeOfFacetOnCollectionAnnotation typeOfFacetOnCollectionAnnotation = (TypeOfFacetOnCollectionAnnotation) facet;
-        assertEquals(Order.class, typeOfFacetOnCollectionAnnotation.value());
-
-        assertNoMethodsRemoved();
-    }
-
-    public void testTypeOfFacetInferredForActionWithArrayReturnType() {
-        class Order {
-        }
-        class Customer {
-            @SuppressWarnings("unused")
-            public Order[] someAction() {
-                return null;
-            }
-        }
-        final Method actionMethod = findMethod(Customer.class, "someAction");
-
-        facetFactory.process(new ProcessMethodContext(Customer.class, null, null, actionMethod, methodRemover, facetedMethod));
-
-        final Facet facet = facetedMethod.getFacet(TypeOfFacet.class);
-        assertNotNull(facet);
-        assertTrue(facet instanceof TypeOfFacetInferredFromArray);
-        final TypeOfFacetInferredFromArray typeOfFacetInferredFromArray = (TypeOfFacetInferredFromArray) facet;
-        assertEquals(Order.class, typeOfFacetInferredFromArray.value());
-
-        assertNoMethodsRemoved();
-    }
-
-    public void testTypeOfFacetIsInferredForCollectionFromOrderArray() {
-        class Order {
-        }
-        class Customer {
-            @SuppressWarnings("unused")
-            public Order[] getOrders() {
-                return null;
-            }
-        }
-        final Method collectionAccessorMethod = findMethod(Customer.class, "getOrders");
-
-        facetFactory.process(new ProcessMethodContext(Customer.class, null, null, collectionAccessorMethod, methodRemover, facetedMethod));
-
-        final Facet facet = facetedMethod.getFacet(TypeOfFacet.class);
-        assertNotNull(facet);
-        assertTrue(facet instanceof TypeOfFacetInferredFromArray);
-        final TypeOfFacetInferredFromArray typeOfFacetInferredFromArray = (TypeOfFacetInferredFromArray) facet;
-        assertEquals(Order.class, typeOfFacetInferredFromArray.value());
-
-    }
-
-    public void testTypeOfAnnotationIgnoredForActionIfReturnTypeIsntACollectionType() {
-        class Order {
-        }
-        class Customer {
-            @SuppressWarnings("unused")
-            @TypeOf(Order.class)
-            public Customer someAction() {
-                return null;
-            }
-        }
-        final Method actionMethod = findMethod(Customer.class, "someAction");
-
-        facetFactory.process(new ProcessMethodContext(Customer.class, null, null, actionMethod, methodRemover, facetedMethod));
-
-        assertNull(facetedMethod.getFacet(TypeOfFacet.class));
-
-        assertNoMethodsRemoved();
-    }
-
-}

http://git-wip-us.apache.org/repos/asf/isis/blob/74e1f371/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/members/cssclassfa/CssClassFaFacetAbstractTest.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/members/cssclassfa/CssClassFaFacetAbstractTest.java b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/members/cssclassfa/CssClassFaFacetAbstractTest.java
index d0051b9..23d5083 100644
--- a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/members/cssclassfa/CssClassFaFacetAbstractTest.java
+++ b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/members/cssclassfa/CssClassFaFacetAbstractTest.java
@@ -11,18 +11,17 @@ public class CssClassFaFacetAbstractTest {
 
         @Test
         public void present() throws Exception {
-            assertThat(CssClassFaFacetAbstract.sanitize("fa foo"), is("fa foo"));
+            assertThat(CssClassFaFacetAbstract.sanitize("fa foo"), is("fa fa-fw foo"));
         }
 
         @Test
         public void presentAtEnd() throws Exception {
-            assertThat(CssClassFaFacetAbstract.sanitize("foo fa "), is("foo fa "));
+            assertThat(CssClassFaFacetAbstract.sanitize("foo fa "), is("fa fa-fw foo"));
         }
 
         @Test
         public void missing() throws Exception {
-            assertThat(CssClassFaFacetAbstract.sanitize("foo"), is("fa foo"));
+            assertThat(CssClassFaFacetAbstract.sanitize("foo"), is("fa fa-fw foo"));
         }
-
     }
 }

http://git-wip-us.apache.org/repos/asf/isis/blob/74e1f371/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/object/audited/annotation/DomainObjectAnnotationFacetFactoryTest_forAuditable.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/object/audited/annotation/DomainObjectAnnotationFacetFactoryTest_forAuditable.java b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/object/audited/annotation/DomainObjectAnnotationFacetFactoryTest_forAuditable.java
deleted file mode 100644
index d023fbc..0000000
--- a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/object/audited/annotation/DomainObjectAnnotationFacetFactoryTest_forAuditable.java
+++ /dev/null
@@ -1,62 +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.object.audited.annotation;
-
-import org.apache.isis.applib.annotation.Audited;
-import org.apache.isis.core.metamodel.facetapi.Facet;
-import org.apache.isis.core.metamodel.facets.AbstractFacetFactoryTest;
-import org.apache.isis.core.metamodel.facets.FacetFactory.ProcessClassContext;
-import org.apache.isis.core.metamodel.facets.object.audit.AuditableFacet;
-import org.apache.isis.core.metamodel.facets.object.audit.annotation.AuditableFacetForAuditedAnnotation;
-import org.apache.isis.core.metamodel.facets.object.domainobject.DomainObjectAnnotationFacetFactory;
-
-public class DomainObjectAnnotationFacetFactoryTest_forAuditable extends AbstractFacetFactoryTest {
-
-    private DomainObjectAnnotationFacetFactory facetFactory;
-
-    @Override
-    protected void setUp() throws Exception {
-        super.setUp();
-
-        facetFactory = new DomainObjectAnnotationFacetFactory();
-    }
-
-    @Override
-    protected void tearDown() throws Exception {
-        facetFactory = null;
-        super.tearDown();
-    }
-
-    public void testAnnotationPickedUpOnClass() {
-
-        @Audited
-        class Customer {
-        }
-
-        facetFactory.process(new ProcessClassContext(Customer.class, null, methodRemover, facetHolder));
-
-        final Facet facet = facetHolder.getFacet(AuditableFacet.class);
-        assertNotNull(facet);
-        assertTrue(facet instanceof AuditableFacetForAuditedAnnotation);
-
-        assertNoMethodsRemoved();
-    }
-
-}

http://git-wip-us.apache.org/repos/asf/isis/blob/74e1f371/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/object/domainobject/DomainObjectAnnotationFacetFactoryTest.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/object/domainobject/DomainObjectAnnotationFacetFactoryTest.java b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/object/domainobject/DomainObjectAnnotationFacetFactoryTest.java
index 36940e9..1924f6b 100644
--- a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/object/domainobject/DomainObjectAnnotationFacetFactoryTest.java
+++ b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/object/domainobject/DomainObjectAnnotationFacetFactoryTest.java
@@ -24,7 +24,6 @@ import org.jmock.Expectations;
 import org.junit.After;
 import org.junit.Assert;
 import org.junit.Before;
-import org.junit.Ignore;
 import org.junit.Test;
 import org.apache.isis.applib.annotation.Audited;
 import org.apache.isis.applib.annotation.DomainObject;
@@ -38,18 +37,32 @@ import org.apache.isis.core.metamodel.facetapi.Facet;
 import org.apache.isis.core.metamodel.facets.AbstractFacetFactoryJUnit4TestCase;
 import org.apache.isis.core.metamodel.facets.FacetFactory.ProcessClassContext;
 import org.apache.isis.core.metamodel.facets.object.audit.AuditableFacet;
-import org.apache.isis.core.metamodel.facets.object.audit.annotation.AuditableFacetForAuditedAnnotation;
 import org.apache.isis.core.metamodel.facets.object.autocomplete.AutoCompleteFacet;
+import org.apache.isis.core.metamodel.facets.object.domainobject.auditing.AuditableFacetForAuditedAnnotation;
+import org.apache.isis.core.metamodel.facets.object.domainobject.auditing.AuditableFacetForDomainObjectAnnotation;
+import org.apache.isis.core.metamodel.facets.object.domainobject.auditing.AuditableFacetForDomainObjectAnnotationAsConfigured;
+import org.apache.isis.core.metamodel.facets.object.domainobject.auditing.AuditableFacetFromConfiguration;
+import org.apache.isis.core.metamodel.facets.object.domainobject.autocomplete.AutoCompleteFacetForDomainObjectAnnotation;
+import org.apache.isis.core.metamodel.facets.object.domainobject.choices.ChoicesFacetForDomainObjectAnnotation;
+import org.apache.isis.core.metamodel.facets.object.domainobject.editing.ImmutableFacetForDomainObjectAnnotation;
+import org.apache.isis.core.metamodel.facets.object.domainobject.editing.ImmutableFacetFromConfiguration;
+import org.apache.isis.core.metamodel.facets.object.domainobject.objectspecid.ObjectSpecIdFacetForDomainObjectAnnotation;
+import org.apache.isis.core.metamodel.facets.object.domainobject.publishing.PublishedObjectFacetForDomainObjectAnnotation;
+import org.apache.isis.core.metamodel.facets.object.domainobject.publishing.PublishedObjectFacetForDomainObjectAnnotationAsConfigured;
+import org.apache.isis.core.metamodel.facets.object.domainobject.publishing.PublishedObjectFacetForPublishedObjectAnnotation;
+import org.apache.isis.core.metamodel.facets.object.domainobject.publishing.PublishedObjectFacetFromConfiguration;
+import org.apache.isis.core.metamodel.facets.object.domainobject.recreatable.RecreatableObjectFacetForDomainObjectAnnotation;
 import org.apache.isis.core.metamodel.facets.object.immutable.ImmutableFacet;
 import org.apache.isis.core.metamodel.facets.object.immutable.immutableannot.ImmutableFacetForImmutableAnnotation;
 import org.apache.isis.core.metamodel.facets.object.objectspecid.ObjectSpecIdFacet;
 import org.apache.isis.core.metamodel.facets.object.publishedobject.PublishedObjectFacet;
-import org.apache.isis.core.metamodel.facets.object.publishedobject.annotation.PublishedObjectFacetForPublishedObjectAnnotation;
+import org.apache.isis.core.metamodel.facets.object.publishedobject.PublishedObjectFacetAbstract;
 import org.apache.isis.core.metamodel.facets.object.viewmodel.ViewModelFacet;
 import org.apache.isis.core.metamodel.facets.propparam.choices.ChoicesFacet;
 import org.apache.isis.core.metamodel.spec.ObjectSpecId;
 
 import static org.hamcrest.CoreMatchers.is;
+import static org.hamcrest.CoreMatchers.notNullValue;
 import static org.hamcrest.Matchers.instanceOf;
 import static org.junit.Assert.assertThat;
 
@@ -128,7 +141,7 @@ public class DomainObjectAnnotationFacetFactoryTest extends AbstractFacetFactory
 
             allowingConfigurationToReturn("isis.services.audit.objects", "all");
 
-            facetFactory.process(new ProcessClassContext(HasTransactionId.class, null, mockMethodRemover, facetHolder));
+            facetFactory.processAuditing(new ProcessClassContext(HasTransactionId.class, null, mockMethodRemover, facetHolder));
 
             final Facet facet = facetHolder.getFacet(AuditableFacet.class);
             Assert.assertNull(facet);
@@ -142,10 +155,11 @@ public class DomainObjectAnnotationFacetFactoryTest extends AbstractFacetFactory
             public void configured_value_set_to_all() {
                 allowingConfigurationToReturn("isis.services.audit.objects", "all");
 
-                facetFactory.process(new ProcessClassContext(Customer.class, null, mockMethodRemover, facetHolder));
+                facetFactory.processAuditing(new ProcessClassContext(Customer.class, null, mockMethodRemover, facetHolder));
 
                 final Facet facet = facetHolder.getFacet(AuditableFacet.class);
-                Assert.assertTrue(facet instanceof AuditableFacetForDomainObjectAnnotationAsConfigured);
+                assertThat(facet, is(notNullValue()));
+                Assert.assertTrue(facet instanceof AuditableFacetFromConfiguration);
 
                 expectNoMethodsRemoved();
             }
@@ -339,7 +353,7 @@ public class DomainObjectAnnotationFacetFactoryTest extends AbstractFacetFactory
 
                 final Facet facet = facetHolder.getFacet(PublishedObjectFacet.class);
                 Assert.assertNotNull(facet);
-                Assert.assertTrue(facet instanceof PublishedObjectFacetForDomainObjectAnnotationAsConfigured);
+                Assert.assertTrue(facet instanceof PublishedObjectFacetFromConfiguration);
 
                 expectNoMethodsRemoved();
             }
@@ -429,8 +443,8 @@ public class DomainObjectAnnotationFacetFactoryTest extends AbstractFacetFactory
 
                 final PublishedObject.PayloadFactory payloadFactory = ((PublishedObjectFacetForDomainObjectAnnotationAsConfigured) facet).value();
 
-                assertThat(payloadFactory, instanceOf(PublishedObjectFacetForDomainObjectAnnotation.LegacyAdapter.class));
-                final PublishedObjectFacetForDomainObjectAnnotation.LegacyAdapter legacyAdapter = (PublishedObjectFacetForDomainObjectAnnotation.LegacyAdapter) payloadFactory;
+                assertThat(payloadFactory, instanceOf(PublishedObjectFacetAbstract.LegacyAdapter.class));
+                final PublishedObjectFacetAbstract.LegacyAdapter legacyAdapter = (PublishedObjectFacetAbstract.LegacyAdapter) payloadFactory;
 
                 final PublishingPayloadFactoryForObject specifiedPayloadFactory = legacyAdapter.getPayloadFactory();
                 assertThat(specifiedPayloadFactory, instanceOf(CustomerPayloadFactory.class));
@@ -699,7 +713,7 @@ public class DomainObjectAnnotationFacetFactoryTest extends AbstractFacetFactory
 
                 final Facet facet = facetHolder.getFacet(ImmutableFacet.class);
                 Assert.assertNotNull(facet);
-                Assert.assertTrue(facet instanceof ImmutableFacetForDomainObjectAnnotationAsConfigured);
+                Assert.assertTrue(facet instanceof ImmutableFacetFromConfiguration);
 
                 expectNoMethodsRemoved();
             }
@@ -725,7 +739,6 @@ public class DomainObjectAnnotationFacetFactoryTest extends AbstractFacetFactory
                 ignoringConfiguration();
             }
 
-            @Ignore // processing is actually still in ImmutableFacetFactory
             @Test
             public void has_annotation() {
 
@@ -739,7 +752,6 @@ public class DomainObjectAnnotationFacetFactoryTest extends AbstractFacetFactory
                 expectNoMethodsRemoved();
             }
 
-            @Ignore // processing is actually still in ImmutableFacetFactory
             @Test
             public void does_not_have_annotation() {
 
@@ -797,13 +809,12 @@ public class DomainObjectAnnotationFacetFactoryTest extends AbstractFacetFactory
 
             @Test
             public void irrespective_of_configured_value() {
-                allowingConfigurationToReturn("isis.services.audit.objects", null);
+                allowingConfigurationToReturn("isis.objects.editing", "false");
 
                 facetFactory.process(new ProcessClassContext(CustomerWithDomainObjectAndEditingSetToEnabled.class, null, mockMethodRemover, facetHolder));
 
-                final Facet facet = facetHolder.getFacet(AuditableFacet.class);
-                Assert.assertNotNull(facet);
-                Assert.assertTrue(facet instanceof AuditableFacetForDomainObjectAnnotation);
+                final Facet facet = facetHolder.getFacet(ImmutableFacet.class);
+                Assert.assertNull(facet);
 
                 expectNoMethodsRemoved();
             }
@@ -814,12 +825,13 @@ public class DomainObjectAnnotationFacetFactoryTest extends AbstractFacetFactory
 
             @Test
             public void irrespective_of_configured_value() {
-                allowingConfigurationToReturn("isis.objects.editing", "all");
+                allowingConfigurationToReturn("isis.objects.editing", "true");
 
                 facetFactory.process(new ProcessClassContext(CustomerWithDomainObjectAndEditingSetToDisabled.class, null, mockMethodRemover, facetHolder));
 
-                final Facet facet = facetHolder.getFacet(AuditableFacet.class);
-                Assert.assertNull(facet);
+                final Facet facet = facetHolder.getFacet(ImmutableFacet.class);
+                Assert.assertNotNull(facet);
+                Assert.assertTrue(facet instanceof ImmutableFacetForDomainObjectAnnotation);
 
                 expectNoMethodsRemoved();
             }

http://git-wip-us.apache.org/repos/asf/isis/blob/74e1f371/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/object/domainobject/DomainObjectAnnotationFacetFactoryTest_immutable.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/object/domainobject/DomainObjectAnnotationFacetFactoryTest_immutable.java b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/object/domainobject/DomainObjectAnnotationFacetFactoryTest_immutable.java
new file mode 100644
index 0000000..9d5c7bc
--- /dev/null
+++ b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/object/domainobject/DomainObjectAnnotationFacetFactoryTest_immutable.java
@@ -0,0 +1,125 @@
+/*
+ *  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.object.domainobject;
+
+import org.apache.isis.applib.annotation.Immutable;
+import org.apache.isis.applib.annotation.When;
+import org.apache.isis.core.metamodel.facetapi.Facet;
+import org.apache.isis.core.metamodel.facets.AbstractFacetFactoryTest;
+import org.apache.isis.core.metamodel.facets.FacetFactory.ProcessClassContext;
+import org.apache.isis.core.metamodel.facets.object.immutable.ImmutableFacet;
+import org.apache.isis.core.metamodel.facets.object.immutable.immutableannot.ImmutableFacetForImmutableAnnotation;
+
+public class DomainObjectAnnotationFacetFactoryTest_immutable extends AbstractFacetFactoryTest {
+
+    private DomainObjectAnnotationFacetFactory facetFactory;
+
+    @Override
+    protected void setUp() throws Exception {
+        super.setUp();
+
+        facetFactory = new DomainObjectAnnotationFacetFactory();
+    }
+
+    @Override
+    protected void tearDown() throws Exception {
+        facetFactory = null;
+        super.tearDown();
+    }
+
+    public void testImmutableAnnotationPickedUpOnClassAndDefaultsToAlways() {
+        @Immutable
+        class Customer {
+        }
+
+        facetFactory.processEditing(new ProcessClassContext(Customer.class, methodRemover, facetedMethod));
+
+        final Facet facet = facetedMethod.getFacet(ImmutableFacet.class);
+        assertNotNull(facet);
+        assertTrue(facet instanceof ImmutableFacetForImmutableAnnotation);
+        final ImmutableFacetForImmutableAnnotation immutableFacetAnnotation = (ImmutableFacetForImmutableAnnotation) facet;
+        assertEquals(When.ALWAYS, immutableFacetAnnotation.when());
+
+        assertNoMethodsRemoved();
+    }
+
+    public void testImmutableAnnotationAlwaysPickedUpOnClass() {
+        @Immutable(When.ALWAYS)
+        class Customer {
+        }
+
+        facetFactory.processEditing(new ProcessClassContext(Customer.class, methodRemover, facetedMethod));
+
+        final Facet facet = facetedMethod.getFacet(ImmutableFacet.class);
+        assertNotNull(facet);
+        assertTrue(facet instanceof ImmutableFacetForImmutableAnnotation);
+        final ImmutableFacetForImmutableAnnotation immutableFacetAnnotation = (ImmutableFacetForImmutableAnnotation) facet;
+        assertEquals(When.ALWAYS, immutableFacetAnnotation.when());
+
+        assertNoMethodsRemoved();
+    }
+
+    public void testImmutableAnnotationNeverPickedUpOnClass() {
+        @Immutable(When.NEVER)
+        class Customer {
+        }
+
+        facetFactory.processEditing(new ProcessClassContext(Customer.class, methodRemover, facetedMethod));
+
+        final Facet facet = facetedMethod.getFacet(ImmutableFacet.class);
+        final ImmutableFacetForImmutableAnnotation immutableFacetAnnotation = (ImmutableFacetForImmutableAnnotation) facet;
+        assertEquals(When.NEVER, immutableFacetAnnotation.when());
+
+        assertNoMethodsRemoved();
+    }
+
+    public void testImmutableAnnotationOncePersistedPickedUpOnClass() {
+        @Immutable(When.ONCE_PERSISTED)
+        class Customer {
+        }
+
+        facetFactory.processEditing(new ProcessClassContext(Customer.class, methodRemover, facetedMethod));
+
+        final Facet facet = facetedMethod.getFacet(ImmutableFacet.class);
+        assertNotNull(facet);
+        assertTrue(facet instanceof ImmutableFacetForImmutableAnnotation);
+        final ImmutableFacetForImmutableAnnotation immutableFacetAnnotation = (ImmutableFacetForImmutableAnnotation) facet;
+        assertEquals(When.ONCE_PERSISTED, immutableFacetAnnotation.when());
+
+        assertNoMethodsRemoved();
+    }
+
+    public void testImmutableAnnotationUntilPersistedPickedUpOnClass() {
+        @Immutable(When.UNTIL_PERSISTED)
+        class Customer {
+        }
+
+        facetFactory.processEditing(new ProcessClassContext(Customer.class, methodRemover, facetedMethod));
+
+        final Facet facet = facetedMethod.getFacet(ImmutableFacet.class);
+        assertNotNull(facet);
+        assertTrue(facet instanceof ImmutableFacetForImmutableAnnotation);
+        final ImmutableFacetForImmutableAnnotation immutableFacetAnnotation = (ImmutableFacetForImmutableAnnotation) facet;
+        assertEquals(When.UNTIL_PERSISTED, immutableFacetAnnotation.when());
+
+        assertNoMethodsRemoved();
+    }
+
+}