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);