You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@isis.apache.org by ah...@apache.org on 2019/12/12 11:02:18 UTC

[isis] branch master updated: ISIS-1998: reinstates action method detection optimization with a fix

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

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


The following commit(s) were added to refs/heads/master by this push:
     new 05d5535  ISIS-1998: reinstates action method detection optimization with a fix
05d5535 is described below

commit 05d5535c64d82c2efe589e58bb49f96e6f696a13
Author: Andi Huber <ah...@apache.org>
AuthorDate: Thu Dec 12 12:02:08 2019 +0100

    ISIS-1998: reinstates action method detection optimization with a fix
---
 .../MethodPrefixBasedFacetFactoryAbstract.java     |  2 +-
 .../apache/isis/metamodel/spec/ManagedObject.java  | 11 ++++---
 .../specloader/specimpl/FacetedMethodsBuilder.java | 38 +++++++++++++++++-----
 .../DomainModelTest_usingGoodDomain.java           |  4 ++-
 4 files changed, 39 insertions(+), 16 deletions(-)

diff --git a/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/MethodPrefixBasedFacetFactoryAbstract.java b/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/MethodPrefixBasedFacetFactoryAbstract.java
index 555e6f7..4a7891f 100644
--- a/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/MethodPrefixBasedFacetFactoryAbstract.java
+++ b/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/MethodPrefixBasedFacetFactoryAbstract.java
@@ -57,7 +57,7 @@ implements MethodPrefixBasedFacetFactory {
     @Override
     public void refineProgrammingModel(ProgrammingModel programmingModel) {
 
-        // we can safely skip this validation if the @Action annoation is mandatory
+        // we can safely skip this validation if the @Action annotation is mandatory
         if(getConfiguration().getReflector().getExplicitAnnotations().isAction()) {
             return;
         }
diff --git a/core/metamodel/src/main/java/org/apache/isis/metamodel/spec/ManagedObject.java b/core/metamodel/src/main/java/org/apache/isis/metamodel/spec/ManagedObject.java
index 3a011b4..97c1ad4 100644
--- a/core/metamodel/src/main/java/org/apache/isis/metamodel/spec/ManagedObject.java
+++ b/core/metamodel/src/main/java/org/apache/isis/metamodel/spec/ManagedObject.java
@@ -28,19 +28,20 @@ import java.util.function.Predicate;
 import java.util.stream.Collectors;
 import java.util.stream.Stream;
 
+import javax.annotation.Nullable;
+
 import org.apache.isis.applib.annotation.Where;
 import org.apache.isis.applib.domain.DomainObjectList;
 import org.apache.isis.commons.internal.base._Tuples.Tuple2;
 import org.apache.isis.commons.internal.collections._Lists;
 import org.apache.isis.commons.internal.exceptions._Exceptions;
-import org.apache.isis.metamodel.adapter.oid.ParentedOid;
-import org.apache.isis.metamodel.context.MetaModelContext;
 import org.apache.isis.metamodel.adapter.oid.RootOid;
 import org.apache.isis.metamodel.commons.ClassExtensions;
 import org.apache.isis.metamodel.commons.ListExtensions;
 import org.apache.isis.metamodel.commons.MethodExtensions;
 import org.apache.isis.metamodel.commons.MethodUtil;
 import org.apache.isis.metamodel.consent.InteractionInitiatedBy;
+import org.apache.isis.metamodel.context.MetaModelContext;
 import org.apache.isis.metamodel.facets.collections.modify.CollectionFacet;
 import org.apache.isis.metamodel.facets.object.entity.EntityFacet;
 import org.apache.isis.metamodel.interactions.InteractionUtils;
@@ -112,14 +113,14 @@ public interface ManagedObject {
         return titleString(null);
     }
 
-    default String titleString(ManagedObject contextAdapterIfAny) {
+    default String titleString(@Nullable ManagedObject contextAdapterIfAny) {
         return TitleUtil.titleString(this, contextAdapterIfAny);
     }
 
     @NoArgsConstructor(access = AccessLevel.PRIVATE)
-    public static final class TitleUtil {
+    static final class TitleUtil {
 
-        public static String titleString(ManagedObject managedObject, ManagedObject contextAdapterIfAny) {
+        private static String titleString(ManagedObject managedObject, ManagedObject contextAdapterIfAny) {
             if (managedObject.getSpecification().isParentedOrFreeCollection()) {
                 final CollectionFacet facet = managedObject.getSpecification().getFacet(CollectionFacet.class);
                 return collectionTitleString(managedObject, facet);
diff --git a/core/metamodel/src/main/java/org/apache/isis/metamodel/specloader/specimpl/FacetedMethodsBuilder.java b/core/metamodel/src/main/java/org/apache/isis/metamodel/specloader/specimpl/FacetedMethodsBuilder.java
index 545ed8d..8938ac1 100644
--- a/core/metamodel/src/main/java/org/apache/isis/metamodel/specloader/specimpl/FacetedMethodsBuilder.java
+++ b/core/metamodel/src/main/java/org/apache/isis/metamodel/specloader/specimpl/FacetedMethodsBuilder.java
@@ -27,6 +27,10 @@ import java.util.stream.Collectors;
 import java.util.stream.Stream;
 
 import org.apache.isis.applib.annotation.Action;
+import org.apache.isis.applib.annotation.CollectionLayout;
+import org.apache.isis.applib.annotation.Mixin;
+import org.apache.isis.applib.annotation.Property;
+import org.apache.isis.applib.annotation.PropertyLayout;
 import org.apache.isis.commons.exceptions.IsisException;
 import org.apache.isis.commons.internal.collections._Lists;
 import org.apache.isis.commons.internal.collections._Sets;
@@ -435,16 +439,32 @@ public class FacetedMethodsBuilder {
         return true;
     }
 
-    private boolean representsAction(
-            final Method actionMethod) {
+    private boolean representsAction(final Method actionMethod) {
+
+        // just an optimization, not strictly required 
+        if(isExplicitActionAnnotationConfigured()) {
 
-        //XXX commented out, because this is not applicable for Mixins in support of ISIS-1998 
-// try to short-circuit as much as possible
-//        if(isExplicitActionAnnotationConfigured()) {
-//            if(!_Annotations.isPresent(actionMethod, Action.class)) {
-//                return false;
-//            }
-//        }
+            // even though when @Action is mandatory, Mixins now can provide actions,
+            // that do not need to be annotated at method-level (see ISIS-1998)
+            val type = actionMethod.getDeclaringClass();
+            val hasActionAnnotation = _Annotations.isPresent(actionMethod, Action.class);
+            val hasInferredActionAnnotation = 
+                    _Annotations.isPresent(type, Action.class)
+                    || _Annotations.isPresent(type, Property.class)
+                    || _Annotations.isPresent(type, org.apache.isis.applib.annotation.Collection.class)
+                    || (_Annotations.isPresent(type, Mixin.class) 
+                            && (_Annotations.isPresent(actionMethod, Property.class)
+                                || _Annotations.isPresent(actionMethod, org.apache.isis.applib.annotation.Collection.class)
+                                || _Annotations.isPresent(actionMethod, PropertyLayout.class)
+                                || _Annotations.isPresent(actionMethod, CollectionLayout.class)
+                            )
+                       );
+        
+            // try to short-circuit as much as possible
+            if(!(hasActionAnnotation || hasInferredActionAnnotation)) {
+                return false;
+            }
+        }
 
         if (MethodUtil.isStatic(actionMethod)) {
             return false;
diff --git a/examples/smoketests/src/test/java/org/apache/isis/testdomain/domainmodel/DomainModelTest_usingGoodDomain.java b/examples/smoketests/src/test/java/org/apache/isis/testdomain/domainmodel/DomainModelTest_usingGoodDomain.java
index 35217b8..e784728 100644
--- a/examples/smoketests/src/test/java/org/apache/isis/testdomain/domainmodel/DomainModelTest_usingGoodDomain.java
+++ b/examples/smoketests/src/test/java/org/apache/isis/testdomain/domainmodel/DomainModelTest_usingGoodDomain.java
@@ -27,6 +27,7 @@ import org.springframework.test.context.TestPropertySource;
 import org.apache.isis.config.presets.IsisPresets;
 import org.apache.isis.integtestsupport.validate.ValidateDomainModel;
 import org.apache.isis.metamodel.specloader.SpecificationLoader;
+import org.apache.isis.metamodel.specloader.specimpl.IntrospectionState;
 import org.apache.isis.testdomain.Smoketest;
 import org.apache.isis.testdomain.conf.Configuration_usingJdo;
 import org.apache.isis.testdomain.jdo.Product;
@@ -96,7 +97,8 @@ class DomainModelTest_usingGoodDomain {
     @Test
     void typeLevelAnnotations_shouldBeHonored_onMixins() {
         
-        val holderSpec = specificationLoader.loadSpecification(ProperActionSupport.class);
+        val holderSpec = specificationLoader.loadSpecification(ProperActionSupport.class, 
+                IntrospectionState.TYPE_AND_MEMBERS_INTROSPECTED);
         
         val mx_mixin = holderSpec.getObjectAction("mixin"); // proper mix-in support
         assertNotNull(mx_mixin);