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 07:26:06 UTC

[isis] 03/03: ISIS-1632: converts a number of 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

commit cdcc0ce5197981bb5569730f77e6229600a35dd8
Author: Dan Haywood <da...@haywood-associates.co.uk>
AuthorDate: Fri Oct 27 08:25:47 2017 +0100

    ISIS-1632: converts a number of facet factories to handle Lists of annotations (WORK IN PROGRESS, CODE STILL DOES NOT COMPILE)
---
 .../apache/isis/applib/annotation/Auditing.java    |   7 +-
 .../org/apache/isis/applib/annotation/Editing.java |  12 +-
 .../apache/isis/applib/annotation/Publishing.java  |   7 +-
 .../DomainObjectAnnotationFacetFactory.java        | 317 +++++++++++----------
 .../AuditableFacetForDomainObjectAnnotation.java   |  38 ++-
 .../ChoicesFacetForDomainObjectAnnotation.java     |   4 +-
 .../ImmutableFacetForDomainObjectAnnotation.java   |  51 ++--
 ...ObjectSpecIdFacetForDomainObjectAnnotation.java |  19 +-
 ...lishedObjectFacetForDomainObjectAnnotation.java |   8 +-
 ...atableObjectFacetForDomainObjectAnnotation.java |  80 +++---
 ...PolicyFacetForDomainObjectLayoutAnnotation.java |  16 +-
 ...arkPolicyFacetForViewModelLayoutAnnotation.java |  14 +-
 ...lassFaFacetForDomainObjectLayoutAnnotation.java |  22 +-
 ...sClassFacetForDomainObjectLayoutAnnotation.java |  14 +-
 ...ObjectLayoutAnnotationUsingCssClassUiEvent.java |  33 ++-
 ...ainObjectLayoutAnnotationUsingTitleUiEvent.java |  32 +--
 .../mixin/MixinFacetForDomainObjectAnnotation.java |   3 +-
 .../facets/object/parseable/ParserUtil.java        |   2 +-
 .../value/vsp/ValueSemanticsProviderUtil.java      |   3 +-
 ...doPersistenceCapableAnnotationFacetFactory.java |   2 +-
 ...ndatoryFromJdoColumnAnnotationFacetFactory.java |   4 +-
 21 files changed, 370 insertions(+), 318 deletions(-)

diff --git a/core/applib/src/main/java/org/apache/isis/applib/annotation/Auditing.java b/core/applib/src/main/java/org/apache/isis/applib/annotation/Auditing.java
index 145cba0..283c859 100644
--- a/core/applib/src/main/java/org/apache/isis/applib/annotation/Auditing.java
+++ b/core/applib/src/main/java/org/apache/isis/applib/annotation/Auditing.java
@@ -37,5 +37,10 @@ public enum Auditing {
     /**
      * Do not audit changes to this object (even if otherwise configured to enable auditing).
      */
-    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/Editing.java b/core/applib/src/main/java/org/apache/isis/applib/annotation/Editing.java
index b452397..73bd187 100644
--- a/core/applib/src/main/java/org/apache/isis/applib/annotation/Editing.java
+++ b/core/applib/src/main/java/org/apache/isis/applib/annotation/Editing.java
@@ -36,10 +36,12 @@ public enum Editing {
     ENABLED,
     /**
      * Do not allow the properties to be edited, or the collections to be added to/removed from.
-     *
-     * <p>
-     *     Corresponds to the {@link Immutable} annotation).
-     * </p>
      */
-    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/Publishing.java b/core/applib/src/main/java/org/apache/isis/applib/annotation/Publishing.java
index 64f6638..78afcdc 100644
--- a/core/applib/src/main/java/org/apache/isis/applib/annotation/Publishing.java
+++ b/core/applib/src/main/java/org/apache/isis/applib/annotation/Publishing.java
@@ -37,5 +37,10 @@ public enum Publishing {
     /**
      * Do not publish changes to this object (even if otherwise configured to enable publishing).
      */
-    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/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobject/DomainObjectAnnotationFacetFactory.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobject/DomainObjectAnnotationFacetFactory.java
index fcf9b3d..429106e 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobject/DomainObjectAnnotationFacetFactory.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobject/DomainObjectAnnotationFacetFactory.java
@@ -20,7 +20,9 @@ package org.apache.isis.core.metamodel.facets.object.domainobject;
 
 import java.lang.reflect.Method;
 import java.util.Collection;
+import java.util.List;
 import java.util.Map;
+import java.util.stream.Collectors;
 
 import javax.annotation.PostConstruct;
 
@@ -111,7 +113,7 @@ public class DomainObjectAnnotationFacetFactory extends FacetFactoryAbstract
 
     void processAuditing(final ProcessClassContext processClassContext) {
         final Class<?> cls = processClassContext.getCls();
-        final DomainObject domainObject = Annotations.getAnnotations(cls, DomainObject.class);
+        final List<DomainObject> domainObjects = Annotations.getAnnotations(cls, DomainObject.class);
         final FacetHolder holder = processClassContext.getFacetHolder();
 
         //
@@ -127,7 +129,7 @@ public class DomainObjectAnnotationFacetFactory extends FacetFactoryAbstract
 
         // check for @DomainObject(auditing=....)
         AuditableFacet auditableFacet = AuditableFacetForDomainObjectAnnotation
-                .create(domainObject, getConfiguration(), holder);
+                .create(domainObjects, getConfiguration(), holder);
 
         // then add
         FacetUtil.addFacet(auditableFacet);
@@ -136,7 +138,7 @@ public class DomainObjectAnnotationFacetFactory extends FacetFactoryAbstract
 
     void processPublishing(final ProcessClassContext processClassContext) {
         final Class<?> cls = processClassContext.getCls();
-        final DomainObject domainObject = Annotations.getAnnotations(cls, DomainObject.class);
+        final List<DomainObject> domainObjects = Annotations.getAnnotations(cls, DomainObject.class);
         final FacetHolder facetHolder = processClassContext.getFacetHolder();
 
         //
@@ -150,7 +152,7 @@ public class DomainObjectAnnotationFacetFactory extends FacetFactoryAbstract
 
         // check from @DomainObject(publishing=...)
         PublishedObjectFacet publishedObjectFacet = PublishedObjectFacetForDomainObjectAnnotation
-                .create(domainObject, getConfiguration(), facetHolder);
+                .create(domainObjects, getConfiguration(), facetHolder);
 
         // then add
         FacetUtil.addFacet(publishedObjectFacet);
@@ -161,37 +163,41 @@ public class DomainObjectAnnotationFacetFactory extends FacetFactoryAbstract
         final FacetHolder facetHolder = processClassContext.getFacetHolder();
 
         // check from @DomainObject(auditing=...)
-        final DomainObject domainObjectAnnot = Annotations.getAnnotations(cls, DomainObject.class);
-        Facet facet = createFor(domainObjectAnnot, facetHolder, cls);
+        final List<DomainObject> domainObjects = Annotations.getAnnotations(cls, DomainObject.class);
+        Facet facet = createFor(domainObjects, facetHolder, cls);
 
         // then add
         FacetUtil.addFacet(facet);
     }
 
     private AutoCompleteFacet createFor(
-            final DomainObject domainObject,
+            final List<DomainObject> domainObjects,
             final FacetHolder facetHolder,
             final Class<?> cls) {
-        if(domainObject == null) {
+        if(domainObjects.isEmpty()) {
             return null;
         }
 
-        final Class<?> repositoryClass = domainObject.autoCompleteRepository();
-        if(repositoryClass == Object.class) {
-            return null;
-        }
-        final String actionName = domainObject.autoCompleteAction();
-
-        if(!isServiceType(cls, "@DomainObject", repositoryClass)) {
-            return null;
-        }
-        final Method repositoryMethod = findRepositoryMethod(cls, "@DomainObject", repositoryClass, actionName);
-        if(repositoryMethod == null) {
-            return null;
+        class Annot {
+            private Annot(final DomainObject domainObject) {
+                this.autoCompleteRepository = domainObject.autoCompleteRepository();
+                this.autoCompleteAction = domainObject.autoCompleteAction();
+            }
+            Class<?> autoCompleteRepository;
+            String autoCompleteAction;
+            Method repositoryMethod;
         }
 
-        return new AutoCompleteFacetForDomainObjectAnnotation(
-                        facetHolder, repositoryClass, repositoryMethod, servicesInjector);
+        return domainObjects.stream()
+                .map(Annot::new)
+                .filter(a -> a.autoCompleteRepository != Object.class)
+                .filter(a -> isServiceType(cls, "@DomainObject", a.autoCompleteRepository))
+                .peek(a -> a.repositoryMethod = findRepositoryMethod(cls, "@DomainObject", a.autoCompleteRepository, a.autoCompleteAction))
+                .filter(a -> a.repositoryMethod == null)
+                .findFirst()
+                .map(a -> new AutoCompleteFacetForDomainObjectAnnotation(
+                        facetHolder, a.autoCompleteRepository, a.repositoryMethod, servicesInjector))
+                .orElse(null);
     }
 
     private boolean isServiceType(
@@ -229,11 +235,11 @@ public class DomainObjectAnnotationFacetFactory extends FacetFactoryAbstract
 
     void processBounded(final ProcessClassContext processClassContext) {
         final Class<?> cls = processClassContext.getCls();
-        final DomainObject domainObject = Annotations.getAnnotations(cls, DomainObject.class);
+        final List<DomainObject> domainObjects = Annotations.getAnnotations(cls, DomainObject.class);
         final FacetHolder facetHolder = processClassContext.getFacetHolder();
 
         // check from @DomainObject(bounded=...)
-        Facet facet = ChoicesFacetForDomainObjectAnnotation.create(domainObject, facetHolder, getDeploymentCategory(), getAuthenticationSessionProvider(), persistenceSessionServiceInternal);
+        Facet facet = ChoicesFacetForDomainObjectAnnotation.create(domainObjects, facetHolder, getDeploymentCategory(), getAuthenticationSessionProvider(), persistenceSessionServiceInternal);
 
         // then add
         FacetUtil.addFacet(facet);
@@ -241,12 +247,12 @@ public class DomainObjectAnnotationFacetFactory extends FacetFactoryAbstract
 
     void processEditing(final ProcessClassContext processClassContext) {
         final Class<?> cls = processClassContext.getCls();
-        final DomainObject domainObject = Annotations.getAnnotations(cls, DomainObject.class);
+        final List<DomainObject> domainObjects = Annotations.getAnnotations(cls, DomainObject.class);
         final FacetHolder facetHolder = processClassContext.getFacetHolder();
 
         // check from @DomainObject(editing=...)
         ImmutableFacet facet = ImmutableFacetForDomainObjectAnnotation
-                .create(domainObject, getConfiguration(), facetHolder);
+                .create(domainObjects, getConfiguration(), facetHolder);
 
         // then add
         FacetUtil.addFacet(facet);
@@ -254,11 +260,11 @@ public class DomainObjectAnnotationFacetFactory extends FacetFactoryAbstract
 
     void processObjectType(final ProcessClassContext processClassContext) {
         final Class<?> cls = processClassContext.getCls();
-        final DomainObject domainObject = Annotations.getAnnotations(cls, DomainObject.class);
+        final List<DomainObject> domainObjects = Annotations.getAnnotations(cls, DomainObject.class);
         final FacetHolder facetHolder = processClassContext.getFacetHolder();
 
         // check from @DomainObject(objectType=...)
-        Facet facet = ObjectSpecIdFacetForDomainObjectAnnotation.create(domainObject, facetHolder);
+        Facet facet = ObjectSpecIdFacetForDomainObjectAnnotation.create(domainObjects, facetHolder);
 
         // else check for @PersistenceCapable(schema=...)
         if(facet == null) {
@@ -275,9 +281,9 @@ public class DomainObjectAnnotationFacetFactory extends FacetFactoryAbstract
 
     void processNature(final ProcessClassContext processClassContext) {
         final Class<?> cls = processClassContext.getCls();
-        final DomainObject domainObject = Annotations.getAnnotations(cls, DomainObject.class);
+        final List<DomainObject> domainObjects = Annotations.getAnnotations(cls, DomainObject.class);
 
-        if(domainObject == null) {
+        if(domainObjects == null) {
             return;
         }
 
@@ -285,21 +291,21 @@ public class DomainObjectAnnotationFacetFactory extends FacetFactoryAbstract
 
         final PostConstructMethodCache postConstructMethodCache = this;
         final ViewModelFacet recreatableObjectFacet = RecreatableObjectFacetForDomainObjectAnnotation.create(
-                domainObject, getSpecificationLoader(), persistenceSessionServiceInternal, servicesInjector,
+                domainObjects, getSpecificationLoader(), persistenceSessionServiceInternal, servicesInjector,
                 facetHolder, postConstructMethodCache);
 
         if(recreatableObjectFacet != null) {
             FacetUtil.addFacet(recreatableObjectFacet);
         } else {
-            if(domainObject.nature() == Nature.MIXIN) {
 
-                if(!mixinTypeValidator.ensureMixinType(cls)) {
-                    return;
-                }
+            final List<DomainObject> mixinDomainObjects =
+                    domainObjects.stream()
+                        .filter(domainObject -> domainObject.nature() == Nature.MIXIN)
+                        .filter(domainObject -> mixinTypeValidator.ensureMixinType(cls))
+                        .collect(Collectors.toList());
 
-                final MixinFacet mixinFacet = MixinFacetForDomainObjectAnnotation.create(domainObject, cls, facetHolder, servicesInjector);
-                FacetUtil.addFacet(mixinFacet);
-            }
+            final MixinFacet mixinFacet = MixinFacetForDomainObjectAnnotation.create(mixinDomainObjects, cls, facetHolder, servicesInjector);
+            FacetUtil.addFacet(mixinFacet);
         }
 
     }
@@ -308,139 +314,146 @@ public class DomainObjectAnnotationFacetFactory extends FacetFactoryAbstract
     private void processLifecycleEvents(final ProcessClassContext processClassContext) {
 
         final Class<?> cls = processClassContext.getCls();
-        final DomainObject domainObject = Annotations.getAnnotations(cls, DomainObject.class);
-        if(domainObject == null) {
+        final List<DomainObject> domainObjects = Annotations.getAnnotations(cls, DomainObject.class);
+        if(domainObjects == null) {
             return;
         }
         final FacetHolder holder = processClassContext.getFacetHolder();
 
-        processLifecycleEventCreated(domainObject, holder);
-        processLifecycleEventLoaded(domainObject, holder);
-        processLifecycleEventPersisted(domainObject, holder);
-        processLifecycleEventPersisting(domainObject, holder);
-        processLifecycleEventRemoving(domainObject, holder);
-        processLifecycleEventUpdated(domainObject, holder);
-        processLifecycleEventUpdating(domainObject, holder);
+        processLifecycleEventCreated(domainObjects, holder);
+        processLifecycleEventLoaded(domainObjects, holder);
+        processLifecycleEventPersisted(domainObjects, holder);
+        processLifecycleEventPersisting(domainObjects, holder);
+        processLifecycleEventRemoving(domainObjects, holder);
+        processLifecycleEventUpdated(domainObjects, holder);
+        processLifecycleEventUpdating(domainObjects, holder);
 
     }
 
-    private void processLifecycleEventCreated(final DomainObject domainObject, final FacetHolder holder) {
-        final Class<? extends ObjectCreatedEvent<?>> lifecycleEvent = domainObject.createdLifecycleEvent();
-
-        final CreatedLifecycleEventFacetForDomainObjectAnnotation facet =
-                new CreatedLifecycleEventFacetForDomainObjectAnnotation(
-                        holder, lifecycleEvent, getSpecificationLoader());
-
-        if(EventUtil.eventTypeIsPostable(
-                facet.getEventType(),
-                ObjectCreatedEvent.Noop.class,
-                ObjectCreatedEvent.Default.class,
-                "isis.reflector.facet.domainObjectAnnotation.createdLifecycleEvent.postForDefault",
-                getConfiguration())) {
-            FacetUtil.addFacet(facet);
-        }
+    private void processLifecycleEventCreated(final List<DomainObject> domainObjects, final FacetHolder holder) {
+
+        domainObjects.stream()
+                .map(DomainObject::createdLifecycleEvent)
+                .filter(lifecycleEvent ->
+                    EventUtil.eventTypeIsPostable(
+                            lifecycleEvent,
+                            ObjectCreatedEvent.Noop.class,
+                            ObjectCreatedEvent.Default.class,
+                            "isis.reflector.facet.domainObjectAnnotation.createdLifecycleEvent.postForDefault",
+                            getConfiguration())
+                )
+                .findFirst()
+                .map(lifecycleEvent -> new CreatedLifecycleEventFacetForDomainObjectAnnotation(
+                        holder, lifecycleEvent, getSpecificationLoader()))
+                .ifPresent(FacetUtil::addFacet);
     }
 
-    private void processLifecycleEventLoaded(final DomainObject domainObject, final FacetHolder holder) {
-        final Class<? extends ObjectLoadedEvent<?>> lifecycleEvent = domainObject.loadedLifecycleEvent();
-
-        final LoadedLifecycleEventFacetForDomainObjectAnnotation facet =
-                new LoadedLifecycleEventFacetForDomainObjectAnnotation(
-                        holder, lifecycleEvent, getSpecificationLoader());
-
-        if(EventUtil.eventTypeIsPostable(
-                facet.getEventType(),
-                ObjectLoadedEvent.Noop.class,
-                ObjectLoadedEvent.Default.class,
-                "isis.reflector.facet.domainObjectAnnotation.loadedLifecycleEvent.postForDefault",
-                getConfiguration())) {
-            FacetUtil.addFacet(facet);
-        }
+    private void processLifecycleEventLoaded(final List<DomainObject> domainObjects, final FacetHolder holder) {
+
+        domainObjects.stream()
+                .map(DomainObject::loadedLifecycleEvent)
+                .filter(lifecycleEvent ->
+                        EventUtil.eventTypeIsPostable(
+                                lifecycleEvent,
+                                ObjectLoadedEvent.Noop.class,
+                                ObjectLoadedEvent.Default.class,
+                                "isis.reflector.facet.domainObjectAnnotation.loadedLifecycleEvent.postForDefault",
+                                getConfiguration())
+                )
+                .findFirst()
+                .map(lifecycleEvent -> new LoadedLifecycleEventFacetForDomainObjectAnnotation(
+                        holder, lifecycleEvent, getSpecificationLoader()))
+                .ifPresent(FacetUtil::addFacet);
     }
 
-    private void processLifecycleEventPersisting(final DomainObject domainObject, final FacetHolder holder) {
-        final Class<? extends ObjectPersistingEvent<?>> lifecycleEvent = domainObject.persistingLifecycleEvent();
-
-        final PersistingLifecycleEventFacetForDomainObjectAnnotation facet =
-                new PersistingLifecycleEventFacetForDomainObjectAnnotation(
-                        holder, lifecycleEvent, getSpecificationLoader());
-
-        if(EventUtil.eventTypeIsPostable(
-                facet.getEventType(),
-                ObjectPersistingEvent.Noop.class,
-                ObjectPersistingEvent.Default.class,
-                "isis.reflector.facet.domainObjectAnnotation.persistingLifecycleEvent.postForDefault",
-                getConfiguration())) {
-            FacetUtil.addFacet(facet);
-        }
+    private void processLifecycleEventPersisting(final List<DomainObject> domainObjects, final FacetHolder holder) {
+
+        domainObjects.stream()
+                .map(DomainObject::persistingLifecycleEvent)
+                .filter(lifecycleEvent ->
+                        EventUtil.eventTypeIsPostable(
+                                lifecycleEvent,
+                                ObjectPersistingEvent.Noop.class,
+                                ObjectPersistingEvent.Default.class,
+                                "isis.reflector.facet.domainObjectAnnotation.persistingLifecycleEvent.postForDefault",
+                                getConfiguration())
+                )
+                .findFirst()
+                .map(lifecycleEvent -> new PersistingLifecycleEventFacetForDomainObjectAnnotation(
+                        holder, lifecycleEvent, getSpecificationLoader()))
+                .ifPresent(FacetUtil::addFacet);
     }
 
-    private void processLifecycleEventPersisted(final DomainObject domainObject, final FacetHolder holder) {
-        final Class<? extends ObjectPersistedEvent<?>> lifecycleEvent = domainObject.persistedLifecycleEvent();
-
-        final PersistedLifecycleEventFacetForDomainObjectAnnotation facet =
-                new PersistedLifecycleEventFacetForDomainObjectAnnotation(
-                        holder, lifecycleEvent, getSpecificationLoader());
-
-        if(EventUtil.eventTypeIsPostable(
-                facet.getEventType(),
-                ObjectPersistedEvent.Noop.class,
-                ObjectPersistedEvent.Default.class,
-                "isis.reflector.facet.domainObjectAnnotation.persistedLifecycleEvent.postForDefault",
-                getConfiguration())) {
-            FacetUtil.addFacet(facet);
-        }
+    private void processLifecycleEventPersisted(final List<DomainObject> domainObjects, final FacetHolder holder) {
+
+        domainObjects.stream()
+                .map(DomainObject::persistedLifecycleEvent)
+                .filter(lifecycleEvent ->
+                        EventUtil.eventTypeIsPostable(
+                                lifecycleEvent,
+                                ObjectPersistedEvent.Noop.class,
+                                ObjectPersistedEvent.Default.class,
+                                "isis.reflector.facet.domainObjectAnnotation.persistedLifecycleEvent.postForDefault",
+                                getConfiguration())
+                )
+                .findFirst()
+                .map(lifecycleEvent -> new PersistedLifecycleEventFacetForDomainObjectAnnotation(
+                        holder, lifecycleEvent, getSpecificationLoader()))
+                .ifPresent(FacetUtil::addFacet);
     }
 
-    private void processLifecycleEventRemoving(final DomainObject domainObject, final FacetHolder holder) {
-        final Class<? extends ObjectRemovingEvent<?>> lifecycleEvent = domainObject.removingLifecycleEvent();
-
-        final RemovingLifecycleEventFacetForDomainObjectAnnotation facet =
-                new RemovingLifecycleEventFacetForDomainObjectAnnotation(
-                        holder, lifecycleEvent, getSpecificationLoader());
-
-        if(EventUtil.eventTypeIsPostable(
-                facet.getEventType(),
-                ObjectRemovingEvent.Noop.class,
-                ObjectRemovingEvent.Default.class,
-                "isis.reflector.facet.domainObjectAnnotation.removingLifecycleEvent.postForDefault",
-                getConfiguration())) {
-            FacetUtil.addFacet(facet);
-        }
+    private void processLifecycleEventRemoving(final List<DomainObject> domainObjects, final FacetHolder holder) {
+
+        domainObjects.stream()
+                .map(DomainObject::removingLifecycleEvent)
+                .filter(lifecycleEvent ->
+                        EventUtil.eventTypeIsPostable(
+                                lifecycleEvent,
+                                ObjectRemovingEvent.Noop.class,
+                                ObjectRemovingEvent.Default.class,
+                                "isis.reflector.facet.domainObjectAnnotation.removingLifecycleEvent.postForDefault",
+                                getConfiguration())
+                )
+                .findFirst()
+                .map(lifecycleEvent -> new RemovingLifecycleEventFacetForDomainObjectAnnotation(
+                        holder, lifecycleEvent, getSpecificationLoader()))
+                .ifPresent(FacetUtil::addFacet);
     }
 
-    private void processLifecycleEventUpdated(final DomainObject domainObject, final FacetHolder holder) {
-        final Class<? extends ObjectUpdatedEvent<?>> lifecycleEvent = domainObject.updatedLifecycleEvent();
-
-        final UpdatedLifecycleEventFacetForDomainObjectAnnotation facet =
-                new UpdatedLifecycleEventFacetForDomainObjectAnnotation(
-                        holder, lifecycleEvent, getSpecificationLoader());
-
-        if(EventUtil.eventTypeIsPostable(
-                facet.getEventType(),
-                ObjectUpdatedEvent.Noop.class,
-                ObjectUpdatedEvent.Default.class,
-                "isis.reflector.facet.domainObjectAnnotation.updatedLifecycleEvent.postForDefault",
-                getConfiguration())) {
-            FacetUtil.addFacet(facet);
-        }
+    private void processLifecycleEventUpdated(final List<DomainObject> domainObjects, final FacetHolder holder) {
+
+        domainObjects.stream()
+                .map(DomainObject::updatedLifecycleEvent)
+                .filter(lifecycleEvent ->
+                        EventUtil.eventTypeIsPostable(
+                                lifecycleEvent,
+                                ObjectUpdatedEvent.Noop.class,
+                                ObjectUpdatedEvent.Default.class,
+                                "isis.reflector.facet.domainObjectAnnotation.updatedLifecycleEvent.postForDefault",
+                                getConfiguration())
+                )
+                .findFirst()
+                .map(lifecycleEvent -> new UpdatedLifecycleEventFacetForDomainObjectAnnotation(
+                        holder, lifecycleEvent, getSpecificationLoader()))
+                .ifPresent(FacetUtil::addFacet);
     }
 
-    private void processLifecycleEventUpdating(final DomainObject domainObject, final FacetHolder holder) {
-        final Class<? extends ObjectUpdatingEvent<?>> lifecycleEvent = domainObject.updatingLifecycleEvent();
-
-        final UpdatingLifecycleEventFacetForDomainObjectAnnotation facet =
-                new UpdatingLifecycleEventFacetForDomainObjectAnnotation(
-                        holder, lifecycleEvent, getSpecificationLoader());
-
-        if(EventUtil.eventTypeIsPostable(
-                facet.getEventType(),
-                ObjectUpdatingEvent.Noop.class,
-                ObjectUpdatingEvent.Default.class,
-                "isis.reflector.facet.domainObjectAnnotation.updatingLifecycleEvent.postForDefault",
-                getConfiguration())) {
-            FacetUtil.addFacet(facet);
-        }
+    private void processLifecycleEventUpdating(final List<DomainObject> domainObjects, final FacetHolder holder) {
+
+        domainObjects.stream()
+                .map(DomainObject::updatingLifecycleEvent)
+                .filter(lifecycleEvent ->
+                        EventUtil.eventTypeIsPostable(
+                                lifecycleEvent,
+                                ObjectUpdatingEvent.Noop.class,
+                                ObjectUpdatingEvent.Default.class,
+                                "isis.reflector.facet.domainObjectAnnotation.updatingLifecycleEvent.postForDefault",
+                                getConfiguration())
+                )
+                .findFirst()
+                .map(lifecycleEvent -> new UpdatingLifecycleEventFacetForDomainObjectAnnotation(
+                        holder, lifecycleEvent, getSpecificationLoader()))
+                .ifPresent(FacetUtil::addFacet);
     }
 
     // //////////////////////////////////////
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobject/auditing/AuditableFacetForDomainObjectAnnotation.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobject/auditing/AuditableFacetForDomainObjectAnnotation.java
index e8b8e88..378b7a1 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobject/auditing/AuditableFacetForDomainObjectAnnotation.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobject/auditing/AuditableFacetForDomainObjectAnnotation.java
@@ -19,6 +19,8 @@
 package org.apache.isis.core.metamodel.facets.object.domainobject.auditing;
 
 
+import java.util.List;
+
 import org.apache.isis.applib.annotation.Auditing;
 import org.apache.isis.applib.annotation.DomainObject;
 import org.apache.isis.core.commons.config.IsisConfiguration;
@@ -30,30 +32,26 @@ import org.apache.isis.core.metamodel.facets.object.audit.AuditableFacetAbstract
 public class AuditableFacetForDomainObjectAnnotation extends AuditableFacetAbstract {
 
     public static AuditableFacet create(
-            final DomainObject domainObject,
+            final List<DomainObject> domainObjects,
             final IsisConfiguration configuration,
             final FacetHolder holder) {
 
-        final Auditing auditing = domainObject != null ? domainObject.auditing() : Auditing.AS_CONFIGURED;
-        switch (auditing) {
-            case AS_CONFIGURED:
-
-                final AuditObjectsConfiguration setting = AuditObjectsConfiguration.parse(configuration);
-                switch (setting) {
-                    case NONE:
-                        return null;
+        return domainObjects
+                .stream()
+                .filter(domainObject -> domainObject.auditing() != Auditing.NOT_SPECIFIED)
+                .findFirst()
+                .map(domainObject -> {
+                    switch (domainObject.auditing()) {
+                    case DISABLED:
+                        return (AuditableFacet)new AuditableFacetForDomainObjectAnnotation(Enablement.DISABLED, holder);
+                    case ENABLED:
+                        return new AuditableFacetForDomainObjectAnnotation(Enablement.ENABLED, holder);
+                    case AS_CONFIGURED:
                     default:
-                        return domainObject != null
-                                ? new AuditableFacetForDomainObjectAnnotationAsConfigured(holder)
-                                : new AuditableFacetFromConfiguration(holder);
-                }
-            case DISABLED:
-                // explicitly disable
-                return new AuditableFacetForDomainObjectAnnotation(Enablement.DISABLED, holder);
-            case ENABLED:
-                return new AuditableFacetForDomainObjectAnnotation(Enablement.ENABLED, holder);
-        }
-        return null;
+                        return new AuditableFacetForDomainObjectAnnotationAsConfigured(holder);
+                    }
+                })
+                .orElse(new AuditableFacetFromConfiguration(holder));
     }
 
     protected AuditableFacetForDomainObjectAnnotation(
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 2bf23f4..129d37d 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
@@ -19,6 +19,8 @@
 
 package org.apache.isis.core.metamodel.facets.object.domainobject.choices;
 
+import java.util.List;
+
 import org.apache.isis.applib.annotation.DomainObject;
 import org.apache.isis.core.commons.authentication.AuthenticationSessionProvider;
 import org.apache.isis.core.metamodel.deployment.DeploymentCategory;
@@ -30,7 +32,7 @@ import org.apache.isis.core.metamodel.services.persistsession.PersistenceSession
 public class ChoicesFacetForDomainObjectAnnotation extends ChoicesFacetFromBoundedAbstract {
 
     public static Facet create(
-            final DomainObject domainObject,
+            final List<DomainObject> domainObject,
             final FacetHolder facetHolder,
             final DeploymentCategory deploymentCategory,
             final AuthenticationSessionProvider authenticationSessionProvider,
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobject/editing/ImmutableFacetForDomainObjectAnnotation.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobject/editing/ImmutableFacetForDomainObjectAnnotation.java
index f657963..46cd82b 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobject/editing/ImmutableFacetForDomainObjectAnnotation.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobject/editing/ImmutableFacetForDomainObjectAnnotation.java
@@ -19,7 +19,10 @@
 
 package org.apache.isis.core.metamodel.facets.object.domainobject.editing;
 
+import java.util.List;
+
 import com.google.common.base.Strings;
+
 import org.apache.isis.applib.annotation.DomainObject;
 import org.apache.isis.applib.annotation.Editing;
 import org.apache.isis.core.commons.config.IsisConfiguration;
@@ -35,33 +38,39 @@ public class ImmutableFacetForDomainObjectAnnotation extends ImmutableFacetAbstr
     private final String reason;
 
     public static ImmutableFacet create(
-            final DomainObject domainObject,
+            final List<DomainObject> domainObjects,
             final IsisConfiguration configuration,
             final FacetHolder holder) {
 
-        final Editing editing       = domainObject != null? domainObject.editing() : Editing.AS_CONFIGURED;
-        final String disabledReason = domainObject != null? domainObject.editingDisabledReason(): "Disabled";
+        final EditingObjectsConfiguration setting = EditingObjectsConfiguration.parse(configuration);
 
-        switch (editing) {
-            case AS_CONFIGURED:
+        return domainObjects.stream()
+                .filter(domainObject -> domainObject.editing() != Editing.NOT_SPECIFIED)
+                .findFirst()
+                .map(domainObject -> {
+                    final String disabledReason = domainObject.editingDisabledReason();
+                    switch (domainObject.editing()) {
+                    case AS_CONFIGURED:
 
-                if(holder.containsDoOpFacet(ImmutableFacet.class)) {
-                    // do not replace
-                    return null;
-                }
+                        if(holder.containsDoOpFacet(ImmutableFacet.class)) {
+                            // do not replace
+                            return null;
+                        }
 
-                final EditingObjectsConfiguration setting = EditingObjectsConfiguration.parse(configuration);
-                return setting == EditingObjectsConfiguration.FALSE
-                        ? domainObject != null
-                                ? new ImmutableFacetForDomainObjectAnnotationAsConfigured(disabledReason, holder)
-                                : new ImmutableFacetFromConfiguration(disabledReason, holder)
-                        : null;
-            case DISABLED:
-                return new ImmutableFacetForDomainObjectAnnotation(disabledReason, holder);
-            case ENABLED:
-                return null;
-        }
-        return null;
+                        return setting == EditingObjectsConfiguration.FALSE
+                                ? (ImmutableFacet) new ImmutableFacetForDomainObjectAnnotationAsConfigured(disabledReason, holder)
+                                : null;
+                    case DISABLED:
+                        return new ImmutableFacetForDomainObjectAnnotation(disabledReason, holder);
+                    case ENABLED:
+                        return null;
+                    }
+                    throw new IllegalStateException("domainObject.editing() not recognised, is " + domainObject.editing());
+                })
+                .orElseGet(() -> setting == EditingObjectsConfiguration.FALSE
+                        ? new ImmutableFacetFromConfiguration("Disabled", holder)
+                        : null
+                );
     }
 
     public ImmutableFacetForDomainObjectAnnotation(final String reason, final FacetHolder holder) {
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 d96c071..7930a9e 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
@@ -19,6 +19,8 @@
 
 package org.apache.isis.core.metamodel.facets.object.domainobject.objectspecid;
 
+import java.util.List;
+
 import com.google.common.base.Strings;
 import org.apache.isis.applib.annotation.DomainObject;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
@@ -28,18 +30,15 @@ import org.apache.isis.core.metamodel.facets.object.objectspecid.ObjectSpecIdFac
 public class ObjectSpecIdFacetForDomainObjectAnnotation extends ObjectSpecIdFacetAbstract {
 
     public static ObjectSpecIdFacet create(
-            final DomainObject domainObject,
+            final List<DomainObject> domainObjects,
             final FacetHolder holder) {
 
-        if(domainObject == null) {
-            return null;
-        }
-
-        final String objectType = domainObject.objectType();
-        if(Strings.isNullOrEmpty(objectType)) {
-            return null;
-        }
-        return new ObjectSpecIdFacetForDomainObjectAnnotation(objectType, holder);
+        return domainObjects.stream()
+                .map(DomainObject::objectType)
+                .filter(objectType -> !Strings.isNullOrEmpty(objectType))
+                .findFirst()
+                .map(objectType -> new ObjectSpecIdFacetForDomainObjectAnnotation(objectType, holder))
+                .orElse(null);
     }
 
     private ObjectSpecIdFacetForDomainObjectAnnotation(final String value,
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 5e284e8..2b8b494 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
@@ -19,6 +19,8 @@
 
 package org.apache.isis.core.metamodel.facets.object.domainobject.publishing;
 
+import java.util.List;
+
 import org.apache.isis.applib.annotation.DomainObject;
 import org.apache.isis.applib.annotation.Publishing;
 import org.apache.isis.core.commons.config.IsisConfiguration;
@@ -29,11 +31,11 @@ import org.apache.isis.core.metamodel.facets.object.publishedobject.PublishedObj
 public class PublishedObjectFacetForDomainObjectAnnotation extends PublishedObjectFacetAbstract {
 
     public static PublishedObjectFacet create(
-            final DomainObject domainObject,
+            final List<DomainObject> domainObjects,
             final IsisConfiguration configuration,
             final FacetHolder holder) {
 
-        final Publishing publishing = domainObject != null ? domainObject.publishing() : Publishing.AS_CONFIGURED;
+        final Publishing publishing = domainObjects != null ? domainObjects.publishing() : Publishing.AS_CONFIGURED;
 
         switch (publishing) {
             case AS_CONFIGURED:
@@ -43,7 +45,7 @@ public class PublishedObjectFacetForDomainObjectAnnotation extends PublishedObje
                     case NONE:
                         return null;
                     default:
-                        return domainObject != null
+                        return domainObjects != null
                             ? new PublishedObjectFacetForDomainObjectAnnotationAsConfigured(holder)
                             : new PublishedObjectFacetFromConfiguration(holder);
                 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobject/recreatable/RecreatableObjectFacetForDomainObjectAnnotation.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobject/recreatable/RecreatableObjectFacetForDomainObjectAnnotation.java
index 2532eaa..3cf4cb8 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobject/recreatable/RecreatableObjectFacetForDomainObjectAnnotation.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobject/recreatable/RecreatableObjectFacetForDomainObjectAnnotation.java
@@ -19,13 +19,15 @@
 
 package org.apache.isis.core.metamodel.facets.object.domainobject.recreatable;
 
+import java.util.List;
+import java.util.Objects;
+
 import org.apache.isis.applib.annotation.DomainObject;
-import org.apache.isis.applib.annotation.Nature;
 import org.apache.isis.core.metamodel.adapter.mgr.AdapterManager;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
 import org.apache.isis.core.metamodel.facets.PostConstructMethodCache;
-import org.apache.isis.core.metamodel.facets.object.viewmodel.ViewModelFacet;
 import org.apache.isis.core.metamodel.facets.object.recreatable.RecreatableObjectFacetDeclarativeInitializingAbstract;
+import org.apache.isis.core.metamodel.facets.object.viewmodel.ViewModelFacet;
 import org.apache.isis.core.metamodel.services.ServicesInjector;
 import org.apache.isis.core.metamodel.specloader.SpecificationLoader;
 
@@ -33,52 +35,52 @@ public class RecreatableObjectFacetForDomainObjectAnnotation extends
         RecreatableObjectFacetDeclarativeInitializingAbstract {
 
     public static ViewModelFacet create(
-            final DomainObject domainObject,
+            final List<DomainObject> domainObjects,
             final SpecificationLoader specificationLoader,
             final AdapterManager adapterManager,
             final ServicesInjector servicesInjector,
             final FacetHolder holder,
             final PostConstructMethodCache postConstructMethodCache) {
 
-        if(domainObject == null) {
-            return null;
-        }
+        return domainObjects.stream()
+                .map(DomainObject::nature)
+                .map(nature -> {
+                    switch (nature) {
+                    case NOT_SPECIFIED:
+                    case JDO_ENTITY:
+                    case MIXIN:
+                        // not a recreatable object, so no facet
+                        return null;
 
-        final Nature nature = domainObject.nature();
-        switch (nature)
-        {
-            case NOT_SPECIFIED:
-            case JDO_ENTITY:
-            case MIXIN:
-                // not a recreatable object, so no facet
-                return null;
+                    case VIEW_MODEL:
+                        final ViewModelFacet existingFacet = holder.getFacet(ViewModelFacet.class);
+                        if (existingFacet != null) {
+                            if (existingFacet.getArchitecturalLayer() == ArchitecturalLayer.APPLICATION) {
+                                // if compatible existing facet, then just ignore
+                                return null;
+                            }
+                            // otherwise, we continue through and add the new facet making the existing one the
+                            // underlying.  The metamodel validator on RecreatableObjectFacetFactory will then mark the
+                            // model as invalid because of incompatible semantics.
+                        }
+                        return new RecreatableObjectFacetForDomainObjectAnnotation(
+                                holder,
+                                ArchitecturalLayer.APPLICATION,
+                                specificationLoader, adapterManager, servicesInjector, postConstructMethodCache);
 
-            case VIEW_MODEL:
-                final ViewModelFacet existingFacet = holder.getFacet(ViewModelFacet.class);
-                if (existingFacet != null) {
-                    if (existingFacet.getArchitecturalLayer() == ArchitecturalLayer.APPLICATION) {
-                        // if compatible existing facet, then just ignore
-                        // (otherwise the metamodel
-                        return null;
+                    case EXTERNAL_ENTITY:
+                    case INMEMORY_ENTITY:
+                        return new RecreatableObjectFacetForDomainObjectAnnotation(
+                                holder,
+                                ArchitecturalLayer.DOMAIN,
+                                specificationLoader, adapterManager, servicesInjector, postConstructMethodCache);
                     }
-                    // otherwise, we continue through and add the new facet making the existing one the
-                    // underlying.  The metamodel validator on RecreatableObjectFacetFactory will then mark the
-                    // model as invalid because of incompatible semantics.
-                }
-                return new RecreatableObjectFacetForDomainObjectAnnotation(
-                        holder,
-                        ArchitecturalLayer.APPLICATION,
-                        specificationLoader, adapterManager, servicesInjector, postConstructMethodCache);
-
-            case EXTERNAL_ENTITY:
-            case INMEMORY_ENTITY:
-                return new RecreatableObjectFacetForDomainObjectAnnotation(
-                        holder,
-                        ArchitecturalLayer.DOMAIN,
-                        specificationLoader, adapterManager, servicesInjector, postConstructMethodCache);
-        }
-        // shouldn't happen, the above switch should match all cases.
-        throw new IllegalArgumentException("nature of '" + nature + "' not recognized");
+                    // shouldn't happen, the above switch should match all cases.
+                    throw new IllegalArgumentException("nature of '" + nature + "' not recognized");
+                })
+                .filter(Objects::nonNull)
+                .findFirst()
+                .orElse(null);
     }
 
     private RecreatableObjectFacetForDomainObjectAnnotation(
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobjectlayout/BookmarkPolicyFacetForDomainObjectLayoutAnnotation.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobjectlayout/BookmarkPolicyFacetForDomainObjectLayoutAnnotation.java
index 187d7bf..6719ff3 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobjectlayout/BookmarkPolicyFacetForDomainObjectLayoutAnnotation.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobjectlayout/BookmarkPolicyFacetForDomainObjectLayoutAnnotation.java
@@ -18,7 +18,6 @@
  */
 package org.apache.isis.core.metamodel.facets.object.domainobjectlayout;
 
-
 import java.util.List;
 
 import org.apache.isis.applib.annotation.BookmarkPolicy;
@@ -30,12 +29,15 @@ import org.apache.isis.core.metamodel.facets.object.bookmarkpolicy.BookmarkPolic
 
 public class BookmarkPolicyFacetForDomainObjectLayoutAnnotation extends BookmarkPolicyFacetAbstract {
 
-    public static BookmarkPolicyFacet create(final List<DomainObjectLayout> domainObjectLayout, final FacetHolder holder) {
-        if(domainObjectLayout == null) {
-            return null;
-        }
-        final BookmarkPolicy bookmarkPolicy = domainObjectLayout.bookmarking();
-        return bookmarkPolicy != BookmarkPolicy.NEVER ? new BookmarkPolicyFacetForDomainObjectLayoutAnnotation(bookmarkPolicy, holder) : null;
+    public static BookmarkPolicyFacet create(final List<DomainObjectLayout> domainObjectLayouts, final FacetHolder holder) {
+
+
+        return domainObjectLayouts.stream()
+                .map(DomainObjectLayout::bookmarking)
+                .filter(bookmarkPolicy -> bookmarkPolicy != BookmarkPolicy.NEVER)
+                .findFirst()
+                .map(bookmarkPolicy -> new BookmarkPolicyFacetForDomainObjectLayoutAnnotation(bookmarkPolicy, holder))
+                .orElse(null);
     }
 
     private BookmarkPolicyFacetForDomainObjectLayoutAnnotation(final BookmarkPolicy bookmarkPolicy, final FacetHolder holder) {
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobjectlayout/BookmarkPolicyFacetForViewModelLayoutAnnotation.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobjectlayout/BookmarkPolicyFacetForViewModelLayoutAnnotation.java
index 25a2f30..51b89c5 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobjectlayout/BookmarkPolicyFacetForViewModelLayoutAnnotation.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobjectlayout/BookmarkPolicyFacetForViewModelLayoutAnnotation.java
@@ -30,12 +30,14 @@ import org.apache.isis.core.metamodel.facets.object.bookmarkpolicy.BookmarkPolic
 
 public class BookmarkPolicyFacetForViewModelLayoutAnnotation extends BookmarkPolicyFacetAbstract {
 
-    public static BookmarkPolicyFacet create(final List<ViewModelLayout> viewModelLayout, final FacetHolder holder) {
-        if(viewModelLayout == null) {
-            return null;
-        }
-        final BookmarkPolicy bookmarkPolicy = viewModelLayout.bookmarking();
-        return bookmarkPolicy != BookmarkPolicy.NEVER ? new BookmarkPolicyFacetForViewModelLayoutAnnotation(bookmarkPolicy, holder) : null;
+    public static BookmarkPolicyFacet create(final List<ViewModelLayout> viewModelLayouts, final FacetHolder holder) {
+
+        return viewModelLayouts.stream()
+                .map(ViewModelLayout::bookmarking)
+                .filter(bookmarkPolicy -> bookmarkPolicy != BookmarkPolicy.NEVER)
+                .findFirst()
+                .map(bookmarkPolicy -> new BookmarkPolicyFacetForViewModelLayoutAnnotation(bookmarkPolicy, holder))
+                .orElse(null);
     }
 
     private BookmarkPolicyFacetForViewModelLayoutAnnotation(final BookmarkPolicy bookmarkPolicy, final FacetHolder holder) {
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobjectlayout/CssClassFaFacetForDomainObjectLayoutAnnotation.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobjectlayout/CssClassFaFacetForDomainObjectLayoutAnnotation.java
index fddfa5c..57ad67d 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobjectlayout/CssClassFaFacetForDomainObjectLayoutAnnotation.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobjectlayout/CssClassFaFacetForDomainObjectLayoutAnnotation.java
@@ -29,13 +29,23 @@ import org.apache.isis.core.metamodel.facets.members.cssclassfa.CssClassFaPositi
 
 public class CssClassFaFacetForDomainObjectLayoutAnnotation extends CssClassFaFacetAbstract {
 
-    public static CssClassFaFacet create(final List<DomainObjectLayout> domainObjectLayout, final FacetHolder holder) {
-        if (domainObjectLayout == null) {
-            return null;
+    public static CssClassFaFacet create(final List<DomainObjectLayout> domainObjectLayouts, final FacetHolder holder) {
+
+        class Annot {
+            private Annot(final DomainObjectLayout domainObjectLayout) {
+                this.cssClassFa = Strings.emptyToNull(domainObjectLayout.cssClassFa());
+                this.cssClassFaPosition = CssClassFaPosition.from(domainObjectLayout.cssClassFaPosition());
+            }
+            String cssClassFa;
+            CssClassFaPosition cssClassFaPosition;
         }
-        final String cssClassFa = Strings.emptyToNull(domainObjectLayout.cssClassFa());
-        final CssClassFaPosition position = CssClassFaPosition.from(domainObjectLayout.cssClassFaPosition());
-        return cssClassFa != null ? new CssClassFaFacetForDomainObjectLayoutAnnotation(cssClassFa, position, holder) : null;
+
+        return domainObjectLayouts.stream()
+                .map(Annot::new)
+                .filter(a -> a.cssClassFa != null )
+                .findFirst()
+                .map(a -> new CssClassFaFacetForDomainObjectLayoutAnnotation(a.cssClassFa, a.cssClassFaPosition, holder))
+                .orElse(null);
     }
 
     public CssClassFaFacetForDomainObjectLayoutAnnotation(final String value, final CssClassFaPosition position,
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobjectlayout/CssClassFacetForDomainObjectLayoutAnnotation.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobjectlayout/CssClassFacetForDomainObjectLayoutAnnotation.java
index 510b4d9..0f29bb0 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobjectlayout/CssClassFacetForDomainObjectLayoutAnnotation.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobjectlayout/CssClassFacetForDomainObjectLayoutAnnotation.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,17 @@ import org.apache.isis.core.metamodel.facets.members.cssclass.CssClassFacetAbstr
 
 public class CssClassFacetForDomainObjectLayoutAnnotation extends CssClassFacetAbstract {
 
-    public static CssClassFacet create(final List<DomainObjectLayout> domainObjectLayout, final FacetHolder holder) {
-        if (domainObjectLayout == null) {
+    public static CssClassFacet create(final List<DomainObjectLayout> domainObjectLayouts, final FacetHolder holder) {
+        if (domainObjectLayouts.isEmpty()) {
             return null;
         }
-        final String cssClass = Strings.emptyToNull(domainObjectLayout.cssClass());
-        return cssClass != null ? new CssClassFacetForDomainObjectLayoutAnnotation(cssClass, holder) : null;
+        return domainObjectLayouts.stream()
+                .map(DomainObjectLayout::cssClass)
+                .map(Strings::emptyToNull)
+                .filter(Objects::nonNull)
+                .map(cssClass -> new CssClassFacetForDomainObjectLayoutAnnotation(cssClass, holder))
+                .findFirst()
+                .orElse(null);
     }
 
     private CssClassFacetForDomainObjectLayoutAnnotation(
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobjectlayout/CssClassFacetViaDomainObjectLayoutAnnotationUsingCssClassUiEvent.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobjectlayout/CssClassFacetViaDomainObjectLayoutAnnotationUsingCssClassUiEvent.java
index 22c467a..8b0b93b 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobjectlayout/CssClassFacetViaDomainObjectLayoutAnnotationUsingCssClassUiEvent.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobjectlayout/CssClassFacetViaDomainObjectLayoutAnnotationUsingCssClassUiEvent.java
@@ -44,27 +44,26 @@ public class CssClassFacetViaDomainObjectLayoutAnnotationUsingCssClassUiEvent ex
     private static final Logger LOG = LoggerFactory.getLogger(CssClassFacetViaDomainObjectLayoutAnnotationUsingCssClassUiEvent.class);
 
     public static Facet create(
-            final List<DomainObjectLayout> domainObjectLayout,
+            final List<DomainObjectLayout> domainObjectLayouts,
             final ServicesInjector servicesInjector,
             final IsisConfiguration configuration, final FacetHolder facetHolder) {
-        if(domainObjectLayout == null) {
-            return null;
-        }
-        final Class<? extends CssClassUiEvent<?>> cssClassUiEventClass = domainObjectLayout.cssClassUiEvent();
-
-        if(!EventUtil.eventTypeIsPostable(
-                cssClassUiEventClass,
-                CssClassUiEvent.Noop.class,
-                CssClassUiEvent.Default.class,
-                "isis.reflector.facet.domainObjectLayoutAnnotation.cssClassUiEvent.postForDefault",
-                configuration)) {
-            return null;
-        }
 
-        final EventBusService eventBusService = servicesInjector.lookupService(EventBusService.class);
+        return domainObjectLayouts.stream()
+                .map(DomainObjectLayout::cssClassUiEvent)
+                .filter(cssClassUiEventClass -> EventUtil.eventTypeIsPostable(
+                        cssClassUiEventClass,
+                        CssClassUiEvent.Noop.class,
+                        CssClassUiEvent.Default.class,
+                        "isis.reflector.facet.domainObjectLayoutAnnotation.cssClassUiEvent.postForDefault",
+                        configuration))
+                .findFirst()
+                .map(cssClassUiEventClass -> {
+                    final EventBusService eventBusService = servicesInjector.lookupService(EventBusService.class);
+                    return new CssClassFacetViaDomainObjectLayoutAnnotationUsingCssClassUiEvent(
+                            cssClassUiEventClass, eventBusService, facetHolder);
+                })
+                .orElse(null);
 
-        return new CssClassFacetViaDomainObjectLayoutAnnotationUsingCssClassUiEvent(
-                cssClassUiEventClass, eventBusService, facetHolder);
     }
 
     private final Class<? extends CssClassUiEvent<?>> cssClassUiEventClass;
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobjectlayout/TitleFacetViaDomainObjectLayoutAnnotationUsingTitleUiEvent.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobjectlayout/TitleFacetViaDomainObjectLayoutAnnotationUsingTitleUiEvent.java
index b1b8177..cd191e5 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobjectlayout/TitleFacetViaDomainObjectLayoutAnnotationUsingTitleUiEvent.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobjectlayout/TitleFacetViaDomainObjectLayoutAnnotationUsingTitleUiEvent.java
@@ -20,7 +20,6 @@
 package org.apache.isis.core.metamodel.facets.object.domainobjectlayout;
 
 import java.util.List;
-import java.util.Optional;
 
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -49,10 +48,8 @@ public class TitleFacetViaDomainObjectLayoutAnnotationUsingTitleUiEvent extends
             final List<DomainObjectLayout> domainObjectLayouts,
             final ServicesInjector servicesInjector,
             final IsisConfiguration configuration, final FacetHolder facetHolder) {
-        if(domainObjectLayouts.isEmpty()) {
-            return null;
-        }
-        final Optional<? extends Class<? extends TitleUiEvent<?>>> titleUiEventClassIfAny = domainObjectLayouts.stream()
+
+        return domainObjectLayouts.stream()
                 .map(DomainObjectLayout::titleUiEvent)
                 .filter(titleUiEventClass -> EventUtil.eventTypeIsPostable(
                         titleUiEventClass,
@@ -60,20 +57,17 @@ public class TitleFacetViaDomainObjectLayoutAnnotationUsingTitleUiEvent extends
                         TitleUiEvent.Default.class,
                         "isis.reflector.facet.domainObjectLayoutAnnotation.titleUiEvent.postForDefault",
                         configuration))
-                .findFirst();
-
-        if(titleUiEventClassIfAny.isPresent()) {
-            final Class<? extends TitleUiEvent<?>> titleUiEventClass = titleUiEventClassIfAny.get();
-            final TranslationService translationService = servicesInjector.lookupService(TranslationService.class);
-            final ObjectSpecification facetHolderAsSpec = (ObjectSpecification) facetHolder; // bit naughty...
-            final String translationContext = facetHolderAsSpec.getCorrespondingClass().getCanonicalName();
-            final EventBusService eventBusService = servicesInjector.lookupService(EventBusService.class);
-
-            return new TitleFacetViaDomainObjectLayoutAnnotationUsingTitleUiEvent(
-                    titleUiEventClass, translationService, translationContext, eventBusService, facetHolder);
-        }
-
-        return null;
+                .findFirst()
+                .map(titleUiEventClass -> {
+                    final TranslationService translationService = servicesInjector.lookupService(TranslationService.class);
+                    final ObjectSpecification facetHolderAsSpec = (ObjectSpecification) facetHolder; // bit naughty...
+                    final String translationContext = facetHolderAsSpec.getCorrespondingClass().getCanonicalName();
+                    final EventBusService eventBusService = servicesInjector.lookupService(EventBusService.class);
+
+                    return new TitleFacetViaDomainObjectLayoutAnnotationUsingTitleUiEvent(
+                            titleUiEventClass, translationService, translationContext, eventBusService, facetHolder);
+                })
+                .orElse(null);
     }
 
     private final Class<? extends TitleUiEvent<?>> titleUiEventClass;
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 4cc37a5..894319d 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
@@ -20,6 +20,7 @@
 package org.apache.isis.core.metamodel.facets.object.mixin;
 
 import java.lang.reflect.Constructor;
+import java.util.List;
 
 import org.apache.isis.applib.annotation.DomainObject;
 import org.apache.isis.applib.annotation.Nature;
@@ -42,7 +43,7 @@ public class MixinFacetForDomainObjectAnnotation extends MixinFacetAbstract {
     }
 
     public static MixinFacet create(
-            final DomainObject domainObject,
+            final List<DomainObject> domainObject,
             final Class<?> candidateMixinType,
             final FacetHolder facetHolder,
             final ServicesInjector servicesInjector) {
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/parseable/ParserUtil.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/parseable/ParserUtil.java
index 3f70174..acc1105 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/parseable/ParserUtil.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/parseable/ParserUtil.java
@@ -43,7 +43,7 @@ public final class ParserUtil {
     public static Class<? extends Parser<?>> parserOrNull(final Class<?> candidateClass, final String classCandidateName) {
         @SuppressWarnings("rawtypes")
         final Class type = candidateClass != null ? ClassUtil.implementingClassOrNull(candidateClass.getName(), Parser.class, FacetHolder.class) : null;
-        return type != null ? type : ClassUtil.implementingClassOrNull(classCandidateName, Parser.class, FacetHolder.class);
+        return type != null ? type : (Class)ClassUtil.implementingClassOrNull(classCandidateName, Parser.class, FacetHolder.class);
     }
 
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/value/vsp/ValueSemanticsProviderUtil.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/value/vsp/ValueSemanticsProviderUtil.java
index f93ebe1..03658a5 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/value/vsp/ValueSemanticsProviderUtil.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/value/vsp/ValueSemanticsProviderUtil.java
@@ -45,7 +45,8 @@ public final class ValueSemanticsProviderUtil {
     public static Class<? extends ValueSemanticsProvider<?>> valueSemanticsProviderOrNull(final Class<?> candidateClass, final String classCandidateName) {
         @SuppressWarnings("rawtypes")
         final Class clazz = candidateClass != null ? ClassUtil.implementingClassOrNull(candidateClass.getName(), ValueSemanticsProvider.class, FacetHolder.class) : null;
-        return clazz != null ? clazz : ClassUtil.implementingClassOrNull(classCandidateName, ValueSemanticsProvider.class, FacetHolder.class);
+        return clazz != null ? clazz : (Class)ClassUtil.implementingClassOrNull(classCandidateName, ValueSemanticsProvider.class, FacetHolder.class);
+
     }
 
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/objectstore/jdo/metamodel/facets/object/persistencecapable/JdoPersistenceCapableAnnotationFacetFactory.java b/core/metamodel/src/main/java/org/apache/isis/objectstore/jdo/metamodel/facets/object/persistencecapable/JdoPersistenceCapableAnnotationFacetFactory.java
index 0023f9f..4ea41a2 100644
--- a/core/metamodel/src/main/java/org/apache/isis/objectstore/jdo/metamodel/facets/object/persistencecapable/JdoPersistenceCapableAnnotationFacetFactory.java
+++ b/core/metamodel/src/main/java/org/apache/isis/objectstore/jdo/metamodel/facets/object/persistencecapable/JdoPersistenceCapableAnnotationFacetFactory.java
@@ -45,7 +45,7 @@ public class JdoPersistenceCapableAnnotationFacetFactory extends FacetFactoryAbs
             return;
         }
 
-        final PersistenceCapable annotation = Annotations.getAnnotations(cls, PersistenceCapable.class);
+        final PersistenceCapable annotation = Annotations.getAnnotation(cls, PersistenceCapable.class);
         if (annotation == null) {
             return;
         }
diff --git a/core/metamodel/src/main/java/org/apache/isis/objectstore/jdo/metamodel/facets/prop/column/MandatoryFromJdoColumnAnnotationFacetFactory.java b/core/metamodel/src/main/java/org/apache/isis/objectstore/jdo/metamodel/facets/prop/column/MandatoryFromJdoColumnAnnotationFacetFactory.java
index 1ffe8d8..54f9360 100644
--- a/core/metamodel/src/main/java/org/apache/isis/objectstore/jdo/metamodel/facets/prop/column/MandatoryFromJdoColumnAnnotationFacetFactory.java
+++ b/core/metamodel/src/main/java/org/apache/isis/objectstore/jdo/metamodel/facets/prop/column/MandatoryFromJdoColumnAnnotationFacetFactory.java
@@ -62,7 +62,7 @@ public class MandatoryFromJdoColumnAnnotationFacetFactory extends FacetFactoryAb
             return;
         }
 
-        final Column annotation = Annotations.getAnnotations(processMethodContext.getMethod(), Column.class);
+        final Column annotation = Annotations.getAnnotation(processMethodContext.getMethod(), Column.class);
 
         final FacetedMethod holder = processMethodContext.getFacetHolder();
         
@@ -82,7 +82,7 @@ public class MandatoryFromJdoColumnAnnotationFacetFactory extends FacetFactoryAb
         }
         
         boolean required = whetherRequired(processMethodContext, annotation);
-        MandatoryFacet facet = annotation != null 
+        MandatoryFacet facet = annotation != null
                 ? new MandatoryFacetDerivedFromJdoColumn(holder, required) 
                 : new MandatoryFacetInferredFromAbsenceOfJdoColumn(holder, required);
                 

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