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/25 14:37:21 UTC

[isis] 07/08: ISIS-1632: adds initial support for @Meta annotation.

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

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

commit 2861102ec9994b552b08e07491530ee7d265633e
Author: Dan Haywood <da...@haywood-associates.co.uk>
AuthorDate: Mon Oct 23 17:31:22 2017 +0100

    ISIS-1632: adds initial support for @Meta annotation.
    
    However, these are not recursive, and does not merge in multiple definitions of various attributes at different levels.
---
 .../java/org/apache/isis/applib/AppManifest.java   |  13 ++-
 .../org/apache/isis/applib/annotation/Action.java  |   2 +-
 .../isis/applib/annotation/ActionLayout.java       |   2 +-
 .../apache/isis/applib/annotation/Collection.java  |   2 +-
 .../isis/applib/annotation/CollectionLayout.java   |   2 +-
 .../isis/applib/annotation/DomainObject.java       |   2 +-
 .../isis/applib/annotation/DomainObjectLayout.java |   2 +-
 .../isis/applib/annotation/DomainService.java      |   2 +-
 .../applib/annotation/DomainServiceLayout.java     |   2 +-
 .../isis/applib/annotation/MemberGroupLayout.java  |   2 +-
 .../org/apache/isis/applib/annotation/Meta.java    |  34 +++++++
 .../apache/isis/applib/annotation/Parameter.java   |   2 +-
 .../isis/applib/annotation/ParameterLayout.java    |   2 +-
 .../apache/isis/applib/annotation/Property.java    |   4 +-
 .../isis/applib/annotation/PropertyLayout.java     |   2 +-
 .../apache/isis/applib/annotation/ViewModel.java   |   2 +-
 .../isis/applib/annotation/ViewModelLayout.java    |   2 +-
 .../isis/core/metamodel/facets/Annotations.java    | 103 ++++++++++++++++++++-
 .../param/layout/ParameterLayoutFacetFactory.java  |   5 +-
 .../IsisComponentProvider.java                     |   4 +
 20 files changed, 171 insertions(+), 20 deletions(-)

diff --git a/core/applib/src/main/java/org/apache/isis/applib/AppManifest.java b/core/applib/src/main/java/org/apache/isis/applib/AppManifest.java
index 22c4fe4..cc7ccd6 100644
--- a/core/applib/src/main/java/org/apache/isis/applib/AppManifest.java
+++ b/core/applib/src/main/java/org/apache/isis/applib/AppManifest.java
@@ -20,6 +20,7 @@
 package org.apache.isis.applib;
 
 import java.io.UnsupportedEncodingException;
+import java.lang.annotation.Annotation;
 import java.net.URISyntaxException;
 import java.net.URL;
 import java.net.URLDecoder;
@@ -32,7 +33,6 @@ import java.util.Set;
 import javax.jdo.annotations.PersistenceCapable;
 
 import com.google.common.collect.Lists;
-import com.google.common.collect.Maps;
 
 import org.reflections.vfs.SystemDir;
 import org.reflections.vfs.Vfs;
@@ -224,6 +224,17 @@ public interface AppManifest {
         }
         //endregion
 
+        //region > metaAnnotationTypes
+        private Set<Class<? extends Annotation>> metaAnnotationTypes;
+
+        public Set<Class<? extends Annotation>> getMetaAnnotationTypes() {
+            return metaAnnotationTypes;
+        }
+        public void setMetaAnnotationTypes(final Set<Class<? extends Annotation>> metaAnnotationTypes) {
+            this.metaAnnotationTypes = metaAnnotationTypes;
+        }
+        //endregion
+
         //region > domainServiceTypes
         private Set<Class<?>> domainServiceTypes;
         /**
diff --git a/core/applib/src/main/java/org/apache/isis/applib/annotation/Action.java b/core/applib/src/main/java/org/apache/isis/applib/annotation/Action.java
index 9e4e3a3..11ab9f8 100644
--- a/core/applib/src/main/java/org/apache/isis/applib/annotation/Action.java
+++ b/core/applib/src/main/java/org/apache/isis/applib/annotation/Action.java
@@ -31,7 +31,7 @@ import org.apache.isis.applib.services.eventbus.ActionDomainEvent;
  * Domain semantics for domain object collection.
  */
 @Inherited
-@Target({ ElementType.METHOD })
+@Target({ ElementType.METHOD, ElementType.ANNOTATION_TYPE })
 @Retention(RetentionPolicy.RUNTIME)
 public @interface Action {
 
diff --git a/core/applib/src/main/java/org/apache/isis/applib/annotation/ActionLayout.java b/core/applib/src/main/java/org/apache/isis/applib/annotation/ActionLayout.java
index 3c91af5..67f54b1 100644
--- a/core/applib/src/main/java/org/apache/isis/applib/annotation/ActionLayout.java
+++ b/core/applib/src/main/java/org/apache/isis/applib/annotation/ActionLayout.java
@@ -31,7 +31,7 @@ import javax.xml.bind.annotation.XmlType;
  * Layout hints for actions.
  */
 @Inherited
-@Target({ ElementType.METHOD })
+@Target({ ElementType.METHOD, ElementType.ANNOTATION_TYPE })
 @Retention(RetentionPolicy.RUNTIME)
 public @interface ActionLayout {
 
diff --git a/core/applib/src/main/java/org/apache/isis/applib/annotation/Collection.java b/core/applib/src/main/java/org/apache/isis/applib/annotation/Collection.java
index 50b8f95..a9085b0 100644
--- a/core/applib/src/main/java/org/apache/isis/applib/annotation/Collection.java
+++ b/core/applib/src/main/java/org/apache/isis/applib/annotation/Collection.java
@@ -33,7 +33,7 @@ import org.apache.isis.applib.services.eventbus.CollectionDomainEvent;
  * Domain semantics for domain object collection.
  */
 @Inherited
-@Target({ ElementType.METHOD, ElementType.FIELD })
+@Target({ ElementType.METHOD, ElementType.FIELD, ElementType.ANNOTATION_TYPE})
 @Retention(RetentionPolicy.RUNTIME)
 public @interface Collection {
 
diff --git a/core/applib/src/main/java/org/apache/isis/applib/annotation/CollectionLayout.java b/core/applib/src/main/java/org/apache/isis/applib/annotation/CollectionLayout.java
index 336d7e1..fcfa6f1 100644
--- a/core/applib/src/main/java/org/apache/isis/applib/annotation/CollectionLayout.java
+++ b/core/applib/src/main/java/org/apache/isis/applib/annotation/CollectionLayout.java
@@ -30,7 +30,7 @@ import java.util.Comparator;
  * Layout hints for collections.
  */
 @Inherited
-@Target({ ElementType.METHOD, ElementType.FIELD })
+@Target({ ElementType.METHOD, ElementType.FIELD, ElementType.ANNOTATION_TYPE })
 @Retention(RetentionPolicy.RUNTIME)
 public @interface CollectionLayout {
 
diff --git a/core/applib/src/main/java/org/apache/isis/applib/annotation/DomainObject.java b/core/applib/src/main/java/org/apache/isis/applib/annotation/DomainObject.java
index 23fc34d..afee19d 100644
--- a/core/applib/src/main/java/org/apache/isis/applib/annotation/DomainObject.java
+++ b/core/applib/src/main/java/org/apache/isis/applib/annotation/DomainObject.java
@@ -36,7 +36,7 @@ import org.apache.isis.applib.services.eventbus.ObjectUpdatingEvent;
  * Domain semantics for domain objects (entities and view models; for services see {@link org.apache.isis.applib.annotation.DomainService}).
  */
 @Inherited
-@Target({ ElementType.TYPE })
+@Target({ ElementType.TYPE, ElementType.ANNOTATION_TYPE })
 @Retention(RetentionPolicy.RUNTIME)
 public @interface DomainObject {
 
diff --git a/core/applib/src/main/java/org/apache/isis/applib/annotation/DomainObjectLayout.java b/core/applib/src/main/java/org/apache/isis/applib/annotation/DomainObjectLayout.java
index 84a8fca..377efdf 100644
--- a/core/applib/src/main/java/org/apache/isis/applib/annotation/DomainObjectLayout.java
+++ b/core/applib/src/main/java/org/apache/isis/applib/annotation/DomainObjectLayout.java
@@ -33,7 +33,7 @@ import org.apache.isis.applib.services.eventbus.TitleUiEvent;
  * Layout hints for domain objects.
  */
 @Inherited
-@Target({ ElementType.TYPE })
+@Target({ ElementType.TYPE, ElementType.ANNOTATION_TYPE })
 @Retention(RetentionPolicy.RUNTIME)
 public @interface DomainObjectLayout {
 
diff --git a/core/applib/src/main/java/org/apache/isis/applib/annotation/DomainService.java b/core/applib/src/main/java/org/apache/isis/applib/annotation/DomainService.java
index 7005d37..e92b1f6 100644
--- a/core/applib/src/main/java/org/apache/isis/applib/annotation/DomainService.java
+++ b/core/applib/src/main/java/org/apache/isis/applib/annotation/DomainService.java
@@ -29,7 +29,7 @@ import java.lang.annotation.*;
  * </p>
  */
 @Inherited
-@Target({ ElementType.TYPE })
+@Target({ ElementType.TYPE, ElementType.ANNOTATION_TYPE })
 @Retention(RetentionPolicy.RUNTIME)
 public @interface DomainService {
 
diff --git a/core/applib/src/main/java/org/apache/isis/applib/annotation/DomainServiceLayout.java b/core/applib/src/main/java/org/apache/isis/applib/annotation/DomainServiceLayout.java
index 66bbd5a..d79d007 100644
--- a/core/applib/src/main/java/org/apache/isis/applib/annotation/DomainServiceLayout.java
+++ b/core/applib/src/main/java/org/apache/isis/applib/annotation/DomainServiceLayout.java
@@ -33,7 +33,7 @@ import java.lang.annotation.Target;
  * </p>
  */
 @Inherited
-@Target({ ElementType.TYPE })
+@Target({ ElementType.TYPE, ElementType.ANNOTATION_TYPE })
 @Retention(RetentionPolicy.RUNTIME)
 public @interface DomainServiceLayout {
 
diff --git a/core/applib/src/main/java/org/apache/isis/applib/annotation/MemberGroupLayout.java b/core/applib/src/main/java/org/apache/isis/applib/annotation/MemberGroupLayout.java
index 96a5ce8..5721a1d 100644
--- a/core/applib/src/main/java/org/apache/isis/applib/annotation/MemberGroupLayout.java
+++ b/core/applib/src/main/java/org/apache/isis/applib/annotation/MemberGroupLayout.java
@@ -47,7 +47,7 @@ import com.google.common.collect.Lists;
  * </p>
  */
 @Inherited
-@Target({ ElementType.TYPE })
+@Target({ ElementType.TYPE, ElementType.ANNOTATION_TYPE })
 @Retention(RetentionPolicy.RUNTIME)
 public @interface MemberGroupLayout {
 
diff --git a/core/applib/src/main/java/org/apache/isis/applib/annotation/Meta.java b/core/applib/src/main/java/org/apache/isis/applib/annotation/Meta.java
new file mode 100644
index 0000000..b5cbb81
--- /dev/null
+++ b/core/applib/src/main/java/org/apache/isis/applib/annotation/Meta.java
@@ -0,0 +1,34 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ */
+
+package org.apache.isis.applib.annotation;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Inherited;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+@Inherited
+@Target({ ElementType.ANNOTATION_TYPE })
+@Retention(RetentionPolicy.RUNTIME)
+public @interface Meta {
+
+
+}
\ No newline at end of file
diff --git a/core/applib/src/main/java/org/apache/isis/applib/annotation/Parameter.java b/core/applib/src/main/java/org/apache/isis/applib/annotation/Parameter.java
index 209c076..abafa88 100644
--- a/core/applib/src/main/java/org/apache/isis/applib/annotation/Parameter.java
+++ b/core/applib/src/main/java/org/apache/isis/applib/annotation/Parameter.java
@@ -33,7 +33,7 @@ import org.apache.isis.applib.value.Clob;
  * Domain semantics for domain object collection.
  */
 @Inherited
-@Target({ ElementType.PARAMETER })
+@Target({ ElementType.PARAMETER, ElementType.ANNOTATION_TYPE })
 @Retention(RetentionPolicy.RUNTIME)
 public @interface Parameter {
 
diff --git a/core/applib/src/main/java/org/apache/isis/applib/annotation/ParameterLayout.java b/core/applib/src/main/java/org/apache/isis/applib/annotation/ParameterLayout.java
index 54cd96d..2fec7b2 100644
--- a/core/applib/src/main/java/org/apache/isis/applib/annotation/ParameterLayout.java
+++ b/core/applib/src/main/java/org/apache/isis/applib/annotation/ParameterLayout.java
@@ -31,7 +31,7 @@ import java.lang.annotation.Target;
  * @see org.apache.isis.applib.annotation.PropertyLayout
  */
 @Inherited
-@Target({ ElementType.PARAMETER })
+@Target({ ElementType.PARAMETER, ElementType.ANNOTATION_TYPE })
 @Retention(RetentionPolicy.RUNTIME)
 public @interface ParameterLayout {
 
diff --git a/core/applib/src/main/java/org/apache/isis/applib/annotation/Property.java b/core/applib/src/main/java/org/apache/isis/applib/annotation/Property.java
index d4377ee..e7bd6fb 100644
--- a/core/applib/src/main/java/org/apache/isis/applib/annotation/Property.java
+++ b/core/applib/src/main/java/org/apache/isis/applib/annotation/Property.java
@@ -36,7 +36,7 @@ import org.apache.isis.applib.value.Clob;
  * Domain semantics for domain object property.
  */
 @Inherited
-@Target({ ElementType.METHOD, ElementType.FIELD })
+@Target({ ElementType.METHOD, ElementType.FIELD, ElementType.ANNOTATION_TYPE })
 @Retention(RetentionPolicy.RUNTIME)
 public @interface Property {
 
@@ -127,7 +127,7 @@ public @interface Property {
      * Whether the property edit should be published.
      *
      * <p>
-     * Requires that an implementation of the {@link org.apache.isis.applib.services.publish.PublishingService}
+     * Requires that an implementation of the {@link org.apache.isis.applib.services.publish.PublisherService}
      * or {@link org.apache.isis.applib.services.publish.PublisherService} is registered with the framework.
      * </p>
      */
diff --git a/core/applib/src/main/java/org/apache/isis/applib/annotation/PropertyLayout.java b/core/applib/src/main/java/org/apache/isis/applib/annotation/PropertyLayout.java
index e7d0328..d719648 100644
--- a/core/applib/src/main/java/org/apache/isis/applib/annotation/PropertyLayout.java
+++ b/core/applib/src/main/java/org/apache/isis/applib/annotation/PropertyLayout.java
@@ -27,7 +27,7 @@ import java.lang.annotation.*;
  * @see org.apache.isis.applib.annotation.ParameterLayout
  */
 @Inherited
-@Target({ ElementType.METHOD, ElementType.FIELD })
+@Target({ ElementType.METHOD, ElementType.FIELD, ElementType.ANNOTATION_TYPE })
 @Retention(RetentionPolicy.RUNTIME)
 public @interface PropertyLayout {
 
diff --git a/core/applib/src/main/java/org/apache/isis/applib/annotation/ViewModel.java b/core/applib/src/main/java/org/apache/isis/applib/annotation/ViewModel.java
index f27c4df..5816721 100644
--- a/core/applib/src/main/java/org/apache/isis/applib/annotation/ViewModel.java
+++ b/core/applib/src/main/java/org/apache/isis/applib/annotation/ViewModel.java
@@ -44,7 +44,7 @@ import javax.xml.bind.annotation.XmlRootElement;
  * @see ViewModel
  */
 @Inherited
-@Target({ ElementType.TYPE })
+@Target({ ElementType.TYPE, ElementType.ANNOTATION_TYPE })
 @Retention(RetentionPolicy.RUNTIME)
 public @interface ViewModel {
 
diff --git a/core/applib/src/main/java/org/apache/isis/applib/annotation/ViewModelLayout.java b/core/applib/src/main/java/org/apache/isis/applib/annotation/ViewModelLayout.java
index bbc0c22..5f2daff 100644
--- a/core/applib/src/main/java/org/apache/isis/applib/annotation/ViewModelLayout.java
+++ b/core/applib/src/main/java/org/apache/isis/applib/annotation/ViewModelLayout.java
@@ -41,7 +41,7 @@ import java.lang.annotation.Target;
  * </p>
  */
 @Inherited
-@Target({ ElementType.TYPE })
+@Target({ ElementType.TYPE, ElementType.ANNOTATION_TYPE })
 @Retention(RetentionPolicy.RUNTIME)
 public @interface ViewModelLayout {
 
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 737ce0a..f8c487a 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
@@ -26,15 +26,20 @@ import java.lang.reflect.Method;
 import java.util.Arrays;
 import java.util.Collections;
 import java.util.List;
+import java.util.Set;
 
 import javax.validation.constraints.Pattern;
 import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
 
+import com.google.common.base.Predicate;
+import com.google.common.collect.FluentIterable;
 import com.google.common.collect.Lists;
 
+import org.apache.isis.applib.AppManifest;
 import org.apache.isis.applib.annotation.Collection;
 import org.apache.isis.applib.annotation.CollectionLayout;
 import org.apache.isis.applib.annotation.MemberOrder;
+import org.apache.isis.applib.annotation.Meta;
 import org.apache.isis.applib.annotation.Property;
 import org.apache.isis.applib.annotation.PropertyLayout;
 import org.apache.isis.applib.annotation.Title;
@@ -84,6 +89,19 @@ public final class Annotations  {
             return annotation;
         }
 
+        // meta annotations
+        final Set<Class<? extends Annotation>> metaAnnotationTypes = AppManifest.Registry.instance().getMetaAnnotationTypes();
+        final Annotation[] clsAnnotations = cls.getAnnotations();
+        for (final Annotation clsAnnotation : clsAnnotations) {
+            final Class<? extends Annotation> annotationType = clsAnnotation.annotationType();
+            if(metaAnnotationTypes.contains(annotationType)) {
+                final T annotationOnMetaAnnotation = annotationType.getAnnotation(annotationClass);
+                if(annotationOnMetaAnnotation != null) {
+                    return annotationOnMetaAnnotation;
+                }
+            }
+        }
+
         // search superclasses
         final Class<?> superclass = cls.getSuperclass();
         if (superclass != null) {
@@ -130,7 +148,7 @@ public final class Annotations  {
         // search for field
         if ( shouldSearchForField(annotationClass) ) {
 
-            List<String> fieldNameCandidates = fieldNameCandidatesFor(methodName);
+            final List<String> fieldNameCandidates = fieldNameCandidatesFor(methodName);
             for (String fieldNameCandidate : fieldNameCandidates) {
                 try {
                     final Field field = methodDeclaringClass.getDeclaredField(fieldNameCandidate);
@@ -144,6 +162,44 @@ public final class Annotations  {
             }
         }
 
+        // 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) {
+            Class<? extends Annotation> annotationType = methodAnnotation.annotationType();
+            if(metaAnnotationTypes.contains(annotationType)) {
+                final T annotationOnMetaAnnotation = annotationType.getAnnotation(annotationClass);
+                if(annotationOnMetaAnnotation != null) {
+                    return annotationOnMetaAnnotation;
+                }
+            }
+        }
+
+        // search for annotation on a meta-annotation on the field
+        if ( shouldSearchForField(annotationClass) ) {
+
+            List<String> fieldNameCandidates = fieldNameCandidatesFor(methodName);
+            for (String fieldNameCandidate : fieldNameCandidates) {
+                try {
+                    final Field field = methodDeclaringClass.getDeclaredField(fieldNameCandidate);
+                    final Annotation[] fieldAnnotations = field.getAnnotations();
+                    for (Annotation fieldAnnotation : fieldAnnotations) {
+                        final Class<? extends Annotation> annotationType = fieldAnnotation.annotationType();
+                        if(metaAnnotationTypes.contains(annotationType)) {
+                            final T annotationOnMetaAnnotation = annotationType.getAnnotation(annotationClass);
+                            if(annotationOnMetaAnnotation != null) {
+                                return annotationOnMetaAnnotation;
+                            }
+                        }
+                    }
+                } catch (NoSuchFieldException e) {
+                    // fall through
+                }
+            }
+        }
+
         // search superclasses
         final Class<?> superclass = methodDeclaringClass.getSuperclass();
         if (superclass != null) {
@@ -382,7 +438,7 @@ public final class Annotations  {
             }
         }
         if (foundAnnotationsForAnyParameter) {
-            return allParamAnnotations;
+            return expandMeta(allParamAnnotations);
         }
 
         final Class<?> methodDeclaringClass = method.getDeclaringClass();
@@ -412,6 +468,49 @@ public final class Annotations  {
         return noParamAnnotationsFor(method);
     }
 
+    static Annotation[][] expandMeta(final Annotation[][] allParamAnnotations) {
+        Set<Class<? extends Annotation>> metaAnnotationTypes = AppManifest.Registry.instance().getMetaAnnotationTypes();
+        if(metaAnnotationTypes.isEmpty()) {
+            return allParamAnnotations;
+        }
+        List<Annotation[]> allParamAnnotationList = Lists.newArrayList();
+        for (Annotation[] allParamAnnotation : allParamAnnotations) {
+            List<Annotation> expandedParamAnnotations = Lists.newArrayList();
+            for (Annotation paramAnnotation : allParamAnnotation) {
+                append(paramAnnotation, expandedParamAnnotations);
+            }
+            allParamAnnotationList.add(expandedParamAnnotations.toArray(new Annotation[]{}));
+        }
+        return allParamAnnotationList.toArray(new Annotation[][]{});
+    }
+
+    static void append(final Annotation annotation, final List<Annotation> annotationsToAppendTo) {
+        Set<Class<? extends Annotation>> metaAnnotationTypes = AppManifest.Registry.instance().getMetaAnnotationTypes();
+        expandMeta(annotation, metaAnnotationTypes, annotationsToAppendTo);
+    }
+
+    static void expandMeta(
+            final Annotation annotation,
+            final Set<Class<? extends Annotation>> metaAnnotationTypes,
+            final List<Annotation> annotationsToAppendTo) {
+        final Class<? extends Annotation> annotationType = annotation.annotationType();
+        if(metaAnnotationTypes.contains(annotationType)) {
+            Annotation[] annotations = annotationType.getAnnotations();
+            annotationsToAppendTo.addAll(FluentIterable.from(Arrays.asList(annotations)).filter(
+                    new Predicate<Annotation>() {
+                        @Override
+                        public boolean apply(final Annotation annotation) {
+                            Class<? extends Annotation> annotType = annotation.annotationType();
+                            return annotType != null &&
+                                   annotType.getName().startsWith("org.apache.isis") &&
+                                   annotType != Meta.class;
+                        }
+                    }).toList());
+        } else {
+            annotationsToAppendTo.add(annotation);
+        }
+    }
+
     private static Annotation[][] noParamAnnotationsFor(final Method method) {
         return new Annotation[method.getParameterTypes().length][0];
     }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/layout/ParameterLayoutFacetFactory.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/layout/ParameterLayoutFacetFactory.java
index 37363f4..a9f1353 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/layout/ParameterLayoutFacetFactory.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/layout/ParameterLayoutFacetFactory.java
@@ -20,6 +20,9 @@
 package org.apache.isis.core.metamodel.facets.param.layout;
 
 import java.lang.annotation.Annotation;
+import java.util.Set;
+
+import org.apache.isis.applib.AppManifest;
 import org.apache.isis.applib.annotation.ParameterLayout;
 import org.apache.isis.core.metamodel.facetapi.FacetUtil;
 import org.apache.isis.core.metamodel.facetapi.FeatureType;
@@ -40,7 +43,7 @@ public class ParameterLayoutFacetFactory extends FacetFactoryAbstract {
             // ignore
             return;
         }
-        
+
         final Annotation[] parameterAnnotations = Annotations.getParameterAnnotations(processParameterContext.getMethod())[processParameterContext.getParamNum()];
         for (final Annotation parameterAnnotation : parameterAnnotations) {
             if (parameterAnnotation instanceof ParameterLayout) {
diff --git a/core/runtime/src/main/java/org/apache/isis/core/runtime/systemusinginstallers/IsisComponentProvider.java b/core/runtime/src/main/java/org/apache/isis/core/runtime/systemusinginstallers/IsisComponentProvider.java
index 8275b92..72eb446 100644
--- a/core/runtime/src/main/java/org/apache/isis/core/runtime/systemusinginstallers/IsisComponentProvider.java
+++ b/core/runtime/src/main/java/org/apache/isis/core/runtime/systemusinginstallers/IsisComponentProvider.java
@@ -19,6 +19,7 @@
 
 package org.apache.isis.core.runtime.systemusinginstallers;
 
+import java.lang.annotation.Annotation;
 import java.util.Collection;
 import java.util.List;
 import java.util.Map;
@@ -40,6 +41,7 @@ import org.reflections.vfs.Vfs;
 import org.apache.isis.applib.AppManifest;
 import org.apache.isis.applib.annotation.DomainObject;
 import org.apache.isis.applib.annotation.DomainService;
+import org.apache.isis.applib.annotation.Meta;
 import org.apache.isis.applib.annotation.Mixin;
 import org.apache.isis.applib.annotation.Nature;
 import org.apache.isis.applib.fixturescripts.FixtureScript;
@@ -140,6 +142,7 @@ public abstract class IsisComponentProvider {
 
         final Reflections reflections = new Reflections(packages);
         final Set<Class<?>> domainServiceTypes = reflections.getTypesAnnotatedWith(DomainService.class);
+        final Set<Class<? extends Annotation>> annotationTypes = (Set)reflections.getTypesAnnotatedWith(Meta.class);
         final Set<Class<?>> persistenceCapableTypes = reflections.getTypesAnnotatedWith(PersistenceCapable.class);
         final Set<Class<? extends FixtureScript>> fixtureScriptTypes = reflections.getSubTypesOf(FixtureScript.class);
 
@@ -160,6 +163,7 @@ public abstract class IsisComponentProvider {
         registry.setDomainServiceTypes(domainServiceTypes);
         registry.setPersistenceCapableTypes(persistenceCapableTypes);
         registry.setFixtureScriptTypes(fixtureScriptTypes);
+        registry.setMetaAnnotationTypes(annotationTypes);
         registry.setMixinTypes(mixinTypes);
     }
 

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