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:36:29 UTC

[2/2] isis git commit: ISIS-1669: extends validation to ensure that PersistentEntityAdapter is specified for any reference types.

ISIS-1669: extends validation to ensure that PersistentEntityAdapter is specified for any reference types.


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

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

----------------------------------------------------------------------
 .../JaxbXmlJavaTypeAdapterFacetFactory.java     | 73 +++++++++++++++++---
 1 file changed, 64 insertions(+), 9 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/isis/blob/5c4393fd/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 cf73ce4..8dcd2f7 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
@@ -26,6 +26,8 @@ import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
 
 import com.google.common.collect.Lists;
 
+import org.datanucleus.enhancement.Persistable;
+
 import org.apache.isis.core.commons.config.IsisConfiguration;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
 import org.apache.isis.core.metamodel.facetapi.FacetUtil;
@@ -50,7 +52,23 @@ public class JaxbXmlJavaTypeAdapterFacetFactory extends FacetFactoryAbstract
             implements MetaModelValidatorRefiner {
 
     public JaxbXmlJavaTypeAdapterFacetFactory() {
-        super(FeatureType.PROPERTIES_ONLY);
+        super(FeatureType.OBJECTS_AND_PROPERTIES);
+    }
+
+    @Override
+    public void process(final ProcessClassContext processClassContext) {
+        final Class<?> cls = processClassContext.getCls();
+
+        final XmlJavaTypeAdapter annotation = Annotations.getAnnotation(cls, XmlJavaTypeAdapter.class);
+        if(annotation == null) {
+            return;
+        }
+
+        final FacetHolder holder = processClassContext.getFacetHolder();
+        final XmlJavaTypeAdapterFacetDefault facet = new XmlJavaTypeAdapterFacetDefault(holder,
+                annotation.value(), getSpecificationLoader());
+
+        FacetUtil.addFacet(facet);
     }
 
     @Override
@@ -110,10 +128,46 @@ public class JaxbXmlJavaTypeAdapterFacetFactory extends FacetFactoryAbstract
         metaModelValidator.add(validator);
     }
 
-    private static class AdapterValidator {
+    private static abstract class AdapterValidator {
+        abstract void validate(
+                final ObjectSpecification objectSpec,
+                final OneToOneAssociation property,
+                final ValidationFailures validationFailures);
+
+    }
+
+    private static class AdapterValidatorForReferenceTypes extends AdapterValidator {
+
+        @Override
+        void validate(
+                final ObjectSpecification objectSpec,
+                final OneToOneAssociation property,
+                final ValidationFailures validationFailures) {
+
+            final ObjectSpecification propertyTypeSpec = property.getSpecification();
+            final Class<?> propertyType = propertyTypeSpec.getCorrespondingClass();
+            if (!Persistable.class.isAssignableFrom(propertyType)) {
+                return;
+            }
+
+            final XmlJavaTypeAdapterFacet xmlJavaTypeAdapterFacet =
+                    propertyTypeSpec.getFacet(XmlJavaTypeAdapterFacet.class);
+            if(xmlJavaTypeAdapterFacet != null) {
+                return;
+            }
+
+            validationFailures.add("JAXB view model '%s' property '%s' is of type '%s' but that type is not annotated with @XmlJavaTypeAdapter.  The type must be annotated with @XmlJavaTypeAdapter(org.apache.isis.schema.utils.jaxbadapters.PersistentEntityAdapter.class) or equivalent.",
+                    objectSpec.getFullIdentifier(),
+                    property.getId(),
+                    propertyType.getName());
+
+        }
+    }
+
+    private static class AdapterValidatorForDateTypes extends AdapterValidator {
         private final Class<?> jodaType;
 
-        private AdapterValidator(final Class<?> jodaType) {
+        private AdapterValidatorForDateTypes(final Class<?> jodaType) {
             this.jodaType = jodaType;
         }
 
@@ -135,7 +189,7 @@ public class JaxbXmlJavaTypeAdapterFacetFactory extends FacetFactoryAbstract
             }
 
             // else
-            validationFailures.add("JAXB view model '%s' property '%s' is of type '%s' but is not annotated with @XmlJavaTypeAdapterFacet",
+            validationFailures.add("JAXB view model '%s' property '%s' is of type '%s' but is not annotated with @XmlJavaTypeAdapter.  The field/method must be annotated with @XmlJavaTypeAdapter(org.apache.isis.schema.utils.jaxbadapters.XxxAdapter.ForJaxb.class) or equivalent.",
                     objectSpec.getFullIdentifier(),
                     property.getId(),
                     jodaType.getName());
@@ -144,11 +198,12 @@ public class JaxbXmlJavaTypeAdapterFacetFactory extends FacetFactoryAbstract
 
     private final static List<AdapterValidator> adapterValidators =
             Lists.newArrayList(
-                    new AdapterValidator(java.sql.Timestamp.class),
-                    new AdapterValidator(org.joda.time.DateTime.class),
-                    new AdapterValidator(org.joda.time.LocalDate.class),
-                    new AdapterValidator(org.joda.time.LocalDateTime.class),
-                    new AdapterValidator(org.joda.time.LocalTime.class)
+                    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)
             );
 
 }