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>.