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/13 22:34:51 UTC

isis git commit: ISIS-1512: adds metamodel validator for DomainService annotation facet factory, to check...

Repository: isis
Updated Branches:
  refs/heads/maint-1.14.0 5b86f37ed -> 1d8ac13fd


ISIS-1512: adds metamodel validator for DomainService annotation facet factory, to check...

... that no services have collections.  This is disabled by default, can be enabled using a configuration property.


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

Branch: refs/heads/maint-1.14.0
Commit: 1d8ac13fdf28bc2b5b6a58d2cf372312f9af6262
Parents: 5b86f37
Author: Dan Haywood <da...@haywood-associates.co.uk>
Authored: Mon Feb 13 22:32:18 2017 +0000
Committer: Dan Haywood <da...@haywood-associates.co.uk>
Committed: Mon Feb 13 22:32:18 2017 +0000

----------------------------------------------------------------------
 .../guides/_rgcfg_configuring-core.adoc         | 10 ++-
 .../queryresultscache/QueryResultsCache.java    |  4 +-
 .../DomainServiceFacetAnnotationFactory.java    | 69 +++++++++++++++++++-
 .../application/manifest/isis.properties        |  6 ++
 4 files changed, 86 insertions(+), 3 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/isis/blob/1d8ac13f/adocs/documentation/src/main/asciidoc/guides/_rgcfg_configuring-core.adoc
----------------------------------------------------------------------
diff --git a/adocs/documentation/src/main/asciidoc/guides/_rgcfg_configuring-core.adoc b/adocs/documentation/src/main/asciidoc/guides/_rgcfg_configuring-core.adoc
index 7b5088a..cd820f0 100644
--- a/adocs/documentation/src/main/asciidoc/guides/_rgcfg_configuring-core.adoc
+++ b/adocs/documentation/src/main/asciidoc/guides/_rgcfg_configuring-core.adoc
@@ -536,10 +536,18 @@ Note that although JDOQL syntax supports multiple `VARIABLES` classes, currently
 (`false`)
 | (`1.14.0-SNAPSHOT`) When searching for  xref:rgcms.adoc#_rgcms_methods_prefixes_disable[`disableXxx()`] or xref:rgcms.adoc#_rgcms_methods_prefixes_hide[`hideXxx()`] methods, whether to search only for the no-param version (or also for supporting methods that match the parameter types of the action). +
 
-If enabled then will not search for supporting methods with the exact set of arguments as the method it was supporting.
+If enabled then will not search for supporting methods with the exact set of arguments as the method it was supporting (and any supporting methods that have additional parameters will be treated as invalid).
 Note that this in effect means that xref:rgcms.adoc#_rgcms_classes_mixins[mixins] must be used instead of xref:ugbtb.adoc#_ugbtb_decoupling_contributions[contributed services].
 
 
+|`isis.reflector.validator.` +
+`serviceActionsOnly`
+|`true`,`false` +
+(`false`)
+| (`1.14.0-SNAPSHOT`) Domain services are stateless (at least conceptually) and so should not have any properties or collections; any that are defined will not be rendered by the viewers. +
+
+If enabled, this configuration property will ensure that domain services only declare actions.
+
 
 |===
 

http://git-wip-us.apache.org/repos/asf/isis/blob/1d8ac13f/core/applib/src/main/java/org/apache/isis/applib/services/queryresultscache/QueryResultsCache.java
----------------------------------------------------------------------
diff --git a/core/applib/src/main/java/org/apache/isis/applib/services/queryresultscache/QueryResultsCache.java b/core/applib/src/main/java/org/apache/isis/applib/services/queryresultscache/QueryResultsCache.java
index b7f3479..e63d099 100644
--- a/core/applib/src/main/java/org/apache/isis/applib/services/queryresultscache/QueryResultsCache.java
+++ b/core/applib/src/main/java/org/apache/isis/applib/services/queryresultscache/QueryResultsCache.java
@@ -238,12 +238,14 @@ public class QueryResultsCache implements WithTransactionScope {
     @DomainService(nature = NatureOfService.DOMAIN)
     public static class Control extends AbstractSubscriber {
 
+        @Programmatic
         @Subscribe
         @org.axonframework.eventhandling.annotation.EventHandler
         public void on(FixturesInstallingEvent ev) {
             fixturesInstalling = true;
         }
 
+        @Programmatic
         @Subscribe
         @org.axonframework.eventhandling.annotation.EventHandler
         public void on(FixturesInstalledEvent ev) {
@@ -251,7 +253,7 @@ public class QueryResultsCache implements WithTransactionScope {
         }
 
         private boolean fixturesInstalling;
-
+        @Programmatic
         public boolean isFixturesInstalling() {
             return fixturesInstalling;
         }

http://git-wip-us.apache.org/repos/asf/isis/blob/1d8ac13f/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainservice/annotation/DomainServiceFacetAnnotationFactory.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainservice/annotation/DomainServiceFacetAnnotationFactory.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainservice/annotation/DomainServiceFacetAnnotationFactory.java
index 96131fc..c04ec1d 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainservice/annotation/DomainServiceFacetAnnotationFactory.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainservice/annotation/DomainServiceFacetAnnotationFactory.java
@@ -19,14 +19,31 @@
 package org.apache.isis.core.metamodel.facets.object.domainservice.annotation;
 
 
+import java.util.List;
+
+import com.google.common.base.Joiner;
+import com.google.common.collect.Lists;
+
 import org.apache.isis.applib.annotation.DomainService;
+import org.apache.isis.core.commons.config.IsisConfiguration;
 import org.apache.isis.core.metamodel.facetapi.FacetUtil;
 import org.apache.isis.core.metamodel.facetapi.FeatureType;
+import org.apache.isis.core.metamodel.facetapi.MetaModelValidatorRefiner;
 import org.apache.isis.core.metamodel.facets.Annotations;
 import org.apache.isis.core.metamodel.facets.FacetFactoryAbstract;
+import org.apache.isis.core.metamodel.facets.object.domainservice.DomainServiceFacet;
+import org.apache.isis.core.metamodel.spec.ObjectSpecification;
+import org.apache.isis.core.metamodel.spec.feature.Contributed;
+import org.apache.isis.core.metamodel.spec.feature.ObjectAssociation;
+import org.apache.isis.core.metamodel.specloader.validator.MetaModelValidatorComposite;
+import org.apache.isis.core.metamodel.specloader.validator.MetaModelValidatorVisiting;
+import org.apache.isis.core.metamodel.specloader.validator.ValidationFailures;
 
+public class DomainServiceFacetAnnotationFactory extends FacetFactoryAbstract implements MetaModelValidatorRefiner {
 
-public class DomainServiceFacetAnnotationFactory extends FacetFactoryAbstract {
+    public static final String ISIS_REFLECTOR_VALIDATOR_SERVICE_ACTIONS_ONLY_KEY =
+            "isis.reflector.validator.serviceActionsOnly";
+    public static final boolean ISIS_REFLECTOR_VALIDATOR_SERVICE_ACTIONS_ONLY_DEFAULT = false;
 
     public DomainServiceFacetAnnotationFactory() {
         super(FeatureType.OBJECTS_ONLY);
@@ -50,4 +67,54 @@ public class DomainServiceFacetAnnotationFactory extends FacetFactoryAbstract {
     }
 
 
+    @Override
+    public void refineMetaModelValidator(final MetaModelValidatorComposite metaModelValidator, final IsisConfiguration configuration) {
+
+        boolean serviceActionsOnly = configuration.getBoolean(
+                ISIS_REFLECTOR_VALIDATOR_SERVICE_ACTIONS_ONLY_KEY,
+                ISIS_REFLECTOR_VALIDATOR_SERVICE_ACTIONS_ONLY_DEFAULT);
+        if(!serviceActionsOnly) {
+            return;
+        }
+
+        metaModelValidator.add(new MetaModelValidatorVisiting(new MetaModelValidatorVisiting.Visitor() {
+
+            @Override
+            public boolean visit(final ObjectSpecification thisSpec, final ValidationFailures validationFailures) {
+                validate(thisSpec, validationFailures);
+                return true;
+            }
+
+            private void validate(
+                    final ObjectSpecification thisSpec,
+                    final ValidationFailures validationFailures) {
+
+                if(!thisSpec.containsFacet(DomainServiceFacet.class)) {
+                    return;
+                }
+
+                final List<String> associationNames = Lists.newArrayList();
+
+                final List<ObjectAssociation> associations = thisSpec.getAssociations(Contributed.EXCLUDED);
+                for (ObjectAssociation association: associations) {
+                    final String associationName = association.getName();
+                    // it's okay to have an "association" called "Id" (corresponding to getId() method)
+                    if("Id".equalsIgnoreCase(associationName)) {
+                        continue;
+                    }
+                    associationNames.add(associationName);
+                }
+
+                if(associationNames.isEmpty()) {
+                    return;
+                }
+
+                validationFailures.add(
+                        "%s: services can only have actions, not properties or collections (annotate with @Programmatic if required).  Found: %s",
+                        thisSpec.getFullIdentifier(),
+                        Joiner.on(", ").join(associationNames));
+            }
+        }));
+    }
+
 }

http://git-wip-us.apache.org/repos/asf/isis/blob/1d8ac13f/example/application/simpleapp/application/src/main/resources/domainapp/application/manifest/isis.properties
----------------------------------------------------------------------
diff --git a/example/application/simpleapp/application/src/main/resources/domainapp/application/manifest/isis.properties b/example/application/simpleapp/application/src/main/resources/domainapp/application/manifest/isis.properties
index 3129af0..866c0af 100644
--- a/example/application/simpleapp/application/src/main/resources/domainapp/application/manifest/isis.properties
+++ b/example/application/simpleapp/application/src/main/resources/domainapp/application/manifest/isis.properties
@@ -80,6 +80,12 @@ isis.reflector.validator.explicitObjectType=true
 #isis.reflector.facets.ignoreDeprecated=false
 
 
+#
+# Whether to enforce the rule that domain services can only declare actions, not properties and collections.
+# If not specified, defaults to false
+#
+isis.reflector.validator.serviceActionsOnly=true
+
 
 #
 # Implementation to use for reading dynamic layout.