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);
+ }
+
}