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/07/31 11:56:02 UTC

isis git commit: ISIS-1662: adds validators on JAXB view models that they have a public no-arg constructor and are not abstract.

Repository: isis
Updated Branches:
  refs/heads/master 5c4393fd0 -> 89561524f


ISIS-1662: adds validators on JAXB view models that they have a public no-arg constructor and are not abstract.

Also:
- renamed AdapterValidator to PropertyValidator


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

Branch: refs/heads/master
Commit: 89561524f9e3eaf8821717d989e9aff44be2cbfe
Parents: 5c4393f
Author: Dan Haywood <da...@haywood-associates.co.uk>
Authored: Mon Jul 31 12:54:31 2017 +0100
Committer: Dan Haywood <da...@haywood-associates.co.uk>
Committed: Mon Jul 31 12:54:31 2017 +0100

----------------------------------------------------------------------
 .../JaxbXmlJavaTypeAdapterFacetFactory.java     | 75 ++++++++++++++++----
 1 file changed, 62 insertions(+), 13 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/isis/blob/89561524/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/jaxb/JaxbXmlJavaTypeAdapterFacetFactory.java
----------------------------------------------------------------------
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 8dcd2f7..633b7a5 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
@@ -19,7 +19,9 @@
 
 package org.apache.isis.core.metamodel.facets.jaxb;
 
+import java.lang.reflect.Constructor;
 import java.lang.reflect.Method;
+import java.lang.reflect.Modifier;
 import java.util.List;
 
 import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
@@ -117,9 +119,13 @@ public class JaxbXmlJavaTypeAdapterFacetFactory extends FacetFactoryAbstract
                             return;
                         }
 
+                        for (final TypeValidator typeValidator : TYPE_VALIDATORS) {
+                            typeValidator.validate(objectSpec, validationFailures);
+                        }
+
                         final List<OneToOneAssociation> properties = objectSpec.getProperties(Contributed.EXCLUDED);
-                        for (OneToOneAssociation property : properties) {
-                            for (AdapterValidator adapterValidator : adapterValidators) {
+                        for (final OneToOneAssociation property : properties) {
+                            for (final PropertyValidator adapterValidator : PROPERTY_VALIDATORS) {
                                 adapterValidator.validate(objectSpec, property, validationFailures);
                             }
                         }
@@ -128,7 +134,14 @@ public class JaxbXmlJavaTypeAdapterFacetFactory extends FacetFactoryAbstract
         metaModelValidator.add(validator);
     }
 
-    private static abstract class AdapterValidator {
+    private static abstract class TypeValidator {
+        abstract void validate(
+                final ObjectSpecification objectSpec,
+                final ValidationFailures validationFailures);
+
+    }
+
+    private static abstract class PropertyValidator {
         abstract void validate(
                 final ObjectSpecification objectSpec,
                 final OneToOneAssociation property,
@@ -136,7 +149,7 @@ public class JaxbXmlJavaTypeAdapterFacetFactory extends FacetFactoryAbstract
 
     }
 
-    private static class AdapterValidatorForReferenceTypes extends AdapterValidator {
+    private static class PropertyValidatorForReferenceTypes extends PropertyValidator {
 
         @Override
         void validate(
@@ -164,10 +177,10 @@ public class JaxbXmlJavaTypeAdapterFacetFactory extends FacetFactoryAbstract
         }
     }
 
-    private static class AdapterValidatorForDateTypes extends AdapterValidator {
+    private static class PropertyValidatorForDateTypes extends PropertyValidator {
         private final Class<?> jodaType;
 
-        private AdapterValidatorForDateTypes(final Class<?> jodaType) {
+        private PropertyValidatorForDateTypes(final Class<?> jodaType) {
             this.jodaType = jodaType;
         }
 
@@ -196,14 +209,50 @@ public class JaxbXmlJavaTypeAdapterFacetFactory extends FacetFactoryAbstract
         }
     }
 
-    private final static List<AdapterValidator> adapterValidators =
+    private final static List<TypeValidator> TYPE_VALIDATORS =
+            Lists.<TypeValidator>newArrayList(
+                    new TypeValidator() {
+                        @Override
+                        void validate(
+                                final ObjectSpecification objectSpec, final ValidationFailures validationFailures) {
+
+                            // final Class<?> correspondingClass = objectSpec.getCorrespondingClass();
+                            if(objectSpec.isAbstract()) {
+                                validationFailures.add("JAXB view model '%s' is abstract", objectSpec.getFullIdentifier());
+                            }
+
+                        }
+                    },
+                    new TypeValidator() {
+                        @Override
+                        void validate(
+                                final ObjectSpecification objectSpec, final ValidationFailures validationFailures) {
+
+                            final Class<?> correspondingClass = objectSpec.getCorrespondingClass();
+                            final Constructor<?>[] constructors = correspondingClass.getDeclaredConstructors();
+                            for (Constructor<?> constructor : constructors) {
+                                if(constructor.getParameterTypes().length == 0) {
+                                    if (!Modifier.isPublic(constructor.getModifiers())) {
+                                        validationFailures
+                                                .add("JAXB view model '%s' has a no-arg constructor, however it is not public",
+                                                        objectSpec.getFullIdentifier());
+                                    }
+                                    return;
+                                }
+                            }
+                            validationFailures.add("JAXB view model '%s' does not have a public no-arg constructor", objectSpec.getFullIdentifier());
+                        }
+                    }
+            );
+
+    private final static List<PropertyValidator> PROPERTY_VALIDATORS =
             Lists.newArrayList(
-                    new AdapterValidatorForReferenceTypes(),
-                    new AdapterValidatorForDateTypes(java.sql.Timestamp.class),
-                    new AdapterValidatorForDateTypes(org.joda.time.DateTime.class),
-                    new AdapterValidatorForDateTypes(org.joda.time.LocalDate.class),
-                    new AdapterValidatorForDateTypes(org.joda.time.LocalDateTime.class),
-                    new AdapterValidatorForDateTypes(org.joda.time.LocalTime.class)
+                    new PropertyValidatorForReferenceTypes(),
+                    new PropertyValidatorForDateTypes(java.sql.Timestamp.class),
+                    new PropertyValidatorForDateTypes(org.joda.time.DateTime.class),
+                    new PropertyValidatorForDateTypes(org.joda.time.LocalDate.class),
+                    new PropertyValidatorForDateTypes(org.joda.time.LocalDateTime.class),
+                    new PropertyValidatorForDateTypes(org.joda.time.LocalTime.class)
             );
 
 }