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:04 UTC

[isis] 01/03: ISIS-1632: generalises Annotations utility to return a list of annotations rather than first matching. (INCOMPLETE, DOESN'T EVEN 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 8e013c022f8f237b95573b057e14ae7fb91a3d9b
Author: Dan Haywood <da...@haywood-associates.co.uk>
AuthorDate: Fri Oct 27 00:26:38 2017 +0100

    ISIS-1632: generalises Annotations utility to return a list of annotations rather than first matching.  (INCOMPLETE, DOESN'T EVEN COMPILE)
    
    The idea here is that the calling code can look for the first non-default value for whichever attribute of the annotation that they might be interested in.
---
 .../isis/core/metamodel/facets/Annotations.java    | 155 ++++++++++++++++++---
 .../action/ActionAnnotationFacetFactory.java       |  16 +--
 .../actions/layout/ActionLayoutFacetFactory.java   |   2 +-
 .../CollectionAnnotationFacetFactory.java          |  10 +-
 .../layout/CollectionLayoutFacetFactory.java       |   2 +-
 .../jaxb/JaxbXmlJavaTypeAdapterFacetFactory.java   |   4 +-
 .../order/annotprop/MemberOrderFacetFactory.java   |   2 +-
 .../DomainObjectAnnotationFacetFactory.java        |  16 +--
 ...PolicyFacetForDomainObjectLayoutAnnotation.java |   4 +-
 ...arkPolicyFacetForViewModelLayoutAnnotation.java |   4 +-
 ...lassFaFacetForDomainObjectLayoutAnnotation.java |   4 +-
 ...ssClassFaFacetForViewModelLayoutAnnotation.java |   4 +-
 ...sClassFacetForDomainObjectLayoutAnnotation.java |   4 +-
 .../CssClassFacetForViewModelLayoutAnnotation.java |   4 +-
 ...ObjectLayoutAnnotationUsingCssClassUiEvent.java |   4 +-
 ...ibedAsFacetForDomainObjectLayoutAnnotation.java |   4 +-
 ...scribedAsFacetForViewModelLayoutAnnotation.java |   4 +-
 .../DomainObjectLayoutFacetFactory.java            |  40 +++---
 ...mainObjectLayoutAnnotationUsingIconUiEvent.java |   4 +-
 .../NamedFacetForDomainObjectLayoutAnnotation.java |   4 +-
 .../NamedFacetForViewModelLayoutAnnotation.java    |   4 +-
 .../PagedFacetForDomainObjectLayoutAnnotation.java |   4 +-
 .../PagedFacetForViewModelLayoutAnnotation.java    |  14 +-
 ...PluralFacetForDomainObjectLayoutAnnotation.java |  16 ++-
 .../PluralFacetForViewModelLayoutAnnotation.java   |   4 +-
 ...ainObjectLayoutAnnotationUsingTitleUiEvent.java |  43 +++---
 .../DomainServiceFacetAnnotationFactory.java       |   2 +-
 .../DomainServiceLayoutFacetFactory.java           |   4 +-
 ...bleFacetAnnotationElseConfigurationFactory.java |   4 +-
 .../annotprop/MemberGroupLayoutFacetFactory.java   |   2 +-
 ...bleFacetAnnotationElseConfigurationFactory.java |   2 +-
 ...ValueFacetAnnotationOrConfigurationFactory.java |   2 +-
 .../property/PropertyAnnotationFacetFactory.java   |  26 ++--
 .../propertylayout/PropertyLayoutFacetFactory.java |   2 +-
 ...JdoDatastoreIdentityAnnotationFacetFactory.java |   2 +-
 .../JdoDiscriminatorAnnotationFacetFactory.java    |   2 +-
 ...doPersistenceCapableAnnotationFacetFactory.java |   2 +-
 .../query/JdoQueryAnnotationFacetFactory.java      |   4 +-
 ...DerivedFromJdoColumnAnnotationFacetFactory.java |   2 +-
 ...ndatoryFromJdoColumnAnnotationFacetFactory.java |   2 +-
 ...DerivedFromJdoColumnAnnotationFacetFactory.java |   8 +-
 .../JdoPrimaryKeyAnnotationFacetFactory.java       |   2 +-
 .../services/eventbus/EventBusServiceDefault.java  |   2 +-
 43 files changed, 308 insertions(+), 138 deletions(-)

diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/Annotations.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/Annotations.java
index f8c487a..3beeb38 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/Annotations.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/Annotations.java
@@ -76,7 +76,7 @@ public final class Annotations  {
     /**
      * Searches for annotation on provided class, and if not found for the
      * superclass.
-     * 
+     *
      * <p>
      * Added to allow bytecode-mangling libraries such as CGLIB to be supported.
      */
@@ -89,6 +89,45 @@ public final class Annotations  {
             return annotation;
         }
 
+        // search superclasses
+        final Class<?> superclass = cls.getSuperclass();
+        if (superclass != null) {
+            try {
+                final T annotationFromSuperclass = getAnnotation(superclass, annotationClass);
+                if (annotationFromSuperclass != null) {
+                    return annotationFromSuperclass;
+                }
+            } catch (final SecurityException e) {
+                // fall through
+            }
+        }
+
+        // search implemented interfaces
+        final Class<?>[] interfaces = cls.getInterfaces();
+        for (final Class<?> iface : interfaces) {
+            final T annotationFromInterface = getAnnotation(iface, annotationClass);
+            if (annotationFromInterface != null) {
+                return annotationFromInterface;
+            }
+        }
+        return null;
+    }
+
+
+    /**
+     * Searches for annotation on provided class, and if not found for the
+     * superclass.
+     */
+    public static <T extends Annotation> List<T> getAnnotations(final Class<?> cls, final Class<T> annotationClass) {
+        final List<T> annotations = Lists.newArrayList();
+        if (cls == null) {
+            return annotations;
+        }
+        final T annotation = cls.getAnnotation(annotationClass);
+        if (annotation != null) {
+            annotations.add(annotation);
+        }
+
         // meta annotations
         final Set<Class<? extends Annotation>> metaAnnotationTypes = AppManifest.Registry.instance().getMetaAnnotationTypes();
         final Annotation[] clsAnnotations = cls.getAnnotations();
@@ -97,18 +136,21 @@ public final class Annotations  {
             if(metaAnnotationTypes.contains(annotationType)) {
                 final T annotationOnMetaAnnotation = annotationType.getAnnotation(annotationClass);
                 if(annotationOnMetaAnnotation != null) {
-                    return annotationOnMetaAnnotation;
+                    annotations.add(annotationOnMetaAnnotation);
                 }
             }
         }
+        if(!annotations.isEmpty()) {
+            return annotations;
+        }
 
         // search superclasses
         final Class<?> superclass = cls.getSuperclass();
         if (superclass != null) {
             try {
-                final T annotationFromSuperclass = getAnnotation(superclass, annotationClass);
-                if (annotationFromSuperclass != null) {
-                    return annotationFromSuperclass;
+                final List<T> annotationsFromSuperclass = getAnnotations(superclass, annotationClass);
+                if (!annotationsFromSuperclass.isEmpty()) {
+                    return annotationsFromSuperclass;
                 }
             } catch (final SecurityException e) {
                 // fall through
@@ -118,12 +160,12 @@ public final class Annotations  {
         // search implemented interfaces
         final Class<?>[] interfaces = cls.getInterfaces();
         for (final Class<?> iface : interfaces) {
-            final T annotationFromInterface = getAnnotation(iface, annotationClass);
-            if (annotationFromInterface != null) {
-                return annotationFromInterface;
+            final List<T> annotationsFromInterface = getAnnotations(iface, annotationClass);
+            if (!annotationsFromInterface.isEmpty()) {
+                return annotationsFromInterface;
             }
         }
-        return null;
+        return annotations;
     }
 
     /**
@@ -148,7 +190,7 @@ public final class Annotations  {
         // search for field
         if ( shouldSearchForField(annotationClass) ) {
 
-            final List<String> fieldNameCandidates = fieldNameCandidatesFor(methodName);
+            List<String> fieldNameCandidates = fieldNameCandidatesFor(methodName);
             for (String fieldNameCandidate : fieldNameCandidates) {
                 try {
                     final Field field = methodDeclaringClass.getDeclaredField(fieldNameCandidate);
@@ -162,23 +204,90 @@ public final class Annotations  {
             }
         }
 
+        // search superclasses
+        final Class<?> superclass = methodDeclaringClass.getSuperclass();
+        if (superclass != null) {
+            try {
+                final Method parentClassMethod = superclass.getMethod(methodName, method.getParameterTypes());
+                return getAnnotation(parentClassMethod, annotationClass);
+            } catch (final SecurityException | NoSuchMethodException e) {
+                // fall through
+            }
+        }
+
+        // search implemented interfaces
+        final Class<?>[] interfaces = methodDeclaringClass.getInterfaces();
+        for (final Class<?> iface : interfaces) {
+            try {
+                final Method ifaceMethod = iface.getMethod(methodName, method.getParameterTypes());
+                return getAnnotation(ifaceMethod, annotationClass);
+            } catch (final SecurityException | NoSuchMethodException e) {
+                // fall through
+            }
+        }
+
+        return null;
+    }
+
+    /**
+     * Searches for annotation on provided method, and if not found for any
+     * inherited methods up from the superclass.
+     */
+    public static <T extends Annotation> List<T> getAnnotations(
+            final Method method,
+            final Class<T> annotationClass) {
+        final List<T> annotations = Lists.newArrayList();
+        if (method == null) {
+            return annotations;
+        }
+
+        boolean annotationOnMethod = false;
+        final Class<?> methodDeclaringClass = method.getDeclaringClass();
+        final String methodName = method.getName();
+
+        final T annotation = method.getAnnotation(annotationClass);
+        if (annotation != null) {
+            annotations.add(annotation);
+            annotationOnMethod = true;
+        }
+
+
+        // search for field
+        if ( !annotationOnMethod && shouldSearchForField(annotationClass) ) {
+
+            final List<String> fieldNameCandidates = fieldNameCandidatesFor(methodName);
+            for (String fieldNameCandidate : fieldNameCandidates) {
+                try {
+                    final Field field = methodDeclaringClass.getDeclaredField(fieldNameCandidate);
+                    final T fieldAnnotation = field.getAnnotation(annotationClass);
+                    if(fieldAnnotation != null) {
+                        annotations.add(fieldAnnotation);
+                    }
+                } catch (NoSuchFieldException e) {
+                    // fall through
+                }
+            }
+        }
+
         // meta annotations
         final Set<Class<? extends Annotation>> metaAnnotationTypes = AppManifest.Registry.instance().getMetaAnnotationTypes();
 
         // search for annotation on a meta-annotation on the method
-        final Annotation[] annotations = method.getAnnotations();
-        for (Annotation methodAnnotation : annotations) {
+        boolean metaAnnotationOnMethod = false;
+        final Annotation[] methodAnnotations = method.getAnnotations();
+        for (Annotation methodAnnotation : methodAnnotations) {
             Class<? extends Annotation> annotationType = methodAnnotation.annotationType();
             if(metaAnnotationTypes.contains(annotationType)) {
                 final T annotationOnMetaAnnotation = annotationType.getAnnotation(annotationClass);
                 if(annotationOnMetaAnnotation != null) {
-                    return annotationOnMetaAnnotation;
+                    annotations.add(annotationOnMetaAnnotation);
+                    metaAnnotationOnMethod = true;
                 }
             }
         }
 
         // search for annotation on a meta-annotation on the field
-        if ( shouldSearchForField(annotationClass) ) {
+        if ( !metaAnnotationOnMethod && shouldSearchForField(annotationClass) ) {
 
             List<String> fieldNameCandidates = fieldNameCandidatesFor(methodName);
             for (String fieldNameCandidate : fieldNameCandidates) {
@@ -190,7 +299,7 @@ public final class Annotations  {
                         if(metaAnnotationTypes.contains(annotationType)) {
                             final T annotationOnMetaAnnotation = annotationType.getAnnotation(annotationClass);
                             if(annotationOnMetaAnnotation != null) {
-                                return annotationOnMetaAnnotation;
+                                annotations.add(annotationOnMetaAnnotation);
                             }
                         }
                     }
@@ -200,12 +309,19 @@ public final class Annotations  {
             }
         }
 
+        if(!annotations.isEmpty()) {
+            return annotations;
+        }
+
         // search superclasses
         final Class<?> superclass = methodDeclaringClass.getSuperclass();
         if (superclass != null) {
             try {
                 final Method parentClassMethod = superclass.getMethod(methodName, method.getParameterTypes());
-                return getAnnotation(parentClassMethod, annotationClass);
+                final List<T> annotationsFromSuperclass = getAnnotations(parentClassMethod, annotationClass);
+                if(!annotationsFromSuperclass.isEmpty()) {
+                    return annotationsFromSuperclass;
+                }
             } catch (final SecurityException | NoSuchMethodException e) {
                 // fall through
             }
@@ -216,13 +332,16 @@ public final class Annotations  {
         for (final Class<?> iface : interfaces) {
             try {
                 final Method ifaceMethod = iface.getMethod(methodName, method.getParameterTypes());
-                return getAnnotation(ifaceMethod, annotationClass);
+                final List<T> annotationsFromInterfaces = getAnnotations(ifaceMethod, annotationClass);
+                if(!annotationsFromInterfaces.isEmpty()) {
+                    return annotationsFromInterfaces;
+                }
             } catch (final SecurityException | NoSuchMethodException e) {
                 // fall through
             }
         }
 
-        return null;
+        return annotations;
     }
 
     /**
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 7e8d64e..8e51ac6 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
@@ -100,7 +100,7 @@ public class ActionAnnotationFacetFactory extends FacetFactoryAbstract {
             //
             // Set up ActionDomainEventFacet, which will act as the hiding/disabling/validating advisor
             //
-            final Action action = Annotations.getAnnotation(actionMethod, Action.class);
+            final Action action = Annotations.getAnnotations(actionMethod, Action.class);
             final Class<? extends ActionDomainEvent<?>> actionDomainEventType;
 
             final ActionDomainEventFacetAbstract actionDomainEventFacet;
@@ -156,7 +156,7 @@ public class ActionAnnotationFacetFactory extends FacetFactoryAbstract {
         final FacetHolder holder = processMethodContext.getFacetHolder();
 
         // search for @Action(hidden=...)
-        final Action action = Annotations.getAnnotation(method, Action.class);
+        final Action action = Annotations.getAnnotations(method, Action.class);
         HiddenFacet facet = HiddenFacetForActionAnnotation.create(action, holder);
         FacetUtil.addFacet(facet);
     }
@@ -166,7 +166,7 @@ public class ActionAnnotationFacetFactory extends FacetFactoryAbstract {
         final FacetHolder holder = processMethodContext.getFacetHolder();
 
         // search for @Action(restrictTo=...)
-        final Action action = Annotations.getAnnotation(method, Action.class);
+        final Action action = Annotations.getAnnotations(method, Action.class);
         PrototypeFacet facet = PrototypeFacetForActionAnnotation.create(action, holder,
                 getDeploymentCategory());
 
@@ -178,7 +178,7 @@ public class ActionAnnotationFacetFactory extends FacetFactoryAbstract {
         final FacetHolder holder = processMethodContext.getFacetHolder();
 
         // check for @Action(semantics=...)
-        final Action action = Annotations.getAnnotation(method, Action.class);
+        final Action action = Annotations.getAnnotations(method, Action.class);
         ActionSemanticsFacet facet =
                 ActionSemanticsFacetForActionAnnotation.create(action, holder);
 
@@ -192,7 +192,7 @@ public class ActionAnnotationFacetFactory extends FacetFactoryAbstract {
 
     void processBulk(final ProcessMethodContext processMethodContext) {
         final Method method = processMethodContext.getMethod();
-        final Action action = Annotations.getAnnotation(method, Action.class);
+        final Action action = Annotations.getAnnotations(method, Action.class);
         final FacetHolder holder = processMethodContext.getFacetHolder();
 
         // check for @Action(invokeOn=...)
@@ -210,7 +210,7 @@ public class ActionAnnotationFacetFactory extends FacetFactoryAbstract {
 
         final Class<?> cls = processMethodContext.getCls();
         final Method method = processMethodContext.getMethod();
-        final Action action = Annotations.getAnnotation(method, Action.class);
+        final Action action = Annotations.getAnnotations(method, Action.class);
         final FacetedMethod facetHolder = processMethodContext.getFacetHolder();
 
         final FacetHolder holder = facetHolder;
@@ -233,7 +233,7 @@ public class ActionAnnotationFacetFactory extends FacetFactoryAbstract {
     void processPublishing(final ProcessMethodContext processMethodContext) {
 
         final Method method = processMethodContext.getMethod();
-        final Action action = Annotations.getAnnotation(method, Action.class);
+        final Action action = Annotations.getAnnotations(method, Action.class);
         final FacetHolder holder = processMethodContext.getFacetHolder();
 
         //
@@ -264,7 +264,7 @@ public class ActionAnnotationFacetFactory extends FacetFactoryAbstract {
 
         // check for @Action(typeOf=...)
         TypeOfFacet typeOfFacet = null;
-        final Action action = Annotations.getAnnotation(method, Action.class);
+        final Action action = Annotations.getAnnotations(method, Action.class);
         if (action != null) {
             final Class<?> typeOf = action.typeOf();
             if(typeOf != null && typeOf != Object.class) {
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/layout/ActionLayoutFacetFactory.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/layout/ActionLayoutFacetFactory.java
index b38e583..88cb77d 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/layout/ActionLayoutFacetFactory.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/layout/ActionLayoutFacetFactory.java
@@ -52,7 +52,7 @@ public class ActionLayoutFacetFactory extends FacetFactoryAbstract implements Co
 
         final FacetHolder holder = processMethodContext.getFacetHolder();
 
-        final ActionLayout actionLayout = Annotations.getAnnotation(processMethodContext.getMethod(), ActionLayout.class);
+        final ActionLayout actionLayout = Annotations.getAnnotations(processMethodContext.getMethod(), ActionLayout.class);
 
 
         // bookmarkable
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/collection/CollectionAnnotationFacetFactory.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/collection/CollectionAnnotationFacetFactory.java
index 9235997..7f8f730 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/collection/CollectionAnnotationFacetFactory.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/collection/CollectionAnnotationFacetFactory.java
@@ -85,7 +85,7 @@ public class CollectionAnnotationFacetFactory extends FacetFactoryAbstract {
         //
         // Set up CollectionDomainEventFacet, which will act as the hiding/disabling/validating advisor
         //
-        final Collection collection = Annotations.getAnnotation(method, Collection.class);
+        final Collection collection = Annotations.getAnnotations(method, Collection.class);
         final Class<? extends CollectionDomainEvent<?, ?>> collectionDomainEventType;
 
         final CollectionDomainEventFacetAbstract collectionDomainEventFacet;
@@ -163,7 +163,7 @@ public class CollectionAnnotationFacetFactory extends FacetFactoryAbstract {
         final FacetHolder holder = processMethodContext.getFacetHolder();
 
         // check for @Collection(hidden=...)
-        final Collection collection = Annotations.getAnnotation(method, Collection.class);
+        final Collection collection = Annotations.getAnnotations(method, Collection.class);
         HiddenFacet facet = HiddenFacetForCollectionAnnotation.create(collection, holder);
 
         FacetUtil.addFacet(facet);
@@ -174,7 +174,7 @@ public class CollectionAnnotationFacetFactory extends FacetFactoryAbstract {
         final FacetHolder holder = processMethodContext.getFacetHolder();
 
         // check for @Collection(editing=...)
-        final Collection collection = Annotations.getAnnotation(method, Collection.class);
+        final Collection collection = Annotations.getAnnotations(method, Collection.class);
         DisabledFacet facet = DisabledFacetForCollectionAnnotation.create(collection, holder);
 
         FacetUtil.addFacet(facet);
@@ -185,7 +185,7 @@ public class CollectionAnnotationFacetFactory extends FacetFactoryAbstract {
         final FacetHolder holder = processMethodContext.getFacetHolder();
 
         // search for @Collection(notPersisted=...)
-        final Collection collection = Annotations.getAnnotation(method, Collection.class);
+        final Collection collection = Annotations.getAnnotations(method, Collection.class);
         NotPersistedFacet facet = NotPersistedFacetForCollectionAnnotation.create(collection, holder);
 
         FacetUtil.addFacet(facet);
@@ -203,7 +203,7 @@ public class CollectionAnnotationFacetFactory extends FacetFactoryAbstract {
         }
 
         // check for @Collection(typeOf=...)
-        final Collection collection = Annotations.getAnnotation(method, Collection.class);
+        final Collection collection = Annotations.getAnnotations(method, Collection.class);
         TypeOfFacet facet = TypeOfFacetOnCollectionFromCollectionAnnotation
                 .create(collection, facetHolder, getSpecificationLoader());
 
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 5404be7..090c9cb 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
@@ -48,7 +48,7 @@ public class CollectionLayoutFacetFactory extends FacetFactoryAbstract implement
         final FacetHolder holder = processMethodContext.getFacetHolder();
 
         Properties properties = null;
-        final CollectionLayout collectionLayout = Annotations.getAnnotation(processMethodContext.getMethod(), CollectionLayout.class);
+        final CollectionLayout collectionLayout = Annotations.getAnnotations(processMethodContext.getMethod(), CollectionLayout.class);
 
 
         // cssClass
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/jaxb/JaxbXmlJavaTypeAdapterFacetFactory.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/jaxb/JaxbXmlJavaTypeAdapterFacetFactory.java
index 64112aa..1095016 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/jaxb/JaxbXmlJavaTypeAdapterFacetFactory.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/jaxb/JaxbXmlJavaTypeAdapterFacetFactory.java
@@ -82,7 +82,7 @@ public class JaxbXmlJavaTypeAdapterFacetFactory extends FacetFactoryAbstract
     public void process(final ProcessClassContext processClassContext) {
         final Class<?> cls = processClassContext.getCls();
 
-        final XmlJavaTypeAdapter annotation = Annotations.getAnnotation(cls, XmlJavaTypeAdapter.class);
+        final XmlJavaTypeAdapter annotation = Annotations.getAnnotations(cls, XmlJavaTypeAdapter.class);
         if(annotation == null) {
             return;
         }
@@ -99,7 +99,7 @@ public class JaxbXmlJavaTypeAdapterFacetFactory extends FacetFactoryAbstract
 
         final Method method = processMethodContext.getMethod();
 
-        final XmlJavaTypeAdapter annotation = Annotations.getAnnotation(method, XmlJavaTypeAdapter.class);
+        final XmlJavaTypeAdapter annotation = Annotations.getAnnotations(method, XmlJavaTypeAdapter.class);
         if(annotation == null) {
             return;
         }
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 207c5d2..7c2a303 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.getAnnotation(processMethodContext.getMethod(), MemberOrder.class);
+        final MemberOrder annotation = Annotations.getAnnotations(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/DomainObjectAnnotationFacetFactory.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobject/DomainObjectAnnotationFacetFactory.java
index dc645e5..fcf9b3d 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
@@ -111,7 +111,7 @@ public class DomainObjectAnnotationFacetFactory extends FacetFactoryAbstract
 
     void processAuditing(final ProcessClassContext processClassContext) {
         final Class<?> cls = processClassContext.getCls();
-        final DomainObject domainObject = Annotations.getAnnotation(cls, DomainObject.class);
+        final DomainObject domainObject = Annotations.getAnnotations(cls, DomainObject.class);
         final FacetHolder holder = processClassContext.getFacetHolder();
 
         //
@@ -136,7 +136,7 @@ public class DomainObjectAnnotationFacetFactory extends FacetFactoryAbstract
 
     void processPublishing(final ProcessClassContext processClassContext) {
         final Class<?> cls = processClassContext.getCls();
-        final DomainObject domainObject = Annotations.getAnnotation(cls, DomainObject.class);
+        final DomainObject domainObject = Annotations.getAnnotations(cls, DomainObject.class);
         final FacetHolder facetHolder = processClassContext.getFacetHolder();
 
         //
@@ -161,7 +161,7 @@ public class DomainObjectAnnotationFacetFactory extends FacetFactoryAbstract
         final FacetHolder facetHolder = processClassContext.getFacetHolder();
 
         // check from @DomainObject(auditing=...)
-        final DomainObject domainObjectAnnot = Annotations.getAnnotation(cls, DomainObject.class);
+        final DomainObject domainObjectAnnot = Annotations.getAnnotations(cls, DomainObject.class);
         Facet facet = createFor(domainObjectAnnot, facetHolder, cls);
 
         // then add
@@ -229,7 +229,7 @@ public class DomainObjectAnnotationFacetFactory extends FacetFactoryAbstract
 
     void processBounded(final ProcessClassContext processClassContext) {
         final Class<?> cls = processClassContext.getCls();
-        final DomainObject domainObject = Annotations.getAnnotation(cls, DomainObject.class);
+        final DomainObject domainObject = Annotations.getAnnotations(cls, DomainObject.class);
         final FacetHolder facetHolder = processClassContext.getFacetHolder();
 
         // check from @DomainObject(bounded=...)
@@ -241,7 +241,7 @@ public class DomainObjectAnnotationFacetFactory extends FacetFactoryAbstract
 
     void processEditing(final ProcessClassContext processClassContext) {
         final Class<?> cls = processClassContext.getCls();
-        final DomainObject domainObject = Annotations.getAnnotation(cls, DomainObject.class);
+        final DomainObject domainObject = Annotations.getAnnotations(cls, DomainObject.class);
         final FacetHolder facetHolder = processClassContext.getFacetHolder();
 
         // check from @DomainObject(editing=...)
@@ -254,7 +254,7 @@ public class DomainObjectAnnotationFacetFactory extends FacetFactoryAbstract
 
     void processObjectType(final ProcessClassContext processClassContext) {
         final Class<?> cls = processClassContext.getCls();
-        final DomainObject domainObject = Annotations.getAnnotation(cls, DomainObject.class);
+        final DomainObject domainObject = Annotations.getAnnotations(cls, DomainObject.class);
         final FacetHolder facetHolder = processClassContext.getFacetHolder();
 
         // check from @DomainObject(objectType=...)
@@ -275,7 +275,7 @@ public class DomainObjectAnnotationFacetFactory extends FacetFactoryAbstract
 
     void processNature(final ProcessClassContext processClassContext) {
         final Class<?> cls = processClassContext.getCls();
-        final DomainObject domainObject = Annotations.getAnnotation(cls, DomainObject.class);
+        final DomainObject domainObject = Annotations.getAnnotations(cls, DomainObject.class);
 
         if(domainObject == null) {
             return;
@@ -308,7 +308,7 @@ public class DomainObjectAnnotationFacetFactory extends FacetFactoryAbstract
     private void processLifecycleEvents(final ProcessClassContext processClassContext) {
 
         final Class<?> cls = processClassContext.getCls();
-        final DomainObject domainObject = Annotations.getAnnotation(cls, DomainObject.class);
+        final DomainObject domainObject = Annotations.getAnnotations(cls, DomainObject.class);
         if(domainObject == null) {
             return;
         }
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 8c3410e..187d7bf 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
@@ -19,6 +19,8 @@
 package org.apache.isis.core.metamodel.facets.object.domainobjectlayout;
 
 
+import java.util.List;
+
 import org.apache.isis.applib.annotation.BookmarkPolicy;
 import org.apache.isis.applib.annotation.DomainObjectLayout;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
@@ -28,7 +30,7 @@ import org.apache.isis.core.metamodel.facets.object.bookmarkpolicy.BookmarkPolic
 
 public class BookmarkPolicyFacetForDomainObjectLayoutAnnotation extends BookmarkPolicyFacetAbstract {
 
-    public static BookmarkPolicyFacet create(final DomainObjectLayout domainObjectLayout, final FacetHolder holder) {
+    public static BookmarkPolicyFacet create(final List<DomainObjectLayout> domainObjectLayout, final FacetHolder holder) {
         if(domainObjectLayout == null) {
             return null;
         }
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 075472b..25a2f30 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
@@ -19,6 +19,8 @@
 package org.apache.isis.core.metamodel.facets.object.domainobjectlayout;
 
 
+import java.util.List;
+
 import org.apache.isis.applib.annotation.BookmarkPolicy;
 import org.apache.isis.applib.annotation.ViewModelLayout;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
@@ -28,7 +30,7 @@ import org.apache.isis.core.metamodel.facets.object.bookmarkpolicy.BookmarkPolic
 
 public class BookmarkPolicyFacetForViewModelLayoutAnnotation extends BookmarkPolicyFacetAbstract {
 
-    public static BookmarkPolicyFacet create(final ViewModelLayout viewModelLayout, final FacetHolder holder) {
+    public static BookmarkPolicyFacet create(final List<ViewModelLayout> viewModelLayout, final FacetHolder holder) {
         if(viewModelLayout == null) {
             return null;
         }
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 bdd2d0f..fddfa5c 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
@@ -17,6 +17,8 @@
 
 package org.apache.isis.core.metamodel.facets.object.domainobjectlayout;
 
+import java.util.List;
+
 import com.google.common.base.Strings;
 
 import org.apache.isis.applib.annotation.DomainObjectLayout;
@@ -27,7 +29,7 @@ import org.apache.isis.core.metamodel.facets.members.cssclassfa.CssClassFaPositi
 
 public class CssClassFaFacetForDomainObjectLayoutAnnotation extends CssClassFaFacetAbstract {
 
-    public static CssClassFaFacet create(final DomainObjectLayout domainObjectLayout, final FacetHolder holder) {
+    public static CssClassFaFacet create(final List<DomainObjectLayout> domainObjectLayout, final FacetHolder holder) {
         if (domainObjectLayout == null) {
             return null;
         }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobjectlayout/CssClassFaFacetForViewModelLayoutAnnotation.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobjectlayout/CssClassFaFacetForViewModelLayoutAnnotation.java
index 725a089..8389c88 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobjectlayout/CssClassFaFacetForViewModelLayoutAnnotation.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobjectlayout/CssClassFaFacetForViewModelLayoutAnnotation.java
@@ -16,6 +16,8 @@
  * under the License. */
 package org.apache.isis.core.metamodel.facets.object.domainobjectlayout;
 
+import java.util.List;
+
 import com.google.common.base.Strings;
 
 import org.apache.isis.applib.annotation.ViewModelLayout;
@@ -26,7 +28,7 @@ import org.apache.isis.core.metamodel.facets.members.cssclassfa.CssClassFaPositi
 
 public class CssClassFaFacetForViewModelLayoutAnnotation extends CssClassFaFacetAbstract {
 
-    public static CssClassFaFacet create(final ViewModelLayout viewModelLayout, final FacetHolder holder) {
+    public static CssClassFaFacet create(final List<ViewModelLayout> viewModelLayout, final FacetHolder holder) {
         if (viewModelLayout == null) {
             return null;
         }
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 36060df..510b4d9 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
@@ -16,6 +16,8 @@
  * under the License. */
 package org.apache.isis.core.metamodel.facets.object.domainobjectlayout;
 
+import java.util.List;
+
 import com.google.common.base.Strings;
 
 import org.apache.isis.applib.annotation.DomainObjectLayout;
@@ -25,7 +27,7 @@ import org.apache.isis.core.metamodel.facets.members.cssclass.CssClassFacetAbstr
 
 public class CssClassFacetForDomainObjectLayoutAnnotation extends CssClassFacetAbstract {
 
-    public static CssClassFacet create(final DomainObjectLayout domainObjectLayout, final FacetHolder holder) {
+    public static CssClassFacet create(final List<DomainObjectLayout> domainObjectLayout, final FacetHolder holder) {
         if (domainObjectLayout == null) {
             return null;
         }
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 eb2a0ed..be518e7 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
@@ -16,6 +16,8 @@
  * under the License. */
 package org.apache.isis.core.metamodel.facets.object.domainobjectlayout;
 
+import java.util.List;
+
 import com.google.common.base.Strings;
 
 import org.apache.isis.applib.annotation.ViewModelLayout;
@@ -25,7 +27,7 @@ import org.apache.isis.core.metamodel.facets.members.cssclass.CssClassFacetAbstr
 
 public class CssClassFacetForViewModelLayoutAnnotation extends CssClassFacetAbstract {
 
-    public static CssClassFacet create(final ViewModelLayout viewModelLayout, final FacetHolder holder) {
+    public static CssClassFacet create(final List<ViewModelLayout> viewModelLayout, final FacetHolder holder) {
         if (viewModelLayout == null) {
             return null;
         }
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 e4aba95..22c467a 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
@@ -19,6 +19,8 @@
 
 package org.apache.isis.core.metamodel.facets.object.domainobjectlayout;
 
+import java.util.List;
+
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -42,7 +44,7 @@ public class CssClassFacetViaDomainObjectLayoutAnnotationUsingCssClassUiEvent ex
     private static final Logger LOG = LoggerFactory.getLogger(CssClassFacetViaDomainObjectLayoutAnnotationUsingCssClassUiEvent.class);
 
     public static Facet create(
-            final DomainObjectLayout domainObjectLayout,
+            final List<DomainObjectLayout> domainObjectLayout,
             final ServicesInjector servicesInjector,
             final IsisConfiguration configuration, final FacetHolder facetHolder) {
         if(domainObjectLayout == null) {
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 7082e69..0e53e20 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
@@ -19,6 +19,8 @@
 package org.apache.isis.core.metamodel.facets.object.domainobjectlayout;
 
 
+import java.util.List;
+
 import com.google.common.base.Strings;
 import org.apache.isis.applib.annotation.DomainObjectLayout;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
@@ -28,7 +30,7 @@ import org.apache.isis.core.metamodel.facets.all.describedas.DescribedAsFacetAbs
 
 public class DescribedAsFacetForDomainObjectLayoutAnnotation extends DescribedAsFacetAbstract {
 
-    public static DescribedAsFacet create(final DomainObjectLayout domainObjectLayout, final FacetHolder holder) {
+    public static DescribedAsFacet create(final List<DomainObjectLayout> domainObjectLayout, final FacetHolder holder) {
         if(domainObjectLayout == null) {
             return null;
         }
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 bbcb554..57999e9 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
@@ -19,6 +19,8 @@
 package org.apache.isis.core.metamodel.facets.object.domainobjectlayout;
 
 
+import java.util.List;
+
 import com.google.common.base.Strings;
 import org.apache.isis.applib.annotation.ViewModelLayout;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
@@ -28,7 +30,7 @@ import org.apache.isis.core.metamodel.facets.all.describedas.DescribedAsFacetAbs
 
 public class DescribedAsFacetForViewModelLayoutAnnotation extends DescribedAsFacetAbstract {
 
-    public static DescribedAsFacet create(final ViewModelLayout viewModelLayout, final FacetHolder holder) {
+    public static DescribedAsFacet create(final List<ViewModelLayout> viewModelLayout, final FacetHolder holder) {
         if(viewModelLayout == null) {
             return null;
         }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobjectlayout/DomainObjectLayoutFacetFactory.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobjectlayout/DomainObjectLayoutFacetFactory.java
index bbeac06..0b64a4a 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobjectlayout/DomainObjectLayoutFacetFactory.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobjectlayout/DomainObjectLayoutFacetFactory.java
@@ -16,6 +16,8 @@
  * under the License. */
 package org.apache.isis.core.metamodel.facets.object.domainobjectlayout;
 
+import java.util.List;
+
 import org.apache.isis.applib.annotation.DomainObjectLayout;
 import org.apache.isis.applib.annotation.ViewModelLayout;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
@@ -37,53 +39,53 @@ public class DomainObjectLayoutFacetFactory extends FacetFactoryAbstract {
 
         final FacetHolder facetHolder = processClassContext.getFacetHolder();
 
-        final DomainObjectLayout domainObjectLayout = Annotations.getAnnotation(cls, DomainObjectLayout.class);
-        final ViewModelLayout viewModelLayout = Annotations.getAnnotation(cls, ViewModelLayout.class);
+        final List<DomainObjectLayout> domainObjectLayouts = Annotations.getAnnotations(cls, DomainObjectLayout.class);
+        final List<ViewModelLayout> viewModelLayouts = Annotations.getAnnotations(cls, ViewModelLayout.class);
 
         FacetUtil.addFacet(
                 TitleFacetViaDomainObjectLayoutAnnotationUsingTitleUiEvent.create(
-                        domainObjectLayout, servicesInjector, getConfiguration(), facetHolder));
+                        domainObjectLayouts, servicesInjector, getConfiguration(), facetHolder));
         FacetUtil.addFacet(
                 IconFacetViaDomainObjectLayoutAnnotationUsingIconUiEvent.create(
-                        domainObjectLayout, servicesInjector, getConfiguration(), facetHolder));
+                        domainObjectLayouts, servicesInjector, getConfiguration(), facetHolder));
         FacetUtil.addFacet(
                 CssClassFacetViaDomainObjectLayoutAnnotationUsingCssClassUiEvent.create(
-                        domainObjectLayout, servicesInjector, getConfiguration(), facetHolder));
+                        domainObjectLayouts, servicesInjector, getConfiguration(), facetHolder));
 
         FacetUtil.addFacet(
-                CssClassFacetForDomainObjectLayoutAnnotation.create(domainObjectLayout, facetHolder));
+                CssClassFacetForDomainObjectLayoutAnnotation.create(domainObjectLayouts, facetHolder));
         FacetUtil.addFacet(
-                CssClassFacetForViewModelLayoutAnnotation.create(viewModelLayout, facetHolder));
+                CssClassFacetForViewModelLayoutAnnotation.create(viewModelLayouts, facetHolder));
 
         FacetUtil.addFacet(
-                CssClassFaFacetForDomainObjectLayoutAnnotation.create(domainObjectLayout, facetHolder));
+                CssClassFaFacetForDomainObjectLayoutAnnotation.create(domainObjectLayouts, facetHolder));
         FacetUtil.addFacet(
-                CssClassFaFacetForViewModelLayoutAnnotation.create(viewModelLayout, facetHolder));
+                CssClassFaFacetForViewModelLayoutAnnotation.create(viewModelLayouts, facetHolder));
 
         FacetUtil.addFacet(
-                DescribedAsFacetForDomainObjectLayoutAnnotation.create(domainObjectLayout, facetHolder));
+                DescribedAsFacetForDomainObjectLayoutAnnotation.create(domainObjectLayouts, facetHolder));
         FacetUtil.addFacet(
-                DescribedAsFacetForViewModelLayoutAnnotation.create(viewModelLayout, facetHolder));
+                DescribedAsFacetForViewModelLayoutAnnotation.create(viewModelLayouts, facetHolder));
 
         FacetUtil.addFacet(
-                NamedFacetForDomainObjectLayoutAnnotation.create(domainObjectLayout, facetHolder));
+                NamedFacetForDomainObjectLayoutAnnotation.create(domainObjectLayouts, facetHolder));
         FacetUtil.addFacet(
-                NamedFacetForViewModelLayoutAnnotation.create(viewModelLayout, facetHolder));
+                NamedFacetForViewModelLayoutAnnotation.create(viewModelLayouts, facetHolder));
 
         FacetUtil.addFacet(
-                PagedFacetForDomainObjectLayoutAnnotation.create(domainObjectLayout, facetHolder));
+                PagedFacetForDomainObjectLayoutAnnotation.create(domainObjectLayouts, facetHolder));
         FacetUtil.addFacet(
-                PagedFacetForViewModelLayoutAnnotation.create(viewModelLayout, facetHolder));
+                PagedFacetForViewModelLayoutAnnotation.create(viewModelLayouts, facetHolder));
 
         FacetUtil.addFacet(
-                PluralFacetForDomainObjectLayoutAnnotation.create(domainObjectLayout, facetHolder));
+                PluralFacetForDomainObjectLayoutAnnotation.create(domainObjectLayouts, facetHolder));
         FacetUtil.addFacet(
-                PluralFacetForViewModelLayoutAnnotation.create(viewModelLayout, facetHolder));
+                PluralFacetForViewModelLayoutAnnotation.create(viewModelLayouts, facetHolder));
 
         FacetUtil.addFacet(
-                BookmarkPolicyFacetForDomainObjectLayoutAnnotation.create(domainObjectLayout, facetHolder));
+                BookmarkPolicyFacetForDomainObjectLayoutAnnotation.create(domainObjectLayouts, facetHolder));
         FacetUtil.addFacet(
-                BookmarkPolicyFacetForViewModelLayoutAnnotation.create(viewModelLayout, facetHolder));
+                BookmarkPolicyFacetForViewModelLayoutAnnotation.create(viewModelLayouts, facetHolder));
 
         return;
     }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobjectlayout/IconFacetViaDomainObjectLayoutAnnotationUsingIconUiEvent.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobjectlayout/IconFacetViaDomainObjectLayoutAnnotationUsingIconUiEvent.java
index 9ef6145..0193844 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobjectlayout/IconFacetViaDomainObjectLayoutAnnotationUsingIconUiEvent.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobjectlayout/IconFacetViaDomainObjectLayoutAnnotationUsingIconUiEvent.java
@@ -19,6 +19,8 @@
 
 package org.apache.isis.core.metamodel.facets.object.domainobjectlayout;
 
+import java.util.List;
+
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -40,7 +42,7 @@ public class IconFacetViaDomainObjectLayoutAnnotationUsingIconUiEvent extends Ic
     private static final Logger LOG = LoggerFactory.getLogger(IconFacetViaDomainObjectLayoutAnnotationUsingIconUiEvent.class);
 
     public static Facet create(
-            final DomainObjectLayout domainObjectLayout,
+            final List<DomainObjectLayout> domainObjectLayout,
             final ServicesInjector servicesInjector,
             final IsisConfiguration configuration, final FacetHolder facetHolder) {
         if(domainObjectLayout == null) {
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobjectlayout/NamedFacetForDomainObjectLayoutAnnotation.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobjectlayout/NamedFacetForDomainObjectLayoutAnnotation.java
index 1763293..c4350b6 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobjectlayout/NamedFacetForDomainObjectLayoutAnnotation.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobjectlayout/NamedFacetForDomainObjectLayoutAnnotation.java
@@ -19,6 +19,8 @@
 package org.apache.isis.core.metamodel.facets.object.domainobjectlayout;
 
 
+import java.util.List;
+
 import com.google.common.base.Strings;
 import org.apache.isis.applib.annotation.DomainObjectLayout;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
@@ -28,7 +30,7 @@ import org.apache.isis.core.metamodel.facets.all.named.NamedFacetAbstract;
 
 public class NamedFacetForDomainObjectLayoutAnnotation extends NamedFacetAbstract {
 
-    public static NamedFacet create(final DomainObjectLayout domainObjectLayout, final FacetHolder holder) {
+    public static NamedFacet create(final List<DomainObjectLayout> domainObjectLayout, final FacetHolder holder) {
         if(domainObjectLayout == null) {
             return null;
         }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobjectlayout/NamedFacetForViewModelLayoutAnnotation.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobjectlayout/NamedFacetForViewModelLayoutAnnotation.java
index 2577da7..89e9210 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobjectlayout/NamedFacetForViewModelLayoutAnnotation.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobjectlayout/NamedFacetForViewModelLayoutAnnotation.java
@@ -19,6 +19,8 @@
 package org.apache.isis.core.metamodel.facets.object.domainobjectlayout;
 
 
+import java.util.List;
+
 import com.google.common.base.Strings;
 import org.apache.isis.applib.annotation.ViewModelLayout;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
@@ -28,7 +30,7 @@ import org.apache.isis.core.metamodel.facets.all.named.NamedFacetAbstract;
 
 public class NamedFacetForViewModelLayoutAnnotation extends NamedFacetAbstract {
 
-    public static NamedFacet create(final ViewModelLayout viewModelLayout, final FacetHolder holder) {
+    public static NamedFacet create(final List<ViewModelLayout> viewModelLayout, final FacetHolder holder) {
         if(viewModelLayout == null) {
             return null;
         }
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 2735b50..07ba4d3 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
@@ -19,6 +19,8 @@
 package org.apache.isis.core.metamodel.facets.object.domainobjectlayout;
 
 
+import java.util.List;
+
 import org.apache.isis.applib.annotation.DomainObjectLayout;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
 import org.apache.isis.core.metamodel.facets.object.paged.PagedFacet;
@@ -27,7 +29,7 @@ import org.apache.isis.core.metamodel.facets.object.paged.PagedFacetAbstract;
 
 public class PagedFacetForDomainObjectLayoutAnnotation extends PagedFacetAbstract {
 
-    public static PagedFacet create(final DomainObjectLayout domainObjectLayout, final FacetHolder holder) {
+    public static PagedFacet create(final List<DomainObjectLayout> domainObjectLayout, final FacetHolder holder) {
         if(domainObjectLayout == null) {
             return null;
         }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobjectlayout/PagedFacetForViewModelLayoutAnnotation.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobjectlayout/PagedFacetForViewModelLayoutAnnotation.java
index c667deb..387db2c 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobjectlayout/PagedFacetForViewModelLayoutAnnotation.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobjectlayout/PagedFacetForViewModelLayoutAnnotation.java
@@ -19,6 +19,8 @@
 package org.apache.isis.core.metamodel.facets.object.domainobjectlayout;
 
 
+import java.util.List;
+
 import org.apache.isis.applib.annotation.ViewModelLayout;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
 import org.apache.isis.core.metamodel.facets.object.paged.PagedFacet;
@@ -27,12 +29,16 @@ import org.apache.isis.core.metamodel.facets.object.paged.PagedFacetAbstract;
 
 public class PagedFacetForViewModelLayoutAnnotation extends PagedFacetAbstract {
 
-    public static PagedFacet create(final ViewModelLayout viewModelLayout, final FacetHolder holder) {
-        if(viewModelLayout == null) {
+    public static PagedFacet create(final List<ViewModelLayout> viewModelLayouts, final FacetHolder holder) {
+        if(viewModelLayouts.isEmpty()) {
             return null;
         }
-        final int paged = viewModelLayout.paged();
-        return paged > 1 ? new PagedFacetForViewModelLayoutAnnotation(paged, holder) : null;
+        return viewModelLayouts.stream()
+                .map(ViewModelLayout::paged)
+                .filter(paged -> paged > 1)
+                .map(paged -> new PagedFacetForViewModelLayoutAnnotation(paged, holder))
+                .findFirst()
+                .orElse(null);
     }
 
     private PagedFacetForViewModelLayoutAnnotation(final int value, final FacetHolder holder) {
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobjectlayout/PluralFacetForDomainObjectLayoutAnnotation.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobjectlayout/PluralFacetForDomainObjectLayoutAnnotation.java
index 33a97d1..0055a86 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobjectlayout/PluralFacetForDomainObjectLayoutAnnotation.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobjectlayout/PluralFacetForDomainObjectLayoutAnnotation.java
@@ -19,7 +19,9 @@
 package org.apache.isis.core.metamodel.facets.object.domainobjectlayout;
 
 
-import com.google.common.base.Strings;
+import java.util.List;
+import java.util.Objects;
+
 import org.apache.isis.applib.annotation.DomainObjectLayout;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
 import org.apache.isis.core.metamodel.facets.object.plural.PluralFacet;
@@ -28,12 +30,16 @@ import org.apache.isis.core.metamodel.facets.object.plural.PluralFacetAbstract;
 
 public class PluralFacetForDomainObjectLayoutAnnotation extends PluralFacetAbstract {
 
-    public static PluralFacet create(final DomainObjectLayout domainObjectLayout, final FacetHolder holder) {
-        if(domainObjectLayout == null) {
+    public static PluralFacet create(final List<DomainObjectLayout> domainObjectLayouts, final FacetHolder holder) {
+        if(domainObjectLayouts.isEmpty()) {
             return null;
         }
-        final String plural = Strings.emptyToNull(domainObjectLayout.plural());
-        return plural != null ? new PluralFacetForDomainObjectLayoutAnnotation(plural, holder) : null;
+        return domainObjectLayouts.stream()
+                .map(DomainObjectLayout::plural)
+                .filter(Objects::nonNull)
+                .map(plural -> new PluralFacetForDomainObjectLayoutAnnotation(plural, holder))
+                .findFirst()
+                .orElse(null);
     }
 
     private PluralFacetForDomainObjectLayoutAnnotation(final String value, final FacetHolder holder) {
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobjectlayout/PluralFacetForViewModelLayoutAnnotation.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobjectlayout/PluralFacetForViewModelLayoutAnnotation.java
index be0842a..e73efe2 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobjectlayout/PluralFacetForViewModelLayoutAnnotation.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobjectlayout/PluralFacetForViewModelLayoutAnnotation.java
@@ -19,6 +19,8 @@
 package org.apache.isis.core.metamodel.facets.object.domainobjectlayout;
 
 
+import java.util.List;
+
 import com.google.common.base.Strings;
 import org.apache.isis.applib.annotation.ViewModelLayout;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
@@ -28,7 +30,7 @@ import org.apache.isis.core.metamodel.facets.object.plural.PluralFacetAbstract;
 
 public class PluralFacetForViewModelLayoutAnnotation extends PluralFacetAbstract {
 
-    public static PluralFacet create(final ViewModelLayout viewModelLayout, final FacetHolder holder) {
+    public static PluralFacet create(final List<ViewModelLayout> viewModelLayout, final FacetHolder holder) {
         if(viewModelLayout == null) {
             return null;
         }
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 f09204e..b1b8177 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
@@ -19,6 +19,9 @@
 
 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;
 
@@ -43,30 +46,34 @@ public class TitleFacetViaDomainObjectLayoutAnnotationUsingTitleUiEvent extends
     private static final Logger LOG = LoggerFactory.getLogger(TitleFacetViaDomainObjectLayoutAnnotationUsingTitleUiEvent.class);
 
     public static Facet create(
-            final DomainObjectLayout domainObjectLayout,
+            final List<DomainObjectLayout> domainObjectLayouts,
             final ServicesInjector servicesInjector,
             final IsisConfiguration configuration, final FacetHolder facetHolder) {
-        if(domainObjectLayout == null) {
+        if(domainObjectLayouts.isEmpty()) {
             return null;
         }
-        final Class<? extends TitleUiEvent<?>> titleUiEventClass = domainObjectLayout.titleUiEvent();
-
-        if(!EventUtil.eventTypeIsPostable(
-                titleUiEventClass,
-                TitleUiEvent.Noop.class,
-                TitleUiEvent.Default.class,
-                "isis.reflector.facet.domainObjectLayoutAnnotation.titleUiEvent.postForDefault",
-                configuration)) {
-            return null;
+        final Optional<? extends Class<? extends TitleUiEvent<?>>> titleUiEventClassIfAny = domainObjectLayouts.stream()
+                .map(DomainObjectLayout::titleUiEvent)
+                .filter(titleUiEventClass -> EventUtil.eventTypeIsPostable(
+                        titleUiEventClass,
+                        TitleUiEvent.Noop.class,
+                        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);
         }
 
-        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;
     }
 
     private final Class<? extends TitleUiEvent<?>> titleUiEventClass;
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainservice/annotation/DomainServiceFacetAnnotationFactory.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainservice/annotation/DomainServiceFacetAnnotationFactory.java
index cdbbce1..684745c 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainservice/annotation/DomainServiceFacetAnnotationFactory.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainservice/annotation/DomainServiceFacetAnnotationFactory.java
@@ -60,7 +60,7 @@ public class DomainServiceFacetAnnotationFactory extends FacetFactoryAbstract im
     @Override
     public void process(ProcessClassContext processClassContext) {
         final Class<?> cls = processClassContext.getCls();
-        final DomainService annotation = Annotations.getAnnotation(cls, DomainService.class);
+        final DomainService annotation = Annotations.getAnnotations(cls, DomainService.class);
         if (annotation == null) {
             return;
         }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainservicelayout/DomainServiceLayoutFacetFactory.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainservicelayout/DomainServiceLayoutFacetFactory.java
index 8054917..7187780 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainservicelayout/DomainServiceLayoutFacetFactory.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainservicelayout/DomainServiceLayoutFacetFactory.java
@@ -41,8 +41,8 @@ public class DomainServiceLayoutFacetFactory extends FacetFactoryAbstract {
 
         final FacetHolder facetHolder = processClassContext.getFacetHolder();
 
-        final DomainService domainService = Annotations.getAnnotation(cls, DomainService.class);
-        final DomainServiceLayout domainServiceLayout = Annotations.getAnnotation(cls, DomainServiceLayout.class);
+        final DomainService domainService = Annotations.getAnnotations(cls, DomainService.class);
+        final DomainServiceLayout domainServiceLayout = Annotations.getAnnotations(cls, DomainServiceLayout.class);
 
         if (domainService == null && domainServiceLayout == null) {
             return;
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 90d31d4..caed1d4 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
@@ -30,8 +30,6 @@ import org.apache.isis.core.metamodel.facets.FacetFactoryAbstract;
 import org.apache.isis.core.metamodel.facets.object.encodeable.EncodableFacet;
 import org.apache.isis.core.metamodel.facets.object.encodeable.EncoderDecoderUtil;
 import org.apache.isis.core.metamodel.progmodel.DeprecatedMarker;
-import org.apache.isis.core.metamodel.services.ServicesInjector;
-import org.apache.isis.core.metamodel.services.persistsession.PersistenceSessionServiceInternal;
 
 /**
  * @deprecated
@@ -54,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.getAnnotation(cls, Encodable.class);
+        final Encodable annotation = Annotations.getAnnotations(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 0b46def..025699d 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.getAnnotation(cls, MemberGroupLayout.class);
+        final MemberGroupLayout mglAnnot = Annotations.getAnnotations(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/parseable/annotcfg/ParseableFacetAnnotationElseConfigurationFactory.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/parseable/annotcfg/ParseableFacetAnnotationElseConfigurationFactory.java
index d663152..e3a0460 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.getAnnotation(cls, Parseable.class);
+        final Parseable annotation = Annotations.getAnnotations(cls, Parseable.class);
 
         // create from annotation, if present
         if (annotation != null) {
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/value/annotcfg/ValueFacetAnnotationOrConfigurationFactory.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/value/annotcfg/ValueFacetAnnotationOrConfigurationFactory.java
index ed73cd8..c4c8877 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/value/annotcfg/ValueFacetAnnotationOrConfigurationFactory.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/value/annotcfg/ValueFacetAnnotationOrConfigurationFactory.java
@@ -84,7 +84,7 @@ public class ValueFacetAnnotationOrConfigurationFactory extends FacetFactoryAbst
     private ValueFacet create(final Class<?> cls, final FacetHolder holder) {
 
         // create from annotation, if present
-        final Value annotation = Annotations.getAnnotation(cls, Value.class);
+        final Value annotation = Annotations.getAnnotations(cls, Value.class);
         if (annotation != null) {
             final ValueFacetAnnotation facet = new ValueFacetAnnotation(cls, holder, servicesInjector);
             if (facet.isValid()) {
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/property/PropertyAnnotationFacetFactory.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/property/PropertyAnnotationFacetFactory.java
index 0aac427..3b1cc62 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/property/PropertyAnnotationFacetFactory.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/property/PropertyAnnotationFacetFactory.java
@@ -109,7 +109,7 @@ public class PropertyAnnotationFacetFactory extends FacetFactoryAbstract impleme
         //
         // Set up PropertyDomainEventFacet, which will act as the hiding/disabling/validating advisor
         //
-        final Property property = Annotations.getAnnotation(method, Property.class);
+        final Property property = Annotations.getAnnotations(method, Property.class);
         final Class<? extends PropertyDomainEvent<?, ?>> propertyDomainEventType;
 
         final PropertyDomainEventFacetAbstract propertyDomainEventFacet;
@@ -185,7 +185,7 @@ public class PropertyAnnotationFacetFactory extends FacetFactoryAbstract impleme
         final FacetHolder holder = processMethodContext.getFacetHolder();
 
         // search for @Property(hidden=...)
-        final Property property = Annotations.getAnnotation(method, Property.class);
+        final Property property = Annotations.getAnnotations(method, Property.class);
         HiddenFacet facet = HiddenFacetForPropertyAnnotation.create(property, holder);
 
         FacetUtil.addFacet(facet);
@@ -196,7 +196,7 @@ public class PropertyAnnotationFacetFactory extends FacetFactoryAbstract impleme
         final FacetHolder holder = processMethodContext.getFacetHolder();
 
         // search for @Property(editing=...)
-        final Property property = Annotations.getAnnotation(method, Property.class);
+        final Property property = Annotations.getAnnotations(method, Property.class);
         DisabledFacet facet = DisabledFacetForPropertyAnnotation.create(property, holder);
 
         FacetUtil.addFacet(facet);
@@ -206,7 +206,7 @@ public class PropertyAnnotationFacetFactory extends FacetFactoryAbstract impleme
 
         final Class<?> cls = processMethodContext.getCls();
         final Method method = processMethodContext.getMethod();
-        final Property property = Annotations.getAnnotation(method, Property.class);
+        final Property property = Annotations.getAnnotations(method, Property.class);
         final FacetedMethod facetHolder = processMethodContext.getFacetHolder();
 
         final FacetHolder holder = facetHolder;
@@ -229,7 +229,7 @@ public class PropertyAnnotationFacetFactory extends FacetFactoryAbstract impleme
     void processPublishing(final ProcessMethodContext processMethodContext) {
 
         final Method method = processMethodContext.getMethod();
-        final Property property = Annotations.getAnnotation(method, Property.class);
+        final Property property = Annotations.getAnnotations(method, Property.class);
         final FacetHolder holder = processMethodContext.getFacetHolder();
 
         //
@@ -256,7 +256,7 @@ public class PropertyAnnotationFacetFactory extends FacetFactoryAbstract impleme
         final FacetHolder holder = processMethodContext.getFacetHolder();
 
         // search for @Property(maxLength=...)
-        final Property property = Annotations.getAnnotation(method, Property.class);
+        final Property property = Annotations.getAnnotations(method, Property.class);
         MaxLengthFacet facet = MaxLengthFacetForPropertyAnnotation.create(property, holder);
 
         FacetUtil.addFacet(facet);
@@ -267,7 +267,7 @@ public class PropertyAnnotationFacetFactory extends FacetFactoryAbstract impleme
         final FacetHolder holder = processMethodContext.getFacetHolder();
 
         // search for @Property(mustSatisfy=...)
-        final Property property = Annotations.getAnnotation(method, Property.class);
+        final Property property = Annotations.getAnnotations(method, Property.class);
         Facet facet = MustSatisfySpecificationFacetForPropertyAnnotation.create(property, holder, servicesInjector);
 
         FacetUtil.addFacet(facet);
@@ -278,7 +278,7 @@ public class PropertyAnnotationFacetFactory extends FacetFactoryAbstract impleme
         final FacetHolder holder = processMethodContext.getFacetHolder();
 
         // search for @Property(notPersisted=...)
-        final Property property = Annotations.getAnnotation(method, Property.class);
+        final Property property = Annotations.getAnnotations(method, Property.class);
         NotPersistedFacet facet = NotPersistedFacetForPropertyAnnotation.create(property, holder);
 
         FacetUtil.addFacet(facet);
@@ -291,7 +291,7 @@ public class PropertyAnnotationFacetFactory extends FacetFactoryAbstract impleme
         final FacetHolder holder = processMethodContext.getFacetHolder();
 
         // check for @Nullable
-        final Nullable nullableAnnotation = Annotations.getAnnotation(method, Nullable.class);
+        final Nullable nullableAnnotation = Annotations.getAnnotations(method, Nullable.class);
         final MandatoryFacet facet2 =
                 MandatoryFacetInvertedByNullableAnnotationOnProperty.create(nullableAnnotation, method, holder);
         FacetUtil.addFacet(facet2);
@@ -299,7 +299,7 @@ public class PropertyAnnotationFacetFactory extends FacetFactoryAbstract impleme
                     facet2, "Conflicting @Nullable with other optionality annotation");
 
         // search for @Property(optional=...)
-        final Property property = Annotations.getAnnotation(method, Property.class);
+        final Property property = Annotations.getAnnotations(method, Property.class);
         final MandatoryFacet facet3 = MandatoryFacetForPropertyAnnotation.create(property, method, holder);
         FacetUtil.addFacet(facet3);
         conflictingOptionalityValidator.flagIfConflict(
@@ -313,11 +313,11 @@ public class PropertyAnnotationFacetFactory extends FacetFactoryAbstract impleme
         final Class<?> returnType = processMethodContext.getMethod().getReturnType();
 
         // check for @Pattern first
-        final Pattern annotation = Annotations.getAnnotation(processMethodContext.getMethod(), Pattern.class);
+        final Pattern annotation = Annotations.getAnnotations(processMethodContext.getMethod(), Pattern.class);
         RegExFacet facet = RegExFacetForPatternAnnotationOnProperty.create(annotation, returnType, holder);
 
         // else search for @Property(pattern=...)
-        final Property property = Annotations.getAnnotation(method, Property.class);
+        final Property property = Annotations.getAnnotations(method, Property.class);
         if (facet == null) {
             facet = RegExFacetForPropertyAnnotation.create(property, returnType, holder);
         }
@@ -332,7 +332,7 @@ public class PropertyAnnotationFacetFactory extends FacetFactoryAbstract impleme
 
 
         // else search for @Property(maxLength=...)
-        final Property property = Annotations.getAnnotation(method, Property.class);
+        final Property property = Annotations.getAnnotations(method, Property.class);
         FileAcceptFacet facet = FileAcceptFacetForPropertyAnnotation.create(property, holder);
 
         FacetUtil.addFacet(facet);
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/propertylayout/PropertyLayoutFacetFactory.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/propertylayout/PropertyLayoutFacetFactory.java
index 65ab4e4..45f2bc3 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/propertylayout/PropertyLayoutFacetFactory.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/propertylayout/PropertyLayoutFacetFactory.java
@@ -190,7 +190,7 @@ public class PropertyLayoutFacetFactory extends FacetFactoryAbstract implements
 
     PropertyLayout propertyLayoutAnnotationFrom(final ProcessMethodContext processMethodContext) {
         final Method method = processMethodContext.getMethod();
-        return Annotations.getAnnotation(method, PropertyLayout.class);
+        return Annotations.getAnnotations(method, PropertyLayout.class);
     }
 
 
diff --git a/core/metamodel/src/main/java/org/apache/isis/objectstore/jdo/metamodel/facets/object/datastoreidentity/JdoDatastoreIdentityAnnotationFacetFactory.java b/core/metamodel/src/main/java/org/apache/isis/objectstore/jdo/metamodel/facets/object/datastoreidentity/JdoDatastoreIdentityAnnotationFacetFactory.java
index 6dea94d..a3af30a 100644
--- a/core/metamodel/src/main/java/org/apache/isis/objectstore/jdo/metamodel/facets/object/datastoreidentity/JdoDatastoreIdentityAnnotationFacetFactory.java
+++ b/core/metamodel/src/main/java/org/apache/isis/objectstore/jdo/metamodel/facets/object/datastoreidentity/JdoDatastoreIdentityAnnotationFacetFactory.java
@@ -43,7 +43,7 @@ public class JdoDatastoreIdentityAnnotationFacetFactory extends FacetFactoryAbst
             return;
         }
 
-        final DatastoreIdentity annotation = Annotations.getAnnotation(cls, DatastoreIdentity.class);
+        final DatastoreIdentity annotation = Annotations.getAnnotations(cls, DatastoreIdentity.class);
         if (annotation == null) {
             return;
         }
diff --git a/core/metamodel/src/main/java/org/apache/isis/objectstore/jdo/metamodel/facets/object/discriminator/JdoDiscriminatorAnnotationFacetFactory.java b/core/metamodel/src/main/java/org/apache/isis/objectstore/jdo/metamodel/facets/object/discriminator/JdoDiscriminatorAnnotationFacetFactory.java
index 303f24c..c24aaa5 100644
--- a/core/metamodel/src/main/java/org/apache/isis/objectstore/jdo/metamodel/facets/object/discriminator/JdoDiscriminatorAnnotationFacetFactory.java
+++ b/core/metamodel/src/main/java/org/apache/isis/objectstore/jdo/metamodel/facets/object/discriminator/JdoDiscriminatorAnnotationFacetFactory.java
@@ -46,7 +46,7 @@ public class JdoDiscriminatorAnnotationFacetFactory extends FacetFactoryAbstract
             return;
         }
 
-        final Discriminator annotation = Annotations.getAnnotation(processClassContext.getCls(), Discriminator.class);
+        final Discriminator annotation = Annotations.getAnnotations(processClassContext.getCls(), Discriminator.class);
         if (annotation == null) {
             return;
         }
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 4ea41a2..0023f9f 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.getAnnotation(cls, PersistenceCapable.class);
+        final PersistenceCapable annotation = Annotations.getAnnotations(cls, PersistenceCapable.class);
         if (annotation == null) {
             return;
         }
diff --git a/core/metamodel/src/main/java/org/apache/isis/objectstore/jdo/metamodel/facets/object/query/JdoQueryAnnotationFacetFactory.java b/core/metamodel/src/main/java/org/apache/isis/objectstore/jdo/metamodel/facets/object/query/JdoQueryAnnotationFacetFactory.java
index e08d788..a81796e 100644
--- a/core/metamodel/src/main/java/org/apache/isis/objectstore/jdo/metamodel/facets/object/query/JdoQueryAnnotationFacetFactory.java
+++ b/core/metamodel/src/main/java/org/apache/isis/objectstore/jdo/metamodel/facets/object/query/JdoQueryAnnotationFacetFactory.java
@@ -62,7 +62,7 @@ public class JdoQueryAnnotationFacetFactory extends FacetFactoryAbstract impleme
             return;
         }
 
-        final Queries namedQueriesAnnotation = Annotations.getAnnotation(cls, Queries.class);
+        final Queries namedQueriesAnnotation = Annotations.getAnnotations(cls, Queries.class);
         final FacetHolder facetHolder = processClassContext.getFacetHolder();
         
         if (namedQueriesAnnotation != null) {
@@ -71,7 +71,7 @@ public class JdoQueryAnnotationFacetFactory extends FacetFactoryAbstract impleme
             return;
         }
 
-        final Query namedQueryAnnotation = Annotations.getAnnotation(cls, Query.class);
+        final Query namedQueryAnnotation = Annotations.getAnnotations(cls, Query.class);
         if (namedQueryAnnotation != null) {
             FacetUtil.addFacet(new JdoQueryFacetAnnotation(
                     namedQueryAnnotation, facetHolder));
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 33190a8..e1a5aa2 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.getAnnotation(processMethodContext.getMethod(), Column.class);
+        final Column jdoColumnAnnotation = Annotations.getAnnotations(processMethodContext.getMethod(), Column.class);
 
         if (jdoColumnAnnotation == null) {
             if(existingFacet != null && !existingFacet.isNoop()) {
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 0ecbe73..1ffe8d8 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.getAnnotation(processMethodContext.getMethod(), Column.class);
+        final Column annotation = Annotations.getAnnotations(processMethodContext.getMethod(), Column.class);
 
         final FacetedMethod holder = processMethodContext.getFacetHolder();
         
diff --git a/core/metamodel/src/main/java/org/apache/isis/objectstore/jdo/metamodel/facets/prop/column/MaxLengthDerivedFromJdoColumnAnnotationFacetFactory.java b/core/metamodel/src/main/java/org/apache/isis/objectstore/jdo/metamodel/facets/prop/column/MaxLengthDerivedFromJdoColumnAnnotationFacetFactory.java
index d261e88..26b2cfa 100644
--- a/core/metamodel/src/main/java/org/apache/isis/objectstore/jdo/metamodel/facets/prop/column/MaxLengthDerivedFromJdoColumnAnnotationFacetFactory.java
+++ b/core/metamodel/src/main/java/org/apache/isis/objectstore/jdo/metamodel/facets/prop/column/MaxLengthDerivedFromJdoColumnAnnotationFacetFactory.java
@@ -59,13 +59,17 @@ public class MaxLengthDerivedFromJdoColumnAnnotationFacetFactory extends FacetFa
             return;
         }
 
-        final Column annotation = Annotations.getAnnotation(processMethodContext.getMethod(), Column.class);
+        final List<Column> annotations = Annotations.getAnnotations(processMethodContext.getMethod(), Column.class);
 
         if(String.class != processMethodContext.getMethod().getReturnType()) {
             return;
         } 
 
-        if (annotation == null || annotation.length() == -1) {
+        if (annotations.isEmpty()) {
+            return;
+        }
+        final Column annotation = annotations.get(0);
+        if(annotation.length() == -1) {
             return;
         }
 
diff --git a/core/metamodel/src/main/java/org/apache/isis/objectstore/jdo/metamodel/facets/prop/primarykey/JdoPrimaryKeyAnnotationFacetFactory.java b/core/metamodel/src/main/java/org/apache/isis/objectstore/jdo/metamodel/facets/prop/primarykey/JdoPrimaryKeyAnnotationFacetFactory.java
index 980043a..3cf8034 100644
--- a/core/metamodel/src/main/java/org/apache/isis/objectstore/jdo/metamodel/facets/prop/primarykey/JdoPrimaryKeyAnnotationFacetFactory.java
+++ b/core/metamodel/src/main/java/org/apache/isis/objectstore/jdo/metamodel/facets/prop/primarykey/JdoPrimaryKeyAnnotationFacetFactory.java
@@ -42,7 +42,7 @@ public class JdoPrimaryKeyAnnotationFacetFactory extends FacetFactoryAbstract {
             return;
         }
 
-        final PrimaryKey annotation = Annotations.getAnnotation(processMethodContext.getMethod(), PrimaryKey.class);
+        final PrimaryKey annotation = Annotations.getAnnotations(processMethodContext.getMethod(), PrimaryKey.class);
         if (annotation == null) {
             return;
         }
diff --git a/core/runtime/src/main/java/org/apache/isis/core/runtime/services/eventbus/EventBusServiceDefault.java b/core/runtime/src/main/java/org/apache/isis/core/runtime/services/eventbus/EventBusServiceDefault.java
index 14d2e23..0359f87 100644
--- a/core/runtime/src/main/java/org/apache/isis/core/runtime/services/eventbus/EventBusServiceDefault.java
+++ b/core/runtime/src/main/java/org/apache/isis/core/runtime/services/eventbus/EventBusServiceDefault.java
@@ -61,7 +61,7 @@ public abstract class EventBusServiceDefault extends EventBusService {
         if(domainService instanceof RequestScopedService) {
             // ok; allow to be registered multiple times (each xactn) since stored in a set.
         } else {
-            if (Annotations.getAnnotation(domainService.getClass(), RequestScoped.class) != null) {
+            if (Annotations.getAnnotations(domainService.getClass(), RequestScoped.class) != null) {
                 throw new IllegalArgumentException("Request-scoped services must register their proxy, not themselves");
             }
             // a singleton

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