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/02/14 15:13:04 UTC

[14/20] isis git commit: ISIS-1501: adds metamodel validator for Mixin and DomainObject annotation facet factories....

ISIS-1501: adds metamodel validator for Mixin and DomainObject annotation facet factories....

... which checks that there is a 1-arg public constructor.


Project: http://git-wip-us.apache.org/repos/asf/isis/repo
Commit: http://git-wip-us.apache.org/repos/asf/isis/commit/5b86f37e
Tree: http://git-wip-us.apache.org/repos/asf/isis/tree/5b86f37e
Diff: http://git-wip-us.apache.org/repos/asf/isis/diff/5b86f37e

Branch: refs/heads/master
Commit: 5b86f37edbc5cf2e9ae98f6898bcefd3e842983a
Parents: 3821d52
Author: Dan Haywood <da...@haywood-associates.co.uk>
Authored: Mon Feb 13 21:59:29 2017 +0000
Committer: Dan Haywood <da...@haywood-associates.co.uk>
Committed: Mon Feb 13 21:59:29 2017 +0000

----------------------------------------------------------------------
 .../DomainObjectAnnotationFacetFactory.java     | 27 ++++++++--
 ...bleObjectFacetForDomainObjectAnnotation.java |  5 --
 .../mixin/MetaModelValidatorForMixinTypes.java  | 54 ++++++++++++++++++++
 .../MixinFacetForDomainObjectAnnotation.java    |  5 +-
 .../MixinFacetForMixinAnnotationFactory.java    | 17 +++++-
 5 files changed, 97 insertions(+), 11 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/isis/blob/5b86f37e/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobject/DomainObjectAnnotationFacetFactory.java
----------------------------------------------------------------------
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 2eb5b22..34a1811 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
@@ -31,6 +31,7 @@ import org.apache.isis.applib.annotation.AutoComplete;
 import org.apache.isis.applib.annotation.Bounded;
 import org.apache.isis.applib.annotation.DomainObject;
 import org.apache.isis.applib.annotation.Immutable;
+import org.apache.isis.applib.annotation.Nature;
 import org.apache.isis.applib.annotation.ObjectType;
 import org.apache.isis.applib.annotation.PublishedObject;
 import org.apache.isis.applib.services.HasTransactionId;
@@ -76,6 +77,7 @@ import org.apache.isis.core.metamodel.facets.object.domainobject.publishing.Publ
 import org.apache.isis.core.metamodel.facets.object.domainobject.recreatable.RecreatableObjectFacetForDomainObjectAnnotation;
 import org.apache.isis.core.metamodel.facets.object.immutable.ImmutableFacet;
 import org.apache.isis.core.metamodel.facets.object.immutable.immutableannot.ImmutableFacetForImmutableAnnotation;
+import org.apache.isis.core.metamodel.facets.object.mixin.MetaModelValidatorForMixinTypes;
 import org.apache.isis.core.metamodel.facets.object.mixin.MixinFacet;
 import org.apache.isis.core.metamodel.facets.object.mixin.MixinFacetForDomainObjectAnnotation;
 import org.apache.isis.core.metamodel.facets.object.publishedobject.PublishedObjectFacet;
@@ -103,6 +105,7 @@ public class DomainObjectAnnotationFacetFactory extends FacetFactoryAbstract
     private final MetaModelValidatorForDeprecatedAnnotation immutableValidator = new MetaModelValidatorForDeprecatedAnnotation(Immutable.class);
     private final MetaModelValidatorForDeprecatedAnnotation objectTypeValidator = new MetaModelValidatorForDeprecatedAnnotation(ObjectType.class);
     private final MetaModelValidatorForValidationFailures autoCompleteInvalid = new MetaModelValidatorForValidationFailures();
+    private final MetaModelValidatorForMixinTypes mixinTypeValidator = new MetaModelValidatorForMixinTypes("@DomainObject#nature=MIXIN");
 
 
 
@@ -358,19 +361,36 @@ public class DomainObjectAnnotationFacetFactory extends FacetFactoryAbstract
         FacetUtil.addFacet(facet);
     }
 
+
     void processNature(final ProcessClassContext processClassContext) {
         final Class<?> cls = processClassContext.getCls();
         final DomainObject domainObject = Annotations.getAnnotation(cls, DomainObject.class);
+
+        if(domainObject == null) {
+            return;
+        }
+
         final FacetHolder facetHolder = processClassContext.getFacetHolder();
 
         final PostConstructMethodCache postConstructMethodCache = this;
         final ViewModelFacet recreatableObjectFacet = RecreatableObjectFacetForDomainObjectAnnotation.create(
                 domainObject, getSpecificationLoader(), persistenceSessionServiceInternal, servicesInjector,
                 facetHolder, postConstructMethodCache);
-        FacetUtil.addFacet(recreatableObjectFacet);
 
-        final MixinFacet mixinFacet = MixinFacetForDomainObjectAnnotation.create(cls, facetHolder, servicesInjector);
-        FacetUtil.addFacet(mixinFacet);
+        if(recreatableObjectFacet != null) {
+            FacetUtil.addFacet(recreatableObjectFacet);
+        } else {
+            if(domainObject.nature() == Nature.MIXIN) {
+
+                if(!mixinTypeValidator.ensureMixinType(cls)) {
+                    return;
+                }
+
+                final MixinFacet mixinFacet = MixinFacetForDomainObjectAnnotation.create(domainObject, cls, facetHolder, servicesInjector);
+                FacetUtil.addFacet(mixinFacet);
+            }
+        }
+
     }
 
 
@@ -569,6 +589,7 @@ public class DomainObjectAnnotationFacetFactory extends FacetFactoryAbstract
         metaModelValidator.add(objectTypeValidator);
 
         metaModelValidator.add(autoCompleteInvalid);
+        metaModelValidator.add(mixinTypeValidator);
     }
 
     // //////////////////////////////////////

http://git-wip-us.apache.org/repos/asf/isis/blob/5b86f37e/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobject/recreatable/RecreatableObjectFacetForDomainObjectAnnotation.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobject/recreatable/RecreatableObjectFacetForDomainObjectAnnotation.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobject/recreatable/RecreatableObjectFacetForDomainObjectAnnotation.java
index 1c9eefc..2532eaa 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobject/recreatable/RecreatableObjectFacetForDomainObjectAnnotation.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobject/recreatable/RecreatableObjectFacetForDomainObjectAnnotation.java
@@ -45,11 +45,6 @@ public class RecreatableObjectFacetForDomainObjectAnnotation extends
         }
 
         final Nature nature = domainObject.nature();
-
-        if(nature == null) {
-            return null;
-        }
-
         switch (nature)
         {
             case NOT_SPECIFIED:

http://git-wip-us.apache.org/repos/asf/isis/blob/5b86f37e/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/mixin/MetaModelValidatorForMixinTypes.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/mixin/MetaModelValidatorForMixinTypes.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/mixin/MetaModelValidatorForMixinTypes.java
new file mode 100644
index 0000000..c3c3dbc
--- /dev/null
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/mixin/MetaModelValidatorForMixinTypes.java
@@ -0,0 +1,54 @@
+/*
+ *  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.core.metamodel.facets.object.mixin;
+
+import java.lang.reflect.Constructor;
+import java.lang.reflect.Modifier;
+
+import org.apache.isis.core.metamodel.specloader.validator.MetaModelValidatorForValidationFailures;
+
+public class MetaModelValidatorForMixinTypes extends MetaModelValidatorForValidationFailures {
+
+    private final String annotation;
+
+    public MetaModelValidatorForMixinTypes(final String annotation) {
+        this.annotation = annotation;
+    }
+
+    public boolean ensureMixinType(final Class<?> candidateMixinType) {
+        boolean mixinType = has1ArgConstructor(candidateMixinType);
+        if (mixinType) {
+            return true;
+        }
+        addFailure("%s: annotated with %s annotation but does not have a public 1-arg constructor",
+                candidateMixinType.getName(), annotation);
+        return false;
+    }
+
+    private static boolean has1ArgConstructor(final Class<?> cls) {
+        final Constructor<?>[] constructors = cls.getConstructors();
+        for (final Constructor<?> constructor : constructors) {
+            final Class<?>[] parameterTypes = constructor.getParameterTypes();
+            if (parameterTypes.length == 1 && Modifier.isPublic(constructor.getModifiers())) {
+                return true;
+            }
+        }
+        return false;
+    }
+}

http://git-wip-us.apache.org/repos/asf/isis/blob/5b86f37e/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/mixin/MixinFacetForDomainObjectAnnotation.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/mixin/MixinFacetForDomainObjectAnnotation.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/mixin/MixinFacetForDomainObjectAnnotation.java
index 041d57a..4cc37a5 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/mixin/MixinFacetForDomainObjectAnnotation.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/mixin/MixinFacetForDomainObjectAnnotation.java
@@ -42,9 +42,10 @@ public class MixinFacetForDomainObjectAnnotation extends MixinFacetAbstract {
     }
 
     public static MixinFacet create(
-            final Class<?> candidateMixinType, final FacetHolder facetHolder,
+            final DomainObject domainObject,
+            final Class<?> candidateMixinType,
+            final FacetHolder facetHolder,
             final ServicesInjector servicesInjector) {
-        final DomainObject domainObject = candidateMixinType.getAnnotation(DomainObject.class);
         if(domainObject == null) {
             return null;
         }

http://git-wip-us.apache.org/repos/asf/isis/blob/5b86f37e/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/mixin/MixinFacetForMixinAnnotationFactory.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/mixin/MixinFacetForMixinAnnotationFactory.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/mixin/MixinFacetForMixinAnnotationFactory.java
index 504ba5e..ab56064 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/mixin/MixinFacetForMixinAnnotationFactory.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/mixin/MixinFacetForMixinAnnotationFactory.java
@@ -20,11 +20,16 @@
 package org.apache.isis.core.metamodel.facets.object.mixin;
 
 import org.apache.isis.applib.annotation.Mixin;
+import org.apache.isis.core.commons.config.IsisConfiguration;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
 import org.apache.isis.core.metamodel.facetapi.FeatureType;
+import org.apache.isis.core.metamodel.facetapi.MetaModelValidatorRefiner;
 import org.apache.isis.core.metamodel.facets.FacetFactoryAbstract;
+import org.apache.isis.core.metamodel.specloader.validator.MetaModelValidatorComposite;
 
-public class MixinFacetForMixinAnnotationFactory extends FacetFactoryAbstract  {
+public class MixinFacetForMixinAnnotationFactory extends FacetFactoryAbstract implements MetaModelValidatorRefiner {
+
+    private final MetaModelValidatorForMixinTypes mixinTypeValidator = new MetaModelValidatorForMixinTypes("@Mixin");
 
     public MixinFacetForMixinAnnotationFactory() {
         super(FeatureType.OBJECTS_ONLY);
@@ -39,6 +44,10 @@ public class MixinFacetForMixinAnnotationFactory extends FacetFactoryAbstract  {
         if(mixinAnnotation == null) {
             return;
         }
+
+        if (!mixinTypeValidator.ensureMixinType(candidateMixinType)) {
+            return;
+        }
         final FacetHolder facetHolder = processClassContext.getFacetHolder();
 
         final MixinFacet mixinFacet = MixinFacetForMixinAnnotation.create(candidateMixinType, facetHolder,
@@ -46,4 +55,10 @@ public class MixinFacetForMixinAnnotationFactory extends FacetFactoryAbstract  {
         facetHolder.addFacet(mixinFacet);
     }
 
+
+    @Override
+    public void refineMetaModelValidator(final MetaModelValidatorComposite metaModelValidator, final IsisConfiguration configuration) {
+        metaModelValidator.add(mixinTypeValidator);
+    }
+
 }