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 2018/01/02 15:13:40 UTC

[isis] 03/03: ISIS-1772: adds 'isis.reflector.explicitAnnotations.action' configuration property

This is an automated email from the ASF dual-hosted git repository.

danhaywood pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/isis.git

commit f07d185ca73e6346fc08c8ba0d6648bf5f5d5482
Author: Dan Haywood <da...@haywood-associates.co.uk>
AuthorDate: Tue Jan 2 14:49:16 2018 +0000

    ISIS-1772: adds 'isis.reflector.explicitAnnotations.action' configuration property
    
    which requires that actions are annotated as @Action in order to be recognised (rather than using @Programmatic to ignore)
---
 .../asciidoc/guides/rgcfg/_rgcfg_configuring-core.adoc | 12 ++++++++++++
 .../core/metamodel/specloader/SpecificationLoader.java |  5 ++++-
 .../specloader/specimpl/FacetedMethodsBuilder.java     | 18 +++++++++++++++++-
 .../specimpl/FacetedMethodsBuilderContext.java         |  6 +++++-
 .../domainapp/application/isis-non-changing.properties |  3 ++-
 .../application/manifest/isis-non-changing.properties  |  5 +++++
 6 files changed, 45 insertions(+), 4 deletions(-)

diff --git a/adocs/documentation/src/main/asciidoc/guides/rgcfg/_rgcfg_configuring-core.adoc b/adocs/documentation/src/main/asciidoc/guides/rgcfg/_rgcfg_configuring-core.adoc
index 14beaec..f3357c3 100644
--- a/adocs/documentation/src/main/asciidoc/guides/rgcfg/_rgcfg_configuring-core.adoc
+++ b/adocs/documentation/src/main/asciidoc/guides/rgcfg/_rgcfg_configuring-core.adoc
@@ -670,6 +670,18 @@ If enabled, this configuration property will ensure that domain services only de
 Only intended for "emergency use" as a workaround while pending fix/patch to Apache Isis itself.  (Note that there is no "datanucleus" in the property).
 
 
+|`isis.reflector.` +
+`explicitAnnotations.` +
+`action`
+|`true`,`false` +
+(`false`)
+|(`1.16.0-SNAPSHOT`) Whether action methods need to be explicitly annotated using `@Action`.
+
+The default is that any non-`@Programmatic` methods that are not otherwise recognised as properties, collections or supporting methods, are assumed to be actions.
+Setting this property reverses this policy, effectively requiring that all actions need to be annotated with `@Action`.
+
+Note that properties and collections are still implicitly inferred by virtue of being "getters".
+
 |`isis.reflector.facet.` +
 `cssClass.patterns`
 |regex:css1, regex2:css2,...
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/SpecificationLoader.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/SpecificationLoader.java
index cf3a009..1625116 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/SpecificationLoader.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/SpecificationLoader.java
@@ -44,6 +44,7 @@ import org.apache.isis.core.metamodel.facets.object.objectspecid.ObjectSpecIdFac
 import org.apache.isis.core.metamodel.layoutmetadata.LayoutMetadataReader;
 import org.apache.isis.core.metamodel.progmodel.ProgrammingModel;
 import org.apache.isis.core.metamodel.services.ServicesInjector;
+import org.apache.isis.core.metamodel.services.configinternal.ConfigurationServiceInternal;
 import org.apache.isis.core.metamodel.spec.FreeStandingList;
 import org.apache.isis.core.metamodel.spec.ObjectSpecId;
 import org.apache.isis.core.metamodel.spec.ObjectSpecification;
@@ -402,9 +403,11 @@ public class SpecificationLoader implements ApplicationScopedComponent {
             return new ObjectSpecificationOnStandaloneList(servicesInjector,
                     facetProcessor);
         } else {
+            final ConfigurationServiceInternal configService = servicesInjector.lookupService(
+                    ConfigurationServiceInternal.class);
             final FacetedMethodsBuilderContext facetedMethodsBuilderContext =
                     new FacetedMethodsBuilderContext(
-                            this, facetProcessor, layoutMetadataReaders);
+                            this, facetProcessor, layoutMetadataReaders, configService);
             return new ObjectSpecificationDefault(cls, facetedMethodsBuilderContext,
                     servicesInjector, facetProcessor, natureOfServiceIfAny);
         }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/FacetedMethodsBuilder.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/FacetedMethodsBuilder.java
index 4c513d8..9665ef4 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/FacetedMethodsBuilder.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/FacetedMethodsBuilder.java
@@ -35,6 +35,7 @@ import com.google.common.collect.Maps;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import org.apache.isis.applib.annotation.Action;
 import org.apache.isis.core.commons.exceptions.IsisException;
 import org.apache.isis.core.commons.lang.ListExtensions;
 import org.apache.isis.core.commons.lang.MethodUtil;
@@ -42,6 +43,7 @@ import org.apache.isis.core.commons.util.ToString;
 import org.apache.isis.core.metamodel.exceptions.MetaModelException;
 import org.apache.isis.core.metamodel.facetapi.FeatureType;
 import org.apache.isis.core.metamodel.facetapi.MethodRemover;
+import org.apache.isis.core.metamodel.facets.Annotations;
 import org.apache.isis.core.metamodel.facets.FacetFactory;
 import org.apache.isis.core.metamodel.facets.FacetFactory.ProcessClassContext;
 import org.apache.isis.core.metamodel.facets.FacetedMethod;
@@ -144,11 +146,15 @@ public class FacetedMethodsBuilder {
     private final Map<LayoutMetadataReader, LayoutMetadataReader2.Support> supportByReader;
 
 
+    private final boolean explicitAnnotationsForActions;
+
     // ////////////////////////////////////////////////////////////////////////////
     // Constructor & finalize
     // ////////////////////////////////////////////////////////////////////////////
 
-    public FacetedMethodsBuilder(final ObjectSpecificationAbstract spec, final FacetedMethodsBuilderContext facetedMethodsBuilderContext) {
+    public FacetedMethodsBuilder(
+            final ObjectSpecificationAbstract spec,
+            final FacetedMethodsBuilderContext facetedMethodsBuilderContext) {
         if (LOG.isDebugEnabled()) {
             LOG.debug("creating JavaIntrospector for " + spec.getFullIdentifier());
         }
@@ -163,6 +169,7 @@ public class FacetedMethodsBuilder {
         this.specificationLoader = facetedMethodsBuilderContext.specificationLoader;
 
         this.layoutMetadataReaders = facetedMethodsBuilderContext.layoutMetadataReaders;
+        this.explicitAnnotationsForActions = facetedMethodsBuilderContext.configService.getBoolean("isis.reflector.explicitAnnotations.action");
 
         this.supportByReader = Maps.newHashMap();
         for (LayoutMetadataReader reader : layoutMetadataReaders) {
@@ -538,10 +545,19 @@ public class FacetedMethodsBuilder {
             }
         }
 
+        if(explicitActionAnnotationConfigured()) {
+            if(!Annotations.isAnnotationPresent(actionMethod, Action.class)) {
+                return false;
+            }
+        }
         LOG.debug("  identified action {0}", actionMethod);
         return true;
     }
 
+    private boolean explicitActionAnnotationConfigured() {
+        return explicitAnnotationsForActions;
+    }
+
     private boolean loadParamSpecs(final Method actionMethod) {
         final Class<?>[] parameterTypes = actionMethod.getParameterTypes();
         return loadParamSpecs(parameterTypes);
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/FacetedMethodsBuilderContext.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/FacetedMethodsBuilderContext.java
index e75c2b3..bd44ea7 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/FacetedMethodsBuilderContext.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/FacetedMethodsBuilderContext.java
@@ -18,6 +18,7 @@ package org.apache.isis.core.metamodel.specloader.specimpl;
 
 import java.util.List;
 import org.apache.isis.core.metamodel.layoutmetadata.LayoutMetadataReader;
+import org.apache.isis.core.metamodel.services.configinternal.ConfigurationServiceInternal;
 import org.apache.isis.core.metamodel.specloader.SpecificationLoader;
 import org.apache.isis.core.metamodel.specloader.facetprocessor.FacetProcessor;
 
@@ -25,13 +26,16 @@ public class FacetedMethodsBuilderContext {
     public final SpecificationLoader specificationLoader;
     public final FacetProcessor facetProcessor;
     public final List<LayoutMetadataReader> layoutMetadataReaders;
+    public final ConfigurationServiceInternal configService;
 
     public FacetedMethodsBuilderContext(
             final SpecificationLoader specificationLoader,
             final FacetProcessor facetProcessor,
-            final List<LayoutMetadataReader> layoutMetadataReaders) {
+            final List<LayoutMetadataReader> layoutMetadataReaders,
+            final ConfigurationServiceInternal configService) {
         this.specificationLoader = specificationLoader;
         this.facetProcessor = facetProcessor;
         this.layoutMetadataReaders = layoutMetadataReaders;
+        this.configService = configService;
     }
 }
\ No newline at end of file
diff --git a/example/application/helloworld/src/main/java/domainapp/application/isis-non-changing.properties b/example/application/helloworld/src/main/java/domainapp/application/isis-non-changing.properties
index e2a8199..d42682e 100644
--- a/example/application/helloworld/src/main/java/domainapp/application/isis-non-changing.properties
+++ b/example/application/helloworld/src/main/java/domainapp/application/isis-non-changing.properties
@@ -42,8 +42,9 @@ isis.reflector.facet.cssClassFa.patterns=\
 isis.reflector.facet.cssClass.patterns=\
                         delete.*:btn-danger
 
-isis.objects.editing=false
+isis.reflector.explicitAnnotations.action=true
 
+isis.objects.editing=false
 
 isis.viewer.wicket.maxTitleLengthInStandaloneTables=0
 isis.viewer.wicket.maxTitleLengthInParentedTables=0
diff --git a/example/application/simpleapp/application/src/main/resources/domainapp/application/manifest/isis-non-changing.properties b/example/application/simpleapp/application/src/main/resources/domainapp/application/manifest/isis-non-changing.properties
index d21018b..fed265a 100644
--- a/example/application/simpleapp/application/src/main/resources/domainapp/application/manifest/isis-non-changing.properties
+++ b/example/application/simpleapp/application/src/main/resources/domainapp/application/manifest/isis-non-changing.properties
@@ -192,6 +192,11 @@ isis.reflector.facet.cssClass.patterns=\
 
 
 #
+# Whether actions require @Action annotation to be recognised
+#
+isis.reflector.explicitAnnotations.action=true
+
+#
 # whether to suppress posting of events if not specified (left as Xxx.Default); defaults to true
 #
 

-- 
To stop receiving notification emails like this one, please contact
"commits@isis.apache.org" <co...@isis.apache.org>.