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 2018/07/18 06:00:56 UTC

[isis] 07/09: ISIS-1632: adds meta-annotation support for Jdo @Column and others

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

danhaywood pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/isis.git

commit 1d2170ef636f3d959e85d43bd3c7c6ab5fd4558b
Author: danhaywood <da...@haywood-associates.co.uk>
AuthorDate: Wed Jul 18 07:58:30 2018 +0200

    ISIS-1632: adds meta-annotation support for Jdo @Column and others
    
    others being @Digits and @Nullable.
    
    The @Column support was needed because otherwise the metamodel validator (MetaModelValidatorForConflictingOptionality) was throwing an incompatible nullability issue for SimpleObject#name (which is annotated using @Name that itself is annotated with @Column(allowsNull="false") ).
---
 .../isis/core/metamodel/facets/Annotations.java     |  8 ++++++--
 .../action/ActionAnnotationFacetFactory.java        |  7 ++++---
 ...yFromJavaxValidationDigitsAnnotationFactory.java |  4 +++-
 .../property/PropertyAnnotationFacetFactory.java    |  3 ++-
 ...lDerivedFromJdoColumnAnnotationFacetFactory.java |  5 +++--
 ...andatoryFromJdoColumnAnnotationFacetFactory.java | 21 +++++++++++----------
 6 files changed, 29 insertions(+), 19 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 06311db..1e87972 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
@@ -36,6 +36,8 @@ import javax.validation.constraints.Pattern;
 import javax.xml.bind.annotation.XmlTransient;
 import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
 
+import com.google.common.collect.Lists;
+
 import org.apache.isis.applib.annotation.Collection;
 import org.apache.isis.applib.annotation.CollectionLayout;
 import org.apache.isis.applib.annotation.MemberOrder;
@@ -47,8 +49,6 @@ import org.apache.isis.core.commons.reflection.Reflect;
 import org.apache.isis.core.metamodel.exceptions.MetaModelException;
 import org.apache.isis.core.metamodel.methodutils.MethodScope;
 
-import com.google.common.collect.Lists;
-
 public final class Annotations  {
 
     private Annotations() {}
@@ -226,6 +226,10 @@ public final class Annotations  {
     /**
      * Searches for annotation on provided method, and if not found for any
      * inherited methods up from the superclass.
+     *
+     * <p>
+     *     WARN: this method does NOT search for meta-annotations; use {@link #getAnnotations(Class, Class)} for that.
+     * </p>
      */
     public static <T extends Annotation> T getAnnotation(
             final Method method,
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 3d6eb0a..00d6227 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
@@ -22,6 +22,8 @@ package org.apache.isis.core.metamodel.facets.actions.action;
 import java.lang.reflect.Method;
 import java.util.List;
 
+import com.google.common.base.Strings;
+
 import org.apache.isis.applib.annotation.Action;
 import org.apache.isis.applib.events.domain.ActionDomainEvent;
 import org.apache.isis.applib.services.HasTransactionId;
@@ -58,8 +60,6 @@ import org.apache.isis.core.metamodel.facets.members.order.annotprop.MemberOrder
 import org.apache.isis.core.metamodel.spec.ObjectSpecification;
 import org.apache.isis.core.metamodel.util.EventUtil;
 
-import com.google.common.base.Strings;
-
 public class ActionAnnotationFacetFactory extends FacetFactoryAbstract {
 
 
@@ -291,7 +291,8 @@ public class ActionAnnotationFacetFactory extends FacetFactoryAbstract {
 
         // check for @Action(associateWith=...)
 
-        final Action action = Annotations.getAnnotation(method, Action.class);
+        final List<Action> actions = Annotations.getAnnotations(method, Action.class);
+        final Action action = actions.isEmpty() ? null : actions.get(0);
         if (action != null) {
             final String associateWith = action.associateWith();
             if(!Strings.isNullOrEmpty(associateWith)) {
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/bigdecimal/javaxvaldigits/BigDecimalFacetOnPropertyFromJavaxValidationDigitsAnnotationFactory.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/bigdecimal/javaxvaldigits/BigDecimalFacetOnPropertyFromJavaxValidationDigitsAnnotationFactory.java
index 8f1bb1a..4b392bd 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/bigdecimal/javaxvaldigits/BigDecimalFacetOnPropertyFromJavaxValidationDigitsAnnotationFactory.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/bigdecimal/javaxvaldigits/BigDecimalFacetOnPropertyFromJavaxValidationDigitsAnnotationFactory.java
@@ -19,6 +19,7 @@
 package org.apache.isis.core.metamodel.facets.properties.bigdecimal.javaxvaldigits;
 
 import java.math.BigDecimal;
+import java.util.List;
 
 import javax.validation.constraints.Digits;
 
@@ -42,7 +43,8 @@ public class BigDecimalFacetOnPropertyFromJavaxValidationDigitsAnnotationFactory
             return;
         }
 
-        final Digits annotation = Annotations.getAnnotation(processMethodContext.getMethod(), Digits.class);
+        final List<Digits> annotations = Annotations.getAnnotations(processMethodContext.getMethod(), Digits.class);
+        final Digits annotation = annotations.isEmpty() ? null : annotations.get(0);
         if (annotation == null) {
             return;
         }
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 ae75861..bd23367 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
@@ -285,7 +285,8 @@ public class PropertyAnnotationFacetFactory extends FacetFactoryAbstract impleme
         final FacetHolder holder = processMethodContext.getFacetHolder();
 
         // check for @Nullable
-        final Nullable nullableAnnotation = Annotations.getAnnotation(method, Nullable.class);
+        final List<Nullable> nullableAnnotations = Annotations.getAnnotations(method, Nullable.class);
+        final Nullable nullableAnnotation = nullableAnnotations.isEmpty() ? null : nullableAnnotations.get(0);
         final MandatoryFacet facet2 =
                 MandatoryFacetInvertedByNullableAnnotationOnProperty.create(nullableAnnotation, method, holder);
         FacetUtil.addFacet(facet2);
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 64a674a..5adc667 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
@@ -63,9 +63,10 @@ public class BigDecimalDerivedFromJdoColumnAnnotationFacetFactory extends FacetF
 
         final FacetedMethod holder = processMethodContext.getFacetHolder();
 
-        BigDecimalValueFacet existingFacet = (BigDecimalValueFacet) holder.getFacet(BigDecimalValueFacet.class);
+        BigDecimalValueFacet existingFacet = holder.getFacet(BigDecimalValueFacet.class);
 
-        final Column jdoColumnAnnotation = Annotations.getAnnotation(processMethodContext.getMethod(), Column.class);
+        final List<Column> jdoColumnAnnotations = Annotations.getAnnotations(processMethodContext.getMethod(), Column.class);
+        final Column jdoColumnAnnotation = jdoColumnAnnotations.isEmpty() ? null : jdoColumnAnnotations.get(0);
 
         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 6432668..2e9519f 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
@@ -63,7 +63,7 @@ public class MandatoryFromJdoColumnAnnotationFacetFactory extends FacetFactoryAb
             return;
         }
 
-        final Column annotation = Annotations.getAnnotation(processMethodContext.getMethod(), Column.class);
+        final List<Column> annotations = Annotations.getAnnotations(processMethodContext.getMethod(), Column.class);
 
         final FacetedMethod holder = processMethodContext.getFacetHolder();
 
@@ -82,22 +82,23 @@ public class MandatoryFromJdoColumnAnnotationFacetFactory extends FacetFactoryAb
             }
         }
 
+        final Column annotation = annotations.isEmpty() ? null : annotations.get(0);
         boolean required = whetherRequired(processMethodContext, annotation);
         MandatoryFacet facet = annotation != null
                 ? new MandatoryFacetDerivedFromJdoColumn(holder, required)
                         : new MandatoryFacetInferredFromAbsenceOfJdoColumn(holder, required);
 
 
-                // as a side-effect, will chain any existing facets.
-                // we'll exploit this fact for meta-model validation (see #refineMetaModelValidator(), below)
-                FacetUtil.addFacet(facet);
+        // as a side-effect, will chain any existing facets.
+        // we'll exploit this fact for meta-model validation (see #refineMetaModelValidator(), below)
+        FacetUtil.addFacet(facet);
 
-                // however, if a @Column was explicitly provided, and the underlying facet
-                // was the simple MandatoryFacetDefault (from an absence of @Optional or @Mandatory),
-                // then don't chain, simply replace.
-                if(facet instanceof MandatoryFacetDerivedFromJdoColumn && facet.getUnderlyingFacet() instanceof MandatoryFacetDefault) {
-                    facet.setUnderlyingFacet(null);
-                }
+        // however, if a @Column was explicitly provided, and the underlying facet
+        // was the simple MandatoryFacetDefault (from an absence of @Optional or @Mandatory),
+        // then don't chain, simply replace.
+        if(facet instanceof MandatoryFacetDerivedFromJdoColumn && facet.getUnderlyingFacet() instanceof MandatoryFacetDefault) {
+            facet.setUnderlyingFacet(null);
+        }
     }
 
     private static boolean whetherRequired(final ProcessMethodContext processMethodContext, final Column annotation) {