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 2017/10/27 12:33:06 UTC

[isis] branch dev/2.0.0/ISIS-1632-meta-annotations updated: ISIS-1632 , ISIS-1763: converts some more facet factories to handle Lists of annotations (WORK IN PROGRESS, CODE STILL DOES NOT COMPILE)

This is an automated email from the ASF dual-hosted git repository.

danhaywood pushed a commit to branch dev/2.0.0/ISIS-1632-meta-annotations
in repository https://gitbox.apache.org/repos/asf/isis.git


The following commit(s) were added to refs/heads/dev/2.0.0/ISIS-1632-meta-annotations by this push:
     new a9291fb  ISIS-1632 , ISIS-1763: converts some more facet factories to handle Lists of annotations (WORK IN PROGRESS, CODE STILL DOES NOT COMPILE)
a9291fb is described below

commit a9291fbc10a3fa8f7c75d3f24410aa321931ada7
Author: Dan Haywood <da...@haywood-associates.co.uk>
AuthorDate: Fri Oct 27 13:32:55 2017 +0100

    ISIS-1632 , ISIS-1763: converts some more facet factories to handle Lists of annotations (WORK IN PROGRESS, CODE STILL DOES NOT COMPILE)
---
 .../apache/isis/applib/annotation/Bounding.java    | 28 ++++++++
 .../isis/applib/annotation/CommandReification.java |  7 +-
 .../isis/applib/annotation/DomainObject.java       |  7 +-
 .../action/ActionAnnotationFacetFactory.java       | 39 +++++------
 .../action/bulk/BulkFacetForActionAnnotation.java  |  4 +-
 .../command/CommandFacetForActionAnnotation.java   | 76 ++++++++++++++--------
 .../hidden/HiddenFacetForActionAnnotation.java     |  4 +-
 .../PrototypeFacetForActionAnnotation.java         | 13 ++--
 .../PublishedActionFacetForActionAnnotation.java   | 69 +++++++++++++-------
 .../ActionSemanticsFacetForActionAnnotation.java   |  4 +-
 .../layout/CollectionLayoutFacetFactory.java       | 40 ++++--------
 ...CssClassFacetForCollectionLayoutAnnotation.java | 18 +++--
 ...aultViewFacetForCollectionLayoutAnnotation.java |  4 +-
 ...cribedAsFacetForCollectionLayoutAnnotation.java | 18 +++--
 .../HiddenFacetForCollectionLayoutAnnotation.java  | 17 +++--
 .../NamedFacetForCollectionLayoutAnnotation.java   | 17 +++--
 .../PagedFacetForCollectionLayoutAnnotation.java   |  4 +-
 ...SortedByFacetForCollectionLayoutAnnotation.java |  4 +-
 .../order/annotprop/MemberOrderFacetFactory.java   |  2 +-
 .../ChoicesFacetForDomainObjectAnnotation.java     | 22 ++++---
 ...ObjectSpecIdFacetForDomainObjectAnnotation.java |  4 +-
 ...lishedObjectFacetForDomainObjectAnnotation.java | 39 ++++++-----
 .../CssClassFacetForViewModelLayoutAnnotation.java | 16 +++--
 ...ibedAsFacetForDomainObjectLayoutAnnotation.java | 18 +++--
 ...scribedAsFacetForViewModelLayoutAnnotation.java | 16 +++--
 .../PagedFacetForDomainObjectLayoutAnnotation.java | 13 ++--
 ...bleFacetAnnotationElseConfigurationFactory.java |  2 +-
 .../annotprop/MemberGroupLayoutFacetFactory.java   |  2 +-
 .../mixin/MixinFacetForDomainObjectAnnotation.java | 38 ++++++-----
 ...bleFacetAnnotationElseConfigurationFactory.java |  2 +-
 ...DerivedFromJdoColumnAnnotationFacetFactory.java |  2 +-
 31 files changed, 338 insertions(+), 211 deletions(-)

diff --git a/core/applib/src/main/java/org/apache/isis/applib/annotation/Bounding.java b/core/applib/src/main/java/org/apache/isis/applib/annotation/Bounding.java
new file mode 100644
index 0000000..fc33caa
--- /dev/null
+++ b/core/applib/src/main/java/org/apache/isis/applib/annotation/Bounding.java
@@ -0,0 +1,28 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ */
+package org.apache.isis.applib.annotation;
+
+/**
+ * Whether the set of instances of a domain object is bounded or not.
+ */
+public enum Bounding {
+    BOUNDED,
+    UNBOUNDED,
+    NOT_SPECIFIED
+}
diff --git a/core/applib/src/main/java/org/apache/isis/applib/annotation/CommandReification.java b/core/applib/src/main/java/org/apache/isis/applib/annotation/CommandReification.java
index 03769b0..8128e63 100644
--- a/core/applib/src/main/java/org/apache/isis/applib/annotation/CommandReification.java
+++ b/core/applib/src/main/java/org/apache/isis/applib/annotation/CommandReification.java
@@ -43,5 +43,10 @@ public enum CommandReification {
     /**
      * Do not handle the action as a command, irrespective of any configuration settings.
      */
-    DISABLED
+    DISABLED,
+    /**
+     * Ignore the value provided by this annotation (meaning that the framework will keep searching, in meta
+     * annotations or superclasses/interfaces).
+     */
+    NOT_SPECIFIED
 }
diff --git a/core/applib/src/main/java/org/apache/isis/applib/annotation/DomainObject.java b/core/applib/src/main/java/org/apache/isis/applib/annotation/DomainObject.java
index afee19d..e509b34 100644
--- a/core/applib/src/main/java/org/apache/isis/applib/annotation/DomainObject.java
+++ b/core/applib/src/main/java/org/apache/isis/applib/annotation/DomainObject.java
@@ -96,8 +96,13 @@ public @interface DomainObject {
      * <p>
      *     Takes precedence over auto-complete.
      * </p>
+     *
+     * <p>
+     *     Note: this replaces bounded=true|false prior to v2.x
+     * </p>
+     *
      */
-    boolean bounded() default false;
+    Bounding bounding() default Bounding.NOT_SPECIFIED;
 
 
     // //////////////////////////////////////
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/action/ActionAnnotationFacetFactory.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/action/ActionAnnotationFacetFactory.java
index 8e51ac6..6d41b6a 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/action/ActionAnnotationFacetFactory.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/action/ActionAnnotationFacetFactory.java
@@ -20,6 +20,7 @@
 package org.apache.isis.core.metamodel.facets.actions.action;
 
 import java.lang.reflect.Method;
+import java.util.List;
 
 import org.apache.isis.applib.annotation.Action;
 import org.apache.isis.applib.services.HasTransactionId;
@@ -100,7 +101,7 @@ public class ActionAnnotationFacetFactory extends FacetFactoryAbstract {
             //
             // Set up ActionDomainEventFacet, which will act as the hiding/disabling/validating advisor
             //
-            final Action action = Annotations.getAnnotations(actionMethod, Action.class);
+            final List<Action> actions = Annotations.getAnnotations(actionMethod, Action.class);
             final Class<? extends ActionDomainEvent<?>> actionDomainEventType;
 
             final ActionDomainEventFacetAbstract actionDomainEventFacet;
@@ -108,8 +109,8 @@ public class ActionAnnotationFacetFactory extends FacetFactoryAbstract {
 
 
             // search for @Action(domainEvent=...)
-            if(action != null) {
-                actionDomainEventType = action.domainEvent();
+            if(actions != null) {
+                actionDomainEventType = actions.domainEvent();
                 actionDomainEventFacet = new ActionDomainEventFacetForActionAnnotation(
                         actionDomainEventType, servicesInjector, getSpecificationLoader(), holder);
             } else
@@ -131,7 +132,7 @@ public class ActionAnnotationFacetFactory extends FacetFactoryAbstract {
             // emit the appropriate domain event and then delegate onto the underlying
 
             final ActionInvocationFacetForDomainEventAbstract actionInvocationFacet;
-            if (action != null) {
+            if (actions != null) {
                 actionInvocationFacet = new ActionInvocationFacetForDomainEventFromActionAnnotation(
                         actionDomainEventType, actionMethod, typeSpec, returnSpec, holder,
                         servicesInjector
@@ -156,8 +157,8 @@ public class ActionAnnotationFacetFactory extends FacetFactoryAbstract {
         final FacetHolder holder = processMethodContext.getFacetHolder();
 
         // search for @Action(hidden=...)
-        final Action action = Annotations.getAnnotations(method, Action.class);
-        HiddenFacet facet = HiddenFacetForActionAnnotation.create(action, holder);
+        final List<Action> actions = Annotations.getAnnotations(method, Action.class);
+        HiddenFacet facet = HiddenFacetForActionAnnotation.create(actions, holder);
         FacetUtil.addFacet(facet);
     }
 
@@ -166,8 +167,8 @@ public class ActionAnnotationFacetFactory extends FacetFactoryAbstract {
         final FacetHolder holder = processMethodContext.getFacetHolder();
 
         // search for @Action(restrictTo=...)
-        final Action action = Annotations.getAnnotations(method, Action.class);
-        PrototypeFacet facet = PrototypeFacetForActionAnnotation.create(action, holder,
+        final List<Action> actions = Annotations.getAnnotations(method, Action.class);
+        PrototypeFacet facet = PrototypeFacetForActionAnnotation.create(actions, holder,
                 getDeploymentCategory());
 
         FacetUtil.addFacet(facet);
@@ -178,9 +179,9 @@ public class ActionAnnotationFacetFactory extends FacetFactoryAbstract {
         final FacetHolder holder = processMethodContext.getFacetHolder();
 
         // check for @Action(semantics=...)
-        final Action action = Annotations.getAnnotations(method, Action.class);
+        final List<Action> actions = Annotations.getAnnotations(method, Action.class);
         ActionSemanticsFacet facet =
-                ActionSemanticsFacetForActionAnnotation.create(action, holder);
+                ActionSemanticsFacetForActionAnnotation.create(actions, holder);
 
         // else fallback
         if(facet == null) {
@@ -192,11 +193,11 @@ public class ActionAnnotationFacetFactory extends FacetFactoryAbstract {
 
     void processBulk(final ProcessMethodContext processMethodContext) {
         final Method method = processMethodContext.getMethod();
-        final Action action = Annotations.getAnnotations(method, Action.class);
+        final List<Action> actions = Annotations.getAnnotations(method, Action.class);
         final FacetHolder holder = processMethodContext.getFacetHolder();
 
         // check for @Action(invokeOn=...)
-        BulkFacet facet = BulkFacetForActionAnnotation.create(action, holder);
+        BulkFacet facet = BulkFacetForActionAnnotation.create(actions, holder);
 
         // fallback
         if(facet == null) {
@@ -210,7 +211,7 @@ public class ActionAnnotationFacetFactory extends FacetFactoryAbstract {
 
         final Class<?> cls = processMethodContext.getCls();
         final Method method = processMethodContext.getMethod();
-        final Action action = Annotations.getAnnotations(method, Action.class);
+        final List<Action> actions = Annotations.getAnnotations(method, Action.class);
         final FacetedMethod facetHolder = processMethodContext.getFacetHolder();
 
         final FacetHolder holder = facetHolder;
@@ -225,7 +226,7 @@ public class ActionAnnotationFacetFactory extends FacetFactoryAbstract {
         }
 
         // check for @Action(command=...)
-        CommandFacet commandFacet = CommandFacetForActionAnnotation.create(action, getConfiguration(), holder);
+        CommandFacet commandFacet = CommandFacetForActionAnnotation.create(actions, getConfiguration(), holder);
 
         FacetUtil.addFacet(commandFacet);
     }
@@ -233,7 +234,7 @@ public class ActionAnnotationFacetFactory extends FacetFactoryAbstract {
     void processPublishing(final ProcessMethodContext processMethodContext) {
 
         final Method method = processMethodContext.getMethod();
-        final Action action = Annotations.getAnnotations(method, Action.class);
+        final List<Action> actions = Annotations.getAnnotations(method, Action.class);
         final FacetHolder holder = processMethodContext.getFacetHolder();
 
         //
@@ -247,7 +248,7 @@ public class ActionAnnotationFacetFactory extends FacetFactoryAbstract {
         }
 
         // check for @Action(publishing=...)
-        PublishedActionFacet facet = PublishedActionFacetForActionAnnotation.create(action, getConfiguration(), holder);
+        PublishedActionFacet facet = PublishedActionFacetForActionAnnotation.create(actions, getConfiguration(), holder);
 
         FacetUtil.addFacet(facet);
     }
@@ -264,9 +265,9 @@ public class ActionAnnotationFacetFactory extends FacetFactoryAbstract {
 
         // check for @Action(typeOf=...)
         TypeOfFacet typeOfFacet = null;
-        final Action action = Annotations.getAnnotations(method, Action.class);
-        if (action != null) {
-            final Class<?> typeOf = action.typeOf();
+        final List<Action> actions = Annotations.getAnnotations(method, Action.class);
+        if (actions != null) {
+            final Class<?> typeOf = actions.typeOf();
             if(typeOf != null && typeOf != Object.class) {
                 typeOfFacet = new TypeOfFacetForActionAnnotation(typeOf, getSpecificationLoader(), holder);
             }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/action/bulk/BulkFacetForActionAnnotation.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/action/bulk/BulkFacetForActionAnnotation.java
index b9ac18e..931199d 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/action/bulk/BulkFacetForActionAnnotation.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/action/bulk/BulkFacetForActionAnnotation.java
@@ -19,6 +19,8 @@
 
 package org.apache.isis.core.metamodel.facets.actions.action.bulk;
 
+import java.util.List;
+
 import org.apache.isis.applib.annotation.Action;
 import org.apache.isis.applib.annotation.InvokeOn;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
@@ -27,7 +29,7 @@ import org.apache.isis.core.metamodel.facets.actions.bulk.BulkFacetAbstract;
 
 public class BulkFacetForActionAnnotation extends BulkFacetAbstract {
 
-    public static BulkFacet create(final Action action, final FacetHolder holder) {
+    public static BulkFacet create(final List<Action> action, final FacetHolder holder) {
 
         if(action == null) {
             return null;
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/action/command/CommandFacetForActionAnnotation.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/action/command/CommandFacetForActionAnnotation.java
index 287cf07..499b411 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/action/command/CommandFacetForActionAnnotation.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/action/command/CommandFacetForActionAnnotation.java
@@ -18,6 +18,8 @@
  */
 package org.apache.isis.core.metamodel.facets.actions.action.command;
 
+import java.util.List;
+
 import org.apache.isis.applib.annotation.Action;
 import org.apache.isis.applib.annotation.CommandExecuteIn;
 import org.apache.isis.applib.annotation.CommandPersistence;
@@ -31,46 +33,68 @@ import org.apache.isis.core.metamodel.facets.actions.semantics.ActionSemanticsFa
 public class CommandFacetForActionAnnotation extends CommandFacetAbstract {
 
     public static CommandFacet create(
-            final Action action,
+            final List<Action> actions,
             final IsisConfiguration configuration,
             final FacetHolder holder) {
 
-        final CommandReification command = action != null ? action.command() : CommandReification.AS_CONFIGURED;
-        final CommandPersistence commandPersistence = action != null ? action.commandPersistence() : CommandPersistence.PERSISTED;
-        final CommandExecuteIn commandExecuteIn = action != null? action.commandExecuteIn() :  CommandExecuteIn.FOREGROUND;
+        final CommandActionsConfiguration setting = CommandActionsConfiguration.parse(configuration);
+
+        return actions.stream()
+                .filter(action -> action.command() != CommandReification.NOT_SPECIFIED)
+                .findFirst()
+                .map(action -> {
 
-        final CommandPersistence persistence = commandPersistence;
-        final CommandExecuteIn executeIn = commandExecuteIn;
+                    final CommandReification command = action.command();
+                    final CommandPersistence persistence = action.commandPersistence();
+                    final CommandExecuteIn executeIn = action.commandExecuteIn();
 
-        switch (command) {
-            case AS_CONFIGURED:
-                final CommandActionsConfiguration setting = CommandActionsConfiguration.parse(configuration);
-                switch (setting) {
+                    switch (command) {
+                    case AS_CONFIGURED:
+                        switch (setting) {
+                        case NONE:
+                            return null;
+                        case IGNORE_SAFE:
+                            if (hasSafeSemantics(holder)) {
+                                return null;
+                            }
+                            // else fall through
+                        default:
+                            return (CommandFacet)new CommandFacetForActionAnnotationAsConfigured(
+                                    persistence, executeIn, Enablement.ENABLED, holder);
+                        }
+                    case DISABLED:
+                        return null;
+                    case ENABLED:
+                        return new CommandFacetForActionAnnotation(persistence, executeIn, Enablement.ENABLED, holder);
+                    }
+                    throw new IllegalStateException("command '" + command + "' not recognised");
+                })
+                .orElseGet(() -> {
+                    switch (setting) {
                     case NONE:
                         return null;
                     case IGNORE_SAFE:
-                        final ActionSemanticsFacet actionSemanticsFacet = holder.getFacet(ActionSemanticsFacet.class);
-                        if(actionSemanticsFacet == null) {
-                            throw new IllegalStateException("Require ActionSemanticsFacet in order to process");
-                        }
-                        if(actionSemanticsFacet.value().isSafeInNature()) {
-                            return  null;
+                        if (hasSafeSemantics(holder)) {
+                            return null;
                         }
                         // else fall through
                     default:
-                        return action != null
-                                ? new CommandFacetForActionAnnotationAsConfigured(persistence, executeIn, Enablement.ENABLED, holder)
-                                : CommandFacetFromConfiguration.create(holder);
-                }
-            case DISABLED:
-                return null;
-            case ENABLED:
-                return new CommandFacetForActionAnnotation(persistence, executeIn, Enablement.ENABLED, holder);
-        }
+                        return CommandFacetFromConfiguration.create(holder);
+                    }
 
-        return null;
+                });
     }
 
+    private static boolean hasSafeSemantics(final FacetHolder holder) {
+        final ActionSemanticsFacet actionSemanticsFacet = holder.getFacet(ActionSemanticsFacet.class);
+        if(actionSemanticsFacet == null) {
+            throw new IllegalStateException("Require ActionSemanticsFacet in order to process");
+        }
+        if(actionSemanticsFacet.value().isSafeInNature()) {
+            return true;
+        }
+        return false;
+    }
 
     CommandFacetForActionAnnotation(
             final CommandPersistence persistence,
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/action/hidden/HiddenFacetForActionAnnotation.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/action/hidden/HiddenFacetForActionAnnotation.java
index 61c2477..fbe55f5 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/action/hidden/HiddenFacetForActionAnnotation.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/action/hidden/HiddenFacetForActionAnnotation.java
@@ -19,6 +19,8 @@
 
 package org.apache.isis.core.metamodel.facets.actions.action.hidden;
 
+import java.util.List;
+
 import org.apache.isis.applib.annotation.Action;
 import org.apache.isis.applib.annotation.Where;
 import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
@@ -29,7 +31,7 @@ import org.apache.isis.core.metamodel.facets.members.hidden.HiddenFacetAbstract;
 public class HiddenFacetForActionAnnotation extends HiddenFacetAbstract {
 
     public static HiddenFacet create(
-            final Action action,
+            final List<Action> action,
             final FacetHolder holder) {
 
         if (action == null) {
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/action/prototype/PrototypeFacetForActionAnnotation.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/action/prototype/PrototypeFacetForActionAnnotation.java
index edf8d79..00f4d9f 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/action/prototype/PrototypeFacetForActionAnnotation.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/action/prototype/PrototypeFacetForActionAnnotation.java
@@ -19,6 +19,8 @@
 
 package org.apache.isis.core.metamodel.facets.actions.action.prototype;
 
+import java.util.List;
+
 import org.apache.isis.applib.annotation.Action;
 import org.apache.isis.applib.annotation.RestrictTo;
 import org.apache.isis.core.metamodel.deployment.DeploymentCategory;
@@ -29,13 +31,16 @@ import org.apache.isis.core.metamodel.facets.actions.prototype.PrototypeFacetAbs
 public class PrototypeFacetForActionAnnotation extends PrototypeFacetAbstract {
 
     public static PrototypeFacet create(
-            final Action action,
+            final List<Action> actions,
             final FacetHolder holder,
             final DeploymentCategory deploymentCategory) {
 
-        return action == null || action.restrictTo() == RestrictTo.NO_RESTRICTIONS
-                ? null
-                : new PrototypeFacetForActionAnnotation(holder, deploymentCategory);
+        return actions.stream()
+                .map(Action::restrictTo)
+                .filter(restrictTo -> restrictTo == RestrictTo.PROTOTYPING)
+                .findFirst()
+                .map(restrictTo -> new PrototypeFacetForActionAnnotation(holder, deploymentCategory))
+                .orElse(null);
 
     }
 
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/action/publishing/PublishedActionFacetForActionAnnotation.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/action/publishing/PublishedActionFacetForActionAnnotation.java
index 9ea448e..13fd010 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/action/publishing/PublishedActionFacetForActionAnnotation.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/action/publishing/PublishedActionFacetForActionAnnotation.java
@@ -19,6 +19,8 @@
 
 package org.apache.isis.core.metamodel.facets.actions.action.publishing;
 
+import java.util.List;
+
 import org.apache.isis.applib.annotation.Action;
 import org.apache.isis.applib.annotation.Publishing;
 import org.apache.isis.core.commons.config.IsisConfiguration;
@@ -30,44 +32,63 @@ import org.apache.isis.core.metamodel.facets.actions.semantics.ActionSemanticsFa
 public class PublishedActionFacetForActionAnnotation extends PublishedActionFacetAbstract {
 
     public static PublishedActionFacet create(
-            final Action action,
+            final List<Action> actions,
             final IsisConfiguration configuration,
             final FacetHolder holder) {
 
-        final Publishing publishing = action != null ? action.publishing() : Publishing.AS_CONFIGURED;
+        final PublishActionsConfiguration setting = PublishActionsConfiguration.parse(configuration);
 
-        switch (publishing) {
-            case AS_CONFIGURED:
+        return actions.stream()
+                .map(Action::publishing)
+                .filter(publishing -> publishing != Publishing.NOT_SPECIFIED)
+                .findFirst()
+                .map(publishing -> {
+                    switch (publishing) {
+                    case AS_CONFIGURED:
 
-                final PublishActionsConfiguration setting = PublishActionsConfiguration.parse(configuration);
-                switch (setting) {
+                        switch (setting) {
+                        case NONE:
+                            return null;
+                        case IGNORE_SAFE:
+                            if (hasSafeSemantics(holder)) {
+                                return null;
+                            }
+                            // else fall through
+                        default:
+                            return (PublishedActionFacet)new PublishedActionFacetForActionAnnotationAsConfigured(holder);
+                        }
+                    case DISABLED:
+                        return null;
+                    case ENABLED:
+                        return new PublishedActionFacetForActionAnnotation(holder);
+                    }
+                    throw new IllegalStateException("publishing '" + publishing + "' not recognised");
+                })
+                .orElseGet(() -> {
+                    switch (setting) {
                     case NONE:
                         return null;
                     case IGNORE_SAFE:
-                        final ActionSemanticsFacet actionSemanticsFacet = holder.getFacet(ActionSemanticsFacet.class);
-                        if(actionSemanticsFacet == null) {
-                            throw new IllegalStateException("Require ActionSemanticsFacet in order to process");
-                        }
-
-                        if(actionSemanticsFacet.value().isSafeInNature()) {
-                            return  null;
+                        if (hasSafeSemantics(holder)) {
+                            return null;
                         }
                         // else fall through
                     default:
-                        return action != null
-                                ? new PublishedActionFacetForActionAnnotationAsConfigured(holder)
-                                : new PublishedActionFacetFromConfiguration(holder);
-                }
-            case DISABLED:
-                return null;
-            case ENABLED:
-                return new PublishedActionFacetForActionAnnotation(holder);
-        }
-        return null;
+                        return new PublishedActionFacetFromConfiguration(holder);
+                    }
+                });
     }
 
+    private static boolean hasSafeSemantics(final FacetHolder holder) {
+        final ActionSemanticsFacet actionSemanticsFacet = holder.getFacet(ActionSemanticsFacet.class);
+        if(actionSemanticsFacet == null) {
+            throw new IllegalStateException("Require ActionSemanticsFacet in order to process");
+        }
+
+        return actionSemanticsFacet.value().isSafeInNature();
+    }
 
-    public PublishedActionFacetForActionAnnotation(
+    PublishedActionFacetForActionAnnotation(
             final FacetHolder holder) {
         super(holder);
     }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/action/semantics/ActionSemanticsFacetForActionAnnotation.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/action/semantics/ActionSemanticsFacetForActionAnnotation.java
index 01b1204..6f7bd16 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/action/semantics/ActionSemanticsFacetForActionAnnotation.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/action/semantics/ActionSemanticsFacetForActionAnnotation.java
@@ -19,6 +19,8 @@
 
 package org.apache.isis.core.metamodel.facets.actions.action.semantics;
 
+import java.util.List;
+
 import org.apache.isis.applib.annotation.Action;
 import org.apache.isis.applib.annotation.SemanticsOf;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
@@ -28,7 +30,7 @@ import org.apache.isis.core.metamodel.facets.actions.semantics.ActionSemanticsFa
 public class ActionSemanticsFacetForActionAnnotation extends ActionSemanticsFacetAbstract {
 
     public static ActionSemanticsFacet create(
-            final Action action,
+            final List<Action> action,
             final FacetHolder holder) {
 
         if(action == null) {
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/layout/CollectionLayoutFacetFactory.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/layout/CollectionLayoutFacetFactory.java
index 090c9cb..b04599e 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/layout/CollectionLayoutFacetFactory.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/layout/CollectionLayoutFacetFactory.java
@@ -19,6 +19,7 @@
 package org.apache.isis.core.metamodel.facets.collections.layout;
 
 
+import java.util.List;
 import java.util.Properties;
 import org.apache.isis.applib.annotation.CollectionLayout;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
@@ -48,62 +49,43 @@ public class CollectionLayoutFacetFactory extends FacetFactoryAbstract implement
         final FacetHolder holder = processMethodContext.getFacetHolder();
 
         Properties properties = null;
-        final CollectionLayout collectionLayout = Annotations.getAnnotations(processMethodContext.getMethod(), CollectionLayout.class);
+        final List<CollectionLayout> collectionLayouts = Annotations.getAnnotations(processMethodContext.getMethod(), CollectionLayout.class);
 
 
         // cssClass
-        CssClassFacet cssClassFacet = null;
-        if(cssClassFacet == null) {
-            cssClassFacet = CssClassFacetForCollectionLayoutAnnotation.create(collectionLayout, holder);
-        }
+        CssClassFacet cssClassFacet = CssClassFacetForCollectionLayoutAnnotation.create(collectionLayouts, holder);
         FacetUtil.addFacet(cssClassFacet);
 
 
         // describedAs
-        DescribedAsFacet describedAsFacet = null;
-        if(describedAsFacet == null) {
-            describedAsFacet = DescribedAsFacetForCollectionLayoutAnnotation.create(collectionLayout, holder);
-        }
+        DescribedAsFacet describedAsFacet =
+                DescribedAsFacetForCollectionLayoutAnnotation.create(collectionLayouts, holder);
         FacetUtil.addFacet(describedAsFacet);
 
 
         // hidden
-        HiddenFacet hiddenFacet = null;
-        if(hiddenFacet == null) {
-            hiddenFacet = HiddenFacetForCollectionLayoutAnnotation.create(collectionLayout, holder);
-        }
+        HiddenFacet hiddenFacet = HiddenFacetForCollectionLayoutAnnotation.create(collectionLayouts, holder);
         FacetUtil.addFacet(hiddenFacet);
 
 
         // defaultView
-        DefaultViewFacet defaultViewFacet = null;
-        if(defaultViewFacet == null) {
-            defaultViewFacet = DefaultViewFacetForCollectionLayoutAnnotation.create(collectionLayout, holder);
-        }
+        DefaultViewFacet defaultViewFacet =
+                DefaultViewFacetForCollectionLayoutAnnotation.create(collectionLayouts, holder);
         FacetUtil.addFacet(defaultViewFacet);
         
 
         // named
-        NamedFacet namedFacet = null;
-        if(namedFacet == null) {
-            namedFacet = NamedFacetForCollectionLayoutAnnotation.create(collectionLayout, holder);
-        }
+        NamedFacet namedFacet = NamedFacetForCollectionLayoutAnnotation.create(collectionLayouts, holder);
         FacetUtil.addFacet(namedFacet);
 
 
         // paged
-        PagedFacet pagedFacet = null;
-        if(pagedFacet == null) {
-            pagedFacet = PagedFacetForCollectionLayoutAnnotation.create(collectionLayout, holder);
-        }
+        PagedFacet pagedFacet = PagedFacetForCollectionLayoutAnnotation.create(collectionLayouts, holder);
         FacetUtil.addFacet(pagedFacet);
 
 
         // sortedBy
-        SortedByFacet sortedByFacet = null;
-        if(sortedByFacet == null) {
-            sortedByFacet = SortedByFacetForCollectionLayoutAnnotation.create(collectionLayout, holder);
-        }
+        SortedByFacet sortedByFacet = SortedByFacetForCollectionLayoutAnnotation.create(collectionLayouts, holder);
         FacetUtil.addFacet(sortedByFacet);
 
     }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/layout/CssClassFacetForCollectionLayoutAnnotation.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/layout/CssClassFacetForCollectionLayoutAnnotation.java
index 8fd55ef..3aeac3d 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/layout/CssClassFacetForCollectionLayoutAnnotation.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/layout/CssClassFacetForCollectionLayoutAnnotation.java
@@ -19,6 +19,9 @@
 
 package org.apache.isis.core.metamodel.facets.collections.layout;
 
+import java.util.List;
+import java.util.Objects;
+
 import com.google.common.base.Strings;
 import org.apache.isis.applib.annotation.CollectionLayout;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
@@ -27,12 +30,15 @@ import org.apache.isis.core.metamodel.facets.members.cssclass.CssClassFacetAbstr
 
 public class CssClassFacetForCollectionLayoutAnnotation extends CssClassFacetAbstract {
 
-    public static CssClassFacet create(CollectionLayout collectionLayout, FacetHolder holder) {
-        if(collectionLayout == null) {
-            return null;
-        }
-        final String cssClass = Strings.emptyToNull(collectionLayout.cssClass());
-        return cssClass != null ? new CssClassFacetForCollectionLayoutAnnotation(cssClass, holder) : null;
+    public static CssClassFacet create(List<CollectionLayout> collectionLayouts, FacetHolder holder) {
+
+        return collectionLayouts.stream()
+                .map(CollectionLayout::cssClass)
+                .map(Strings::emptyToNull)
+                .filter(Objects::nonNull)
+                .findFirst()
+                .map(cssClass -> new CssClassFacetForCollectionLayoutAnnotation(cssClass, holder))
+                .orElse(null);
     }
 
     private CssClassFacetForCollectionLayoutAnnotation(String value, FacetHolder holder) {
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/layout/DefaultViewFacetForCollectionLayoutAnnotation.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/layout/DefaultViewFacetForCollectionLayoutAnnotation.java
index 63c55d1..2a5aee4 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/layout/DefaultViewFacetForCollectionLayoutAnnotation.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/layout/DefaultViewFacetForCollectionLayoutAnnotation.java
@@ -19,6 +19,8 @@
 
 package org.apache.isis.core.metamodel.facets.collections.layout;
 
+import java.util.List;
+
 import com.google.common.base.Strings;
 
 import org.apache.isis.applib.annotation.CollectionLayout;
@@ -32,7 +34,7 @@ public class DefaultViewFacetForCollectionLayoutAnnotation extends DefaultViewFa
         super(value, holder);
     }
 
-    public static DefaultViewFacet create(CollectionLayout collectionLayout, FacetHolder holder) {
+    public static DefaultViewFacet create(List<CollectionLayout> collectionLayout, FacetHolder holder) {
         if (collectionLayout == null) {
             return null;
         }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/layout/DescribedAsFacetForCollectionLayoutAnnotation.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/layout/DescribedAsFacetForCollectionLayoutAnnotation.java
index dbbd728..f492803 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/layout/DescribedAsFacetForCollectionLayoutAnnotation.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/layout/DescribedAsFacetForCollectionLayoutAnnotation.java
@@ -19,6 +19,9 @@
 
 package org.apache.isis.core.metamodel.facets.collections.layout;
 
+import java.util.List;
+import java.util.Objects;
+
 import com.google.common.base.Strings;
 import org.apache.isis.applib.annotation.CollectionLayout;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
@@ -27,12 +30,15 @@ import org.apache.isis.core.metamodel.facets.all.describedas.DescribedAsFacetAbs
 
 public class DescribedAsFacetForCollectionLayoutAnnotation extends DescribedAsFacetAbstract {
 
-    public static DescribedAsFacet create(CollectionLayout collectionLayout, FacetHolder holder) {
-        if(collectionLayout == null) {
-            return null;
-        }
-        final String describedAs = Strings.emptyToNull(collectionLayout.describedAs());
-        return describedAs != null ? new DescribedAsFacetForCollectionLayoutAnnotation(describedAs, holder) : null;
+    public static DescribedAsFacet create(List<CollectionLayout> collectionLayouts, FacetHolder holder) {
+
+        return collectionLayouts.stream()
+                .map(CollectionLayout::describedAs)
+                .map(Strings::emptyToNull)
+                .filter(Objects::nonNull)
+                .findFirst()
+                .map(describedAs -> new DescribedAsFacetForCollectionLayoutAnnotation(describedAs, holder))
+                .orElse(null);
     }
 
     private DescribedAsFacetForCollectionLayoutAnnotation(String value, FacetHolder holder) {
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/layout/HiddenFacetForCollectionLayoutAnnotation.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/layout/HiddenFacetForCollectionLayoutAnnotation.java
index 787c095..713712b 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/layout/HiddenFacetForCollectionLayoutAnnotation.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/layout/HiddenFacetForCollectionLayoutAnnotation.java
@@ -19,6 +19,9 @@
 
 package org.apache.isis.core.metamodel.facets.collections.layout;
 
+import java.util.List;
+import java.util.Objects;
+
 import org.apache.isis.applib.annotation.CollectionLayout;
 import org.apache.isis.applib.annotation.Where;
 import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
@@ -28,12 +31,14 @@ import org.apache.isis.core.metamodel.facets.members.hidden.HiddenFacetAbstract;
 
 public class HiddenFacetForCollectionLayoutAnnotation extends HiddenFacetAbstract {
 
-    public static HiddenFacet create(final CollectionLayout collectionLayout, final FacetHolder holder) {
-        if (collectionLayout == null) {
-            return null;
-        }
-        final Where where = collectionLayout.hidden();
-        return where != null && where != Where.NOT_SPECIFIED  ? new HiddenFacetForCollectionLayoutAnnotation(where, holder) : null;
+    public static HiddenFacet create(final List<CollectionLayout> collectionLayouts, final FacetHolder holder) {
+        return collectionLayouts.stream()
+                .map(CollectionLayout::hidden)
+                .filter(Objects::nonNull)
+                .filter(where -> where != Where.NOT_SPECIFIED)
+                .findFirst()
+                .map(where -> new HiddenFacetForCollectionLayoutAnnotation(where, holder))
+                .orElse(null);
     }
 
     private HiddenFacetForCollectionLayoutAnnotation(final Where where, final FacetHolder holder) {
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/layout/NamedFacetForCollectionLayoutAnnotation.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/layout/NamedFacetForCollectionLayoutAnnotation.java
index a3b0070..a7c71dd 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/layout/NamedFacetForCollectionLayoutAnnotation.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/layout/NamedFacetForCollectionLayoutAnnotation.java
@@ -19,6 +19,8 @@
 
 package org.apache.isis.core.metamodel.facets.collections.layout;
 
+import java.util.List;
+
 import com.google.common.base.Strings;
 import org.apache.isis.applib.annotation.CollectionLayout;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
@@ -27,12 +29,15 @@ import org.apache.isis.core.metamodel.facets.all.named.NamedFacetAbstract;
 
 public class NamedFacetForCollectionLayoutAnnotation extends NamedFacetAbstract {
 
-    public static NamedFacet create(CollectionLayout collectionLayout, FacetHolder holder) {
-        if(collectionLayout == null) {
-            return null;
-        }
-        final String named = Strings.emptyToNull(collectionLayout.named());
-        return named != null ? new NamedFacetForCollectionLayoutAnnotation(named, collectionLayout.namedEscaped(), holder) : null;
+    public static NamedFacet create(List<CollectionLayout> collectionLayouts, FacetHolder holder) {
+
+        return collectionLayouts.stream()
+                    .filter(collectionLayout -> Strings.emptyToNull(collectionLayout.named()) != null)
+                    .findFirst()
+                    .map(collectionLayout ->
+                            new NamedFacetForCollectionLayoutAnnotation(
+                                    collectionLayout.named(), collectionLayout.namedEscaped(), holder))
+                    .orElse(null);
     }
 
     private NamedFacetForCollectionLayoutAnnotation(
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/layout/PagedFacetForCollectionLayoutAnnotation.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/layout/PagedFacetForCollectionLayoutAnnotation.java
index b558e16..b9b114d 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/layout/PagedFacetForCollectionLayoutAnnotation.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/layout/PagedFacetForCollectionLayoutAnnotation.java
@@ -19,6 +19,8 @@
 
 package org.apache.isis.core.metamodel.facets.collections.layout;
 
+import java.util.List;
+
 import org.apache.isis.applib.annotation.CollectionLayout;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
 import org.apache.isis.core.metamodel.facets.object.paged.PagedFacet;
@@ -26,7 +28,7 @@ import org.apache.isis.core.metamodel.facets.object.paged.PagedFacetAbstract;
 
 public class PagedFacetForCollectionLayoutAnnotation extends PagedFacetAbstract {
 
-    public static PagedFacet create(CollectionLayout collectionLayout, FacetHolder holder) {
+    public static PagedFacet create(List<CollectionLayout> collectionLayout, FacetHolder holder) {
         if(collectionLayout == null) {
             return null;
         }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/layout/SortedByFacetForCollectionLayoutAnnotation.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/layout/SortedByFacetForCollectionLayoutAnnotation.java
index e988062..63c2f6d 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/layout/SortedByFacetForCollectionLayoutAnnotation.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/layout/SortedByFacetForCollectionLayoutAnnotation.java
@@ -20,6 +20,8 @@
 package org.apache.isis.core.metamodel.facets.collections.layout;
 
 import java.util.Comparator;
+import java.util.List;
+
 import org.apache.isis.applib.annotation.CollectionLayout;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
 import org.apache.isis.core.metamodel.facets.collections.sortedby.SortedByFacet;
@@ -27,7 +29,7 @@ import org.apache.isis.core.metamodel.facets.collections.sortedby.SortedByFacetA
 
 public class SortedByFacetForCollectionLayoutAnnotation extends SortedByFacetAbstract {
 
-    public static SortedByFacet create(CollectionLayout collectionLayout, FacetHolder holder) {
+    public static SortedByFacet create(List<CollectionLayout> collectionLayout, FacetHolder holder) {
         if(collectionLayout == null) {
             return null;
         }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/members/order/annotprop/MemberOrderFacetFactory.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/members/order/annotprop/MemberOrderFacetFactory.java
index 7c2a303..207c5d2 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/members/order/annotprop/MemberOrderFacetFactory.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/members/order/annotprop/MemberOrderFacetFactory.java
@@ -49,7 +49,7 @@ public class MemberOrderFacetFactory extends FacetFactoryAbstract implements Con
     }
 
     private MemberOrderFacet createFromAnnotationIfPossible(final ProcessMethodContext processMethodContext) {
-        final MemberOrder annotation = Annotations.getAnnotations(processMethodContext.getMethod(), MemberOrder.class);
+        final MemberOrder annotation = Annotations.getAnnotation(processMethodContext.getMethod(), MemberOrder.class);
         if (annotation != null) {
             return new MemberOrderFacetAnnotation(
                     annotation.name(),
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobject/choices/ChoicesFacetForDomainObjectAnnotation.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobject/choices/ChoicesFacetForDomainObjectAnnotation.java
index 129d37d..5082254 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobject/choices/ChoicesFacetForDomainObjectAnnotation.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobject/choices/ChoicesFacetForDomainObjectAnnotation.java
@@ -21,6 +21,7 @@ package org.apache.isis.core.metamodel.facets.object.domainobject.choices;
 
 import java.util.List;
 
+import org.apache.isis.applib.annotation.Bounding;
 import org.apache.isis.applib.annotation.DomainObject;
 import org.apache.isis.core.commons.authentication.AuthenticationSessionProvider;
 import org.apache.isis.core.metamodel.deployment.DeploymentCategory;
@@ -32,21 +33,22 @@ import org.apache.isis.core.metamodel.services.persistsession.PersistenceSession
 public class ChoicesFacetForDomainObjectAnnotation extends ChoicesFacetFromBoundedAbstract {
 
     public static Facet create(
-            final List<DomainObject> domainObject,
+            final List<DomainObject> domainObjects,
             final FacetHolder facetHolder,
             final DeploymentCategory deploymentCategory,
             final AuthenticationSessionProvider authenticationSessionProvider,
             final PersistenceSessionServiceInternal persistenceSessionServiceInternal) {
 
-        if(domainObject == null) {
-            return null;
-        }
-
-        final boolean bounded = domainObject.bounded();
-        return bounded
-                ? new ChoicesFacetForDomainObjectAnnotation(
-                    facetHolder, deploymentCategory, authenticationSessionProvider, persistenceSessionServiceInternal)
-                : null;
+        return domainObjects.stream()
+                .map(DomainObject::bounding)
+                .filter(bounding -> bounding != Bounding.NOT_SPECIFIED)
+                .findFirst()
+                .map(bounding -> bounding == Bounding.BOUNDED
+                        ? new ChoicesFacetForDomainObjectAnnotation(
+                                facetHolder, deploymentCategory,
+                                authenticationSessionProvider, persistenceSessionServiceInternal)
+                        : null
+                ).orElse(null);
     }
 
     private ChoicesFacetForDomainObjectAnnotation(
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobject/objectspecid/ObjectSpecIdFacetForDomainObjectAnnotation.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobject/objectspecid/ObjectSpecIdFacetForDomainObjectAnnotation.java
index 7930a9e..45f0214 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobject/objectspecid/ObjectSpecIdFacetForDomainObjectAnnotation.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobject/objectspecid/ObjectSpecIdFacetForDomainObjectAnnotation.java
@@ -20,6 +20,7 @@
 package org.apache.isis.core.metamodel.facets.object.domainobject.objectspecid;
 
 import java.util.List;
+import java.util.Objects;
 
 import com.google.common.base.Strings;
 import org.apache.isis.applib.annotation.DomainObject;
@@ -35,7 +36,8 @@ public class ObjectSpecIdFacetForDomainObjectAnnotation extends ObjectSpecIdFace
 
         return domainObjects.stream()
                 .map(DomainObject::objectType)
-                .filter(objectType -> !Strings.isNullOrEmpty(objectType))
+                .map(Strings::emptyToNull)
+                .filter(Objects::nonNull)
                 .findFirst()
                 .map(objectType -> new ObjectSpecIdFacetForDomainObjectAnnotation(objectType, holder))
                 .orElse(null);
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobject/publishing/PublishedObjectFacetForDomainObjectAnnotation.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobject/publishing/PublishedObjectFacetForDomainObjectAnnotation.java
index 2b8b494..94816e7 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobject/publishing/PublishedObjectFacetForDomainObjectAnnotation.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobject/publishing/PublishedObjectFacetForDomainObjectAnnotation.java
@@ -35,26 +35,29 @@ public class PublishedObjectFacetForDomainObjectAnnotation extends PublishedObje
             final IsisConfiguration configuration,
             final FacetHolder holder) {
 
-        final Publishing publishing = domainObjects != null ? domainObjects.publishing() : Publishing.AS_CONFIGURED;
+        final PublishObjectsConfiguration setting = PublishObjectsConfiguration.parse(configuration);
 
-        switch (publishing) {
-            case AS_CONFIGURED:
-
-                final PublishObjectsConfiguration setting = PublishObjectsConfiguration.parse(configuration);
-                switch (setting) {
-                    case NONE:
+        return domainObjects.stream()
+                .map(DomainObject::publishing)
+                .filter(publishing -> publishing != Publishing.NOT_SPECIFIED)
+                .findFirst()
+                .map(publishing -> {
+                    switch (publishing) {
+                    case AS_CONFIGURED:
+                        return setting == PublishObjectsConfiguration.NONE
+                                ? (PublishedObjectFacet)new PublishedObjectFacetForDomainObjectAnnotationAsConfigured(holder)
+                                : null;
+                    case DISABLED:
                         return null;
-                    default:
-                        return domainObjects != null
-                            ? new PublishedObjectFacetForDomainObjectAnnotationAsConfigured(holder)
-                            : new PublishedObjectFacetFromConfiguration(holder);
-                }
-            case DISABLED:
-                return null;
-            case ENABLED:
-                return new PublishedObjectFacetForDomainObjectAnnotation(holder);
-        }
-        return null;
+                    case ENABLED:
+                        return new PublishedObjectFacetForDomainObjectAnnotation(holder);
+                    }
+                    throw new IllegalStateException("domainObject.publishing() not recognised, is " + publishing);
+
+                }).orElseGet(() -> setting == PublishObjectsConfiguration.NONE
+                        ? null
+                        : new PublishedObjectFacetFromConfiguration(holder));
+
     }
 
     PublishedObjectFacetForDomainObjectAnnotation(final FacetHolder holder) {
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobjectlayout/CssClassFacetForViewModelLayoutAnnotation.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobjectlayout/CssClassFacetForViewModelLayoutAnnotation.java
index be518e7..22932ce 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobjectlayout/CssClassFacetForViewModelLayoutAnnotation.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobjectlayout/CssClassFacetForViewModelLayoutAnnotation.java
@@ -17,6 +17,7 @@
 package org.apache.isis.core.metamodel.facets.object.domainobjectlayout;
 
 import java.util.List;
+import java.util.Objects;
 
 import com.google.common.base.Strings;
 
@@ -27,12 +28,15 @@ import org.apache.isis.core.metamodel.facets.members.cssclass.CssClassFacetAbstr
 
 public class CssClassFacetForViewModelLayoutAnnotation extends CssClassFacetAbstract {
 
-    public static CssClassFacet create(final List<ViewModelLayout> viewModelLayout, final FacetHolder holder) {
-        if (viewModelLayout == null) {
-            return null;
-        }
-        final String cssClass = Strings.emptyToNull(viewModelLayout.cssClass());
-        return cssClass != null ? new CssClassFacetForViewModelLayoutAnnotation(cssClass, holder) : null;
+    public static CssClassFacet create(final List<ViewModelLayout> viewModelLayouts, final FacetHolder holder) {
+
+        return viewModelLayouts.stream()
+                .map(ViewModelLayout::cssClass)
+                .map(Strings::emptyToNull)
+                .filter(Objects::nonNull)
+                .findFirst()
+                .map(cssClass -> new CssClassFacetForViewModelLayoutAnnotation(cssClass, holder))
+                .orElse(null);
     }
 
     private CssClassFacetForViewModelLayoutAnnotation(
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobjectlayout/DescribedAsFacetForDomainObjectLayoutAnnotation.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobjectlayout/DescribedAsFacetForDomainObjectLayoutAnnotation.java
index 0e53e20..e040642 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobjectlayout/DescribedAsFacetForDomainObjectLayoutAnnotation.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobjectlayout/DescribedAsFacetForDomainObjectLayoutAnnotation.java
@@ -18,10 +18,11 @@
  */
 package org.apache.isis.core.metamodel.facets.object.domainobjectlayout;
 
-
 import java.util.List;
+import java.util.Objects;
 
 import com.google.common.base.Strings;
+
 import org.apache.isis.applib.annotation.DomainObjectLayout;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
 import org.apache.isis.core.metamodel.facets.all.describedas.DescribedAsFacet;
@@ -30,12 +31,15 @@ import org.apache.isis.core.metamodel.facets.all.describedas.DescribedAsFacetAbs
 
 public class DescribedAsFacetForDomainObjectLayoutAnnotation extends DescribedAsFacetAbstract {
 
-    public static DescribedAsFacet create(final List<DomainObjectLayout> domainObjectLayout, final FacetHolder holder) {
-        if(domainObjectLayout == null) {
-            return null;
-        }
-        final String describedAs = Strings.emptyToNull(domainObjectLayout.describedAs());
-        return describedAs != null ? new DescribedAsFacetForDomainObjectLayoutAnnotation(describedAs, holder) : null;
+    public static DescribedAsFacet create(final List<DomainObjectLayout> domainObjectLayouts, final FacetHolder holder) {
+
+        return domainObjectLayouts.stream()
+                .map(DomainObjectLayout::describedAs)
+                .map(Strings::emptyToNull)
+                .filter(Objects::nonNull)
+                .findFirst()
+                .map(describedAs -> new DescribedAsFacetForDomainObjectLayoutAnnotation(describedAs, holder))
+                .orElse(null);
     }
 
     private DescribedAsFacetForDomainObjectLayoutAnnotation(final String value, final FacetHolder holder) {
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobjectlayout/DescribedAsFacetForViewModelLayoutAnnotation.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobjectlayout/DescribedAsFacetForViewModelLayoutAnnotation.java
index 57999e9..4e526e3 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobjectlayout/DescribedAsFacetForViewModelLayoutAnnotation.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobjectlayout/DescribedAsFacetForViewModelLayoutAnnotation.java
@@ -20,6 +20,7 @@ package org.apache.isis.core.metamodel.facets.object.domainobjectlayout;
 
 
 import java.util.List;
+import java.util.Objects;
 
 import com.google.common.base.Strings;
 import org.apache.isis.applib.annotation.ViewModelLayout;
@@ -30,12 +31,15 @@ import org.apache.isis.core.metamodel.facets.all.describedas.DescribedAsFacetAbs
 
 public class DescribedAsFacetForViewModelLayoutAnnotation extends DescribedAsFacetAbstract {
 
-    public static DescribedAsFacet create(final List<ViewModelLayout> viewModelLayout, final FacetHolder holder) {
-        if(viewModelLayout == null) {
-            return null;
-        }
-        final String describedAs = Strings.emptyToNull(viewModelLayout.describedAs());
-        return describedAs != null ? new DescribedAsFacetForViewModelLayoutAnnotation(describedAs, holder) : null;
+    public static DescribedAsFacet create(final List<ViewModelLayout> viewModelLayouts, final FacetHolder holder) {
+
+        return viewModelLayouts.stream()
+                .map(ViewModelLayout::describedAs)
+                .map(Strings::emptyToNull)
+                .filter(Objects::nonNull)
+                .findFirst()
+                .map(describedAs -> new DescribedAsFacetForViewModelLayoutAnnotation(describedAs, holder))
+                .orElse(null);
     }
 
     private DescribedAsFacetForViewModelLayoutAnnotation(final String value, final FacetHolder holder) {
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobjectlayout/PagedFacetForDomainObjectLayoutAnnotation.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobjectlayout/PagedFacetForDomainObjectLayoutAnnotation.java
index 07ba4d3..84df88c 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobjectlayout/PagedFacetForDomainObjectLayoutAnnotation.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobjectlayout/PagedFacetForDomainObjectLayoutAnnotation.java
@@ -29,12 +29,13 @@ import org.apache.isis.core.metamodel.facets.object.paged.PagedFacetAbstract;
 
 public class PagedFacetForDomainObjectLayoutAnnotation extends PagedFacetAbstract {
 
-    public static PagedFacet create(final List<DomainObjectLayout> domainObjectLayout, final FacetHolder holder) {
-        if(domainObjectLayout == null) {
-            return null;
-        }
-        final int paged = domainObjectLayout.paged();
-        return paged > 1 ? new PagedFacetForDomainObjectLayoutAnnotation(paged, holder) : null;
+    public static PagedFacet create(final List<DomainObjectLayout> domainObjectLayouts, final FacetHolder holder) {
+        return domainObjectLayouts.stream()
+                .map(DomainObjectLayout::paged)
+                .filter(paged -> paged > 1)
+                .findFirst()
+                .map(paged -> new PagedFacetForDomainObjectLayoutAnnotation(paged, holder))
+                .orElse(null);
     }
 
     private PagedFacetForDomainObjectLayoutAnnotation(final int value, final FacetHolder holder) {
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/encodeable/annotcfg/EncodableFacetAnnotationElseConfigurationFactory.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/encodeable/annotcfg/EncodableFacetAnnotationElseConfigurationFactory.java
index caed1d4..d918960 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/encodeable/annotcfg/EncodableFacetAnnotationElseConfigurationFactory.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/encodeable/annotcfg/EncodableFacetAnnotationElseConfigurationFactory.java
@@ -52,7 +52,7 @@ public class EncodableFacetAnnotationElseConfigurationFactory extends FacetFacto
     private EncodableFacet create(final Class<?> cls, final FacetHolder holder) {
 
         // create from annotation, if present
-        final Encodable annotation = Annotations.getAnnotations(cls, Encodable.class);
+        final Encodable annotation = Annotations.getAnnotation(cls, Encodable.class);
         if (annotation != null) {
             final EncodableFacetAnnotation facet = new EncodableFacetAnnotation(cls, holder, servicesInjector);
             if (facet.isValid()) {
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/membergroups/annotprop/MemberGroupLayoutFacetFactory.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/membergroups/annotprop/MemberGroupLayoutFacetFactory.java
index 025699d..0b46def 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/membergroups/annotprop/MemberGroupLayoutFacetFactory.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/membergroups/annotprop/MemberGroupLayoutFacetFactory.java
@@ -57,7 +57,7 @@ public class MemberGroupLayoutFacetFactory extends FacetFactoryAbstract implemen
         
         final Class<?> cls = processClassContext.getCls();
 
-        final MemberGroupLayout mglAnnot = Annotations.getAnnotations(cls, MemberGroupLayout.class);
+        final MemberGroupLayout mglAnnot = Annotations.getAnnotation(cls, MemberGroupLayout.class);
         if (mglAnnot != null) {
             return new MemberGroupLayoutFacetAnnotation(mglAnnot, holder);
         }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/mixin/MixinFacetForDomainObjectAnnotation.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/mixin/MixinFacetForDomainObjectAnnotation.java
index 894319d..a0443ae 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/mixin/MixinFacetForDomainObjectAnnotation.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/mixin/MixinFacetForDomainObjectAnnotation.java
@@ -43,27 +43,29 @@ public class MixinFacetForDomainObjectAnnotation extends MixinFacetAbstract {
     }
 
     public static MixinFacet create(
-            final List<DomainObject> domainObject,
+            final List<DomainObject> domainObjects,
             final Class<?> candidateMixinType,
             final FacetHolder facetHolder,
             final ServicesInjector servicesInjector) {
-        if(domainObject == null) {
-            return null;
-        }
-        if(domainObject.nature() != Nature.MIXIN) {
-            return null;
-        }
-        final Constructor<?>[] constructors = candidateMixinType.getConstructors();
-        for (Constructor<?> constructor : constructors) {
-            final Class<?>[] constructorTypes = constructor.getParameterTypes();
-            if(constructorTypes.length != 1) {
-                continue;
-            }
-            final Class<?> constructorType = constructorTypes[0];
-            return new MixinFacetForDomainObjectAnnotation(candidateMixinType, domainObject.mixinMethod(), constructorType, facetHolder,
-                    servicesInjector);
-        }
-        return null;
+        return domainObjects.stream()
+                .filter(domainObject -> domainObject.nature() == Nature.MIXIN)
+                .findFirst()
+                .map(domainObject -> {
+                    final Constructor<?>[] constructors = candidateMixinType.getConstructors();
+                    for (Constructor<?> constructor : constructors) {
+                        final Class<?>[] constructorTypes = constructor.getParameterTypes();
+                        if(constructorTypes.length != 1) {
+                            continue;
+                        }
+                        final Class<?> constructorType = constructorTypes[0];
+                        return new MixinFacetForDomainObjectAnnotation(
+                                        candidateMixinType, domainObject.mixinMethod(), constructorType, facetHolder,
+                                        servicesInjector);
+                    }
+                    // else
+                    return null;
+                })
+                .orElse(null);
     }
 
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/parseable/annotcfg/ParseableFacetAnnotationElseConfigurationFactory.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/parseable/annotcfg/ParseableFacetAnnotationElseConfigurationFactory.java
index e3a0460..d663152 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/parseable/annotcfg/ParseableFacetAnnotationElseConfigurationFactory.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/parseable/annotcfg/ParseableFacetAnnotationElseConfigurationFactory.java
@@ -46,7 +46,7 @@ public class ParseableFacetAnnotationElseConfigurationFactory extends FacetFacto
     }
 
     private ParseableFacetAbstract create(final Class<?> cls, final FacetHolder holder) {
-        final Parseable annotation = Annotations.getAnnotations(cls, Parseable.class);
+        final Parseable annotation = Annotations.getAnnotation(cls, Parseable.class);
 
         // create from annotation, if present
         if (annotation != null) {
diff --git a/core/metamodel/src/main/java/org/apache/isis/objectstore/jdo/metamodel/facets/prop/column/BigDecimalDerivedFromJdoColumnAnnotationFacetFactory.java b/core/metamodel/src/main/java/org/apache/isis/objectstore/jdo/metamodel/facets/prop/column/BigDecimalDerivedFromJdoColumnAnnotationFacetFactory.java
index e1a5aa2..33190a8 100644
--- a/core/metamodel/src/main/java/org/apache/isis/objectstore/jdo/metamodel/facets/prop/column/BigDecimalDerivedFromJdoColumnAnnotationFacetFactory.java
+++ b/core/metamodel/src/main/java/org/apache/isis/objectstore/jdo/metamodel/facets/prop/column/BigDecimalDerivedFromJdoColumnAnnotationFacetFactory.java
@@ -65,7 +65,7 @@ public class BigDecimalDerivedFromJdoColumnAnnotationFacetFactory extends FacetF
 
         BigDecimalValueFacet existingFacet = (BigDecimalValueFacet) holder.getFacet(BigDecimalValueFacet.class);
 
-        final Column jdoColumnAnnotation = Annotations.getAnnotations(processMethodContext.getMethod(), Column.class);
+        final Column jdoColumnAnnotation = Annotations.getAnnotation(processMethodContext.getMethod(), Column.class);
 
         if (jdoColumnAnnotation == null) {
             if(existingFacet != null && !existingFacet.isNoop()) {

-- 
To stop receiving notification emails like this one, please contact
['"commits@isis.apache.org" <co...@isis.apache.org>'].